Alchemy

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.

Line 89

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.

Line 111

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.

Line 135

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.

Line 196

CrossboneIslePillarRooms_DrawRaisedPillars

static inline void CrossboneIslePillarRooms_DrawRaisedPillars(void)

Redraws all seven pillars at the raised water level.

Used by Event_FlipWaterSwitch, Scene_Initialize.

Line 229

CrossboneIslePillarRooms_RestoreGroundFootprint

static s32 CrossboneIslePillarRooms_RestoreGroundFootprint(s32 actorId)

Restores the ground tiles and collision attributes under the actor's footprint.

Used by Event_FlipWaterSwitch.

Line 241

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.

Line 269

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.

Line 291

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.

Line 321

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.

Line 383

CrossboneIslePillarRooms_SpawnUnusedLeaderParticle

UNUSED static void CrossboneIslePillarRooms_SpawnUnusedLeaderParticle(void)

Spawns the unused particle near the leader once every four frames.

Line 405

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.

Line 439

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.

Line 514

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.

Line 535

Scene_GetExits

const u32 *Scene_GetExits(void)

Returns the shared exits for the pillar rooms.

Line 566

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.

Line 588

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.

Line 596

CrossboneIslePillarRooms_JitterBackgroundScroll

static void CrossboneIslePillarRooms_JitterBackgroundScroll(void)

Randomly substitutes the shifted background scroll during the water transition.

Used by CrossboneIslePillarRooms_AnimateWaterLevel.

Line 631

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.

Line 648

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.

Line 655

CrossboneIslePillarRooms_AnimateWaterLevel

static void CrossboneIslePillarRooms_AnimateWaterLevel(void)

Reveals the alternate water tiles through a gradually randomized scroll transition.

Used by Event_FlipWaterSwitch.

Line 673

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.

Line 716

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.

Line 773

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.

Line 799

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.

Line 833

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.

Line 885

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.

Line 952

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.

Line 1041

Event_ClimbUp

static void Event_ClimbUp(void)

Walking north at room 4's ladder: climb up.

Used by gCrossboneIslePillarRoomsEvents4.

Line 1061

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.

Line 1065

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.

Line 1082

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.

Line 1090

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.

Line 1107

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.

Line 1128

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.

Line 1147

Event_FreezeSecondPool

static void Event_FreezeSecondPool(void)

Frost on the second pool in room 5.

Used by gCrossboneIslePillarRoomsEvents5.

Line 1152

Event_FrostBeginsOnThirdPool

static void Event_FrostBeginsOnThirdPool(void)

Frost begins on the third pool: note whether the leader stands on it.

Used by gCrossboneIslePillarRoomsEvents5.

Line 1157

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.

Line 1176

CrossboneIslePillarRooms_SpawnFrostParticle

static void CrossboneIslePillarRooms_SpawnFrostParticle(void)

Emits growing, rotating particles during the third pool's Frost sequence.

Used by Event_FreezeThirdPool.

Line 1192

CrossboneIslePillarRooms_SpawnThawParticle

static s32 CrossboneIslePillarRooms_SpawnThawParticle(union FieldObject *fieldObject)

Emits a randomized particle from the thawing pool every eight frames.

Used by Event_FreezeThirdPool.

Line 1238

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.

Line 1279

Event_StartMovingSinkingPillar

static void Event_StartMovingSinkingPillar(void)

Move begins on room 5's sinking pillar: its cell is cleared.

Used by Event_PushSinkingPillar, gCrossboneIslePillarRoomsEvents5.

Line 1322

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.

Line 1338

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.

Line 1361

CrossboneIslePillarRooms_PrepLoweredActor

static void CrossboneIslePillarRooms_PrepLoweredActor(s32 id)

Prepares the lowered actor's collision and draw priority below the leader.

Used by Scene_Initialize.

Line 1397

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.

Line 1409

CrossboneIslePillarRooms_InitializePillarPriority

static void CrossboneIslePillarRooms_InitializePillarPriority(s32 id)

