diff options
Diffstat (limited to 'src/vs_seeker.c')
-rw-r--r-- | src/vs_seeker.c | 128 |
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); } } |