diff options
-rw-r--r-- | asm/contest_ai.s | 247 | ||||
-rw-r--r-- | asm/contest_link_80C2020.s | 12 | ||||
-rw-r--r-- | asm/contest_link_80C857C.s | 8 | ||||
-rw-r--r-- | include/contest.h | 18 | ||||
-rwxr-xr-x | include/ewram.h | 2 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/contest.c | 10 | ||||
-rwxr-xr-x | src/contest_ai.c | 113 | ||||
-rw-r--r-- | sym_ewram.txt | 12 |
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 |