Echoesdev blog

Waystones and act IV

Acts IV and V were planned as long levels of two to four rooms each. A death in the last room shouldn’t send you back to the first, so the long levels needed a checkpoint before they needed anything else.

The waystone

The waystone is w in a map, a cairn of three stones with a crystal in the top one. Touch it and it lights, with a chime, a burst of mint particles and a “waystone lit” label over the player. The waystone touched last is the respawn point, so walking back onto an earlier one moves the respawn back.

Relay, level 13. The light has just touched the first waystone, and the crystal on top of the cairn is burning.
Relay, level 13. The light has just touched the first waystone, and the crystal on top of the cairn is burning.

A respawn rebuilds the level from its map and stands the player on the lit waystone. Nothing carries over. There are no echoes and the memory is empty, so the first cast replays only what happened since. Every door is shut unless its plate is pressed, and every crumble stone is whole. The level clock keeps running. Death and R both do this. The pause menu’s Restart level starts over from the beginning with a fresh clock.

Relay, deep in the second room. A ghost holds the gate plate and the light has reached the dead-end plate at the far right.
Relay, deep in the second room. A ghost holds the gate plate and the light has reached the dead-end plate at the far right.
Then R. The light stands on the first waystone with both echo slots empty, 0.6 s of memory, and the gate shut. The clock went on from 0:11.7.
Then R. The light stands on the first waystone with both echo slots empty, 0.6 s of memory, and the gate shut. The clock went on from 0:11.7.

The respawn is an option of the world constructor, so the game and its checks build a room the same way:

-- opts.checkpoint = k starts the player on the k-th checkpoint (map order) with everything else fresh: no echoes,
-- an empty memory, doors shut, crumble stone intact. That is the whole respawn model, so a room is solvable from
-- its checkpoint exactly when it is solvable with nothing carried in.
function M.new(def, opts)

The playing scene calls it with whichever waystone the dying world had lit:

local function loadAttempt(fromCheckpoint)
  local checkpoint = fromCheckpoint and playing.world and playing.world.respawn or nil
  setStage(playing, Level.new(Levels[playing.index], { checkpoint = checkpoint }))

The full reset was a choice. Keeping your echoes through a respawn would be friendlier in the moment, but then whether a room could be solved would depend on what you did before you got there, and a room could become impossible after a bad death. With a full reset, a room is solvable from its waystone exactly when a fresh Level.new(def, { checkpoint = k }) can solve it.

A level declares its rooms

Each long level spells out its rooms. A room says where it starts, which tiles count as its exit, the one insight it asks for, a solve, and the naive approaches that must fail:

{
  name = 'Loop',
  insight = 'a ghost cast on arrival opens the door three seconds later, which is when you get back',
  from = 1,
  exit = { 58, 10, 59, 12 },
  solve = { ... },
  naive = { ... },
},

Every solve and every naive is played from a fresh respawn at from. A level with a waystone also owes a strategy for --slack and a room for its start and for each waystone. A level that’s missing any of them fails the build, so a waystone in a spot that needs a ghost from the room before it can’t ship.

Five levels

Each level in act IV combines two mechanics from the first three acts.

Relay is about when a door opens. A ghost cast as you arrive at a plate opens its door 3 seconds later. In the second room you cast standing on the gate plate, which holds the gate for 7 seconds. Then you run to a dead-end plate, cast there on arrival, and come back through the gate to a hatch that the second ghost opens as you get there. The third room repeats the loop on the lower floor with the exit far from the gate, so the far ghost’s 7 seconds also has to cover the walk out.

Plumb Line is about where a falling ghost stops. Its memory begins 3 seconds back, and it falls until the first veil below that point. In The Well you wait on a ledge between two veil strips, drop, and cast, so the ghost begins on the ledge and stops on the pad below it.

