diff options
-rw-r--r-- | asm/battle_ai.s | 583 | ||||
-rw-r--r-- | include/battle.h | 19 | ||||
-rw-r--r-- | include/pokemon.h | 67 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | shared_syms.txt | 4 | ||||
-rw-r--r-- | src/battle_ai.c | 285 | ||||
-rw-r--r-- | src/battle_setup.c | 16 |
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; |