add stair warps
This commit is contained in:
parent
d888fe1013
commit
8857579519
@ -236,10 +236,10 @@
|
||||
#define MB_WIRELESS_BOX_RESULTS 0xE8
|
||||
#define MB_TRAINER_HILL_TIMER 0xE9
|
||||
#define MB_SKY_PILLAR_CLOSED_DOOR 0xEA
|
||||
#define MB_UNUSED_EB 0xEB
|
||||
#define MB_UNUSED_EC 0xEC
|
||||
#define MB_UNUSED_ED 0xED
|
||||
#define MB_UNUSED_EE 0xEE
|
||||
#define MB_UP_RIGHT_STAIR_WARP 0xEB
|
||||
#define MB_UP_LEFT_STAIR_WARP 0xEC
|
||||
#define MB_DOWN_RIGHT_STAIR_WARP 0xED
|
||||
#define MB_DOWN_LEFT_STAIR_WARP 0xEE
|
||||
#define MB_UNUSED_EF 0xEF
|
||||
|
||||
#endif // GUARD_METATILE_BEHAVIORS
|
||||
|
||||
@ -40,5 +40,7 @@ void FadeOutOrbEffect(void);
|
||||
void sub_80B05B4(void);
|
||||
void WriteFlashScanlineEffectBuffer(u8 flashLevel);
|
||||
bool8 IsPlayerStandingStill(void);
|
||||
void DoStairWarp(u16 metatileBehavior, u16 delay);
|
||||
bool8 IsDirectionalStairWarpMetatileBehavior(u16 metatileBehavior, u8 playerDirection);
|
||||
|
||||
#endif // GUARD_FIELD_SCREEN_EFFECT_H
|
||||
|
||||
@ -283,6 +283,7 @@ enum
|
||||
COLLISION_ISOLATED_HORIZONTAL_RAIL,
|
||||
COLLISION_VERTICAL_RAIL,
|
||||
COLLISION_HORIZONTAL_RAIL,
|
||||
COLLISION_STAIR_WARP,
|
||||
};
|
||||
|
||||
// player running states
|
||||
|
||||
@ -145,5 +145,10 @@ bool8 MetatileBehavior_IsQuestionnaire(u8);
|
||||
bool8 MetatileBehavior_IsLongGrass_Duplicate(u8);
|
||||
bool8 MetatileBehavior_IsLongGrassSouthEdge(u8);
|
||||
bool8 MetatileBehavior_IsTrainerHillTimer(u8);
|
||||
bool8 MetatileBehavior_IsDirectionalUpRightStairWarp(u8 metatileBehavior);
|
||||
bool8 MetatileBehavior_IsDirectionalUpLeftStairWarp(u8 metatileBehavior);
|
||||
bool8 MetatileBehavior_IsDirectionalDownRightStairWarp(u8 metatileBehavior);
|
||||
bool8 MetatileBehavior_IsDirectionalDownLeftStairWarp(u8 metatileBehavior);
|
||||
bool8 MetatileBehavior_IsDirectionalStairWarp(u8 metatileBehavior);
|
||||
|
||||
#endif // GUARD_METATILE_BEHAVIOR
|
||||
|
||||
@ -689,13 +689,31 @@ static bool8 CheckStandardWildEncounter(u16 metatileBehavior)
|
||||
static bool8 TryArrowWarp(struct MapPosition *position, u16 metatileBehavior, u8 direction)
|
||||
{
|
||||
s8 warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position);
|
||||
u16 delay;
|
||||
|
||||
if (IsArrowWarpMetatileBehavior(metatileBehavior, direction) == TRUE && warpEventId != -1)
|
||||
if (warpEventId != -1)
|
||||
{
|
||||
StoreInitialPlayerAvatarState();
|
||||
SetupWarp(&gMapHeader, warpEventId, position);
|
||||
DoWarp();
|
||||
return TRUE;
|
||||
if (IsArrowWarpMetatileBehavior(metatileBehavior, direction) == TRUE)
|
||||
{
|
||||
StoreInitialPlayerAvatarState();
|
||||
SetupWarp(&gMapHeader, warpEventId, position);
|
||||
DoWarp();
|
||||
return TRUE;
|
||||
}
|
||||
else if (IsDirectionalStairWarpMetatileBehavior(metatileBehavior, direction) == TRUE)
|
||||
{
|
||||
delay = 0;
|
||||
if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))
|
||||
{
|
||||
SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
|
||||
delay = 12;
|
||||
}
|
||||
|
||||
StoreInitialPlayerAvatarState();
|
||||
SetupWarp(&gMapHeader, warpEventId, position);
|
||||
DoStairWarp(metatileBehavior, delay);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
#include "field_camera.h"
|
||||
#include "field_effect.h"
|
||||
#include "field_effect_helpers.h"
|
||||
#include "field_screen_effect.h"
|
||||
#include "field_player_avatar.h"
|
||||
#include "fieldmap.h"
|
||||
#include "menu.h"
|
||||
@ -625,6 +626,10 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys)
|
||||
PlayerNotOnBikeCollideWithFarawayIslandMew(direction);
|
||||
return;
|
||||
}
|
||||
else if (collision == COLLISION_STAIR_WARP)
|
||||
{
|
||||
PlayerFaceDirection(direction);
|
||||
}
|
||||
else
|
||||
{
|
||||
u8 adjustedCollision = collision - COLLISION_STOP_SURFING;
|
||||
@ -661,6 +666,9 @@ static u8 CheckForPlayerAvatarCollision(u8 direction)
|
||||
|
||||
x = playerObjEvent->currentCoords.x;
|
||||
y = playerObjEvent->currentCoords.y;
|
||||
if (IsDirectionalStairWarpMetatileBehavior(MapGridGetMetatileBehaviorAt(x, y), direction))
|
||||
return COLLISION_STAIR_WARP;
|
||||
|
||||
MoveCoords(direction, &x, &y);
|
||||
return CheckForObjectEventCollision(playerObjEvent, x, y, direction, MapGridGetMetatileBehaviorAt(x, y));
|
||||
}
|
||||
|
||||
@ -49,6 +49,7 @@ static void task0A_mpl_807E31C(u8 taskId);
|
||||
static void Task_WarpAndLoadMap(u8 taskId);
|
||||
static void Task_DoDoorWarp(u8 taskId);
|
||||
static void Task_EnableScriptAfterMusicFade(u8 taskId);
|
||||
static void Task_ExitStairs(u8 taskId);
|
||||
|
||||
// const
|
||||
static const u16 sFlashLevelPixelRadii[] = { 200, 72, 64, 56, 48, 40, 32, 24, 0 };
|
||||
@ -266,6 +267,8 @@ static void SetUpWarpExitTask(void)
|
||||
behavior = MapGridGetMetatileBehaviorAt(x, y);
|
||||
if (MetatileBehavior_IsDoor(behavior) == TRUE)
|
||||
func = Task_ExitDoor;
|
||||
else if (MetatileBehavior_IsDirectionalStairWarp(behavior) == TRUE)
|
||||
func = Task_ExitStairs;
|
||||
else if (MetatileBehavior_IsNonAnimDoor(behavior) == TRUE)
|
||||
func = Task_ExitNonAnimDoor;
|
||||
else
|
||||
@ -1267,3 +1270,211 @@ static void Task_EnableScriptAfterMusicFade(u8 taskId)
|
||||
EnableBothScriptContexts();
|
||||
}
|
||||
}
|
||||
|
||||
//stair warps
|
||||
static void GetStairsMovementDirection(u8 a0, s16 *a1, s16 *a2)
|
||||
{
|
||||
if (MetatileBehavior_IsDirectionalUpRightStairWarp(a0))
|
||||
{
|
||||
*a1 = 16;
|
||||
*a2 = -10;
|
||||
}
|
||||
else if (MetatileBehavior_IsDirectionalUpLeftStairWarp(a0))
|
||||
{
|
||||
*a1 = -17;
|
||||
*a2 = -10;
|
||||
}
|
||||
else if (MetatileBehavior_IsDirectionalDownRightStairWarp(a0))
|
||||
{
|
||||
*a1 = 17;
|
||||
*a2 = 3;
|
||||
}
|
||||
else if (MetatileBehavior_IsDirectionalDownLeftStairWarp(a0))
|
||||
{
|
||||
*a1 = -17;
|
||||
*a2 = 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
*a1 = 0;
|
||||
*a2 = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static bool8 WaitStairExitMovementFinished(s16 *a0, s16 *a1, s16 *a2, s16 *a3, s16 *a4)
|
||||
{
|
||||
struct Sprite *sprite;
|
||||
sprite = &gSprites[gPlayerAvatar.spriteId];
|
||||
if (*a4 != 0)
|
||||
{
|
||||
*a2 += *a0;
|
||||
*a3 += *a1;
|
||||
sprite->pos2.x = *a2 >> 5;
|
||||
sprite->pos2.y = *a3 >> 5;
|
||||
(*a4)--;
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->pos2.x = 0;
|
||||
sprite->pos2.y = 0;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static void ExitStairsMovement(s16 *a0, s16 *a1, s16 *a2, s16 *a3, s16 *a4)
|
||||
{
|
||||
s16 x, y;
|
||||
u8 behavior;
|
||||
s32 r1;
|
||||
struct Sprite *sprite;
|
||||
|
||||
PlayerGetDestCoords(&x, &y);
|
||||
behavior = MapGridGetMetatileBehaviorAt(x, y);
|
||||
if (MetatileBehavior_IsDirectionalDownRightStairWarp(behavior) || MetatileBehavior_IsDirectionalUpRightStairWarp(behavior))
|
||||
r1 = 3;
|
||||
else
|
||||
r1 = 4;
|
||||
|
||||
ObjectEventForceSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], GetWalkInPlaceSlowMovementAction(r1));
|
||||
GetStairsMovementDirection(behavior, a0, a1);
|
||||
*a2 = *a0 * 16;
|
||||
*a3 = *a1 * 16;
|
||||
*a4 = 16;
|
||||
sprite = &gSprites[gPlayerAvatar.spriteId];
|
||||
sprite->pos2.x = *a2 >> 5;
|
||||
sprite->pos2.y = *a3 >> 5;
|
||||
*a0 *= -1;
|
||||
*a1 *= -1;
|
||||
}
|
||||
|
||||
static void Task_ExitStairs(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
switch (data[0])
|
||||
{
|
||||
default:
|
||||
if (WaitForWeatherFadeIn() == TRUE)
|
||||
{
|
||||
CameraObjectReset1();
|
||||
ScriptContext2_Disable();
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
break;
|
||||
case 0:
|
||||
Overworld_PlaySpecialMapMusic();
|
||||
WarpFadeInScreen();
|
||||
ScriptContext2_Enable();
|
||||
ExitStairsMovement(&data[1], &data[2], &data[3], &data[4], &data[5]);
|
||||
data[0]++;
|
||||
break;
|
||||
case 1:
|
||||
if (!WaitStairExitMovementFinished(&data[1], &data[2], &data[3], &data[4], &data[5]))
|
||||
data[0]++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool8 IsDirectionalStairWarpMetatileBehavior(u16 metatileBehavior, u8 playerDirection)
|
||||
{
|
||||
switch (playerDirection)
|
||||
{
|
||||
case DIR_WEST:
|
||||
if (MetatileBehavior_IsDirectionalUpLeftStairWarp(metatileBehavior))
|
||||
return TRUE;
|
||||
if (MetatileBehavior_IsDirectionalDownLeftStairWarp(metatileBehavior))
|
||||
return TRUE;
|
||||
break;
|
||||
case DIR_EAST:
|
||||
if (MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior))
|
||||
return TRUE;
|
||||
if (MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior))
|
||||
return TRUE;
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void ForceStairsMovement(u16 a0, s16 *a1, s16 *a2)
|
||||
{
|
||||
ObjectEventForceSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], GetWalkInPlaceNormalMovementAction(GetPlayerFacingDirection()));
|
||||
GetStairsMovementDirection(a0, a1, a2);
|
||||
}
|
||||
|
||||
static void UpdateStairsMovement(s16 a0, s16 a1, s16 *a2, s16 *a3, s16 *a4)
|
||||
{
|
||||
struct Sprite *playerSpr = &gSprites[gPlayerAvatar.spriteId];
|
||||
struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
|
||||
|
||||
if (a1 > 0 || *a4 > 6)
|
||||
*a3 += a1;
|
||||
|
||||
*a2 += a0;
|
||||
(*a4)++;
|
||||
playerSpr->pos2.x = *a2 >> 5;
|
||||
playerSpr->pos2.y = *a3 >> 5;
|
||||
if (playerObj->heldMovementFinished)
|
||||
ObjectEventForceSetHeldMovement(playerObj, GetWalkInPlaceNormalMovementAction(GetPlayerFacingDirection()));
|
||||
}
|
||||
|
||||
static void Task_StairWarp(u8 taskId)
|
||||
{
|
||||
s16 * data = gTasks[taskId].data;
|
||||
struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId];
|
||||
struct Sprite *playerSpr = &gSprites[gPlayerAvatar.spriteId];
|
||||
|
||||
switch (data[0])
|
||||
{
|
||||
case 0:
|
||||
ScriptContext2_Enable();
|
||||
FreezeObjectEvents();
|
||||
CameraObjectReset2();
|
||||
data[0]++;
|
||||
break;
|
||||
case 1:
|
||||
if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj))
|
||||
{
|
||||
if (data[15] != 0)
|
||||
data[15]--;
|
||||
else
|
||||
{
|
||||
TryFadeOutOldMapMusic();
|
||||
PlayRainStoppingSoundEffect();
|
||||
playerSpr->oam.priority = 1;
|
||||
ForceStairsMovement(data[1], &data[2], &data[3]);
|
||||
PlaySE(SE_KAIDAN);
|
||||
data[0]++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
UpdateStairsMovement(data[2], data[3], &data[4], &data[5], &data[6]);
|
||||
data[15]++;
|
||||
if (data[15] >= 12)
|
||||
{
|
||||
WarpFadeOutScreen();
|
||||
data[0]++;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
UpdateStairsMovement(data[2], data[3], &data[4], &data[5], &data[6]);
|
||||
if (!PaletteFadeActive() && BGMusicStopped())
|
||||
data[0]++;
|
||||
break;
|
||||
default:
|
||||
gFieldCallback = FieldCB_DefaultWarpExit;
|
||||
WarpIntoMap();
|
||||
SetMainCallback2(CB2_LoadMap);
|
||||
DestroyTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void DoStairWarp(u16 metatileBehavior, u16 delay)
|
||||
{
|
||||
u8 taskId = CreateTask(Task_StairWarp, 10);
|
||||
gTasks[taskId].data[1] = metatileBehavior;
|
||||
gTasks[taskId].data[15] = delay;
|
||||
Task_StairWarp(taskId);
|
||||
}
|
||||
|
||||
|
||||
@ -245,10 +245,10 @@ static const u8 sTileBitAttributes[] =
|
||||
[MB_WIRELESS_BOX_RESULTS] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_TRAINER_HILL_TIMER] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_SKY_PILLAR_CLOSED_DOOR] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_UNUSED_EB] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_UNUSED_EC] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_UNUSED_ED] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_UNUSED_EE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_UP_RIGHT_STAIR_WARP] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_UP_LEFT_STAIR_WARP] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_DOWN_RIGHT_STAIR_WARP] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_DOWN_LEFT_STAIR_WARP] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
[MB_UNUSED_EF] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
|
||||
};
|
||||
|
||||
@ -1488,3 +1488,43 @@ bool8 MetatileBehavior_IsTrainerHillTimer(u8 metatileBehavior)
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 MetatileBehavior_IsDirectionalUpRightStairWarp(u8 metatileBehavior)
|
||||
{
|
||||
if(metatileBehavior == MB_UP_RIGHT_STAIR_WARP)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 MetatileBehavior_IsDirectionalUpLeftStairWarp(u8 metatileBehavior)
|
||||
{
|
||||
if (metatileBehavior == MB_UP_LEFT_STAIR_WARP)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 MetatileBehavior_IsDirectionalDownRightStairWarp(u8 metatileBehavior)
|
||||
{
|
||||
if (metatileBehavior == MB_DOWN_RIGHT_STAIR_WARP)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 MetatileBehavior_IsDirectionalDownLeftStairWarp(u8 metatileBehavior)
|
||||
{
|
||||
if (metatileBehavior == MB_DOWN_LEFT_STAIR_WARP)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool8 MetatileBehavior_IsDirectionalStairWarp(u8 metatileBehavior)
|
||||
{
|
||||
if (metatileBehavior >= MB_UP_RIGHT_STAIR_WARP && metatileBehavior <= MB_DOWN_LEFT_STAIR_WARP)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -962,6 +962,10 @@ static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStr
|
||||
return DIR_EAST;
|
||||
else if (MetatileBehavior_IsEastArrowWarp(metatileBehavior) == TRUE)
|
||||
return DIR_WEST;
|
||||
else if (MetatileBehavior_IsDirectionalUpRightStairWarp(metatileBehavior) == TRUE || MetatileBehavior_IsDirectionalDownRightStairWarp(metatileBehavior) == TRUE)
|
||||
return DIR_WEST;
|
||||
else if (MetatileBehavior_IsDirectionalUpLeftStairWarp(metatileBehavior) == TRUE || MetatileBehavior_IsDirectionalDownLeftStairWarp(metatileBehavior) == TRUE)
|
||||
return DIR_EAST;
|
||||
else if ((playerStruct->transitionFlags == PLAYER_AVATAR_FLAG_UNDERWATER && transitionFlags == PLAYER_AVATAR_FLAG_SURFING)
|
||||
|| (playerStruct->transitionFlags == PLAYER_AVATAR_FLAG_SURFING && transitionFlags == PLAYER_AVATAR_FLAG_UNDERWATER ))
|
||||
return playerStruct->direction;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user