summaryrefslogtreecommitdiff
path: root/src
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 /src
parent865f6f6f4fa30460d4a793872e8b6654534bb573 (diff)
start decompiling battle_ai.c (#92)
Diffstat (limited to 'src')
-rw-r--r--src/battle_ai.c285
-rw-r--r--src/battle_setup.c16
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;