Fix movement types; fix some math ops
This commit is contained in:
+68
-60
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user