Fix movement types; fix some math ops

This commit is contained in:
PikalaxALT
2021-03-30 20:33:31 -04:00
parent 35b68c68ee
commit f00b44699c
7 changed files with 406 additions and 402 deletions
+68 -60
View File
@@ -33,6 +33,13 @@ enum
VSSEEKER_CAN_USE,
};
typedef enum
{
VSSEEKER_SINGLE_RESP_RAND,
VSSEEKER_SINGLE_RESP_NO,
VSSEEKER_SINGLE_RESP_YES
} VsSeekerSingleRespCode;
typedef enum
{
VSSEEKER_RESPONSE_NO_RESPONSE,
@@ -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);
}
}