summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiangzhengwenjz <jiangzhengwenjzw@qq.com>2019-08-03 23:59:41 +0800
committerjiangzhengwenjz <jiangzhengwenjzw@qq.com>2019-08-03 23:59:41 +0800
commit5568895b043dc37e95be0e99787541d78a7c6fee (patch)
tree719b85960d6e9c7b8add6a141fa503925290a5c9
parent8fed9a5f205cec0d86149a908d64f73316cbb1f4 (diff)
ported battle_ai_switch_items from pokeem
-rw-r--r--asm/battle_2.s28
-rw-r--r--asm/battle_ai_switch_items.s2654
-rw-r--r--asm/battle_script_commands.s88
-rw-r--r--data/data.s2
-rw-r--r--include/battle.h5
-rw-r--r--include/battle_2.h2
-rw-r--r--ld_script.txt2
-rw-r--r--src/battle_ai_switch_items.c734
-rw-r--r--src/battle_controller_opponent.c2
-rw-r--r--sym_ewram.txt4
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