summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/contest_ai.s247
-rw-r--r--asm/contest_link_80C2020.s12
-rw-r--r--asm/contest_link_80C857C.s8
-rw-r--r--include/contest.h18
-rwxr-xr-xinclude/ewram.h2
-rw-r--r--ld_script.txt1
-rw-r--r--src/contest.c10
-rwxr-xr-xsrc/contest_ai.c113
-rw-r--r--sym_ewram.txt12
9 files changed, 151 insertions, 272 deletions
diff --git a/asm/contest_ai.s b/asm/contest_ai.s
index 709b289c2..d1ae6425b 100644
--- a/asm/contest_ai.s
+++ b/asm/contest_ai.s
@@ -5,249 +5,6 @@
.text
- thumb_func_start sub_81288F4
-sub_81288F4: @ 81288F4
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- ldr r4, _0812893C @ =gSharedMem + 0x192E4
- adds r0, r4, 0
- movs r1, 0
- movs r2, 0x44
- bl memset
- movs r3, 0x64
- adds r2, r4, 0
- movs r1, 0x3
- adds r0, r2, 0
- adds r0, 0x8
-_08128910:
- strb r3, [r0]
- subs r0, 0x1
- subs r1, 0x1
- cmp r1, 0
- bge _08128910
- adds r3, r2, 0
- adds r3, 0x41
- movs r1, 0
- strb r5, [r3]
- adds r0, r2, 0
- adds r0, 0x40
- strb r1, [r0]
- ldr r1, _08128940 @ =gContestMons
- ldrb r0, [r3]
- lsls r0, 6
- adds r1, 0x18
- adds r0, r1
- ldr r0, [r0]
- str r0, [r2, 0x14]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0812893C: .4byte gSharedMem + 0x192E4
-_08128940: .4byte gContestMons
- thumb_func_end sub_81288F4
-
- thumb_func_start sub_8128944
-sub_8128944: @ 8128944
- push {r4-r6,lr}
- ldr r1, _081289A8 @ =gSharedMem + 0x192E4
- ldr r0, [r1, 0x14]
- cmp r0, 0
- beq _08128974
- adds r4, r1, 0
- movs r5, 0
-_08128952:
- ldr r0, [r4, 0x14]
- movs r1, 0x1
- ands r0, r1
- cmp r0, 0
- beq _08128962
- strb r5, [r4]
- bl sub_81289AC
-_08128962:
- ldr r1, [r4, 0x14]
- lsrs r1, 1
- str r1, [r4, 0x14]
- ldrb r0, [r4, 0x10]
- adds r0, 0x1
- strb r0, [r4, 0x10]
- strb r5, [r4, 0x4]
- cmp r1, 0
- bne _08128952
-_08128974:
- movs r6, 0x3
- ldr r5, _081289A8 @ =gSharedMem + 0x192E4
-_08128978:
- bl Random
- adds r4, r0, 0
- ands r4, r6
- adds r3, r5, 0x5
- adds r0, r4, r3
- ldrb r2, [r0]
- movs r1, 0
- ldrb r0, [r5, 0x5]
- cmp r2, r0
- bcc _0812899C
-_0812898E:
- adds r1, 0x1
- cmp r1, 0x3
- bgt _0812899C
- adds r0, r1, r3
- ldrb r0, [r0]
- cmp r2, r0
- bcs _0812898E
-_0812899C:
- cmp r1, 0x4
- bne _08128978
- adds r0, r4, 0
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_081289A8: .4byte gSharedMem + 0x192E4
- thumb_func_end sub_8128944
-
- thumb_func_start sub_81289AC
-sub_81289AC: @ 81289AC
- push {r4-r6,lr}
- ldr r1, _081289F4 @ =gSharedMem + 0x192E4
- ldrb r0, [r1]
- adds r2, r1, 0
- cmp r0, 0x2
- beq _08128A76
- adds r4, r1, 0
- ldr r5, _081289F8 @ =gAIScriptPtr
- ldr r6, _081289FC @ =gUnknown_0203858E
-_081289BE:
- ldrb r0, [r4]
- cmp r0, 0x1
- beq _08128A0E
- cmp r0, 0x1
- bgt _08128A6E
- cmp r0, 0
- bne _08128A6E
- ldr r1, _08128A00 @ =gContestAIs
- ldrb r0, [r4, 0x10]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- str r0, [r5]
- ldrb r1, [r4, 0x4]
- lsls r1, 1
- adds r0, r4, 0
- adds r0, 0x41
- ldrb r0, [r0]
- lsls r0, 6
- adds r1, r0
- adds r1, r6
- ldrh r1, [r1]
- adds r0, r1, 0
- cmp r0, 0
- bne _08128A04
- strh r0, [r4, 0x2]
- b _08128A06
- .align 2, 0
-_081289F4: .4byte gSharedMem + 0x192E4
-_081289F8: .4byte gAIScriptPtr
-_081289FC: .4byte gUnknown_0203858E
-_08128A00: .4byte gContestAIs
-_08128A04:
- strh r1, [r4, 0x2]
-_08128A06:
- ldrb r0, [r4]
- adds r0, 0x1
- strb r0, [r4]
- b _08128A6E
-_08128A0E:
- ldrh r1, [r1, 0x2]
- cmp r1, 0
- beq _08128A2C
- ldr r1, _08128A28 @ =sContestAICmdTable
- ldr r0, [r5]
- ldrb r0, [r0]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- bl _call_via_r0
- b _08128A3C
- .align 2, 0
-_08128A28: .4byte sContestAICmdTable
-_08128A2C:
- adds r0, r4, 0x5
- ldrb r2, [r4, 0x4]
- adds r0, r2
- strb r1, [r0]
- ldrb r1, [r4, 0x9]
- movs r0, 0x1
- orrs r0, r1
- strb r0, [r4, 0x9]
-_08128A3C:
- ldr r2, _08128A5C @ =gSharedMem + 0x192E4
- ldrb r1, [r2, 0x9]
- movs r0, 0x1
- ands r0, r1
- cmp r0, 0
- beq _08128A6E
- ldrb r0, [r2, 0x4]
- adds r0, 0x1
- movs r1, 0
- strb r0, [r2, 0x4]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x3
- bhi _08128A60
- strb r1, [r2]
- b _08128A66
- .align 2, 0
-_08128A5C: .4byte gSharedMem + 0x192E4
-_08128A60:
- ldrb r0, [r2]
- adds r0, 0x1
- strb r0, [r2]
-_08128A66:
- ldrb r1, [r4, 0x9]
- movs r0, 0xFE
- ands r0, r1
- strb r0, [r4, 0x9]
-_08128A6E:
- adds r1, r2, 0
- ldrb r0, [r1]
- cmp r0, 0x2
- bne _081289BE
-_08128A76:
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end sub_81289AC
-
- thumb_func_start sub_8128A7C
-sub_8128A7C: @ 8128A7C
- push {lr}
- lsls r0, 24
- lsrs r2, r0, 24
- movs r1, 0
- ldr r3, _08128AA4 @ =gSharedMem + 0x192D0
- ldrb r0, [r3]
- cmp r0, r2
- beq _08128A9A
-_08128A8C:
- adds r1, 0x1
- cmp r1, 0x3
- bgt _08128A9A
- adds r0, r1, r3
- ldrb r0, [r0]
- cmp r0, r2
- bne _08128A8C
-_08128A9A:
- lsls r0, r1, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- .align 2, 0
-_08128AA4: .4byte gSharedMem + 0x192D0
- thumb_func_end sub_8128A7C
-
thumb_func_start ContestAICmd_unk_00
ContestAICmd_unk_00: @ 8128AA8
push {lr}
@@ -5039,7 +4796,7 @@ ContestAICmd_check_for_exciting_move: @ 812ACFC
movs r5, 0
movs r4, 0
ldr r7, _0812AD28 @ =gSharedMem + 0x19325
- ldr r6, _0812AD2C @ =gUnknown_0203858E
+ ldr r6, _0812AD2C @ =gContestMons + 0x1E
_0812AD06:
lsls r0, r4, 1
ldrb r1, [r7]
@@ -5058,7 +4815,7 @@ _0812AD06:
b _0812AD36
.align 2, 0
_0812AD28: .4byte gSharedMem + 0x19325
-_0812AD2C: .4byte gUnknown_0203858E
+_0812AD2C: .4byte gContestMons + 0x1E
_0812AD30:
adds r4, 0x1
cmp r4, 0x3
diff --git a/asm/contest_link_80C2020.s b/asm/contest_link_80C2020.s
index af239f3f7..8a0f096f0 100644
--- a/asm/contest_link_80C2020.s
+++ b/asm/contest_link_80C2020.s
@@ -1202,7 +1202,7 @@ _080C29FC: .4byte gStringVar1
_080C2A00: .4byte gLinkPlayers + 0x8
_080C2A04:
lsls r4, 6
- ldr r1, _080C2A54 @ =gUnknown_0203857D
+ ldr r1, _080C2A54 @ =gContestMons + 0xD
adds r1, r4, r1
adds r0, r3, 0
bl StringCopy
@@ -1238,7 +1238,7 @@ _080C2A4A:
strh r0, [r1, 0x8]
b _080C2A80
.align 2, 0
-_080C2A54: .4byte gUnknown_0203857D
+_080C2A54: .4byte gContestMons + 0xD
_080C2A58: .4byte gStringVar2
_080C2A5C: .4byte gContestMons + 0x2
_080C2A60: .4byte gContestText_PokeWon
@@ -5201,7 +5201,7 @@ _080C4720:
ldr r1, _080C4738 @ =gSpecialVar_0x8006
ldrh r1, [r1]
lsls r1, 6
- ldr r2, _080C473C @ =gUnknown_0203857D
+ ldr r2, _080C473C @ =gContestMons + 0xD
adds r1, r2
bl sub_80C4674
_080C4730:
@@ -5210,7 +5210,7 @@ _080C4730:
.align 2, 0
_080C4734: .4byte gStringVar1
_080C4738: .4byte gSpecialVar_0x8006
-_080C473C: .4byte gUnknown_0203857D
+_080C473C: .4byte gContestMons + 0xD
thumb_func_end sub_80C46EC
thumb_func_start sub_80C4740
@@ -5352,7 +5352,7 @@ _080C4838: .4byte gStringVar3
_080C483C: .4byte gLinkPlayers + 0x8
_080C4840:
lsls r1, r2, 6
- ldr r0, _080C4854 @ =gUnknown_0203857D
+ ldr r0, _080C4854 @ =gContestMons + 0xD
adds r1, r0
adds r0, r4, 0
bl sub_80C4674
@@ -5361,7 +5361,7 @@ _080C484C:
pop {r0}
bx r0
.align 2, 0
-_080C4854: .4byte gUnknown_0203857D
+_080C4854: .4byte gContestMons + 0xD
thumb_func_end sub_80C47F0
thumb_func_start sub_80C4858
diff --git a/asm/contest_link_80C857C.s b/asm/contest_link_80C857C.s
index b29e03583..6afcaec6d 100644
--- a/asm/contest_link_80C857C.s
+++ b/asm/contest_link_80C857C.s
@@ -402,7 +402,7 @@ _080C8838:
mov r1, r8
strb r1, [r4, 0xA]
_080C883E:
- ldr r0, _080C886C @ =gUnknown_0203857D
+ ldr r0, _080C886C @ =gContestMons + 0xD
adds r4, r5, r0
ldrh r0, [r6, 0x1A]
cmp r0, 0x1
@@ -425,7 +425,7 @@ _080C883E:
strb r0, [r4]
b _080C8878
.align 2, 0
-_080C886C: .4byte gUnknown_0203857D
+_080C886C: .4byte gContestMons + 0xD
_080C8870:
ldrb r0, [r4, 0x7]
strb r0, [r4, 0x5]
@@ -610,7 +610,7 @@ _080C886C:
mov r2, r9
strb r2, [r4, 0xA]
_080C8872:
- ldr r0, _080C88A0 @ =gUnknown_0203857D
+ ldr r0, _080C88A0 @ =gContestMons + 0xD
adds r4, r6, r0
ldrh r0, [r7, 0x1A]
cmp r0, 0x1
@@ -633,7 +633,7 @@ _080C8872:
strb r0, [r4]
b _080C88AC
.align 2, 0
-_080C88A0: .4byte gUnknown_0203857D
+_080C88A0: .4byte gContestMons + 0xD
_080C88A4:
ldrb r0, [r4, 0x7]
strb r0, [r4, 0x5]
diff --git a/include/contest.h b/include/contest.h
index 6e71358a2..a1d2ec9e0 100644
--- a/include/contest.h
+++ b/include/contest.h
@@ -67,6 +67,23 @@ struct ContestPokemon
/*0x3C*/ u32 otId; // otId
}; // wow
+struct ContestAIInfo {
+ /*0x00*/ u8 aiState;
+ /*0x01*/ u8 filler1[1]; // padding?
+ /*0x02*/ u16 unk2;
+ /*0x04*/ u8 unk4;
+ /*0x05*/ u8 unk5[4];
+ /*0x09*/ u8 aiAction;
+ /*0x0A*/ u8 fillerA[0x6];
+ /*0x10*/ u8 unk10;
+ /*0x11*/ u8 filler11[0x3]; // padding?
+ /*0x14*/ u32 flags;
+ /*0x18*/ u8 filler18[0x28];
+ /*0x40*/ u8 unk40;
+ /*0x41*/ u8 unk41;
+ /*0x42*/ u8 filler42[0x2]; // padding?
+};
+
extern struct ContestPokemon gContestMons[];
extern const struct ContestMove gContestMoves[];
extern const struct ContestEffect gContestEffects[];
@@ -248,7 +265,6 @@ struct UnknownContestStruct6
#define shared18004 ((u16 *)(gSharedMem + 0x18004))
#define sContest (*(struct Contest *)(gSharedMem + 0x19204))
#define sContestantStatus ((struct ContestantStatus *)(gSharedMem + 0x19260))
-#define shared192D0 (*(struct UnknownContestStruct7 *)(gSharedMem + 0x192D0))
#define shared192E4 (gSharedMem + 0x192E4)
#define shared19328 (*(struct UnknownContestStruct5 *)(gSharedMem + 0x19328))
#define shared19338 ((struct UnknownContestStruct4 *)(gSharedMem + 0x19338))
diff --git a/include/ewram.h b/include/ewram.h
index b07820090..9766ab4df 100755
--- a/include/ewram.h
+++ b/include/ewram.h
@@ -229,6 +229,8 @@ extern u8 gSharedMem[];
#define eCableCar2 ((struct CableCarEwramStruct2 *)(gSharedMem + 0x19000))
#define ePokedexView3 (struct PokedexView *)(gSharedMem + 0x19000)
#define eRoulette ((struct Roulette *)(gSharedMem + 0x19000))
+#define shared192D0 (*(struct UnknownContestStruct7 *)(gSharedMem + 0x192D0))
+#define eContestAI ((struct ContestAIInfo *)(gSharedMem + 0x192E4))
#define EWRAM_19348 (*(u16 *)(gSharedMem + 0x19348))
#define ewram19800 (&gSharedMem[0x19800])
#define ePokedexView4 (struct PokedexView *)(gSharedMem + 0x19800)
diff --git a/ld_script.txt b/ld_script.txt
index 54aca5b2b..ffc4bc676 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -355,6 +355,7 @@ SECTIONS {
src/engine/save.o(.text);
src/engine/mystery_event_script.o(.text);
src/field/field_effect_helpers.o(.text);
+ src/contest_ai.o(.text);
asm/contest_ai.o(.text);
src/unused_81258BC.o(.text);
src/battle/anim/sfx.o(.text);
diff --git a/src/contest.c b/src/contest.c
index 875fe4502..6a8887fb1 100644
--- a/src/contest.c
+++ b/src/contest.c
@@ -36,8 +36,8 @@ extern u8 AreMovesContestCombo(u16, u16); // I don't think this is a bool
extern void sub_80C8A38(u8);
extern void sub_80C8AD0(u8);
extern void sub_80C8C80(u8);
-extern void sub_81288F4();
-extern u8 sub_8128944(void);
+extern void ContestAI_ResetAI();
+extern u8 ContestAI_GetActionToUse(void);
extern struct MusicPlayerInfo gMPlay_SE1;
extern u16 gSpecialVar_ContestCategory;
@@ -391,7 +391,7 @@ void ClearContestVars(void)
}
memset(&shared192D0, 0, sizeof(shared192D0));
- memset(shared192E4, 0, 0x44 * sizeof(*shared192E4));
+ memset(eContestAI, 0, sizeof(struct ContestAIInfo));
memset(&shared19328, 0, sizeof(shared19328));
memset(shared19338, 0, 4 * sizeof(*shared19338));
if (!(gIsLinkContest & 1))
@@ -2629,8 +2629,8 @@ u16 GetChosenMove(u8 a)
{
u8 moveChoice;
- sub_81288F4(a);
- moveChoice = sub_8128944();
+ ContestAI_ResetAI(a);
+ moveChoice = ContestAI_GetActionToUse();
return gContestMons[a].moves[moveChoice];
}
}
diff --git a/src/contest_ai.c b/src/contest_ai.c
new file mode 100755
index 000000000..9dfa6c2b9
--- /dev/null
+++ b/src/contest_ai.c
@@ -0,0 +1,113 @@
+#include "global.h"
+#include "contest.h"
+#include "random.h"
+#include "ewram.h"
+
+enum
+{
+ ContestAI_SettingUp,
+ ContestAI_Processing,
+ ContestAI_FinishedProcessing,
+ ContestAI_DoNotProcess
+};
+
+extern u8 *gAIScriptPtr;
+extern u8 *gContestAIs[];
+
+typedef void (* ContestAICmdFunc)(void);
+
+extern const ContestAICmdFunc sContestAICmdTable[]; // TODO: Move table to C file
+
+void ContestAI_DoAIProcessing(void);
+
+void ContestAI_ResetAI(u8 var)
+{
+ int i;
+ memset(eContestAI, 0, sizeof(struct ContestAIInfo));
+
+ for(i = 0; i < 4; i++)
+ eContestAI->unk5[i] = 100;
+
+ eContestAI->unk41 = var;
+ eContestAI->unk40 = 0;
+ eContestAI->flags = gContestMons[eContestAI->unk41].flags;
+}
+
+u8 ContestAI_GetActionToUse(void)
+{
+ while(eContestAI->flags != 0)
+ {
+ if(eContestAI->flags & 1)
+ {
+ eContestAI->aiState = 0;
+ ContestAI_DoAIProcessing();
+ }
+ eContestAI->flags >>= 1;
+ eContestAI->unk10++;
+ eContestAI->unk4 = 0;
+ }
+
+ while (1)
+ {
+ u8 rval = Random() & 3;
+ u8 r2 = eContestAI->unk5[rval];
+ int i;
+ for (i = 0; i < 4; i++)
+ {
+ if (r2 < eContestAI->unk5[i])
+ break;
+ }
+ if (i == 4)
+ return rval;
+ }
+}
+
+void ContestAI_DoAIProcessing(void)
+{
+ while(eContestAI->aiState != ContestAI_FinishedProcessing)
+ {
+ switch(eContestAI->aiState)
+ {
+ case ContestAI_DoNotProcess:
+ break;
+ case ContestAI_SettingUp:
+ gAIScriptPtr = gContestAIs[eContestAI->unk10];
+
+ if(gContestMons[eContestAI->unk41].moves[eContestAI->unk4] == 0)
+ eContestAI->unk2 = 0; // don't process a move that doesn't exist.
+ else
+ eContestAI->unk2 = gContestMons[eContestAI->unk41].moves[eContestAI->unk4];
+ eContestAI->aiState++;
+ break;
+ case ContestAI_Processing:
+ if(eContestAI->unk2 != 0)
+ sContestAICmdTable[*gAIScriptPtr](); // run the command.
+ else
+ {
+ eContestAI->unk5[eContestAI->unk4] = 0; // don't consider a move that doesn't exist.
+ eContestAI->aiAction |= 1;
+ }
+ if(eContestAI->aiAction & 1)
+ {
+ eContestAI->unk4++;
+ if(eContestAI->unk4 < 4)
+ eContestAI->aiState = 0;
+ else
+ eContestAI->aiState++;
+ eContestAI->aiAction &= 0xFE; // TODO: Define action flags
+ }
+ break;
+ }
+ }
+}
+
+u8 sub_8128A7C(u8 var)
+{
+ int i;
+
+ for(i = 0; i < 4; i++)
+ if(shared192D0.unk0[i] == var)
+ break;
+
+ return i;
+}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index dcbadf96e..b9c08aac6 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -447,17 +447,7 @@ gUnknown_0203856C: @ 203856C
.space 0x4
gContestMons: @ 2038570
- .space 0xD
-
-gUnknown_0203857D: @ 203857D
- .space 0x11
-
- @ contest move space
-gUnknown_0203858E: @ 203858E
- .space 0x8
-
-gUnknown_02038596: @ 2038596
- .space 0xDA
+ .space 0x100
gUnknown_02038670: @ 2038670
.space 0x8