The Well. The cast came after the light waited on the ledge between the strips, so the ghost begins there. When it drops, the lower strip stops it on the pad, and the door beside the light opens a moment later.
The Well. The cast came after the light waited on the ledge between the strips, so the ghost begins there. When it drops, the lower strip stops it on the pad, and the door beside the light opens a moment later.

Undercroft is about crumble under a reflection. A reflected ghost breaks stone where you can’t stand, at your own height, and the hole stays open for 3 seconds.

Undercroft. The reflection walked across the gallery's crumble floor, and the light is in the crawlspace under the hole it left.
Undercroft. The reflection walked across the gallery’s crumble floor, and the light is in the crawlspace under the hole it left.

Crawlspace runs sideways under low roofs. A walking ghost stops at a veil and stands where it stops, so in the first room you run over the plate into a pocket, cast, and the ghost walks back until the veil parks it on the plate.

Crawlspace. The ghost stopped at the veil column and stands on the plate in the crumble bed. The light took the one-way ledge back over the bed and is dropping to the next room.
Crawlspace. The ghost stopped at the veil column and stands on the plate in the crumble bed. The light took the one-way ledge back over the bed and is dropping to the next room.

Ferryman’s Toll takes level 10’s ferry three times. In the second room the far dock is a plate over a veil, so the ferry that carries you also holds the door open when it stops. In the third the dock is in the middle of the pit, under a hatch in the ceiling.

Toll Gate. The ferry stopped at the veil on the dock plate, and the door past it is open.
Toll Gate. The ferry stopped at the veil on the dock plate, and the door past it is open.
Hatch. The ferry docked mid-pit and opened the hatch above it, and the light jumped up through it.
Hatch. The ferry docked mid-pit and opened the hatch above it, and the light jumped up through it.

Three ideas the simulation disproved

All five levels were planned on paper before any was built. Three of the plan’s assumptions turned out false in the simulation, and each was measured before the level changed.

The crumble rule is short enough to show. A cell with no crack yet checks every body in the world, you or a solid echo, and any one of them standing on it starts the timer:

for _, b in ipairs(bodies) do
  if standsOn(b, c) then
    c.crack = M.CRACK
    break
  end
end

Two exploits found after the build

A pass over the built levels went looking for exploits and changed two of them.

In Plumb Line’s second room, Twin Well, mashing X won. In the rebuilt room the corridor ends at a hole whose fall mirrors to a spot 16 px clear of the pad, so the natural way down fails, and mashing at the shrine after it is a naive that has to fail. The Well still falls to a masher, one cast 122 to 168 frames after landing. That one stays, because it’s the teach room and the winning ghost is the intended one.

In Crawlspace, stepping onto a plate and straight back pressed it for up to 18 frames. Three seconds later the replayed step opened the door for a player holding into it, and Short Memory Lane fell to one cast anywhere in a 50-frame window. Each door now stands behind a three-tile crumble bridge, which takes 32 frames to cross from standing. A player waiting at the door for the replayed press falls.

Plumb Line, turned on its side

Plumb Line was first built as one tall shaft, 71 tiles high. The camera shows eight rows above and below the player, so from a waystone in that shaft you could never see the pad the room is about. That breaks rule 3, which says the insight has to be visible from the waystone. The rebuild lays the three rooms side by side in a 75 by 17 map, joined by two-wide chimneys of one-way ledges. Each room is one screen tall and in view from its waystone. A retry from the waystone takes 7.5 to 7.7 seconds with the strategy’s usual waits, well under rule 7’s 15.

The numbers

--cheese finds no shallow strategy that reaches the exit of any act IV room:

LevelRoomsShallow runsNarrowest decision
13 Relay3510084 frames
14 Plumb Line36720117 frames
15 Undercroft36060138 frames
16 Crawlspace3462060 frames
17 Ferryman’s Toll3708024 px

The narrowest decision is the smallest slack window in each level’s strategy, against rule 5’s 30 frames or 24 px. Ferryman’s Toll also has the tap that steps onto the ferry at 7 frames, with a declared need of 6, as on level 10, because the ghost is only 10 px wide.