Page 1 of 1
minefield.mac
Posted: Wed Sep 01, 2004 5:12 am
by Night Hawk
I was browsing through some old macros, and I found this macro by Tuna and it sounds like a dream come true, except for the fact that it's in the old params. I will try to to attempt to update it, but a lot of the stuff that's going on, I'm not to keen on understanding. Anyhelp would be appreciated.
Check it out:
http://macroquest2.com/phpBB2/viewtopic.php?t=5224
Posted: Wed Sep 01, 2004 7:40 am
by aChallenged1
It's a start. I've changed most but not all @ types to ${} types.
I don't know enough about the math functions and such, or the TLOs, etc. to do much with the /if statements. It would be nice to see this finished so I can look at them side by side. I might learn something.
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 ${theadingDiff}
/varcalc vectorScores[${c}] ${vectorScores}[${c}]-${theadingDiff}
/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.
| ----------------------------------------------------------------
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
Posted: Wed Sep 01, 2004 8:41 am
by Cr4zyb4rd
Cleaned it up a bit more, starting with what aC1 posted. Indexes fixed, /ifs fixed, subroutine return values fixed, variables declared as type int or float as appropriate (not sure I got all of these right..should bitch when you run it if not). Fixed up a math function. Two obvious typos, and um...well damn if my short term memory isn't choked out by bong resin...some other stuff.
Untested, but it should be a lot closer to working than it was (if it ever did, I neither know nor care)
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
| ------------------------------------
| VECTOR_RESOLUTION cuts 360 degrees up into X number of pie slices.
| I set to 12 (30 degrees).
| ------------------------------------
#define VECTOR_RESOLUTION 12
#define HIGH_SCORE_BASE 9999
#define DEFAULTRANGETOSCAN 400
sub Main
| ----------------------------
| Set up globals
| ----------------------------
/declare vectorHeadingStarts[VECTOR_RESOLUTION] float
/declare vectorHeadingEnds[VECTOR_RESOLUTION] float
/declare vectorDanger[VECTOR_RESOLUTION] float
/declare vectorScores[VECTOR_RESOLUTION] float
| -----------------------------
| 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 float local
/declare tY float local
/declare goalVector int local
/declare goalHeading int local
/declare headingDiff float local
/declare highestScore float local
/declare c int local
/declare highestScoringVectorIndex int 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 ${Macro.Return}
| 2) Find vector closest to it
/for c 1 to VECTOR_RESOLUTION
/if (${vectorDanger[${c}]}<=0) {
/varset headingDiff ${Math.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 VECTOR_RESOLUTION
/if (${vectorDanger${c}]}<=0) {
/if (${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 int local
/for c 1 to VECTOR_RESOLUTION
/if (${VectorHeadingStarts[${c}]}<=${Param0}) {
/if (${vectorHeadingEnds[${c}]}>${Param0}) {
/return ${c}
}
}
/next c
/return 0
sub DebugDumpSafeVectors
/declare c int local
/for c 1 to VECTOR_RESOLUTION
/echo ${c}: (${VectorHeadingStarts[${c}]} to ${vectorHeadingEnds[${c}]}) danger level ${vectorDanger[${c}]}
/next c
/return
Sub DefineVectors
/declare c int local
/declare DegreesPerVector float local
/declare NextStartingVector float local
/varcalc DegreesPerVector 360/VECTOR_RESOLUTION
/varset NextStartingVector 0
/for c 1 to VECTOR_RESOLUTION
/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.
| ----------------------------------------------------------------
Sub ResetTravelVectors
/declare c int local
/for c 1 to VECTOR_RESOLUTION
/varset vectorDanger[${c}] 0
/varset vectorScores[${c}] HIGH_SCORE_BASE
/next c
/return
sub NoteVectorForSpawn
/declare c int local
/declare mobHeading float local
/declare spawnID int local
/varset spawnID ${Param0}
/varset mobHeading ${Spawn[${spawnID}.HeadingTo}
| /echo Disabling vector for ${Spawn[${spawnID].CleanName} at ${Spawn[${spawnID}.X},${Spawn[${spawnID}.Y} ... heading to is ${Spawn[${spawnID}.HeadingTo}
/call VectorForHeading ${mobHeading}
/varset c ${Macro.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 ${NearestSpawn[npc,loc ${Param1} ${Param2} radius ${radiusSearch}].ID}
:AddRadiusLoop
/delay 1
/if (${npcid}==${firstnpcid}) {
/return
} else {
/varset lastnpcid ${npcid}
/varset npcid ${Spawn[${lastnpcid}].NearestSpawn[npc, radius ${radiusSearch}]}
/if (${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
have fun
Posted: Wed Sep 01, 2004 4:10 pm
by Night Hawk
That looks nice Cr4zy. I'll give it a try and see how things go. Also, I thought #turbo 40 was the highest