OK cool, thanks for clearing that up (I actually read that as 41E0 being *investigation music intensifies!* and 41F0 being *investigation music abruptly ends* for a moment there lol).
Damn, my head is absolutely spinning. I've been working on Bottomswell for hours now, and I'm still not 100% sure I have it deciphered right. I could do with a fresh pair of eyes to check my work:
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
| Bottomswell's BATTLE PLAN: |
| |
| SETUP: Disable default Death handling, sets Row value to 16 (Flying) |
| |
| |
| PHASE 1: (Repeats) |
| |
| Bottomswell's HP > 75% AND been attacked less than 6 times |
| |
| 1ST ATTACK: Use Tail Attack on Rnd Target |
| 2ND ATTACK: Use Tail Attack on Rnd Target |
| 3RD ATTACK: Use Tail Attack on Rnd Target |
| 4TH ATTACK: |
| |
| 1/3 Chance: Use Tail Attack on 2nd Target; If 2nd Target has Death, do |
| nothing |
| Follow-Up: Use Tail Attack on 1st Target; If 1st Target has Death, do |
| nothing |
| Follow-Up: Use Tail Attack on 3rd Target; If 3rd Target has Death, do |
| nothing |
| |
| 2/3 Chance: Use <Bodyblow> on Target with Highest HP |
| |
| |
| PHASE 2: |
| |
| Bottomswell's HP <=75% OR been attacked 6 times while in Phase 1 |
| |
| 1ST ATTCK: Use Moonstrike on 2nd Target; If 2nd Target has Death, do |
| nothing |
| FOLLOW-UP: Use Moonstrike on 1st Target; If 1st Target has Death, do |
| nothing |
| FOLLOW-UP: Use Moonstrike on 3rd Target; If 3rd Target has Death, do |
| nothing |
| |
| 2ND ATTACK: Use <Bodyblow> on Target with Highest HP |
| 3RD ATTACK: Use Moonstrike on Rnd Target |
| 4TH ATTACK: |
| |
| Bottomswell's HP > 75%: Use <Fury Blast> on Self, transformation to |
| Phase 1, sets Attack Count to 0 |
| |
| Bottomswell's HP <= 75%: Use Moonstrike on Rnd Target |
| Follow-Up: 1/2 Chance jump to 1st Attack for next turn |
| 1/2 Chance jump to 2nd Attack for next turn |
| |
| |
| PHASE 3: |
| |
| Bottomswell's HP <=50% OR been attacked 6 times while in Phase 2 |
| |
| 1ST ATTCK: Use <Waterball> on Rnd Target without Seizure |
| 2ND ATTCK: Skip a turn |
| 3RD ATTCK: Skip a turn |
| 4TH ATTCK: |
| |
| Bottomswell's HP > 50%: Use <Chill> on self, transformation to Phase |
| 1, sets Attack Count to 0 |
| |
| Bottomswell's HP <= 50%: Big Wave on All Targets |
| |
| 5TH ATTACK: Skip a turn |
| |
| After 5th Attack: Jump to 2nd Attack for next turn, If no Targets |
| have Imprisoned, jump to 1st Attack for next turn |
| |
| |
| DEATH: Use Big Wave on All Targets, use <Vanish> on Self |
|>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~o~~~~~~~~~~~~~~~~~~~~~~~~~~~~<|
This has been deciphered from the following heavily modified version of the AI script:
PRE-BATTLE:
(Self) | (DeathImmunity) = 1
LocalVar:1stChr = FlagBit(Player1)
LocalVar:2ndChr = FlagBit(Player2)
LocalVar:3rdChr = FlagBit(Player3)
LocalVar:Waterpolo = ((ActiveActors) | (SelfID) == 92)
LocalVar:1stChrWaterpolo = (LocalVar:Waterpolo.(PlayerID) == 0)
LocalVar:2ndChrWaterpolo = (LocalVar:Waterpolo.(PlayerID) == 1)
LocalVar:3rdChrWaterpolo = (LocalVar:Waterpolo.(PlayerID) == 2)
LocalVar:HitCount = 6
(Self) | (Row) = 16
SCRIPT END
MAIN:
If ((Self) | (IdleAnimID) == 0)
{
If (LocalVar:Count == 0)
{
}
Else
{
If (LocalVar:Count == 1)
{
}
Else
{
If (LocalVar:Count == 2)
{
(TarSelected) = Random (AllPlayers)
Perform ("Tail Attack" [0142])
LocalVar:Count = LocalVar:Count + 1
}
Else
{
}
Else
{
If (Rnd(0..2) == 0)
{
If ( (LocalVar:2ndChr) | (DeathStatus) == 0)
{
(TarSelected) = LocalVar:2ndChr
Perform ("Tail Attack" [0142])
If ( (LocalVar:1stChr) | (DeathStatus) == 0)
{
(TarSelected) = LocalVar:1stChr
Perform ("Tail Attack" [0142])
If ( (LocalVar:3rdChr) | (DeathStatus) == 0)
{
(TarSelected) = LocalVar:3rdChr
Perform ("Tail Attack" [0142])
}
Else
{
(TarSelected) = Random ((AllPlayers) | (HighestCurrentHP))
Perform ("Bodyblow" [012D])
LocalVar:Count = 0
}
Else
{
POP(LocalVar:Count)
}
Else
{
}
Else
{
If ((Self) | (IdleAnimID) == 6)
{
If (LocalVar:Count == 0)
{
If ( (LocalVar:2ndChr) | (DeathStatus) == 0)
{
(TarSelected) = LocalVar:2ndChr
Perform ("Moonstrike" [01CE])
If ( (LocalVar:1stChr) | (DeathStatus) == 0)
{
(TarSelected) = LocalVar:1stChr
Perform ("Moonstrike" [01CE])
If ( (LocalVar:3rdChr) | (DeathStatus) == 0)
{
(TarSelected) = LocalVar:3rdChr
Perform ("Moonstrike" [01CE])
LocalVar:Count = 1
}
Else
{
}
Else
{
If (LocalVar:Count == 1)
{
(TarSelected) = Random ((AllPlayers) | (HighestCurrentHP))
Perform ("Bodyblow" [01A9])
LocalVar:Count = 2
}
Else
{
}
Else
{
If (LocalVar:Count == 2)
{
(TarSelected) = Random (AllPlayers)
Perform ("Moonstrike" [01CE])
LocalVar:Count = 3
}
Else
{
}
Else
{
If ( (LocalVar:Stage < 1) )
{
(TarSelected) = (Self)
Perform ("Fury Blast" [01D0])
(Self) | (IdleAnimID) = 0
LocalVar:Count = 0
LocalVar:HitCount = 6
}
Else
{
(TarSelected) = Random (AllPlayers)
Perform ("Moonstrike" [01CE])
If (Rnd(0..1) == 0)
{
LocalVar:Count = 0
}
Else
{
LocalVar:Count = 1
}
Else
{
POP(LocalVar:Count)
}
Else
{
}
Else
{
If (LocalVar:Count == 0)
{
LocalVar:EnemyGrp = 0
If ( ( (LocalVar:1stChr) | (DeathStatus) == 0) And ( (LocalVar:1stChr) | (ImprisonedStatus) == 0) )
{
LocalVar:EnemyGrp = LocalVar:EnemyGrp OR 1
If ( ( (LocalVar:2ndChr) | (DeathStatus) == 0) And ( (LocalVar:2ndChr) | (ImprisonedStatus) == 0) )
{
LocalVar:EnemyGrp = LocalVar:EnemyGrp OR 2
If ( ( (LocalVar:3rdChr) | (DeathStatus) == 0) And ( (LocalVar:3rdChr) | (ImprisonedStatus) == 0) )
{
LocalVar:EnemyGrp = LocalVar:EnemyGrp OR 4
If ( (LocalVar:EnemyGrp AND 7 == 7) )
{
If (Rnd(0..2) == 0)
{
LocalVar:TarSelected = LocalVar:1stChr
}
Else
{
}
Else
{
If (Rnd(0..2) == 1)
{
LocalVar:TarSelected = LocalVar:2ndChr
}
Else
{
}
Else
{
LocalVar:TarSelected = LocalVar:3rdChr
}
Else
{
POP(Rnd(0..2))
}
Else
{
If ( (LocalVar:EnemyGrp AND 5 == 5) )
{
If (Rnd(0..1) == 0)
{
LocalVar:TarSelected = LocalVar:1stChr
}
Else
{
LocalVar:TarSelected = LocalVar:3rdChr
}
Else
{
If ( (LocalVar:EnemyGrp AND 3 == 3) )
{
If (Rnd(0..1) == 0)
{
LocalVar:TarSelected = LocalVar:1stChr
}
Else
{
LocalVar:TarSelected = LocalVar:2ndChr
}
Else
{
If ( (LocalVar:EnemyGrp AND 6 == 6) )
{
If (Rnd(0..1) == 0)
{
LocalVar:TarSelected = LocalVar:2ndChr
}
Else
{
LocalVar:TarSelected = LocalVar:3rdChr
}
Else
{
LocalVar:TarSelected = (ClearToZero)
If ( (LocalVar:TarSelected != (ClearToZero)) )
{
(TarSelected) = LocalVar:TarSelected
If ( (LocalVar:TarSelected == LocalVar:1stChr) )
{
Perform ("Waterball" [01D2])
(TarSelected) = LocalVar:1stChrWaterpolo
}
Else
{
If ( (LocalVar:TarSelected == LocalVar:2ndChr) )
{
Perform ("Waterball" [01D3])
(TarSelected) = LocalVar:2ndChrWaterpolo
}
Else
{
Perform ("Waterball" [01D4])
(TarSelected) = LocalVar:3rdChrWaterpolo
(TarSelected) | (DeathStatus) = 0
(TarSelected) | (SelfActive) = 1
(TarSelected) | (Targetable) = 1
(TarSelected) | (Needed2EndBattle) = 1
(TarSelected) | (AIScriptActive) = 1
(TarSelected) | (CurrentHP) = (TarSelected) | (MaxHP)
(TarSelected) | (PhysImmunity) = 1
LocalVar:Count = 1
}
Else
{
}
Else
{
If (LocalVar:Count == 1)
{
}
Else
{
If (LocalVar:Count == 2)
{
LocalVar:Count = LocalVar:Count + 1
}
Else
{
}
Else
{
If (LocalVar:Count == 3)
{
If ( (LocalVar:Stage < 2) )
{
(TarSelected) = (Self)
Perform ("Chill" [01D6])
(Self) | (IdleAnimID) = 0
LocalVar:Count = 0
LocalVar:HitCount = 6
}
Else
{
(TarSelected) = (AllPlayers)
Perform ("Big Wave" [01D5])
LocalVar:Count = 4
}
Else
{
}
Else
{
LocalVar:PlayerImprisoned = BitCount( ((AllPlayers) | (ImprisonedStatus) == 1) )
LocalVar:PlayerDeath = BitCount( ((AllPlayers) | (DeathStatus) == 1) )
If ( ( (LocalVar:PlayerDeath >= 1) And (LocalVar:PlayerImprisoned >= 1) ) )
{
LocalVar:Count = 1
}
Else
{
LocalVar:Count = 0
}
Else
{
POP(LocalVar:Count)
}
Else
{
POP((Self) | (IdleAnimID))
SCRIPT END
GENERAL COUNTER:
If ( ((Self) | (CurrentHP) <= (Self) | (MaxHP) / 4 * 2) )
{
LocalVar:Stage = 2
LocalVar:HitCount = 0
}
Else
{
If ( ((Self) | (CurrentHP) <= (Self) | (MaxHP) / 4 * 3) )
{
LocalVar:Stage = 1
LocalVar:HitCount = 0
}
Else
{
LocalVar:Stage = 0
If ( ((Self) | (IdleAnimID) == 0) )
{
(Self) | (DamagedAnimID) = 1
If (Not (LocalVar:HitCount) )
{
(TarSelected) = (Self)
Perform ("Fury Blast" [01CF])
(Self) | (IdleAnimID) = 6
LocalVar:Count = 0
LocalVar:HitCount = 6
If ( (LocalVar:Stage == 2) )
{
(TarSelected) = (Self)
Perform ("Fury Blast" [01D1])
(Self) | (IdleAnimID) = 12
LocalVar:Count = 0
LocalVar:HitCount = 3
}
Else
{
LocalVar:HitCount = LocalVar:HitCount - 1
}
Else
{
If ( ((Self) | (IdleAnimID) == 6) )
{
(Self) | (DamagedAnimID) = 7
If (Not (LocalVar:HitCount) )
{
(TarSelected) = (Self)
Perform ("Fury Blast" [01D1])
(Self) | (IdleAnimID) = 12
LocalVar:Count = 0
LocalVar:HitCount = 3
}
Else
{
LocalVar:HitCount = LocalVar:HitCount - 1
}
Else
{
(Self) | (DamagedAnimID) = 13
SCRIPT END
DEATH COUNTER:
(TarSelected) = (AllPlayers)
Perform ("Big Wave" [01D5])
If ( ((ActiveActors) | (ImprisonedStatus) == 1) )
{
(TarSelected) = ((ActiveActors) | (ImprisonedStatus) == 1)
(TarSelected) | (ImprisonedStatus) = 0
(TarSelected) = (Self)
Perform ("Vanish" [014E])
LocalVar:Waterpolo.(SelfActive) = 0
LocalVar:Waterpolo.(Targetable) = 0
LocalVar:Waterpolo.(Needed2EndBattle) = 0
LocalVar:Waterpolo.(AIScriptActive) = 0
SCRIPT END
What's bugging me is "HitCount" being set to 3 once it reaches it's third 'phase' (once IdleAnimID gets set to 12 during the counter scruipt). I think there may have been something I've overlooked. These notes may help:
| |
| COUNTER: [All Physical and Magical Attacks] |
| |
| PHASE 1: 1st Attack: DamagedAnimID = 1 |
| 6th Attack: Use <Fury Blast> on Self, transformation to Phase 2 |
| IdleAnimID = 6 |
| Count = 0 |
| HitCount = 6 |
| |
| HP <= 50%: Use <Fury Blast> on Self, transformation to Phase 3?|
| IdleAnimID = 12 |
| Count = 0 |
| HitCount = 3 |
| |
| |
| PHASE 2: 1st Attack: DamagedAnimID = 7 |
| 6th Attack: Use <Fury Blast> on Self, transformation to Phase 3 |
| IdleAnimID = 12 |
| Count = 0 |
| HitCount = 3 |
| |
| |
| PHASE 3: 1st Attack: DamagedAnimID = 13 |
| |
| |
| Phase 1 = IdleAnim 0 |
| Phase 2 = IdleAnim 6 |
| Phase 3 = IdleAnim 12 ? |
| |
| |
| Bottomswell' HP > 75% Stage = 0 |
| |
| Bottomswell' HP <= 75% Stage = 1 |
| Hit Count = 0 |
| |
| Bottomswell' HP <= 50% Stage = 2 |
| Hit Count = 0 |
| |
| Fury Blast 1CF = To Phase 2 |
| Fury Blast 1D0 = To Phase 1 |
| Fury Blast 1D1 = To Phase 3 |
This has definitely been one of the more complicated scripts to work out
edit- i have overlooked something. After testing, Bottomswell will use Waterball once it reaches stage 2 (HP <= 75%). I'm not sure why this is.