diff options
author | DizzyEggg <jajkodizzy@wp.pl> | 2017-10-04 19:25:14 +0200 |
---|---|---|
committer | DizzyEggg <jajkodizzy@wp.pl> | 2017-10-04 19:25:14 +0200 |
commit | d87d19cfe5903f5fabb0de37d2c46ef84a83c168 (patch) | |
tree | c4b8ef876206ff265a0f328eab7d860d23bb9a59 | |
parent | aaa191f0d85e4a6c82a037b471a67cddb4da2c06 (diff) |
more battle2 done
-rw-r--r-- | asm/battle_2.s | 977 | ||||
-rw-r--r-- | include/battle.h | 25 | ||||
-rw-r--r-- | include/pokemon.h | 2 | ||||
-rw-r--r-- | src/battle_2.c | 511 | ||||
-rw-r--r-- | src/battle_3.c | 14 | ||||
-rw-r--r-- | src/battle_script_commands.c | 42 | ||||
-rw-r--r-- | sym_ewram.txt | 4 |
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 |