Bug fixes involving warps and followers
Fixes issues where follower would load in strangely after a scripted warp. Also added a macro (setfollowerwarppos) to control how the follower appears after scripted warps.
This commit is contained in:
1 parent
2d639a01fa
commit
10265938f7
6 files changed
+88
-3
No files matched your search
@@ -1984,3 +1984,8 @@
|
||||
setvar VAR_UNUSED_0x8014, 0
|
||||
callnative FollowerIntoPokeball
|
||||
.endm
|
||||
|
||||
.macro setfollowerwarppos pos:req
|
||||
setvar VAR_RESULT, \pos
|
||||
callnative SetFollowerWarpPosition
|
||||
.endm
|
||||
@@ -10459,6 +10459,28 @@ u8 MovementAction_FollowingPokemon_Grow_Step1(struct ObjectEvent *objectEvent, s
|
||||
StartFieldEffectForObjectEvent(FLDEFF_FEET_IN_FLOWING_WATER, objectEvent);
|
||||
}
|
||||
gPlayerAvatar.preventStep = FALSE;
|
||||
|
||||
// Account for warps in scripts where the follower needs to pop out of a pokeball afterwards
|
||||
if (gSaveBlock2Ptr->follower.createSurfBlob == 2)
|
||||
{
|
||||
sprite->data[7] = 0;
|
||||
gSaveBlock2Ptr->follower.createSurfBlob = 0;
|
||||
switch(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection)
|
||||
{
|
||||
case DIR_SOUTH:
|
||||
ObjectEventForceSetHeldMovement(objectEvent, MOVEMENT_ACTION_FOLLOWING_POKEMON_FACESOUTH);
|
||||
break;
|
||||
case DIR_NORTH:
|
||||
ObjectEventForceSetHeldMovement(objectEvent, MOVEMENT_ACTION_FOLLOWING_POKEMON_FACENORTH);
|
||||
break;
|
||||
case DIR_WEST:
|
||||
ObjectEventForceSetHeldMovement(objectEvent, MOVEMENT_ACTION_FOLLOWING_POKEMON_FACEWEST);
|
||||
break;
|
||||
case DIR_EAST:
|
||||
ObjectEventForceSetHeldMovement(objectEvent, MOVEMENT_ACTION_FOLLOWING_POKEMON_FACEEAST);
|
||||
break;
|
||||
}
|
||||
}
|
||||
sprite->data[2]++;
|
||||
}
|
||||
|
||||
|
||||
@@ -161,8 +161,10 @@ int ProcessPlayerFieldInput(struct FieldInput *input)
|
||||
if (TryStartStepBasedScript(&position, metatileBehavior, playerDirection) == TRUE)
|
||||
return TRUE;
|
||||
}
|
||||
else if(gSaveBlock2Ptr->follower.inProgress)
|
||||
else if(gSaveBlock2Ptr->follower.inProgress && gSaveBlock2Ptr->follower.createSurfBlob != 2)
|
||||
{
|
||||
// Keep the follower bouncing, unless we're dealing with a follower coming out of a pokeball after a scripted warp.
|
||||
// Need to stop bouncing to run the grow-out-of-pokeball animation
|
||||
ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gSaveBlock2Ptr->follower.objId]);
|
||||
ObjectEventSetHeldMovement(&gObjectEvents[gSaveBlock2Ptr->follower.objId], 0x9E);
|
||||
}
|
||||
|
||||
@@ -435,7 +435,11 @@ static void Task_ExitNonDoor(u8 taskId)
|
||||
if (WaitForWeatherFadeIn())
|
||||
{
|
||||
UnfreezeObjectEvents();
|
||||
gSaveBlock2Ptr->follower.comeOutDoorStairs = 2;
|
||||
|
||||
// Account for follower exiting pokeball after scripted warp
|
||||
if (gSaveBlock2Ptr->follower.createSurfBlob != 2)
|
||||
gSaveBlock2Ptr->follower.comeOutDoorStairs = 2;
|
||||
|
||||
UnlockPlayerFieldControls();
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
@@ -979,7 +983,7 @@ static void Task_SpinEnterWarp(u8 taskId)
|
||||
case 1:
|
||||
if (WaitForWeatherFadeIn() && IsPlayerSpinEntranceActive() != TRUE)
|
||||
{
|
||||
FollowMe_WarpSetEnd();
|
||||
//FollowMe_WarpSetEnd();
|
||||
UnfreezeObjectEvents();
|
||||
UnlockPlayerFieldControls();
|
||||
DestroyTask(taskId);
|
||||
|
||||
@@ -1528,3 +1528,7 @@ void ShowFollower(void)
|
||||
gObjectEvents[gSaveBlock2Ptr->follower.objId].invisible = FALSE;
|
||||
}
|
||||
|
||||
void SetFollowerWarpPosition(void)
|
||||
{
|
||||
gSaveBlock2Ptr->follower.createSurfBlob = 1;
|
||||
}
|
||||
@@ -1142,6 +1142,44 @@ static void SetPlayerCoordsFromWarp(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void SetFollowerCoordsFromWarp(void)
|
||||
{
|
||||
struct ObjectEvent* player = &gObjectEvents[gPlayerAvatar.objectEventId];
|
||||
struct ObjectEvent* follower = &gObjectEvents[gSaveBlock2Ptr->follower.objId];
|
||||
|
||||
gSaveBlock2Ptr->follower.warpEnd = 0;
|
||||
|
||||
// Based on value passed in via setfollowerwarppos macro, place the follower relative to the player.
|
||||
// If DIR_NONE, then setup for follower popping out of pokeball
|
||||
switch(gSpecialVar_Result)
|
||||
{
|
||||
case DIR_NONE:
|
||||
MoveObjectEventToMapCoords(follower, player->currentCoords.x, player->currentCoords.y);
|
||||
gSaveBlock2Ptr->follower.createSurfBlob = 2;
|
||||
break;
|
||||
case DIR_SOUTH:
|
||||
MoveObjectEventToMapCoords(follower, player->currentCoords.x, player->currentCoords.y + 1);
|
||||
follower->invisible = FALSE;
|
||||
gSaveBlock2Ptr->follower.createSurfBlob = 0;
|
||||
break;
|
||||
case DIR_NORTH:
|
||||
MoveObjectEventToMapCoords(follower, player->currentCoords.x, player->currentCoords.y - 1);
|
||||
follower->invisible = FALSE;
|
||||
gSaveBlock2Ptr->follower.createSurfBlob = 0;
|
||||
break;
|
||||
case DIR_WEST:
|
||||
MoveObjectEventToMapCoords(follower, player->currentCoords.x - 1, player->currentCoords.y);
|
||||
follower->invisible = FALSE;
|
||||
gSaveBlock2Ptr->follower.createSurfBlob = 0;
|
||||
break;
|
||||
case DIR_EAST:
|
||||
MoveObjectEventToMapCoords(follower, player->currentCoords.x + 1, player->currentCoords.y);
|
||||
follower->invisible = FALSE;
|
||||
gSaveBlock2Ptr->follower.createSurfBlob = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void WarpIntoMap(void)
|
||||
{
|
||||
ApplyCurrentWarp();
|
||||
@@ -2109,6 +2147,10 @@ static void CB2_LoadMap2(void)
|
||||
SetFieldVBlankCallback();
|
||||
SetMainCallback1(CB1_Overworld);
|
||||
SetMainCallback2(CB2_Overworld);
|
||||
|
||||
// Handle placing follower after warp as determined via setfollowerwarppos macro
|
||||
if (gSaveBlock2Ptr->follower.inProgress && gSaveBlock2Ptr->follower.createSurfBlob == 1)
|
||||
SetFollowerCoordsFromWarp();
|
||||
}
|
||||
|
||||
void CB2_ReturnToFieldContestHall(void)
|
||||
@@ -2497,6 +2539,12 @@ static bool32 ReturnToFieldLocal(u8 *state)
|
||||
break;
|
||||
case 1:
|
||||
InitViewGraphics();
|
||||
|
||||
#if FAST_FOLLOWERS == TRUE
|
||||
if (FlagGet(FLAG_FOLLOWER_IN_BUILDING))
|
||||
FieldSetDoorOpened(gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y - 1);
|
||||
#endif
|
||||
|
||||
TryLoadTrainerHillEReaderPalette();
|
||||
(*state)++;
|
||||
break;
|
||||
|
||||
Reference in new issue
Block a user