summaryrefslogtreecommitdiff
path: root/src/vs_seeker.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vs_seeker.c')
-rw-r--r--src/vs_seeker.c128
1 files changed, 68 insertions, 60 deletions
diff --git a/src/vs_seeker.c b/src/vs_seeker.c
index af8bda8be..3432911e2 100644
--- a/src/vs_seeker.c
+++ b/src/vs_seeker.c
@@ -35,6 +35,13 @@ enum
typedef enum
{
+ VSSEEKER_SINGLE_RESP_RAND,
+ VSSEEKER_SINGLE_RESP_NO,
+ VSSEEKER_SINGLE_RESP_YES
+} VsSeekerSingleRespCode;
+
+typedef enum
+{
VSSEEKER_RESPONSE_NO_RESPONSE,
VSSEEKER_RESPONSE_UNFOUGHT_TRAINERS,
VSSEEKER_RESPONSE_FOUND_REMATCHES
@@ -44,8 +51,8 @@ typedef enum
typedef struct VsSeekerData
{
u16 trainerIdxs[6];
- u16 unk_c; // unused
- u16 unk_e; // unused
+ u16 mapGroup; // unused
+ u16 mapNum; // unused
} VsSeekerData;
struct VsSeekerTrainerInfo
@@ -72,10 +79,6 @@ struct VsSeekerStruct
u8 responseCode:5;
};
-extern u16 gSpecialVar_LastTalked;
-extern struct ObjectEvent gObjectEvents[OBJECT_EVENTS_COUNT];
-extern u8 gSelectedObjectEvent;
-
// static declarations
static EWRAM_DATA struct VsSeekerStruct *sVsSeeker = NULL;
@@ -88,24 +91,24 @@ static void Task_VsSeeker_2(u8 taskId);
static void GatherNearbyTrainerInfo(void);
static void Task_VsSeeker_3(u8 taskId);
static bool8 CanUseVsSeeker(void);
-static u8 GetVsSeekerResponseInArea(const VsSeekerData *);
+static u8 GetVsSeekerResponseInArea(const VsSeekerData * vsSeekerData);
static u8 GetRematchTrainerIdGivenGameState(const u16 *trainerIdxs, u8 rematchIdx);
-static u8 ShouldTryRematchBattleInternal(const VsSeekerData *, u16);
-static u8 HasRematchTrainerAlreadyBeenFought(const VsSeekerData *, u16);
+static u8 ShouldTryRematchBattleInternal(const VsSeekerData * vsSeekerData, u16 trainerBattleOpponent);
+static u8 HasRematchTrainerAlreadyBeenFought(const VsSeekerData * vsSeekerData, u16 trainerBattleOpponent);
static int LookupVsSeekerOpponentInArray(const VsSeekerData * array, u16 trainerId);
-static bool8 IsTrainerReadyForRematchInternal(const VsSeekerData *, u16);
-static u8 GetRunningBehaviorFromGraphicsId(u8);
-static u16 GetTrainerFlagFromScript(const u8 *);
-static int GetRematchIdx(const VsSeekerData *, u16);
-static bool32 IsThisTrainerRematchable(u32);
+static bool8 IsTrainerReadyForRematchInternal(const VsSeekerData * array, u16 trainerIdx);
+static u8 GetRunningBehaviorFromGraphicsId(u8 graphicsId);
+static u16 GetTrainerFlagFromScript(const u8 * script);
+static int GetRematchIdx(const VsSeekerData * vsSeekerData, u16 trainerFlagIdx);
+static bool32 IsThisTrainerRematchable(u32 localId);
static void ClearAllTrainerRematchStates(void);
-static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo *);
-static u8 GetNextAvailableRematchTrainer(const VsSeekerData *, u16, u8 *);
+static bool8 IsTrainerVisibleOnScreen(struct VsSeekerTrainerInfo * trainerInfo);
+static u8 GetNextAvailableRematchTrainer(const VsSeekerData * vsSeekerData, u16 trainerFlagNo, u8 * idxPtr);
static u8 GetRematchableTrainerLocalId(void);
-static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo *, const u8 *);
-static u8 GetCurVsSeekerResponse(s32, u16);
+static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * trainerInfo, const u8 * script);
+static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx);
static void StartAllRespondantIdleMovements(void);
-static bool8 ObjectEventIdIsSane(u8 a0);
+static bool8 ObjectEventIdIsSane(u8 objectEventId);
static u8 GetRandomFaceDirectionMovementType();
// rodata
@@ -635,7 +638,14 @@ void VsSeekerResetObjectMovementAfterChargeComplete(void)
for (i = 0; i < gMapHeader.events->objectEventCount; i++)
{
- if ((templates[i].trainerType == 1 || templates[i].trainerType == 3) && (templates[i].movementType == MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_DOWN || templates[i].movementType == MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP || templates[i].movementType == MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT))
+ if ((
+ templates[i].trainerType == TRAINER_TYPE_NORMAL
+ || templates[i].trainerType == TRAINER_TYPE_BURIED
+ ) && (
+ templates[i].movementType == MOVEMENT_TYPE_VS_SEEKER_4D
+ || templates[i].movementType == MOVEMENT_TYPE_VS_SEEKER_4E
+ || templates[i].movementType == MOVEMENT_TYPE_VS_SEEKER_4F
+ ))
{
movementType = GetRandomFaceDirectionMovementType();
TryGetObjectEventIdByLocalIdAndMap(templates[i].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objEventId);
@@ -651,8 +661,7 @@ void VsSeekerResetObjectMovementAfterChargeComplete(void)
bool8 UpdateVsSeekerStepCounter(void)
{
- u8 x;
- x = 0;
+ u8 x = 0;
if (CheckBagHasItem(ITEM_VS_SEEKER, 1) == TRUE)
{
@@ -694,7 +703,7 @@ static void ResetMovementOfRematchableTrainers(void)
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
{
struct ObjectEvent * objectEvent = &gObjectEvents[i];
- if (objectEvent->movementType == MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_DOWN || objectEvent->movementType == MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP || objectEvent->movementType == MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT)
+ if (objectEvent->movementType == MOVEMENT_TYPE_VS_SEEKER_4D || objectEvent->movementType == MOVEMENT_TYPE_VS_SEEKER_4E || objectEvent->movementType == MOVEMENT_TYPE_VS_SEEKER_4F)
{
u8 movementType = GetRandomFaceDirectionMovementType();
if (objectEvent->active && gSprites[objectEvent->spriteId].data[0] == i)
@@ -853,43 +862,42 @@ static u8 CanUseVsSeeker(void)
}
}
-static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0)
+static u8 GetVsSeekerResponseInArea(const VsSeekerData * vsSeekerData)
{
- u16 r8 = 0;
+ u16 trainerIdx = 0;
u16 rval = 0;
- u8 r7;
- u8 sp0 = 0;
- u8 r0 = 0;
- s32 vsSeekerIdx;
- u8 *r2;
- vsSeekerIdx = 0;
+ u8 rematchTrainerIdx;
+ u8 unusedIdx = 0;
+ u8 response = 0;
+ s32 vsSeekerIdx = 0;
while (sVsSeeker->trainerInfo[vsSeekerIdx].localId != 0xFF)
{
- if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[vsSeekerIdx]) == 1)
+ if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[vsSeekerIdx]) == TRUE)
{
- r8 = sVsSeeker->trainerInfo[vsSeekerIdx].trainerIdx;
- if (!HasTrainerBeenFought(r8))
+ trainerIdx = sVsSeeker->trainerInfo[vsSeekerIdx].trainerIdx;
+ if (!HasTrainerBeenFought(trainerIdx))
{
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerUnfought);
sVsSeeker->trainerHasNotYetBeenFought = 1;
vsSeekerIdx++;
continue;
}
- r7 = GetNextAvailableRematchTrainer(a0, r8, &sp0);
- if (r7 == 0)
+ rematchTrainerIdx = GetNextAvailableRematchTrainer(vsSeekerData, trainerIdx, &unusedIdx);
+ if (rematchTrainerIdx == 0)
{
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch);
sVsSeeker->trainerDoesNotWantRematch = 1;
}
else
{
- rval = Random() % 100;
- r0 = GetCurVsSeekerResponse(vsSeekerIdx, r8);
- if (r0 == 2)
- rval = 100;
- else if (r0 == 1)
- rval = 0;
+ rval = Random() % 100; // Even if it's overwritten below, it progresses the RNG.
+ response = GetCurVsSeekerResponse(vsSeekerIdx, trainerIdx);
+ if (response == VSSEEKER_SINGLE_RESP_YES)
+ rval = 100; // Definitely yes
+ else if (response == VSSEEKER_SINGLE_RESP_NO)
+ rval = 0; // Definitely no
+ // Otherwise it's a 70% chance to want a rematch
if (rval < 30)
{
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch);
@@ -897,10 +905,10 @@ static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0)
}
else
{
- gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[vsSeekerIdx].localId] = r7;
+ gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[vsSeekerIdx].localId] = rematchTrainerIdx;
ShiftStillObjectEventCoords(&gObjectEvents[sVsSeeker->trainerInfo[vsSeekerIdx].objectEventId]);
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerRematch);
- sVsSeeker->trainerIdxArray[sVsSeeker->numRematchableTrainers] = r8;
+ sVsSeeker->trainerIdxArray[sVsSeeker->numRematchableTrainers] = trainerIdx;
sVsSeeker->runningBehaviourEtcArray[sVsSeeker->numRematchableTrainers] = GetRunningBehaviorFromGraphicsId(sVsSeeker->trainerInfo[vsSeekerIdx].graphicsId);
sVsSeeker->numRematchableTrainers++;
sVsSeeker->trainerWantsRematch = 1;
@@ -992,11 +1000,11 @@ static u8 GetRematchTrainerIdGivenGameState(const u16 *trainerIdxs, u8 rematchId
return 0;
}
-u8 ShouldTryRematchBattle(void)
+bool8 ShouldTryRematchBattle(void)
{
if (ShouldTryRematchBattleInternal(sVsSeekerData, gTrainerBattleOpponent_A))
{
- return 1;
+ return TRUE;
}
return HasRematchTrainerAlreadyBeenFought(sVsSeekerData, gTrainerBattleOpponent_A);
}
@@ -1137,13 +1145,13 @@ static u8 GetRunningBehaviorFromGraphicsId(u8 graphicsId)
case OBJ_EVENT_GFX_BLACKBELT:
case OBJ_EVENT_GFX_HIKER:
case OBJ_EVENT_GFX_SAILOR:
- return 0x4e;
+ return MOVEMENT_TYPE_VS_SEEKER_4E;
case OBJ_EVENT_GFX_TUBER_M_WATER:
case OBJ_EVENT_GFX_SWIMMER_M_WATER:
case OBJ_EVENT_GFX_SWIMMER_F_WATER:
- return 0x4f;
+ return MOVEMENT_TYPE_VS_SEEKER_4F;
default:
- return 0x4d;
+ return MOVEMENT_TYPE_VS_SEEKER_4D;
}
}
@@ -1181,9 +1189,9 @@ static int GetRematchIdx(const VsSeekerData * vsSeekerData, u16 trainerFlagIdx)
return -1;
}
-static bool32 IsThisTrainerRematchable(u32 a0)
+static bool32 IsThisTrainerRematchable(u32 localId)
{
- if (!gSaveBlock1Ptr->trainerRematches[a0])
+ if (!gSaveBlock1Ptr->trainerRematches[localId])
return FALSE;
return TRUE;
}
@@ -1264,24 +1272,24 @@ static void StartTrainerObjectMovementScript(struct VsSeekerTrainerInfo * traine
ScriptMovement_StartObjectMovementScript(trainerInfo->localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, script);
}
-static u8 GetCurVsSeekerResponse(s32 a0, u16 a1)
+static u8 GetCurVsSeekerResponse(s32 vsSeekerIdx, u16 trainerIdx)
{
s32 i;
s32 j;
- for (i = 0; i < a0; i++)
+ for (i = 0; i < vsSeekerIdx; i++)
{
- if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) == 1 && sVsSeeker->trainerInfo[i].trainerIdx == a1)
+ if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[i]) == 1 && sVsSeeker->trainerInfo[i].trainerIdx == trainerIdx)
{
for (j = 0; j < sVsSeeker->numRematchableTrainers; j++)
{
if (sVsSeeker->trainerIdxArray[j] == sVsSeeker->trainerInfo[i].trainerIdx)
- return 2;
+ return VSSEEKER_SINGLE_RESP_YES;
}
- return 1;
+ return VSSEEKER_SINGLE_RESP_NO;
}
}
- return 0;
+ return VSSEEKER_SINGLE_RESP_RAND;
}
static void StartAllRespondantIdleMovements(void)
@@ -1296,11 +1304,11 @@ static void StartAllRespondantIdleMovements(void)
{
if (sVsSeeker->trainerInfo[j].trainerIdx == sVsSeeker->trainerIdxArray[i])
{
- struct ObjectEvent *r4 = &gObjectEvents[sVsSeeker->trainerInfo[j].objectEventId];
+ struct ObjectEvent *objectEvent = &gObjectEvents[sVsSeeker->trainerInfo[j].objectEventId];
if (ObjectEventIdIsSane(sVsSeeker->trainerInfo[j].objectEventId) == 1)
- SetTrainerMovementType(r4, sVsSeeker->runningBehaviourEtcArray[i]);
- OverrideMovementTypeForObjectEvent(r4, sVsSeeker->runningBehaviourEtcArray[i]);
+ SetTrainerMovementType(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]);
+ OverrideMovementTypeForObjectEvent(objectEvent, sVsSeeker->runningBehaviourEtcArray[i]);
gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[j].localId] = GetNextAvailableRematchTrainer(sVsSeekerData, sVsSeeker->trainerInfo[j].trainerIdx, &dummy);
}
}