MineField.mac: Safe terrain navigator

A forum for you to dump all the macros you create, allowing users to use, modify, and comment on your work.

Moderator: MacroQuest Developers

Tuna
a lesser mummy
a lesser mummy
Posts: 68
Joined: Mon Jul 21, 2003 4:10 pm

MineField.mac: Safe terrain navigator

Post by Tuna » Sat Feb 07, 2004 4:30 pm

Lots of debug code in here to explain what it's doing. Safe macro to run, just make sure you're not seated or else it will look funny to anyone watching a seated person /face a heading.

You'll probably want to incorporate this with some sort of autorunning script. I keep my modules seperate tho.

Enjoy

Code: Select all

| -----------------------------------------------------------------
| MineField.mac
| Version 1.0
| by Tuna
| 
| PURPOSE
| Pick a safe direction to move toward your goal LOC.
| Safe means free of mobs.
|
| METHOD
| Break up all possible directions into 12 easy chunks.  Visualize
| a pie or a pizza.  Evaluate mobs in each slice.  Pick the slice
| closest to the direction you want to go.
|
| NAMING
| I call it minefield because you are basically navigating terrain with
| the intent of avoiding all hotspots.
| -----------------------------------------------------------------

#turbo 50


| ------------------------------------
| VectorResolution cuts 360 degrees up into X number of pie slices.
| I set to 12 (30 degrees).
| ------------------------------------
#define VectorResolution	12
#define HighScoreBase		9999
#define DefaultRangeToScan	400

sub Main

	| ----------------------------
	| Set up globals
	| ----------------------------
	/declare vectorHeadingStarts array
	/declare vectorHeadingEnds array
	/declare vectorDanger array
	/declare vectorScores array


	| -----------------------------
	| You will only need to call
	| -----------------------------
	/call DefineVectors

	/call ResetTravelVectors
	/call ScanForThreats DefaultRangeToScan
	/call DebugDumpSafeVectors

	| Fake parameters.. you would change this obviously but these
	| are here to demonstrate what the macro does.
	/call PickSafestVectorToTarget -795 -1451
/return

| --------------------------
| Returns:
|		-1 on error (or no safe vectors found)
|		0 or higher on vector found
|
| You can use $return after calling this to index vectorHeadingStarts()
| or vectorHeadingEnds or whatever.
| --------------------------
sub PickSafestVectorToTarget
	/declare tX local
	/declare tY local
	/declare goalVector	local
	/declare goalHeading local
	/declare headingDiff local
	/declare highestScore local
	/declare c local
	/declare highestScoringVectorIndex local

	/varset highestScoringVectorIndex -1

	/varset tX @Param0
	/varset tY @Param1

	/varset goalHeading $heading(@tY,@tX)
	/echo Heading to @tX x, @tY y is @goalHeading

	| 1) Calc vector which would be your goal
	/call VectorForHeading @goalHeading
	/varset goalVector $return
	| 2) Find vector closest to it
	/for c 1 to VectorResolution
		/if n @vectorDanger(@c)<=0 {
			/varcalc headingDiff $abs(@vectorHeadingStarts(@goalVector)-@vectorHeadingStarts(@c))
			/echo Heading diff tween (@goalVector) and @c is @headingDiff
			/varcalc vectorScores(@c) @vectorScores(@c)-@headingDiff
			/echo New score for @c is @vectorScores(@c)
		} else {
			/echo Vector @c too dangerous to consider
		}
	/next c
	/varset highestScore 0
	/for c 1 to VectorResolution
		/if n @vectorDanger(@c)<=0 {
			/if n @vectorScores(@c)>=@highestScore {
				/echo New high score: @vectorScores(@c): Vector @c heading @vectorHeadingStarts(@c) (@vectorDanger(@c) danger level)
				/face heading @vectorHeadingStarts(@c)
				/varset highestScore @vectorScores(@c)
				/varset highestScoringVectorIndex @c
			}
		}
	/next c
/return @highestScoringVectorIndex

sub VectorForHeading
	/declare c local
	/for c 1 to VectorResolution
		/if n @vectorHeadingStarts(@c)<=@Param0 {
			/if n @vectorHeadingEnds(@c)>@Param0 {
				/return @c
			}
		}
	/next c
/return 0

