diff options
author | Cameron Hall <camthesaxman@users.noreply.github.com> | 2016-11-06 03:09:06 -0600 |
---|---|---|
committer | YamaArashi <YamaArashi@users.noreply.github.com> | 2016-11-06 01:09:06 -0800 |
commit | 74b660f22f5a7d23f01a1766127cfd9a47290132 (patch) | |
tree | 0aac6d739187faf99b7da5e560fe74ef35e657a4 /src | |
parent | 865f6f6f4fa30460d4a793872e8b6654534bb573 (diff) |
start decompiling battle_ai.c (#92)
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_ai.c | 285 | ||||
-rw-r--r-- | src/battle_setup.c | 16 |
2 files changed, 286 insertions, 15 deletions
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; |