Code: Select all
| - twist.mac -
|
| Modified from Colonel's Macro by ml2517
|
| Modified to current form 4/20/2004
|
| Combat Twist Order ------------+
| NonCombat Twist Order -----+ |
| | |
| Usage: v v
| /macro twist.mac ### ###
| # represents the spell gem number you'd like to sing
|
| Example:
| /macro twist.mac 4567 123456
|
#Event destroy "You have scrounged up something that doesn't look edible."
#Event move "Your target is too far away, get closer!"
#Event anchor "Drop Anchor"
#Event back "You cannot see your target."
#Event exp "You gain party experience!!"
#Event tank "Set Tank"
Sub Main(Param0)
/newif (!${Defined[Param0]}) /endmacro
|
| Variable Declarations
|
/declare CombatCurSong global
/declare NonCombatCurSong global
/declare NNonCombatSongs global
/declare NCombatSongs global
/declare NonCombatSongList global
/declare CombatSongList global
/declare TwistI global
/declare TwistJ global
/declare DynamicBuffer global
/declare NonCombatSongArray array
/declare CombatSongArray array
/declare ArrSong array
/declare AnchorX global
/declare AnchorY global
/declare tank global
|
| Timer Declarations
|
/declare SingTime timer
/varset AnchorY 0
/varset AnchorX 0
/varset CombatCurSong 1
/varset NonCombatCurSong 1
/varset NNonCombatSongs ${String[@Param0].Length}
/varset NCombatSongs ${String[@Param1].Length}
/varset NonCombatSongList @Param0
/varset CombatSongList @Param1
/varset DynamicBuffer 5
/varset tank none
/for TwistI 1 to @NNonCombatSongs
/varcalc TwistJ @TwistI
/varset NonCombatSongArray(@TwistI) ${String["@NonCombatSongList"].Mid[@TwistJ,1]}
/next TwistI
/for TwistI 1 to @NCombatSongs
/varcalc TwistJ @TwistI
/varset CombatSongArray(@TwistI) ${String["@CombatSongList"].Mid[@TwistJ,1]}
/next TwistI
:Loop
/newif (${Me.State.NotEqual["SIT"]}) {
/newif (${Me.Combat}) /call CombatSing @CombatSongArray(@CombatCurSong)
/newif (!${Me.Combat}) /call NonCombatSing @NonCombatSongArray(@NonCombatCurSong)
}
/newif (${Me.State.Equal["DUCK"]}) /keypress DUCK
/newif (${Me.State.Equal["SIT"]}) /stand
/goto :Loop
/return
Sub CombatSing
/declare Buffer local
:CombatSing1
/call CheckSong @Param0
/varset SingTime 30
/varset Buffer 0
/cast @Param0
/doevents
:CombatSing2
/delay 1
/doevents
/newif (${Me.Casting.ID}) {
/newif (@SingTime<=0) /goto :CombatSingBreak
/goto :CombatSing2
}
:CombatSingBreak
/newif (@SingTime>0) /goto :CombatSing1
/newif (${Macro.Return.Equal[${Int[0]}]}) {
/delay @DynamicBuffer
/stopsong
} else /newif (${Macro.Return.Equal[${Int[2]}]}) {
:CombatSing3
/varadd Buffer 1
/delay 1
/newif (@Buffer>8) {
/stopsong
/goto :CombatSing1
}
/newif ((${Me.Buff["${Me.Gem[@Param0]}"].ID})&&(${Me.Buff["${Me.Gem[@Param0]}"].Duration}<24)) /goto :CombatSing3
/varset DynamicBuffer @Buffer
/stopsong
} else {
:CombatSing4
/doevents
/varadd Buffer 1
/delay 1
/newif (@Buffer>8) {
/stopsong
/goto :CombatSing1
}
/newif (((${Me.Song["${Me.Gem[@Param0]}"].ID})&&(${Me.Song["${Me.Gem[@Param0]}"].Duration}<2))||((${Me.Buff["${Me.Gem[@Param0]}"].ID})&&(${Me.Buff["${Me.Gem[@Param0]}"].Duration}<2))) /goto :CombatSing4
/varset DynamicBuffer @Buffer
/stopsong
}
| /echo Dynamic Buffer: @DynamicBuffer
/varadd CombatCurSong 1
/newif (@CombatCurSong>@NCombatSongs) /varset CombatCurSong 1
/return
Sub NonCombatSing
/declare Buffer local
:NonCombatSing1
/call CheckSong @Param0
/varset SingTime 30
/varset Buffer 0
/cast @Param0
/doability "Forage"
/assist @tank
/doevents
/autoinventory
:NonCombatSing2
/delay 1
/newif (${Me.Casting.ID}) {
/newif (@SingTime<=0) /goto :NonCombatSingBreak
/goto :NonCombatSing2
}
:NonCombatSingBreak
/newif (@SingTime>0) /goto :NonCombatSing1
/newif (${Macro.Return.Equal[${Int[0]}]}) {
/delay @DynamicBuffer
/stopsong
} else /newif (${Macro.Return.Equal[${Int[2]}]}) {
:NonCombatSing3
/varadd Buffer 1
/delay 1
/newif (@Buffer>8) {
/stopsong
/goto :NonCombatSing1
}
/newif ((${Me.Buff["${Me.Gem[@Param0]}"].ID})&&(${Me.Buff["${Me.Gem[@Param0]}"].Duration}<24)) /goto :NonCombatSing3
/varset DynamicBuffer @Buffer
/stopsong
} else {
:NonCombatSing4
/varadd Buffer 1
/delay 1
/newif (@Buffer>8) {
/stopsong
/goto :NonCombatSing1
}
/newif (((${Me.Song["${Me.Gem[@Param0]}"].ID})&&(${Me.Song["${Me.Gem[@Param0]}"].Duration}<2))||((${Me.Buff["${Me.Gem[@Param0]}"].ID})&&(${Me.Buff["${Me.Gem[@Param0]}"].Duration}<2))) /goto :NonCombatSing4
/varset DynamicBuffer @Buffer
/stopsong
}
| /echo Dynamic Buffer: @DynamicBuffer
/varadd NonCombatCurSong 1
/newif (@NonCombatCurSong>@NNonCombatSongs) /varset NonCombatCurSong 1
/return
Sub CheckSong(GemNumber)
/newif (${Spell["${Me.Gem[@GemNumber]}"].SpellType.Find["Beneficial"]}) {
/newif (${Spell["${Me.Gem[@GemNumber]}"].TargetType.Find["Group"]} || ${Spell["${Me.Gem[@GemNumber]}"].TargetType.Find["Self"]} || ${Spell["${Me.Gem[@GemNumber]}"].TargetType.Find["PC"]}) {
/newif (${Me.Gem[@GemNumber].Equal["Selo`s Accelerating Chorus"]}) {
/return 2
} else {
/return 1
}
} else {
/return 0
}
} else {
/return 0
}
/return
Sub Event_destroy
/echo Destroying ${Cursor.Name}
/destroy
/return
Sub Event_move
/doevents flush
/keypress forward hold
:Checker
/face fast nolook
/newif (${Target.Distance}<=15) {
/face fast nolook
/keypress forward
/return
}
/goto :Checker
/return
Sub Event_anchor
/varset AnchorX ${Me.X}
/varset AnchorY ${Me.Y}
/echo Anchor dropped at @AnchorX , @AnchorY
/return
Sub Event_back
/return
Sub Event_exp
/newif (@AnchorX==0 || @AnchorY==0) {
/echo No anchor is set.
/return
}
:AnchorMoveLoop
/newif (${Me.State.NotEqual[STAND]}) /stand
/face nolook loc @AnchorY,@AnchorX
/newif (${Math.Distance[@AnchorY,@AnchorX]}>5) /keypress forward hold
/newif (${Math.Distance[@AnchorY,@AnchorX]}<=5) {
/keypress forward
/newif (${Me.State.NotEqual[STAND]}) /stand
/face away nolook loc @AnchorY,@AnchorX
/return
}
/goto :AnchorMoveLoop
/return
Sub Event_tank
/echo Setting tank...
/varset tank ${Target}
/echo Tank set to @tank
/return
No such 'spell' member 'Equal'


