summaryrefslogtreecommitdiff
path: root/src/contest_ai.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/contest_ai.c')
-rw-r--r--src/contest_ai.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/contest_ai.c b/src/contest_ai.c
index 463553998..2f048718f 100644
--- a/src/contest_ai.c
+++ b/src/contest_ai.c
@@ -7,7 +7,7 @@
#include "constants/moves.h"
extern const u8 *gAIScriptPtr;
-extern const u8 *gContestAIChecks[];
+extern const u8 *gContestAI_ScriptsTable[];
static void ContestAICmd_score(void);
static void ContestAICmd_get_appeal_num(void);
@@ -144,7 +144,7 @@ static void ContestAICmd_if_user_has_exciting_move(void);
static void ContestAICmd_if_user_doesnt_have_exciting_move(void);
static void ContestAICmd_check_user_has_move(void);
static void ContestAICmd_if_user_has_move(void);
-static void ContestAICmd_if_effect_in_user_moveset(void);
+static void ContestAICmd_if_user_doesnt_have_move(void);
typedef void (* ContestAICmdFunc)(void);
@@ -285,7 +285,7 @@ static const ContestAICmdFunc sContestAICmdTable[] =
ContestAICmd_if_user_doesnt_have_exciting_move, // 0x84
ContestAICmd_check_user_has_move, // 0x85
ContestAICmd_if_user_has_move, // 0x86
- ContestAICmd_if_effect_in_user_moveset, // 0x87
+ ContestAICmd_if_user_doesnt_have_move, // 0x87
};
static void ContestAI_DoAIProcessing(void);
@@ -303,20 +303,20 @@ void ContestAI_ResetAI(u8 contestantAI)
eContestAI.contestantId = contestantAI;
eContestAI.stackSize = 0;
- eContestAI.aiChecks = gContestMons[eContestAI.contestantId].aiChecks;
+ eContestAI.aiFlags = gContestMons[eContestAI.contestantId].aiFlags;
}
u8 ContestAI_GetActionToUse(void)
{
- while (eContestAI.aiChecks != 0)
+ while (eContestAI.aiFlags != 0)
{
- if (eContestAI.aiChecks & 1)
+ if (eContestAI.aiFlags & 1)
{
eContestAI.aiState = CONTESTAI_SETTING_UP;
ContestAI_DoAIProcessing();
}
- eContestAI.aiChecks >>= 1;
- eContestAI.currentAICheck++;
+ eContestAI.aiFlags >>= 1;
+ eContestAI.currentAIFlag++;
eContestAI.nextMoveIndex = 0;
}
@@ -346,7 +346,7 @@ static void ContestAI_DoAIProcessing(void)
case CONTESTAI_DO_NOT_PROCESS:
break;
case CONTESTAI_SETTING_UP:
- gAIScriptPtr = gContestAIChecks[eContestAI.currentAICheck];
+ gAIScriptPtr = gContestAI_ScriptsTable[eContestAI.currentAIFlag];
if (gContestMons[eContestAI.contestantId].moves[eContestAI.nextMoveIndex] == MOVE_NONE)
eContestAI.nextMove = MOVE_NONE; // don't process a move that doesn't exist.
@@ -1627,7 +1627,8 @@ static void ContestAICmd_if_not_eq_var(void)
}
// UB: Should just be comparing to gAIScriptPtr[1] in the functions below
-// With the values passed to if_random_less_than this goes way OOB on vars
+// The values passed via gAIScriptPtr[1] range from 0-255
+// and vars is an s16[3], so this goes way out of bounds
static void ContestAICmd_if_random_less_than(void)
{
#ifndef UBFIX
@@ -1729,6 +1730,12 @@ static void ContestAICmd_if_user_doesnt_have_exciting_move(void)
gAIScriptPtr += 4;
}
+// BUG: This is checking if the user has a specific move, but when it's used in the AI script
+// they're checking for an effect. Checking for a specific effect would make more sense,
+// but given that effects are normally read as a single byte and this reads 2 bytes, it
+// seems reading a move was intended and the AI script is using it incorrectly.
+// In any case, to fix it to correctly check for effects replace the u16 move assignment with
+// u16 move = gContestMoves[gContestMons[eContestAI.contestantId].moves[i]].effect;
static void ContestAICmd_check_user_has_move(void)
{
int hasMove = FALSE;
@@ -1759,7 +1766,7 @@ static void ContestAICmd_if_user_has_move(void)
gAIScriptPtr += 4;
}
-static void ContestAICmd_if_effect_in_user_moveset(void)
+static void ContestAICmd_if_user_doesnt_have_move(void)
{
ContestAICmd_check_user_has_move();