summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCameron Hall <camthesaxman@users.noreply.github.com>2016-11-06 03:09:06 -0600
committerYamaArashi <YamaArashi@users.noreply.github.com>2016-11-06 01:09:06 -0800
commit74b660f22f5a7d23f01a1766127cfd9a47290132 (patch)
tree0aac6d739187faf99b7da5e560fe74ef35e657a4
parent865f6f6f4fa30460d4a793872e8b6654534bb573 (diff)
start decompiling battle_ai.c (#92)
-rw-r--r--asm/battle_ai.s583
-rw-r--r--include/battle.h19
-rw-r--r--include/pokemon.h67
-rw-r--r--ld_script.txt1
-rw-r--r--shared_syms.txt4
-rw-r--r--src/battle_ai.c285
-rw-r--r--src/battle_setup.c16
7 files changed, 344 insertions, 631 deletions
diff --git a/asm/battle_ai.s b/asm/battle_ai.s
index d8eafc314..3efe87815 100644
--- a/asm/battle_ai.s
+++ b/asm/battle_ai.s
@@ -6,589 +6,6 @@
.text
- thumb_func_start sub_81070D4
-sub_81070D4: @ 81070D4
- push {r4-r7,lr}
- ldr r2, _08107144 @ =0x02016a00
- movs r3, 0
- ldr r4, _08107148 @ =gUnknown_020239F8
- movs r1, 0
-_081070DE:
- adds r0, r2, r3
- strb r1, [r0]
- adds r3, 0x1
- cmp r3, 0x2F
- bls _081070DE
- ldrh r2, [r4]
- movs r0, 0x8
- ands r0, r2
- cmp r0, 0
- beq _08107138
- ldr r5, _0810714C @ =gTrainerBattleOpponent
- ldrh r1, [r5]
- movs r0, 0x80
- lsls r0, 3
- cmp r1, r0
- beq _08107138
- ldr r0, _08107150 @ =0x00000982
- ands r0, r2
- cmp r0, 0
- bne _08107138
- movs r3, 0
- ldr r7, _08107154 @ =gTrainers + 0x10
- ldr r4, _08107158 @ =0x02016a2c
- adds r6, r4, 0
- subs r6, 0x8
-_08107110:
- lsls r2, r3, 1
- ldrh r1, [r5]
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- adds r2, r0
- adds r2, r7
- ldrh r2, [r2]
- cmp r2, 0
- beq _08107132
- ldrb r0, [r4]
- lsls r0, 1
- adds r0, r6
- strh r2, [r0]
- ldrb r0, [r4]
- adds r0, 0x1
- strb r0, [r4]
-_08107132:
- adds r3, 0x1
- cmp r3, 0x3
- ble _08107110
-_08107138:
- bl sub_810715C
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08107144: .4byte 0x02016a00
-_08107148: .4byte gUnknown_020239F8
-_0810714C: .4byte gTrainerBattleOpponent
-_08107150: .4byte 0x00000982
-_08107154: .4byte gTrainers + 0x10
-_08107158: .4byte 0x02016a2c
- thumb_func_end sub_81070D4
-
- thumb_func_start sub_810715C
-sub_810715C: @ 810715C
- push {r4-r7,lr}
- ldr r2, _08107204 @ =0x02016800
- movs r4, 0
- ldr r3, _08107208 @ =gUnknown_02024A60
- movs r1, 0
-_08107166:
- adds r0, r2, r4
- strb r1, [r0]
- adds r4, 0x1
- cmp r4, 0x1B
- bls _08107166
- ldr r0, _08107204 @ =0x02016800
- movs r1, 0x64
- movs r4, 0x3
- adds r0, 0x7
-_08107178:
- strb r1, [r0]
- subs r0, 0x1
- subs r4, 0x1
- cmp r4, 0
- bge _08107178
- ldrb r0, [r3]
- movs r1, 0
- movs r2, 0xFF
- bl sub_8015A98
- lsls r0, 24
- lsrs r7, r0, 24
- movs r4, 0
- ldr r0, _08107204 @ =0x02016800
- adds r5, r0, 0x4
- ldr r6, _0810720C @ =gBitTable
-_08107198:
- ldr r0, [r6]
- ands r0, r7
- cmp r0, 0
- beq _081071A4
- movs r0, 0
- strb r0, [r5]
-_081071A4:
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0xF
- ands r0, r1
- movs r1, 0x64
- subs r1, r0
- strb r1, [r5, 0x14]
- adds r5, 0x1
- adds r6, 0x4
- adds r4, 0x1
- cmp r4, 0x3
- ble _08107198
- ldr r0, _08107210 @ =0x02016c00
- adds r0, 0x20
- movs r1, 0
- strb r1, [r0]
- ldr r1, _08107214 @ =gUnknown_02024C07
- ldr r0, _08107208 @ =gUnknown_02024A60
- ldrb r2, [r0]
- strb r2, [r1]
- ldr r0, _08107218 @ =gUnknown_020239F8
- ldrh r1, [r0]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- beq _08107224
- ldr r4, _0810721C @ =gUnknown_02024C08
- bl Random
- movs r5, 0x2
- ands r0, r5
- strb r0, [r4]
- ldr r0, _08107220 @ =gUnknown_02024C0C
- ldrb r1, [r0]
- ldr r2, _0810720C @ =gBitTable
- ldrb r3, [r4]
- lsls r0, r3, 2
- adds r0, r2
- ldr r0, [r0]
- ands r1, r0
- cmp r1, 0
- beq _0810722C
- eors r3, r5
- strb r3, [r4]
- b _0810722C
- .align 2, 0
-_08107204: .4byte 0x02016800
-_08107208: .4byte gUnknown_02024A60
-_0810720C: .4byte gBitTable
-_08107210: .4byte 0x02016c00
-_08107214: .4byte gUnknown_02024C07
-_08107218: .4byte gUnknown_020239F8
-_0810721C: .4byte gUnknown_02024C08
-_08107220: .4byte gUnknown_02024C0C
-_08107224:
- ldr r0, _08107244 @ =gUnknown_02024C08
- movs r1, 0x1
- eors r1, r2
- strb r1, [r0]
-_0810722C:
- ldr r0, _08107248 @ =gUnknown_020239F8
- ldrh r1, [r0]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- beq _08107250
- ldr r1, _0810724C @ =0x02016800
- movs r0, 0x80
- lsls r0, 23
- str r0, [r1, 0xC]
- b _08107296
- .align 2, 0
-_08107244: .4byte gUnknown_02024C08
-_08107248: .4byte gUnknown_020239F8
-_0810724C: .4byte 0x02016800
-_08107250:
- movs r0, 0x80
- lsls r0, 3
- ands r0, r1
- cmp r0, 0
- beq _08107268
- ldr r1, _08107264 @ =0x02016800
- movs r0, 0x80
- lsls r0, 22
- str r0, [r1, 0xC]
- b _08107296
- .align 2, 0
-_08107264: .4byte 0x02016800
-_08107268:
- movs r0, 0x10
- ands r0, r1
- cmp r0, 0
- beq _08107280
- ldr r1, _0810727C @ =0x02016800
- movs r0, 0x80
- lsls r0, 24
- str r0, [r1, 0xC]
- b _08107296
- .align 2, 0
-_0810727C: .4byte 0x02016800
-_08107280:
- ldr r3, _0810729C @ =0x02016800
- ldr r2, _081072A0 @ =gTrainers
- ldr r0, _081072A4 @ =gTrainerBattleOpponent
- ldrh r1, [r0]
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- adds r2, 0x1C
- adds r0, r2
- ldr r0, [r0]
- str r0, [r3, 0xC]
-_08107296:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0810729C: .4byte 0x02016800
-_081072A0: .4byte gTrainers
-_081072A4: .4byte gTrainerBattleOpponent
- thumb_func_end sub_810715C
-
- thumb_func_start sub_81072A8
-sub_81072A8: @ 81072A8
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x8
- bl sub_810745C
- ldr r1, _081072F4 @ =0x02016800
- ldr r0, [r1, 0xC]
- cmp r0, 0
- beq _081072E2
- adds r4, r1, 0
- movs r5, 0
-_081072C0:
- ldr r0, [r4, 0xC]
- movs r1, 0x1
- ands r0, r1
- cmp r0, 0
- beq _081072D0
- strb r5, [r4]
- bl sub_8107374
-_081072D0:
- ldr r1, [r4, 0xC]
- lsrs r1, 1
- str r1, [r4, 0xC]
- ldrb r0, [r4, 0x11]
- adds r0, 0x1
- strb r0, [r4, 0x11]
- strb r5, [r4, 0x1]
- cmp r1, 0
- bne _081072C0
-_081072E2:
- ldr r7, _081072F4 @ =0x02016800
- ldrb r1, [r7, 0x10]
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- beq _081072F8
- movs r0, 0x4
- b _08107368
- .align 2, 0
-_081072F4: .4byte 0x02016800
-_081072F8:
- movs r0, 0x4
- ands r0, r1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0
- beq _08107308
- movs r0, 0x5
- b _08107368
-_08107308:
- movs r5, 0x1
- mov r0, sp
- ldrb r1, [r7, 0x4]
- strb r1, [r0]
- add r0, sp, 0x4
- strb r2, [r0]
- movs r3, 0x1
- mov r8, r0
- mov r4, sp
- mov r6, r8
- adds r2, r7, 0x5
-_0810731E:
- ldrb r1, [r4]
- movs r0, 0
- ldrsb r0, [r2, r0]
- cmp r1, r0
- bge _08107330
- movs r5, 0x1
- ldrb r0, [r2]
- strb r0, [r4]
- strb r3, [r6]
-_08107330:
- ldrb r1, [r4]
- movs r0, 0
- ldrsb r0, [r2, r0]
- cmp r1, r0
- bne _0810734E
- mov r0, sp
- adds r1, r0, r5
- ldrb r0, [r2]
- strb r0, [r1]
- adds r1, r5, 0
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- adds r1, r6, r1
- strb r3, [r1]
-_0810734E:
- adds r2, 0x1
- adds r3, 0x1
- cmp r3, 0x3
- ble _0810731E
- bl Random
- lsls r0, 16
- lsrs r0, 16
- adds r1, r5, 0
- bl __modsi3
- add r0, r8
- ldrb r0, [r0]
-_08107368:
- add sp, 0x8
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_81072A8
-
- thumb_func_start sub_8107374
-sub_8107374: @ 8107374
- push {r4-r7,lr}
- ldr r1, _081073D0 @ =0x02016800
- ldrb r0, [r1]
- adds r6, r1, 0
- cmp r0, 0x2
- beq _08107456
- adds r4, r1, 0
- ldr r7, _081073D4 @ =gUnknown_02039238
-_08107384:
- ldrb r0, [r4]
- cmp r0, 0x1
- beq _081073E4
- cmp r0, 0x1
- bgt _0810744E
- cmp r0, 0
- bne _0810744E
- ldr r1, _081073D8 @ =BattleAIs
- ldrb r0, [r4, 0x11]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- str r0, [r7]
- ldr r5, _081073DC @ =gBattleMons
- ldrb r3, [r4, 0x1]
- ldr r0, _081073E0 @ =gUnknown_02024C07
- ldrb r1, [r0]
- movs r0, 0x58
- adds r2, r1, 0
- muls r2, r0
- adds r0, r3, r2
- adds r1, r5, 0
- adds r1, 0x24
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0
- beq _081073C6
- lsls r0, r3, 1
- adds r0, r2
- adds r1, r5, 0
- adds r1, 0xC
- adds r0, r1
- ldrh r0, [r0]
-_081073C6:
- strh r0, [r4, 0x2]
- ldrb r0, [r4]
- adds r0, 0x1
- strb r0, [r4]
- b _0810744E
- .align 2, 0
-_081073D0: .4byte 0x02016800
-_081073D4: .4byte gUnknown_02039238
-_081073D8: .4byte BattleAIs
-_081073DC: .4byte gBattleMons
-_081073E0: .4byte gUnknown_02024C07
-_081073E4:
- ldrh r1, [r1, 0x2]
- cmp r1, 0
- beq _08107400
- ldr r1, _081073FC @ =gBattleAICmdTable
- ldr r0, [r7]
- ldrb r0, [r0]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- bl _call_via_r0
- b _08107410
- .align 2, 0
-_081073FC: .4byte gBattleAICmdTable
-_08107400:
- adds r0, r4, 0x4
- ldrb r2, [r4, 0x1]
- adds r0, r2
- strb r1, [r0]
- ldrb r1, [r4, 0x10]
- movs r0, 0x1
- orrs r0, r1
- strb r0, [r4, 0x10]
-_08107410:
- ldr r1, _0810743C @ =0x02016800
- ldrb r2, [r1, 0x10]
- movs r0, 0x1
- ands r0, r2
- adds r6, r1, 0
- cmp r0, 0
- beq _0810744E
- ldrb r0, [r6, 0x1]
- adds r0, 0x1
- strb r0, [r6, 0x1]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x3
- bhi _08107440
- movs r0, 0x8
- ands r0, r2
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0
- bne _08107440
- strb r0, [r6]
- b _08107446
- .align 2, 0
-_0810743C: .4byte 0x02016800
-_08107440:
- ldrb r0, [r4]
- adds r0, 0x1
- strb r0, [r4]
-_08107446:
- ldrb r1, [r4, 0x10]
- movs r0, 0xFE
- ands r0, r1
- strb r0, [r4, 0x10]
-_0810744E:
- adds r1, r6, 0
- ldrb r0, [r1]
- cmp r0, 0x2
- bne _08107384
-_08107456:
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_8107374
-
- thumb_func_start sub_810745C
-sub_810745C: @ 810745C
- push {r4-r6,lr}
- movs r2, 0
- ldr r3, _08107488 @ =gUnknown_02024C08
- ldr r5, _0810748C @ =0x02016a00
- ldr r6, _08107490 @ =gUnknown_02024C34
- adds r4, r3, 0
-_08107468:
- lsls r0, r2, 1
- ldrb r1, [r4]
- lsrs r1, 1
- lsls r1, 4
- adds r0, r1
- adds r1, r0, r5
- ldrh r0, [r1]
- cmp r0, 0
- bne _08107494
- ldrb r0, [r3]
- lsls r0, 1
- adds r0, r6
- ldrh r0, [r0]
- strh r0, [r1]
- b _0810749A
- .align 2, 0
-_08107488: .4byte gUnknown_02024C08
-_0810748C: .4byte 0x02016a00
-_08107490: .4byte gUnknown_02024C34
-_08107494:
- adds r2, 0x1
- cmp r2, 0x7
- ble _08107468
-_0810749A:
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end sub_810745C
-
- thumb_func_start unref_sub_81074A0
-unref_sub_81074A0: @ 81074A0
- push {lr}
- lsls r0, 24
- ldr r1, _081074C0 @ =0x02016a00
- lsrs r0, 25
- movs r2, 0x7
- lsls r0, 4
- adds r0, r1
- adds r0, 0xE
- movs r1, 0
-_081074B2:
- strh r1, [r0]
- subs r0, 0x2
- subs r2, 0x1
- cmp r2, 0
- bge _081074B2
- pop {r0}
- bx r0
- .align 2, 0
-_081074C0: .4byte 0x02016a00
- thumb_func_end unref_sub_81074A0
-
- thumb_func_start sub_81074C4
-sub_81074C4: @ 81074C4
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r1, 24
- lsrs r5, r1, 24
- adds r0, r4, 0
- bl battle_side_get_owner
- lsls r0, 24
- cmp r0, 0
- bne _081074EC
- adds r0, r4, 0
- bl battle_get_per_side_status
- ldr r2, _081074F4 @ =0x02016a00
- movs r1, 0x1
- ands r1, r0
- adds r2, 0x20
- adds r1, r2
- strb r5, [r1]
-_081074EC:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_081074F4: .4byte 0x02016a00
- thumb_func_end sub_81074C4
-
- thumb_func_start sub_81074F8
-sub_81074F8: @ 81074F8
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r1, 24
- lsrs r5, r1, 24
- adds r0, r4, 0
- bl battle_side_get_owner
- lsls r0, 24
- cmp r0, 0
- bne _08107520
- adds r0, r4, 0
- bl battle_get_per_side_status
- ldr r2, _08107528 @ =0x02016a00
- movs r1, 0x1
- ands r1, r0
- adds r2, 0x22
- adds r1, r2
- strb r5, [r1]
-_08107520:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08107528: .4byte 0x02016a00
- thumb_func_end sub_81074F8
-
thumb_func_start BattleAICmd_if_random
BattleAICmd_if_random: @ 810752C
push {lr}
diff --git a/include/battle.h b/include/battle.h
new file mode 100644
index 000000000..06daeb081
--- /dev/null
+++ b/include/battle.h
@@ -0,0 +1,19 @@
+#ifndef GUARD_BATTLE_H
+#define GUARD_BATTLE_H
+
+struct Trainer
+{
+ /*0x00*/ u8 partyFlags;
+ /*0x01*/ u8 trainerClass;
+ /*0x02*/ u8 encounterMusic:7;
+ /*0x02*/ u8 gender:1;
+ /*0x03*/ u8 trainerPic;
+ /*0x04*/ u8 trainerName[12];
+ /*0x10*/ u16 items[4];
+ /*0x18*/ bool8 doubleBattle;
+ /*0x1C*/ u32 aiFlags;
+ /*0x20*/ u8 partySize;
+ /*0x24*/ void *party;
+};
+
+#endif // GUARD_BATTLE_H
diff --git a/include/pokemon.h b/include/pokemon.h
index 219447f8f..a1042b0c0 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -242,39 +242,40 @@ struct UnknownPokemonStruct
struct BattlePokemon
{
- u16 species;
- u16 attack;
- u16 defense;
- u16 speed;
- u16 spAttack;
- u16 spDefense;
- u16 moves[4];
- u32 hpIV:5;
- u32 attackIV:5;
- u32 defenseIV:5;
- u32 speedIV:5;
- u32 spAttackIV:5;
- u32 spDefenseIV:5;
- u32 isEgg:1;
- u32 altAbility:1;
- s8 statStages[8];
- u8 ability;
- u8 type1, type2;
- u8 unknown;
- u8 pp[4];
- u16 hp;
- u8 level;
- u8 friendship;
- u16 maxHP;
- u16 item;
- u8 nickname[POKEMON_NAME_LENGTH + 1];
- u8 ppBonuses;
- u8 otName[8];
- u32 experience;
- u32 personality;
- u32 status1;
- u32 status2;
- u32 otId;
+ /*0x00*/ u16 species;
+ /*0x02*/ u16 attack;
+ /*0x04*/ u16 defense;
+ /*0x06*/ u16 speed;
+ /*0x08*/ u16 spAttack;
+ /*0x0A*/ u16 spDefense;
+ /*0x0C*/ u16 moves[4];
+ /*0x14*/ u32 hpIV:5;
+ u32 attackIV:5;
+ u32 defenseIV:5;
+ u32 speedIV:5;
+ u32 spAttackIV:5;
+ u32 spDefenseIV:5;
+ u32 isEgg:1;
+ u32 altAbility:1;
+ /*0x18*/ s8 statStages[8];
+ /*0x20*/ u8 ability;
+ /*0x21*/ u8 type1;
+ /*0x22*/ u8 type2;
+ /*0x23*/ u8 unknown;
+ /*0x24*/ u8 pp[4];
+ /*0x28*/ u16 hp;
+ /*0x2A*/ u8 level;
+ /*0x2B*/ u8 friendship;
+ /*0x2C*/ u16 maxHP;
+ /*0x2E*/ u16 item;
+ /*0x30*/ u8 nickname[POKEMON_NAME_LENGTH + 1];
+ /*0x3B*/ u8 ppBonuses;
+ /*0x3C*/ u8 otName[8];
+ /*0x44*/ u32 experience;
+ /*0x48*/ u32 personality;
+ /*0x4C*/ u32 status1;
+ /*0x50*/ u32 status2;
+ /*0x54*/ u32 otId;
};
struct BaseStats
diff --git a/ld_script.txt b/ld_script.txt
index 0e6b4bc8e..730b534c1 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -154,6 +154,7 @@ SECTIONS {
asm/decoration.o(.text);
asm/slot_machine.o(.text);
asm/contest_painting.o(.text);
+ src/battle_ai.o(.text);
asm/battle_ai.o(.text);
asm/trader.o(.text);
src/starter_choose.o(.text);
diff --git a/shared_syms.txt b/shared_syms.txt
index 0b7f77da8..bc187a1ea 100644
--- a/shared_syms.txt
+++ b/shared_syms.txt
@@ -8,6 +8,10 @@ unk_2008000 = 0x2008000;
unk_20160BC = 0x20160BC;
+unk_2016800 = 0x2016800;
+unk_2016A00 = 0x2016A00;
+unk_2016C00 = 0x2016C00;
+
gSecretBaseRecord = 0x2017000;
dword_2017100 = 0x2017100;
diff --git a/src/battle_ai.c b/src/battle_ai.c
new file mode 100644
index 000000000..b9002e5bb
--- /dev/null
+++ b/src/battle_ai.c
@@ -0,0 +1,285 @@
+#include "global.h"
+#include "battle.h"
+#include "pokemon.h"
+#include "rng.h"
+
+extern u8 sub_8015A98(u8, u8, u8);
+extern u8 battle_side_get_owner(u8);
+extern u32 battle_get_per_side_status(u8);
+
+extern u16 gUnknown_020239F8;
+extern u8 gUnknown_02024A60;
+extern u8 gUnknown_02024C07;
+extern u8 gUnknown_02024C08;
+extern u8 gUnknown_02024C0C;
+extern u16 gUnknown_02024C34[];
+extern u8 *gUnknown_02039238;
+extern u16 gTrainerBattleOpponent;
+extern struct Trainer gTrainers[];
+extern u32 gBitTable[];
+extern u8 *BattleAIs[];
+extern struct BattlePokemon gBattleMons[];
+extern void (*gBattleAICmdTable[])(void);
+
+struct UnknownStruct1
+{
+ u16 unk0[2][8];
+ u8 unk20[2];
+ u8 unk22[2];
+ u16 items[4];
+ u8 unk8;
+};
+
+struct UnknownStruct2
+{
+ u8 unk0;
+ u8 unk1;
+ u16 unk2;
+ u8 unk4[4];
+ u8 filler8[4];
+ u32 aiFlags;
+ u8 unk10;
+ u8 unk11;
+ u8 filler12[6];
+ u8 unk18[4];
+};
+
+struct UnknownStruct3
+{
+ u8 filler0[0x20];
+ u8 unk20;
+};
+
+extern struct UnknownStruct2 unk_2016800;
+extern struct UnknownStruct1 unk_2016A00;
+extern struct UnknownStruct3 unk_2016C00;
+
+void sub_810715C(void);
+void sub_8107374(void);
+void sub_810745C(void);
+
+void sub_81070D4(void)
+{
+ s32 i;
+ u8 *data = (u8 *)&unk_2016A00;
+
+ for(i = 0; (u32)i < 48; i++)
+ data[i] = 0;
+ if((gUnknown_020239F8 & 8) && gTrainerBattleOpponent != 0x400 && !(gUnknown_020239F8 & 0x982))
+ {
+ for(i = 0; i < 4; i++)
+ {
+ if(gTrainers[gTrainerBattleOpponent].items[i] != 0)
+ {
+ unk_2016A00.items[unk_2016A00.unk8] = gTrainers[gTrainerBattleOpponent].items[i];
+ unk_2016A00.unk8++;
+ }
+ }
+ }
+ sub_810715C();
+}
+
+void sub_810715C(void)
+{
+ s32 i;
+ u8 *data = (u8 *)&unk_2016800;
+ u8 r7;
+
+ for(i = 0; (u32)i < 28; i++)
+ data[i] = 0;
+ for(i = 0; i < 4; i++)
+ unk_2016800.unk4[i] = 100;
+ r7 = sub_8015A98(gUnknown_02024A60, 0, 0xFF);
+ for(i = 0; i < 4; i++)
+ {
+ u16 rand;
+
+ if(gBitTable[i] & r7)
+ unk_2016800.unk4[i] = 0;
+ rand = Random();
+ unk_2016800.unk18[i] = 100 - (rand & 0xF);
+ }
+ unk_2016C00.unk20 = 0;
+ gUnknown_02024C07 = gUnknown_02024A60;
+
+ if(gUnknown_020239F8 & 1)
+ {
+ gUnknown_02024C08 = Random() & 2;
+
+ if(gUnknown_02024C0C & gBitTable[gUnknown_02024C08])
+ gUnknown_02024C08 ^= 2;
+ }
+ else
+ gUnknown_02024C08 = gUnknown_02024A60 ^ 1;
+
+ if(gUnknown_020239F8 & 0x80)
+ unk_2016800.aiFlags = 0x40000000;
+ else if(gUnknown_020239F8 & 0x400)
+ unk_2016800.aiFlags = 0x20000000;
+ else if(gUnknown_020239F8 & 0x10)
+ unk_2016800.aiFlags = 0x80000000;
+ else
+ unk_2016800.aiFlags = gTrainers[gTrainerBattleOpponent].aiFlags;
+}
+
+u8 sub_81072A8(void)
+{
+ u8 arr1[4];
+ u8 arr2[4];
+ u8 r5;
+ s32 i;
+
+ sub_810745C();
+ while(unk_2016800.aiFlags != 0)
+ {
+ if(unk_2016800.aiFlags & 1)
+ {
+ unk_2016800.unk0 = 0;
+ sub_8107374();
+ }
+ unk_2016800.aiFlags >>= 1;
+ unk_2016800.unk11++;
+ unk_2016800.unk1 = 0;
+ }
+ if(unk_2016800.unk10 & 2)
+ return 4;
+ if(unk_2016800.unk10 & 4)
+ return 5;
+ r5 = 1;
+ arr1[0] = unk_2016800.unk4[0];
+ arr2[0] = 0;
+ for(i = 1; i < 4; i++)
+ {
+ if(arr1[0] < (s8)unk_2016800.unk4[i])
+ {
+ r5 = 1;
+ arr1[0] = unk_2016800.unk4[i];
+ arr2[0] = i;
+ }
+ if(arr1[0] == (s8)unk_2016800.unk4[i])
+ {
+ arr1[r5] = unk_2016800.unk4[i];
+ arr2[r5++] = i;
+ }
+ }
+ return arr2[Random() % r5];
+}
+
+void sub_8107374(void)
+{
+ while(unk_2016800.unk0 != 2)
+ {
+ switch(unk_2016800.unk0)
+ {
+ case 3: //Needed to match.
+ break;
+ case 0:
+ gUnknown_02039238 = BattleAIs[unk_2016800.unk11];
+ if(gBattleMons[gUnknown_02024C07].pp[unk_2016800.unk1] != 0)
+ {
+ asm("":::"r1"); //Prevent struct offset optimization
+ unk_2016800.unk2 = gBattleMons[gUnknown_02024C07].moves[unk_2016800.unk1];
+ }
+ else
+ unk_2016800.unk2 = 0;
+ unk_2016800.unk0++;
+ break;
+ case 1:
+ if(unk_2016800.unk2 != 0)
+ gBattleAICmdTable[*(u8 *)gUnknown_02039238](); //weird...
+ else
+ {
+ unk_2016800.unk4[unk_2016800.unk1] = 0;
+ unk_2016800.unk10 |= 1;
+ }
+ if(unk_2016800.unk10 & 1)
+ {
+ unk_2016800.unk1++;
+ if(unk_2016800.unk1 < 4 && !(unk_2016800.unk10 & 8))
+ unk_2016800.unk0 = 0;
+ else
+ unk_2016800.unk0++;
+ unk_2016800.unk10 &= 0xFE;
+ }
+ break;
+ }
+ }
+}
+
+#ifdef NONMATCHING
+void sub_810745C(void)
+{
+ s32 i;
+
+ for(i = 0; i < 8; i++)
+ {
+ if(unk_2016A00.unk0[gUnknown_02024C08 / 2][i] == 0)
+ {
+ //gUnknown_02024C34[gUnknown_02024C08] += 0;
+ unk_2016A00.unk0[gUnknown_02024C08 / 2][i] = gUnknown_02024C34[gUnknown_02024C08];
+ return;
+ }
+ }
+}
+#else
+__attribute__((naked))
+void sub_810745C(void)
+{
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ movs r2, 0\n\
+ ldr r3, _08107488 @ =gUnknown_02024C08\n\
+ ldr r5, _0810748C @ =0x02016a00\n\
+ ldr r6, _08107490 @ =gUnknown_02024C34\n\
+ adds r4, r3, 0\n\
+_08107468:\n\
+ lsls r0, r2, 1\n\
+ ldrb r1, [r4]\n\
+ lsrs r1, 1\n\
+ lsls r1, 4\n\
+ adds r0, r1\n\
+ adds r1, r0, r5\n\
+ ldrh r0, [r1]\n\
+ cmp r0, 0\n\
+ bne _08107494\n\
+ ldrb r0, [r3]\n\
+ lsls r0, 1\n\
+ adds r0, r6\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r1]\n\
+ b _0810749A\n\
+ .align 2, 0\n\
+_08107488: .4byte gUnknown_02024C08\n\
+_0810748C: .4byte 0x02016a00\n\
+_08107490: .4byte gUnknown_02024C34\n\
+_08107494:\n\
+ adds r2, 0x1\n\
+ cmp r2, 0x7\n\
+ ble _08107468\n\
+_0810749A:\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .syntax divided");
+}
+#endif
+
+void unref_sub_81074A0(u8 a)
+{
+ s32 i;
+
+ for(i = 0; i < 8; i++)
+ unk_2016A00.unk0[a / 2][i] = 0;
+}
+
+void sub_81074C4(u8 a, u8 b)
+{
+ if(battle_side_get_owner(a) == 0)
+ unk_2016A00.unk20[battle_get_per_side_status(a) % 2] = b;
+}
+
+void sub_81074F8(u8 a, u8 b)
+{
+ if(battle_side_get_owner(a) == 0)
+ unk_2016A00.unk22[battle_get_per_side_status(a) % 2] = b;
+} \ No newline at end of file
diff --git a/src/battle_setup.c b/src/battle_setup.c
index dc8564a99..27cef8441 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "battle.h"
#include "main.h"
#include "species.h"
#include "pokemon.h"
@@ -53,21 +54,6 @@ u16 sub_8082C4C(u16 a1);
extern u16 gScriptResult;
-struct Trainer
-{
-/* 0x00 */ u8 partyFlags;
-/* 0x01 */ u8 trainerClass;
-/* 0x02 */ u8 encounterMusic:7;
-/* 0x02 */ u8 gender:1;
-/* 0x03 */ u8 trainerPic;
-/* 0x04 */ u8 trainerName[12];
-/* 0x10 */ u16 items[4];
-/* 0x18 */ bool8 doubleBattle;
-/* 0x1C */ u32 aiFlags;
-/* 0x20 */ u8 partySize;
-/* 0x24 */ void *party;
-};
-
struct TrainerPartyMember0
{
u16 iv;