summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDizzyEggg <jajkodizzy@wp.pl>2017-10-04 19:25:14 +0200
committerDizzyEggg <jajkodizzy@wp.pl>2017-10-04 19:25:14 +0200
commitd87d19cfe5903f5fabb0de37d2c46ef84a83c168 (patch)
treec4b8ef876206ff265a0f328eab7d860d23bb9a59
parentaaa191f0d85e4a6c82a037b471a67cddb4da2c06 (diff)
more battle2 done
-rw-r--r--asm/battle_2.s977
-rw-r--r--include/battle.h25
-rw-r--r--include/pokemon.h2
-rw-r--r--src/battle_2.c511
-rw-r--r--src/battle_3.c14
-rw-r--r--src/battle_script_commands.c42
-rw-r--r--sym_ewram.txt4
7 files changed, 479 insertions, 1096 deletions
diff --git a/asm/battle_2.s b/asm/battle_2.s
index 5f970d766..673a0a833 100644
--- a/asm/battle_2.s
+++ b/asm/battle_2.s
@@ -5,951 +5,6 @@
.text
- thumb_func_start sub_803CDB8
-sub_803CDB8: @ 803CDB8
- push {r4,r5,lr}
- movs r3, 0
- movs r1, 0
- ldr r0, =gNoOfAllBanks
- ldrb r2, [r0]
- adds r5, r0, 0
- cmp r3, r2
- bge _0803CDDA
- ldr r4, =gBattleCommunication
-_0803CDCA:
- adds r0, r1, r4
- ldrb r0, [r0]
- cmp r0, 0x5
- bne _0803CDD4
- adds r3, 0x1
-_0803CDD4:
- adds r1, 0x1
- cmp r1, r2
- blt _0803CDCA
-_0803CDDA:
- adds r0, r3, 0x1
- ldrb r5, [r5]
- cmp r0, r5
- beq _0803CDF0
- movs r0, 0
- b _0803CDF2
- .pool
-_0803CDF0:
- movs r0, 0x1
-_0803CDF2:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_803CDB8
-
- thumb_func_start sub_803CDF8
-sub_803CDF8: @ 803CDF8
- push {r4-r7,lr}
- ldr r7, =gActiveBank
- ldrb r0, [r7]
- ldr r6, =gBattleStruct
- ldr r1, [r6]
- adds r1, r0, r1
- adds r1, 0x5C
- ldr r4, =gBattleBufferB
- lsls r0, 9
- adds r2, r4, 0x1
- adds r0, r2
- ldrb r0, [r0]
- strb r0, [r1]
- ldrb r0, [r7]
- lsls r1, r0, 9
- adds r1, r2
- ldrb r1, [r1]
- bl RecordedBattle_SetBankAction
- ldr r0, =gBattleTypeFlags
- ldr r0, [r0]
- movs r1, 0x42
- ands r0, r1
- cmp r0, 0x42
- bne _0803CEC6
- ldrb r0, [r7]
- ldr r2, [r6]
- lsls r1, r0, 1
- adds r1, r0
- adds r1, r2
- adds r1, 0x60
- ldrb r2, [r1]
- movs r0, 0xF
- ands r0, r2
- strb r0, [r1]
- ldrb r0, [r7]
- ldr r2, [r6]
- lsls r1, r0, 1
- adds r1, r0
- adds r1, r2
- adds r1, 0x60
- lsls r0, 9
- adds r5, r4, 0x2
- adds r0, r5
- ldrb r2, [r0]
- movs r3, 0xF0
- adds r0, r3, 0
- ands r0, r2
- ldrb r2, [r1]
- orrs r0, r2
- strb r0, [r1]
- ldrb r1, [r7]
- ldr r2, [r6]
- lsls r0, r1, 1
- adds r0, r1
- adds r0, r2
- adds r0, 0x61
- lsls r1, 9
- adds r4, 0x3
- mov r12, r4
- add r1, r12
- ldrb r1, [r1]
- strb r1, [r0]
- ldrb r0, [r7]
- movs r4, 0x2
- eors r0, r4
- ldr r2, [r6]
- lsls r1, r0, 1
- adds r1, r0
- adds r1, r2
- adds r1, 0x60
- ldrb r2, [r1]
- adds r0, r3, 0
- ands r0, r2
- strb r0, [r1]
- ldrb r0, [r7]
- eors r0, r4
- ldr r2, [r6]
- lsls r1, r0, 1
- adds r1, r0
- adds r1, r2
- adds r1, 0x60
- ldrb r0, [r7]
- lsls r0, 9
- adds r0, r5
- ldrb r0, [r0]
- ands r3, r0
- lsrs r3, 4
- ldrb r0, [r1]
- orrs r3, r0
- strb r3, [r1]
- ldrb r0, [r7]
- eors r4, r0
- ldr r0, [r6]
- lsls r1, r4, 1
- adds r1, r4
- adds r1, r0
- adds r1, 0x62
- ldrb r0, [r7]
- lsls r0, 9
- add r0, r12
- ldrb r0, [r0]
- strb r0, [r1]
-_0803CEC6:
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_803CDF8
-
- thumb_func_start sub_803CEDC
-sub_803CEDC: @ 803CEDC
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r1, 24
- ldr r2, =gUnknown_0202407A
- adds r4, r0, r2
- ldrb r5, [r4]
- adds r2, r1, r2
- ldrb r3, [r2]
- strb r3, [r4]
- strb r5, [r2]
- ldr r2, =gTurnOrder
- adds r0, r2
- ldrb r5, [r0]
- adds r1, r2
- ldrb r2, [r1]
- strb r2, [r0]
- strb r5, [r1]
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_803CEDC
-
- thumb_func_start GetWhoStrikesFirst
-GetWhoStrikesFirst: @ 803CF10
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0xC
- lsls r0, 24
- lsrs r0, 24
- mov r9, r0
- lsls r1, 24
- lsrs r1, 24
- mov r10, r1
- lsls r2, 24
- lsrs r2, 24
- str r2, [sp, 0x4]
- movs r0, 0
- str r0, [sp, 0x8]
- str r0, [sp]
- movs r0, 0x13
- movs r1, 0
- movs r2, 0xD
- movs r3, 0
- bl AbilityBattleEffects
- lsls r0, 24
- cmp r0, 0
- bne _0803CFD8
- ldr r1, [sp, 0x8]
- str r1, [sp]
- movs r0, 0x13
- movs r1, 0
- movs r2, 0x4D
- movs r3, 0
- bl AbilityBattleEffects
- lsls r0, 24
- cmp r0, 0
- bne _0803CFD8
- ldr r1, =gBattleMons
- movs r0, 0x58
- mov r2, r9
- muls r2, r0
- adds r0, r2, 0
- adds r0, r1
- adds r0, 0x20
- ldrb r3, [r0]
- cmp r3, 0x21
- bne _0803CF7C
- ldr r0, =gBattleWeather
- ldrh r1, [r0]
- movs r0, 0x7
- ands r0, r1
- cmp r0, 0
- bne _0803CF8C
-_0803CF7C:
- cmp r3, 0x22
- bne _0803CF98
- ldr r0, =gBattleWeather
- ldrh r1, [r0]
- movs r0, 0x60
- ands r0, r1
- cmp r0, 0
- beq _0803CF98
-_0803CF8C:
- movs r3, 0x2
- b _0803CF9A
- .pool
-_0803CF98:
- movs r3, 0x1
-_0803CF9A:
- movs r0, 0x58
- mov r1, r10
- muls r1, r0
- adds r0, r1, 0
- ldr r2, =gBattleMons
- adds r0, r2
- adds r0, 0x20
- ldrb r2, [r0]
- cmp r2, 0x21
- bne _0803CFBA
- ldr r0, =gBattleWeather
- ldrh r1, [r0]
- movs r0, 0x7
- ands r0, r1
- cmp r0, 0
- bne _0803CFCA
-_0803CFBA:
- cmp r2, 0x22
- bne _0803CFDA
- ldr r0, =gBattleWeather
- ldrh r1, [r0]
- movs r0, 0x60
- ands r0, r1
- cmp r0, 0
- beq _0803CFDA
-_0803CFCA:
- movs r7, 0x2
- b _0803CFDC
- .pool
-_0803CFD8:
- movs r3, 0x1
-_0803CFDA:
- movs r7, 0x1
-_0803CFDC:
- ldr r1, =gBattleMons
- movs r0, 0x58
- mov r2, r9
- muls r2, r0
- adds r0, r2, 0
- adds r4, r0, r1
- ldrh r0, [r4, 0x6]
- muls r3, r0
- ldr r2, =gStatStageRatios
- movs r1, 0x1B
- ldrsb r1, [r4, r1]
- lsls r1, 1
- adds r0, r1, r2
- ldrb r0, [r0]
- muls r0, r3
- adds r2, 0x1
- adds r1, r2
- ldrb r1, [r1]
- bl __divsi3
- mov r8, r0
- ldrh r0, [r4, 0x2E]
- cmp r0, 0xAF
- bne _0803D02C
- ldr r1, =gEnigmaBerries
- mov r3, r9
- lsls r0, r3, 3
- subs r0, r3
- lsls r0, 2
- adds r0, r1
- ldrb r6, [r0, 0x7]
- ldrb r5, [r0, 0x1A]
- b _0803D040
- .pool
-_0803D02C:
- ldrh r0, [r4, 0x2E]
- bl ItemId_GetHoldEffect
- lsls r0, 24
- lsrs r6, r0, 24
- ldrh r0, [r4, 0x2E]
- bl ItemId_GetHoldEffectParam
- lsls r0, 24
- lsrs r5, r0, 24
-_0803D040:
- ldr r0, =gBattleTypeFlags
- ldr r0, [r0]
- ldr r1, =0x023f0102
- ands r0, r1
- cmp r0, 0
- bne _0803D074
- ldr r0, =0x00000869
- bl FlagGet
- lsls r0, 24
- cmp r0, 0
- beq _0803D074
- mov r0, r9
- bl GetBankSide
- lsls r0, 24
- cmp r0, 0
- bne _0803D074
- movs r0, 0x6E
- mov r1, r8
- muls r1, r0
- adds r0, r1, 0
- movs r1, 0x64
- bl __udivsi3
- mov r8, r0
-_0803D074:
- cmp r6, 0x18
- bne _0803D07E
- mov r2, r8
- lsrs r2, 1
- mov r8, r2
-_0803D07E:
- ldr r1, =gBattleMons
- movs r0, 0x58
- mov r3, r9
- muls r3, r0
- adds r0, r3, 0
- adds r1, 0x4C
- adds r0, r1
- ldr r0, [r0]
- movs r1, 0x40
- ands r0, r1
- cmp r0, 0
- beq _0803D09C
- mov r0, r8
- lsrs r0, 2
- mov r8, r0
-_0803D09C:
- cmp r6, 0x1A
- bne _0803D0B8
- ldr r0, =gRandomTurnNumber
- ldrh r4, [r0]
- lsls r0, r5, 16
- subs r0, r5
- movs r1, 0x64
- bl __divsi3
- cmp r4, r0
- bge _0803D0B8
- movs r1, 0x1
- negs r1, r1
- mov r8, r1
-_0803D0B8:
- ldr r1, =gBattleMons
- movs r0, 0x58
- mov r2, r10
- muls r2, r0
- adds r0, r2, 0
- adds r4, r0, r1
- ldrh r0, [r4, 0x6]
- adds r3, r0, 0
- muls r3, r7
- ldr r2, =gStatStageRatios
- movs r1, 0x1B
- ldrsb r1, [r4, r1]
- lsls r1, 1
- adds r0, r1, r2
- ldrb r0, [r0]
- muls r0, r3
- adds r2, 0x1
- adds r1, r2
- ldrb r1, [r1]
- bl __divsi3
- adds r7, r0, 0
- ldrh r0, [r4, 0x2E]
- cmp r0, 0xAF
- bne _0803D118
- ldr r1, =gEnigmaBerries
- mov r3, r10
- lsls r0, r3, 3
- subs r0, r3
- lsls r0, 2
- adds r0, r1
- ldrb r6, [r0, 0x7]
- ldrb r5, [r0, 0x1A]
- b _0803D12C
- .pool
-_0803D118:
- ldrh r0, [r4, 0x2E]
- bl ItemId_GetHoldEffect
- lsls r0, 24
- lsrs r6, r0, 24
- ldrh r0, [r4, 0x2E]
- bl ItemId_GetHoldEffectParam
- lsls r0, 24
- lsrs r5, r0, 24
-_0803D12C:
- ldr r0, =gBattleTypeFlags
- ldr r0, [r0]
- ldr r1, =0x023f0102
- ands r0, r1
- cmp r0, 0
- bne _0803D15C
- ldr r0, =0x00000869
- bl FlagGet
- lsls r0, 24
- cmp r0, 0
- beq _0803D15C
- mov r0, r10
- bl GetBankSide
- lsls r0, 24
- cmp r0, 0
- bne _0803D15C
- movs r0, 0x6E
- muls r0, r7
- movs r1, 0x64
- bl __udivsi3
- adds r7, r0, 0
-_0803D15C:
- cmp r6, 0x18
- bne _0803D162
- lsrs r7, 1
-_0803D162:
- ldr r2, =gBattleMons
- movs r0, 0x58
- mov r1, r10
- muls r1, r0
- adds r0, r1, 0
- adds r1, r2, 0
- adds r1, 0x4C
- adds r0, r1
- ldr r0, [r0]
- movs r1, 0x40
- ands r0, r1
- cmp r0, 0
- beq _0803D17E
- lsrs r7, 2
-_0803D17E:
- cmp r6, 0x1A
- bne _0803D198
- ldr r0, =gRandomTurnNumber
- ldrh r4, [r0]
- lsls r0, r5, 16
- subs r0, r5
- movs r1, 0x64
- bl __divsi3
- cmp r4, r0
- bge _0803D198
- movs r7, 0x1
- negs r7, r7
-_0803D198:
- ldr r2, [sp, 0x4]
- cmp r2, 0
- beq _0803D1B8
- movs r3, 0
- b _0803D254
- .pool
-_0803D1B8:
- ldr r0, =gActionForBanks
- mov r3, r9
- adds r1, r3, r0
- ldrb r1, [r1]
- adds r2, r0, 0
- cmp r1, 0
- bne _0803D208
- ldr r0, =gProtectStructs
- lsls r1, r3, 4
- adds r1, r0
- ldrb r0, [r1]
- lsls r0, 29
- cmp r0, 0
- bge _0803D1E0
- movs r3, 0xA5
- b _0803D20A
- .pool
-_0803D1E0:
- ldr r0, =gBattleStruct
- ldr r0, [r0]
- add r0, r9
- adds r0, 0x80
- ldrb r0, [r0]
- lsls r0, 1
- movs r1, 0x58
- mov r3, r9
- muls r3, r1
- adds r1, r3, 0
- adds r0, r1
- ldr r1, =gBattleMons
- adds r1, 0xC
- adds r0, r1
- ldrh r3, [r0]
- b _0803D20A
- .pool
-_0803D208:
- movs r3, 0
-_0803D20A:
- mov r1, r10
- adds r0, r1, r2
- ldrb r0, [r0]
- cmp r0, 0
- bne _0803D254
- ldr r0, =gProtectStructs
- lsls r1, 4
- adds r1, r0
- ldrb r0, [r1]
- lsls r0, 29
- cmp r0, 0
- bge _0803D22C
- movs r2, 0xA5
- b _0803D256
- .pool
-_0803D22C:
- ldr r0, =gBattleStruct
- ldr r0, [r0]
- add r0, r10
- adds r0, 0x80
- ldrb r0, [r0]
- lsls r0, 1
- movs r1, 0x58
- mov r2, r10
- muls r2, r1
- adds r1, r2, 0
- adds r0, r1
- ldr r1, =gBattleMons
- adds r1, 0xC
- adds r0, r1
- ldrh r2, [r0]
- b _0803D256
- .pool
-_0803D254:
- movs r2, 0
-_0803D256:
- ldr r4, =gBattleMoves
- lsls r0, r3, 1
- adds r0, r3
- lsls r0, 2
- adds r0, r4
- movs r1, 0x7
- ldrsb r1, [r0, r1]
- lsls r3, r2, 1
- cmp r1, 0
- bne _0803D27A
- adds r0, r3, r2
- lsls r0, 2
- adds r0, r4
- ldrb r0, [r0, 0x7]
- lsls r0, 24
- asrs r0, 24
- cmp r0, 0
- beq _0803D2B8
-_0803D27A:
- adds r0, r3, r2
- lsls r0, 2
- adds r0, r4
- ldrb r0, [r0, 0x7]
- lsls r0, 24
- asrs r0, 24
- cmp r1, r0
- bne _0803D2AE
- cmp r8, r7
- bne _0803D2A4
- bl Random
- movs r1, 0x1
- ands r1, r0
- cmp r1, 0
- beq _0803D2A4
- movs r3, 0x2
- b _0803D2D4
- .pool
-_0803D2A4:
- cmp r8, r7
- bcs _0803D2D6
- movs r0, 0x1
- str r0, [sp, 0x8]
- b _0803D2D6
-_0803D2AE:
- cmp r1, r0
- bge _0803D2D6
- movs r1, 0x1
- str r1, [sp, 0x8]
- b _0803D2D6
-_0803D2B8:
- cmp r8, r7
- bne _0803D2CE
- bl Random
- movs r1, 0x1
- ands r1, r0
- cmp r1, 0
- beq _0803D2CE
- movs r2, 0x2
- str r2, [sp, 0x8]
- b _0803D2D6
-_0803D2CE:
- cmp r8, r7
- bcs _0803D2D6
- movs r3, 0x1
-_0803D2D4:
- str r3, [sp, 0x8]
-_0803D2D6:
- ldr r0, [sp, 0x8]
- add sp, 0xC
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end GetWhoStrikesFirst
-
- thumb_func_start sub_803D2E8
-sub_803D2E8: @ 803D2E8
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- movs r3, 0
- ldr r0, =gBattleTypeFlags
- ldr r1, [r0]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- beq _0803D354
- ldr r0, =gActiveBank
- strb r3, [r0]
- ldr r4, =gNoOfAllBanks
- mov r8, r0
- ldrb r0, [r4]
- cmp r3, r0
- bcc _0803D310
- b _0803D54A
-_0803D310:
- ldr r7, =gUnknown_0202407A
- ldr r6, =gActionForBanks
- mov r2, r8
- ldr r5, =gTurnOrder
-_0803D318:
- adds r1, r3, r7
- ldrb r0, [r2]
- adds r0, r6
- ldrb r0, [r0]
- strb r0, [r1]
- adds r1, r3, r5
- ldrb r0, [r2]
- strb r0, [r1]
- adds r3, 0x1
- ldrb r0, [r2]
- adds r0, 0x1
- strb r0, [r2]
- lsls r0, 24
- lsrs r0, 24
- ldrb r1, [r4]
- cmp r0, r1
- bcc _0803D318
- b _0803D54A
- .pool
-_0803D354:
- movs r2, 0x2
- ands r1, r2
- cmp r1, 0
- beq _0803D3A4
- ldr r0, =gActiveBank
- strb r3, [r0]
- ldr r1, =gNoOfAllBanks
- mov r8, r0
- adds r2, r1, 0
- ldrb r2, [r2]
- cmp r3, r2
- bcs _0803D3C0
- ldr r0, =gActionForBanks
- ldrb r1, [r0]
- adds r4, r0, 0
- cmp r1, 0x3
- beq _0803D3BE
-_0803D376:
- mov r7, r8
- ldrb r0, [r7]
- adds r0, 0x1
- strb r0, [r7]
- lsls r0, 24
- lsrs r0, 24
- ldr r1, =gNoOfAllBanks
- ldrb r1, [r1]
- cmp r0, r1
- bcs _0803D3C0
- ldrb r0, [r7]
- adds r0, r4
- ldrb r0, [r0]
- cmp r0, 0x3
- bne _0803D376
- b _0803D3BE
- .pool
-_0803D3A4:
- ldr r1, =gActionForBanks
- ldrb r0, [r1]
- ldr r4, =gActiveBank
- mov r8, r4
- cmp r0, 0x3
- bne _0803D3B4
- strb r3, [r4]
- movs r3, 0x5
-_0803D3B4:
- ldrb r0, [r1, 0x2]
- cmp r0, 0x3
- bne _0803D3C0
- mov r7, r8
- strb r2, [r7]
-_0803D3BE:
- movs r3, 0x5
-_0803D3C0:
- cmp r3, 0x5
- bne _0803D448
- ldr r6, =gUnknown_0202407A
- ldr r1, =gActionForBanks
- mov r2, r8
- ldrb r0, [r2]
- adds r0, r1
- ldrb r0, [r0]
- strb r0, [r6]
- ldr r2, =gTurnOrder
- mov r3, r8
- ldrb r0, [r3]
- strb r0, [r2]
- movs r3, 0x1
- movs r5, 0
- adds r4, r1, 0
- ldr r7, =gBattleMainFunc
- mov r10, r7
- ldr r0, =bc_80154A0
- mov r12, r0
- ldr r1, =gBattleStruct
- mov r9, r1
- ldr r7, =gNoOfAllBanks
- ldrb r7, [r7]
- cmp r5, r7
- bge _0803D41A
- adds r7, r6, 0
- adds r6, r4, 0
- adds r4, r2, 0
- ldr r2, =gNoOfAllBanks
-_0803D3FC:
- mov r0, r8
- ldrb r0, [r0]
- cmp r5, r0
- beq _0803D412
- adds r1, r3, r7
- adds r0, r5, r6
- ldrb r0, [r0]
- strb r0, [r1]
- adds r0, r3, r4
- strb r5, [r0]
- adds r3, 0x1
-_0803D412:
- adds r5, 0x1
- ldrb r1, [r2]
- cmp r5, r1
- blt _0803D3FC
-_0803D41A:
- mov r2, r12
- mov r3, r10
- str r2, [r3]
- mov r4, r9
- ldr r0, [r4]
- b _0803D554
- .pool
-_0803D448:
- movs r0, 0
- mov r7, r8
- strb r0, [r7]
- ldr r1, =gNoOfAllBanks
- ldrb r0, [r1]
- cmp r0, 0
- beq _0803D48E
- ldr r6, =gActionForBanks
- mov r2, r8
- ldr r5, =gUnknown_0202407A
- ldr r4, =gTurnOrder
-_0803D45E:
- ldrb r0, [r2]
- adds r0, r6
- ldrb r1, [r0]
- subs r0, r1, 0x1
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bhi _0803D47C
- adds r0, r3, r5
- strb r1, [r0]
- adds r1, r3, r4
- mov r7, r8
- ldrb r0, [r7]
- strb r0, [r1]
- adds r3, 0x1
-_0803D47C:
- ldrb r0, [r2]
- adds r0, 0x1
- strb r0, [r2]
- lsls r0, 24
- lsrs r0, 24
- ldr r1, =gNoOfAllBanks
- ldrb r1, [r1]
- cmp r0, r1
- bcc _0803D45E
-_0803D48E:
- movs r0, 0
- mov r2, r8
- strb r0, [r2]
- ldr r4, =gNoOfAllBanks
- ldrb r0, [r4]
- cmp r0, 0
- beq _0803D4D2
- ldr r6, =gActionForBanks
- ldr r5, =gUnknown_0202407A
- ldr r4, =gTurnOrder
-_0803D4A2:
- ldrb r0, [r2]
- adds r0, r6
- ldrb r1, [r0]
- subs r0, r1, 0x1
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bls _0803D4C0
- adds r0, r3, r5
- strb r1, [r0]
- adds r1, r3, r4
- mov r7, r8
- ldrb r0, [r7]
- strb r0, [r1]
- adds r3, 0x1
-_0803D4C0:
- ldrb r0, [r2]
- adds r0, 0x1
- strb r0, [r2]
- lsls r0, 24
- lsrs r0, 24
- ldr r1, =gNoOfAllBanks
- ldrb r1, [r1]
- cmp r0, r1
- bcc _0803D4A2
-_0803D4D2:
- movs r5, 0
- b _0803D540
- .pool
-_0803D4E8:
- adds r4, r5, 0x1
- adds r7, r4, 0
- ldrb r1, [r1]
- cmp r7, r1
- bge _0803D53E
- ldr r6, =gUnknown_0202407A
- lsls r2, r5, 24
- mov r8, r2
-_0803D4F8:
- ldr r0, =gTurnOrder
- adds r1, r5, r0
- ldrb r3, [r1]
- adds r0, r4, r0
- ldrb r1, [r0]
- adds r0, r5, r6
- ldrb r2, [r0]
- cmp r2, 0x1
- beq _0803D534
- adds r0, r4, r6
- ldrb r0, [r0]
- cmp r0, 0x1
- beq _0803D534
- cmp r2, 0x2
- beq _0803D534
- cmp r0, 0x2
- beq _0803D534
- adds r0, r3, 0
- movs r2, 0
- bl GetWhoStrikesFirst
- lsls r0, 24
- cmp r0, 0
- beq _0803D534
- lsls r1, r4, 24
- lsrs r1, 24
- mov r3, r8
- lsrs r0, r3, 24
- bl sub_803CEDC
-_0803D534:
- adds r4, 0x1
- ldr r0, =gNoOfAllBanks
- ldrb r0, [r0]
- cmp r4, r0
- blt _0803D4F8
-_0803D53E:
- adds r5, r7, 0
-_0803D540:
- ldr r1, =gNoOfAllBanks
- ldrb r0, [r1]
- subs r0, 0x1
- cmp r5, r0
- blt _0803D4E8
-_0803D54A:
- ldr r1, =gBattleMainFunc
- ldr r0, =bc_80154A0
- str r0, [r1]
- ldr r0, =gBattleStruct
- ldr r0, [r0]
-_0803D554:
- adds r0, 0x48
- movs r1, 0
- strb r1, [r0]
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_803D2E8
thumb_func_start TurnValuesCleanUp
TurnValuesCleanUp: @ 803D580
@@ -1215,7 +270,7 @@ _0803D7AE:
movs r0, 0
strb r0, [r1]
ldr r1, =gFightStateTracker
- ldr r0, =gUnknown_0202407A
+ ldr r0, =gActionsByTurnOrder
movs r3, 0
ldrb r0, [r0]
strb r0, [r1]
@@ -2100,7 +1155,7 @@ sub_803E0B8: @ 803E0B8
movs r0, 0x4
str r0, [sp]
ldr r6, =gBankAttacker
- ldr r1, =gTurnOrder
+ ldr r1, =gBanksByTurnOrder
ldr r0, =gCurrentMoveTurn
ldrb r0, [r0]
adds r0, r1
@@ -2641,7 +1696,7 @@ _0803E5C4:
b _0803E74E
_0803E5E2:
ldr r4, =gActiveBank
- ldr r0, =gTurnOrder
+ ldr r0, =gBanksByTurnOrder
ldr r3, [sp]
adds r0, r3, r0
ldrb r0, [r0]
@@ -2908,7 +1963,7 @@ _0803E83C:
bs2_8016374: @ 803E868
push {r4,lr}
ldr r3, =gBankAttacker
- ldr r1, =gTurnOrder
+ ldr r1, =gBanksByTurnOrder
ldr r0, =gCurrentMoveTurn
ldrb r0, [r0]
adds r0, r1
@@ -2973,7 +2028,7 @@ sub_803E90C: @ 803E90C
push {r5-r7}
ldr r4, =gBankAttacker
ldr r2, =gBankTarget
- ldr r1, =gTurnOrder
+ ldr r1, =gBanksByTurnOrder
ldr r0, =gCurrentMoveTurn
ldrb r0, [r0]
adds r0, r1
@@ -3534,7 +2589,7 @@ _0803EE24:
sub_803EE48: @ 803EE48
push {r4-r6,lr}
ldr r4, =gBankAttacker
- ldr r1, =gTurnOrder
+ ldr r1, =gBanksByTurnOrder
ldr r5, =gCurrentMoveTurn
ldrb r0, [r5]
adds r0, r1
@@ -3672,7 +2727,7 @@ _0803EF98:
thumb_func_start sub_803EFA8
sub_803EFA8: @ 803EFA8
ldr r2, =gBankAttacker
- ldr r1, =gTurnOrder
+ ldr r1, =gBanksByTurnOrder
ldr r0, =gCurrentMoveTurn
ldrb r0, [r0]
adds r0, r1
@@ -3697,7 +2752,7 @@ sub_803EFA8: @ 803EFA8
thumb_func_start bs5_8016AC0
bs5_8016AC0: @ 803EFF0
ldr r2, =gBankAttacker
- ldr r1, =gTurnOrder
+ ldr r1, =gBanksByTurnOrder
ldr r0, =gCurrentMoveTurn
ldrb r0, [r0]
adds r0, r1
@@ -3730,7 +2785,7 @@ bs5_8016AC0: @ 803EFF0
sub_803F050: @ 803F050
push {r4-r6,lr}
ldr r3, =gBankAttacker
- ldr r1, =gTurnOrder
+ ldr r1, =gBanksByTurnOrder
ldr r0, =gCurrentMoveTurn
ldrb r0, [r0]
adds r0, r1
@@ -3817,7 +2872,7 @@ _0803F100:
sub_803F120: @ 803F120
push {r4,lr}
ldr r2, =gBankAttacker
- ldr r1, =gTurnOrder
+ ldr r1, =gBanksByTurnOrder
ldr r0, =gCurrentMoveTurn
ldrb r0, [r0]
adds r0, r1
@@ -3903,7 +2958,7 @@ _0803F1CA:
bs8_exit_by_flight: @ 803F1F0
push {r4,lr}
ldr r2, =gBankAttacker
- ldr r1, =gTurnOrder
+ ldr r1, =gBanksByTurnOrder
ldr r4, =gCurrentMoveTurn
ldrb r0, [r4]
adds r0, r1
@@ -3926,7 +2981,7 @@ bs8_exit_by_flight: @ 803F1F0
thumb_func_start bs9_8016C9C
bs9_8016C9C: @ 803F22C
ldr r3, =gBankAttacker
- ldr r1, =gTurnOrder
+ ldr r1, =gBanksByTurnOrder
ldr r0, =gCurrentMoveTurn
ldrb r0, [r0]
adds r0, r1
@@ -3958,7 +3013,7 @@ bs9_8016C9C: @ 803F22C
ldr r1, =gFightStateTracker
movs r0, 0xA
strb r0, [r1]
- ldr r1, =gUnknown_0202407A
+ ldr r1, =gActionsByTurnOrder
movs r0, 0xC
strb r0, [r1, 0x1]
bx lr
@@ -3993,7 +3048,7 @@ bsD_proceed: @ 803F2CC
adds r0, 0x1
strb r0, [r1]
ldr r3, =gFightStateTracker
- ldr r2, =gUnknown_0202407A
+ ldr r2, =gActionsByTurnOrder
ldrb r0, [r1]
adds r0, r2
ldrb r0, [r0]
@@ -4010,7 +3065,7 @@ bsD_proceed: @ 803F2CC
thumb_func_start bsC_8016D70
bsC_8016D70: @ 803F300
push {r4-r6,lr}
- ldr r1, =gTurnOrder
+ ldr r1, =gBanksByTurnOrder
ldr r2, =gCurrentMoveTurn
ldrb r0, [r2]
adds r0, r1
@@ -4025,7 +3080,7 @@ bsC_8016D70: @ 803F300
adds r0, 0x1
strb r0, [r2]
ldr r3, =gFightStateTracker
- ldr r1, =gUnknown_0202407A
+ ldr r1, =gActionsByTurnOrder
ldrb r0, [r2]
adds r0, r1
ldrb r0, [r0]
diff --git a/include/battle.h b/include/battle.h
index 50d2389ac..7c8d89e57 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -161,6 +161,20 @@
#define SIDE_STATUS_MIST (1 << 8)
#define SIDE_STATUS_SPIKES_DAMAGED (1 << 9)
+#define ACTION_USE_MOVE 0
+#define ACTION_USE_ITEM 1
+#define ACTION_SWITCH 2
+#define ACTION_RUN 3
+#define ACTION_WATCHES_CAREFULLY 4
+#define ACTION_SAFARI_ZONE_BALL 5
+#define ACTION_POKEBLOCK_CASE 6
+#define ACTION_GO_NEAR 7
+#define ACTION_SAFARI_ZONE_RUN 8
+#define ACTION_9 9
+#define ACTION_CANCEL_PARTNER 12
+#define ACTION_NOTHING_FAINTED 13
+#define ACTION_INIT_VALUE 0xFF
+
#define ABILITYEFFECT_ON_SWITCHIN 0x0
#define ABILITYEFFECT_ENDTURN 0x1
#define ABILITYEFFECT_MOVES_BLOCK 0x2
@@ -232,6 +246,7 @@
#define SPRITES_INIT_STATE1 0x1 // shares the Id as well
#define SPRITES_INIT_STATE2 0x2
#define MOVE_EFFECT_BYTE 0x3
+#define ACTIONS_CONFIRMED_COUNT 0x4
#define MULTISTRING_CHOOSER 0x5
#define MSG_DISPLAY 0x7
#define BATTLE_COMMUNICATION_ENTRIES_COUNT 0x8
@@ -601,7 +616,7 @@ struct BattleStruct
u16 expValue;
u8 field_52;
u8 sentInPokes;
- u8 field_54[4];
+ bool8 selectionScriptFinished[BATTLE_BANKS_COUNT];
u8 field_58[4];
u8 field_5C[4];
u8 field_60[4][3];
@@ -615,8 +630,8 @@ struct BattleStruct
u8 field_7D;
u8 field_7E;
u8 formToChangeInto;
- u8 chosenMovesIds[4];
- u8 field_84[4];
+ u8 chosenMovesIds[BATTLE_BANKS_COUNT];
+ u8 stateIdAfterSelScript[BATTLE_BANKS_COUNT];
u8 field_88;
u8 field_89;
u8 field_8A;
@@ -890,8 +905,8 @@ bool8 CanRunFromBattle(u8 bank);
bool8 IsRunningFromBattleImpossible(void);
void PressurePPLoseOnUsingPerishSong(u8 bankAtk);
void PressurePPLoseOnUsingImprision(u8 bankAtk);
-u8 GetWhoStrikesFirst(u8 bankAtk, u8 bankDef, bool8 ignoreChosenMoves);
-void sub_803CEDC(u8, u8);
+u8 GetWhoStrikesFirst(u8 bank1, u8 bank2, bool8 ignoreChosenMoves);
+void SwapTurnOrder(u8, u8);
void BattleTurnPassed(void);
// battle_3
diff --git a/include/pokemon.h b/include/pokemon.h
index b3155881e..5d97c1666 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -439,7 +439,7 @@ struct BattleMove
u8 pp;
u8 secondaryEffectChance;
u8 target;
- u8 priority;
+ s8 priority;
u8 flags;
};
diff --git a/src/battle_2.c b/src/battle_2.c
index a18e1c698..04907d0c0 100644
--- a/src/battle_2.c
+++ b/src/battle_2.c
@@ -36,6 +36,7 @@
#include "battle_controllers.h"
#include "pokedex.h"
#include "abilities.h"
+#include "moves.h"
struct UnknownStruct6
{
@@ -127,12 +128,16 @@ extern u16 gCurrentMove;
extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
extern u8 gMoveSelectionCursor[BATTLE_BANKS_COUNT];
extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
-extern u8 gTurnOrder[BATTLE_BANKS_COUNT];
+extern u8 gBanksByTurnOrder[BATTLE_BANKS_COUNT];
extern u8 gActionForBanks[BATTLE_BANKS_COUNT];
extern u16 gChosenMovesByBanks[BATTLE_BANKS_COUNT];
extern u8 gFightStateTracker;
extern u8 gLastUsedAbility;
extern u16 gLastUsedItem;
+extern u8 gUnknown_0203CF00[];
+extern const u8* gBattlescriptPtrsForSelection[BATTLE_BANKS_COUNT];
+extern const u8* gBattlescriptCurrInstr;
+extern u32 gBattlePalaceMoveSelectionRngValue;
extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
extern const struct BattleMove gBattleMoves[];
@@ -153,6 +158,11 @@ extern const u8 gText_EmptyString3[];
// battlescripts
extern const u8 gUnknown_082DB8BE[];
extern const u8 gUnknown_082DB881[];
+extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[];
+extern const u8 gUnknown_082DAB11[];
+extern const u8 gUnknown_082DB9BA[];
+extern const u8 gUnknown_082DAAFE[];
+extern const u8 gUnknown_082DAB0B[];
extern void HandleLinkBattleSetup(void); // rom_3
extern void SetUpBattleVarsAndBirchZigzagoon(void); // rom_3
@@ -215,11 +225,12 @@ static void BattleIntroOpponent2SendsOutMonAnimation(void);
static void BattleIntroRecordMonsToDex(void);
static void BattleIntroPlayer1SendsOutMonAnimation(void);
static void TryDoEventsBeforeFirstTurn(void);
-void sub_803BE74(void);
+void HandleTurnActionSelectionState(void);
void bc_bs_exec(void);
-void sub_803D2E8(void);
+static void SetActionsAndBanksTurnOrder(void);
void sub_803CDF8(void);
bool8 sub_803CDB8(void);
+void bc_80154A0(void);
void CB2_InitBattle(void)
{
@@ -3509,13 +3520,13 @@ static void TryDoEventsBeforeFirstTurn(void)
if (gBattleStruct->switchInAbilitiesCounter == 0)
{
for (i = 0; i < gNoOfAllBanks; i++)
- gTurnOrder[i] = i;
+ gBanksByTurnOrder[i] = i;
for (i = 0; i < gNoOfAllBanks - 1; i++)
{
for (j = i + 1; j < gNoOfAllBanks; j++)
{
- if (GetWhoStrikesFirst(gTurnOrder[i], gTurnOrder[j], TRUE) != 0)
- sub_803CEDC(i, j);
+ if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], TRUE) != 0)
+ SwapTurnOrder(i, j);
}
}
}
@@ -3528,7 +3539,7 @@ static void TryDoEventsBeforeFirstTurn(void)
// check all switch in abilities happening from the fastest mon to slowest
while (gBattleStruct->switchInAbilitiesCounter < gNoOfAllBanks)
{
- if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gTurnOrder[gBattleStruct->switchInAbilitiesCounter], 0, 0, 0) != 0)
+ if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gBanksByTurnOrder[gBattleStruct->switchInAbilitiesCounter], 0, 0, 0) != 0)
effect++;
gBattleStruct->switchInAbilitiesCounter++;
@@ -3543,7 +3554,7 @@ static void TryDoEventsBeforeFirstTurn(void)
// check all switch in items having effect from the fastest mon to slowest
while (gBattleStruct->switchInItemsCounter < gNoOfAllBanks)
{
- if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gTurnOrder[gBattleStruct->switchInItemsCounter], 0) != 0)
+ if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gBanksByTurnOrder[gBattleStruct->switchInItemsCounter], 0) != 0)
effect++;
gBattleStruct->switchInItemsCounter++;
@@ -3554,14 +3565,14 @@ static void TryDoEventsBeforeFirstTurn(void)
for (i = 0; i < BATTLE_BANKS_COUNT; i++)
{
*(gBattleStruct->field_5C + i) = 6;
- gActionForBanks[i] = 0xFF;
- gChosenMovesByBanks[i] = 0;
+ gActionForBanks[i] = ACTION_INIT_VALUE;
+ gChosenMovesByBanks[i] = MOVE_NONE;
}
TurnValuesCleanUp(0);
SpecialStatusesClear();
*(&gBattleStruct->field_91) = gAbsentBankFlags;
sub_814F9EC(gText_EmptyString3, 0);
- gBattleMainFunc = sub_803BE74;
+ gBattleMainFunc = HandleTurnActionSelectionState;
ResetSentPokesToOpponentValue();
for (i = 0; i < BATTLE_COMMUNICATION_ENTRIES_COUNT; i++)
@@ -3659,8 +3670,8 @@ void BattleTurnPassed(void)
for (i = 0; i < gNoOfAllBanks; i++)
{
- gActionForBanks[i] = 0xFF;
- gChosenMovesByBanks[i] = 0;
+ gActionForBanks[i] = ACTION_INIT_VALUE;
+ gChosenMovesByBanks[i] = MOVE_NONE;
}
for (i = 0; i < 4; i++)
@@ -3668,7 +3679,7 @@ void BattleTurnPassed(void)
*(&gBattleStruct->field_91) = gAbsentBankFlags;
sub_814F9EC(gText_EmptyString3, 0);
- gBattleMainFunc = sub_803BE74;
+ gBattleMainFunc = HandleTurnActionSelectionState;
gRandomTurnNumber = Random();
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
@@ -3743,8 +3754,6 @@ u8 IsRunningFromBattleImpossible(void)
return 0;
}
-extern u8 gUnknown_0203CF00[];
-
void sub_803BDA0(u8 bank)
{
s32 i;
@@ -3777,32 +3786,31 @@ void sub_803BDA0(u8 bank)
}
}
-extern const u8* gBattlescriptPtrsForSelection[BATTLE_BANKS_COUNT];
-extern const u8* gBattlescriptCurrInstr;
-
-extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[];
-extern const u8 gUnknown_082DAB11[];
-extern const u8 gUnknown_082DB9BA[];
-extern const u8 gUnknown_082DAAFE[];
-extern const u8 gUnknown_082DAB0B[];
-
-extern u32 gBattlePalaceMoveSelectionRngValue;
-
-void sub_803BE74(void)
+#define STATE_TURN_START_RECORD 0
+#define STATE_BEFORE_ACTION_CHOSEN 1
+#define STATE_WAIT_ACTION_CHOSEN 2
+#define STATE_WAIT_ACTION_CASE_CHOSEN 3
+#define STATE_WAIT_ACTION_CONFIRMED_STANDBY 4
+#define STATE_WAIT_ACTION_CONFIRMED 5
+#define STATE_SELECTION_SCRIPT 6
+#define STATE_WAIT_SET_BEFORE_ACTION 7
+#define STATE_SELECTION_SCRIPT_MAY_RUN 8
+
+void HandleTurnActionSelectionState(void)
{
s32 i;
- gBattleCommunication[4] = 0;
+ gBattleCommunication[ACTIONS_CONFIRMED_COUNT] = 0;
for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
{
u8 identity = GetBankIdentity(gActiveBank);
switch (gBattleCommunication[gActiveBank])
{
- case 0:
+ case STATE_TURN_START_RECORD: // recorded battle related on start of every turn
sub_8185FD0();
- gBattleCommunication[gActiveBank] = 1;
+ gBattleCommunication[gActiveBank] = STATE_BEFORE_ACTION_CHOSEN;
break;
- case 1:
+ case STATE_BEFORE_ACTION_CHOSEN: // choose an action
*(gBattleStruct->field_5C + gActiveBank) = 6;
if (gBattleTypeFlags & BATTLE_TYPE_MULTI
|| !(identity & BIT_MON)
@@ -3811,19 +3819,19 @@ void sub_803BE74(void)
{
if (gBattleStruct->field_91 & gBitTable[gActiveBank])
{
- gActionForBanks[gActiveBank] = 13;
+ gActionForBanks[gActiveBank] = ACTION_NOTHING_FAINTED;
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
- gBattleCommunication[gActiveBank] = 5;
+ gBattleCommunication[gActiveBank] = STATE_WAIT_ACTION_CONFIRMED;
else
- gBattleCommunication[gActiveBank] = 4;
+ gBattleCommunication[gActiveBank] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
}
else
{
if (gBattleMons[gActiveBank].status2 & STATUS2_MULTIPLETURNS
|| gBattleMons[gActiveBank].status2 & STATUS2_RECHARGE)
{
- gActionForBanks[gActiveBank] = 0;
- gBattleCommunication[gActiveBank] = 4;
+ gActionForBanks[gActiveBank] = ACTION_USE_MOVE;
+ gBattleCommunication[gActiveBank] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
}
else
{
@@ -3834,7 +3842,7 @@ void sub_803BE74(void)
}
}
break;
- case 2:
+ case STATE_WAIT_ACTION_CHOSEN: // try to perform an action
if (!(gBattleExecBuffer & ((gBitTable[gActiveBank]) | (0xF0000000) | (gBitTable[gActiveBank] << 4) | (gBitTable[gActiveBank] << 8) | (gBitTable[gActiveBank] << 0xC))))
{
RecordedBattle_SetBankAction(gActiveBank, gBattleBufferB[gActiveBank][1]);
@@ -3842,12 +3850,12 @@ void sub_803BE74(void)
switch (gBattleBufferB[gActiveBank][1])
{
- case 0:
+ case ACTION_USE_MOVE:
if (AreAllMovesUnusable())
{
- gBattleCommunication[gActiveBank] = 6;
- *(gBattleStruct->field_54 + gActiveBank) = 0;
- *(gBattleStruct->field_84 + gActiveBank) = 4;
+ gBattleCommunication[gActiveBank] = STATE_SELECTION_SCRIPT;
+ *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE;
+ *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
*(gBattleStruct->moveTarget + gActiveBank) = gBattleBufferB[gActiveBank][3];
return;
}
@@ -3855,7 +3863,7 @@ void sub_803BE74(void)
{
gChosenMovesByBanks[gActiveBank] = gDisableStructs[gActiveBank].encoredMove;
*(gBattleStruct->chosenMovesIds + gActiveBank) = gDisableStructs[gActiveBank].encoredMovePos;
- gBattleCommunication[gActiveBank] = 4;
+ gBattleCommunication[gActiveBank] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
return;
}
else
@@ -3880,7 +3888,7 @@ void sub_803BE74(void)
MarkBufferBankForExecution(gActiveBank);
}
break;
- case 1:
+ case ACTION_USE_ITEM:
if (gBattleTypeFlags & (BATTLE_TYPE_LINK
| BATTLE_TYPE_FRONTIER_NO_PYRAMID
| BATTLE_TYPE_EREADER_TRAINER
@@ -3888,9 +3896,9 @@ void sub_803BE74(void)
{
RecordedBattle_ClearBankAction(gActiveBank, 1);
gBattlescriptPtrsForSelection[gActiveBank] = BattleScript_ActionSelectionItemsCantBeUsed;
- gBattleCommunication[gActiveBank] = 6;
- *(gBattleStruct->field_54 + gActiveBank) = 0;
- *(gBattleStruct->field_84 + gActiveBank) = 1;
+ gBattleCommunication[gActiveBank] = STATE_SELECTION_SCRIPT;
+ *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE;
+ *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_BEFORE_ACTION_CHOSEN;
return;
}
else
@@ -3899,7 +3907,7 @@ void sub_803BE74(void)
MarkBufferBankForExecution(gActiveBank);
}
break;
- case 2:
+ case ACTION_SWITCH:
*(gBattleStruct->field_58 + gActiveBank) = gBattlePartyID[gActiveBank];
if (gBattleMons[gActiveBank].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)
|| gBattleTypeFlags & BATTLE_TYPE_ARENA
@@ -3920,30 +3928,30 @@ void sub_803BE74(void)
}
else
{
- if (gActiveBank == 2 && gActionForBanks[0] == 2)
+ if (gActiveBank == 2 && gActionForBanks[0] == ACTION_SWITCH)
EmitChoosePokemon(0, 0, *(gBattleStruct->field_5C + 0), ABILITY_NONE, gBattleStruct->field_60[gActiveBank]);
- else if (gActiveBank == 3 && gActionForBanks[1] == 2)
+ else if (gActiveBank == 3 && gActionForBanks[1] == ACTION_SWITCH)
EmitChoosePokemon(0, 0, *(gBattleStruct->field_5C + 1), ABILITY_NONE, gBattleStruct->field_60[gActiveBank]);
else
EmitChoosePokemon(0, 0, 6, ABILITY_NONE, gBattleStruct->field_60[gActiveBank]);
}
MarkBufferBankForExecution(gActiveBank);
break;
- case 5:
+ case ACTION_SAFARI_ZONE_BALL:
if (IsPlayerPartyAndPokemonStorageFull())
{
gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DAB11;
- gBattleCommunication[gActiveBank] = 6;
- *(gBattleStruct->field_54 + gActiveBank) = 0;
- *(gBattleStruct->field_84 + gActiveBank) = 1;
+ gBattleCommunication[gActiveBank] = STATE_SELECTION_SCRIPT;
+ *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE;
+ *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_BEFORE_ACTION_CHOSEN;
return;
}
break;
- case 6:
+ case ACTION_POKEBLOCK_CASE:
EmitOpenBag(0, gBattleStruct->field_60[gActiveBank]);
MarkBufferBankForExecution(gActiveBank);
break;
- case 12:
+ case ACTION_CANCEL_PARTNER:
gBattleCommunication[gActiveBank] = 7;
gBattleCommunication[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)] = 1;
RecordedBattle_ClearBankAction(gActiveBank, 1);
@@ -3954,22 +3962,22 @@ void sub_803BE74(void)
MarkBufferBankForExecution(gActiveBank);
return;
}
- else if (gActionForBanks[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)] == 2)
+ else if (gActionForBanks[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)] == ACTION_SWITCH)
{
RecordedBattle_ClearBankAction(GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON), 2);
}
- else if (gActionForBanks[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)] == 3)
+ else if (gActionForBanks[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)] == ACTION_RUN)
{
RecordedBattle_ClearBankAction(GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON), 1);
}
- else if (gActionForBanks[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)] == 0
+ else if (gActionForBanks[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)] == ACTION_USE_MOVE
&& (gProtectStructs[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)].onlyStruggle
|| gDisableStructs[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)].encoredMove))
{
RecordedBattle_ClearBankAction(GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON), 1);
}
else if (gBattleTypeFlags & BATTLE_TYPE_PALACE
- && gActionForBanks[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)] == 0)
+ && gActionForBanks[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)] == ACTION_USE_MOVE)
{
gRngValue = gBattlePalaceMoveSelectionRngValue;
RecordedBattle_ClearBankAction(GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON), 1);
@@ -3985,28 +3993,28 @@ void sub_803BE74(void)
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER
&& gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_x4000000)
- && gBattleBufferB[gActiveBank][1] == 3)
+ && gBattleBufferB[gActiveBank][1] == ACTION_RUN)
{
gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DB9BA;
gBattleCommunication[gActiveBank] = 8;
- *(gBattleStruct->field_54 + gActiveBank) = 0;
- *(gBattleStruct->field_84 + gActiveBank) = 1;
+ *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE;
+ *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_BEFORE_ACTION_CHOSEN;
return;
}
else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER
&& !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
- && gBattleBufferB[gActiveBank][1] == 3)
+ && gBattleBufferB[gActiveBank][1] == ACTION_RUN)
{
BattleScriptExecute(gUnknown_082DAAFE);
gBattleCommunication[gActiveBank] = 1;
}
else if (IsRunningFromBattleImpossible() != 0
- && gBattleBufferB[gActiveBank][1] == 3)
+ && gBattleBufferB[gActiveBank][1] == ACTION_RUN)
{
gBattlescriptPtrsForSelection[gActiveBank] = gUnknown_082DAB0B;
- gBattleCommunication[gActiveBank] = 6;
- *(gBattleStruct->field_54 + gActiveBank) = 0;
- *(gBattleStruct->field_84 + gActiveBank) = 1;
+ gBattleCommunication[gActiveBank] = STATE_SELECTION_SCRIPT;
+ *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE;
+ *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_BEFORE_ACTION_CHOSEN;
return;
}
else
@@ -4015,12 +4023,12 @@ void sub_803BE74(void)
}
}
break;
- case 3:
+ case STATE_WAIT_ACTION_CASE_CHOSEN:
if (!(gBattleExecBuffer & ((gBitTable[gActiveBank]) | (0xF0000000) | (gBitTable[gActiveBank] << 4) | (gBitTable[gActiveBank] << 8) | (gBitTable[gActiveBank] << 0xC))))
{
switch (gActionForBanks[gActiveBank])
{
- case 0:
+ case ACTION_USE_MOVE:
switch (gBattleBufferB[gActiveBank][1])
{
case 3:
@@ -4033,7 +4041,7 @@ void sub_803BE74(void)
gActionForBanks[gActiveBank] = gBattleBufferB[gActiveBank][1];
return;
case 15:
- gActionForBanks[gActiveBank] = 2;
+ gActionForBanks[gActiveBank] = ACTION_SWITCH;
sub_803CDF8();
return;
default:
@@ -4046,10 +4054,10 @@ void sub_803BE74(void)
else if (TrySetCantSelectMoveBattleScript())
{
RecordedBattle_ClearBankAction(gActiveBank, 1);
- gBattleCommunication[gActiveBank] = 6;
- *(gBattleStruct->field_54 + gActiveBank) = 0;
+ gBattleCommunication[gActiveBank] = STATE_SELECTION_SCRIPT;
+ *(gBattleStruct->selectionScriptFinished + gActiveBank) = FALSE;
gBattleBufferB[gActiveBank][1] = 0;
- *(gBattleStruct->field_84 + gActiveBank) = 2;
+ *(gBattleStruct->stateIdAfterSelScript + gActiveBank) = STATE_WAIT_ACTION_CHOSEN;
return;
}
else
@@ -4067,7 +4075,7 @@ void sub_803BE74(void)
break;
}
break;
- case 1:
+ case ACTION_USE_ITEM:
if ((gBattleBufferB[gActiveBank][1] | (gBattleBufferB[gActiveBank][2] << 8)) == 0)
{
gBattleCommunication[gActiveBank] = 1;
@@ -4078,7 +4086,7 @@ void sub_803BE74(void)
gBattleCommunication[gActiveBank]++;
}
break;
- case 2:
+ case ACTION_SWITCH:
if (gBattleBufferB[gActiveBank][1] == 6)
{
gBattleCommunication[gActiveBank] = 1;
@@ -4090,40 +4098,40 @@ void sub_803BE74(void)
gBattleCommunication[gActiveBank]++;
}
break;
- case 3:
+ case ACTION_RUN:
gHitMarker |= HITMARKER_x8000;
gBattleCommunication[gActiveBank]++;
break;
- case 4:
+ case ACTION_WATCHES_CAREFULLY:
gBattleCommunication[gActiveBank]++;
break;
- case 5:
+ case ACTION_SAFARI_ZONE_BALL:
gBattleCommunication[gActiveBank]++;
break;
- case 6:
+ case ACTION_POKEBLOCK_CASE:
if ((gBattleBufferB[gActiveBank][1] | (gBattleBufferB[gActiveBank][2] << 8)) != 0)
{
gBattleCommunication[gActiveBank]++;
}
else
{
- gBattleCommunication[gActiveBank] = 1;
+ gBattleCommunication[gActiveBank] = STATE_BEFORE_ACTION_CHOSEN;
}
break;
- case 7:
+ case ACTION_GO_NEAR:
gBattleCommunication[gActiveBank]++;
break;
- case 8:
+ case ACTION_SAFARI_ZONE_RUN:
gHitMarker |= HITMARKER_x8000;
gBattleCommunication[gActiveBank]++;
break;
- case 9:
+ case ACTION_9:
gBattleCommunication[gActiveBank]++;
break;
}
}
break;
- case 4:
+ case STATE_WAIT_ACTION_CONFIRMED_STANDBY:
if (!(gBattleExecBuffer & ((gBitTable[gActiveBank]) | (0xF0000000) | (gBitTable[gActiveBank] << 4) | (gBitTable[gActiveBank] << 8) | (gBitTable[gActiveBank] << 0xC))))
{
i = (sub_803CDB8() != 0);
@@ -4142,16 +4150,16 @@ void sub_803BE74(void)
gBattleCommunication[gActiveBank]++;
}
break;
- case 5:
+ case STATE_WAIT_ACTION_CONFIRMED:
if (!(gBattleExecBuffer & ((gBitTable[gActiveBank]) | (0xF0000000) | (gBitTable[gActiveBank] << 4) | (gBitTable[gActiveBank] << 8) | (gBitTable[gActiveBank] << 0xC))))
{
- gBattleCommunication[4]++;
+ gBattleCommunication[ACTIONS_CONFIRMED_COUNT]++;
}
break;
- case 6:
- if (*(gBattleStruct->field_54 + gActiveBank) != 0)
+ case STATE_SELECTION_SCRIPT:
+ if (*(gBattleStruct->selectionScriptFinished + gActiveBank))
{
- gBattleCommunication[gActiveBank] = *(gBattleStruct->field_84 + gActiveBank);
+ gBattleCommunication[gActiveBank] = *(gBattleStruct->stateIdAfterSelScript + gActiveBank);
}
else
{
@@ -4164,25 +4172,25 @@ void sub_803BE74(void)
gBattlescriptPtrsForSelection[gActiveBank] = gBattlescriptCurrInstr;
}
break;
- case 7:
+ case STATE_WAIT_SET_BEFORE_ACTION:
if (!(gBattleExecBuffer & ((gBitTable[gActiveBank]) | (0xF0000000) | (gBitTable[gActiveBank] << 4) | (gBitTable[gActiveBank] << 8) | (gBitTable[gActiveBank] << 0xC))))
{
gBattleCommunication[gActiveBank] = 1;
}
break;
- case 8:
- if (*(gBattleStruct->field_54 + gActiveBank) != 0)
+ case STATE_SELECTION_SCRIPT_MAY_RUN:
+ if (*(gBattleStruct->selectionScriptFinished + gActiveBank))
{
if (gBattleBufferB[gActiveBank][1] == 13)
{
gHitMarker |= HITMARKER_x8000;
- gActionForBanks[gActiveBank] = 3;
- gBattleCommunication[gActiveBank] = 4;
+ gActionForBanks[gActiveBank] = ACTION_RUN;
+ gBattleCommunication[gActiveBank] = STATE_WAIT_ACTION_CONFIRMED_STANDBY;
}
else
{
RecordedBattle_ClearBankAction(gActiveBank, 1);
- gBattleCommunication[gActiveBank] = *(gBattleStruct->field_84 + gActiveBank);
+ gBattleCommunication[gActiveBank] = *(gBattleStruct->stateIdAfterSelScript + gActiveBank);
}
}
else
@@ -4199,18 +4207,323 @@ void sub_803BE74(void)
}
}
- if (gBattleCommunication[4] == gNoOfAllBanks)
+ // check if everyone chose actions
+ if (gBattleCommunication[ACTIONS_CONFIRMED_COUNT] == gNoOfAllBanks)
{
sub_818603C(1);
- gBattleMainFunc = sub_803D2E8;
+ gBattleMainFunc = SetActionsAndBanksTurnOrder;
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
{
for (i = 0; i < gNoOfAllBanks; i++)
{
- if (gActionForBanks[i] == 2)
+ if (gActionForBanks[i] == ACTION_SWITCH)
sub_80571DC(i, *(gBattleStruct->field_5C + i));
}
}
}
}
+
+bool8 sub_803CDB8(void)
+{
+ s32 i, var;
+
+ for (var = 0, i = 0; i < gNoOfAllBanks; i++)
+ {
+ if (gBattleCommunication[i] == 5)
+ var++;
+ }
+
+ if (var + 1 == gNoOfAllBanks)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_803CDF8(void)
+{
+ *(gBattleStruct->field_5C + gActiveBank) = gBattleBufferB[gActiveBank][1];
+ RecordedBattle_SetBankAction(gActiveBank, gBattleBufferB[gActiveBank][1]);
+
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ *(gActiveBank * 3 + (u8*)(gBattleStruct->field_60) + 0) &= 0xF;
+ *(gActiveBank * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBank][2] & 0xF0);
+ *(gActiveBank * 3 + (u8*)(gBattleStruct->field_60) + 1) = gBattleBufferB[gActiveBank][3];
+
+ *((gActiveBank ^ BIT_MON) * 3 + (u8*)(gBattleStruct->field_60) + 0) &= (0xF0);
+ *((gActiveBank ^ BIT_MON) * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBank][2] & 0xF0) >> 4;
+ *((gActiveBank ^ BIT_MON) * 3 + (u8*)(gBattleStruct->field_60) + 2) = gBattleBufferB[gActiveBank][3];
+ }
+}
+
+extern u8 gActionsByTurnOrder[BATTLE_BANKS_COUNT];
+
+void SwapTurnOrder(u8 id1, u8 id2)
+{
+ u32 temp = gActionsByTurnOrder[id1];
+ gActionsByTurnOrder[id1] = gActionsByTurnOrder[id2];
+ gActionsByTurnOrder[id2] = temp;
+
+ temp = gBanksByTurnOrder[id1];
+ gBanksByTurnOrder[id1] = gBanksByTurnOrder[id2];
+ gBanksByTurnOrder[id2] = temp;
+}
+
+extern const u8 gStatStageRatios[][2];
+
+u8 GetWhoStrikesFirst(u8 bank1, u8 bank2, bool8 ignoreChosenMoves)
+{
+ u8 strikesFirst = 0;
+ u8 speedMultiplierBank1 = 0, speedMultiplierBank2 = 0;
+ u32 speedBank1 = 0, speedBank2 = 0;
+ u8 holdEffect = 0;
+ u8 holdEffectParam = 0;
+ u16 moveBank1 = 0, moveBank2 = 0;
+
+ if (WEATHER_HAS_EFFECT)
+ {
+ if ((gBattleMons[bank1].ability == ABILITY_SWIFT_SWIM && gBattleWeather & WEATHER_RAIN_ANY)
+ || (gBattleMons[bank1].ability == ABILITY_CHLOROPHYLL && gBattleWeather & WEATHER_SUN_ANY))
+ speedMultiplierBank1 = 2;
+ else
+ speedMultiplierBank1 = 1;
+
+ if ((gBattleMons[bank2].ability == ABILITY_SWIFT_SWIM && gBattleWeather & WEATHER_RAIN_ANY)
+ || (gBattleMons[bank2].ability == ABILITY_CHLOROPHYLL && gBattleWeather & WEATHER_SUN_ANY))
+ speedMultiplierBank2 = 2;
+ else
+ speedMultiplierBank2 = 1;
+ }
+ else
+ {
+ speedMultiplierBank1 = 1;
+ speedMultiplierBank2 = 1;
+ }
+
+ speedBank1 = (gBattleMons[bank1].speed * speedMultiplierBank1)
+ * (gStatStageRatios[gBattleMons[bank1].statStages[STAT_STAGE_SPEED]][0])
+ / (gStatStageRatios[gBattleMons[bank1].statStages[STAT_STAGE_SPEED]][1]);
+
+ if (gBattleMons[bank1].item == ITEM_ENIGMA_BERRY)
+ {
+ holdEffect = gEnigmaBerries[bank1].holdEffect;
+ holdEffectParam = gEnigmaBerries[bank1].holdEffectParam;
+ }
+ else
+ {
+ holdEffect = ItemId_GetHoldEffect(gBattleMons[bank1].item);
+ holdEffectParam = ItemId_GetHoldEffectParam(gBattleMons[bank1].item);
+ }
+
+ // badge boost
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER))
+ && FlagGet(BADGE03_GET)
+ && GetBankSide(bank1) == SIDE_PLAYER)
+ {
+ speedBank1 = (speedBank1 * 110) / 100;
+ }
+
+ if (holdEffect == HOLD_EFFECT_MACHO_BRACE)
+ speedBank1 /= 2;
+
+ if (gBattleMons[bank1].status1 & STATUS_PARALYSIS)
+ speedBank1 /= 4;
+
+ if (holdEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * holdEffectParam) / 100)
+ speedBank1 = UINT_MAX;
+
+ // check second bank's speed
+
+ speedBank2 = (gBattleMons[bank2].speed * speedMultiplierBank2)
+ * (gStatStageRatios[gBattleMons[bank2].statStages[STAT_STAGE_SPEED]][0])
+ / (gStatStageRatios[gBattleMons[bank2].statStages[STAT_STAGE_SPEED]][1]);
+
+ if (gBattleMons[bank2].item == ITEM_ENIGMA_BERRY)
+ {
+ holdEffect = gEnigmaBerries[bank2].holdEffect;
+ holdEffectParam = gEnigmaBerries[bank2].holdEffectParam;
+ }
+ else
+ {
+ holdEffect = ItemId_GetHoldEffect(gBattleMons[bank2].item);
+ holdEffectParam = ItemId_GetHoldEffectParam(gBattleMons[bank2].item);
+ }
+
+ // badge boost
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER))
+ && FlagGet(BADGE03_GET)
+ && GetBankSide(bank2) == SIDE_PLAYER)
+ {
+ speedBank2 = (speedBank2 * 110) / 100;
+ }
+
+ if (holdEffect == HOLD_EFFECT_MACHO_BRACE)
+ speedBank2 /= 2;
+
+ if (gBattleMons[bank2].status1 & STATUS_PARALYSIS)
+ speedBank2 /= 4;
+
+ if (holdEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * holdEffectParam) / 100)
+ speedBank2 = UINT_MAX;
+
+ if (ignoreChosenMoves)
+ {
+ moveBank1 = MOVE_NONE;
+ moveBank2 = MOVE_NONE;
+ }
+ else
+ {
+ if (gActionForBanks[bank1] == ACTION_USE_MOVE)
+ {
+ if (gProtectStructs[bank1].onlyStruggle)
+ moveBank1 = MOVE_STRUGGLE;
+ else
+ moveBank1 = gBattleMons[bank1].moves[*(gBattleStruct->chosenMovesIds + bank1)];
+ }
+ else
+ moveBank1 = MOVE_NONE;
+
+ if (gActionForBanks[bank2] == ACTION_USE_MOVE)
+ {
+ if (gProtectStructs[bank2].onlyStruggle)
+ moveBank2 = MOVE_STRUGGLE;
+ else
+ moveBank2 = gBattleMons[bank2].moves[*(gBattleStruct->chosenMovesIds + bank2)];
+ }
+ else
+ moveBank2 = MOVE_NONE;
+ }
+
+ // both move priorities are different than 0
+ if (gBattleMoves[moveBank1].priority != 0 || gBattleMoves[moveBank2].priority != 0)
+ {
+ // both priorities are the same
+ if (gBattleMoves[moveBank1].priority == gBattleMoves[moveBank2].priority)
+ {
+ if (speedBank1 == speedBank2 && Random() & 1)
+ strikesFirst = 2; // same speeds, same priorities
+ else if (speedBank1 < speedBank2)
+ strikesFirst = 1; // bank2 has more speed
+
+ // else bank1 has more speed
+ }
+ else if (gBattleMoves[moveBank1].priority < gBattleMoves[moveBank2].priority)
+ strikesFirst = 1; // bank2's move has greater priority
+
+ // else bank1's move has greater priority
+ }
+ // both priorities are equal to 0
+ else
+ {
+ if (speedBank1 == speedBank2 && Random() & 1)
+ strikesFirst = 2; // same speeds, same priorities
+ else if (speedBank1 < speedBank2)
+ strikesFirst = 1; // bank2 has more speed
+
+ // else bank1 has more speed
+ }
+
+ return strikesFirst;
+}
+
+static void SetActionsAndBanksTurnOrder(void)
+{
+ s32 var = 0;
+ s32 i, j;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
+ {
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ gActionsByTurnOrder[var] = gActionForBanks[gActiveBank];
+ gBanksByTurnOrder[var] = gActiveBank;
+ var++;
+ }
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (gActionForBanks[gActiveBank] == ACTION_RUN)
+ {
+ var = 5;
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (gActionForBanks[0] == ACTION_RUN)
+ {
+ gActiveBank = 0;
+ var = 5;
+ }
+ if (gActionForBanks[2] == ACTION_RUN)
+ {
+ gActiveBank = 2;
+ var = 5;
+ }
+ }
+
+ if (var == 5)
+ {
+ gActionsByTurnOrder[0] = gActionForBanks[gActiveBank];
+ gBanksByTurnOrder[0] = gActiveBank;
+ var = 1;
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ if (i != gActiveBank)
+ {
+ gActionsByTurnOrder[var] = gActionForBanks[i];
+ gBanksByTurnOrder[var] = i;
+ var++;
+ }
+ }
+ gBattleMainFunc = bc_80154A0;
+ gBattleStruct->field_48 = 0;
+ return;
+ }
+ else
+ {
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (gActionForBanks[gActiveBank] == ACTION_USE_ITEM || gActionForBanks[gActiveBank] == ACTION_SWITCH)
+ {
+ gActionsByTurnOrder[var] = gActionForBanks[gActiveBank];
+ gBanksByTurnOrder[var] = gActiveBank;
+ var++;
+ }
+ }
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (gActionForBanks[gActiveBank] != ACTION_USE_ITEM && gActionForBanks[gActiveBank] != ACTION_SWITCH)
+ {
+ gActionsByTurnOrder[var] = gActionForBanks[gActiveBank];
+ gBanksByTurnOrder[var] = gActiveBank;
+ var++;
+ }
+ }
+ for (i = 0; i < gNoOfAllBanks - 1; i++)
+ {
+ for (j = i + 1; j < gNoOfAllBanks; j++)
+ {
+ u8 bank1 = gBanksByTurnOrder[i];
+ u8 bank2 = gBanksByTurnOrder[j];
+ if (gActionsByTurnOrder[i] != ACTION_USE_ITEM
+ && gActionsByTurnOrder[j] != ACTION_USE_ITEM
+ && gActionsByTurnOrder[i] != ACTION_SWITCH
+ && gActionsByTurnOrder[j] != ACTION_SWITCH)
+ {
+ if (GetWhoStrikesFirst(bank1, bank2, FALSE))
+ SwapTurnOrder(i, j);
+ }
+ }
+ }
+ }
+ }
+ gBattleMainFunc = bc_80154A0;
+ gBattleStruct->field_48 = 0;
+}
diff --git a/src/battle_3.c b/src/battle_3.c
index 59028410d..c20d361a4 100644
--- a/src/battle_3.c
+++ b/src/battle_3.c
@@ -32,7 +32,7 @@ extern u8 gBankAttacker;
extern u8 gBankTarget;
extern u8 gAbsentBankFlags;
extern u16 gBattleWeather;
-extern u8 gTurnOrder[BATTLE_BANKS_COUNT];
+extern u8 gBanksByTurnOrder[BATTLE_BANKS_COUNT];
extern u16 gSideAffecting[];
extern u8 gBattleCommunication[];
extern void (*gBattleMainFunc)(void);
@@ -404,15 +404,15 @@ u8 UpdateTurnCounters(void)
case 0:
for (i = 0; i < gNoOfAllBanks; i++)
{
- gTurnOrder[i] = i;
+ gBanksByTurnOrder[i] = i;
}
for (i = 0; i < gNoOfAllBanks - 1; i++)
{
s32 j;
for (j = i + 1; j < gNoOfAllBanks; j++)
{
- if (GetWhoStrikesFirst(gTurnOrder[i], gTurnOrder[j], 0))
- sub_803CEDC(i, j);
+ if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], 0))
+ SwapTurnOrder(i, j);
}
}
@@ -537,7 +537,7 @@ u8 UpdateTurnCounters(void)
case 5:
while (gBattleStruct->turnSideTracker < gNoOfAllBanks)
{
- gActiveBank = gTurnOrder[gBattleStruct->turnSideTracker];
+ gActiveBank = gBanksByTurnOrder[gBattleStruct->turnSideTracker];
if (gWishFutureKnock.wishCounter[gActiveBank] != 0
&& --gWishFutureKnock.wishCounter[gActiveBank] == 0
&& gBattleMons[gActiveBank].hp != 0)
@@ -649,7 +649,7 @@ u8 TurnBasedEffects(void)
gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20);
while (gBattleStruct->turnEffectsBank < gNoOfAllBanks && gBattleStruct->turnEffectsTracker <= TURNBASED_MAX_CASE)
{
- gActiveBank = gBankAttacker = gTurnOrder[gBattleStruct->turnEffectsBank];
+ gActiveBank = gBankAttacker = gBanksByTurnOrder[gBattleStruct->turnEffectsBank];
if (gAbsentBankFlags & gBitTable[gActiveBank])
{
gBattleStruct->turnEffectsBank++;
@@ -1018,7 +1018,7 @@ bool8 sub_8041364(void)
case 1:
while (gBattleStruct->field_1A1 < gNoOfAllBanks)
{
- gActiveBank = gBankAttacker = gTurnOrder[gBattleStruct->field_1A1];
+ gActiveBank = gBankAttacker = gBanksByTurnOrder[gBattleStruct->field_1A1];
if (gAbsentBankFlags & gBitTable[gActiveBank])
{
gBattleStruct->field_1A1++;
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index 88c62841d..380f9ec40 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -47,8 +47,8 @@ extern u8 gActiveBank;
extern u32 gBattleExecBuffer;
extern u8 gNoOfAllBanks;
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
-extern u8 gTurnOrder[BATTLE_BANKS_COUNT];
-extern u8 gUnknown_0202407A[BATTLE_BANKS_COUNT];
+extern u8 gBanksByTurnOrder[BATTLE_BANKS_COUNT];
+extern u8 gActionsByTurnOrder[BATTLE_BANKS_COUNT];
extern u16 gCurrentMove;
extern u8 gLastUsedAbility;
extern u16 gBattleWeather;
@@ -331,7 +331,7 @@ static void atk40_jump_if_move_affected_by_protect(void);
static void atk41_call(void);
static void atk42_jumpiftype2(void);
static void atk43_jumpifabilitypresent(void);
-static void atk44(void);
+static void atk44_end_selection_script(void);
static void atk45_playanimation(void);
static void atk46_playanimation2(void);
static void atk47_setgraphicalstatchangevalues(void);
@@ -583,7 +583,7 @@ void (* const gBattleScriptingCommandsTable[])(void) =
atk41_call,
atk42_jumpiftype2,
atk43_jumpifabilitypresent,
- atk44,
+ atk44_end_selection_script,
atk45_playanimation,
atk46_playanimation2,
atk47_setgraphicalstatchangevalues,
@@ -1151,11 +1151,11 @@ static void atk00_attackcanceler(void)
for (i = 0; i < gNoOfAllBanks; i++)
{
- if ((gProtectStructs[gTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED)
+ if ((gProtectStructs[gBanksByTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED)
{
- PressurePPLose(gBankAttacker, gTurnOrder[i], MOVE_SNATCH);
- gProtectStructs[gTurnOrder[i]].stealMove = 0;
- gBattleScripting.bank = gTurnOrder[i];
+ PressurePPLose(gBankAttacker, gBanksByTurnOrder[i], MOVE_SNATCH);
+ gProtectStructs[gBanksByTurnOrder[i]].stealMove = 0;
+ gBattleScripting.bank = gBanksByTurnOrder[i];
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SnatchedMove;
return;
@@ -2378,7 +2378,7 @@ u8 BankGetTurnOrder(u8 bank)
s32 i;
for (i = 0; i < gNoOfAllBanks; i++)
{
- if (gTurnOrder[i] == bank)
+ if (gBanksByTurnOrder[i] == bank)
break;
}
return i;
@@ -4462,9 +4462,9 @@ static void atk43_jumpifabilitypresent(void)
gBattlescriptCurrInstr += 6;
}
-static void atk44(void)
+static void atk44_end_selection_script(void)
{
- *(gBankAttacker + gBattleStruct->field_54) = 1;
+ *(gBankAttacker + gBattleStruct->selectionScriptFinished) = TRUE;
}
static void atk45_playanimation(void)
@@ -5903,15 +5903,15 @@ static void atk51_switch_handle_order(void)
gBattleCommunication[0] = gBattleBufferB[gActiveBank][1];
*(gBattleStruct->field_5C + gActiveBank) = gBattleBufferB[gActiveBank][1];
- if ((gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_LINK)) == (BATTLE_TYPE_MULTI | BATTLE_TYPE_LINK))
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
*(gActiveBank * 3 + (u8*)(gBattleStruct->field_60) + 0) &= 0xF;
*(gActiveBank * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBank][2] & 0xF0);
*(gActiveBank * 3 + (u8*)(gBattleStruct->field_60) + 1) = gBattleBufferB[gActiveBank][3];
- *((gActiveBank ^ 2) * 3 + (u8*)(gBattleStruct->field_60) + 0) &= (0xF0);
- *((gActiveBank ^ 2) * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBank][2] & 0xF0) >> 4;
- *((gActiveBank ^ 2) * 3 + (u8*)(gBattleStruct->field_60) + 2) = gBattleBufferB[gActiveBank][3];
+ *((gActiveBank ^ BIT_MON) * 3 + (u8*)(gBattleStruct->field_60) + 0) &= (0xF0);
+ *((gActiveBank ^ BIT_MON) * 3 + (u8*)(gBattleStruct->field_60) + 0) |= (gBattleBufferB[gActiveBank][2] & 0xF0) >> 4;
+ *((gActiveBank ^ BIT_MON) * 3 + (u8*)(gBattleStruct->field_60) + 2) = gBattleBufferB[gActiveBank][3];
}
else if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
{
@@ -5983,8 +5983,8 @@ static void atk52_switch_in_effects(void)
for (i = 0; i < gNoOfAllBanks; i++)
{
- if (gTurnOrder[i] == gActiveBank)
- gUnknown_0202407A[i] = 0xC;
+ if (gBanksByTurnOrder[i] == gActiveBank)
+ gActionsByTurnOrder[i] = ACTION_CANCEL_PARTNER;
}
for (i = 0; i < gNoOfAllBanks; i++)
@@ -6569,7 +6569,7 @@ static void atk68_80246A0(void)
s32 i;
for (i = 0; i < gNoOfAllBanks; i++)
- gUnknown_0202407A[i] = 0xC;
+ gActionsByTurnOrder[i] = ACTION_CANCEL_PARTNER;
gBattlescriptCurrInstr++;
}
@@ -9710,8 +9710,8 @@ static void atkBA_jumpifnopursuitswitchdmg(void)
for (i = 0; i < gNoOfAllBanks; i++)
{
- if (gTurnOrder[i] == gBankTarget)
- gUnknown_0202407A[i] = 11;
+ if (gBanksByTurnOrder[i] == gBankTarget)
+ gActionsByTurnOrder[i] = 11;
}
gCurrentMove = MOVE_PURSUIT;
@@ -10942,7 +10942,7 @@ static void atkEC_pursuit_sth(void)
&& gActionForBanks[gActiveBank] == 0
&& gChosenMovesByBanks[gActiveBank] == MOVE_PURSUIT)
{
- gUnknown_0202407A[gActiveBank] = 11;
+ gActionsByTurnOrder[gActiveBank] = 11;
gCurrentMove = MOVE_PURSUIT;
gBattlescriptCurrInstr += 5;
gBattleScripting.animTurn = 1;
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 7de63abce..c50d8f030 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -304,10 +304,10 @@ gBattlePartyID: @ 202406E
gBanksBySide: @ 2024076
.space 0x4
-gUnknown_0202407A: @ 202407A
+gActionsByTurnOrder: @ 202407A
.space 0x4
-gTurnOrder: @ 202407E
+gBanksByTurnOrder: @ 202407E
.space 0x4
gCurrentMoveTurn: @ 2024082