minefield.mac

For questions regarding conversion of scripts from the old, parm style to the new MQ2Data format. Conversion questions only!

Moderator: MacroQuest Developers

User avatar
Night Hawk
a grimling bloodguard
a grimling bloodguard
Posts: 590
Joined: Fri Aug 13, 2004 4:56 pm

minefield.mac

Post by Night Hawk » Wed Sep 01, 2004 5:12 am

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

User avatar
aChallenged1
a grimling bloodguard
a grimling bloodguard
Posts: 1804
Joined: Mon Jun 28, 2004 10:12 pm

Post by aChallenged1 » Wed Sep 01, 2004 7:40 am

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 
Fuck writing MQ2 macros. Go with IS scripts; IS Rules!

User avatar
Cr4zyb4rd
Plugins Czar
Posts: 1449
Joined: Tue Jul 20, 2004 11:46 am

Post by Cr4zyb4rd » Wed Sep 01, 2004 8:41 am

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

User avatar
Night Hawk
a grimling bloodguard
a grimling bloodguard
Posts: 590
Joined: Fri Aug 13, 2004 4:56 pm

Post by Night Hawk » Wed Sep 01, 2004 4:10 pm

That looks nice Cr4zy. I'll give it a try and see how things go. Also, I thought #turbo 40 was the highest