Uses terrain layer 2 and installs the moving pillar's priority callback.

Used by Scene_Initialize.

Line 1428

CrossboneIslePillarRooms_UpdateLeaderPriority

static void CrossboneIslePillarRooms_UpdateLeaderPriority(void)

Matches the leader's draw priority to a nearby pillar in front.

Used by Scene_Initialize.

Line 1442

Scene_Initialize

s32 Scene_Initialize(void)

Restores each room's pillar footprints, water state, and persistent puzzle state.

Line 1467

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.

FieldDeclared as
xs32 x16-pixel map cells
ys32 y16-pixel map cells
zs32 z16-pixel map cells
cellunion CrossboneIslePillarCell cell

Used by CrossboneIslePillarRooms_SortPillarActors.

Line 607

PillarSlot

struct PillarSlot

Where one of room 4's pillars stands, the ground cell saved under it and its footprint flag.

FieldDeclared as
xs32 x16-pixel map cells
ys32 y16-pixel map cells
zs32 z16-pixel map cells
cellunion CrossboneIslePillarCell cell
flags32 flag

Used by sPillarSlots.

Line 616

Unions

CrossboneIslePillarCell

union CrossboneIslePillarCell

A copied map cell, also read in the two flag pairs the pillar redraw keeps.

FieldDeclared as
cellstruct MapCell cell
metatile, lowFlags, highFlags, collisionCode, attributeB, bitsstruct 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.

Line 66

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.

Line 57

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.

Line 1590

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.

On this page

FunctionsCrossboneIslePillarRooms_SettleActorOnGroundCrossboneIslePillarRooms_StopAtGroundOrHeightCrossboneIslePillarRooms_QueryFootprintCrossboneIslePillarRooms_DrawRaisedFootprintCrossboneIslePillarRooms_DrawRaisedPillarsCrossboneIslePillarRooms_RestoreGroundFootprintCrossboneIslePillarRooms_ReadMapCellCrossboneIslePillarRooms_SetCellAttributesCrossboneIslePillarRooms_LowerActorToLedgeCrossboneIslePillarRooms_ShrinkPillarCrossboneIslePillarRooms_SpawnUnusedLeaderParticleCrossboneIslePillarRooms_TryJumpAcrossPillarCrossboneIslePillarRooms_UpdateDampedParticleCrossboneIslePillarRooms_SetChildValueFromTimerScene_GetExitsEvent_JumpOrPushPillarEvent_PushPillarCrossboneIslePillarRooms_JitterBackgroundScrollDma_WaitCrossboneIslePillarRooms_PrepareWaterScrollCrossboneIslePillarRooms_AnimateWaterLevelEvent_FlipWaterSwitchCrossboneIslePillarRooms_SyncPriorityIfBehindCrossboneIslePillarRooms_SyncPriorityIfAheadCrossboneIslePillarRooms_UpdateActorPriorityCrossboneIslePillarRooms_SortPillarActorsEvent_MovePillarEvent_JumpOrPushRoom4PillarEvent_ClimbUpEvent_PushOrClimbDownEvent_StartRisingEvent_StopRisingCrossboneIslePillarRooms_UpdateFrozenPoolPriorityCrossboneIslePillarRooms_FreezePoolEvent_FreezeFirstPoolEvent_FreezeSecondPoolEvent_FrostBeginsOnThirdPoolEvent_FrostRaisesPillarCrossboneIslePillarRooms_SpawnFrostParticleCrossboneIslePillarRooms_SpawnThawParticleEvent_FreezeThirdPoolEvent_StartMovingSinkingPillarEvent_MoveSinkingPillarEvent_PushSinkingPillarCrossboneIslePillarRooms_PrepLoweredActorCrossboneIslePillarRooms_RestoreFlaggedPillarCrossboneIslePillarRooms_InitializePillarPriorityCrossboneIslePillarRooms_UpdateLeaderPriorityScene_InitializeStructuresPillarPlacementPillarSlotUnionsCrossboneIslePillarCellMacrosWATER_RAISED_FLAGDIRECTION_STEP