[LEAK-INFORMED] fix vs_seeker fakematchings

This commit is contained in:
Kurausukun
2021-03-23 00:19:34 -04:00
parent 646c443221
commit 64e3ba9964
+34 -56
View File
@@ -651,6 +651,9 @@ void VsSeekerResetObjectMovementAfterChargeComplete(void)
bool8 UpdateVsSeekerStepCounter(void) bool8 UpdateVsSeekerStepCounter(void)
{ {
u8 x;
x = 0;
if (CheckBagHasItem(ITEM_VS_SEEKER, 1) == TRUE) if (CheckBagHasItem(ITEM_VS_SEEKER, 1) == TRUE)
{ {
if ((gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) < 100) if ((gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) < 100)
@@ -659,19 +662,12 @@ bool8 UpdateVsSeekerStepCounter(void)
if (FlagGet(FLAG_SYS_VS_SEEKER_CHARGING) == TRUE) if (FlagGet(FLAG_SYS_VS_SEEKER_CHARGING) == TRUE)
{ {
u8 x = (gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF; if (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) < 100)
u32 r4 = 0xFF;
if (x < 100)
{ {
x++; x = (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) + 1);
#ifndef NONMATCHING // fool the compiler that r4 has been changed
asm("":"=r"(r4));
#endif
gSaveBlock1Ptr->trainerRematchStepCounter = (gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) | (x << 8); gSaveBlock1Ptr->trainerRematchStepCounter = (gSaveBlock1Ptr->trainerRematchStepCounter & 0xFF) | (x << 8);
} }
x = (gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & r4; if (((gSaveBlock1Ptr->trainerRematchStepCounter >> 8) & 0xFF) == 100)
if (x == 100)
{ {
FlagClear(FLAG_SYS_VS_SEEKER_CHARGING); FlagClear(FLAG_SYS_VS_SEEKER_CHARGING);
VsSeekerResetChargingStepCounter(); VsSeekerResetChargingStepCounter();
@@ -860,16 +856,15 @@ static u8 CanUseVsSeeker(void)
static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0) static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0)
{ {
u16 r8 = 0; u16 r8 = 0;
u16 rval = 0;
u8 r7;
u8 sp0 = 0; u8 sp0 = 0;
u8 r0 = 0;
s32 vsSeekerIdx; s32 vsSeekerIdx;
u8 *r2; u8 *r2;
#ifndef NONMATCHING vsSeekerIdx = 0;
register u32 r3 asm("r3");
register s32 r0_ asm("r0");
asm("":::"r10", "r8", "r6", "r4");
#endif
for (vsSeekerIdx = 0; sVsSeeker->trainerInfo[vsSeekerIdx].localId != 0xFF; vsSeekerIdx++) while (sVsSeeker->trainerInfo[vsSeekerIdx].localId != 0xFF)
{ {
if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[vsSeekerIdx]) == 1) if (IsTrainerVisibleOnScreen(&sVsSeeker->trainerInfo[vsSeekerIdx]) == 1)
{ {
@@ -877,59 +872,42 @@ static u8 GetVsSeekerResponseInArea(const VsSeekerData * a0)
if (!HasTrainerBeenFought(r8)) if (!HasTrainerBeenFought(r8))
{ {
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerUnfought); StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerUnfought);
sVsSeeker->trainerInfo[vsSeekerIdx].trainerIdx += 0;
sVsSeeker->trainerHasNotYetBeenFought = 1; sVsSeeker->trainerHasNotYetBeenFought = 1;
vsSeekerIdx++;
continue;
}
r7 = GetNextAvailableRematchTrainer(a0, r8, &sp0);
if (r7 == 0)
{
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch);
sVsSeeker->trainerDoesNotWantRematch = 1;
} }
else else
{ {
u8 r7 = GetNextAvailableRematchTrainer(a0, r8, &sp0); rval = Random() % 100;
if (r7 == 0) r0 = GetCurVsSeekerResponse(vsSeekerIdx, r8);
if (r0 == 2)
rval = 100;
else if (r0 == 1)
rval = 0;
if (rval < 30)
{ {
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch); StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch);
#ifdef NONMATCHING
sVsSeeker->trainerDoesNotWantRematch = 1; sVsSeeker->trainerDoesNotWantRematch = 1;
#else
r2 = (u8 *)sVsSeeker;
r3 = 0x431;
asm("":::"r1");
r2 = &r2[r3];
*(r2) |= 2;
#endif
} }
else else
{ {
u16 rval = Random() % 100; gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[vsSeekerIdx].localId] = r7;
u8 r0 = GetCurVsSeekerResponse(vsSeekerIdx, r8); ShiftStillObjectEventCoords(&gObjectEvents[sVsSeeker->trainerInfo[vsSeekerIdx].objectEventId]);
if (r0 == 2) StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerRematch);
rval = 100; sVsSeeker->trainerIdxArray[sVsSeeker->numRematchableTrainers] = r8;
else if (r0 == 1) sVsSeeker->runningBehaviourEtcArray[sVsSeeker->numRematchableTrainers] = GetRunningBehaviorFromGraphicsId(sVsSeeker->trainerInfo[vsSeekerIdx].graphicsId);
rval = 0; sVsSeeker->numRematchableTrainers++;
if (rval < 30) sVsSeeker->trainerWantsRematch = 1;
{
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerNoRematch);
#ifdef NONMATCHING
sVsSeeker->trainerDoesNotWantRematch = 1;
#else
r2 = (u8 *)sVsSeeker;
r0_ = 0x431;
asm("":::"r1");
r2 = &r2[r0_];
*(r2) |= 2;
#endif
}
else
{
gSaveBlock1Ptr->trainerRematches[sVsSeeker->trainerInfo[vsSeekerIdx].localId] = r7;
ShiftStillObjectEventCoords(&gObjectEvents[sVsSeeker->trainerInfo[vsSeekerIdx].objectEventId]);
StartTrainerObjectMovementScript(&sVsSeeker->trainerInfo[vsSeekerIdx], sMovementScript_TrainerRematch);
sVsSeeker->trainerIdxArray[sVsSeeker->numRematchableTrainers] = r8;
sVsSeeker->runningBehaviourEtcArray[sVsSeeker->numRematchableTrainers] = GetRunningBehaviorFromGraphicsId(sVsSeeker->trainerInfo[vsSeekerIdx].graphicsId);
sVsSeeker->numRematchableTrainers++;
sVsSeeker->trainerWantsRematch = 1;
}
} }
} }
} }
vsSeekerIdx++;
} }
if (sVsSeeker->trainerWantsRematch) if (sVsSeeker->trainerWantsRematch)