sub DebugDumpSafeVectors
	/declare c local
	/for c 1 to VectorResolution
		/echo @c:  (@vectorHeadingStarts(@c) to @vectorHeadingEnds(@c)) danger level @vectorDanger(@c)
	/next c
/return

Sub DefineVectors
	/declare c local
	/declare DegreesPerVector local
	/declare NextStartingVector local

	/varcalc DegreesPerVector 360/VectorResolution
	/varset NextStartingVector 0
	/for c 1 to VectorResolution
		/varset vectorHeadingStarts(@c) @NextStartingVector
		/varcalc NextStartingVector @NextStartingVector+@DegreesPerVector
		/varset vectorHeadingEnds(@c) @NextStartingVector
		/echo Vec(@c) == @vectorHeadingStarts(@c) to @vectorHeadingEnds(@c)
	/next c
/return

| ----------------------------------------------------------------
| Reset every vector to best choice, no danger.
| As mobs are found in each one, they are "tainted"
| and their score is lowered.
| You could always /target and /consider each mob
| to filter out non-aggro, or green cons. But
| allegedly SOE watches for mass targeting and targeting
| mobs you have no line-of-sight to.  So I don't put
| that code in here.  :D
| ----------------------------------------------------------------
Sub ResetTravelVectors
	/declare c local

	/for c 1 to VectorResolution
		/varset vectorDanger(@c) 0
		/varset vectorScores(@c) HighScoreBase
	/next c
/return

sub NoteVectorForSpawn
	/declare c local
	/declare mobHeading local
	/declare spawnID local

	/varset spawnID @Param0
	/varset mobHeading $spawn(@spawnID,headingto)
|	/echo Disabling vector for $spawn(@spawnID,name,clean) at $spawn(@spawnID,x),$spawn(@spawnID,y) ... heading to is $spawn(@spawnID,headingto)

	/call VectorForHeading @mobHeading
	/varset c $return
	/varcalc vectorDanger(@c) @vectorDanger(@c)+1
	/echo Vector @c (@vectorHeadingStarts(@c) to @vectorHeadingEnds(@c)) more dangerous now... up to @vectorDanger(@c)

/return


Sub ScanForThreats
	/declare npcid local
	/declare firstnpcid local
	/declare lastnpcid local
	/declare radiusSearch	local
	/varset npcid 0
	/varset firstnpcid 0
	/varset lastnpcid 0
	/varset radiusSearch @Param0


	/varset npcid $searchspawn(npc,loc:@Param1:@Param2,radius:@radiusSearch)

	:AddRadiusLoop
		/delay 1
		/if n @npcid==@firstnpcid {
			/return
		} else {
			/varset lastnpcid @npcid
			/varset npcid $searchspawn(npc,loc:@Param1:@Param2,id:@lastnpcid,radius:@radiusSearch,next)
			/if n @lastnpcid!=0 {
				| /echo Found $spawn(@lastnpcid,name) at $spawn(@lastnpcid,x),$spawn(@lastnpcid,y) ... heading to is $spawn(@lastnpcid,headingto)
				/call NoteVectorForSpawn @lastnpcid
			}
		}
	/goto :AddRadiusLoop
/return


User avatar
ap50
a snow griffon
a snow griffon
Posts: 425
Joined: Sun Aug 18, 2002 2:29 pm

Post by ap50 » Sun Feb 08, 2004 6:04 am

Code: Select all

/if $char(state)!=STAND /sit off
[color=yellow][size=92][b]Just because you're paranoid, it doesn't mean everyone isn't out to get you![/b][/size][/color]

Tuna
a lesser mummy
a lesser mummy
Posts: 68
Joined: Mon Jul 21, 2003 4:10 pm

Post by Tuna » Sun Feb 08, 2004 10:38 am

ap50 wrote:

Code: Select all

/if $char(state)!=STAND /sit off
Needs quotes, afaik:

Code: Select all

/if "$char(state)"!="STAND" /sit off

ml2517
a grimling bloodguard
a grimling bloodguard
Posts: 1216
Joined: Wed Nov 12, 2003 1:12 am

Post by ml2517 » Sun Feb 08, 2004 11:54 am

You actually only have to use quotes if either the left or right side of the evaluation has or can have spaces in the text.