diff options
author | jiangzhengwenjz <jiangzhengwenjzw@qq.com> | 2019-08-03 23:59:41 +0800 |
---|---|---|
committer | jiangzhengwenjz <jiangzhengwenjzw@qq.com> | 2019-08-03 23:59:41 +0800 |
commit | 5568895b043dc37e95be0e99787541d78a7c6fee (patch) | |
tree | 719b85960d6e9c7b8add6a141fa503925290a5c9 | |
parent | 8fed9a5f205cec0d86149a908d64f73316cbb1f4 (diff) |
ported battle_ai_switch_items from pokeem
-rw-r--r-- | asm/battle_2.s | 28 | ||||
-rw-r--r-- | asm/battle_ai_switch_items.s | 2654 | ||||
-rw-r--r-- | asm/battle_script_commands.s | 88 | ||||
-rw-r--r-- | data/data.s | 2 | ||||
-rw-r--r-- | include/battle.h | 5 | ||||
-rw-r--r-- | include/battle_2.h | 2 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/battle_ai_switch_items.c | 734 | ||||
-rw-r--r-- | src/battle_controller_opponent.c | 2 | ||||
-rw-r--r-- | sym_ewram.txt | 4 |
10 files changed, 801 insertions, 2720 deletions
diff --git a/asm/battle_2.s b/asm/battle_2.s index d4fb29c16..114aeebd7 100644 --- a/asm/battle_2.s +++ b/asm/battle_2.s @@ -4847,7 +4847,7 @@ sub_8012434: @ 8012434 mov r10, r0 ldr r1, _080126D0 @ =gUnknown_2023DA8 mov r12, r1 - ldr r0, _080126D4 @ =gUnknown_2023DA0 + ldr r0, _080126D4 @ =gLastLandedMoves mov r9, r0 ldr r1, _080126D8 @ =gLastMoves mov r8, r1 @@ -4879,7 +4879,7 @@ _0801246C: strh r3, [r0] mov r1, r10 strh r3, [r1] - ldr r0, _080126F0 @ =gUnknown_2023DC0 + ldr r0, _080126F0 @ =gLastHitBy adds r1, r2, r0 movs r0, 0xFF strb r0, [r1] @@ -5173,14 +5173,14 @@ _080126AE: .align 2, 0 _080126CC: .4byte gUnknown_2023DB0 _080126D0: .4byte gUnknown_2023DA8 -_080126D4: .4byte gUnknown_2023DA0 +_080126D4: .4byte gLastLandedMoves _080126D8: .4byte gLastMoves _080126DC: .4byte gDisableStructs _080126E0: .4byte gUnknown_2023D90 _080126E4: .4byte gUnknown_2023DB8 _080126E8: .4byte gStatuses3 _080126EC: .4byte gUnknown_2023DD4 -_080126F0: .4byte gUnknown_2023DC0 +_080126F0: .4byte gLastHitBy _080126F4: .4byte gBattleResources _080126F8: .4byte gSideTimers _080126FC: .4byte gSideStatuses @@ -5585,7 +5585,7 @@ _08012A1A: strh r2, [r0] ldrb r0, [r1] lsls r0, 1 - ldr r6, _08012BB0 @ =gUnknown_2023DA0 + ldr r6, _08012BB0 @ =gLastLandedMoves adds r0, r6 strh r2, [r0] ldrb r0, [r1] @@ -5606,7 +5606,7 @@ _08012A1A: strh r2, [r0] mov r1, r12 ldrb r0, [r1] - ldr r2, _08012BC0 @ =gUnknown_2023DC0 + ldr r2, _08012BC0 @ =gLastHitBy adds r0, r2 movs r1, 0xFF strb r1, [r0] @@ -5758,11 +5758,11 @@ _08012BA0: .4byte gCurrentMove _08012BA4: .4byte gBattleMoves _08012BA8: .4byte gMoveResultFlags _08012BAC: .4byte gLastMoves -_08012BB0: .4byte gUnknown_2023DA0 +_08012BB0: .4byte gLastLandedMoves _08012BB4: .4byte gUnknown_2023DA8 _08012BB8: .4byte gUnknown_2023DB0 _08012BBC: .4byte gUnknown_2023D90 -_08012BC0: .4byte gUnknown_2023DC0 +_08012BC0: .4byte gLastHitBy _08012BC4: .4byte gBattleResources thumb_func_end sub_8012760 @@ -6053,7 +6053,7 @@ _08012CA8: strh r2, [r0] ldrb r0, [r7] lsls r0, 1 - ldr r1, _08012F90 @ =gUnknown_2023DA0 + ldr r1, _08012F90 @ =gLastLandedMoves adds r0, r1 strh r2, [r0] ldrb r0, [r7] @@ -6072,7 +6072,7 @@ _08012CA8: adds r0, r1 strh r2, [r0] ldrb r0, [r7] - ldr r2, _08012FA0 @ =gUnknown_2023DC0 + ldr r2, _08012FA0 @ =gLastHitBy adds r0, r2 movs r1, 0xFF strb r1, [r0] @@ -6250,11 +6250,11 @@ _08012F80: .4byte 0xfbffffff _08012F84: .4byte gBattleStruct _08012F88: .4byte 0xffff1fff _08012F8C: .4byte gLastMoves -_08012F90: .4byte gUnknown_2023DA0 +_08012F90: .4byte gLastLandedMoves _08012F94: .4byte gUnknown_2023DA8 _08012F98: .4byte gUnknown_2023DB0 _08012F9C: .4byte gUnknown_2023D90 -_08012FA0: .4byte gUnknown_2023DC0 +_08012FA0: .4byte gLastHitBy _08012FA4: .4byte gBattleResources _08012FA8: .4byte gBaseStats thumb_func_end sub_8012BC8 @@ -13836,7 +13836,7 @@ HandleAction_ActionFinished: @ 8016D70 ldr r5, _08016E04 @ =gBattleScripting strb r1, [r5, 0x18] strb r1, [r5, 0x19] - ldr r2, _08016E08 @ =gUnknown_2023DA0 + ldr r2, _08016E08 @ =gLastLandedMoves ldr r3, _08016E0C @ =gBattlerAttacker ldrb r0, [r3] lsls r0, 1 @@ -13875,7 +13875,7 @@ _08016DF8: .4byte gCurrentMove _08016DFC: .4byte gBattleMoveDamage _08016E00: .4byte gMoveResultFlags _08016E04: .4byte gBattleScripting -_08016E08: .4byte gUnknown_2023DA0 +_08016E08: .4byte gLastLandedMoves _08016E0C: .4byte gBattlerAttacker _08016E10: .4byte gUnknown_2023DA8 _08016E14: .4byte gBattleStruct diff --git a/asm/battle_ai_switch_items.s b/asm/battle_ai_switch_items.s deleted file mode 100644 index 58acf73c2..000000000 --- a/asm/battle_ai_switch_items.s +++ /dev/null @@ -1,2654 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start ShouldSwitchIfPerishSong -ShouldSwitchIfPerishSong: @ 8039188 - push {lr} - ldr r1, _080391D4 @ =gStatuses3 - ldr r0, _080391D8 @ =gActiveBattler - ldrb r2, [r0] - lsls r0, r2, 2 - adds r0, r1 - ldr r0, [r0] - movs r1, 0x20 - ands r0, r1 - cmp r0, 0 - beq _080391E4 - ldr r0, _080391DC @ =gDisableStructs - lsls r1, r2, 3 - subs r1, r2 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0xF] - lsls r0, 28 - cmp r0, 0 - bne _080391E4 - adds r0, r2, 0 - bl GetBattlerPosition - lsls r0, 24 - lsrs r0, 25 - ldr r1, _080391E0 @ =gBattleStruct - ldr r1, [r1] - adds r0, r1 - adds r0, 0x92 - movs r1, 0x6 - strb r1, [r0] - movs r0, 0x1 - movs r1, 0x2 - movs r2, 0 - bl BtlController_EmitTwoReturnValues - movs r0, 0x1 - b _080391E6 - .align 2, 0 -_080391D4: .4byte gStatuses3 -_080391D8: .4byte gActiveBattler -_080391DC: .4byte gDisableStructs -_080391E0: .4byte gBattleStruct -_080391E4: - movs r0, 0 -_080391E6: - pop {r1} - bx r1 - thumb_func_end ShouldSwitchIfPerishSong - - thumb_func_start sub_80391EC -sub_80391EC: @ 80391EC - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - ldr r0, _08039204 @ =gBattleTypeFlags - ldr r0, [r0] - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08039234 - b _0803935C - .align 2, 0 -_08039204: .4byte gBattleTypeFlags -_08039208: - ldr r0, _0803922C @ =gActiveBattler - ldrb r0, [r0] - bl GetBattlerPosition - lsls r0, 24 - lsrs r0, 25 - ldr r1, _08039230 @ =gBattleStruct - ldr r1, [r1] - adds r0, r1 - adds r0, 0x92 - strb r6, [r0] - movs r0, 0x1 - movs r1, 0x2 - movs r2, 0 - bl BtlController_EmitTwoReturnValues - movs r0, 0x1 - b _0803935E - .align 2, 0 -_0803922C: .4byte gActiveBattler -_08039230: .4byte gBattleStruct -_08039234: - ldr r4, _0803936C @ =gBattleMons - movs r0, 0 - bl GetBattlerAtPosition - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x58 - muls r0, r1 - adds r0, r4 - adds r0, 0x20 - ldrb r0, [r0] - cmp r0, 0x19 - beq _08039250 - b _0803935C -_08039250: - movs r0, 0 - bl GetBattlerAtPosition - lsls r0, 24 - lsrs r2, r0, 24 - movs r6, 0 - adds r7, r4, 0 - movs r5, 0x58 - adds r0, r2, 0 - muls r0, r5 - adds r4, r0, r7 - movs r0, 0x20 - adds r0, r4 - mov r8, r0 -_0803926C: - lsls r1, r6, 1 - ldr r0, _08039370 @ =gActiveBattler - ldrb r0, [r0] - muls r0, r5 - adds r1, r0 - adds r0, r7, 0 - adds r0, 0xC - adds r1, r0 - ldrh r0, [r1] - cmp r0, 0 - beq _08039298 - ldrh r1, [r4] - mov r3, r8 - ldrb r2, [r3] - bl AI_TypeCalc - lsls r0, 24 - lsrs r1, r0, 24 - movs r0, 0x2 - ands r1, r0 - cmp r1, 0 - bne _0803935C -_08039298: - adds r6, 0x1 - cmp r6, 0x3 - ble _0803926C - movs r6, 0 - ldr r0, _08039374 @ =gEnemyParty - mov r9, r0 -_080392A4: - movs r0, 0x64 - adds r5, r6, 0 - muls r5, r0 - mov r3, r9 - adds r4, r5, r3 - adds r0, r4, 0 - movs r1, 0x39 - bl GetMonData - cmp r0, 0 - beq _08039356 - adds r0, r4, 0 - movs r1, 0x41 - bl GetMonData - cmp r0, 0 - beq _08039356 - adds r0, r4, 0 - movs r1, 0x41 - bl GetMonData - movs r1, 0xCE - lsls r1, 1 - cmp r0, r1 - beq _08039356 - ldr r1, _08039378 @ =gBattlerPartyIndexes - ldr r0, _08039370 @ =gActiveBattler - ldrb r0, [r0] - lsls r0, 1 - adds r0, r1 - ldrh r0, [r0] - cmp r6, r0 - beq _08039356 - adds r0, r4, 0 - movs r1, 0xB - bl GetMonData - adds r0, r4, 0 - movs r1, 0x2E - bl GetMonData - movs r0, 0 - bl GetBattlerAtPosition - lsls r0, 24 - lsrs r2, r0, 24 - movs r4, 0 - mov r8, r5 - ldr r1, _0803936C @ =gBattleMons - movs r0, 0x58 - muls r0, r2 - adds r5, r0, r1 - adds r7, r5, 0 - adds r7, 0x20 -_08039310: - adds r1, r4, 0 - adds r1, 0xD - mov r0, r8 - add r0, r9 - bl GetMonData - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0 - beq _08039350 - ldrh r1, [r5] - ldrb r2, [r7] - bl AI_TypeCalc - lsls r0, 24 - lsrs r1, r0, 24 - movs r0, 0x2 - ands r1, r0 - cmp r1, 0 - beq _08039350 - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x3 - bl __umodsi3 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1 - bhi _08039350 - b _08039208 -_08039350: - adds r4, 0x1 - cmp r4, 0x3 - ble _08039310 -_08039356: - adds r6, 0x1 - cmp r6, 0x5 - ble _080392A4 -_0803935C: - movs r0, 0 -_0803935E: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0803936C: .4byte gBattleMons -_08039370: .4byte gActiveBattler -_08039374: .4byte gEnemyParty -_08039378: .4byte gBattlerPartyIndexes - thumb_func_end sub_80391EC - - thumb_func_start sub_803937C -sub_803937C: @ 803937C - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - movs r0, 0x1 - bl ai_has_super_effective_move_on_field - lsls r0, 24 - cmp r0, 0 - beq _080393A8 - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x3 - bl __umodsi3 - lsls r0, 16 - cmp r0, 0 - beq _080393A8 - b _08039588 -_080393A8: - ldr r1, _08039410 @ =gUnknown_2023DA0 - ldr r5, _08039414 @ =gActiveBattler - ldrb r3, [r5] - lsls r0, r3, 1 - adds r4, r0, r1 - ldrh r1, [r4] - cmp r1, 0 - bne _080393BA - b _08039588 -_080393BA: - ldr r0, _08039418 @ =0x0000ffff - cmp r1, r0 - bne _080393C2 - b _08039588 -_080393C2: - ldr r2, _0803941C @ =gBattleMoves - ldrh r1, [r4] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0, 0x1] - cmp r0, 0 - bne _080393D6 - b _08039588 -_080393D6: - ldr r0, _08039420 @ =gBattleTypeFlags - ldr r0, [r0] - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08039442 - mov r8, r3 - mov r0, r8 - bl GetBattlerPosition - movs r4, 0x2 - eors r0, r4 - lsls r0, 24 - lsrs r0, 24 - bl GetBattlerAtPosition - ldr r1, _08039424 @ =gAbsentBattlerFlags - ldrb r1, [r1] - ldr r2, _08039428 @ =gBitTable - lsls r0, 24 - lsrs r0, 22 - adds r0, r2 - ldr r0, [r0] - ands r1, r0 - cmp r1, 0 - beq _0803942C - ldrb r7, [r5] - b _08039446 - .align 2, 0 -_08039410: .4byte gUnknown_2023DA0 -_08039414: .4byte gActiveBattler -_08039418: .4byte 0x0000ffff -_0803941C: .4byte gBattleMoves -_08039420: .4byte gBattleTypeFlags -_08039424: .4byte gAbsentBattlerFlags -_08039428: .4byte gBitTable -_0803942C: - ldrb r0, [r5] - bl GetBattlerPosition - eors r0, r4 - lsls r0, 24 - lsrs r0, 24 - bl GetBattlerAtPosition - lsls r0, 24 - lsrs r7, r0, 24 - b _08039446 -_08039442: - adds r7, r3, 0 - mov r8, r7 -_08039446: - ldr r3, _08039468 @ =gBattleMoves - ldr r1, _0803946C @ =gUnknown_2023DA0 - ldr r2, _08039470 @ =gActiveBattler - ldrb r0, [r2] - lsls r0, 1 - adds r0, r1 - ldrh r1, [r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - adds r0, r3 - ldrb r0, [r0, 0x2] - adds r1, r2, 0 - cmp r0, 0xA - bne _08039474 - movs r0, 0x12 - b _08039486 - .align 2, 0 -_08039468: .4byte gBattleMoves -_0803946C: .4byte gUnknown_2023DA0 -_08039470: .4byte gActiveBattler -_08039474: - cmp r0, 0xB - bne _0803947E - movs r2, 0xB - mov r10, r2 - b _08039488 -_0803947E: - cmp r0, 0xD - beq _08039484 - b _08039588 -_08039484: - movs r0, 0xA -_08039486: - mov r10, r0 -_08039488: - ldr r2, _0803949C @ =gBattleMons - ldrb r1, [r1] - movs r0, 0x58 - muls r0, r1 - adds r0, r2 - adds r0, 0x20 - ldrb r0, [r0] - cmp r0, r10 - bne _080394CC - b _08039588 - .align 2, 0 -_0803949C: .4byte gBattleMons -_080394A0: - ldr r0, _080394C4 @ =gActiveBattler - ldrb r0, [r0] - bl GetBattlerPosition - lsls r0, 24 - lsrs r0, 25 - ldr r1, _080394C8 @ =gBattleStruct - ldr r1, [r1] - adds r0, r1 - adds r0, 0x92 - strb r6, [r0] - movs r0, 0x1 - movs r1, 0x2 - movs r2, 0 - bl BtlController_EmitTwoReturnValues - movs r0, 0x1 - b _0803958A - .align 2, 0 -_080394C4: .4byte gActiveBattler -_080394C8: .4byte gBattleStruct -_080394CC: - movs r6, 0 - ldr r2, _08039558 @ =gBaseStats - mov r9, r2 -_080394D2: - movs r0, 0x64 - adds r1, r6, 0 - muls r1, r0 - ldr r0, _0803955C @ =gEnemyParty - adds r5, r1, r0 - adds r0, r5, 0 - movs r1, 0x39 - bl GetMonData - cmp r0, 0 - beq _08039582 - adds r0, r5, 0 - movs r1, 0x41 - bl GetMonData - cmp r0, 0 - beq _08039582 - adds r0, r5, 0 - movs r1, 0x41 - bl GetMonData - movs r1, 0xCE - lsls r1, 1 - cmp r0, r1 - beq _08039582 - ldr r1, _08039560 @ =gBattlerPartyIndexes - mov r2, r8 - lsls r0, r2, 1 - adds r0, r1 - ldrh r0, [r0] - cmp r6, r0 - beq _08039582 - lsls r0, r7, 1 - adds r0, r1 - ldrh r0, [r0] - cmp r6, r0 - beq _08039582 - ldr r0, _08039564 @ =gBattleStruct - ldr r1, [r0] - adds r0, r2, r1 - adds r0, 0x5C - ldrb r0, [r0] - cmp r6, r0 - beq _08039582 - adds r0, r7, r1 - adds r0, 0x5C - ldrb r0, [r0] - cmp r6, r0 - beq _08039582 - adds r0, r5, 0 - movs r1, 0xB - bl GetMonData - lsls r0, 16 - lsrs r4, r0, 16 - adds r0, r5, 0 - movs r1, 0x2E - bl GetMonData - cmp r0, 0 - beq _08039568 - lsls r0, r4, 3 - subs r0, r4 - lsls r0, 2 - add r0, r9 - ldrb r0, [r0, 0x17] - b _08039572 - .align 2, 0 -_08039558: .4byte gBaseStats -_0803955C: .4byte gEnemyParty -_08039560: .4byte gBattlerPartyIndexes -_08039564: .4byte gBattleStruct -_08039568: - lsls r0, r4, 3 - subs r0, r4 - lsls r0, 2 - add r0, r9 - ldrb r0, [r0, 0x16] -_08039572: - cmp r10, r0 - bne _08039582 - bl Random - movs r1, 0x1 - ands r1, r0 - cmp r1, 0 - bne _080394A0 -_08039582: - adds r6, 0x1 - cmp r6, 0x5 - ble _080394D2 -_08039588: - movs r0, 0 -_0803958A: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_803937C - - thumb_func_start sub_8039598 -sub_8039598: @ 8039598 - push {r4,r5,lr} - ldr r3, _080395F0 @ =gBattleMons - ldr r5, _080395F4 @ =gActiveBattler - ldrb r4, [r5] - movs r0, 0x58 - adds r2, r4, 0 - muls r2, r0 - adds r0, r3, 0 - adds r0, 0x4C - adds r0, r2, r0 - ldr r0, [r0] - movs r1, 0x7 - ands r0, r1 - cmp r0, 0 - beq _08039660 - adds r1, r2, r3 - adds r0, r1, 0 - adds r0, 0x20 - ldrb r0, [r0] - cmp r0, 0x1E - bne _08039660 - ldrh r0, [r1, 0x2C] - ldrh r1, [r1, 0x28] - lsrs r0, 1 - cmp r1, r0 - bcc _08039660 - ldr r1, _080395F8 @ =gUnknown_2023DA0 - lsls r0, r4, 1 - adds r0, r1 - ldrh r1, [r0] - cmp r1, 0 - beq _080395DE - ldr r0, _080395FC @ =0x0000ffff - cmp r1, r0 - bne _08039600 -_080395DE: - bl Random - movs r1, 0x1 - ands r1, r0 - cmp r1, 0 - beq _08039600 - ldrb r0, [r5] - b _08039668 - .align 2, 0 -_080395F0: .4byte gBattleMons -_080395F4: .4byte gActiveBattler -_080395F8: .4byte gUnknown_2023DA0 -_080395FC: .4byte 0x0000ffff -_08039600: - ldr r2, _0803962C @ =gBattleMoves - ldr r1, _08039630 @ =gUnknown_2023DA0 - ldr r4, _08039634 @ =gActiveBattler - ldrb r0, [r4] - lsls r0, 1 - adds r0, r1 - ldrh r1, [r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0, 0x1] - cmp r0, 0 - bne _08039638 - bl Random - movs r1, 0x1 - ands r1, r0 - cmp r1, 0 - beq _08039638 - ldrb r0, [r4] - b _08039668 - .align 2, 0 -_0803962C: .4byte gBattleMoves -_08039630: .4byte gUnknown_2023DA0 -_08039634: .4byte gActiveBattler -_08039638: - movs r0, 0x8 - movs r1, 0x1 - bl sub_8039828 - lsls r0, 24 - cmp r0, 0 - bne _08039686 - movs r0, 0x4 - movs r1, 0x1 - bl sub_8039828 - lsls r0, 24 - cmp r0, 0 - bne _08039686 - bl Random - movs r1, 0x1 - ands r1, r0 - cmp r1, 0 - bne _08039664 -_08039660: - movs r0, 0 - b _08039688 -_08039664: - ldr r0, _08039690 @ =gActiveBattler - ldrb r0, [r0] -_08039668: - bl GetBattlerPosition - lsls r0, 24 - lsrs r0, 25 - ldr r1, _08039694 @ =gBattleStruct - ldr r1, [r1] - adds r0, r1 - adds r0, 0x92 - movs r1, 0x6 - strb r1, [r0] - movs r0, 0x1 - movs r1, 0x2 - movs r2, 0 - bl BtlController_EmitTwoReturnValues -_08039686: - movs r0, 0x1 -_08039688: - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_08039690: .4byte gActiveBattler -_08039694: .4byte gBattleStruct - thumb_func_end sub_8039598 - - thumb_func_start ai_has_super_effective_move_on_field -ai_has_super_effective_move_on_field: @ 8039698 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - movs r0, 0 - bl GetBattlerAtPosition - lsls r0, 24 - lsrs r3, r0, 24 - ldr r0, _08039730 @ =gAbsentBattlerFlags - ldrb r1, [r0] - ldr r2, _08039734 @ =gBitTable - lsls r0, r3, 2 - adds r0, r2 - ldr r0, [r0] - ands r1, r0 - cmp r1, 0 - bne _08039720 - movs r4, 0 - ldr r6, _08039738 @ =gBattleMons - movs r7, 0x58 - adds r0, r3, 0 - muls r0, r7 - adds r5, r0, r6 - movs r0, 0x20 - adds r0, r5 - mov r9, r0 -_080396D4: - lsls r1, r4, 1 - ldr r0, _0803973C @ =gActiveBattler - ldrb r0, [r0] - muls r0, r7 - adds r1, r0 - adds r0, r6, 0 - adds r0, 0xC - adds r1, r0 - ldrh r0, [r1] - cmp r0, 0 - beq _0803971A - ldrh r1, [r5] - mov r3, r9 - ldrb r2, [r3] - bl AI_TypeCalc - lsls r0, 24 - lsrs r1, r0, 24 - movs r0, 0x2 - ands r1, r0 - cmp r1, 0 - beq _0803971A - mov r0, r8 - cmp r0, 0 - bne _08039744 - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0xA - bl __umodsi3 - lsls r0, 16 - cmp r0, 0 - bne _08039744 -_0803971A: - adds r4, 0x1 - cmp r4, 0x3 - ble _080396D4 -_08039720: - ldr r0, _08039740 @ =gBattleTypeFlags - ldr r0, [r0] - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08039748 - b _080397C2 - .align 2, 0 -_08039730: .4byte gAbsentBattlerFlags -_08039734: .4byte gBitTable -_08039738: .4byte gBattleMons -_0803973C: .4byte gActiveBattler -_08039740: .4byte gBattleTypeFlags -_08039744: - movs r0, 0x1 - b _080397C4 -_08039748: - movs r0, 0x2 - bl GetBattlerAtPosition - lsls r0, 24 - lsrs r3, r0, 24 - ldr r0, _080397D0 @ =gAbsentBattlerFlags - ldrb r1, [r0] - ldr r2, _080397D4 @ =gBitTable - lsls r0, r3, 2 - adds r0, r2 - ldr r0, [r0] - ands r1, r0 - cmp r1, 0 - bne _080397C2 - movs r4, 0 - ldr r6, _080397D8 @ =gBattleMons - movs r7, 0x58 - adds r0, r3, 0 - muls r0, r7 - adds r5, r0, r6 - movs r3, 0x20 - adds r3, r5 - mov r9, r3 -_08039776: - lsls r1, r4, 1 - ldr r0, _080397DC @ =gActiveBattler - ldrb r0, [r0] - muls r0, r7 - adds r1, r0 - adds r0, r6, 0 - adds r0, 0xC - adds r1, r0 - ldrh r0, [r1] - cmp r0, 0 - beq _080397BC - ldrh r1, [r5] - mov r3, r9 - ldrb r2, [r3] - bl AI_TypeCalc - lsls r0, 24 - lsrs r1, r0, 24 - movs r0, 0x2 - ands r1, r0 - cmp r1, 0 - beq _080397BC - mov r0, r8 - cmp r0, 0 - bne _08039744 - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0xA - bl __umodsi3 - lsls r0, 16 - cmp r0, 0 - bne _08039744 -_080397BC: - adds r4, 0x1 - cmp r4, 0x3 - ble _08039776 -_080397C2: - movs r0, 0 -_080397C4: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080397D0: .4byte gAbsentBattlerFlags -_080397D4: .4byte gBitTable -_080397D8: .4byte gBattleMons -_080397DC: .4byte gActiveBattler - thumb_func_end ai_has_super_effective_move_on_field - - thumb_func_start AI_AreStatsRaised -AI_AreStatsRaised: @ 80397E0 - push {r4,lr} - movs r4, 0 - ldr r1, _08039820 @ =gBattleMons - ldr r0, _08039824 @ =gActiveBattler - ldrb r2, [r0] - movs r0, 0x58 - muls r0, r2 - adds r1, 0x18 - adds r2, r0, r1 - movs r3, 0x7 -_080397F4: - ldrb r1, [r2] - movs r0, 0 - ldrsb r0, [r2, r0] - cmp r0, 0x6 - ble _0803980A - subs r1, 0x6 - lsls r0, r4, 24 - asrs r0, 24 - adds r0, r1 - lsls r0, 24 - lsrs r4, r0, 24 -_0803980A: - adds r2, 0x1 - subs r3, 0x1 - cmp r3, 0 - bge _080397F4 - movs r0, 0 - cmp r4, 0x3 - bls _0803981A - movs r0, 0x1 -_0803981A: - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_08039820: .4byte gBattleMons -_08039824: .4byte gActiveBattler - thumb_func_end AI_AreStatsRaised - - thumb_func_start sub_8039828 -sub_8039828: @ 8039828 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp] - lsls r1, 24 - lsrs r1, 24 - str r1, [sp, 0x4] - ldr r1, _080398B4 @ =gUnknown_2023DA0 - ldr r5, _080398B8 @ =gActiveBattler - ldrb r3, [r5] - lsls r0, r3, 1 - adds r4, r0, r1 - ldrh r1, [r4] - cmp r1, 0 - bne _08039852 - b _08039A54 -_08039852: - ldr r0, _080398BC @ =0x0000ffff - cmp r1, r0 - bne _0803985A - b _08039A54 -_0803985A: - ldr r0, _080398C0 @ =gUnknown_2023DC0 - adds r0, r3, r0 - ldrb r0, [r0] - cmp r0, 0xFF - bne _08039866 - b _08039A54 -_08039866: - ldr r2, _080398C4 @ =gBattleMoves - ldrh r1, [r4] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0, 0x1] - cmp r0, 0 - bne _0803987A - b _08039A54 -_0803987A: - ldr r0, _080398C8 @ =gBattleTypeFlags - ldr r0, [r0] - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08039918 - mov r9, r3 - mov r0, r9 - bl GetBattlerPosition - movs r4, 0x2 - eors r0, r4 - lsls r0, 24 - lsrs r0, 24 - bl GetBattlerAtPosition - ldr r1, _080398CC @ =gAbsentBattlerFlags - ldrb r1, [r1] - ldr r2, _080398D0 @ =gBitTable - lsls r0, 24 - lsrs r0, 22 - adds r0, r2 - ldr r0, [r0] - ands r1, r0 - cmp r1, 0 - beq _080398D4 - ldrb r5, [r5] - mov r10, r5 - b _0803991C - .align 2, 0 -_080398B4: .4byte gUnknown_2023DA0 -_080398B8: .4byte gActiveBattler -_080398BC: .4byte 0x0000ffff -_080398C0: .4byte gUnknown_2023DC0 -_080398C4: .4byte gBattleMoves -_080398C8: .4byte gBattleTypeFlags -_080398CC: .4byte gAbsentBattlerFlags -_080398D0: .4byte gBitTable -_080398D4: - ldrb r0, [r5] - bl GetBattlerPosition - eors r0, r4 - lsls r0, 24 - lsrs r0, 24 - bl GetBattlerAtPosition - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - b _0803991C -_080398EC: - ldr r0, _08039910 @ =gActiveBattler - ldrb r0, [r0] - bl GetBattlerPosition - lsls r0, 24 - lsrs r0, 25 - ldr r1, _08039914 @ =gBattleStruct - ldr r1, [r1] - adds r0, r1 - adds r0, 0x92 - strb r7, [r0] - movs r0, 0x1 - movs r1, 0x2 - movs r2, 0 - bl BtlController_EmitTwoReturnValues - movs r0, 0x1 - b _08039A56 - .align 2, 0 -_08039910: .4byte gActiveBattler -_08039914: .4byte gBattleStruct -_08039918: - mov r9, r3 - mov r10, r9 -_0803991C: - movs r7, 0 -_0803991E: - movs r0, 0x64 - adds r1, r7, 0 - muls r1, r0 - ldr r0, _080399B0 @ =gEnemyParty - adds r5, r1, r0 - adds r0, r5, 0 - movs r1, 0x39 - bl GetMonData - cmp r0, 0 - bne _08039936 - b _08039A4C -_08039936: - adds r0, r5, 0 - movs r1, 0x41 - bl GetMonData - cmp r0, 0 - bne _08039944 - b _08039A4C -_08039944: - adds r0, r5, 0 - movs r1, 0x41 - bl GetMonData - movs r1, 0xCE - lsls r1, 1 - cmp r0, r1 - beq _08039A4C - ldr r1, _080399B4 @ =gBattlerPartyIndexes - mov r2, r9 - lsls r0, r2, 1 - adds r0, r1 - ldrh r0, [r0] - cmp r7, r0 - beq _08039A4C - mov r2, r10 - lsls r0, r2, 1 - adds r0, r1 - ldrh r0, [r0] - cmp r7, r0 - beq _08039A4C - ldr r0, _080399B8 @ =gBattleStruct - ldr r1, [r0] - mov r2, r9 - adds r0, r2, r1 - adds r0, 0x5C - ldrb r0, [r0] - cmp r7, r0 - beq _08039A4C - mov r2, r10 - adds r0, r2, r1 - adds r0, 0x5C - ldrb r0, [r0] - cmp r7, r0 - beq _08039A4C - adds r0, r5, 0 - movs r1, 0xB - bl GetMonData - lsls r0, 16 - lsrs r4, r0, 16 - adds r0, r5, 0 - movs r1, 0x2E - bl GetMonData - cmp r0, 0 - beq _080399C0 - lsls r0, r4, 3 - subs r0, r4 - lsls r0, 2 - ldr r1, _080399BC @ =gBaseStats - adds r0, r1 - ldrb r2, [r0, 0x17] - b _080399CC - .align 2, 0 -_080399B0: .4byte gEnemyParty -_080399B4: .4byte gBattlerPartyIndexes -_080399B8: .4byte gBattleStruct -_080399BC: .4byte gBaseStats -_080399C0: - lsls r0, r4, 3 - subs r0, r4 - lsls r0, 2 - ldr r2, _08039A68 @ =gBaseStats - adds r0, r2 - ldrb r2, [r0, 0x16] -_080399CC: - ldr r1, _08039A6C @ =gUnknown_2023DA0 - ldr r5, _08039A70 @ =gActiveBattler - ldrb r0, [r5] - lsls r0, 1 - adds r0, r1 - ldrh r0, [r0] - adds r1, r4, 0 - bl AI_TypeCalc - ldr r1, [sp] - ands r1, r0 - cmp r1, 0 - beq _08039A4C - ldr r1, _08039A74 @ =gUnknown_2023DC0 - ldrb r0, [r5] - adds r0, r1 - ldrb r0, [r0] - mov r9, r0 - movs r4, 0 - movs r0, 0x64 - adds r1, r7, 0 - muls r1, r0 - mov r8, r1 - ldr r1, _08039A78 @ =gBattleMons - movs r0, 0x58 - mov r2, r9 - muls r2, r0 - adds r0, r2, 0 - adds r5, r0, r1 - adds r6, r5, 0 - adds r6, 0x20 -_08039A0A: - ldr r0, _08039A7C @ =gEnemyParty - adds r1, r4, 0 - adds r1, 0xD - add r0, r8 - bl GetMonData - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0 - beq _08039A46 - ldrh r1, [r5] - ldrb r2, [r6] - bl AI_TypeCalc - lsls r0, 24 - lsrs r1, r0, 24 - movs r0, 0x2 - ands r1, r0 - cmp r1, 0 - beq _08039A46 - bl Random - lsls r0, 16 - lsrs r0, 16 - ldr r1, [sp, 0x4] - bl __modsi3 - cmp r0, 0 - bne _08039A46 - b _080398EC -_08039A46: - adds r4, 0x1 - cmp r4, 0x3 - ble _08039A0A -_08039A4C: - adds r7, 0x1 - cmp r7, 0x5 - bgt _08039A54 - b _0803991E -_08039A54: - movs r0, 0 -_08039A56: - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08039A68: .4byte gBaseStats -_08039A6C: .4byte gUnknown_2023DA0 -_08039A70: .4byte gActiveBattler -_08039A74: .4byte gUnknown_2023DC0 -_08039A78: .4byte gBattleMons -_08039A7C: .4byte gEnemyParty - thumb_func_end sub_8039828 - - thumb_func_start sub_8039A80 -sub_8039A80: @ 8039A80 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - ldr r6, _08039B5C @ =gBattleMons - ldr r4, _08039B60 @ =gActiveBattler - ldrb r2, [r4] - movs r5, 0x58 - adds r0, r2, 0 - muls r0, r5 - adds r1, r6, 0 - adds r1, 0x50 - adds r0, r1 - ldr r0, [r0] - ldr r1, _08039B64 @ =0x0400e000 - ands r0, r1 - cmp r0, 0 - beq _08039AA6 - b _08039C74 -_08039AA6: - ldr r0, _08039B68 @ =gStatuses3 - lsls r1, r2, 2 - adds r1, r0 - ldr r1, [r1] - movs r0, 0x80 - lsls r0, 3 - ands r1, r0 - cmp r1, 0 - beq _08039ABA - b _08039C74 -_08039ABA: - str r1, [sp] - movs r0, 0xC - adds r1, r2, 0 - movs r2, 0x17 - movs r3, 0 - bl AbilityBattleEffects - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - beq _08039AD2 - b _08039C74 -_08039AD2: - ldrb r1, [r4] - str r0, [sp] - movs r0, 0xC - movs r2, 0x47 - movs r3, 0 - bl AbilityBattleEffects - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - beq _08039AEA - b _08039C74 -_08039AEA: - str r0, [sp] - movs r0, 0xE - movs r1, 0 - movs r2, 0x2A - movs r3, 0 - bl AbilityBattleEffects - lsls r0, 24 - cmp r0, 0 - beq _08039B1C - ldrb r0, [r4] - muls r0, r5 - adds r1, r0, r6 - adds r0, r1, 0 - adds r0, 0x21 - ldrb r0, [r0] - cmp r0, 0x8 - bne _08039B10 - b _08039C74 -_08039B10: - adds r0, r1, 0 - adds r0, 0x22 - ldrb r0, [r0] - cmp r0, 0x8 - bne _08039B1C - b _08039C74 -_08039B1C: - movs r0, 0 - mov r8, r0 - ldr r0, _08039B6C @ =gBattleTypeFlags - ldr r0, [r0] - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08039B8E - ldr r4, _08039B60 @ =gActiveBattler - ldrb r7, [r4] - adds r0, r7, 0 - bl GetBattlerPosition - movs r5, 0x2 - eors r0, r5 - lsls r0, 24 - lsrs r0, 24 - bl GetBattlerAtPosition - ldr r1, _08039B70 @ =gAbsentBattlerFlags - ldrb r1, [r1] - ldr r2, _08039B74 @ =gBitTable - lsls r0, 24 - lsrs r0, 22 - adds r0, r2 - ldr r0, [r0] - ands r1, r0 - cmp r1, 0 - beq _08039B78 - ldrb r6, [r4] - b _08039B94 - .align 2, 0 -_08039B5C: .4byte gBattleMons -_08039B60: .4byte gActiveBattler -_08039B64: .4byte 0x0400e000 -_08039B68: .4byte gStatuses3 -_08039B6C: .4byte gBattleTypeFlags -_08039B70: .4byte gAbsentBattlerFlags -_08039B74: .4byte gBitTable -_08039B78: - ldrb r0, [r4] - bl GetBattlerPosition - eors r0, r5 - lsls r0, 24 - lsrs r0, 24 - bl GetBattlerAtPosition - lsls r0, 24 - lsrs r6, r0, 24 - b _08039B94 -_08039B8E: - ldr r0, _08039C64 @ =gActiveBattler - ldrb r6, [r0] - adds r7, r6, 0 -_08039B94: - movs r5, 0 -_08039B96: - movs r0, 0x64 - adds r1, r5, 0 - muls r1, r0 - ldr r0, _08039C68 @ =gEnemyParty - adds r4, r1, r0 - adds r0, r4, 0 - movs r1, 0x39 - bl GetMonData - cmp r0, 0 - beq _08039BFA - adds r0, r4, 0 - movs r1, 0x41 - bl GetMonData - cmp r0, 0 - beq _08039BFA - adds r0, r4, 0 - movs r1, 0x41 - bl GetMonData - movs r1, 0xCE - lsls r1, 1 - cmp r0, r1 - beq _08039BFA - ldr r1, _08039C6C @ =gBattlerPartyIndexes - lsls r0, r7, 1 - adds r0, r1 - ldrh r0, [r0] - cmp r5, r0 - beq _08039BFA - lsls r0, r6, 1 - adds r0, r1 - ldrh r0, [r0] - cmp r5, r0 - beq _08039BFA - ldr r0, _08039C70 @ =gBattleStruct - ldr r1, [r0] - adds r0, r7, r1 - adds r0, 0x5C - ldrb r0, [r0] - cmp r5, r0 - beq _08039BFA - adds r0, r6, r1 - adds r0, 0x5C - ldrb r0, [r0] - cmp r5, r0 - beq _08039BFA - movs r0, 0x1 - add r8, r0 -_08039BFA: - adds r5, 0x1 - cmp r5, 0x5 - ble _08039B96 - mov r0, r8 - cmp r0, 0 - beq _08039C74 - bl ShouldSwitchIfPerishSong - lsls r0, 24 - cmp r0, 0 - bne _08039C60 - bl sub_80391EC - lsls r0, 24 - cmp r0, 0 - bne _08039C60 - bl sub_803937C - lsls r0, 24 - cmp r0, 0 - bne _08039C60 - bl sub_8039598 - lsls r0, 24 - cmp r0, 0 - bne _08039C60 - movs r0, 0 - bl ai_has_super_effective_move_on_field - lsls r0, 24 - cmp r0, 0 - bne _08039C74 - bl AI_AreStatsRaised - lsls r0, 24 - cmp r0, 0 - bne _08039C74 - movs r0, 0x8 - movs r1, 0x2 - bl sub_8039828 - lsls r0, 24 - cmp r0, 0 - bne _08039C60 - movs r0, 0x4 - movs r1, 0x3 - bl sub_8039828 - lsls r0, 24 - cmp r0, 0 - beq _08039C74 -_08039C60: - movs r0, 0x1 - b _08039C76 - .align 2, 0 -_08039C64: .4byte gActiveBattler -_08039C68: .4byte gEnemyParty -_08039C6C: .4byte gBattlerPartyIndexes -_08039C70: .4byte gBattleStruct -_08039C74: - movs r0, 0 -_08039C76: - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8039A80 - - thumb_func_start AI_TrySwitchOrUseItem -AI_TrySwitchOrUseItem: @ 8039C84 - push {r4-r6,lr} - ldr r5, _08039CDC @ =gBattleTypeFlags - ldr r0, [r5] - movs r1, 0x8 - ands r0, r1 - cmp r0, 0 - bne _08039C94 - b _08039D96 -_08039C94: - bl sub_8039A80 - lsls r0, 24 - cmp r0, 0 - beq _08039D8C - ldr r0, _08039CE0 @ =gActiveBattler - ldrb r0, [r0] - bl GetBattlerPosition - lsls r0, 24 - lsrs r0, 25 - ldr r1, _08039CE4 @ =gBattleStruct - ldr r1, [r1] - adds r0, r1 - adds r0, 0x92 - ldrb r0, [r0] - cmp r0, 0x6 - bne _08039D5A - bl GetMostSuitableMonToSwitchInto - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x6 - bne _08039D44 - ldr r0, [r5] - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08039CE8 - movs r0, 0x1 - bl GetBattlerAtPosition - lsls r0, 24 - lsrs r5, r0, 24 - adds r6, r5, 0 - b _08039CFC - .align 2, 0 -_08039CDC: .4byte gBattleTypeFlags -_08039CE0: .4byte gActiveBattler -_08039CE4: .4byte gBattleStruct -_08039CE8: - movs r0, 0x1 - bl GetBattlerAtPosition - lsls r0, 24 - lsrs r6, r0, 24 - movs r0, 0x3 - bl GetBattlerAtPosition - lsls r0, 24 - lsrs r5, r0, 24 -_08039CFC: - movs r4, 0 -_08039CFE: - movs r0, 0x64 - muls r0, r4 - ldr r1, _08039D7C @ =gEnemyParty - adds r0, r1 - movs r1, 0x39 - bl GetMonData - cmp r0, 0 - beq _08039D3E - ldr r1, _08039D80 @ =gBattlerPartyIndexes - lsls r0, r6, 1 - adds r0, r1 - ldrh r0, [r0] - cmp r4, r0 - beq _08039D3E - lsls r0, r5, 1 - adds r0, r1 - ldrh r0, [r0] - cmp r4, r0 - beq _08039D3E - ldr r0, _08039D84 @ =gBattleStruct - ldr r1, [r0] - adds r0, r6, r1 - adds r0, 0x5C - ldrb r0, [r0] - cmp r4, r0 - beq _08039D3E - adds r0, r5, r1 - adds r0, 0x5C - ldrb r0, [r0] - cmp r4, r0 - bne _08039D44 -_08039D3E: - adds r4, 0x1 - cmp r4, 0x5 - ble _08039CFE -_08039D44: - ldr r0, _08039D88 @ =gActiveBattler - ldrb r0, [r0] - bl GetBattlerPosition - lsls r0, 24 - lsrs r0, 25 - ldr r1, _08039D84 @ =gBattleStruct - ldr r1, [r1] - adds r0, r1 - adds r0, 0x92 - strb r4, [r0] -_08039D5A: - ldr r4, _08039D88 @ =gActiveBattler - ldrb r0, [r4] - bl GetBattlerPosition - ldrb r2, [r4] - ldr r1, _08039D84 @ =gBattleStruct - ldr r1, [r1] - adds r2, r1 - adds r2, 0x5C - lsls r0, 24 - lsrs r0, 25 - adds r0, r1 - adds r0, 0x92 - ldrb r0, [r0] - strb r0, [r2] - b _08039DA8 - .align 2, 0 -_08039D7C: .4byte gEnemyParty -_08039D80: .4byte gBattlerPartyIndexes -_08039D84: .4byte gBattleStruct -_08039D88: .4byte gActiveBattler -_08039D8C: - bl sub_803A1F4 - lsls r0, 24 - cmp r0, 0 - bne _08039DA8 -_08039D96: - ldr r0, _08039DB0 @ =gActiveBattler - ldrb r0, [r0] - movs r2, 0x1 - eors r2, r0 - lsls r2, 8 - movs r0, 0x1 - movs r1, 0 - bl BtlController_EmitTwoReturnValues -_08039DA8: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08039DB0: .4byte gActiveBattler - thumb_func_end AI_TrySwitchOrUseItem - - thumb_func_start sub_8039DB4 -sub_8039DB4: @ 8039DB4 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - adds r6, r3, 0 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp] - lsls r1, 24 - lsrs r1, 24 - mov r9, r1 - lsls r2, 24 - lsrs r2, 24 - mov r8, r2 - movs r7, 0 - ldr r0, _08039E38 @ =gUnknown_824F050 - mov r10, r0 - ldrb r0, [r0] - cmp r0, 0xFF - beq _08039E26 - mov r5, r10 -_08039DE2: - ldrb r0, [r5] - cmp r0, 0xFE - beq _08039E18 - ldr r1, [sp] - cmp r0, r1 - bne _08039E18 - ldrb r4, [r5, 0x1] - cmp r4, r9 - bne _08039E02 - ldrb r1, [r6] - ldrb r0, [r5, 0x2] - muls r0, r1 - movs r1, 0xA - bl __divsi3 - strb r0, [r6] -_08039E02: - cmp r4, r8 - bne _08039E18 - cmp r9, r8 - beq _08039E18 - ldrb r1, [r6] - ldrb r0, [r5, 0x2] - muls r0, r1 - movs r1, 0xA - bl __divsi3 - strb r0, [r6] -_08039E18: - adds r5, 0x3 - adds r7, 0x3 - mov r1, r10 - adds r0, r7, r1 - ldrb r0, [r0] - cmp r0, 0xFF - bne _08039DE2 -_08039E26: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08039E38: .4byte gUnknown_824F050 - thumb_func_end sub_8039DB4 - - thumb_func_start GetMostSuitableMonToSwitchInto -GetMostSuitableMonToSwitchInto: @ 8039E3C - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x1C - ldr r4, _08039E98 @ =gActiveBattler - ldrb r2, [r4] - ldr r0, _08039E9C @ =gBattleStruct - ldr r0, [r0] - adds r0, r2, r0 - adds r1, r0, 0 - adds r1, 0x5C - ldrb r0, [r1] - cmp r0, 0x6 - beq _08039E5E - b _0803A160 -_08039E5E: - ldr r0, _08039EA0 @ =gBattleTypeFlags - ldr r0, [r0] - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08039EF8 - str r2, [sp, 0xC] - adds r0, r2, 0 - bl GetBattlerPosition - movs r5, 0x2 - eors r0, r5 - lsls r0, 24 - lsrs r0, 24 - bl GetBattlerAtPosition - ldr r1, _08039EA4 @ =gAbsentBattlerFlags - ldrb r1, [r1] - ldr r2, _08039EA8 @ =gBitTable - lsls r0, 24 - lsrs r0, 22 - adds r0, r2 - ldr r0, [r0] - ands r1, r0 - cmp r1, 0 - beq _08039EAC - ldrb r4, [r4] - str r4, [sp, 0x10] - b _08039EC2 - .align 2, 0 -_08039E98: .4byte gActiveBattler -_08039E9C: .4byte gBattleStruct -_08039EA0: .4byte gBattleTypeFlags -_08039EA4: .4byte gAbsentBattlerFlags -_08039EA8: .4byte gBitTable -_08039EAC: - ldrb r0, [r4] - bl GetBattlerPosition - eors r0, r5 - lsls r0, 24 - lsrs r0, 24 - bl GetBattlerAtPosition - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x10] -_08039EC2: - bl Random - movs r3, 0x2 - ands r0, r3 - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - ldr r0, _08039EF0 @ =gAbsentBattlerFlags - ldrb r1, [r0] - ldr r2, _08039EF4 @ =gBitTable - mov r4, r10 - lsls r0, r4, 2 - adds r0, r2 - ldr r0, [r0] - ands r1, r0 - cmp r1, 0 - beq _08039F0A - eors r4, r3 - lsls r0, r4, 24 - lsrs r0, 24 - mov r10, r0 - b _08039F0A - .align 2, 0 -_08039EF0: .4byte gAbsentBattlerFlags -_08039EF4: .4byte gBitTable -_08039EF8: - movs r0, 0 - bl GetBattlerAtPosition - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - ldrb r4, [r4] - str r4, [sp, 0x10] - str r4, [sp, 0xC] -_08039F0A: - movs r0, 0 - mov r9, r0 - mov r1, sp - str r1, [sp, 0x14] -_08039F12: - movs r2, 0 - str r2, [sp, 0x4] - movs r4, 0x6 - str r4, [sp, 0x8] - movs r7, 0 - ldr r0, _08039FD8 @ =gBitTable - mov r8, r0 -_08039F20: - movs r0, 0x64 - adds r1, r7, 0 - muls r1, r0 - ldr r0, _08039FDC @ =gEnemyParty - adds r4, r1, r0 - adds r0, r4, 0 - movs r1, 0xB - bl GetMonData - lsls r0, 16 - lsrs r5, r0, 16 - cmp r5, 0 - beq _08039FF0 - adds r0, r4, 0 - movs r1, 0x39 - bl GetMonData - cmp r0, 0 - beq _08039FF0 - mov r1, r8 - ldr r0, [r1] - mov r2, r9 - ands r0, r2 - cmp r0, 0 - bne _08039FF0 - ldr r1, _08039FE0 @ =gBattlerPartyIndexes - ldr r4, [sp, 0xC] - lsls r0, r4, 1 - adds r0, r1 - ldrh r0, [r0] - cmp r0, r7 - beq _08039FF0 - ldr r2, [sp, 0x10] - lsls r0, r2, 1 - adds r0, r1 - ldrh r0, [r0] - cmp r0, r7 - beq _08039FF0 - ldr r0, _08039FE4 @ =gBattleStruct - ldr r1, [r0] - adds r0, r4, r1 - adds r0, 0x5C - ldrb r0, [r0] - cmp r7, r0 - beq _08039FF0 - adds r0, r2, r1 - adds r0, 0x5C - ldrb r0, [r0] - cmp r7, r0 - beq _08039FF0 - ldr r1, _08039FE8 @ =gBaseStats - lsls r0, r5, 3 - subs r0, r5 - lsls r0, 2 - adds r0, r1 - ldrb r5, [r0, 0x6] - ldrb r6, [r0, 0x7] - movs r0, 0xA - ldr r4, [sp, 0x14] - strb r0, [r4] - movs r0, 0x58 - mov r4, r10 - muls r4, r0 - ldr r0, _08039FEC @ =gBattleMons - adds r4, r0 - adds r0, r4, 0 - adds r0, 0x21 - ldrb r0, [r0] - adds r1, r5, 0 - adds r2, r6, 0 - mov r3, sp - bl sub_8039DB4 - adds r4, 0x22 - ldrb r0, [r4] - adds r1, r5, 0 - adds r2, r6, 0 - mov r3, sp - bl sub_8039DB4 - ldr r2, [sp, 0x4] - ldr r1, [sp, 0x14] - ldrb r1, [r1] - cmp r2, r1 - bcs _08039FFE - ldr r2, [sp, 0x14] - ldrb r2, [r2] - str r2, [sp, 0x4] - lsls r0, r7, 24 - lsrs r0, 24 - str r0, [sp, 0x8] - b _08039FFE - .align 2, 0 -_08039FD8: .4byte gBitTable -_08039FDC: .4byte gEnemyParty -_08039FE0: .4byte gBattlerPartyIndexes -_08039FE4: .4byte gBattleStruct -_08039FE8: .4byte gBaseStats -_08039FEC: .4byte gBattleMons -_08039FF0: - mov r4, r8 - ldr r0, [r4] - mov r1, r9 - orrs r1, r0 - lsls r0, r1, 24 - lsrs r0, 24 - mov r9, r0 -_08039FFE: - movs r2, 0x4 - add r8, r2 - adds r7, 0x1 - cmp r7, 0x5 - ble _08039F20 - ldr r4, [sp, 0x8] - cmp r4, 0x6 - beq _0803A06C - movs r7, 0 - movs r0, 0x64 - adds r5, r4, 0 - muls r5, r0 - ldr r6, _0803A060 @ =gEnemyParty -_0803A018: - adds r1, r7, 0 - adds r1, 0xD - adds r0, r5, r6 - bl GetMonData - lsls r0, 16 - lsrs r4, r0, 16 - cmp r4, 0 - beq _0803A03E - ldr r0, _0803A064 @ =gActiveBattler - ldrb r1, [r0] - adds r0, r4, 0 - mov r2, r10 - bl TypeCalc - movs r1, 0x2 - ands r1, r0 - cmp r1, 0 - bne _0803A044 -_0803A03E: - adds r7, 0x1 - cmp r7, 0x3 - ble _0803A018 -_0803A044: - cmp r7, 0x4 - beq _0803A04A - b _0803A15E -_0803A04A: - ldr r1, [sp, 0x8] - lsls r0, r1, 2 - ldr r2, _0803A068 @ =gBitTable - adds r0, r2 - ldr r0, [r0] - mov r4, r9 - orrs r4, r0 - lsls r0, r4, 24 - lsrs r0, 24 - b _0803A06E - .align 2, 0 -_0803A060: .4byte gEnemyParty -_0803A064: .4byte gActiveBattler -_0803A068: .4byte gBitTable -_0803A06C: - movs r0, 0x3F -_0803A06E: - mov r9, r0 - mov r1, r9 - cmp r1, 0x3F - beq _0803A078 - b _08039F12 -_0803A078: - ldr r0, _0803A170 @ =gDynamicBasePower - movs r1, 0 - strh r1, [r0] - ldr r0, _0803A174 @ =gBattleStruct - ldr r0, [r0] - strb r1, [r0, 0x13] - ldr r0, _0803A178 @ =gBattleScripting - movs r2, 0x1 - strb r2, [r0, 0xE] - ldr r0, _0803A17C @ =gMoveResultFlags - strb r1, [r0] - ldr r0, _0803A180 @ =gCritMultiplier - strb r2, [r0] - movs r2, 0 - str r2, [sp, 0x4] - movs r4, 0x6 - str r4, [sp, 0x8] - movs r7, 0 -_0803A09C: - movs r0, 0x64 - adds r6, r7, 0 - muls r6, r0 - ldr r0, _0803A184 @ =gEnemyParty - adds r4, r6, r0 - adds r0, r4, 0 - movs r1, 0xB - bl GetMonData - lsls r0, 16 - adds r1, r7, 0x1 - str r1, [sp, 0x18] - cmp r0, 0 - beq _0803A158 - adds r0, r4, 0 - movs r1, 0x39 - bl GetMonData - cmp r0, 0 - beq _0803A158 - ldr r1, _0803A188 @ =gBattlerPartyIndexes - ldr r2, [sp, 0xC] - lsls r0, r2, 1 - adds r0, r1 - ldrh r0, [r0] - cmp r0, r7 - beq _0803A158 - ldr r4, [sp, 0x10] - lsls r0, r4, 1 - adds r0, r1 - ldrh r0, [r0] - cmp r0, r7 - beq _0803A158 - ldr r0, _0803A174 @ =gBattleStruct - ldr r1, [r0] - adds r0, r2, r1 - adds r0, 0x5C - ldrb r0, [r0] - cmp r7, r0 - beq _0803A158 - adds r0, r4, r1 - adds r0, 0x5C - ldrb r0, [r0] - cmp r7, r0 - beq _0803A158 - movs r5, 0 - mov r9, r6 - ldr r0, _0803A18C @ =gBattleMoveDamage - mov r8, r0 - ldr r6, _0803A190 @ =gActiveBattler -_0803A100: - adds r1, r5, 0 - adds r1, 0xD - ldr r0, _0803A184 @ =gEnemyParty - add r0, r9 - bl GetMonData - lsls r0, 16 - lsrs r4, r0, 16 - movs r0, 0 - mov r1, r8 - str r0, [r1] - cmp r4, 0 - beq _0803A13C - ldr r0, _0803A194 @ =gBattleMoves - lsls r1, r4, 1 - adds r1, r4 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0x1] - cmp r0, 0x1 - beq _0803A13C - ldrb r0, [r6] - mov r1, r10 - bl AI_CalcDmg - ldrb r1, [r6] - adds r0, r4, 0 - mov r2, r10 - bl TypeCalc -_0803A13C: - mov r2, r8 - ldr r0, [r2] - ldr r4, [sp, 0x4] - cmp r4, r0 - bge _0803A152 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x4] - lsls r0, r7, 24 - lsrs r0, 24 - str r0, [sp, 0x8] -_0803A152: - adds r5, 0x1 - cmp r5, 0x3 - ble _0803A100 -_0803A158: - ldr r7, [sp, 0x18] - cmp r7, 0x5 - ble _0803A09C -_0803A15E: - ldr r0, [sp, 0x8] -_0803A160: - add sp, 0x1C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0803A170: .4byte gDynamicBasePower -_0803A174: .4byte gBattleStruct -_0803A178: .4byte gBattleScripting -_0803A17C: .4byte gMoveResultFlags -_0803A180: .4byte gCritMultiplier -_0803A184: .4byte gEnemyParty -_0803A188: .4byte gBattlerPartyIndexes -_0803A18C: .4byte gBattleMoveDamage -_0803A190: .4byte gActiveBattler -_0803A194: .4byte gBattleMoves - thumb_func_end GetMostSuitableMonToSwitchInto - - thumb_func_start sub_803A198 -sub_803A198: @ 803A198 - push {r4,lr} - adds r2, r1, 0 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x13 - bne _0803A1A8 - movs r0, 0x1 - b _0803A1EE -_0803A1A8: - ldrb r1, [r2, 0x4] - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - beq _0803A1B6 - movs r0, 0x2 - b _0803A1EE -_0803A1B6: - ldrb r4, [r2, 0x3] - movs r3, 0x3F - adds r0, r3, 0 - ands r0, r4 - cmp r0, 0 - beq _0803A1C6 - movs r0, 0x3 - b _0803A1EE -_0803A1C6: - ldrb r1, [r2] - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - bne _0803A1DC - ldrb r0, [r2, 0x1] - cmp r0, 0 - bne _0803A1DC - ldrb r0, [r2, 0x2] - cmp r0, 0 - beq _0803A1E0 -_0803A1DC: - movs r0, 0x4 - b _0803A1EE -_0803A1E0: - movs r0, 0x80 - ands r0, r4 - cmp r0, 0 - bne _0803A1EC - movs r0, 0x6 - b _0803A1EE -_0803A1EC: - movs r0, 0x5 -_0803A1EE: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_803A198 - - thumb_func_start sub_803A1F4 -sub_803A1F4: @ 803A1F4 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - movs r0, 0 - mov r10, r0 - movs r7, 0 - movs r1, 0 - mov r8, r1 -_0803A20A: - movs r0, 0x64 - mov r1, r8 - muls r1, r0 - ldr r0, _0803A2A8 @ =gEnemyParty - adds r4, r1, r0 - adds r0, r4, 0 - movs r1, 0x39 - bl GetMonData - cmp r0, 0 - beq _0803A246 - adds r0, r4, 0 - movs r1, 0x41 - bl GetMonData - cmp r0, 0 - beq _0803A246 - adds r0, r4, 0 - movs r1, 0x41 - bl GetMonData - movs r1, 0xCE - lsls r1, 1 - cmp r0, r1 - beq _0803A246 - mov r0, r10 - adds r0, 0x1 - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 -_0803A246: - movs r2, 0x1 - add r8, r2 - mov r0, r8 - cmp r0, 0x5 - ble _0803A20A - movs r1, 0 - mov r8, r1 -_0803A254: - ldr r1, _0803A2AC @ =gBattleResources - mov r2, r8 - cmp r2, 0 - beq _0803A26E - ldr r0, [r1] - ldr r0, [r0, 0x18] - adds r0, 0x2C - ldrb r0, [r0] - subs r0, r2 - adds r0, 0x1 - cmp r10, r0 - ble _0803A26E - b _0803A644 -_0803A26E: - ldr r0, [r1] - ldr r0, [r0, 0x18] - mov r2, r8 - lsls r1, r2, 1 - adds r0, 0x24 - adds r0, r1 - ldrh r0, [r0] - mov r9, r0 - str r1, [sp] - cmp r0, 0 - bne _0803A286 - b _0803A644 -_0803A286: - ldr r1, _0803A2B0 @ =gItemEffectTable - subs r0, 0xD - lsls r0, 2 - adds r0, r1 - ldr r1, [r0] - cmp r1, 0 - bne _0803A296 - b _0803A644 -_0803A296: - mov r0, r9 - cmp r0, 0xAF - bne _0803A2BC - ldr r0, _0803A2B4 @ =gSaveBlock1Ptr - ldr r0, [r0] - ldr r1, _0803A2B8 @ =0x00003108 - adds r5, r0, r1 - b _0803A2BE - .align 2, 0 -_0803A2A8: .4byte gEnemyParty -_0803A2AC: .4byte gBattleResources -_0803A2B0: .4byte gItemEffectTable -_0803A2B4: .4byte gSaveBlock1Ptr -_0803A2B8: .4byte 0x00003108 -_0803A2BC: - adds r5, r1, 0 -_0803A2BE: - mov r2, r9 - lsls r0, r2, 24 - lsrs r0, 24 - adds r1, r5, 0 - bl sub_803A198 - ldr r4, _0803A2F8 @ =gActiveBattler - ldrb r1, [r4] - lsrs r1, 1 - ldr r3, _0803A2FC @ =gBattleStruct - ldr r2, [r3] - adds r1, r2 - adds r1, 0xC4 - strb r0, [r1] - ldrb r0, [r4] - lsrs r0, 1 - ldr r1, [r3] - adds r0, r1 - adds r0, 0xC4 - ldrb r0, [r0] - subs r0, 0x1 - cmp r0, 0x5 - bls _0803A2EE - b _0803A5F8 -_0803A2EE: - lsls r0, 2 - ldr r1, _0803A300 @ =_0803A304 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0803A2F8: .4byte gActiveBattler -_0803A2FC: .4byte gBattleStruct -_0803A300: .4byte _0803A304 - .align 2, 0 -_0803A304: - .4byte _0803A31C - .4byte _0803A348 - .4byte _0803A390 - .4byte _0803A4E8 - .4byte _0803A5C8 - .4byte _0803A650 -_0803A31C: - ldr r2, _0803A340 @ =gBattleMons - ldr r0, _0803A344 @ =gActiveBattler - ldrb r1, [r0] - movs r0, 0x58 - muls r0, r1 - adds r0, r2 - ldrh r1, [r0, 0x2C] - ldrh r0, [r0, 0x28] - lsrs r1, 2 - cmp r0, r1 - bcc _0803A334 - b _0803A5F8 -_0803A334: - cmp r0, 0 - bne _0803A33A - b _0803A5F8 -_0803A33A: - movs r7, 0x1 - b _0803A5FC - .align 2, 0 -_0803A340: .4byte gBattleMons -_0803A344: .4byte gActiveBattler -_0803A348: - mov r0, r9 - movs r1, 0x4 - movs r2, 0x4 - bl GetItemEffectParamOffset - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0 - bne _0803A35C - b _0803A5F8 -_0803A35C: - ldr r2, _0803A388 @ =gBattleMons - ldr r0, _0803A38C @ =gActiveBattler - ldrb r1, [r0] - movs r0, 0x58 - muls r0, r1 - adds r1, r0, r2 - ldrh r2, [r1, 0x28] - cmp r2, 0 - bne _0803A370 - b _0803A5F8 -_0803A370: - ldrh r3, [r1, 0x2C] - lsrs r0, r3, 2 - cmp r2, r0 - bcc _0803A33A - adds r0, r2, 0 - subs r0, r3, r0 - adds r1, r5, r4 - ldrb r1, [r1] - cmp r0, r1 - bgt _0803A386 - b _0803A5F8 -_0803A386: - b _0803A33A - .align 2, 0 -_0803A388: .4byte gBattleMons -_0803A38C: .4byte gActiveBattler -_0803A390: - ldr r3, _0803A4DC @ =gActiveBattler - ldrb r0, [r3] - lsrs r0, 1 - ldr r2, _0803A4E0 @ =gBattleStruct - ldr r1, [r2] - adds r0, r1 - adds r0, 0xC6 - movs r1, 0 - strb r1, [r0] - ldrb r1, [r5, 0x3] - movs r6, 0x20 - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - beq _0803A3D4 - ldr r1, _0803A4E4 @ =gBattleMons - ldrb r4, [r3] - movs r0, 0x58 - muls r0, r4 - adds r1, 0x4C - adds r0, r1 - ldr r0, [r0] - movs r1, 0x7 - ands r0, r1 - cmp r0, 0 - beq _0803A3D4 - lsrs r1, r4, 1 - ldr r0, [r2] - adds r1, r0 - adds r1, 0xC6 - ldrb r0, [r1] - orrs r0, r6 - strb r0, [r1] - movs r7, 0x1 -_0803A3D4: - ldrb r1, [r5, 0x3] - movs r6, 0x10 - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - beq _0803A40E - ldr r1, _0803A4E4 @ =gBattleMons - ldrb r4, [r3] - movs r0, 0x58 - muls r0, r4 - adds r1, 0x4C - adds r0, r1 - ldr r1, [r0] - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - bne _0803A3FE - movs r0, 0x80 - ands r1, r0 - cmp r1, 0 - beq _0803A40E -_0803A3FE: - lsrs r1, r4, 1 - ldr r0, [r2] - adds r1, r0 - adds r1, 0xC6 - ldrb r0, [r1] - orrs r0, r6 - strb r0, [r1] - movs r7, 0x1 -_0803A40E: - ldrb r1, [r5, 0x3] - movs r6, 0x8 - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _0803A440 - ldr r1, _0803A4E4 @ =gBattleMons - ldrb r4, [r3] - movs r0, 0x58 - muls r0, r4 - adds r1, 0x4C - adds r0, r1 - ldr r0, [r0] - movs r1, 0x10 - ands r0, r1 - cmp r0, 0 - beq _0803A440 - lsrs r1, r4, 1 - ldr r0, [r2] - adds r1, r0 - adds r1, 0xC6 - ldrb r0, [r1] - orrs r0, r6 - strb r0, [r1] - movs r7, 0x1 -_0803A440: - ldrb r1, [r5, 0x3] - movs r6, 0x4 - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - beq _0803A472 - ldr r1, _0803A4E4 @ =gBattleMons - ldrb r4, [r3] - movs r0, 0x58 - muls r0, r4 - adds r1, 0x4C - adds r0, r1 - ldr r0, [r0] - movs r1, 0x20 - ands r0, r1 - cmp r0, 0 - beq _0803A472 - lsrs r1, r4, 1 - ldr r0, [r2] - adds r1, r0 - adds r1, 0xC6 - ldrb r0, [r1] - orrs r0, r6 - strb r0, [r1] - movs r7, 0x1 -_0803A472: - ldrb r1, [r5, 0x3] - movs r6, 0x2 - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _0803A4A4 - ldr r1, _0803A4E4 @ =gBattleMons - ldrb r4, [r3] - movs r0, 0x58 - muls r0, r4 - adds r1, 0x4C - adds r0, r1 - ldr r0, [r0] - movs r1, 0x40 - ands r0, r1 - cmp r0, 0 - beq _0803A4A4 - lsrs r1, r4, 1 - ldr r0, [r2] - adds r1, r0 - adds r1, 0xC6 - ldrb r0, [r1] - orrs r0, r6 - strb r0, [r1] - movs r7, 0x1 -_0803A4A4: - ldrb r1, [r5, 0x3] - movs r4, 0x1 - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _0803A4B2 - b _0803A5F8 -_0803A4B2: - ldr r1, _0803A4E4 @ =gBattleMons - ldrb r3, [r3] - movs r0, 0x58 - muls r0, r3 - adds r1, 0x50 - adds r0, r1 - ldr r0, [r0] - movs r1, 0x7 - ands r0, r1 - cmp r0, 0 - bne _0803A4CA - b _0803A5F8 -_0803A4CA: - lsrs r1, r3, 1 - ldr r0, [r2] - adds r1, r0 - adds r1, 0xC6 - ldrb r0, [r1] - orrs r0, r4 - strb r0, [r1] - b _0803A33A - .align 2, 0 -_0803A4DC: .4byte gActiveBattler -_0803A4E0: .4byte gBattleStruct -_0803A4E4: .4byte gBattleMons -_0803A4E8: - ldr r4, _0803A5BC @ =gActiveBattler - ldrb r0, [r4] - lsrs r0, 1 - ldr r3, _0803A5C0 @ =gBattleStruct - ldr r1, [r3] - adds r0, r1 - adds r0, 0xC6 - movs r1, 0 - strb r1, [r0] - ldr r1, _0803A5C4 @ =gDisableStructs - ldrb r2, [r4] - lsls r0, r2, 3 - subs r0, r2 - lsls r0, 2 - adds r0, r1 - ldrb r0, [r0, 0x16] - cmp r0, 0 - beq _0803A5F8 - ldrb r1, [r5] - movs r6, 0xF - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - beq _0803A528 - lsrs r2, 1 - ldr r0, [r3] - adds r2, r0 - adds r2, 0xC6 - ldrb r0, [r2] - movs r1, 0x1 - orrs r0, r1 - strb r0, [r2] -_0803A528: - ldrb r1, [r5, 0x1] - movs r7, 0xF0 - adds r0, r7, 0 - ands r0, r1 - cmp r0, 0 - beq _0803A546 - ldrb r0, [r4] - lsrs r0, 1 - ldr r1, [r3] - adds r0, r1 - adds r0, 0xC6 - ldrb r1, [r0] - movs r2, 0x2 - orrs r1, r2 - strb r1, [r0] -_0803A546: - ldrb r1, [r5, 0x1] - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - beq _0803A562 - ldrb r0, [r4] - lsrs r0, 1 - ldr r1, [r3] - adds r0, r1 - adds r0, 0xC6 - ldrb r1, [r0] - movs r2, 0x4 - orrs r1, r2 - strb r1, [r0] -_0803A562: - ldrb r1, [r5, 0x2] - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - beq _0803A57E - ldrb r0, [r4] - lsrs r0, 1 - ldr r1, [r3] - adds r0, r1 - adds r0, 0xC6 - ldrb r1, [r0] - movs r2, 0x8 - orrs r1, r2 - strb r1, [r0] -_0803A57E: - ldrb r1, [r5, 0x2] - adds r0, r7, 0 - ands r0, r1 - cmp r0, 0 - beq _0803A59A - ldrb r0, [r4] - lsrs r0, 1 - ldr r1, [r3] - adds r0, r1 - adds r0, 0xC6 - ldrb r1, [r0] - movs r2, 0x20 - orrs r1, r2 - strb r1, [r0] -_0803A59A: - ldrb r1, [r5] - movs r0, 0x30 - ands r0, r1 - cmp r0, 0 - bne _0803A5A6 - b _0803A33A -_0803A5A6: - ldrb r0, [r4] - lsrs r0, 1 - ldr r1, [r3] - adds r0, r1 - adds r0, 0xC6 - ldrb r1, [r0] - movs r2, 0x80 - orrs r1, r2 - strb r1, [r0] - b _0803A33A - .align 2, 0 -_0803A5BC: .4byte gActiveBattler -_0803A5C0: .4byte gBattleStruct -_0803A5C4: .4byte gDisableStructs -_0803A5C8: - ldr r4, _0803A630 @ =gActiveBattler - ldrb r0, [r4] - bl GetBattlerSide - lsls r0, 24 - lsrs r3, r0, 24 - ldr r2, _0803A634 @ =gDisableStructs - ldrb r1, [r4] - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0, 0x16] - cmp r0, 0 - beq _0803A5F8 - ldr r0, _0803A638 @ =gSideTimers - lsls r1, r3, 1 - adds r1, r3 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0x4] - cmp r0, 0 - bne _0803A5F8 - b _0803A33A -_0803A5F8: - cmp r7, 0 - beq _0803A644 -_0803A5FC: - movs r0, 0x1 - movs r1, 0x1 - movs r2, 0 - bl BtlController_EmitTwoReturnValues - ldr r0, _0803A630 @ =gActiveBattler - ldrb r0, [r0] - lsrs r0, 1 - ldr r1, _0803A63C @ =gBattleStruct - ldr r1, [r1] - lsls r0, 1 - adds r0, r1 - adds r0, 0xC0 - mov r1, r9 - strb r1, [r0] - ldr r0, _0803A640 @ =gBattleResources - ldr r0, [r0] - ldr r0, [r0, 0x18] - adds r0, 0x24 - ldr r2, [sp] - adds r0, r2 - movs r1, 0 - strh r1, [r0] - adds r0, r7, 0 - b _0803A652 - .align 2, 0 -_0803A630: .4byte gActiveBattler -_0803A634: .4byte gDisableStructs -_0803A638: .4byte gSideTimers -_0803A63C: .4byte gBattleStruct -_0803A640: .4byte gBattleResources -_0803A644: - movs r0, 0x1 - add r8, r0 - mov r1, r8 - cmp r1, 0x3 - bgt _0803A650 - b _0803A254 -_0803A650: - movs r0, 0 -_0803A652: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_803A1F4 - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/battle_script_commands.s b/asm/battle_script_commands.s index 8bc130fd7..3155a9a5d 100644 --- a/asm/battle_script_commands.s +++ b/asm/battle_script_commands.s @@ -370,7 +370,7 @@ _0801DA5E: movs r1, 0x1 orrs r0, r1 strb r0, [r2] - ldr r1, _0801DAA4 @ =gUnknown_2023DA0 + ldr r1, _0801DAA4 @ =gLastLandedMoves ldr r3, _0801DAA8 @ =gBattlerTarget ldrb r0, [r3] lsls r0, 1 @@ -392,7 +392,7 @@ _0801DA94: .4byte gCurrentMove _0801DA98: .4byte gBattleMons _0801DA9C: .4byte gBattlerAttacker _0801DAA0: .4byte gMoveResultFlags -_0801DAA4: .4byte gUnknown_2023DA0 +_0801DAA4: .4byte gLastLandedMoves _0801DAA8: .4byte gBattlerTarget _0801DAAC: .4byte gUnknown_2023DA8 _0801DAB0: .4byte gBattleCommunication @@ -458,7 +458,7 @@ JumpIfMoveFailed: @ 801DB10 ands r0, r1 cmp r0, 0 beq _0801DB70 - ldr r1, _0801DB64 @ =gUnknown_2023DA0 + ldr r1, _0801DB64 @ =gLastLandedMoves ldr r3, _0801DB68 @ =gBattlerTarget ldrb r0, [r3] lsls r0, 1 @@ -484,7 +484,7 @@ JumpIfMoveFailed: @ 801DB10 .align 2, 0 _0801DB5C: .4byte gBattlescriptCurrInstr _0801DB60: .4byte gMoveResultFlags -_0801DB64: .4byte gUnknown_2023DA0 +_0801DB64: .4byte gLastLandedMoves _0801DB68: .4byte gBattlerTarget _0801DB6C: .4byte gUnknown_2023DA8 _0801DB70: @@ -2182,7 +2182,7 @@ _0801E8C0: movs r1, 0x9 orrs r0, r1 strb r0, [r2] - ldr r1, _0801E92C @ =gUnknown_2023DA0 + ldr r1, _0801E92C @ =gLastLandedMoves ldrb r0, [r4] lsls r0, 1 adds r0, r1 @@ -2208,22 +2208,22 @@ _0801E91C: .4byte gBattleMoveDamage _0801E920: .4byte gBattlerTarget _0801E924: .4byte gLastUsedAbility _0801E928: .4byte gMoveResultFlags -_0801E92C: .4byte gUnknown_2023DA0 +_0801E92C: .4byte gLastLandedMoves _0801E930: .4byte gUnknown_2023DA8 _0801E934: .4byte gBattleCommunication _0801E938: - ldr r1, _0801E944 @ =gUnknown_824F050 + ldr r1, _0801E944 @ =gTypeEffectiveness adds r0, r3, r1 ldrb r0, [r0] adds r2, r1, 0 b _0801E9B4 .align 2, 0 -_0801E944: .4byte gUnknown_824F050 +_0801E944: .4byte gTypeEffectiveness _0801E948: adds r3, 0x3 b _0801E9B0 _0801E94C: - ldr r5, _0801EA84 @ =gUnknown_824F050 + ldr r5, _0801EA84 @ =gTypeEffectiveness adds r0, r3, r5 ldrb r0, [r0] cmp r0, r8 @@ -2272,7 +2272,7 @@ _0801E9A8: adds r3, 0x3 ldr r5, _0801EA88 @ =gBattleMons ldr r4, _0801EA8C @ =gBattlerTarget - ldr r2, _0801EA84 @ =gUnknown_824F050 + ldr r2, _0801EA84 @ =gTypeEffectiveness _0801E9B0: adds r0, r3, r2 ldrb r0, [r0] @@ -2339,7 +2339,7 @@ _0801EA10: orrs r0, r4 mov r1, r8 strb r0, [r1] - ldr r1, _0801EAA4 @ =gUnknown_2023DA0 + ldr r1, _0801EAA4 @ =gLastLandedMoves ldrb r0, [r5] lsls r0, 1 adds r0, r1 @@ -2384,7 +2384,7 @@ _0801EA70: pop {r0} bx r0 .align 2, 0 -_0801EA84: .4byte gUnknown_824F050 +_0801EA84: .4byte gTypeEffectiveness _0801EA88: .4byte gBattleMons _0801EA8C: .4byte gBattlerTarget _0801EA90: .4byte gBattlerAttacker @@ -2392,7 +2392,7 @@ _0801EA94: .4byte gCurrentMove _0801EA98: .4byte gMoveResultFlags _0801EA9C: .4byte gBattleMoves _0801EAA0: .4byte gLastUsedAbility -_0801EAA4: .4byte gUnknown_2023DA0 +_0801EAA4: .4byte gLastLandedMoves _0801EAA8: .4byte gUnknown_2023DA8 _0801EAAC: .4byte gBattleCommunication _0801EAB0: .4byte gProtectStructs @@ -2473,13 +2473,13 @@ _0801EB40: .4byte gBattlerTarget _0801EB44: .4byte gLastUsedAbility _0801EB48: .4byte gBattleCommunication _0801EB4C: - ldr r1, _0801EB58 @ =gUnknown_824F050 + ldr r1, _0801EB58 @ =gTypeEffectiveness adds r0, r5, r1 ldrb r0, [r0] adds r4, r1, 0 b _0801EC9E .align 2, 0 -_0801EB58: .4byte gUnknown_824F050 +_0801EB58: .4byte gTypeEffectiveness _0801EB5C: adds r0, r5, r4 ldrb r0, [r0] @@ -2919,7 +2919,7 @@ _0801EE94: .4byte gBattleMoves _0801EE98: .4byte gBattleMons _0801EE9C: .4byte gBattleMoveDamage _0801EEA0: - ldr r1, _0801EEBC @ =gUnknown_824F050 + ldr r1, _0801EEBC @ =gTypeEffectiveness mov r2, r8 adds r0, r2, r1 ldrb r0, [r0] @@ -2934,13 +2934,13 @@ _0801EEA0: adds r0, r3, 0 b _0801EF3E .align 2, 0 -_0801EEBC: .4byte gUnknown_824F050 +_0801EEBC: .4byte gTypeEffectiveness _0801EEC0: movs r0, 0x3 add r8, r0 b _0801EF28 _0801EEC6: - ldr r7, _0801EFC0 @ =gUnknown_824F050 + ldr r7, _0801EFC0 @ =gTypeEffectiveness mov r1, r8 adds r0, r1, r7 ldrb r0, [r0] @@ -2988,7 +2988,7 @@ _0801EF20: movs r1, 0x3 add r8, r1 ldr r5, _0801EFC4 @ =gBattleMons - ldr r2, _0801EFC0 @ =gUnknown_824F050 + ldr r2, _0801EFC0 @ =gTypeEffectiveness _0801EF28: mov r3, r8 adds r0, r3, r2 @@ -3070,7 +3070,7 @@ _0801EFAE: pop {r1} bx r1 .align 2, 0 -_0801EFC0: .4byte gUnknown_824F050 +_0801EFC0: .4byte gTypeEffectiveness _0801EFC4: .4byte gBattleMons _0801EFC8: .4byte gBattleMoves thumb_func_end TypeCalc @@ -3129,7 +3129,7 @@ _0801F00C: .align 2, 0 _0801F030: .4byte gBattleMoves _0801F034: - ldr r0, _0801F0C0 @ =gUnknown_824F050 + ldr r0, _0801F0C0 @ =gTypeEffectiveness adds r1, r7, r0 ldrb r0, [r1] cmp r0, 0xFF @@ -3160,7 +3160,7 @@ _0801F05A: _0801F06C: adds r4, 0x3 adds r7, 0x3 - ldr r1, _0801F0C0 @ =gUnknown_824F050 + ldr r1, _0801F0C0 @ =gTypeEffectiveness adds r0, r7, r1 ldrb r0, [r0] cmp r0, 0xFF @@ -3205,7 +3205,7 @@ _0801F0B0: pop {r1} bx r1 .align 2, 0 -_0801F0C0: .4byte gUnknown_824F050 +_0801F0C0: .4byte gTypeEffectiveness _0801F0C4: .4byte gBattleMoves thumb_func_end AI_TypeCalc @@ -12325,7 +12325,7 @@ _08023966: ands r1, r0 cmp r1, 0 bne _08023984 - ldr r0, _080239C4 @ =gUnknown_2023DC0 + ldr r0, _080239C4 @ =gLastHitBy adds r0, r3, r0 mov r3, r9 ldrb r1, [r3] @@ -12348,7 +12348,7 @@ _08023984: ldr r0, _080239B8 @ =0x0000ffff cmp r3, r0 bne _080239D4 - ldr r1, _080239D0 @ =gUnknown_2023DA0 + ldr r1, _080239D0 @ =gLastLandedMoves ldrb r0, [r2] lsls r0, 1 adds r0, r1 @@ -12359,12 +12359,12 @@ _080239B4: .4byte gLastMoves _080239B8: .4byte 0x0000ffff _080239BC: .4byte gUnknown_2023DB0 _080239C0: .4byte gBattlerTarget -_080239C4: .4byte gUnknown_2023DC0 +_080239C4: .4byte gLastHitBy _080239C8: .4byte gMoveResultFlags _080239CC: .4byte gChosenMove -_080239D0: .4byte gUnknown_2023DA0 +_080239D0: .4byte gLastLandedMoves _080239D4: - ldr r0, _080239F8 @ =gUnknown_2023DA0 + ldr r0, _080239F8 @ =gLastLandedMoves ldrb r1, [r2] lsls r1, 1 adds r1, r0 @@ -12383,7 +12383,7 @@ _080239D4: ands r0, r3 b _08023A2A .align 2, 0 -_080239F8: .4byte gUnknown_2023DA0 +_080239F8: .4byte gLastLandedMoves _080239FC: .4byte gCurrentMove _08023A00: .4byte gUnknown_2023DA8 _08023A04: @@ -12402,7 +12402,7 @@ _08023A04: .align 2, 0 _08023A1C: .4byte gUnknown_2023DA8 _08023A20: - ldr r0, _08023A38 @ =gUnknown_2023DA0 + ldr r0, _08023A38 @ =gLastLandedMoves ldrb r1, [r2] lsls r1, 1 adds r1, r0 @@ -12416,7 +12416,7 @@ _08023A2C: strb r0, [r4, 0x14] b _08023BB4 .align 2, 0 -_08023A38: .4byte gUnknown_2023DA0 +_08023A38: .4byte gLastLandedMoves _08023A3C: .4byte 0x0000ffff _08023A40: ldr r0, _08023B04 @ =gAbsentBattlerFlags @@ -12699,7 +12699,7 @@ atk4A_typecalc2: @ 8023C38 movs r1, 0x9 orrs r0, r1 strb r0, [r2] - ldr r1, _08023CB4 @ =gUnknown_2023DA0 + ldr r1, _08023CB4 @ =gLastLandedMoves ldrb r0, [r7] lsls r0, 1 adds r0, r1 @@ -12718,7 +12718,7 @@ _08023CA4: .4byte gBattleMons _08023CA8: .4byte gBattlerTarget _08023CAC: .4byte gLastUsedAbility _08023CB0: .4byte gMoveResultFlags -_08023CB4: .4byte gUnknown_2023DA0 +_08023CB4: .4byte gLastLandedMoves _08023CB8: .4byte gBattleCommunication _08023CBC: ldr r0, _08023CC8 @ =gMoveResultFlags @@ -12730,13 +12730,13 @@ _08023CBC: .align 2, 0 _08023CC8: .4byte gMoveResultFlags _08023CCC: - ldr r1, _08023CD8 @ =gUnknown_824F050 + ldr r1, _08023CD8 @ =gTypeEffectiveness adds r0, r5, r1 ldrb r0, [r0] adds r6, r1, 0 b _08023D8E .align 2, 0 -_08023CD8: .4byte gUnknown_824F050 +_08023CD8: .4byte gTypeEffectiveness _08023CDC: adds r0, r5, r6 ldrb r0, [r0] @@ -12899,7 +12899,7 @@ _08023DF0: movs r1, 0x1 orrs r0, r1 strb r0, [r2] - ldr r1, _08023E78 @ =gUnknown_2023DA0 + ldr r1, _08023E78 @ =gLastLandedMoves mov r2, r8 ldrb r0, [r2] lsls r0, 1 @@ -12945,7 +12945,7 @@ _08023E68: .4byte gCurrentMove _08023E6C: .4byte gBattleMoves _08023E70: .4byte gLastUsedAbility _08023E74: .4byte gMoveResultFlags -_08023E78: .4byte gUnknown_2023DA0 +_08023E78: .4byte gLastLandedMoves _08023E7C: .4byte gBattleCommunication _08023E80: .4byte gProtectStructs _08023E84: .4byte gBattlescriptCurrInstr @@ -24813,7 +24813,7 @@ atkA6_settypetorandomresistance: @ 8029DAC mov r6, r9 mov r5, r8 push {r5-r7} - ldr r1, _08029E14 @ =gUnknown_2023DA0 + ldr r1, _08029E14 @ =gLastLandedMoves ldr r4, _08029E18 @ =gBattlerAttacker ldrb r0, [r4] lsls r0, 1 @@ -24830,7 +24830,7 @@ atkA6_settypetorandomresistance: @ 8029DAC cmp r0, 0 beq _08029E94 ldr r1, _08029E20 @ =gBattleMons - ldr r2, _08029E24 @ =gUnknown_2023DC0 + ldr r2, _08029E24 @ =gLastHitBy ldrb r0, [r4] adds r0, r2 ldrb r2, [r0] @@ -24860,11 +24860,11 @@ _08029DF6: str r1, [r3] b _08029F80 .align 2, 0 -_08029E14: .4byte gUnknown_2023DA0 +_08029E14: .4byte gLastLandedMoves _08029E18: .4byte gBattlerAttacker _08029E1C: .4byte 0x0000ffff _08029E20: .4byte gBattleMons -_08029E24: .4byte gUnknown_2023DC0 +_08029E24: .4byte gLastHitBy _08029E28: .4byte gBattlescriptCurrInstr _08029E2C: mov r0, r12 @@ -24931,7 +24931,7 @@ _08029E9C: bhi _08029E9C lsls r0, r4, 1 adds r4, r0, r4 - ldr r6, _08029F90 @ =gUnknown_824F050 + ldr r6, _08029F90 @ =gTypeEffectiveness adds r3, r4, r6 ldr r1, _08029F94 @ =gUnknown_2023DA8 ldr r2, _08029F98 @ =gBattlerAttacker @@ -24979,7 +24979,7 @@ _08029EF8: mov r8, r0 ldr r1, _08029FA4 @ =gBattlescriptCurrInstr mov r12, r1 - ldr r3, _08029F90 @ =gUnknown_824F050 + ldr r3, _08029F90 @ =gTypeEffectiveness adds r0, r4, 0x1 adds r0, r3 mov r9, r0 @@ -25050,7 +25050,7 @@ _08029F80: pop {r0} bx r0 .align 2, 0 -_08029F90: .4byte gUnknown_824F050 +_08029F90: .4byte gTypeEffectiveness _08029F94: .4byte gUnknown_2023DA8 _08029F98: .4byte gBattlerAttacker _08029F9C: .4byte gBattleMons diff --git a/data/data.s b/data/data.s index 0a2298a65..83621f378 100644 --- a/data/data.s +++ b/data/data.s @@ -233,7 +233,7 @@ gUnknown_824F020:: @ 824F020 gUnknown_824F048:: @ 824F048 .incbin "baserom.gba", 0x24F048, 0x8 -gUnknown_824F050:: @ 824F050 +gTypeEffectiveness:: @ 824F050 .incbin "baserom.gba", 0x24F050, 0x150 gUnknown_824F1A0:: @ 824F1A0 diff --git a/include/battle.h b/include/battle.h index cf975c6a5..e8731ddfb 100644 --- a/include/battle.h +++ b/include/battle.h @@ -175,9 +175,6 @@ struct TrainerMonNoItemDefaultMoves u16 species; }; -u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg); -u8 GetBattlerSide(u8 bank); - struct TrainerMonItemDefaultMoves { u16 iv; @@ -985,5 +982,7 @@ extern u8 gChosenMovePos; extern u8 gUnknown_3004FFC[MAX_BATTLERS_COUNT]; extern u8 gBattlerStatusSummaryTaskId[MAX_BATTLERS_COUNT]; extern u16 gDynamicBasePower; +extern u16 gLastLandedMoves[MAX_BATTLERS_COUNT]; +extern u8 gLastHitBy[MAX_BATTLERS_COUNT]; #endif // GUARD_BATTLE_H diff --git a/include/battle_2.h b/include/battle_2.h index e3caeee3d..19f59fc75 100644 --- a/include/battle_2.h +++ b/include/battle_2.h @@ -59,4 +59,6 @@ extern const u8 gStatusConditionString_LoveJpn[8]; extern const u8 * const gStatusConditionStringsTable[7][2]; +extern const u8 gTypeEffectiveness[336]; + #endif // GUARD_BATTLE_2_H diff --git a/ld_script.txt b/ld_script.txt index 7de54c40e..9d1ed1469 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -73,7 +73,7 @@ SECTIONS { asm/battle_controller_player.o(.text); src/battle_gfx_sfx_util.o(.text); src/battle_controller_opponent.o(.text); - asm/battle_ai_switch_items.o(.text); + src/battle_ai_switch_items.o(.text); asm/battle_controller_link_opponent.o(.text); src/pokemon.o(.text); src/trig.o(.text); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c new file mode 100644 index 000000000..6f059e9a5 --- /dev/null +++ b/src/battle_ai_switch_items.c @@ -0,0 +1,734 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "battle_controllers.h" +#include "pokemon.h" +#include "random.h" +#include "util.h" +#include "constants/abilities.h" +#include "constants/item_effects.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/species.h" +#include "constants/pokemon.h" + +static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng); +static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent); +static bool8 ShouldUseItem(void); + +static bool8 ShouldSwitchIfPerishSong(void) +{ + if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG + && gDisableStructs[gActiveBattler].perishSongTimer == 0) + { + *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = PARTY_SIZE; + BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); + return TRUE; + } + else + { + return FALSE; + } +} + +static bool8 ShouldSwitchIfWonderGuard(void) +{ + u8 opposingBattler; + u8 moveFlags; + s32 i, j; + u16 move; + + if(gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + return FALSE; + if (gBattleMons[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)].ability == ABILITY_WONDER_GUARD) + { + // Check if Pokemon has a super effective move. + for (opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), i = 0; i < MAX_MON_MOVES; ++i) + { + move = gBattleMons[gActiveBattler].moves[i]; + if (move == MOVE_NONE) + continue; + moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); + if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) + return FALSE; + } + // Find a Pokemon in the party that has a super effective move. + for (i = 0; i < PARTY_SIZE; ++i) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) + continue; + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE) + continue; + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + continue; + if (i == gBattlerPartyIndexes[gActiveBattler]) + continue; + GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); // Unused return value. + GetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM); // Unused return value. + + for (opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), j = 0; j < MAX_MON_MOVES; ++j) + { + move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j); + if (move == MOVE_NONE) + continue; + moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); + if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % 3 < 2) + { + // We found a mon. + *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = i; + BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); + return TRUE; + } + } + } + } + return FALSE; // There is not a single Pokemon in the party that has a super effective move against a mon with Wonder Guard. +} + +static bool8 FindMonThatAbsorbsOpponentsMove(void) +{ + u8 battlerIn1, battlerIn2; + u8 absorbingTypeAbility; + s32 i; + + if (HasSuperEffectiveMoveAgainstOpponents(TRUE) && Random() % 3) + return FALSE; + if (gLastLandedMoves[gActiveBattler] == MOVE_NONE) + return FALSE; + if (gLastLandedMoves[gActiveBattler] == 0xFFFF) + return FALSE; + if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0) + return FALSE; + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + battlerIn1 = gActiveBattler; + if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))]) + battlerIn2 = gActiveBattler; + else + battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))); + } + else + { + battlerIn1 = gActiveBattler; + battlerIn2 = gActiveBattler; + } + if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_FIRE) + absorbingTypeAbility = ABILITY_FLASH_FIRE; + else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_WATER) + absorbingTypeAbility = ABILITY_WATER_ABSORB; + else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_ELECTRIC) + absorbingTypeAbility = ABILITY_VOLT_ABSORB; + else + return FALSE; + if (gBattleMons[gActiveBattler].ability == absorbingTypeAbility) + return FALSE; + for (i = 0; i < PARTY_SIZE; ++i) + { + u16 species; + u8 monAbility; + + if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) + continue; + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE) + continue; + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + continue; + if (i == gBattlerPartyIndexes[battlerIn1]) + continue; + if (i == gBattlerPartyIndexes[battlerIn2]) + continue; + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) + continue; + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)) + continue; + species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); + if (GetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM) != ABILITY_NONE) + monAbility = gBaseStats[species].abilities[1]; + else + monAbility = gBaseStats[species].abilities[0]; + if (absorbingTypeAbility == monAbility && Random() & 1) + { + // we found a mon + *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = i; + BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); + return TRUE; + } + } + return FALSE; +} + +static bool8 ShouldSwitchIfNaturalCure(void) +{ + if (!(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)) + return FALSE; + if (gBattleMons[gActiveBattler].ability != ABILITY_NATURAL_CURE) + return FALSE; + if (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 2) + return FALSE; + if ((gLastLandedMoves[gActiveBattler] == MOVE_NONE || gLastLandedMoves[gActiveBattler] == 0xFFFF) && Random() & 1) + { + *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = PARTY_SIZE; + BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); + return TRUE; + } + else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0 && Random() & 1) + { + *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = PARTY_SIZE; + BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); + return TRUE; + } + if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_DOESNT_AFFECT_FOE, 1)) + return TRUE; + if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 1)) + return TRUE; + if (Random() & 1) + { + *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = PARTY_SIZE; + BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); + return TRUE; + } + return FALSE; +} + +static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng) +{ + u8 opposingBattler; + s32 i; + u8 moveFlags; + u16 move; + + opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + if (!(gAbsentBattlerFlags & gBitTable[opposingBattler])) + { + for (i = 0; i < MAX_MON_MOVES; ++i) + { + move = gBattleMons[gActiveBattler].moves[i]; + if (move == MOVE_NONE) + continue; + + moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); + if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) + { + if (noRng) + return TRUE; + if (Random() % 10 != 0) + return TRUE; + } + } + } + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + return FALSE; + opposingBattler = GetBattlerAtPosition(BATTLE_PARTNER(B_POSITION_PLAYER_LEFT)); + if (!(gAbsentBattlerFlags & gBitTable[opposingBattler])) + { + for (i = 0; i < MAX_MON_MOVES; ++i) + { + move = gBattleMons[gActiveBattler].moves[i]; + if (move == MOVE_NONE) + continue; + moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); + if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) + { + if (noRng) + return TRUE; + if (Random() % 10 != 0) + return TRUE; + } + } + } + return FALSE; +} + +static bool8 AreStatsRaised(void) +{ + u8 buffedStatsValue = 0; + s32 i; + + for (i = 0; i < NUM_BATTLE_STATS; ++i) + { + if (gBattleMons[gActiveBattler].statStages[i] > 6) + buffedStatsValue += gBattleMons[gActiveBattler].statStages[i] - 6; + } + return (buffedStatsValue > 3); +} + +static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) +{ + u8 battlerIn1, battlerIn2; + s32 i, j; + u16 move; + u8 moveFlags; + + if (gLastLandedMoves[gActiveBattler] == 0) + return FALSE; + if (gLastLandedMoves[gActiveBattler] == 0xFFFF) + return FALSE; + if (gLastHitBy[gActiveBattler] == 0xFF) + return FALSE; + if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0) + return FALSE; + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + battlerIn1 = gActiveBattler; + if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))]) + battlerIn2 = gActiveBattler; + else + battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))); + } + else + { + battlerIn1 = gActiveBattler; + battlerIn2 = gActiveBattler; + } + + for (i = 0; i < PARTY_SIZE; ++i) + { + u16 species; + u8 monAbility; + + if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) + continue; + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE) + continue; + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + continue; + if (i == gBattlerPartyIndexes[battlerIn1]) + continue; + if (i == gBattlerPartyIndexes[battlerIn2]) + continue; + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) + continue; + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)) + continue; + species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); + if (GetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM) != ABILITY_NONE) + monAbility = gBaseStats[species].abilities[1]; + else + monAbility = gBaseStats[species].abilities[0]; + moveFlags = AI_TypeCalc(gLastLandedMoves[gActiveBattler], species, monAbility); + if (moveFlags & flags) + { + battlerIn1 = gLastHitBy[gActiveBattler]; + for (j = 0; j < MAX_MON_MOVES; ++j) + { + move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j); + if (move == MOVE_NONE) + continue; + moveFlags = AI_TypeCalc(move, gBattleMons[battlerIn1].species, gBattleMons[battlerIn1].ability); + if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % moduloPercent == 0) + { + *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = i; + BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); + return TRUE; + } + } + } + } + return FALSE; +} + +static bool8 ShouldSwitch(void) +{ + u8 battlerIn1, battlerIn2; + s32 i; + s32 availableToSwitch; + + if (gBattleMons[gActiveBattler].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + return FALSE; + if (gStatuses3[gActiveBattler] & STATUS3_ROOTED) + return FALSE; + if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_SHADOW_TAG, 0, 0)) + return FALSE; + if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_ARENA_TRAP, 0, 0)) + return FALSE; // misses the flying or levitate check + if (AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MAGNET_PULL, 0, 0)) + { + if (gBattleMons[gActiveBattler].type1 == TYPE_STEEL) + return FALSE; + if (gBattleMons[gActiveBattler].type2 == TYPE_STEEL) + return FALSE; + } + availableToSwitch = 0; + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + battlerIn1 = gActiveBattler; + if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]) + battlerIn2 = gActiveBattler; + else + battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK); + } + else + { + battlerIn2 = gActiveBattler; + battlerIn1 = gActiveBattler; + } + for (i = 0; i < PARTY_SIZE; ++i) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) + continue; + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE) + continue; + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) + continue; + if (i == gBattlerPartyIndexes[battlerIn1]) + continue; + if (i == gBattlerPartyIndexes[battlerIn2]) + continue; + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) + continue; + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)) + continue; + ++availableToSwitch; + } + if (!availableToSwitch) + return FALSE; + if (ShouldSwitchIfPerishSong()) + return TRUE; + if (ShouldSwitchIfWonderGuard()) + return TRUE; + if (FindMonThatAbsorbsOpponentsMove()) + return TRUE; + if (ShouldSwitchIfNaturalCure()) + return TRUE; + if (HasSuperEffectiveMoveAgainstOpponents(FALSE)) + return FALSE; + if (AreStatsRaised()) + return FALSE; + if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_DOESNT_AFFECT_FOE, 2) + || FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 3)) + return TRUE; + return FALSE; +} + +void AI_TrySwitchOrUseItem(void) +{ + u8 battlerIn1, battlerIn2; + + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + if (ShouldSwitch()) + { + if (*(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) == 6) + { + s32 monToSwitchId = GetMostSuitableMonToSwitchInto(); + if (monToSwitchId == 6) + { + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + battlerIn2 = battlerIn1; + } + else + { + battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + battlerIn2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + } + + for (monToSwitchId = 0; monToSwitchId < PARTY_SIZE; ++monToSwitchId) + { + if (GetMonData(&gEnemyParty[monToSwitchId], MON_DATA_HP) == 0) + continue; + if (monToSwitchId == gBattlerPartyIndexes[battlerIn1]) + continue; + if (monToSwitchId == gBattlerPartyIndexes[battlerIn2]) + continue; + if (monToSwitchId == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) + continue; + if (monToSwitchId == *(gBattleStruct->monToSwitchIntoId + battlerIn2)) + continue; + break; + } + } + *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)) = monToSwitchId; + } + *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = *(gBattleStruct->AI_monToSwitchIntoId + (GetBattlerPosition(gActiveBattler) >> 1)); + return; + } + else if (ShouldUseItem()) + { + return; + } + } + BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, (gActiveBattler ^ BIT_SIDE) << 8); +} + +static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8 *var) +{ + s32 i = 0; + + while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE) + { + if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT) + { + i += 3; + continue; + } + else if (TYPE_EFFECT_ATK_TYPE(i) == atkType) + { + // Check type1. + if (TYPE_EFFECT_DEF_TYPE(i) == defType1) + *var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10; + // Check type2. + if (TYPE_EFFECT_DEF_TYPE(i) == defType2 && defType1 != defType2) + *var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10; + } + i += 3; + } +} + +u8 GetMostSuitableMonToSwitchInto(void) +{ + u8 opposingBattler; + u8 bestDmg; // Note : should be changed to u32 for obvious reasons. + u8 bestMonId; + u8 battlerIn1, battlerIn2; + s32 i, j; + u8 invalidMons; + u16 move; + + if (*(gBattleStruct->monToSwitchIntoId + gActiveBattler) != PARTY_SIZE) + return *(gBattleStruct->monToSwitchIntoId + gActiveBattler); + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + battlerIn1 = gActiveBattler; + if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]) + battlerIn2 = gActiveBattler; + else + battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK); + // UB: It considers the opponent only player's side even though it can battle alongside player. + opposingBattler = Random() & BIT_FLANK; + if (gAbsentBattlerFlags & gBitTable[opposingBattler]) + opposingBattler ^= BIT_FLANK; + } + else + { + opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + battlerIn1 = gActiveBattler; + battlerIn2 = gActiveBattler; + } + invalidMons = 0; + while (invalidMons != 0x3F) // All mons are invalid. + { + bestDmg = 0; + bestMonId = 6; + // Find the mon whose type is the most suitable offensively. + for (i = 0; i < PARTY_SIZE; ++i) + { + u16 species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); + if (species != SPECIES_NONE + && GetMonData(&gEnemyParty[i], MON_DATA_HP) != 0 + && !(gBitTable[i] & invalidMons) + && gBattlerPartyIndexes[battlerIn1] != i + && gBattlerPartyIndexes[battlerIn2] != i + && i != *(gBattleStruct->monToSwitchIntoId + battlerIn1) + && i != *(gBattleStruct->monToSwitchIntoId + battlerIn2)) + { + u8 type1 = gBaseStats[species].type1; + u8 type2 = gBaseStats[species].type2; + u8 typeDmg = 10; + ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type1, type1, type2, &typeDmg); + ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type2, type1, type2, &typeDmg); + if (bestDmg < typeDmg) + { + bestDmg = typeDmg; + bestMonId = i; + } + } + else + { + invalidMons |= gBitTable[i]; + } + } + // Ok, we know the mon has the right typing but does it have at least one super effective move? + if (bestMonId != PARTY_SIZE) + { + for (i = 0; i < MAX_MON_MOVES; ++i) + { + move = GetMonData(&gEnemyParty[bestMonId], MON_DATA_MOVE1 + i); + if (move != MOVE_NONE && TypeCalc(move, gActiveBattler, opposingBattler) & MOVE_RESULT_SUPER_EFFECTIVE) + break; + } + if (i != MAX_MON_MOVES) + return bestMonId; // Has both the typing and at least one super effective move. + + invalidMons |= gBitTable[bestMonId]; // Sorry buddy, we want something better. + } + else + { + invalidMons = 0x3F; // No viable mon to switch. + } + } + gDynamicBasePower = 0; + gBattleStruct->dynamicMoveType = 0; + gBattleScripting.dmgMultiplier = 1; + gMoveResultFlags = 0; + gCritMultiplier = 1; + bestDmg = 0; + bestMonId = 6; + // If we couldn't find the best mon in terms of typing, find the one that deals most damage. + for (i = 0; i < PARTY_SIZE; ++i) + { + if ((u16)(GetMonData(&gEnemyParty[i], MON_DATA_SPECIES)) == SPECIES_NONE) + continue; + if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) + continue; + if (gBattlerPartyIndexes[battlerIn1] == i) + continue; + if (gBattlerPartyIndexes[battlerIn2] == i) + continue; + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) + continue; + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)) + continue; + for (j = 0; j < MAX_MON_MOVES; ++j) + { + move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j); + gBattleMoveDamage = 0; + if (move != MOVE_NONE && gBattleMoves[move].power != 1) + { + AI_CalcDmg(gActiveBattler, opposingBattler); + TypeCalc(move, gActiveBattler, opposingBattler); + } + if (bestDmg < gBattleMoveDamage) + { + bestDmg = gBattleMoveDamage; + bestMonId = i; + } + } + } + return bestMonId; +} + +static u8 GetAI_ItemType(u8 itemId, const u8 *itemEffect) // NOTE: should take u16 as item Id argument +{ + if (itemId == ITEM_FULL_RESTORE) + return AI_ITEM_FULL_RESTORE; + else if (itemEffect[4] & ITEM4_HEAL_HP) + return AI_ITEM_HEAL_HP; + else if (itemEffect[3] & ITEM3_STATUS_ALL) + return AI_ITEM_CURE_CONDITION; + else if (itemEffect[0] & (ITEM0_HIGH_CRIT | ITEM0_X_ATTACK) || itemEffect[1] != 0 || itemEffect[2] != 0) + return AI_ITEM_X_STAT; + else if (itemEffect[3] & ITEM3_MIST) + return AI_ITEM_GUARD_SPECS; + else + return AI_ITEM_NOT_RECOGNIZABLE; +} + +static bool8 ShouldUseItem(void) +{ + s32 i; + u8 validMons = 0; + bool8 shouldUse = FALSE; + + for (i = 0; i < PARTY_SIZE; ++i) + if (GetMonData(&gEnemyParty[i], MON_DATA_HP) != 0 + && GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) != SPECIES_NONE + && GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) != SPECIES_EGG) + ++validMons; + for (i = 0; i < MAX_MON_MOVES; ++i) + { + u16 item; + const u8 *itemEffects; + u8 paramOffset; + u8 battlerSide; + + if (i && validMons > (gBattleResources->battleHistory->itemsNo - i) + 1) + continue; + item = gBattleResources->battleHistory->trainerItems[i]; + if (item == ITEM_NONE) + continue; + if (gItemEffectTable[item - ITEM_POTION] == NULL) + continue; + if (item == ITEM_ENIGMA_BERRY) + itemEffects = gSaveBlock1Ptr->enigmaBerry.itemEffect; + else + itemEffects = gItemEffectTable[item - ITEM_POTION]; + *(gBattleStruct->AI_itemType + gActiveBattler / 2) = GetAI_ItemType(item, itemEffects); + switch (*(gBattleStruct->AI_itemType + gActiveBattler / 2)) + { + case AI_ITEM_FULL_RESTORE: + if (gBattleMons[gActiveBattler].hp >= gBattleMons[gActiveBattler].maxHP / 4) + break; + if (gBattleMons[gActiveBattler].hp == 0) + break; + shouldUse = TRUE; + break; + case AI_ITEM_HEAL_HP: + paramOffset = GetItemEffectParamOffset(item, 4, 4); + if (paramOffset == 0) + break; + if (gBattleMons[gActiveBattler].hp == 0) + break; + if (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 4 || gBattleMons[gActiveBattler].maxHP - gBattleMons[gActiveBattler].hp > itemEffects[paramOffset]) + shouldUse = TRUE; + break; + case AI_ITEM_CURE_CONDITION: + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0; + if (itemEffects[3] & ITEM3_SLEEP && gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) + { + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20; + shouldUse = TRUE; + } + if (itemEffects[3] & ITEM3_POISON && (gBattleMons[gActiveBattler].status1 & STATUS1_POISON || gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON)) + { + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x10; + shouldUse = TRUE; + } + if (itemEffects[3] & ITEM3_BURN && gBattleMons[gActiveBattler].status1 & STATUS1_BURN) + { + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8; + shouldUse = TRUE; + } + if (itemEffects[3] & ITEM3_FREEZE && gBattleMons[gActiveBattler].status1 & STATUS1_FREEZE) + { + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4; + shouldUse = TRUE; + } + if (itemEffects[3] & ITEM3_PARALYSIS && gBattleMons[gActiveBattler].status1 & STATUS1_PARALYSIS) + { + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2; + shouldUse = TRUE; + } + if (itemEffects[3] & ITEM3_CONFUSION && gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION) + { + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1; + shouldUse = TRUE; + } + break; + case AI_ITEM_X_STAT: + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0; + if (!gDisableStructs[gActiveBattler].isFirstTurn) + break; + if (itemEffects[0] & ITEM0_X_ATTACK) + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1; + if (itemEffects[1] & ITEM1_X_DEFEND) + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2; + if (itemEffects[1] & ITEM1_X_SPEED) + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4; + if (itemEffects[2] & ITEM2_X_SPATK) + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8; + if (itemEffects[2] & ITEM2_X_ACCURACY) + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20; + if (itemEffects[0] & ITEM0_HIGH_CRIT) + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x80; + shouldUse = TRUE; + break; + case AI_ITEM_GUARD_SPECS: + battlerSide = GetBattlerSide(gActiveBattler); + if (gDisableStructs[gActiveBattler].isFirstTurn && gSideTimers[battlerSide].mistTimer == 0) + shouldUse = TRUE; + break; + case AI_ITEM_NOT_RECOGNIZABLE: + return FALSE; + } + if (shouldUse) + { + BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0); + *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2) = item; + gBattleResources->battleHistory->trainerItems[i] = 0; + return shouldUse; + } + } + return FALSE; +} diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 535715999..cd0cc70ad 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -1439,7 +1439,7 @@ static void OpponentHandleChoosePokemon(void) battler1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); battler2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } - for (chosenMonId = 0; chosenMonId < 6; ++chosenMonId) + for (chosenMonId = 0; chosenMonId < PARTY_SIZE; ++chosenMonId) if (GetMonData(&gEnemyParty[chosenMonId], MON_DATA_HP) != 0 && chosenMonId != gBattlerPartyIndexes[battler1] && chosenMonId != gBattlerPartyIndexes[battler2]) diff --git a/sym_ewram.txt b/sym_ewram.txt index 3e7e1e6de..7505da54b 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -291,7 +291,7 @@ gUnknown_2023D90: @ 2023D90 gLastMoves: @ 2023D98 .space 0x8 -gUnknown_2023DA0: @ 2023DA0 +gLastLandedMoves: @ 2023DA0 .space 0x8 gUnknown_2023DA8: @ 2023DA8 @@ -303,7 +303,7 @@ gUnknown_2023DB0: @ 2023DB0 gUnknown_2023DB8: @ 2023DB8 .space 0x8 -gUnknown_2023DC0: @ 2023DC0 +gLastHitBy: @ 2023DC0 .space 0x4 gChosenMoveByBattler: @ 2023DC4 |