crossbone_isle_pillar_rooms.c
Crossbone Isle's pillar rooms: pillars to push, jump across, Move and Carry, the switch that raises the water in room 3, and the pools Frost freezes in room 5.
games/tbs/src/scene/crossbone_isle_pillar_rooms.c on GitHub
Crossbone Isle's pillar rooms: pillars to push, jump across, Move and Carry, the switch that raises the water in room 3, and the pools Frost freezes in room 5.
Functions
CrossboneIslePillarRooms_SettleActorOnGround
static void CrossboneIslePillarRooms_SettleActorOnGround(struct FieldActor *actor)
Waits up to sixty frames for landing, then stops vertical movement on the ground.
Used by Event_MovePillar.
CrossboneIslePillarRooms_StopAtGroundOrHeight
static void CrossboneIslePillarRooms_StopAtGroundOrHeight(struct FieldActor *actor, s32 limit)
Waits until the actor reaches the ground or height limit, then stops its descent.
Used by CrossboneIslePillarRooms_LowerActorToLedge, Event_MovePillar.
CrossboneIslePillarRooms_QueryFootprint
static s32 CrossboneIslePillarRooms_QueryFootprint(s32 id, u32 *width, u32 *depth, struct StagedActorProbe *probe, s32 *layerOriginX, s32 *layerOriginZ)
Finds the actor's footprint dimensions, grid position, and map-layer origin.
Used by CrossboneIslePillarRooms_DrawRaisedFootprint, CrossboneIslePillarRooms_RestoreGroundFootprint.
CrossboneIslePillarRooms_DrawRaisedFootprint
static s32 CrossboneIslePillarRooms_DrawRaisedFootprint(s32 actorId)
Draws the raised pillar's footprint and puts its actor under the leader.
Used by CrossboneIslePillarRooms_DrawRaisedPillars.
CrossboneIslePillarRooms_DrawRaisedPillars
static inline void CrossboneIslePillarRooms_DrawRaisedPillars(void)
Redraws all seven pillars at the raised water level.
Used by Event_FlipWaterSwitch, Scene_Initialize.
CrossboneIslePillarRooms_RestoreGroundFootprint
static s32 CrossboneIslePillarRooms_RestoreGroundFootprint(s32 actorId)
Restores the ground tiles and collision attributes under the actor's footprint.
Used by Event_FlipWaterSwitch.
CrossboneIslePillarRooms_ReadMapCell
static void CrossboneIslePillarRooms_ReadMapCell(s32 layer, s32 x, s32 y, union CrossboneIslePillarCell *dst)
Reads one map cell through DMA, waiting until the transfer finishes.
Used by Event_MovePillar.
CrossboneIslePillarRooms_SetCellAttributes
static void CrossboneIslePillarRooms_SetCellAttributes( s32 layer, s32 x, s32 y, const union CrossboneIslePillarCell *source)
Copies the cell's flags and collision attributes without replacing its tile.
Used by Event_MovePillar.
CrossboneIslePillarRooms_LowerActorToLedge
static s32 CrossboneIslePillarRooms_LowerActorToLedge(s32 id, s32 far)
Finds the next terrain ledge and stops the falling actor at its projected height.
Used by Event_MovePillar.
CrossboneIslePillarRooms_ShrinkPillar
static void CrossboneIslePillarRooms_ShrinkPillar(s32 index)
Shrinks the pillar and lowers its height for up to thirty-two frames.
Used by Event_MovePillar.
CrossboneIslePillarRooms_SpawnUnusedLeaderParticle
UNUSED static void CrossboneIslePillarRooms_SpawnUnusedLeaderParticle(void)
Spawns the unused particle near the leader once every four frames.
CrossboneIslePillarRooms_TryJumpAcrossPillar
static s32 CrossboneIslePillarRooms_TryJumpAcrossPillar(void)
Jumps two cells forward when both the intervening and landing cells permit it.
Used by Event_JumpOrPushPillar, Event_JumpOrPushRoom4Pillar, Event_PushOrClimbDown.
CrossboneIslePillarRooms_UpdateDampedParticle
static void CrossboneIslePillarRooms_UpdateDampedParticle(union FieldObject *object)
Moves the particle while damping its velocity, growing it, and advancing rotation.
Used by CrossboneIslePillarRooms_SpawnFrostParticle.
CrossboneIslePillarRooms_SetChildValueFromTimer
static s32 CrossboneIslePillarRooms_SetChildValueFromTimer( struct ScriptInterpreter *interpreter)
Applies the actor timer's low four bits to its child sprite value.
Used by gCrossboneIslePillarRooms_ActionTable.
Scene_GetExits
const u32 *Scene_GetExits(void)
Returns the shared exits for the pillar rooms.
Event_JumpOrPushPillar
static void Event_JumpOrPushPillar(void)
Walking into a pillar in room 1: jump two cells across it where the cells allow, otherwise push it.
Used by gCrossboneIslePillarRoomsEvents1.
Event_PushPillar
static void Event_PushPillar(void)
Walking into a pillar in rooms 2 and 3: push it if the cell beyond is clear.
Used by gCrossboneIslePillarRoomsEvents2, gCrossboneIslePillarRoomsEvents3.
CrossboneIslePillarRooms_JitterBackgroundScroll
static void CrossboneIslePillarRooms_JitterBackgroundScroll(void)
Randomly substitutes the shifted background scroll during the water transition.
Used by CrossboneIslePillarRooms_AnimateWaterLevel.
Dma_Wait
static __inline__ void Dma_Wait(volatile u32 *dma)
Waits until the DMA channel clears its enable bit.
Used by Colosso_LoadLettering, CrossboneIslePillarRooms_SortPillarActors, Event_MovePillar.
CrossboneIslePillarRooms_PrepareWaterScroll
static void CrossboneIslePillarRooms_PrepareWaterScroll(void)
Copies the three background scroll pairs and shifts their vertical offsets by 192 pixels.
Used by CrossboneIslePillarRooms_AnimateWaterLevel.
CrossboneIslePillarRooms_AnimateWaterLevel
static void CrossboneIslePillarRooms_AnimateWaterLevel(void)
Reveals the alternate water tiles through a gradually randomized scroll transition.
Used by Event_FlipWaterSwitch.
Event_FlipWaterSwitch
static void Event_FlipWaterSwitch(void)
Searching the switch in room 3 flips it. "Isaac flipped the switch." The water rises, or drains, and the pillars stand higher or lower with it.
Used by gCrossboneIslePillarRoomsEvents3.
CrossboneIslePillarRooms_SyncPriorityIfBehind
static s32 CrossboneIslePillarRooms_SyncPriorityIfBehind(struct FieldActor *actor, struct FieldActor *front)
Matches a nearby actor's draw priority when it is behind the comparison actor.
Used by CrossboneIslePillarRooms_UpdateActorPriority.
CrossboneIslePillarRooms_SyncPriorityIfAhead
static s32 CrossboneIslePillarRooms_SyncPriorityIfAhead(struct FieldActor *front, struct FieldActor *actor)
Matches the comparison actor's draw priority when it overlaps the actor in front.
Used by CrossboneIslePillarRooms_UpdateActorPriority.
CrossboneIslePillarRooms_UpdateActorPriority
static s32 CrossboneIslePillarRooms_UpdateActorPriority(union FieldObject *fieldObject)
Keeps each moving pillar's priority and collision flags consistent with the leader.
Used by CrossboneIslePillarRooms_InitializePillarPriority.
CrossboneIslePillarRooms_SortPillarActors
static void CrossboneIslePillarRooms_SortPillarActors(void)
Sorts the four pillars by height and depth, carrying their saved cell state with them.
Used by Event_MovePillar.
Event_MovePillar
static void Event_MovePillar(void)
Move or Carry on one of room 4's pillars, and after each push there: the pillars settle, and their footprints follow them.
Used by Event_JumpOrPushRoom4Pillar, Scene_Initialize, gCrossboneIslePillarRoomsEvents4.
Event_JumpOrPushRoom4Pillar
static void Event_JumpOrPushRoom4Pillar(void)
Walking into a pillar in room 4: jump across if possible, otherwise push it, and the pillars settle.
Used by Event_PushOrClimbDown, gCrossboneIslePillarRoomsEvents4.
Event_ClimbUp
static void Event_ClimbUp(void)
Walking north at room 4's ladder: climb up.
Used by gCrossboneIslePillarRoomsEvents4.
Event_PushOrClimbDown
static void Event_PushOrClimbDown(void)
Walking south at room 4's ladder: push the pillar below, jump, or climb down.
Used by gCrossboneIslePillarRoomsEvents4.
Event_StartRising
static void Event_StartRising(void)
Stepping on trigger 40 in room 4: the fade overlay follows the leader, and the leader's rise counter starts.
Used by gCrossboneIslePillarRoomsEvents4.
Event_StopRising
static void Event_StopRising(void)
Stepping on trigger 41 in room 4: the overlay lets the leader go, and the rise counter stops.
Used by Scene_Initialize, gCrossboneIslePillarRoomsEvents4.
CrossboneIslePillarRooms_UpdateFrozenPoolPriority
static s32 CrossboneIslePillarRooms_UpdateFrozenPoolPriority( union FieldObject *fieldObject)
Puts the frozen pool under the leader when it is behind and below the leader.
Used by CrossboneIslePillarRooms_FreezePool, CrossboneIslePillarRooms_RestoreFlaggedPillar.
CrossboneIslePillarRooms_FreezePool
static void CrossboneIslePillarRooms_FreezePool(s32 id)
Remembers the frozen pool, installs its priority callback, and starts its flicker script.
Used by Event_FreezeFirstPool, Event_FreezeSecondPool.
Event_FreezeFirstPool
static void Event_FreezeFirstPool(void)
Frost on the first pool in room 5: it freezes into a pillar of ice.
Used by gCrossboneIslePillarRoomsEvents5.
Event_FreezeSecondPool
static void Event_FreezeSecondPool(void)
Frost on the second pool in room 5.
Used by gCrossboneIslePillarRoomsEvents5.
Event_FrostBeginsOnThirdPool
static void Event_FrostBeginsOnThirdPool(void)
Frost begins on the third pool: note whether the leader stands on it.
Used by gCrossboneIslePillarRoomsEvents5.
Event_FrostRaisesPillar
static void Event_FrostRaisesPillar(void)
Later in the same Frost: the third pool shrinks back, and the pillar beside it (actor 14) rises 32 pixels.
Used by gCrossboneIslePillarRoomsEvents5.
CrossboneIslePillarRooms_SpawnFrostParticle
static void CrossboneIslePillarRooms_SpawnFrostParticle(void)
Emits growing, rotating particles during the third pool's Frost sequence.
Used by Event_FreezeThirdPool.
CrossboneIslePillarRooms_SpawnThawParticle
static s32 CrossboneIslePillarRooms_SpawnThawParticle(union FieldObject *fieldObject)
Emits a randomized particle from the thawing pool every eight frames.
Used by Event_FreezeThirdPool.
Event_FreezeThirdPool
static void Event_FreezeThirdPool(void)
Frost ends on the third pool: unless the leader stood on it, it freezes, and a frozen second pool thaws back to water.
Used by gCrossboneIslePillarRoomsEvents5.
Event_StartMovingSinkingPillar
static void Event_StartMovingSinkingPillar(void)
Move begins on room 5's sinking pillar: its cell is cleared.
Used by Event_PushSinkingPillar, gCrossboneIslePillarRoomsEvents5.
Event_MoveSinkingPillar
static void Event_MoveSinkingPillar(void)
Move on room 5's sinking pillar, and after each push: once it reaches column 16 it sinks two pixels into place for good.
Used by Event_PushSinkingPillar, Scene_Initialize, gCrossboneIslePillarRoomsEvents5.
Event_PushSinkingPillar
static void Event_PushSinkingPillar(void)
Walking into room 5's sinking pillar: push it if the cell beyond is clear.
Used by gCrossboneIslePillarRoomsEvents5.
CrossboneIslePillarRooms_PrepLoweredActor
static void CrossboneIslePillarRooms_PrepLoweredActor(s32 id)
Prepares the lowered actor's collision and draw priority below the leader.
Used by Scene_Initialize.
CrossboneIslePillarRooms_RestoreFlaggedPillar
static void CrossboneIslePillarRooms_RestoreFlaggedPillar(s32 actorId)
Restores a previously frozen pillar's mode, map cell, priority hook, and script.
Used by Scene_Initialize.
CrossboneIslePillarRooms_InitializePillarPriority
static void CrossboneIslePillarRooms_InitializePillarPriority(s32 id)
Uses terrain layer 2 and installs the moving pillar's priority callback.
Used by Scene_Initialize.
CrossboneIslePillarRooms_UpdateLeaderPriority
static void CrossboneIslePillarRooms_UpdateLeaderPriority(void)
Matches the leader's draw priority to a nearby pillar in front.
Used by Scene_Initialize.
Scene_Initialize
s32 Scene_Initialize(void)
Restores each room's pillar footprints, water state, and persistent puzzle state.
Also, functions without a comment: Scene_GetEntrances, Scene_GetRegions, Scene_GetPlacements, Scene_GetEvents.
Structures
PillarPlacement
struct PillarPlacement
A pillar slot's place and ground cell, without its flag; it holds one slot while two are swapped.
| Field | Declared as | |
|---|---|---|
x | s32 x | 16-pixel map cells |
y | s32 y | 16-pixel map cells |
z | s32 z | 16-pixel map cells |
cell | union CrossboneIslePillarCell cell |
Used by CrossboneIslePillarRooms_SortPillarActors.
PillarSlot
struct PillarSlot
Where one of room 4's pillars stands, the ground cell saved under it and its footprint flag.
| Field | Declared as | |
|---|---|---|
x | s32 x | 16-pixel map cells |
y | s32 y | 16-pixel map cells |
z | s32 z | 16-pixel map cells |
cell | union CrossboneIslePillarCell cell | |
flag | s32 flag |
Used by sPillarSlots.
Unions
CrossboneIslePillarCell
union CrossboneIslePillarCell
A copied map cell, also read in the two flag pairs the pillar redraw keeps.
| Field | Declared as | |
|---|---|---|
cell | struct MapCell cell | |
metatile, lowFlags, highFlags, collisionCode, attributeB, bits | struct CrossboneIslePillarCellBits { u32 metatile : 12; u32 lowFlags : 2; ///< bits 13..12 of MapCell.metatileAndFlags u8 highFlags : 2; ///< bits 15..14, read by Map_GetCellHighFlags u8 collisionCode; u8 attributeB; } bits |
Used by CrossboneIslePillarRooms_ReadMapCell, CrossboneIslePillarRooms_SetCellAttributes, Event_MovePillar, offsetof.
Macros
WATER_RAISED_FLAG
#define WATER_RAISED_FLAG FLAG_SCENE_TEMP_00
Room 3: the water has been raised.
Used by CrossboneIslePillarRooms_AnimateWaterLevel, Event_FlipWaterSwitch, Scene_Initialize.
DIRECTION_STEP
#define DIRECTION_STEP(dx, dz) (((dx) << 16) | ((dz) & 0xffff))
Pixel step by direction: X in the upper halfword, Z in the lower.
Used by gBilibinCave_PushSteps, gBilibin_FacingCellSteps, gColossoRiver_DirectionSteps, gColossoWall_DirectionSteps, gStagedActor_DirectionSteps.
Also, macros without a comment: WATER_ACTOR, FIRST_FROZEN_POOL_FLAG, LEADER_ON_THIRD_POOL_FLAG, PILLAR_SUNK_FLAG.
Globals, without a comment: offsetof, offsetof, sPillarSlots, sProbePosition, sShakenScroll, sShakeChance, gEffectScript0, gEffectScript1, gEffectScript2, gStagedActor_DirectionSteps, gStagedActor_FootprintKinds, gStagedActor_FootprintBounds, gEffectScripts, gCrossboneIslePillarRooms_ActionTable, gCrossboneIslePillarRooms_ShiftSteps1, gCrossboneIslePillarRooms_ShiftSteps2, gCrossboneIslePillarRooms_ShiftSteps3, gCrossboneIslePillarRooms_ShiftSteps4, gCrossboneIslePillarRooms_ShiftSteps5, gCrossboneIslePillarRoomsEntrancesOther, gCrossboneIslePillarRoomsEntrances1, gCrossboneIslePillarRoomsEntrances2, gCrossboneIslePillarRoomsEntrances3, gCrossboneIslePillarRoomsEntrances4, gCrossboneIslePillarRoomsEntrances5, gCrossboneIslePillarRoomsExits, gCrossboneIslePillarRoomsNoPlacements, gCrossboneIslePillarRoomsPlacements1, gCrossboneIslePillarRoomsPlacements2, gCrossboneIslePillarRoomsPlacements3, gCrossboneIslePillarRoomsPlacementsOther, gCrossboneIslePillarRoomsPlacements5, gCrossboneIslePillarRoomsEventsOther, gCrossboneIslePillarRoomsEvents1, gCrossboneIslePillarRoomsEvents2, gCrossboneIslePillarRoomsEvents3, gCrossboneIslePillarRoomsEvents4, gCrossboneIslePillarRoomsEvents5.