A first-person sword-and-sorcery game for the browser: wave after wave of the dead in a procedural stone maze. This is its working manual, in six phases and an update log, with every figure read from the files the game runs on, and the October 2026 polish update (the sword swing, stamina, boss levels, the maze landmarks and the model fixes) in five more parts.
The game is the Endless Vigil: a sword in one hand, a shield in the other, a few spells, and a stone maze that fills with the dead wave after wave (Three.js, in the browser). This page is generated: every number and name below is read from the game's data files and source when you run npm run docs, so it says what the game does, not what it was once meant to do.
21 × 21cells in the maze, each 6 m across
5 sbreak between two waves
6rarity tiers, Common to Mythic
15swords and shields to carry
138events the systems talk through
71.glb files in the catalog
Seven fighters, five maidens
The opening screen (a screenshot of data/title.json's diorama). Each of the five bosses that hold a maiden frees her the first time it falls, and she joins the middle of the maze. Iron Knight and Hollow King hold none. Once the ending has been seen in a browser, Hollow King stands veiled at the back of this screen too.
The fighters in order: the Iron Knight on every 5th wave that is not a boss wave, the bosses on waves 10, 20, 30, 40, 50, the Hollow King once on wave 60 and then the five round again from wave 70 (src/data/vigil.json waves)
Fighter
First wave
Holds
What beats it
First kill drops
Iron Knight
5
–
bombs (×2.5 through its plates) and a perfect parry (2.5 s of stagger)
any spell that lands while it winds up an attack (3.5 s on its knees)
Spire of the Drowned Lich, Pulsing Heart of the Colossus
Drowned Lich
20
● Silver Frost Elf
3 Ice Shards freeze it, then a fireball
Relic Sunblade, Aegis of the Forgotten
Veiled Matron
30
● Shadow Elf
light: a fireball, a Moon Wave, a torch lit again beside it or the Veil-Piercing Lens
Veilbreaker Lantern, Shroud of the Matron
Ember Tyrant
40
● Emerald Elf
its own fireball turned back by a mirror shield, and lightning for its plates
Tyrant's Ember Mace, Ember Crown
Forge Golem
50
● Crimson Elf
a Rune Bomb that bursts in its furnace while it inhales (5 s on its knees)
Forge Hammer, The Keepers' Songbook
Hollow King
60
–
a different fire in each of its 5 pools: a fireball or Rune Bomb that bursts in him while he winds up his moonfall; any spell that lands while he winds up an attack; 3 Ice Shards (then a fireball thaws him for +40); light (a fireball, a Moon Wave, a torch lit beside him, or the Veil-Piercing Lens; once in 15 s); his own moonfire or moonbeam turned back by a mirror shield
The Hollow King's Sword
The core loop
Title screen. A diorama of the 5 rescued maidens, the 7 fighters behind them (Iron Knight, Veiled Matron, Drowned Lich, Ember Tyrant, Forge Golem, Bone Colossus, Hollow King) and the loot, with Continue (if a save exists) and New Game, under the title The Last Fire and its subtitle Vigil for the Dying Moon. The click that starts the game also unlocks the sound. The first time a new game is begun in a browser a short crawl tells the tale first (4 paragraphs of The First Watch, climbing a brick wall lit by two flickering torches: any click, Esc, Space or Enter skips it, and Read the tale on the title screen plays it again); the mouse is captured when the run begins.
A wave. Wave n brings 3 + 2 × (n − 1) enemies, each placed where it could reach you within a few seconds of walking, so the early waves are never a long search through the maze.
The fight. Slash, block, parry and bash; cast fire, ice or lightning with Shift + click; throw a Rune Bomb with G; use the item in the active slot (a stagger horn, a lantern that shows the Shades, a step through a wall) with V, when its cooldown allows. Potions and mana crystals lie in the maze every wave, and walking over them uses them.
The wave is cleared. You score a bonus of 500 × the wave number, a checkpoint is saved (and written to the browser), and after 5 s the next wave starts.
Every 5th wave the Iron Knight comes alone; every 10th a boss comes alone (Bone Colossus, then Drowned Lich, then Veiled Matron, then Ember Tyrant, then Forge Golem, then again). A fallen boss drops its exclusive loot, a maiden it held captive is freed and runs to the middle of the maze, and picking up the reward saves a checkpoint.
A fall. A 3 s screen, then you stand up at the newest checkpoint with the health and mana you had then (at least 50%), carrying everything you carry. A fall before the first wave is cleared ends the run.
Controls
Controls (from src/data/player.json and the title screen)
Action
Input
What it does
Move
WASD and the mouse
6 m/s; the mouse looks (the pointer is captured by the first click)
Sprint
Shift
x1.6, 9.6 m/s, while the stamina lasts (part B). The same key turns a click into a cast
Dash
F
4 m along the move keys (a backstep with none held) in 0.2 s, for 30 stamina, with 0.12 s of invulnerability (part B)
Jump
Space
Jump force 8, gravity 20
Attack
Left click
A slash with the sword in hand: forehand, then backhand (Phase 1). On a marked enemy (staggered, guard-broken) the blow is an execution (part A)
Block
Right click (hold)
Raise the shield. A block raised just before a blow is a perfect parry. Every blow the shield stops wears down the guard meter (100 points); at 0 the guard breaks and you are staggered for 1.2 s (Phase 1)
Lock on
Tab (tap: lock the nearest in front, tap again: the next, hold 0.3 s: let go)
Z-targeting: the view turns to the target's chest, W / S walk at and away from it, A / D circle it, the dash becomes an orbit hop, a lunge or a backstep. Enemies in a 25° cone within 20 m; it lets go after 1.5 s behind a wall (Phase 1)
Map
M
The corner radar grows into a big translucent map of the whole maze (85% of the screen) and back. The game does not pause: walk, look and fight with it open
Shield bash
Left click while blocking
A short shove that breaks a raised guard
Cast a spell
Shift + Left click
Casts the selected spell. With too little mana nothing is launched and the shield does not move
Select a spell
1 / E fire, 2 / Q ice, 3 lightning
Selecting is free and can be done at any time; casting is the click
Throw a Rune Bomb
G
Needs bombs in the bag (they are found in the maze)
Use the active item
V
The one item in the active slot (a stagger horn, a lantern that shows the Shades, a step through a wall) goes off, then its own cooldown runs; it does nothing while a choice of passive is open, on your knees or with nothing in the slot. Walking over one takes it; the use key swaps it
Pause
` or Esc
The world stays on screen, frozen. Losing the mouse also pauses
Codex
C (and again, or `, to close)
The book of what this run has met and found: the world is frozen behind it, the arrows Left/Right turn the tabs and Up/Down go down the list (a click works too)
Rise again
R
On the FALLEN screen (a fall before the first wave is cleared): a new run
The codex
Press C to open the codex: a book of what this run has met and found, 88 entries in 6 tabs, made from the same data as this page (creatures from enemies.json, items from items.json, places from the landmarks' own words in vigil.json). An entry reads ??? until its first kill, find or use; the first time is announced once in a small line ("Codex: Zombie (1/88)") and never again. An item is found by picking it up or by looking at it where it lies (the same nameplate as in the maze). The book is saved with the checkpoint, kept through a fall and empty in a new game. Its last tab, Lore, holds every line a maiden says and every stanza carved on the wall (Phase 6): they are entries of kind lore in codex.json, unlocked by lore:spoken and lore:carved.
The tabs of the codex (data/codex.json) and what unlocks their entries
Tab
Entries
How to record one
Unlocked by
Creatures
8
Kill one to record it
enemy:died
Champions and bosses
7
Bring one down to record it
enemy:died
Items
37
Pick one up, or look at it where it lies
item:gaineditem:seen
Places
11
Find it, or use it
standing within 8 m of the ruins landmark:foundbell:runggate:changed
The Song
6
Find the Keepers' Songbook, then hear each verse sung
songbook:foundverse:began
Lore
19
A maiden speaks when you first visit her; a stanza is cut when a boss falls
lore:spokenlore:carved
Architecture in one page
The game is a small entity-component world. Entities are ids; components are plain data (Health, Transform, AI ...); systems are the only code that changes them. Systems never import each other: they read the world, listen to events (138 named facts such as hit, wave:cleared or checkpoint:saved, all in src/core/eventNames.js) and announce new ones. Each component has exactly one system that may write it, which is how "who changes the player's health?" always has one answer: Combat.
Game-flow states
Title
Vigil
Paused
Codex
Results
Settings
Title → Vigil. The Vigil hands over to Paused or Codex (and back) and to Results (the FALLEN screen). The loop runs logic at a fixed 60 Hz and draws once per screen frame, blending the last two ticks.
What runs every tick, in this order (src/scenes/VigilScene.js)
Player
Actives
Stamina
FlowField
AI
Combat
Boss
Spells
Hazards
Movement
Collision
Inventory
Inspect
Progression
Marks
Challenge
Landmarks
Torches
Gates
Waves
Captives
Hub
Lore
Ending
Codex
Corpses
HitStop
Animation
FX
Audio
HUD
Input becomes intent (Player), enemies decide where to go (FlowField, AI), attacks start (Combat, Boss, Spells), things move (Movement), contacts are found (Collision), the rules react (Inventory, Waves, Captives), and last come the presentation systems (Animation, FX, Audio, HUD). Render runs once per drawn frame instead of per tick.
One swing, end to end
Player: player:swing (windup)
Player: player:strike
Combat: a one-tick Hitbox
Collision: contact:hit
Combat: the damage rules
hit / enemy:died
Waves: loot and score
Audio · FX · HUD · Animation react
One cleared wave, end to end
Waves: wave:cleared
Waves: checkpoint:saved (a snapshot)
the scene writes SaveGame to localStorage
HUD says "Checkpoint saved."
break
wave:started
Who may change what (src/components/index.js: the one-writer rule, checked live in dev builds)
Component
The only systems that may write it
Transform
MovementSpawner
Velocity
PlayerAICaptivesSpawner
Motion
MovementSpawner
Collider
ActivesSpawner
Health
CombatSpawner
Poise
CombatSpawner
Guard
CombatSpawner
GuardMeter
CombatSpawner
Combo
CombatSpawner
Hitbox
Combat
Mana
SpellsSpawner
Stamina
StaminaSpawner
Level
ProgressionSpawner
Purse
MarksSpawner
Codex
CodexSpawner
Gate
Gates
Torch
Torches
Hazard
HazardsSpawner
Corpse
Corpses
Nemesis
Spawner
Minion
Spawner
Downed
CombatSpawner
Elite
Spawner
Bell
Challenge
Landmark
LandmarksSpawner
Projectile
SpellsSpawner
AI
AISpawner
Boss
BossSpawner
Hub
Hub
Lore
Lore
Ending
Ending
CameraShot
Ending
Captive
CaptivesSpawner
Enemy
Spawner
PlayerControl
PlayerSpawner
Equipment
InventorySpawner
Allied
Actives
Active
ActivesSpawner
Pickup
Spawner
Model
AnimationSpawner
Run
WavesSpawner
The data files: every number the game uses lives in one of these (src/data/*.json); the page you are reading is built from them
File
Size
What is in it
catalog.json
16.2 KB
Every model file in assets/models, what it is called and how the game uses it: the single list behind the compendium in docs/index.html (npm run docs) and a check that every file has a name.
codex.json
15.6 KB
The codex: a book of everything the player has met in THIS run. Entries are made from the game's own data (util/codex.js entriesOf): a creature from enemies.json, an item from items.json, a place from this file with its name and w ...
enemies.json
69.0 KB
Enemy definitions. Version 52 numbers for the zombie / skeleton / demon; the rest follow the roster in the Mechanics Design doc,
environment.json
1.6 KB
Sky, fog, moon and lights (Version 52 numbers). Colours are sRGB hex strings.
items.json
28.3 KB
Pickups. Everything the player can walk into and collect (XZ pickup radius 1.2 = 0.5 player + 0.7 item).
models.json
2.9 KB
Every model file the game loads: key (what the code and src/data/*.json call it) -> file name in public/assets/models.
player.json
10.8 KB
Player body, movement and camera (Version 52 numbers).
progression.json
14.3 KB
THE SONGBOOK'S FIVE (30 Oct 2026 design, built 1 Nov 2026): a perk with `requires` names an artifact (items.json) the player must carry before it is offered, in a level's choice or in her swap (util/progression.js candidates). The ...
rarity.json
3.1 KB
The six rarity tiers. rank orders them (the smart pickup compares ranks); color is the one colour of the tier everywhere: the name on the hover nameplate, the halo on the floor, the gear panel, the compendium.
settings.json
8.7 KB
The settings screen (core/Settings.js owns the values, util/settings.js is the arithmetic, ui/Settings.js draws it, scenes/SettingsScene.js opens it from the title screen and from the pause).
sounds.json
40.3 KB
Every recorded sound effect, made with ElevenLabs Sound Effects from the prompts in docs/SFX_LIST.md, files in public/assets/sounds.
spells.json
2.7 KB
Player spells (Version 52 numbers). Lightning is not in the Phase 1 design doc yet; kept so the port plays like V52.
title.json
13.0 KB
The title screen's diorama (scenes/TitleStage.js): a moonlit dais with the five maidens in front, the five fighters (the Iron Knight, the Veiled Matron, the Drowned Lich, the Ember Tyrant and the Bone Colossus) in an arc behind th ...
vigil.json
105.5 KB
Endless Vigil: the procedural maze + wave survival mode (Version 52 maze and torch numbers; the roster, champions, bosses and rewards follow the Mechanics Design doc).
weapons.json
22.8 KB
First-person sword, shield and spell orb (positions are camera-space), plus the tiers the player can carry.
The game-ready models in public/assets/models are 71 files, 85 MB, made from the raw exports in assets/models by npm run optimize:models; the catalog in Phase 5 names every one.
Phase 1Combat & Vitals
100health to start with
100mana to start with
8 / smana regeneration, always
6 m/swalking; 9.6 sprinting
0.18 sperfect parry window
0.5 sbetween two spells
The sword: a slash, not a thrust
Left click is a slash. The hand draws the blade back and up, cuts across the view and carries through, and the next swing comes back the other way: odd swings are the forehand (high on the left to low on the right), even ones the backhand. The path is a short list of keyframes in weapons.json sword.slash, smoothed into a curve; a standard swing takes 0.36 s, a heavy weapon swings slower (its own swingTime). The swing has three beats (windup, strike, follow-through: see part A, Animation & Combat Polish) and the blow lands part-way through it, at 0.14 s for a standard swing: the hit volume exists for one tick and hits everything inside the weapon's reach and arc. The arc is a cone round the crosshair: ±73° for most blades (it used to be ±60°, a poke), wider for the Greatsword and a full sweep for the Spire.
Swords (src/data/weapons.json swords): what each tier does
Sword
Rarity
Damage
vs Worn
Swing every
DPS
Reach
Arc
Knockback
Perks
Worn Iron Sword
Common #9E9E9E
15
×1
0.35 s
43
2.6 m
±73°
0.8
none
Footman's Flanged Mace
Uncommon #4ADE80
20
×1.3
0.36 s
56
2.5 m
±73°
1.3
none
Tempered Moonsteel Blade
Rare #38BDF8
28
×1.9
0.33 s
85
2.7 m
±73°
1.8
chills to 60% for 2 s
Executioner's Greatsword
Epic #A855F7
42
×2.8
0.4 s
105
3 m
±81°
2
staggers non-bosses 1 s
Cursed Damned Blade
Epic #A855F7
44
×2.9
0.36 s
122
2.8 m
±73°
1.6
staggers non-bosses 0.6 s; chills to 60% for 2 s; Moon Wave at full health, 38 damage
Spire of the Drowned Lich
Legendary #F59E0B
60
×4
0.38 s
158
3.2 m
±96°
2.2
chills to 45% for 2.5 s; cleave: more than a half-circle
Relic Sunblade
Mythic / Relic #EF4444
85
×5.7
0.36 s
236
3 m
±73°
2.6
staggers non-bosses 0.5 s; spells ×1.25
Tyrant's Ember Mace
Mythic / Relic #EF4444
95
×6.3
0.44 s
216
3.3 m
±84°
3.2
staggers non-bosses 0.8 s
Forge Hammer
Mythic / Relic #EF4444
100
×6.7
0.5 s
200
3.1 m
±84°
3.4
staggers non-bosses 1 s
The Hollow King's Sword
Mythic / Relic #EF4444
110
×7.3
0.4 s
275
3.2 m
±73°
2.4
staggers non-bosses 0.5 s; chills to 50% for 2 s; spells ×1.25
Rarity and strength. The six tiers hit for Common 15, Uncommon 20, Rare 28, Epic 42–44, Legendary 60, Mythic 85–110 (the bands in rarity.json). The design list names the steps "base", "+25%", "+50%", "+100%", "+150%", "+200% or more"; its percentages and its damage bands do not quite agree, and the game follows the bands, so the "vs Worn" column is the real multiple.
The shield: block, bash, parry
Block (hold right click): a blow from the front gets through at the shield's block factor, so a factor of 0.2 stops 80%. A shield can no longer be held up for ever: every blow it stops also wears down the guard meter (below), and an empty meter breaks the guard.
Perfect parry: a block that goes up within 0.18 s before a melee blow lands takes no damage at all, staggers the attacker for 1.5 s (a champion has its own longer stagger) and makes your next sword hit do ×2 damage. With a spell selected and the mana for it, a perfect parry also throws that spell from the shield for free (at its own damage; no mana spent, no casting pause). Slams, projectiles and explosions cannot be parried; the shields from Epic up also give mana back when they parry.
Bash (left click while blocking): reach 1.9 m, shoves 1.6 m and breaks a raised enemy guard for 2.5 s. The shield's own bash damage and how soon the next bash is ready depend on its tier.
Reflect: the Moon-Mirror Aegis and the Aegis of the Forgotten throw a spell that hits the raised shield back at its caster for ×2 and ×2.5 the damage.
Shields (src/data/weapons.json shields): what each tier does
Shield
Rarity
Stops
Guard drain
Bash damage
Bash ready every
Parry mana
Reflects spells
Spell power
Splintered Wooden Shield
Common #9E9E9E
80%
×1
10
0.8 s
–
–
–
Soldier's Iron Shield
Uncommon #4ADE80
85%
×0.85
14
0.68 s
–
–
–
Dreadguard Damned Shield
Epic #A855F7
92%
×0.7
25
0.6 s
+15
–
–
Moon-Mirror Aegis
Legendary #F59E0B
95%
×0.6
30
0.56 s
+15
×2
–
Aegis of the Forgotten
Mythic / Relic #EF4444
97%
×0.5
40
0.52 s
+20
×2.5
×1.5
The guard meter
A raised shield has 100 points of guard. Each blow it stops takes the blow's damage times the shield's guard drain off the meter (the Splintered Wooden Shield pays all of it, the Aegis of the Forgotten half), and the blow that empties it breaks the guard: the shield drops, you are staggered for 1.2 s with the view sinking, and the shield cannot go up again until the meter has refilled to 20. It refills 25 a second once the shield is down and 1 s have passed since a blow. A perfect parry, a reflected spell and fire on the ground cost it nothing, so the answer to a slam is still to parry it, dodge it or be elsewhere. The bar sits under the health bar: steel blue, orange and pulsing when low, red and shaking with the words GUARD BROKEN while it is down. The guard meter is the player's own, in the GuardMeter component that only Combat writes; the enemy's Guard is a different thing (the shield a Shield Skeleton holds up).
The guard meter by shield (src/data/weapons.json guard and shields.<tier>.guardDrain): what a stopped blow of 30 takes off the meter, and how many of them break the guard
Shield
Guard drain
A blow of 30 costs
Blows of 30 to break the guard
Gets through to health
Splintered Wooden Shield
×1
30
4
6
Soldier's Iron Shield
×0.85
25.5
4
4
Dreadguard Damned Shield
×0.7
21
5
2
Moon-Mirror Aegis
×0.6
18
6
1
Aegis of the Forgotten
×0.5
15
7
0
The guard meter: the rules (weapons.json guard, systems/Combat.js, systems/Player.js, util/guard.js)
Rule
Value
Notes
The meter
100 points, full at the start of a run
a fall and a rise, a fountain and a loaded game fill it; guard.enabled false removes the whole rule (a raised shield holds for ever, as it did)
What drains it
a blow the raised shield stops: its damage × the shield's guardDrain
melee, charges, slams, arrows and blasts alike. The share that still gets through to your health is the shield's block factor, as before
What costs nothing
a perfect parry, a spell the Mirror shield throws back, fire on the ground
a parry is no guard loss; the flames at the feet are not stopped by a shield at all
Refilling
25 a second, 1 s after the last blow it took, with the shield DOWN
a shield held up that nothing hits does not refill: holding it is not resting
The break
the blow that empties it: PLAYER_GUARD_BROKEN
the shield drops and you are staggered for 1.2 s: no walking, swinging, bashing, casting, throwing, jumping or dashing (the view stays free and sinks 0.16 m); a swing in progress is lost. Blows land at full damage while it is down
Raising it again
once the meter is back to 20
after the stagger you can walk and swing at once, but the shield stays down until the meter has refilled to 20 (a tick on the bar marks it)
The feedback
the bar, a red vignette, GUARD BROKEN, a crack and a jolt
the bar is steel blue with ten pips, pulses orange below 25%, and turns red and shakes while the guard is broken; the view shakes (0.6) and the shield's crack sounds
Z-targeting: the lock-on
Mouse aim stays the default; Tab is for duels and bosses. A tap locks the nearest living enemy in the cone in front of you; the view turns to its chest and stays there, W and S walk at and away from it, A and D circle it, and the dash is an orbit hop, a lunge or a backstep. A chevron floats over the target with its poise as a row of diamonds.
alive, not behind a wall, never the player's own ally or a Shade nobody can see; the cone is measured either side of where you look
Cycling and letting go
a tap while locked: the next one in the cone, nearest first; hold 0.3 s: let go
a tap with nothing in the cone lets go too
It lets go by itself
1.5 s with a wall in the way, 26 m away, the target dead, or you fall
a clear moment starts the count again
The view
turns to the target's chest (60% of its height), eased at 8 a second
the mouse still nudges the aim: at most 12° sideways and 8° up or down, and the view eases back
Walking
W / S at and away from it, A / D round it
the radius is kept exactly (an orbit, not a straight line that drifts out); you stop 0.6 m short of it
The dash
A or D held: an orbit hop; W held: a lunge; nothing held: a backstep
all measured from the target, not from the view, which is still turning
The reticle
a chevron over its head and 5 poise pips under it
a poise blow shatters a pip; an enemy that can be executed shows the red diamond instead. Only an enemy with a poise bar (the Iron Knight) has pips
Finding the way: the map and the boss trail
M opens a big see-through map of the whole maze and closes it again; nothing is paused. In a boss or champion wave a trail of pale motes drifts down the corridors towards the fighter, so the way to it can be found in a 21 × 21 maze.
The map and the boss trail (player.json map, vigil.json trail, ui/Minimap.js, systems/FX.js, util/trail.js)
Part
What it does
Numbers
The radar
the corner map, centred on you, with the maze as stone walls (a dark outer line and a lighter inner one), paved floors with a faint tile pattern and an accent on every crossroads in the colour of its quarter
180 px, 9 cells across; north #e0a43a, east #35b5aa, south #9a6ad8, west #c8343e
The big map
M: the whole maze, translucent over the world, with the quarters named; it does not pause the game
85% of the shorter side, 0.2 s ease, the veil rgba(10, 12, 16, 0.72)
Marks
chokes (the stubs either side of a narrow way), portcullises (bars when down, a dim arch when up), shrines, vaults (a square with a keyhole), the boss as a pulsing skull
a boss beyond the edge of the radar is pointed to on its rim
You
a gold arrow and the pale cone of what you can see
73° wide
The trail
in a boss or champion wave, once the fighter has walked in, pale motes drift along the corridors towards it
the route is read off the flow field every 1 s, the first 5 cells of it; a mote drifts 2 m/s for 2.5 s at 1 m; none within 14 m of the boss with a clear line to it
The trail's colours
pale moonlight for the Bone Colossus and the Drowned Lich, crimson for the Iron Knight, amber for the Ember Tyrant, violet for the Veiled Matron
● Bone Colossus, ● Drowned Lich, ● Iron Knight, ● Ember Tyrant, ● Veiled Matron, ● Forge Golem, ● Hollow King
Spells and bombs
Spells (src/data/spells.json)
Spell
Select
Mana
Damage
Besides
Fireball
1 / E
25
35
Fire. A burning bomb detonates at once; thaws a frozen Lich for +40
Ice
2 / Q
20
25
Slows what it hits to 50% for 3 s; three freeze the Drowned Lich
Lightning
3
40
50
Lightning. Kept from Version 52; the heaviest and the dearest
A spell flies at 25 m/s for up to 3 s. Spell power multiplies a spell's damage: the Relic Sunblade ×1.25 and the Aegis of the Forgotten ×1.5 (they stack, ×1.88 with both). A Rune Bomb has a 3 s fuse, 60 damage in 4 m (less towards the edge, 50% of it to you), breaks a Shield Skeleton's guard, ignores the Iron Knight's armour, and a fireball sets it off at once. The bag holds 10 bombs, 20 with the Runesmith's Satchel.
The empty-mana gate
Casting is Shift + click and nothing else: it never touches the shield. If the selected spell costs more mana than you have, the cast is refused: no spell is launched, no mana is spent, the shield and the sword stay as they are, and the player is told three ways: the message "Not enough mana!", the mana panel flashes red and shakes, a low double-blip plays, and the spell orb flashes red. A refused cast locks the next one out for 0.35 s, so a held-down click does not sound the dud sixty times a second. A plain click with the shield up (no Shift) is the bash, which costs no mana.
Health, mana and healing
The summoner's leash: the enemies a boss summons crumble to dust when it is stunned (and 2 s after it dies), without score, marks or drops; when a champion falls, every ordinary enemy within 14 m is staggered for 2.5 s in fear.
Last stand: a blow that would kill you, with no Moon Moth to catch it, puts you on your knees for 3 s on 1 health (nothing hurts you for the first 0.6 s); you crawl at 35% speed and can fight, and a kill stands you up at 25% health. Once a wave.
Health starts at 100. A Minor Health Draught restores 30, used the moment you walk over it. A Bound Vitality Vessel adds 20 maximum health. A boss's death refills health and mana in full.
Health closes by itself in two ways, and they add up: the Pulsing Heart of the Colossus adds 30 maximum health and heals 1.25 a second once 5 s have passed without a wound, and the passive Wellspring (one of the passives a level may offer: part C) heals 1 a second after 8 s unhurt. The Moon Fountain is a landmark of the maze (1 in each maze): it heals every wound, refills mana and stamina, once, and only when something is missing.
Mana comes back by itself at 8 a second, all the time; the passive Arcane Well (when chosen: part C) makes it ×1.25; the Moonlit Blessing shrine makes it ×1.5 for 90 s (the factors multiply).
Mana starts at 100; a Lesser Mana Crystal restores 40, a Resonant Mana Vessel adds 25 maximum mana, a perfect parry with an Epic or better shield gives 15–20 back.
Lunar Moth Sigil: when a blow would take you to zero it catches you instead and you stand again at 50% health; each sigil is used up, and they stack.
Combo: every swing that lands within 2 s of the last one counts; a perfect parry makes the next hit ×2.
Phase 2Encounters & Scaling
How many, and when they arrive
The mix: the share of each wave by kind (waves.mix; a kind not listed is 0)
Waves
Zombie
Skeleton
Ghoul Hound
Skeleton Archer
Shield Skeleton
Demon
Wisp
Shade
1–2
50%
50%
–
–
–
–
–
–
3–4
40%
30%
15%
15%
–
–
–
–
5–6
30%
20%
15%
15%
10%
10%
–
–
7–9
20%
15%
15%
15%
10%
10%
10%
5%
10–14
15%
10%
15%
15%
12%
13%
10%
10%
15+
10%
10%
15%
15%
12%
13%
12%
13%
A champion or boss wave is that fighter alone (waves 5, 10, 15, 20, 25, 30 ...): the mix does not apply to it, so the Shield Skeleton (listed from wave 5) is first met in wave 6, and the Demon (listed from wave 5) is first met in wave 6.
Enemies are not scattered at random. Each one aims for a random arrival time: it is put in a cell from which it would reach you after about that many seconds of walking (the flow-field distance over its speed; a flyer's straight line). The window is 8 s up to 25 s in wave 1 and widens by 6 s with each wave after. A boss or champion walks in after 20–45 s whatever the wave.
Arrival windows by wave
Wave
Earliest
Latest
1
8 s
25 s
3
8 s
37 s
5
8 s
49 s
10
8 s
79 s
20
8 s
139 s
30
8 s
199 s
Difficulty: the health ramp and the tier ramp-up
Enemy damage never changes with the wave; only their health does, because the player's weapons grow about six-fold from Common to Mythic (15 to 110 damage) and arrive on a schedule. The scale applies to ordinary enemies only; champions and bosses have their own health and repeat scaling (Phase 3).
The health scale of ordinary enemies by wave. The dashed lines are the first kills of the champion and the bosses, after each of which the player carries a better sword.
Health, the gear and the level of the time, and blows to kill a Zombie / a Demon
Wave
Scale
Zombie hp
Demon hp
Sword carried
Damage
Level (attack)
Blow
Blows (Z / D)
Without the level
1
×1
40
100
Worn Iron Sword
15
1 (×1)
15
3 / 7
3 / 7
3
×1.5
60
150
Worn Iron Sword
15
1 (×1)
15
4 / 10
4 / 10
5
×1.65
66
165
Worn Iron Sword
15
1 (×1)
15
5 / 11
5 / 11
6
×2.6
104
260
Executioner's Greatsword
42
2 (×1.04)
44
3 / 6
3 / 7
10
×3.12
125
312
Executioner's Greatsword
42
2 (×1.04)
44
3 / 8
3 / 8
11
×4
160
400
Spire of the Drowned Lich
60
3 (×1.08)
65
3 / 7
3 / 7
20
×5.8
232
580
Spire of the Drowned Lich
60
4 (×1.12)
67
4 / 9
4 / 10
21
×6
240
600
Relic Sunblade
85
5 (×1.16)
99
3 / 7
3 / 8
30
×8.7
348
870
Relic Sunblade
85
6 (×1.2)
102
4 / 9
5 / 11
40
×11.7
468
1,170
Relic Sunblade
85
8 (×1.28)
109
5 / 11
6 / 14
50
×14.7
588
1,470
Tyrant's Ember Mace
95
10 (×1.36)
129
5 / 12
7 / 16
The level counts. Each boss or champion that falls gives the player a level, and each level adds to the attack of the sword, the bash and the spells (part C), so the blow is the sword's damage times the attack of the level the player has when the wave starts (the same rounding as Combat); the last column is what the table said before levels. A level arrives when the boss or champion of its wave falls, so that fight itself is met at the level the player had when the wave began (wave 30 at level 6, its reward making it 7).
CommonUncommonRareEpicLegendaryMythic / Relic
Blows to kill a Zombie in each wave with the sword the player is expected to carry and the attack of the level the player has by then, coloured by the sword's rarity. The ramp keeps it between 3 and 5 blows however far the waves go (3 to 7 before levels), which is the point of it.
Tier ramp-up: which gear arrives when
The high tiers come from bosses and nowhere else; the first kill of each fighter gives its exclusive items (Phase 3). Because every fighter must be killed before the wave is cleared, a player reaches wave 6 with the Executioner's Greatsword, wave 11 with the Spire and wave 21 with the Relic Sunblade.
The schedule of the best sword (derived from waves.drops, champion.every and bosses.every)
Spire of the Drowned Lich, Pulsing Heart of the Colossus
Spire of the Drowned Lich
60
×4
20
Drowned Lich, first kill
Relic Sunblade, Aegis of the Forgotten
Relic Sunblade
85
×5.7
30
Veiled Matron, first kill
Veilbreaker Lantern, Shroud of the Matron
–
–
–
40
Ember Tyrant, first kill
Tyrant's Ember Mace, Ember Crown
Tyrant's Ember Mace
95
×6.3
50
Forge Golem, first kill
Forge Hammer, The Keepers' Songbook
Forge Hammer
100
×6.7
60
Hollow King, first kill
The Hollow King's Sword
The Hollow King's Sword
110
×7.3
A champion comes every 5th wave and a boss every 10th; on a wave that is both, the boss comes. Bosses repeat in the order Bone Colossus, Drowned Lich, Veiled Matron, Ember Tyrant, Forge Golem and grow tougher each time round (Phase 3).
Checkpoints and saves
A checkpoint at the end of every cleared wave. Clearing a normal wave saves the start of the next one where you stand, after the wave bonus is in the score ("Checkpoint saved." on the wave-complete line).
Champion and boss waves save nothing when they are cleared: picking up what the fighter dropped saves it, so a fight is only banked once its reward is in hand.
Written to the browser. Every checkpoint is also written to localStorage (key chronicle-of-the-damned-halls.save, version 2); damaged, foreign-version or blocked storage is ignored and the game carries on without saving.
A fall shows "YOU HAVE FALLEN" for 3 s, then you stand up at the spot of the newest checkpoint, the enemies and loose pickups are cleared and that wave starts afresh. You keep every item, the score and the kills. Health and mana are what the checkpoint saved, but never less than 50% of the maximum (respawnMinHealth, respawnMinMana), so a wave cleared at 3 HP is not a trap. A Moon Moth still catches the fall first.
Before the first wave is cleared there is no checkpoint, and a fall ends the run (the FALLEN screen, R to start again).
Continue (title screen) starts the saved wave in a new maze, with you at the start: the saved spot belongs to a maze that no longer exists. The run's numbers, health, mana, gear and rescued maidens come back, and boss rewards that were still lying about are laid down near you. The loaded wave is itself a checkpoint. New Game keeps the old save until its own first checkpoint replaces it.
What a checkpoint holds (Waves.snapshot: a plain object, so it survives JSON)
Part
Contents
The wave
the wave that starts after the checkpoint
The run
score, kills, time, captives freed, how many times each boss kind has fallen and dropped (drops), boss repeats
The player
health and maximum health, mana and maximum mana, the stamina pool, the level and the boss milestones won (part C), the sword and shield tier, bombs and bag size, artifacts, Moon Moths
The maidens
which elves have been rescued
Rewards on the floor
a boss reward that was dropped but not yet picked up (laid down again after a Continue)
Phase 3Bosses & Loot Pools
The high tiers do not lie about in the maze: they are dropped by the champion and the bosses, which makes each of them a fight worth having. This part is read from waves.drops, waves.floorGear, enemies.json and weapons.json.
The fighters
no render Iron_Knight.glb
Iron Knight Champion
Wave 5, then every 5th wave that is not a boss wave (5, 15, 25 ...). It comes alone: it is the whole wave.
163158158
Phase 1 · Phase 2 · Phase 3 (479 in all)
No stun loop: a champion with plates. Three armour plates shrug off 40% of every sword hit; one falls at 66% health (25% shrugged off), one at 33% (10%), and it gets quicker each time (speed ×1.15, ×1.35). Bombs ignore the armour and hit for ×2.5. Poise 60: enough hits stagger it. A perfect parry staggers it for 2.5 s. Its slam (35 damage, 0.9 s red telegraph, every 5 s) cannot be parried.
blow: 25 damage, reach 2.2 m, every 1.6 s, 0.55 s wind-up
Slam: a ground slam, 35 damage in 3.2 m; 0.9 s telegraph, every 5 s / 4.2 s / 3.4 s (by phase)
Health in its repeats (hpScalePerRepeat 0.55)
Wave
Scale
Health
Phase pools
5
×1
480
163 / 158 / 158
15
×2.1
1,008
343 / 333 / 333
25
×3.2
1,536
522 / 507 / 507
35
×4.3
2,064
702 / 681 / 681
no render Bone_Colossus.glb
Bone Colossus Boss
Wave 10, then every 50th wave (10, 70, 120 ...). It comes alone: it is the whole wave.
3848641,152
Phase 1 · Phase 2 · Phase 3 (2,400 in all)
The stun loop. Outside a stun your hits only chip (25%). Any spell that lands while it winds up an attack (strike 0.95 s, slam 1.6 s, summon, volley) stuns it: it kneels for 3.5 s and everything does ×2 damage. Bombs are not spells and do not stun it. After it lands a blow it waits 1.2 s before starting another, so a slam is never followed at once by a strike. It walks at 1.3 m/s and never runs.
blow: 18 damage, reach 3 m, every 2 s, 0.95 s wind-up
Slam: a ground slam, 26 damage in 4.5 m; 1.6 s telegraph, every 7 s / 6 s / 4.5 s (by phase)
Summon: calls 3 Skeletons; 1.2 s telegraph, every 14 s, from phase 2
Volley: a fan of 5 boneshards, 7 damage each; 1.2 s telegraph, every 6 s, from phase 3
Health in its repeats (hpScalePerRepeat 1)
Wave
Scale
Health
Phase pools
10
×1
2,400
384 / 864 / 1,152
70
×2
4,800
768 / 1,728 / 2,304
120
×3
7,200
1,152 / 2,592 / 3,456
170
×4
9,600
1,536 / 3,456 / 4,608
no render Drowned_Lich.glb
Drowned Lich Boss
Wave 20, then every 50th wave (20, 80, 130 ...). It comes alone: it is the whole wave.
1,0881,0561,056
Phase 1 · Phase 2 · Phase 3 (3,200 in all)
The stun loop. A water shield turns every blow aside: it is immune to everything but ice. 3 Ice Shards freeze it solid for 4 s; sword hits then shatter for ×2, and a fireball on the frozen Lich bursts to steam for +40 and thaws it at once.
blow: 22 damage, reach 2.4 m, every 1.8 s, 0.6 s wind-up
frostbolt: 14 damage at 11 m/s every 3 s, 0.8 s draw
Drown: calls 3 Zombies; 1.2 s telegraph, every 16 s, from phase 2
Tide: a shockwave that throws you 5 m, 20 damage in 6.5 m; 1.3 s telegraph, every 8 s, from phase 3
Health in its repeats (hpScalePerRepeat 0.5)
Wave
Scale
Health
Phase pools
20
×1
3,200
1,088 / 1,056 / 1,056
80
×1.5
4,800
1,632 / 1,584 / 1,584
130
×2
6,400
2,176 / 2,112 / 2,112
180
×2.5
8,000
2,720 / 2,640 / 2,640
no render veiled_matron.glb
Veiled Matron Boss
Wave 30, then every 50th wave (30, 90, 140 ...). It comes alone: it is the whole wave.
1,1561,1221,122
Phase 1 · Phase 2 · Phase 3 (3,400 in all)
The stun loop. She is nearly invisible and snuffs every torch within 7 m as she passes; outside a stun your hits only chip (20%). Light lays her bare and stuns her for 5 s (×2 damage): a fireball or a Moon Wave that hits her, a torch lit again within 4.5 m of her, or the Veil-Piercing Lens in your pack while she winds up a blow. A light stun cannot be made again for 15 s, and it lifts her veil.
blow: 24 damage, reach 2.8 m, every 1.8 s, 0.7 s wind-up
Shades: calls 2 Shades; 1.3 s telegraph, every 15 s, from phase 2
Veil: lets the veil down: the light of the sky falls to 15% for 6 s, so only what burns still shines; 1.5 s telegraph, every 22 s, from phase 3
charge: 28 damage at 13 m/s after a 1 s howl, every 8 s; a wall stuns it 1.5 s
Health in its repeats (hpScalePerRepeat 0.6)
Wave
Scale
Health
Phase pools
30
×1
3,400
1,156 / 1,122 / 1,122
90
×1.6
5,440
1,850 / 1,795 / 1,795
140
×2.2
7,480
2,543 / 2,468 / 2,468
190
×2.8
9,520
3,237 / 3,142 / 3,142
no render ember_tyrant.glb
Ember Tyrant Boss
Wave 40, then every 50th wave (40, 100, 150 ...). It comes alone: it is the whole wave.
884858858
Phase 1 · Phase 2 · Phase 3 (2,600 in all)
The stun loop. Plates of burning iron shrug off 70% of every sword hit, then 50% and 25% as one falls at 66% and one at 33% health, and outside a stun your hits only chip (50%). It is immune to fire and takes ×1.5 from ice. A bolt of lightning breaks a plate off at once (lightning), ahead of the phase that would have taken it. Its own fireball turned back by a mirror shield (the Moon-Mirror Aegis, the Aegis of the Forgotten) stuns it for 5 s (×2 damage). Bombs ignore the plates (×2.5).
blow: 28 damage, reach 3.3 m, every 2.3 s, 0.8 s wind-up
Fireballs: a fan of 3 fireballs, 16 damage each; 1.2 s telegraph, every 7 s / 6 s / 5 s (by phase)
Slam: a ground slam, 30 damage in 4 m, and 5 patches of fire burn on for 6 s (7 every 0.5 s); 1.4 s telegraph, every 9 s / 8 s / 7 s (by phase)
Ring: a ring of fire 8.5 m across that closes in at 2.4 m/s with a 75° gap, 14 damage every 0.5 s to what it passes (a jump clears it, a shield does not turn it); 1.6 s telegraph, every 14 s, from phase 3
Health in its repeats (hpScalePerRepeat 0.6)
Wave
Scale
Health
Phase pools
40
×1
2,600
884 / 858 / 858
100
×1.6
4,160
1,414 / 1,373 / 1,373
150
×2.2
5,720
1,945 / 1,888 / 1,888
200
×2.8
7,280
2,475 / 2,402 / 2,402
no render forge_golem.glb
Forge Golem Boss
Wave 50, then every 50th wave (50, 110, 160 ...). It comes alone: it is the whole wave.
1,1561,1221,122
Phase 1 · Phase 2 · Phase 3 (3,400 in all)
The stun loop. Plates of hot iron shrug off 65% of every sword hit, then 45% and 20% as one cracks off at 66% and one at 33% health, and outside a stun your hits only chip (25%). A Rune Bomb that goes off in his furnace while he inhales (the wind-up of his inhale) stuns him for 5 s (×2 damage). Bombs ignore the plates (×2.5). Fire is almost nothing to him (×0.25); ice is ×1.5.
blow: 24 damage, reach 3.4 m, every 2.2 s, 0.9 s wind-up
Slam: a ground slam, 26 damage in 4.4 m, and 3 patches of fire burn on for 6 s (7 every 0.5 s); 1.5 s telegraph, every 9 s / 8 s / 7 s (by phase)
Slam: a ground slam, 26 damage in 4.4 m, and 3 patches of fire burn on for 12 s (9 every 0.5 s); 1.5 s telegraph, every 9 s / 8 s / 7 s (by phase), from phase 3
Inhale: a fan of 7 fireballs, 5 damage each; 2 s telegraph, every 11 s / 10 s / 9 s (by phase)
charge: 24 damage at 7.5 m/s after a 1 s howl, every 15 s; a wall stuns it 2.5 s
Health in its repeats (hpScalePerRepeat 0.6)
Wave
Scale
Health
Phase pools
50
×1
3,400
1,156 / 1,122 / 1,122
110
×1.6
5,440
1,850 / 1,795 / 1,795
160
×2.2
7,480
2,543 / 2,468 / 2,468
210
×2.8
9,520
3,237 / 3,142 / 3,142
no render hollow_king.glb
Hollow King Boss
Wave 60, once: the last fight of the Vigil, and he never comes again. It comes alone: it is the whole wave.
1,3001,3003,900
Phase 1 · Phase 2 · Phase 3 (6,500 in all)
The stun loop. Outside a stun your hits only chip (20%); a stun lasts 6 s and everything does ×2. A different fire opens him in each of his 5 pools, one for each maiden's fire, and a wrong tool only chips: it is never a trap.
Pool 1: a fireball or Rune Bomb that bursts in him while he winds up his moonfall
Pool 2: any spell that lands while he winds up an attack
Pool 3: 3 Ice Shards (then a fireball thaws him for +40)
Pool 4: light (a fireball, a Moon Wave, a torch lit beside him, or the Veil-Piercing Lens; once in 15 s)
Pool 5: his own moonfire or moonbeam turned back by a mirror shield
Each pool has an edge: a blow that would carry him through it stops at it, and the maiden of the fire he has just lost sings her verse for 7 s while he kneels and cannot be hurt (with the Songbook she sings it with its words and mends 15% of your health and 25% of your mana). He comes down from the Moonspire at wave 60 and never comes again.
blow: 18 damage, reach 2.9 m, every 1.6 s, 0.5 s wind-up
Charged: a ground slam, 26 damage; 1.1 s telegraph, every 6 s / 5.5 s / 5 s / 4.5 s / 4 s (by phase)
Moonfire: a fan of 1 moonfires, 14 damage each; 1 s telegraph, every 6 s / 5 s / 5 s / 4.5 s / 4 s (by phase)
Moonfall: a ground slam, undefined damage; 1.6 s telegraph, every 9 s / 12 s / 12 s / 12 s / 12 s (by phase)
Fan: a fan of 3 moonfires, 10 damage each; 1.2 s telegraph, every 7 s, from phase 2
Veil: lets the veil down: the light of the sky falls to 15% for 6 s, so only what burns still shines; 1.5 s telegraph, every 22 s, from phase 4
Moonbeam: a fan of 1 moonbeams, 20 damage each; 1.8 s telegraph, every 10 s, from phase 5
charge: 20 damage at 7 m/s after a 0.9 s howl, every 10 s; a wall stuns it 1 s
Drop tables
Each fighter has its own table. The first kill of a run gives its exclusive items, which exist nowhere else; later kills give one item each from the then list. The kills are counted per kind of fighter and the count goes back with a checkpoint, so a reward lost to a fall (the boss fell but you never picked it up) is dropped again when it comes round.
Iron Knight
Wave 5 and every fifth after
First kill of the run: always, whatever you carry
Executioner's GreatswordEpic
Dreadguard Damned ShieldEpic
Later kills: one item each, the next on the list you can use
Cursed Damned BladeEpic
Veil-Piercing LensLegendary
Runesmith's SatchelRare
Lunar Moth SigilLegendary
Resonant Mana VesselLegendary
A sword or shield of a lower rarity than the one carried, an artifact already owned and a bag no bigger are skipped; the list ends in things that are always welcome.
Bone Colossus
Wave 10
First kill of the run: always, whatever you carry
Spire of the Drowned LichLegendary
Pulsing Heart of the ColossusMythic / Relic
Every boss kill
Bound Vitality VesselLegendary
...and health and mana are refilled in full (bosses.fullRefill).
Later kills: one item each, the next on the list you can use
Moon-Mirror AegisLegendary
Lunar Moth SigilLegendary
Resonant Mana VesselLegendary
A sword or shield of a lower rarity than the one carried, an artifact already owned and a bag no bigger are skipped; the list ends in things that are always welcome.
Drowned Lich
Wave 20
First kill of the run: always, whatever you carry
Relic SunbladeMythic / Relic
Aegis of the ForgottenMythic / Relic
Every boss kill
Bound Vitality VesselLegendary
...and health and mana are refilled in full (bosses.fullRefill).
Later kills: one item each, the next on the list you can use
Lunar Moth SigilLegendary
Resonant Mana VesselLegendary
A sword or shield of a lower rarity than the one carried, an artifact already owned and a bag no bigger are skipped; the list ends in things that are always welcome.
Veiled Matron
Wave 30
First kill of the run: always, whatever you carry
Veilbreaker LanternLegendary
Shroud of the MatronLegendary
Every boss kill
Bound Vitality VesselLegendary
...and health and mana are refilled in full (bosses.fullRefill).
Later kills: one item each, the next on the list you can use
Veil-Piercing LensLegendary
Lunar Moth SigilLegendary
Resonant Mana VesselLegendary
A sword or shield of a lower rarity than the one carried, an artifact already owned and a bag no bigger are skipped; the list ends in things that are always welcome.
Ember Tyrant
Wave 40
First kill of the run: always, whatever you carry
Tyrant's Ember MaceMythic / Relic
Ember CrownMythic / Relic
Every boss kill
Bound Vitality VesselLegendary
...and health and mana are refilled in full (bosses.fullRefill).
Later kills: one item each, the next on the list you can use
Moon-Mirror AegisLegendary
Lunar Moth SigilLegendary
Resonant Mana VesselLegendary
A sword or shield of a lower rarity than the one carried, an artifact already owned and a bag no bigger are skipped; the list ends in things that are always welcome.
Forge Golem
Wave 50
First kill of the run: always, whatever you carry
Forge HammerMythic / Relic
The Keepers' SongbookMythic / Relic
Every boss kill
Bound Vitality VesselLegendary
...and health and mana are refilled in full (bosses.fullRefill).
Later kills: one item each, the next on the list you can use
Runesmith's SatchelRare
Lunar Moth SigilLegendary
Resonant Mana VesselLegendary
A sword or shield of a lower rarity than the one carried, an artifact already owned and a bag no bigger are skipped; the list ends in things that are always welcome.
Hollow King
Wave 60
First kill of the run: always, whatever you carry
The Hollow King's SwordMythic / Relic
Every boss kill
Bound Vitality VesselLegendary
...and health and mana are refilled in full (bosses.fullRefill).
Later kills: one item each, the next on the list you can use
Lunar Moth SigilLegendary
Resonant Mana VesselLegendary
A sword or shield of a lower rarity than the one carried, an artifact already owned and a bag no bigger are skipped; the list ends in things that are always welcome.
Loot on the floor, and what it is worth
Floor loot of the low tiers (waves.floorGear): never Epic or above
Item
Rarity
Lies in the maze from
Chance each wave
Skipped when
Footman's Flanged Mace
Uncommon #4ADE80
wave 2
45%
it would be no step up from what you carry
Soldier's Iron Shield
Uncommon #4ADE80
wave 2
45%
it would be no step up from what you carry
Tempered Moonsteel Blade
Rare #38BDF8
wave 5
45%
it would be no step up from what you carry
Consumables lying in the maze, every wave
Item
Rarity
How many
What it does
Minor Health Draught
Uncommon #4ADE80
2 a wave
+30 health on touch
Lesser Mana Crystal
Uncommon #4ADE80
2 a wave
+40 mana on touch
Cache of Rune Bombs
Rare #38BDF8
1 a wave from wave 3
+3 Rune Bombs, if the bag has room
Damage and guard by rarity
CommonUncommonRareEpicLegendaryMythic / Relic
Damage of each sword; the faint block behind a bar is the band its rarity allows (Common 10–15, Uncommon 18–22, Rare 25–30, Epic 40–45, Legendary 55–65, Mythic 80–110). A test checks every sword against its band.Damage per second: the big weapons swing a little slower, never slowly enough to lose to the tier below (a test checks that too).Share of a blow each shield stops (100% minus its block factor). There is no Rare shield: the one the design list names for it is the Shield Skeleton's own model file.
The six rarities (src/data/rarity.json): one colour everywhere
Tier
Colour
Rank
Design list
Damage band
Built damage
Real step
Stops
Known for
Common
#9E9E9E
0
base
10–15
15
×1
75–80%
Base weapon damage, baseline block.
Uncommon
#4ADE80
1
+25%
18–22
20
×1.3
81–86%
+25% damage; a shield that recovers quicker (shorter bash cooldown) and wears its guard meter out slower (a lower guardDrain: blocking costs no stamina, the shield has the guard meter; the one stamina pool is for the sprint).
Rare
#38BDF8
2
+50%
25–30
28
×1.9
86–90%
+50% damage and moderate knockback.
Epic
#A855F7
3
+100%
40–45
42–44
×2.9
90–94%
+100% damage and a heavy stagger on every hit. Dropped by bosses.
Legendary
#F59E0B
4
+150%
55–65
60
×4
94–96%
+150% damage and innate elemental and cleave effects. Dropped by bosses.
Mythic / Relic
#EF4444
5
+200% or more
80–110
85–110
×7.3
96–100%
+200% damage or more, the best guard absorption and relic cast potency (spells cast with it hit harder). Dropped by the Drowned Lich and the end bosses.
Phase 4Bestiary & Characters
Thirteen creatures and the five rescued maidens. Names in the cards are the ones used here; the data label is shown beneath when the game calls the same creature something shorter. Health is the value in enemies.json at wave 1: ordinary enemies grow tougher with the wave (Phase 2), champions and bosses by their own rule (Phase 3).
Creatures
no render skeleton.glb
Skeleton Miniondata label: “Skeleton”
Fast melee swarm
assets/models/skeleton.glb
Score 75 · 1.9 m tall
Health25
Damage8
Speed3.5 m/s
The quickest of the dead and the frailest: it dies in two blows from the starting sword. It runs at you from every corridor.
blow: 8 damage, reach 1.4 m, every 0.8 s
appears from wave 1
health ×5.8 by wave 20, ×14.7 by wave 50 (Phase 2)
no render Shield_Skeleton.glb
Shield Skeleton
Guarded bruiser
assets/models/Shield_Skeleton.glb
Score 150 · 1.9 m tall
Health60
Damage12
Speed2.8 m/s
The Blocker. Immune from the front: sprint round it (it turns slowly), bash its shield (left click while blocking) or bomb it. Its guard drops for 2.5 s when broken.
blow: 12 damage, reach 1.5 m, every 1 s, 0.5 s wind-up
grips (corrected 26 Oct 2026): the mace now crosses the fist at RightHand [-0.047, -0.018, -0.171] rot [-151.3, 77.5, 34.5] instead of running along the forearm; the shield's handle sits in the other fist · log
guard: blocks 130° in front until a bash or a bomb breaks it for 2.5 s
weak to: bomb ×2
appears from wave 6
health ×5.8 by wave 20, ×14.7 by wave 50 (Phase 2)
no render Skeleton_Archers.glb
Skeleton Archer
Ranged skirmisher
assets/models/Skeleton_Archers.glb
Score 125 · 1.85 m tall
Health30
Damage6
Speed3.2 m/s
The Ranged. Keeps 6-10 m from you and backs off when rushed. Arrows are fast and quiet: watch for the draw.
blow: 6 damage, reach 1.2 m, every 1.2 s
arrow: 10 damage at 24 m/s every 2.2 s, 1 s draw
bow (corrected 26 Oct 2026): at rest the riser sits in the left palm (LeftHand [0.03, 0.09, 0.074] rot [40.5, 80.8, 132.3]); the draw pose is exactly as it was · log
keeps its distance: backs off inside 6 m, shoots between 6 and 10 m
appears from wave 3
health ×5.8 by wave 20, ×14.7 by wave 50 (Phase 2)
no render zombie.glb
Decaying Zombiedata label: “Zombie”
Slow melee
assets/models/zombie.glb
Score 100 · 2 m tall
Health40
Damage12
Speed2 m/s
Slow and sturdy for the first waves, and weak to fire (a fireball does ×1.5). It is the yardstick the health ramp is measured with.
blow: 12 damage, reach 1.4 m, every 0.8 s
weak to: fireball ×1.5
appears from wave 1
health ×5.8 by wave 20, ×14.7 by wave 50 (Phase 2)
no render Ghoul_Hound.glb
Ghoul Hound
Charger
assets/models/Ghoul_Hound.glb
Score 150 · 1.1 m tall
Health45
Damage10
Speed4.2 m/s
The Rusher. Howls for 0.6 s, then charges in a straight line at 11 m/s. Step aside and it runs into the wall and lies stunned for 1.6 s.
blow: 10 damage, reach 1.4 m, every 0.9 s
charge: 16 damage at 11 m/s after a 0.6 s howl, every 3.5 s; a wall stuns it 1.6 s
answer (26 Oct 2026): a dash (F, 30 stamina) sideways takes the player 4 m out of the line in 0.2 s; a dash into the charge lets it arrive in the first 0.12 s, when nothing can hurt the player, and the charge is spent · the dash
weak to: fireball ×1.25
appears from wave 3
health ×5.8 by wave 20, ×14.7 by wave 50 (Phase 2)
The Flyer. Drifts over the walls where the maze cannot stop it and dives at you. Ice does double damage; it has no armour at all.
blow: 8 damage, reach 1.6 m, every 1.2 s
flies: cruises over the walls at 5.2 m, dives to 1.1 m when it sees you; no armour
weak to: ice ×2
appears from wave 7
health ×5.8 by wave 20, ×14.7 by wave 50 (Phase 2)
no render Shade.glb
Shadow Shadedata label: “Shade”
Stealth ambusher
assets/models/Shade.glb
Score 200 · 1.9 m tall
Health50
Damage15
Speed4 m/s
The Ambusher. A smear of darkness until it is within 3.5 m, striking, or hurt. The Lens of the Veil shows every Shade in the maze.
blow: 15 damage, reach 1.4 m, every 1 s, 0.35 s wind-up
stealth: 7% visible until within 3.5 m, striking or hurt; the Lens of the Veil shows every Shade within 30 m
weak to: fireball ×1.5, moonwave ×2
appears from wave 7
health ×5.8 by wave 20, ×14.7 by wave 50 (Phase 2)
no render Iron_Knight.glb
Iron Knight
Armoured championChampion
assets/models/Iron_Knight.glb
Score 1,000 · 2.3 m tall
Health480
Damage25
Speed2.2 m/s
The Heavy. Guards every fifth wave. Three armour plates shrug off 40% of your hits; each fall at 66% and 33% health and it gets faster.
blow: 25 damage, reach 2.2 m, every 1.6 s, 0.55 s wind-up
Slam: a ground slam, 35 damage in 3.2 m; 0.9 s telegraph, every 5 s / 4.2 s / 3.4 s (by phase)
armour: shrugs off 40% / 25% / 10% of sword hits by phase
weak to: bomb ×2.5 (ignores the plates)
poise 60: enough damage staggers it
health grows with each repeat (Phase 3); ordinary health scaling does not apply
no render demon.glb
Nether Demondata label: “Demon”
Fireball caster
assets/models/demon.glb
Score 300 · 2.1 m tall
Health100
Damage20
Speed1.2 m/s
A tall woman with a red face and black horns, in black armour lined with glowing red (the model was rebuilt on 24 Oct 2026 and again on 28 Oct). She keeps walking at you; whenever she has a line of sight and her cooldown is up she stops and raises an arm for 0.85 s, the casting gesture and a clear tell, and hurls a fireball from the top of it. The sturdiest ordinary enemy, weak to ice (×1.5).
blow: 20 damage, reach 2.5 m, every 1.5 s
fireball: 15 damage at 8 m/s every 3 s, 0.85 s draw
surface (tuned 26 Oct 2026): emissive 0.3 (was 1), metalness 0.25, roughness 0.55, specular 0.45, brightness 0.95: the gold armour keeps its relief and is no longer blown out · log
weak to: ice ×1.5
appears from wave 6
health ×5.8 by wave 20, ×14.7 by wave 50 (Phase 2)
no render Bone_Colossus.glb
Bone Colossus (Boss)
Boss: stun loopBoss
assets/models/Bone_Colossus.glb
Score 5,000 · 3.6 m tall
Health2,400
Damage18
Speed1.3 m/s
Boss of wave 10. A heavy, deliberate walker (1.3 m/s, the walk clip at 0.45x so the feet keep up with the ground) that never runs. Its soul-fire heart is always visible in the ribs: dim at rest, brighter each phase, a pale-blue flare while it winds up.
blow: 18 damage, reach 3 m, every 2 s, 0.95 s wind-up
Slam: a ground slam, 26 damage in 4.5 m; 1.6 s telegraph, every 7 s / 6 s / 4.5 s (by phase)
Summon: calls 3 Skeletons; 1.2 s telegraph, every 14 s, from phase 2
Volley: a fan of 5 boneshards, 7 damage each; 1.2 s telegraph, every 6 s, from phase 3
health grows with each repeat (Phase 3); ordinary health scaling does not apply
no render Drowned_Lich.glb
Drowned Lich (Boss)
Boss: ice stacksBoss
assets/models/Drowned_Lich.glb
Score 6,000 · 2.5 m tall
Health3,200
Damage22
Speed1.8 m/s
Boss of wave 20. A water shield turns every blow aside; only ice touches it. Three Ice Shards freeze it solid for 4 s: sword hits shatter for double, and a fireball on the frozen Lich bursts to steam for 40 extra and thaws it.
blow: 22 damage, reach 2.4 m, every 1.8 s, 0.6 s wind-up
frostbolt: 14 damage at 11 m/s every 3 s, 0.8 s draw
Drown: calls 3 Zombies; 1.2 s telegraph, every 16 s, from phase 2
Tide: a shockwave that throws you 5 m, 20 damage in 6.5 m; 1.3 s telegraph, every 8 s, from phase 3
health grows with each repeat (Phase 3); ordinary health scaling does not apply
no render veiled_matron.glb
Veiled Matron (Boss)
Boss: light and the veilBoss
assets/models/veiled_matron.glb
Score 8,000 · 2.4 m tall
Health3,400
Damage24
Speed2.1 m/s
Boss of wave 30. She hunts in the dark: nearly invisible, she snuffs every torch within 7 m as she passes, and her sickle comes out of nowhere (a 0.7 s sweep, then a shimmer and a dash from 4 to 14 m). Outside a stun your hits only chip (20%).
blow: 24 damage, reach 2.8 m, every 1.8 s, 0.7 s wind-up
Shades: calls 2 Shades; 1.3 s telegraph, every 15 s, from phase 2
Veil: lets the veil down: the light of the sky falls to 15% for 6 s, so only what burns still shines; 1.5 s telegraph, every 22 s, from phase 3
charge: 28 damage at 13 m/s after a 1 s howl, every 8 s; a wall stuns it 1.5 s
stealth: 5% visible until within 4 m, striking or hurt; the Lens of the Veil shows every Shade within 30 m
health grows with each repeat (Phase 3); ordinary health scaling does not apply
no render ember_tyrant.glb
Ember Tyrant (Boss)
Boss: reflection and lightningBoss
assets/models/ember_tyrant.glb
Score 9,000 · 3 m tall
Health2,600
Damage28
Speed1.9 m/s
Boss of wave 40. A tyrant in burning plate that shrugs off the sword (70 / 50 / 25% of every blow, a plate falling at 66% and 33% health) and is immune to fire. LIGHTNING shatters a plate at once, which opens the armour sooner; ICE does half again.
blow: 28 damage, reach 3.3 m, every 2.3 s, 0.8 s wind-up
Fireballs: a fan of 3 fireballs, 16 damage each; 1.2 s telegraph, every 7 s / 6 s / 5 s (by phase)
Slam: a ground slam, 30 damage in 4 m, and 5 patches of fire burn on for 6 s (7 every 0.5 s); 1.4 s telegraph, every 9 s / 8 s / 7 s (by phase)
Ring: a ring of fire 8.5 m across that closes in at 2.4 m/s with a 75° gap, 14 damage every 0.5 s to what it passes (a jump clears it, a shield does not turn it); 1.6 s telegraph, every 14 s, from phase 3
armour: shrugs off 70% / 50% / 25% of sword hits by phase
weak to: ice ×1.5, fireball ×0, burn ×0, bomb ×2.5 (ignores the plates)
health grows with each repeat (Phase 3); ordinary health scaling does not apply
The rescued maidens
no render crimson_elf.glb
Crimson Elf
Rescued maiden
assets/models/crimson_elf.glb
Height1.7 m
Ring of light#ff3b4e
Modelelfcrimson
Freed the first time the Forge Golem falls (a repeat kill of it brings her back as a guest who bows and then slips away)
Bows once where it fell (captives.danceOnce), then stands in her idle until 4 s into the next wave, then runs to her place under the Tree of Life and stays there in her idle
Turns to watch the player within 10 m; the minimap shows her as a diamond in her colour
Adds to the Tree of Life's courtyard, once she stands under it: her banner in her colour; with all 5 there the middle is a sanctuary
Teaches: her own pool of 5 passives (Kindling, Ember Heart, Crimson Fuse, Crimson Fury, Hearth-Song) joins every choice of a passive once she is rescued, and in a break between waves, within 4 m of her, T swaps one of the player's passives for one of hers
no render golden_elf.glb
Golden Elf
Rescued maiden
assets/models/golden_elf.glb
Height1.7 m
Ring of light#ffcf5a
Modelelfgolden
Freed the first time the Bone Colossus falls (a repeat kill of it brings her back as a guest who bows and then slips away)
Bows once where it fell (captives.danceOnce), then stands in her idle until 4 s into the next wave, then runs to her place under the Tree of Life and stays there in her idle
Turns to watch the player within 10 m; the minimap shows her as a diamond in her colour
Adds to the Tree of Life's courtyard, once she stands under it: a small shrine in her colour; with all 5 there the middle is a sanctuary
Teaches: her own pool of 5 passives (Gilded Draught, Bountiful Halls, Sunwell, Dawnlight, Lamp-Song) joins every choice of a passive once she is rescued, and in a break between waves, within 4 m of her, T swaps one of the player's passives for one of hers
no render shadow_elf.glb
Shadow Elf
Rescued maiden
assets/models/shadow_elf.glb
Height1.7 m
Ring of light#9a6bff
Modelelfshadow
Freed the first time the Veiled Matron falls (a repeat kill of it brings her back as a guest who bows and then slips away)
Bows once where it fell (captives.danceOnce), then stands in her idle until 4 s into the next wave, then runs to her place under the Tree of Life and stays there in her idle
Turns to watch the player within 10 m; the minimap shows her as a diamond in her colour
Adds to the Tree of Life's courtyard, once she stands under it: glowing moss in her colour; with all 5 there the middle is a sanctuary
Teaches: her own pool of 5 passives (Veilsight, Shade-Bane, Phantom Dash, Fleet Shadow, Veil-Song) joins every choice of a passive once she is rescued, and in a break between waves, within 4 m of her, T swaps one of the player's passives for one of hers
no render silver_frost_elf.glb
Silver Frost Elf
Rescued maiden
assets/models/silver_frost_elf.glb
Height1.7 m
Ring of light#b8e4ff
Modelelfsilver
Freed the first time the Drowned Lich falls (a repeat kill of it brings her back as a guest who bows and then slips away)
Bows once where it fell (captives.danceOnce), then stands in her idle until 4 s into the next wave, then runs to her place under the Tree of Life and stays there in her idle
Turns to watch the player within 10 m; the minimap shows her as a diamond in her colour
Adds to the Tree of Life's courtyard, once she stands under it: her lantern in her colour; with all 5 there the middle is a sanctuary
Teaches: her own pool of 5 passives (Hoarfrost, Deep Winter, Glacial Mind, Rime Ward, Frost-Song) joins every choice of a passive once she is rescued, and in a break between waves, within 4 m of her, T swaps one of the player's passives for one of hers
no render emerald_elf.glb
Emerald Elf
Rescued maiden
assets/models/emerald_elf.glb
Height1.7 m
Ring of light#0fb36b
Modelelfemerald
Freed the first time the Ember Tyrant falls (a repeat kill of it brings her back as a guest who bows and then slips away)
Bows once where it fell (captives.danceOnce), then stands in her idle until 4 s into the next wave, then runs to her place under the Tree of Life and stays there in her idle
Turns to watch the player within 10 m; the minimap shows her as a diamond in her colour
Adds to the Tree of Life's courtyard, once she stands under it: a cluster of green crystals in her colour; with all 5 there the middle is a sanctuary
Teaches: her own pool of 5 passives (Thornbark, Mirror Glint, Living Wound, Greenwood Stride, Mirror-Song) joins every choice of a passive once she is rescued, and in a break between waves, within 4 m of her, T swaps one of the player's passives for one of hers
Phase 5Item Compendium
Every model file the game uses, with its name, rarity, .glb path, where it comes from and what it does, and the cursed relics, which are items with no model (a card each, from the data). The grid below holds 78 cards: 60 items, props and projectiles, and (under Bestiary) the 18 creatures and maidens, which Phase 4 describes in full. The buttons and the search combine; the page address remembers them.
Category
Rarity
Nothing matches.
no render sword.glb
Worn Iron Sword
Common #9E9E9EWeapon
assets/models/sword.glb
Starting gear: you carry it from the first moment
Damage15
Swing0.35 s
Reach2.6 m
1× a Worn Iron Sword; 43 damage a second; cuts ±73°
knockback 0.8
no render shield.glb
Splintered Wooden Shield
Common #9E9E9EShield
assets/models/shield.glb
Starting gear: you carry it from the first moment
Stops80%
Bash10
Bash every0.8 s
no render arrow.glb
Crude Flint Arrow
Common #9E9E9EProjectile
assets/models/arrow.glb
Shot by the Skeleton Archer (it cannot be picked up)
what the Skeleton Archer looses: 10 damage at 24 m/s
no render Bow_Long.glb
Worn Hunting Bow
Common #9E9E9EWeapon
assets/models/Bow_Long.glb
Carried by the Skeleton Archer (it cannot be picked up)
drawn for 1 s before every shot, one shot every 2.2 s
no render Quiver.glb
Tattered Leather Quiver
Common #9E9E9EArmor
assets/models/Quiver.glb
Carried by the Skeleton Archer (it cannot be picked up)
worn on the archer’s back; it has no effect on play
no render bell.glb
Bell of Challenge
Common #9E9E9EProp
assets/models/bell.glb
no render iron_shield.glb
Soldier's Iron Shield
Uncommon #4ADE80Shield
assets/models/iron_shield.glb
Floor loot from wave 2: each wave from wave 2 there is a 45% chance that one piece lies in the maze, if it would be a step up
Stops85%
Bash14
Bash every0.68 s
no render Mace_Short.glb
Footman's Flanged Mace
Uncommon #4ADE80Weapon
assets/models/Mace_Short.glb
Floor loot from wave 2: each wave from wave 2 there is a 45% chance that one piece lies in the maze, if it would be a step up Carried by the Shield Skeleton (it cannot be picked up)
Damage20
Swing0.36 s
Reach2.5 m
1.3× a Worn Iron Sword; 56 damage a second; cuts ±73°
knockback 1.3
also the Shield Skeleton’s weapon
no render Shield_Round.glb
Reinforced Round Shield
Uncommon #4ADE80Shield
assets/models/Shield_Round.glb
Carried by the Shield Skeleton (it cannot be picked up)
the Shield Skeleton’s guard: blocks 130° in front until broken for 2.5 s
no render Mana_Crystal.glb
Lesser Mana Crystal
Uncommon #4ADE80Consumable
assets/models/Mana_Crystal.glb
Floor loot: 2 lie in the maze every wave
restores 40 mana when touched
no render potion.glb
Minor Health Draught
Uncommon #4ADE80Consumable
assets/models/potion.glb
Floor loot: 2 lie in the maze every wave
restores 30 health when touched
no render moonsteel_blade.glb
Tempered Moonsteel Blade
Rare #38BDF8Weapon
assets/models/moonsteel_blade.glb
Floor loot from wave 5: each wave from wave 2 there is a 45% chance that one piece lies in the maze, if it would be a step up
Damage28
Swing0.33 s
Reach2.7 m
1.9× a Worn Iron Sword; 85 damage a second; cuts ±73°
chills to 60% for 2 s
knockback 1.8
no render single_rune_bomb.glb
Volatile Rune Bomb
Rare #38BDF8Projectile
assets/models/single_rune_bomb.glb
Thrown from the bag (G); the bags are filled by Cache of Rune Bombs
Damage60
Radius4 m
Fuse3 s
thrown with G; 50% of the damage to you if you stand too close; breaks a guard; ignores the Knight’s armour (×2.5)
no render rune_bomb_stack.glb
Cache of Rune Bombs
Rare #38BDF8Consumable
assets/models/rune_bomb_stack.glb
Floor loot: 1 cache every wave from wave 3
+3 Rune Bombs when touched, if the bag has room (it holds 10)
no render bomb_bag.glb
Runesmith's Satchel
Rare #38BDF8Boss dropConsumable
assets/models/bomb_bag.glb
Boss drop: a later kill of the Iron Knight (the next on its list that you can use) Boss drop: a later kill of the Forge Golem (the next on its list that you can use)
the bag holds 20 Rune Bombs instead of 10
no render Ice_shard_projectile.glb
Glacial Shard
Rare #38BDF8Projectile
assets/models/Ice_shard_projectile.glb
The ice spell: Shift + click with it selected
Mana20
Damage25
Slow50%
the ice spell (key 2): slows to 50% for 3 s; ×2 on a Wisp, ×1.5 on a Demon; 3 freeze the Drowned Lich
no render Greatsword.glb
Executioner's Greatsword
Epic #A855F7Boss dropWeapon
assets/models/Greatsword.glb
Boss drop: Iron Knight, first kill (wave 5)
Damage42
Swing0.4 s
Reach3 m
2.8× a Worn Iron Sword; 105 damage a second; cuts ±81°
staggers non-bosses for 1 s
knockback 2
also held by the Iron Knight in the fight
no render damned_blade.glb
Cursed Damned Blade
Epic #A855F7Boss dropWeapon
assets/models/damned_blade.glb
Boss drop: a later kill of the Iron Knight (the next on its list that you can use)
Damage44
Swing0.36 s
Reach2.8 m
2.9× a Worn Iron Sword; 122 damage a second; cuts ±73°
staggers non-bosses for 0.6 s
chills to 60% for 2 s
at full health every swing throws a Moon Wave (38 damage)
knockback 1.6
no render damned_shield.glb
Dreadguard Damned Shield
Epic #A855F7Boss dropShield
assets/models/damned_shield.glb
Boss drop: Iron Knight, first kill (wave 5)
Stops92%
Bash25
Bash every0.6 s
a perfect parry gives back 15 mana
no render Fire_Projectile.glb
Pyreburst Core
Epic #A855F7Projectile
assets/models/Fire_Projectile.glb
Shot by the Demon (it cannot be picked up) The fire spell: Shift + click with it selected
Mana25
Damage35
Speed25 m/s
the fire spell (key 1): ×1.5 on a Zombie, ×1.5 on a Shade; detonates a Rune Bomb; +40 on a frozen Lich
no render R_Pauldron.glb
Gilded Iron Pauldrons
Epic #A855F7Armor
assets/models/R_Pauldron.glb
Carried by the Iron Knight (it cannot be picked up)
the Iron Knight’s shoulder plates: one falls at 66% health, one at 33%; the plates shrug off 40% / 25% / 10% of sword hits
the game mirrors this one file for the other shoulder: it is the only pauldron model
no render Plate_Chest.glb
Dread Knight Cuirass
Epic #A855F7Armor
assets/models/Plate_Chest.glb
Carried by the Iron Knight (it cannot be picked up)
the breastplate, the last plate of the Iron Knight’s armour to fall
no render moon_mirror_shield.glb
Moon-Mirror Aegis
Legendary #F59E0BBoss dropShield
assets/models/moon_mirror_shield.glb
Boss drop: a later kill of the Bone Colossus (the next on its list that you can use) Boss drop: a later kill of the Ember Tyrant (the next on its list that you can use)
Stops95%
Bash30
Bash every0.56 s
a perfect parry gives back 15 mana
throws a spell that hits it back at its caster for ×2
no render Lich_Staff.glb
Spire of the Drowned Lich
Legendary #F59E0BBoss dropWeapon
assets/models/Lich_Staff.glb
Boss drop: Bone Colossus, first kill (wave 10)
Damage60
Swing0.38 s
Reach3.2 m
4× a Worn Iron Sword; 158 damage a second; cuts ±96°
chills to 45% for 2.5 s
cleave: a sweep of more than a half-circle
knockback 2.2
also held by the Drowned Lich in the fight
no render mana_vessel.glb
Resonant Mana Vessel
Legendary #F59E0BBoss dropArtifact
assets/models/mana_vessel.glb
Boss drop: a later kill of the Iron Knight (the next on its list that you can use) Boss drop: a later kill of the Bone Colossus (the next on its list that you can use) Boss drop: a later kill of the Drowned Lich (the next on its list that you can use) Boss drop: a later kill of the Veiled Matron (the next on its list that you can use) Boss drop: a later kill of the Ember Tyrant (the next on its list that you can use) Boss drop: a later kill of the Forge Golem (the next on its list that you can use) Boss drop: a later kill of the Hollow King (the next on its list that you can use)
+25 maximum mana, and that much restored
no render heart_container.glb
Bound Vitality Vessel
Legendary #F59E0BBoss dropArtifact
assets/models/heart_container.glb
Boss drop: every boss kill (the Bone Colossus and the Drowned Lich)
+20 maximum health, and that much healed
no render lens_veil.glb
Veil-Piercing Lens
Legendary #F59E0BBoss dropArtifact
assets/models/lens_veil.glb
Boss drop: a later kill of the Iron Knight (the next on its list that you can use) Boss drop: a later kill of the Veiled Matron (the next on its list that you can use)
shows every Shade in the maze (within 30 m) instead of only those within 3.5 m
no render moon_moth.glb
Lunar Moth Sigil
Legendary #F59E0BBoss dropArtifact
assets/models/moon_moth.glb
Boss drop: a later kill of the Iron Knight (the next on its list that you can use) Boss drop: a later kill of the Bone Colossus (the next on its list that you can use) Boss drop: a later kill of the Drowned Lich (the next on its list that you can use) Boss drop: a later kill of the Veiled Matron (the next on its list that you can use) Boss drop: a later kill of the Ember Tyrant (the next on its list that you can use) Boss drop: a later kill of the Forge Golem (the next on its list that you can use) Boss drop: a later kill of the Hollow King (the next on its list that you can use)
when a blow would take you to zero it catches you and you stand again at half health; each one is used up and they stack
no render relic_sword.glb
Relic Sunblade
Mythic / Relic #EF4444Boss dropWeapon
assets/models/relic_sword.glb
Boss drop: Drowned Lich, first kill (wave 20)
Damage85
Swing0.36 s
Reach3 m
5.7× a Worn Iron Sword; 236 damage a second; cuts ±73°
staggers non-bosses for 0.5 s
relic cast potency: spells ×1.25
knockback 2.6
no render relic_shield.glb
Aegis of the Forgotten
Mythic / Relic #EF4444Boss dropShield
assets/models/relic_shield.glb
Boss drop: Drowned Lich, first kill (wave 20)
Stops97%
Bash40
Bash every0.52 s
a perfect parry gives back 20 mana
throws a spell that hits it back at its caster for ×2.5
relic cast potency: spells ×1.5
no render Heart_Colossus.glb
Pulsing Heart of the Colossus
Mythic / Relic #EF4444Boss dropArtifact
assets/models/Heart_Colossus.glb
Boss drop: Bone Colossus, first kill (wave 10)
+30 maximum health, and wounds close by themselves: 1.25 health a second after 5 s without a wound
also held by the Bone Colossus in the fight
no render matron_sickle.glb
Matron's Sickle
Epic #A855F7Prop
assets/models/matron_sickle.glb
Carried by the Veiled Matron (it cannot be picked up)
no render matron_lantern.glb
Veilbreaker Lantern
Legendary #F59E0BBoss dropArtifact
assets/models/matron_lantern.glb
Boss drop: Veiled Matron, first kill (wave 30)
also held by the Veiled Matron in the fight
no render matron_shroud.glb
Shroud of the Matron
Legendary #F59E0BBoss dropArtifact
assets/models/matron_shroud.glb
Boss drop: Veiled Matron, first kill (wave 30)
no render ember_plate_chest.glb
Ember Plate Chest
Epic #A855F7Armor
assets/models/ember_plate_chest.glb
Carried by the Ember Tyrant (it cannot be picked up)
no render ember_pauldron.glb
Ember Pauldrons
Epic #A855F7Armor
assets/models/ember_pauldron.glb
Carried by the Ember Tyrant (it cannot be picked up)
no render ember_crown.glb
Ember Crown
Mythic / Relic #EF4444Boss dropArtifact
assets/models/ember_crown.glb
Boss drop: Ember Tyrant, first kill (wave 40)
no render tyrant_mace.glb
Tyrant's Ember Mace
Mythic / Relic #EF4444Boss dropWeapon
assets/models/tyrant_mace.glb
Boss drop: Ember Tyrant, first kill (wave 40)
Damage95
Swing0.44 s
Reach3.3 m
6.3× a Worn Iron Sword; 216 damage a second; cuts ±84°
staggers non-bosses for 0.8 s
knockback 3.2
also held by the Ember Tyrant in the fight
no render ember_tiara.glb
Ember Tiara
Prop
assets/models/ember_tiara.glb
Carried by the Ember Tyrant (it cannot be picked up)
no render songbook.glb
The Keepers' Songbook
Mythic / Relic #EF4444Boss dropArtifact
assets/models/songbook.glb
Boss drop: Forge Golem, first kill (wave 50)
no render forge_hammer.glb
Forge Hammer
Mythic / Relic #EF4444Boss dropWeapon
assets/models/forge_hammer.glb
Boss drop: Forge Golem, first kill (wave 50)
Damage100
Swing0.5 s
Reach3.1 m
6.7× a Worn Iron Sword; 200 damage a second; cuts ±84°
staggers non-bosses for 1 s
knockback 3.4
also held by the Forge Golem in the fight
no render forge_plate_chest.glb
The Furnace Door
Armor
assets/models/forge_plate_chest.glb
Carried by the Forge Golem (it cannot be picked up)
no render hollow_king_sword.glb
The Hollow King's Sword
Mythic / Relic #EF4444Boss dropWeapon
assets/models/hollow_king_sword.glb
Boss drop: Hollow King, first kill (wave 60)
Damage110
Swing0.4 s
Reach3.2 m
7.3× a Worn Iron Sword; 275 damage a second; cuts ±73°
staggers non-bosses for 0.5 s
chills to 50% for 2 s
relic cast potency: spells ×1.25
knockback 2.4
also held by the Hollow King in the fight
no render hollow_crown.glb
The Hollow King's Crown
Prop
assets/models/hollow_crown.glb
Carried by the Hollow King (it cannot be picked up)
no render forge_pauldron.glb
The Golem's Pauldron
Armor
assets/models/forge_pauldron.glb
Carried by the Forge Golem (it cannot be picked up)
no render moon.glb
The Full Moon
Environment
assets/models/moon.glb
Scenery: the sky of the maze and of the title screen under a full moon
the full moon: drawn unlit from its own texture, outside the fog, with a halo; it also hangs over the title screen
no render moon_half.glb
The Half Moon
Environment
assets/models/moon_half.glb
Scenery: the sky of the maze and of the title screen under a half moon
the half moon, the sky of an ordinary night: it takes the place of moon.glb, drawn the same way; a new moon hangs no moon at all (vigil.json moon phases look)
no render tree_of_life.glb
The Tree of Life
Common #9E9E9EProp
assets/models/tree_of_life.glb
no render tombstone.glb
Boss Tombstone
Common #9E9E9EProp
assets/models/tombstone.glb
no model drawn from shapes
Widow's Brand
Damned #E0409Adamned: true
drawn from shapes (prefabs/props.js); no .glb
Never taken by walking over it: look at it (within 2.8 m) and press X. Laid: a wave from wave 6 (10% rising 1% a wave to 25%), a vault's loot (50%), beside a boss's reward (30%); never given by a table
Gives Sword blows and shield bashes hit 50% harder
Costs Healing draughts restore nothing
when it bites, the line says: The draught heals nothing: Widow's Brand has drunk it first
bound to you for the run: it cannot be put down; at most 2 at once
no model drawn from shapes
Cinder Codex
Damned #E0409Adamned: true
drawn from shapes (prefabs/props.js); no .glb
Never taken by walking over it: look at it (within 2.8 m) and press X. Laid: a wave from wave 6 (10% rising 1% a wave to 25%), a vault's loot (50%), beside a boss's reward (30%); never given by a table
Gives Spells hit 60% harder
Costs Mana crystals restore nothing
when it bites, the line says: The crystal is only ash: Cinder Codex burns it before it can feed you
bound to you for the run: it cannot be put down; at most 2 at once
no model drawn from shapes
Gorged Reliquary
Damned #E0409Adamned: true
drawn from shapes (prefabs/props.js); no .glb
Never taken by walking over it: look at it (within 2.8 m) and press X. Laid: a wave from wave 6 (10% rising 1% a wave to 25%), a vault's loot (50%), beside a boss's reward (30%); never given by a table
Gives +40 maximum health
Costs Stamina recovers 50% slower
bound to you for the run: it cannot be put down; at most 2 at once
no model drawn from shapes
Spurs of the Pale Rider
Damned #E0409Adamned: true
drawn from shapes (prefabs/props.js); no .glb
Never taken by walking over it: look at it (within 2.8 m) and press X. Laid: a wave from wave 6 (10% rising 1% a wave to 25%), a vault's loot (50%), beside a boss's reward (30%); never given by a table
Gives Sprinting is faster: +30% of walking speed
Gives A dash is ready 50% sooner
Costs Every blow you take hurts 40% more
bound to you for the run: it cannot be put down; at most 2 at once
no model drawn from shapes
Tallyman's Ledger
Damned #E0409Adamned: true
drawn from shapes (prefabs/props.js); no .glb
Never taken by walking over it: look at it (within 2.8 m) and press X. Laid: a wave from wave 6 (10% rising 1% a wave to 25%), a vault's loot (50%), beside a boss's reward (30%); never given by a table
Gives Every kill pays 100% more bone marks
Gives 1 more draught and 1 more crystal lie in the maze each wave
Costs The dead move 20% faster
bound to you for the run: it cannot be put down; at most 2 at once
no model drawn from shapes
Crown of the Hungry Dead
Damned #E0409Adamned: true
drawn from shapes (prefabs/props.js); no .glb
Never taken by walking over it: look at it (within 2.8 m) and press X. Laid: a wave from wave 6 (10% rising 1% a wave to 25%), a vault's loot (50%), beside a boss's reward (30%); never given by a table
Gives Every kill heals 6 health
Gives Wounds close by themselves, 1.5 a second
Costs -30 maximum health
bound to you for the run: it cannot be put down; at most 2 at once
no model drawn from shapes
Ember Crown
Damned #E0409Adamned: true
drawn from shapes (prefabs/props.js); no .glb
Never taken by walking over it: look at it (within 2.8 m) and press X. Laid: a wave from wave 6 (10% rising 1% a wave to 25%), a vault's loot (50%), beside a boss's reward (30%); never given by a table
Gives Spells hit 40% harder
Costs Healing draughts restore 50% less
bound to you for the run: it cannot be put down; at most 2 at once
no model drawn from shapes
Horn of the Shaken Dead
Rare #38BDF8ACTIVEstagger
drawn from shapes (prefabs/props.js); no .glb
Laid, never given: a wave from wave 4 may lay one on the floor (8%, 1% more each wave, never above 16%), a vault's loot may hold one (50%). Walking over it takes it when the slot is empty; with the slot full, look at it (within 2.8 m) and press X to swap.
Staggers every ordinary enemy within 9 m for 3 s
A champion reels for 1.2 s
A boss is not moved
Ready again 28 s after use
used on V; one active item is carried at a time and the slot has one cooldown
no model drawn from shapes
Lantern of Revealing
Rare #38BDF8ACTIVEreveal
drawn from shapes (prefabs/props.js); no .glb
Laid, never given: a wave from wave 4 may lay one on the floor (8%, 1% more each wave, never above 16%), a vault's loot may hold one (50%). Walking over it takes it when the slot is empty; with the slot full, look at it (within 2.8 m) and press X to swap.
Every Shade within 40 m is seen for 8 s, as by a lit torch
Ready again 30 s after use
used on V; one active item is carried at a time and the slot has one cooldown
no model drawn from shapes
Veilstep Sigil
Epic #A855F7ACTIVEphase
drawn from shapes (prefabs/props.js); no .glb
Laid, never given: a wave from wave 4 may lay one on the floor (8%, 1% more each wave, never above 16%), a vault's loot may hold one (50%). Walking over it takes it when the slot is empty; with the slot full, look at it (within 2.8 m) and press X to swap.
Steps 5 m the way you look, through a thin wall if one is in the way
Nothing hurts you for 0.35 s
Never ends inside a wall, a gate or a sealed vault: with no room to land it fails
Ready again 14 s after use
used on V; one active item is carried at a time and the slot has one cooldown
no render collar.glb
Collar of Subjugation
Epic #A855F7ACTIVEsubjugate
assets/models/collar.glb
Laid, never given: a wave from wave 4 may lay one on the floor (8%, 1% more each wave, never above 16%), a vault's loot may hold one (50%). Walking over it takes it when the slot is empty; with the slot full, look at it (within 2.8 m) and press X to swap.
Binds the ordinary enemy under the crosshair, within 3 m, to fight beside you until it dies
It keeps within 4.5 m of you, and goes for the nearest enemy within 14 m
A boss, a champion, an elite, a thrall or a nemesis cannot be bound; a refused use costs nothing
When it falls the collar lies where it fell: take it up to use it again
Ready again 45 s after use
used on V; one active item is carried at a time and the slot has one cooldown
no render skeleton.glb
Skeleton Miniondata label: “Skeleton”
Fast melee swarm
assets/models/skeleton.glb
Score 75 · 1.9 m tall
Health25
Damage8
Speed3.5 m/s
blow: 8 damage, reach 1.4 m, every 0.8 s
appears from wave 1
health ×5.8 by wave 20, ×14.7 by wave 50 (Phase 2)
no render Shield_Skeleton.glb
Shield Skeleton
Guarded bruiser
assets/models/Shield_Skeleton.glb
Score 150 · 1.9 m tall
Health60
Damage12
Speed2.8 m/s
blow: 12 damage, reach 1.5 m, every 1 s, 0.5 s wind-up
guard: blocks 130° in front until a bash or a bomb breaks it for 2.5 s
weak to: bomb ×2
no render Skeleton_Archers.glb
Skeleton Archer
Ranged skirmisher
assets/models/Skeleton_Archers.glb
Score 125 · 1.85 m tall
Health30
Damage6
Speed3.2 m/s
blow: 6 damage, reach 1.2 m, every 1.2 s
arrow: 10 damage at 24 m/s every 2.2 s, 1 s draw
keeps its distance: backs off inside 6 m, shoots between 6 and 10 m
no render zombie.glb
Decaying Zombiedata label: “Zombie”
Slow melee
assets/models/zombie.glb
Score 100 · 2 m tall
Health40
Damage12
Speed2 m/s
blow: 12 damage, reach 1.4 m, every 0.8 s
weak to: fireball ×1.5
appears from wave 1
no render Ghoul_Hound.glb
Ghoul Hound
Charger
assets/models/Ghoul_Hound.glb
Score 150 · 1.1 m tall
Health45
Damage10
Speed4.2 m/s
blow: 10 damage, reach 1.4 m, every 0.9 s
charge: 16 damage at 11 m/s after a 0.6 s howl, every 3.5 s; a wall stuns it 1.6 s
flies: cruises over the walls at 5.2 m, dives to 1.1 m when it sees you; no armour
weak to: ice ×2
no render Shade.glb
Shadow Shadedata label: “Shade”
Stealth ambusher
assets/models/Shade.glb
Score 200 · 1.9 m tall
Health50
Damage15
Speed4 m/s
blow: 15 damage, reach 1.4 m, every 1 s, 0.35 s wind-up
stealth: 7% visible until within 3.5 m, striking or hurt; the Lens of the Veil shows every Shade within 30 m
weak to: fireball ×1.5, moonwave ×2
no render Iron_Knight.glb
Iron Knight
Armoured championChampion
assets/models/Iron_Knight.glb
Score 1,000 · 2.3 m tall
Health480
Damage25
Speed2.2 m/s
blow: 25 damage, reach 2.2 m, every 1.6 s, 0.55 s wind-up
Slam: a ground slam, 35 damage in 3.2 m; 0.9 s telegraph, every 5 s / 4.2 s / 3.4 s (by phase)
armour: shrugs off 40% / 25% / 10% of sword hits by phase
no render demon.glb
Nether Demondata label: “Demon”
Fireball caster
assets/models/demon.glb
Score 300 · 2.1 m tall
Health100
Damage20
Speed1.2 m/s
blow: 20 damage, reach 2.5 m, every 1.5 s
fireball: 15 damage at 8 m/s every 3 s, 0.85 s draw
weak to: ice ×1.5
no render Bone_Colossus.glb
Bone Colossus (Boss)
Boss: stun loopBoss
assets/models/Bone_Colossus.glb
Score 5,000 · 3.6 m tall
Health2,400
Damage18
Speed1.3 m/s
blow: 18 damage, reach 3 m, every 2 s, 0.95 s wind-up
Slam: a ground slam, 26 damage in 4.5 m; 1.6 s telegraph, every 7 s / 6 s / 4.5 s (by phase)
Summon: calls 3 Skeletons; 1.2 s telegraph, every 14 s, from phase 2
no render Drowned_Lich.glb
Drowned Lich (Boss)
Boss: ice stacksBoss
assets/models/Drowned_Lich.glb
Score 6,000 · 2.5 m tall
Health3,200
Damage22
Speed1.8 m/s
blow: 22 damage, reach 2.4 m, every 1.8 s, 0.6 s wind-up
frostbolt: 14 damage at 11 m/s every 3 s, 0.8 s draw
Drown: calls 3 Zombies; 1.2 s telegraph, every 16 s, from phase 2
no render veiled_matron.glb
Veiled Matron (Boss)
Boss: light and the veilBoss
assets/models/veiled_matron.glb
Score 8,000 · 2.4 m tall
Health3,400
Damage24
Speed2.1 m/s
blow: 24 damage, reach 2.8 m, every 1.8 s, 0.7 s wind-up
Shades: calls 2 Shades; 1.3 s telegraph, every 15 s, from phase 2
Veil: lets the veil down: the light of the sky falls to 15% for 6 s, so only what burns still shines; 1.5 s telegraph, every 22 s, from phase 3
no render ember_tyrant.glb
Ember Tyrant (Boss)
Boss: reflection and lightningBoss
assets/models/ember_tyrant.glb
Score 9,000 · 3 m tall
Health2,600
Damage28
Speed1.9 m/s
blow: 28 damage, reach 3.3 m, every 2.3 s, 0.8 s wind-up
Fireballs: a fan of 3 fireballs, 16 damage each; 1.2 s telegraph, every 7 s / 6 s / 5 s (by phase)
Slam: a ground slam, 30 damage in 4 m, and 5 patches of fire burn on for 6 s (7 every 0.5 s); 1.4 s telegraph, every 9 s / 8 s / 7 s (by phase)
no render crimson_elf.glb
Crimson Elf
Rescued maiden
assets/models/crimson_elf.glb
Height1.7 m
Ring of light#ff3b4e
Modelelfcrimson
no render golden_elf.glb
Golden Elf
Rescued maiden
assets/models/golden_elf.glb
Height1.7 m
Ring of light#ffcf5a
Modelelfgolden
no render shadow_elf.glb
Shadow Elf
Rescued maiden
assets/models/shadow_elf.glb
Height1.7 m
Ring of light#9a6bff
Modelelfshadow
no render silver_frost_elf.glb
Silver Frost Elf
Rescued maiden
assets/models/silver_frost_elf.glb
Height1.7 m
Ring of light#b8e4ff
Modelelfsilver
no render emerald_elf.glb
Emerald Elf
Rescued maiden
assets/models/emerald_elf.glb
Height1.7 m
Ring of light#0fb36b
Modelelfemerald
Phase 6Hub & World Staging
The only “hub” in the Endless Vigil is the middle of the maze, where the rescued maidens wait and add something of their own; and the only staged sequence is the title screen.
The rescued elves' hub
The five maidens are held by the fighters, one each. When one falls, its maiden is freed where it died and, a little later, runs to a station and waits there. The stations are on a ring 4.3 m from the exact middle of the maze, under the Tree of Life in the courtyard (the 3 × 3 cells round the start, opened first, with a tree at its middle): each maiden has her own angle on the ring (Crimson Elf 306°, Golden Elf 18°, Silver Frost Elf 90°, Shadow Elf 162°, Emerald Elf 234°), the same in every maze, and she stands facing out (turning to a player who comes near). Her way along the corridors ends in the courtyard cell next to her place and never leads through the middle cell, where the trunks stand.
What each maiden adds to the middle
When a maiden settles at her station the courtyard gains a fixture in her colour on the same ring, 4.3 m from the middle and a metre to one side of her, and the Tree of Life glows a step brighter (full with all 5). It comes up with a flare and a line; a maiden freed earlier in the session, or in the saved game, has hers standing from the start. The fixtures are for looking at: nothing collides with them. With all 5 standing there the middle is a sanctuary: enemies cannot enter a circle of 5.6 m round it between waves (a ring on the floor shows it). A wave is cleared only when its last enemy falls, so a break has no enemies of its own: the sanctuary keeps out only what is called in a break (a vault's or a ring's wardens, a Trial's pack). hub.sanctuary.when: "always" holds it through a wave as well, and is left off.
The fixtures (vigil.json hub.fixtures)
Maiden
Fixture
Colour
Crimson Elf
banner
#ff3b4e
Golden Elf
shrine
#ffcf5a
Silver Frost Elf
lantern
#b8e4ff
Shadow Elf
moss
#9a6bff
Emerald Elf
crystals
#0fb36b
What triggers what (src/systems/Captives.js, Animation.js, HUD.js)
Trigger
What happens
A boss falls (boss:died)
The maiden that fighter holds (the table below) is freed 2.6 m from the corpse, towards the player, inside a ring of light, and the HUD says “You freed the … from the …!”. A fighter the table does not name frees one still held, at random
The next wave starts
She has made her curtsy (once, then she stands and watches you) (Formal_Bow, Curtsy, Curtsey, Bow, Bowing), and lingers 4 s more
The dance is over
She runs along the corridors to her station (3 m/s), walking the last 9 m (1.4 m/s)
She reaches it
She stands there in her idle for good; the HUD says where she waits (captive:settled)
The player comes within 10 m
She turns to watch them; she looks ahead again when they go
A fighter falls again, and its maiden is free already
Its own maiden comes as a guest, dances the victory dance and slips away (fades over 2 s): she already stands in the middle
A new run after a fall (R)
The rescued maidens are already standing in their places (they are kept for the play session)
Continue after a reload
The rescued list comes back from the save: they stand in the places of the new maze
The 5 maidens (vigil.json captives.models) and the fighter that holds each (captives.heldBy)
Maiden
Held by
Model file
Ring of light
Clips
Crimson Elf
Forge Golem
crimson_elf.glb
■#ff3b4e
dance, sing, idle, walk, run
Golden Elf
Bone Colossus
golden_elf.glb
■#ffcf5a
dance, sing, idle, walk, run
Shadow Elf
Veiled Matron
shadow_elf.glb
■#9a6bff
dance, sing, idle, walk, run
Silver Frost Elf
Drowned Lich
silver_frost_elf.glb
■#b8e4ff
dance, sing, idle, walk, run
Emerald Elf
Ember Tyrant
emerald_elf.glb
■#0fb36b
dance, sing, idle, walk, run
One line each, carved verses
A rescued maiden who stands in her place says one line the first time in a run that the player stays within 3 m of her for 1 s in a break (no key, and it waits while a swap or a passive is being chosen); the HUD shows it under her name and the codex keeps it. When a boss or champion falls, the first stanza of that creature's list that is not cut yet is carved on its creature's tombstone, one of 7 that stand in a ring 6.5 m from the Tree of Life (at most 1 for a wave; a creature whose list is spent leaves nothing). The stone is not there until its first stanza is carved: it then rises out of the ground (2.2 s), the first stanza on its front, which faces out, the second on its back, which faces the tree. Once risen a tombstone is solid. The Iron Knight's stone also keeps a tally of its falls, "Fallen: n", counted on every one even when its stanzas are all carved, and glows in the colour of the look the last one wore (crimson for the plain first fight). The stanzas and the tally are saved with the checkpoint, so Continue and a fall show the same stones. Each line and stanza is an entry of the codex's Lore tab (??? until heard or seen).
What each maiden says (vigil.json lore.maidens.lines)
Maiden
Codex entry
Her line
Crimson Elf
The Crimson Elf: the last fire
The Halls were lit to keep a vigil for the dying moon. Every fire here was lit for her, and mine is the last that obeys.
Golden Elf
The Golden Elf: the light
Light does not ask who has earned it. Drink, rest, and light the next seal: the moon is listening.
Shadow Elf
The Shadow Elf: the dark
A Shade is only the dark that forgot whose it was. Keep a flame near, and it remembers.
Silver Frost Elf
The Silver Frost Elf: the cold
The Lich drowned the lower Halls to keep its dead from walking. Cold was never its cruelty; it was its only mercy.
Emerald Elf
The Emerald Elf: the mirror
The Tyrant burned for a king who never came. Whatever she throws at you was meant for him: hold up something bright, and send it home.
The carved stanzas (vigil.json lore.wall.stanzas): the first of a creature's list that is not cut yet, when it falls
Id
Creature
Lines
ironknight-1
Iron Knight
Three plates he wore against the dark, and none against the oath he swore. He kept the gate until the gate kept him. Now neither lets go.
ironknight-2
Iron Knight
The headsman's blade, the headsman's shield: he took them from a hand grown cold. Whom did he serve? The dead recall. The living see only the plates.
bonecolossus-1
Bone Colossus
A thousand keepers, one great heart, stacked bone on bone and set to walk. The fire in its ribs burns low and brighter at each wound it takes.
bonecolossus-2
Bone Colossus
It never runs. It has no need. The Halls are patient, and so is bone. Strike when it lifts its arm to fall: the heart flares, and the bones forget.
drownedlich-1
Drowned Lich
When the lower Halls were drowned a keeper stood and would not sink. The water answers to its staff; only the cold may bid it be still.
drownedlich-2
Drowned Lich
It raises what the water kept and calls each by a name long lost. The staff it lost, it knows by sound. Carry it in, and watch it listen.
veiledmatron-1
Veiled Matron
She kept the lamps before the dark. Now she walks the halls unseen and snuffs each flame she passes by: light one again beside her, and she shows.
veiledmatron-2
Veiled Matron
At the last she lets the veil come down and the Halls forget the shape of day. Only what burns is left to see by: a fireball, a torch, the Lens held high.
embertyrant-1
Ember Tyrant
She waited for a king who never came, and forged his crown, and burned for him. Three plates of iron hold her rage; the lightning knows where each is hinged.
embertyrant-2
Ember Tyrant
Each fire she hurls was meant for the king. Hold up a mirror and send it home, and watch the queen kneel to her own flame. Then strike: the plates are only metal now.
forgegolem-1
Forge Golem
He banked the last red fire in his forge and grew the iron round her like a hearth. When the furnace draws its breath to burn, give it a bomb to swallow, and it kneels.
forgegolem-2
Forge Golem
Three plates of iron over a banked red fire; the bombs know where each is riveted. He runs when the bellows fill; the wall waits. On a red floor, cast frost and stand on it.
hollowking-1
Hollow King
He went up the Moonspire to call her down and left his queen to burn below. He wears his crown over nothing at all, and five fires open him, one by one.
hollowking-2
Hollow King
His glass shows the fire he cannot bear: red, then gold, white, violet, green. Answer the colour, and the maiden sings. When the green is lit, send his own moon home.
The title sequence, step by step
The page loads behind a loading screen while every model of models.json is fetched (71 files). A model that fails to load never stops the game.
Game.boot lets each state prepare itself: TitleScene.prepare builds the diorama (TitleStage), compiles its shaders and draws one frame, so the first look does not stall; VigilScene.prepare builds the first maze and warms up every creature, pickup and projectile. If the diorama cannot be built, the menu goes on a plain dark screen and the game still starts.
game.start('title'): TitleScene.enter reads the save (SaveGame) and shows the menu: Continue (the wave, the score, the sword and how long ago) and New Game if one exists, Click to Begin if not. The heads-up display stays hidden under it.
Every frame the stage is updated and drawn instead of the Vigil: the camera sways round the dais and leans towards the mouse (the horizontal field of view is fixed, so a narrow window shows more above and below instead of cropping the cast), the maidens and bosses turn a little towards it, the braziers flicker and embers rise.
The click (a button, or anywhere else: Continue if a save exists) leaves the choice in game.shared.resume, unlocks the sound, starts the ambience and captures the mouse (this is why it must be a click).
TitleScene.update returns 'vigil'; TitleScene.exit hides the menu and disposes the diorama to free what it holds; VigilScene.enter hands the choice to Waves.begin: a new game starts wave 1, Continue restores the saved run.
60°horizontal field of view (fixed)
5maidens on the dais
7bosses behind them
4pieces of loot floating over the menu
4braziers
8ruined pillars, and a gate
The title diorama: who stands where (src/data/title.json; metres, the camera looks down −Z, yaw in degrees)
Figure
Kind
Position (x, y, z)
Yaw
Does
Golden Elf
maiden
-4.6, 0, 1.5
20
her idle clip, turns a little towards the mouse
Emerald Elf
maiden
-2.95, 0, 3
14
her idle clip, turns a little towards the mouse
Crimson Elf
maiden
-1.95, 0, 4.1
8
her idle clip, turns a little towards the mouse
Silver Frost Elf
maiden
1.9, 0, 4.1
-8
her idle clip, turns a little towards the mouse
Shadow Elf
maiden
3.6, 0, 2.4
-16
her idle clip, turns a little towards the mouse
Iron Knight
fighter
-8.8, 0, -6.5
26
its standing pose, breathing; scale ×1.1
Veiled Matron
fighter
-6.1, 0, -4
18
its standing pose, breathing, dimmed to 62%; scale ×1.1
Drowned Lich
fighter
-4.4, 0, -2.5
12
its standing pose, breathing; scale ×1.1
Ember Tyrant
fighter
5.7, 0, -5.2
-20
its standing pose, breathing, its plates breathing in their own light; scale ×1
Forge Golem
fighter
7.1, 0, -2.2
-26
its standing pose, breathing, its plates breathing in their own light; scale ×1
Bone Colossus
fighter
9.3, 0, -9.5
-24
its standing pose, breathing, heart beating; scale ×1.15
Hollow King
fighter
3.7, 0, -12.8
-8
its standing pose, breathing, dimmed to 50%, its plates breathing in their own light; scale ×1
Tyrant's Ember Mace
loot
-1.7, 2.1, 1.8
–
floats, bobs and turns like a pickup, without a lamp of its own
Moon-Mirror Aegis
loot
-3.1, 2.4, -1
–
floats, bobs and turns like a pickup, without a lamp of its own
Relic Sunblade
loot
1.7, 2.1, 1.8
–
floats, bobs and turns like a pickup, without a lamp of its own
Veilbreaker Lantern
loot
3.1, 2.4, -1
–
floats, bobs and turns like a pickup, without a lamp of its own
The camera starts at (0, 1.2, 11.5) looking at (0, 2.4, 0); it sways by ±0.05 rad round the target every 45 s and leans up to 0.06 rad with the mouse. Everything is built the way the game builds it (the maidens like captives, the bosses by the enemy prefab, the loot by the pickup prefab), so a new model appears on the title screen by editing title.json.
Update 26 Oct 2026Animation & Combat Polish
The sword swing was reworked so it no longer snaps: it has a windup you can read, a strike that accelerates through the cut, and a follow-through that slows to a stop. The numbers below are read from src/data/weapons.json (sword.slash) and the curves are drawn by the same functions the game runs (src/util/slash.js).
0.36 sa standard swing, start to ready stance
137 msuntil the blow lands (hitAt 0.38 of the swing)
0.44 sthe Executioner's Greatsword swing
0.4 sthe Spire of the Drowned Lich swing
90 msthe blend when a swing starts in the last
3phases: windup, strike, follow-through
Windup, strike, follow-through
A click starts the swing (player:swing: the windup begins, the stamina pause restarts). The blow comes part-way through it (player:strike, at hitAt of the swing): that is when the one-tick hit box is made, the Moon Wave leaves and the whoosh sounds. A swing cut short by a fall never strikes. The click is no longer the same tick as the damage: about 137 ms of readable windup came in between, which is the price of a swing that looks like it has weight.
The three phases of a swing (weapons.json sword.slash.phases)
Phase
Share of the swing
At the standard 0.36 s
Arc covered
Easing
What you see
Windup
0–0.3
0 ms–108 ms
0 → 0.32
inOutSine
Draws the blade back and up with a slow, loaded ease and comes to a hold at the top; the torso coils the other way. The easing is nearly still at the end: the pause that makes the strike readable.
Strike
0.3–0.52
108 ms–187 ms
0.32 → 0.66
inQuad
Released from the hold and speeding up all the way through the cut (the speed is greatest at the end, where the blow has landed and the blade is across the view). The slash trail is drawn behind the blade.
Follow-through & recovery
0.52–1
187 ms–360 ms
0.66 → 1
outCubic
The blade overshoots the cut a little and is slowed to a stop at the ready stance: a long, decelerating tail, so the hand never snaps to rest.
The tempo curve, drawn with swingPath from the data: the gold line is how far along the arc the blade is, the dashed red line is its speed. It is nearly still at the end of the windup, fastest at the end of the strike (the step down just after it is the blade being checked at the end of the cut), then decays smoothly to nothing in the follow-through. The solid vertical line is the blow.
The path and the torso behind the hand
Where the hand goes (the path) is separate from how fast it goes there (the tempo above). Each key of the path holds the hand's offset, the blade's turn and a body channel: the yaw, pitch and roll of the torso behind the sword hand. In first person there is no body to see, so the camera takes it: the world leans away from the cut in the windup and into it in the strike, by no more than 3.4° of yaw and 2.1° of roll. The off hand (the shield) sways against it. sword.slash.bodyScale (1 by default) scales it, or turns it off with 0.
The torso twist the camera takes, in degrees: yaw of a forehand (gold) and a backhand (blue), and the roll of the forehand (dashed). The yaw changes sign across the strike: the body coils one way, then drives through. The dotted vertical lines are the phase ends.
The forehand path: one key per place along the arc (weapons.json sword.slash.forehand; the backhand is its mirror)
Arc position
Hand moves (x, y, z in m)
Blade turns (rad)
Torso: yaw, pitch, roll
0
0, 0, 0
0, 0, 0
0°, 0°, 0°
0.1
-0.02, 0.03, 0.05
0.06, 0.1, 0.18
0.7°, 0.3°, 0.6°
0.32
0.1, 0.34, 0.14
-0.25, 0.45, 0.85
2.9°, 0.9°, 1.7°
0.49
0.4, 0.12, -0.3
-0.9, -0.7, -0.7
-0.7°, -1.3°, -0.3°
0.66
0.54, -0.12, -0.2
-0.85, -1, -1.35
-2.9°, -1.7°, -2°
0.82
0.57, -0.17, -0.1
-0.72, -1.1, -1.5
-3.2°, -0.9°, -1.7°
1
0, 0, 0
0, 0, 0
0°, 0°, 0°
Timing by weapon, and the blend
Swing times by sword (a tier may set its own swingTime; the heavy ones swing slower)
Sword
Swing takes
Blow lands at
Strike ends at
Next swing allowed
Cooldown against the swing
Worn Iron Sword
0.36 s
137 ms
187 ms
0.35 s
10 ms: the next swing starts in the last of this one and is blended in
Footman's Flanged Mace
0.36 s
137 ms
187 ms
0.36 s
ready before the swing ends
Tempered Moonsteel Blade
0.36 s
137 ms
187 ms
0.33 s
30 ms: the next swing starts in the last of this one and is blended in
Executioner's Greatsword
0.44 s
167 ms
229 ms
0.4 s
40 ms: the next swing starts in the last of this one and is blended in
Cursed Damned Blade
0.36 s
137 ms
187 ms
0.36 s
ready before the swing ends
Spire of the Drowned Lich
0.4 s
152 ms
208 ms
0.38 s
20 ms: the next swing starts in the last of this one and is blended in
Relic Sunblade
0.36 s
137 ms
187 ms
0.36 s
ready before the swing ends
Tyrant's Ember Mace
0.46 s
175 ms
239 ms
0.44 s
20 ms: the next swing starts in the last of this one and is blended in
Forge Hammer
0.46 s
175 ms
239 ms
0.5 s
ready before the swing ends
The Hollow King's Sword
0.34 s
129 ms
177 ms
0.4 s
ready before the swing ends
Some cooldowns are shorter than their swings (the standard swing takes 0.36 s, a Moonsteel Blade can swing again after 0.33 s). A swing that begins while the hand is still in the last one, or one that is cut short, would make the hand jump. Instead the difference is carried and faded out over sword.slash.blend = 0.09 s with a smoothstep (inertialization), so the hand always flows from where it is into the new windup.
The slash trail
While the blade is between 34% and 90% of its arc (the strike and the first of the follow-through) a ribbon is laid down between the tip and 50% of the way down the blade, one slice per drawn frame, in the camera's own space. A slice glows for 0.15 s and fades; the tip edge is the hot one (brought towards white), the guard edge nearly black. It is added to the picture, so black is nothing: no sorting, no alpha. Its colour is the sword's own glow, steel white for a plain blade. Code: src/fx/SlashTrail.js.
ready stance (0)windup, early (windup, 0.12)top of the windup (0.28)strike: the blow lands near here (0.40)end of the strike (0.52)follow-through (0.70)recovery, nearly at rest (0.90)
player:swing (windup starts)
Stamina: the recovery pause restarts
windup: the blade loads, the torso coils
player:strike at 0.38
Combat: the one-tick Hitbox
Audio: the whoosh · Spells: the Moon Wave
strike → follow-through → ready
Hit-stop and the slow-motion kill
A blow that connects has a weight you can feel: for a few milliseconds of real time the world holds still while the screen, the camera (it still looks where the mouse goes), the shake and the sound go on. It is the game's logic that stops, not its drawing: the loop runs the same 60 Hz step but feeds it speed × real time, and a speed of 0 means no ticks. A key pressed during the freeze is waiting for the first tick after it. Everything is player.json hitStop; intensity (1) multiplies every pause and the slow-motion's length, and is what a settings slider will change (add ?o.player.hitStop.intensity=0 to the page address to play without it).
What freezes the game and for how long (src/data/player.json hitStop; src/util/hitstop.js, src/systems/HitStop.js)
What happens
The game holds still for
Notes
The player's sword or shield bash connects (hit, kind melee, bash)
the damage that landed, with the level, a perfect parry's double and a stunned boss's double counted: a heavy weapon, an empowered or a stun-time blow is a heavy hit
A blow kills
at least 40 ms
so every kill has a beat, even with the Worn sword
A perfect parry (parried)
80 ms
the biggest single pause: the ring of the shield
A boss falls (boss:died, kind boss)
0.5 s at 25% of full speed
begins when the killing blow's own freeze is over, and eases back to full speed in its last 0.15 s
Several blows in one tick (a cleave)
one freeze, the longest
the system turns a tick's facts into one request
A freeze that would begin within 0.15 s of the last
nothing
game time, which does not pass during a freeze: a flurry cannot hold the game still for half a second
Not a hit: an enemy's blow on the player, a spell, a bomb, a blow the guard stops
nothing
only what the player's own sword and shield land
What each sword's blow freezes for, at level 1 (damage from weapons.json; a level adds 4% and may lift a blow to the next rung)
Sword
Damage
A blow
An empowered blow (×2) or one on a stunned boss (×2)
A killing blow
Worn Iron Sword
15
–
40 ms
40 ms
Footman's Flanged Mace
20
–
60 ms
40 ms
Tempered Moonsteel Blade
28
40 ms
60 ms
40 ms
Executioner's Greatsword
42
60 ms
80 ms
60 ms
Cursed Damned Blade
44
60 ms
80 ms
60 ms
Spire of the Drowned Lich
60
60 ms
80 ms
60 ms
Relic Sunblade
85
80 ms
80 ms
80 ms
Tyrant's Ember Mace
95
80 ms
80 ms
80 ms
Forge Hammer
100
80 ms
80 ms
80 ms
The Hollow King's Sword
110
80 ms
80 ms
80 ms
The speed of the game over a boss's death blow with the The Hollow King's Sword, played through the game's own TimeScale in 2 ms steps: the blow's freeze (80 ms), then 0.5 s at 25% speed, climbing back to full in the last 0.15 s. On the screen every step is a drawn frame (16.7 ms at 60 Hz), so a freeze holds the frames that start inside it and never fewer than it asks for.
Combat / Boss: hit · parried · boss:died (facts)
HitStop: one request for the tick, the longest freeze
ctx.time.slow → Loop.slow
TimeScale: the speed of each drawn frame (the slowest wins)
Loop: fewer ticks, or none; the frame is still drawn
the camera look, the shake and the sound go on
Executions
An enemy that cannot act is marked: a pale diamond with a blade pointing down floats over its head for as long as it is staggered, has a broken guard or (a boss) is stunned. A sword blow on a marked enemy is a finisher instead of a hit: the player is held for 0.5 s and nothing can hurt them, the blow lands 0.14 s in, and the target dies outright, whatever health or guard it had. The click and its windup are exactly as before: it is the blow that is replaced, decided on the tick it lands. Everything is weapons.json execution.
Who can be executed, when, and what it gives back (src/data/weapons.json execution.kinds; src/util/execution.js)
Kind
Executable when
Gives back
Ordinary
staggered (a perfect parry, a broken poise, a wall, a heavy weapon) or its guard is broken (a bash, a bomb)
15 health, 10 mana
Champion
staggered (a perfect parry, a broken poise, a wall, a heavy weapon); and only in its last phase (a champion after its last plate, a boss in its last)
30 health, 20 mana
Boss
stunned (a boss: a spell in a wind-up, three Ice Shards); and only in its last phase (a champion after its last plate, a boss in its last); and at 20% health or less (the last stun)
nothing extra: a boss's death refills everything
The finisher (src/data/weapons.json execution; systems/Combat.js, Player.js, Boss.js, Spells.js, Animation.js)
Rule
Value
Notes
Who is taken
the executable enemy nearest the crosshair
of everything the sword reaches (its own reach and arc, not behind a wall); the others in reach are left alone: a finisher is one committed act
The player
held 0.5 s
no walking, blocking, swinging, casting, throwing, jumping or dashing; the view stays free; nothing hurts the player (no damage, no parry, nothing announced)
The swing
its follow-through is stretched to fill the finisher
the swing's time and length grow together so the hand does not jump; a Cursed Damned Blade throws no Moon Wave: the finisher replaces the blow whole
The target
held staggered (or its stun held) for 0.5 s
dies 0.14 s in: a hit of kind execution for the rest of its health
The blow
80 ms hit-stop and a shake of 0.5
a boss's death adds the slow motion of the hit-stop section above
The mark
■#e8f0ff, 0.6 m, 0.45 m over the head
pulses; one shared picture drawn from numbers; the sprite is part of the model and goes with it
in the game: a staggered zombie wears the mark (headless capture of the real game)in the game: the finisher, the blade driving through slowly
click: the swing and its windup (as ever)
the blow lands: Combat asks what the sword reaches
a marked enemy: execution:began (no hit box)
Player: held 0.5 s · Boss / AI hold the target
0.14 s: execution:struck → Combat kills it
executed: health, mana, the sting, 80 ms hit-stop
Wall-splats and swept shoves
Every blow of the player's shoves what it hits: a sword's knockback (the table of swords in Phase 1), the shield bash's 1.6 m and a Rune Bomb's 2.5 m. A shove is a displacement carried out in one tick, not a speed, so how hard an enemy hits a wall is how much of the shove the wall took. An ordinary enemy thrown into a wall, a pillar or the stub of a choke takes a wall-splat: a share of the blow's own damage for every metre the wall took, and a stagger (so it wears the execution mark). A wall torch near where it hit makes it worse. Bosses and champions are never shoved. Everything is weapons.json splat.
The rule (src/data/weapons.json splat; src/util/splat.js)
Rule
Value
Notes
How hard
the metres the wall took of the shove
all of it head on, about half in a 45° glance, none in the open or against another body; under 0.25 m is a graze and does nothing
Damage
30% of the blow for each metre, at most 100%
a share of the blow that did the shoving, so it grows with the weapon, the level, a stun's double and a parry's empowered strike; it ignores guard, armour and weaknesses
Stagger
0.4 s + 0.5 s a metre, at most 1.6 s
a staggered enemy can be executed (the section above)
A wall torch
within 1 m of where it hit: +50% of the blow and +0.4 s
the scene gives the torches' places (ctx.level.torchPoints)
The surface
wall ×1, pillar ×1, choke ×1
a maze wall, a pillar (the halls and the ruins) and a choke stub; the table is there to tune them apart
What each blow adds when it throws an enemy head on into a wall that stands right behind it (the whole shove is lost; damage at level 1)
Blow
Damage
Shove
The splat
With a wall torch
Stagger
Worn Iron Sword
15
0.8 m
+4
+11
0.8 s
Footman's Flanged Mace
20
1.3 m
+8
+18
1.05 s
Tempered Moonsteel Blade
28
1.8 m
+15
+29
1.3 s
Executioner's Greatsword
42
2 m
+25
+46
1.4 s
Cursed Damned Blade
44
1.6 m
+21
+43
1.2 s
Spire of the Drowned Lich
60
2.2 m
+40
+70
1.5 s
Relic Sunblade
85
2.6 m
+66
+109
1.6 s
Tyrant's Ember Mace
95
3.2 m
+91
+139
1.6 s
Forge Hammer
100
3.4 m
+100
+150
1.6 s
The Hollow King's Sword
110
2.4 m
+79
+134
1.6 s
Shield bash (Wooden Shield)
10
1.6 m
+5
+10
1.2 s
Rune Bomb (60 in the middle of the blast)
60
2.5 m
+45
+75
1.6 s
a blow shoves: knockback (with the blow's damage)
Movement: the shove is carried in steps and a wall stops it
wall:impact: the metres lost, the surface, the place
Combat: a splat (a share of the blow) and a stagger
splatted: dust, a crunch, a shake
a staggered enemy is a marked one: execute it
Update 26 Oct 2026Stamina & Movement
Sprinting now costs a stamina pool, and so does the dash. The pool drains while you sprint, drops you to a walk when it runs dry and comes back after a short pause. Everything below is read from src/data/player.json (stamina, bindings) and src/data/progression.json (the passives).
100stamina at level 1
18 / sdrain while sprinting: 5.56 s of sprint from full
25 / srecovery once rested
1.25 spause after a sprint, swing or bash
20refill needed before the sprint comes back
9.6 m/ssprint speed (walking 6)
Try it
This bar is driven by the same rules (the page copies Stamina.update and the sprint test in Player.js, with the numbers above). The Guard bar above it is the shield's meter (Phase 1): hold the shield up and take blows on it, and watch it drain by the blow times the shield's guard drain, break at 0 and refill only with the shield down. Hold the button, or hold Shift with the pointer over the demo, to sprint; let go and watch the pause, the recovery and the resume tick. Swing restarts the pause. The passives change the numbers as they do in the game; the level slider lengthens the pool.
1
Health100 / 100
Guard100 / 100
Stamina100 / 100
in the game: sprinting, the bar draining (headless capture of the real HUD)in the game: the pool ran dry: WINDED, the resume tick and the grey bar
The rules
The rules (src/data/player.json stamina; src/systems/Stamina.js and Player.js)
Rule
Value
Notes
Pool
100 at level 1
milestone levels add to it (Leveling System); a checkpoint saves its size
Sprint key
Shift
player.json bindings.sprint: a list of key codes, so it is configurable in the data
Sprint speed
×1.6 = 9.6 m/s
walking is 6 m/s; Fleet Stride adds 0.08 to the factor
Drain
18 a second
only while sprinting (Shift held and moving): 5.56 s from full; Light Feet makes it ×0.85
Drop-out
at 0
the sprint stops that tick (the player walks) and stays locked, whatever Shift does, until the pool reaches the resume point
Resume point
20
so a held Shift cannot stutter in and out at 0
Recovery delay
1.25 s
counted from the last sprint, sword swing or shield bash; Steady Breath makes it 1 s
Regeneration
25 a second
after the delay; Second Wind makes it ×1.2, the Moonlit Blessing ×1.5
Refills
at a checkpoint rise, a shrine, and when a level grows the pool
a milestone fills the added points at once
What the bar shows (src/ui/HUD.js setStamina, src/ui/hud.css)
State
When
The bar
Rested
full and untouched
steps back to half strength so the HUD is quiet
Sprinting
Shift held, moving, pool above 0
drains 18 a second; the fill follows at once (a 0.09 s linear transition) and a pale ghost segment stays behind, then catches up
Recovering
1.25 s after the last sprint, swing or bash
fills 25 a second
Low
below 25% of the pool
turns amber and pulses
WINDED
the pool hit 0
the bar goes grey, flashes and shakes red once, a WINDED tag appears and a tick marks the resume point (20); the sprint is locked until the pool is back there
How long a sprint lasts
Computed from the numbers above (duration = pool / drain; refill = pause + pool / regeneration, from empty)
Who
Sprint from full
Distance run
Pause
Back to full from empty
No passives
5.56 s
53 m
1.25 s
5.25 s
A stamina build: Second Wind, Light Feet, Steady Breath (three choices)
6.54 s
63 m
1 s
4.33 s
...and Fleet Stride (a fourth)
6.54 s
66 m
1 s
4.33 s
No passives, under the Moonlit Blessing
7.94 s
76 m
1.25 s
3.92 s
The dash
A short burst of speed on F, the Vigil's answer to a charge: it takes the player 4 m along the move keys in 0.2 s, and for the first 0.12 s nothing can hurt them. It is the one thing besides the sprint that spends stamina, and it spends it as a price, not a rate.
The dash (src/data/player.json dash and bindings.dash; src/util/dash.js, Player.js, Stamina.js, Combat.js, Render.js)
Rule
Value
Notes
Switch
dash.enabled true
false: the key does nothing and the bar shows no notch
Key
F
bindings.dash: a key code or a list of them
Distance and time
4 m in 0.2 s
the speed eases off (falloff 1): 40 m/s at the start, 0 at the end, and the metres always add up to the distance exactly. Walls and bodies stop it as they stop a walk
Direction
where the move keys point
fixed when it starts, whatever the player looks at after; with no key held idleDirection is 'back' (a backstep)
Price
30 stamina
paid when it starts, and only if the pool holds that much and is not winded: 3 dashes from a full pool at level 1. A refused dash costs nothing, does not lock the sprint, flashes the bar and plays the same dud as a refused spell. It restarts the recovery pause like a swing. A pool spent to exactly 0 is winded
Cooldown
0.5 s
from the start of one dash to the start of the next; a press inside it does nothing
Invulnerable
0.12 s from the start
a blow, charge, slam, arrow or blast that lands inside it does nothing and is not a parry (player:dodged); a charge that is dodged is spent and does not turn round and hit when the dash ends. It never outlasts the dash
The view
+5° while it lasts
the field of view widens at 16 a second and settles when the dash is over
The bar
a notch at 30
dim while the pool is short of the price, bright when it can pay
How fast the dash goes while it lasts: the burst is at the start and eases off, so the first tick already carries the player 0.64 m. The dashed line is where the invulnerable moment ends.
The Ghoul Hound is what it is for: a dash sideways takes the player out of the charge line (the hound runs on and meets the wall), and a dash into the line lets the charge arrive inside the invulnerable moment and be dodged. The slam of the Iron Knight and the Bone Colossus is dodged the same way; none of it is a parry, so a parry's reward (an empowered next blow) is not earned by a dodge.
With the other moves
The dash (F) costs 30 points at once and restarts the pause (Stamina listens to player:dash). It never cancels a swing: the blow of a swing begun before or during a dash still lands on its own tick, from where the player is by then.
Sword swings and shield bashes cost nothing but restart the recovery pause (Stamina listens to player:swing and player:bash). A fighter who keeps swinging keeps the pool where it is.
Blocking and parrying cost no stamina: the shield has a guard meter of its own (the second bar in the demo above, and Phase 1), so the pool for running never competes with the one for blocking. A perfect parry gives mana back (Phase 1), not stamina, and a broken guard does not touch the stamina pool.
Casting is Shift + click, and Shift alone does not sprint: the pool is only spent while you are also moving. A cast on the move still drains the sprint it rides on.
Jumping costs nothing.
Update 26 Oct 2026Leveling System
There is no experience. The player's level goes up by one each time a boss or champion falls (the Iron Knight every 5th wave counts, as it is fought like a boss), and by nothing else: killing ordinary enemies never levels. Each level adds health, stamina and attack, and one passive. All of it is read from src/data/progression.json and worked out by src/util/progression.js.
40the highest level
every 5 wavesa milestone (a champion, or a boss every 2nd)
+10 / +10 / +4%health / stamina / attack a level, levels 2 to 10
+5 / +4 / +2%from level 11 on
190health at level 10 (before any Heart Container)
×1.36attack at level 10
The rules
Only a boss or a champion gives a level (progression.kinds: boss, champion). It is awarded when the fighter dies (boss:died), in the same tick the elf is freed.
Once per wave. The waves already won are kept (Level.milestones): dying after a boss and fighting it again does not level twice.
Permanent for the run. A fall does not take a level back, as it takes back neither gear nor score; a new run starts at level 1.
Saved. Every checkpoint carries the level, the milestones won, the passives chosen and the seed of the offers, and the sizes of the health and stamina pools (player.level, player.maxHp, player.maxStamina); Continue restores them, works the attack and the passives out again and makes an offer that was still open again, the same; a save from before levels loads as level 1.
The reward is immediate. The maximum health and stamina grow by the level's amount and the added points are filled in at once (health and stamina are not refilled otherwise: the boss's death does that in Waves). Attack scales sword, shield bash, Moon Wave and spells by the multiplier: damage × (1 + total attack bonus).
Past level 10 each level is smaller, so the first ten are the strong ones and an endless run slows down. A passive is a choice (below) until the open pools are empty (the core's 18 alone: to level 19); later levels are stats only unless a maiden has added hers.
Total bonus from the milestones, by level: health and stamina (left axis) and the attack bonus (right axis, dashed). The kink is where the steps change.
The stat steps (progression.json steps: what ONE level gives, by the level reached)
Levels
Health each
Stamina each
Attack each
Count
2–10
+10
+10
+4%
9 levels
11–40
+5
+4
+2%
30 levels
Boss milestones: the level, the wave whose fighter gives it, what that level adds, the totals, and whether it owes a choice of passive (levels 2 to 12 and the cap)
Level
Wave
Fighter
+Health
+Stamina
+Attack
Max health
Max stamina
Attack
Passive
2
5
Iron Knight
+10
+10
+4%
110
110
×1.04
a choice of 3
3
10
Bone Colossus
+10
+10
+4%
120
120
×1.08
a choice of 3
4
15
Iron Knight
+10
+10
+4%
130
130
×1.12
a choice of 3
5
20
Drowned Lich
+10
+10
+4%
140
140
×1.16
a choice of 3
6
25
Iron Knight
+10
+10
+4%
150
150
×1.2
a choice of 3
7
30
Veiled Matron
+10
+10
+4%
160
160
×1.24
a choice of 3
8
35
Iron Knight
+10
+10
+4%
170
170
×1.28
a choice of 3
9
40
Ember Tyrant
+10
+10
+4%
180
180
×1.32
a choice of 3
10
45
Iron Knight
+10
+10
+4%
190
190
×1.36
a choice of 3
11
50
Forge Golem
+5
+4
+2%
195
194
×1.38
a choice of 3
12
55
Iron Knight
+5
+4
+2%
200
198
×1.4
a choice of 3
40
195
Iron Knight
+5
+4
+2%
340
310
×1.96
stats only
Choosing a passive
Before 27 October 2026 each of levels 2 to 9 unlocked one passive in a fixed order. Now every level owes a choice: when a boss or champion falls, 3 passives of the pools that are open (the core of 18, and 5 more for each maiden rescued) are put on the screen as cards and the player picks one with the number keys; the next wave waits for the pick. The stat steps above are unchanged. A passive does one of two things: it changes a number every system reads (an effect), or it grants something once (more maximum health, mana or stamina). The ten new ones each read one number where the thing they change happens: the dash, the bash, the kill, the wall-splat, the execution, the spell.
every level from 2 until the open pools are empty (level 19 with the core alone; every rescued maiden adds her 5, and so more levels); never a passive already owned; fewer when fewer are left. The core (core) is always open; a maiden's pool opens when she is rescued, which is kept for the play session. A maiden widens what is offered; she adds no picks
How it is picked
123 for the first, second and third card
while an offer is open the number keys pick instead of selecting a spell (nine keys are bound, for the swap's page of passives to lay down); the pointer is captured, so there is no click
The guard
0.6 s
a key pressed before the cards have been up this long counts for nothing, so a key from the fight does not choose
The next wave
waits
the break does not count down while an offer is open, and a saved game that owes a pick holds its wave until it is made
What is offered
worked out, not remembered
offerFor draws the three from the run's seed, the level of the pick and what is owned, so a saved game shows the same three again
Saved
player.level.perks and seed
no save-version bump; a save from before choices has no list and is read in the old order (legacyOrder)
Switch
choice.enabled true, swap.enabled true
false: the first eight are given one a level in the old order, with no choice; the swap is removed
The maidens give the branches
A freed maiden is a teacher. Each of the five has a pool of her own (fire, ice, stealth and the Shades, light and healing and loot, ward and growth); the pool opens when she is rescued (the fall that frees her already offers hers) and stays open for the play session with her. She also swaps: standing near her between waves, the player lays down one of their passives and takes one of hers in its place.
Swapping with a maiden (progression.json swap; systems/Progression.js; player.json bindings.swap, swapPage)
Rule
Value
Notes
Who
a rescued maiden standing in her place
not one still dancing where the boss fell; her pool is the one she gives
When
in a break between waves
the break does not count down while the panel is open; in a wave she says it will be in a quiet moment
Where
within 4 m of her
the first time the player comes that near in a break a line says so; the panel closes by itself 2 m further on
Key
T (again to leave)
the page keys ←→ (previous, next)
Step one: which to give
a page of 9 of the player's passives
the number keys pick; a passive that grants (maximum health, mana or stamina) cannot be given back, because what it raised is kept for good
Step two: what she gives
3 of her own, none owned
worked out from the run's seed and the passive laid down (closing the panel and opening it again is no re-roll); it takes the old one's place in the list
How often
1 a break
the next wave gives the swap back
When she cannot
a line says why
"the Crimson Elf will teach you in a quiet moment, between the waves", "the Crimson Elf has taught you all she can this break", "You have no passive to give the Crimson Elf", "the Crimson Elf has nothing more to teach you"
The pool (progression.json perks): 43 passives in 6 branches (18 in the core, always open, and 5 for each maiden once she is rescued); a key ending in Mult is multiplied in, one ending in Add is added, a grant is given once
#
Passive
Branch
What it does
Effect
Origin
1
Second Wind
The Halls
Stamina recovers 20% faster.
staminaRegenMult 1.2
one of the first eight
2
Light Feet
The Halls
Sprinting drains 15% less stamina.
sprintDrainMult 0.85
one of the first eight
3
Steady Breath
The Halls
Stamina starts to recover a quarter of a second sooner.
regenDelayAdd -0.25
one of the first eight
4
Arcane Well
The Halls
Mana recovers 25% faster.
manaRegenMult 1.25
one of the first eight
5
Bulwark
The Halls
Blows taken on the raised shield do 10% less.
blockFactorMult 0.9
one of the first eight
6
Fleet Stride
The Halls
Sprinting is a little faster (+0.08 of walking speed).
sprintSpeedAdd 0.08
one of the first eight
7
Veteran's Poise
The Halls
The perfect-parry window is 0.03 s longer.
parryWindowAdd 0.03
one of the first eight
8
Wellspring
The Halls
Wounds close by themselves, 1 point a second, after 8 s unhurt.
woundRegenAdd 1
one of the first eight
9
Stout Heart
The Halls
+30 maximum health, healed at once.
grant health +30
core, new (27 Oct)
10
Deep Reserves
The Halls
+40 maximum mana, filled at once.
grant mana +40
core, new (27 Oct)
11
Second Lung
The Halls
+30 maximum stamina, filled at once.
grant stamina +30
core, new (27 Oct)
12
Edge of the Damned
The Halls
Every blow, bash and spell is 8% stronger.
attackMult 1.08
core, new (27 Oct)
13
Quick Hands
The Halls
The shield bash is ready 25% sooner.
bashCooldownMult 0.75
core, new (27 Oct)
14
Nimble
The Halls
A dash costs 25% less stamina.
dashCostMult 0.75
core, new (27 Oct)
15
Bloodletting
The Halls
Every kill heals 2 health.
killHealAdd 2
core, new (27 Oct)
16
Brutal Impact
The Halls
Enemies thrown into walls take half again as much.
splatMult 1.5
core, new (27 Oct)
17
Executioner's Appetite
The Halls
Executions give back twice the health and mana.
executionRewardMult 2
core, new (27 Oct)
18
Spellbinder
The Halls
Spells hit 20% harder.
spellPowerMult 1.2
core, new (27 Oct)
19
Kindling
Crimson
Fireballs hit 30% harder.
fireballPowerMult 1.3
the Crimson Elf's pool
20
Ember Heart
Crimson
Fireballs cost 30% less mana.
fireballCostMult 0.7
the Crimson Elf's pool
21
Crimson Fuse
Crimson
Rune Bombs do 40% more damage.
bombMult 1.4
the Crimson Elf's pool
22
Crimson Fury
Crimson
Sword blows and shield bashes are 15% stronger.
meleeMult 1.15
the Crimson Elf's pool
23
Hoarfrost
Silver Frost
Ice shards hit 30% harder.
icePowerMult 1.3
the Silver Frost Elf's pool
24
Deep Winter
Silver Frost
Chill lasts 2 seconds longer.
chillAdd 2
the Silver Frost Elf's pool
25
Glacial Mind
Silver Frost
Ice shards cost 40% less mana.
iceCostMult 0.6
the Silver Frost Elf's pool
26
Rime Ward
Silver Frost
Blows taken on the raised shield do 15% less.
blockFactorMult 0.85
the Silver Frost Elf's pool
27
Veilsight
Shadow
Shades show themselves from 4 m further away.
revealRangeAdd 4
the Shadow Elf's pool
28
Shade-Bane
Shadow
Shades take 60% more from everything you do.
shadeMult 1.6
the Shadow Elf's pool
29
Phantom Dash
Shadow
A dash protects you for 0.08 s longer.
dashInvulnAdd 0.08
the Shadow Elf's pool
30
Fleet Shadow
Shadow
A dash is ready 40% sooner.
dashCooldownMult 0.6
the Shadow Elf's pool
31
Gilded Draught
Golden
Healing draughts restore 40% more.
potionMult 1.4
the Golden Elf's pool
32
Bountiful Halls
Golden
One more draught and one more crystal lie in the maze each wave.
floorLootAdd 1
the Golden Elf's pool
33
Sunwell
Golden
Mana crystals restore 50% more.
crystalMult 1.5
the Golden Elf's pool
34
Dawnlight
Golden
A shrine's blessing lasts 60% longer.
blessingMult 1.6
the Golden Elf's pool
35
Thornbark
Emerald
Blows taken on the raised shield do 12% less.
blockFactorMult 0.88
the Emerald Elf's pool
36
Mirror Glint
Emerald
The perfect-parry window is 0.05 s longer.
parryWindowAdd 0.05
the Emerald Elf's pool
37
Living Wound
Emerald
Wounds close by themselves, 2 points a second, after 8 s unhurt.
woundRegenAdd 2
the Emerald Elf's pool
38
Greenwood Stride
Emerald
Stamina recovers 30% faster.
staminaRegenMult 1.3
the Emerald Elf's pool
39
Hearth-Song
Crimson
A fireball bursts into three embers where it lands; each burns on for 40% of the blow.
fireballEmbersAdd 3
the Crimson Elf's pool
40
Lamp-Song
Golden
A Healing Draught drunk under a third of your health restores double, and blows do half as much for 3 seconds.
dyingPotionMult 2dyingGuardAdd 3
the Golden Elf's pool
41
Frost-Song
Silver Frost
An Ice Shard freezes what it hits outright for 1.5 seconds (a foe once every 6 s); a boss takes a stack and a half.
iceFreezeAdd 1.5iceStackAdd 0.5
the Silver Frost Elf's pool
42
Veil-Song
Shadow
After a dash the dark takes you for 1.5 seconds: the dead lose you and bolts in the air miss. Ready every 8 seconds.
veilAfterDashAdd 1.5
the Shadow Elf's pool
43
Mirror-Song
Emerald
Whatever shield you raise throws bolts back; a mirror shield does it half again as hard.
reflectAny 1reflectMult 1.5
the Emerald Elf's pool
The wave of milestone n is the nth boss or champion wave: with a champion every 5th wave and a boss every 10th (Bone Colossus then Drowned Lich then Veiled Matron then Ember Tyrant then Forge Golem), level L is reached at wave 5 × (L − 1), up to level 40 at wave 195.
The level crest and the banner
The crest (a gothic gem in a gold rim, src/ui/HUD.js setLevel) sits beside the health and stamina bars. Its ring fills as the next boss comes nearer: the share of the stretch between the last boss wave and the next that the current wave has reached, full while the boss lives (milestoneProgress). Under the bars a line names the next boss and how many waves away it is; hovering the crest says the same. When a level is won a gold flash crosses the screen, the crest pops and a banner states the level, the boss that fell, what it adds and Choose your passive, the three cards come up (key, name, what it does) and stay until one is picked, while the health and stamina bars lengthen to their new maximum (a width transition, a gold glow and a sheen along the bar).
1
Health100 / 100
Guard100 / 100
Stamina100 / 100
Level Up
in the game, a moment after a level was won (the gold flash still on the screen; the particles are boss-death sparks at the camera)
The bars grow with the maximum (progression.json hud: 220 px at the start, +1 px a point, never over 460 px)
Level
Max health
Health bar
Max stamina
Stamina bar
1
100
220 px
100
220 px
2
110
230 px
110
230 px
5
140
260 px
140
260 px
10
190
310 px
190
310 px
20
240
360 px
230
350 px
30
290
410 px
270
390 px
40
340
460 px
310
430 px
Update 26 Oct 2026Maze Generation & POIs
The maze is no longer only a spanning tree of identical corridors. After the walls are carved the planner breaks the sameness with wide halls, narrow gates, an open landmark and a few places worth a detour, and dresses every crossroads so the player can map their route. The plan is pure data (src/util/layout.js), seeded like the maze, so ?seed= replays it.
21 × 21cells, 6 m each (walls 4.5 m tall)
3 + 1halls, and the ruins
up to 12choke points (2.9 m gaps)
6points of interest: five shrines and the vault
59crossroads in the sample maze
4quarters, each with its colour and sigil
How a maze is made
generateMaze: depth-first carve + 10% extra openings
planLayout: ruins, halls (inner walls down)
dead ends: the vault is walled up, shrines placed
chokes and crossroads picked
WallWorld: stubs, pillars, seal boxes
MazeLevel + LevelDecor: the pictures
Landmarks: shrines and the seal at run time
A real maze: seed 3 through the game's own generateMaze and planLayout. The player starts in the middle (white ring).
Overgrown ruins (3×3 cells)
Wide halls (2×3, 3×2, 2×2)
Choke points (8): the gold stubs
Moon Fountain (1)
Shrine of blessing (1)
Shrine of Trial (1)
Gambler's Well (1)
Blood Basin (1)
Sealed vault (1) and its seal (red wall)
Crossroads, by quarter (59)
Bone marks, and the shrines used on a key
Three shrines do nothing when the player walks in: they say what they ask, once per visit, and wait for X. They trade in bone marks, the currency of the Vigil (vigil.json marks, owned by systems/Marks.js, shown beside the score, saved in every checkpoint, kept through a fall like the score).
Where marks come from and where they go
Where
Marks
Notes
Every enemy that dies
+1
whoever killed it
A champion or a boss
+12 (champion), +25 (boss)
on top of the kill
Shrine of Trial
+35
when the whole pack has fallen
Blood Basin
+45 for 30 health
3 times; never the last point of health
Gambler's Well
−20, −30, −40
a 60% chance of a gift each time
The maidens' song
With no maiden rescued the Halls have only the drone. Every maiden rescued adds one layer of a song over it (the set outlives the run). While a wave is fought the song is ×1.35 quicker and ×1.4 louder, more for a boss; in a break it is calm.
Layers (vigil.json song.layers)
Maiden
Voice
What it plays
the Crimson Elf
drum
a pattern of 16 steps (7 notes)
the Golden Elf
lute
a pattern of 32 steps (15 notes)
the Shadow Elf
choir
a chord of three held 16 steps, 4 chords round
the Silver Frost Elf
bell
a pattern of 32 steps (5 notes)
the Emerald Elf
pipe
a pattern of 32 steps (8 notes)
Gates at the chokes
4 of the 12 chokes have a portcullis and a lever on each side. The use key at a lever drops the gate (1 s): it stops bodies, not sight or shots, holds for 12 s and rises by itself (the lever sticks for 20 s). Enemies cut off by it batter it: a 0.9 s telegraph, then twice their damage off its 300 health; a broken gate is mended after 45 s. Flyers pass over.
Moon phases
Each run is under one phase of the moon, rolled when a new game begins (the title screen shows tonight's; Continue keeps the saved run's): Full Moon (30%): Moon Wave ×1.35, Shades seen at 30%, the Moon Fountain also blesses for 30 s, light at 125%; Half Moon (40%); New Moon (30%), 1 more potion and crystal a wave, floor gear ×1.5, light at 55%.
Light matters
A Wisp that flies past a lit wall torch (within 3.2 m) snuffs it, one torch each 8 s; a fireball of the player's that flies past an unlit one (within 3.4 m) lights it again, one torch for each; a torch left dark for 120 s catches by itself. A Shade within 5 m of a lit torch is seen.
Attack tokens and infighting
At most 2 ordinary enemies attack at once: a melee blow or a charge needs a token (held for its wind-up and 0.7 s after a blow with none); an enemy refused one circles the player and asks again. Bosses and champions need none. A fireball that meets another ordinary enemy hurts it for 50% of its damage and turns it on the shooter for 6 s (it strikes back at 50% damage and the shooter turns on it); it ends at 14 m or out of sight.
Bosses that adapt
A boss or champion that falls leaves a lesson for the next of its kind in the same run: what stunned it most, or (for the Iron Knight, which has no stun) what did it the most damage. The next one remembers it and says so: fire (fireball): 40% less damage, and a hit counts for 0.5 of a stun; frost (ice): 30% less damage, and a hit counts for 0.5 of a stun; lightning (lightning): 40% less damage, and a hit counts for 0.5 of a stun; the blade (melee): 20% less damage; the bombs (bomb): 40% less damage. A fall in the boss's wave forgets that fight.
The stolen staff
Carry the Spire of the Drowned Lich into the Drowned Lich's wave and it knows it: it moves 1.15× faster, and the Spire's chill gets through its water shield as 0.5 of a frost stack a blow (3 freeze it, as Ice Shards do).
Corpses
The body of a fallen ordinary enemy lies where it fell for 25 s (it used to vanish after 4 s), fading over 1.5 s; no more than 12 lie at once. A fireball that flies over one burns it away (0.9 s); the Drowned Lich (its drown summon) raises the nearest bodies within 30 m as its thralls, where they lie, and calls the rest in a ring as before.
The Nemesis
An ordinary enemy that kills the player survives the fall as the nemesis, with a generated name, a violet mark and an affix. It returns 1 wave later (on the first ordinary wave), stronger for every time it has killed the player; killing it pays 25 bone marks and a sword or shield one tier up from what the player carries (never above rank 3, Epic). One at a time; saved with the run. A boss, a champion or a thrall never becomes one.
Strength by kills (vigil.json nemesis.strength, on top of the wave's toughness and its affix)
Times it has killed the player
Health
Speed
Damage
1
×1.8
×1.1
×1.25
2
×2.3
×1.15
×1.4
3
×2.8
×1.2
×1.55
4
×3.3
×1.25
×1.7
Elemental reactions
Reactions (spells.json reactions)
Reaction
Spell
On an enemy that is
What happens
Shatter
lightning
chilled (an Ice Shard slowed it)
×1.8 damage, the chill ends, staggered 1 s
Chain
lightning
soaked (the Lich's tide washed over it, 8 s)
jumps to the nearest 3 enemies within 6 m for 60% of the blow
Slide
ice
charging (a Hound in its rush)
the charge breaks, it slides 4 m on, staggered 1.2 s
Elite affixes
From wave 3, an ordinary enemy of an ordinary wave may spawn as an elite with one affix: 5% at wave 3, 1% more each wave, never above 30%. A ring of the affix's colour shows it.
Affixes (vigil.json affixes.list)
Affix
Weight
Health
Speed
Its blows
Takes
Marks
Drops
Warded
3
×1.5
×1
×1
×0.7
+3
Lesser Mana Crystal
Frenzied
3
×1.2
×1.3
×1
×1
+3
Minor Health Draught
Brutal
2
×1.3
×1
×1.6
×1
+4
Minor Health Draught, Lesser Mana Crystal
Gilded
1
×1.4
×1.1
×1
×1
+12
Cache of Rune Bombs, Minor Health Draught
Quarter events
On every ordinary wave one quarter of the maze (north, east, south, west) awakens, never the one that woke last: its crossroads runes and sigils burn ×2.2 brighter, 50% of the wave's enemies are placed in it (cells too far to arrive in the wave's window are not used), and 2 extra items (Minor Health Draught 3, Lesser Mana Crystal 3, Cache of Rune Bombs 2, by weight) lie in its dead ends. A boss or champion wave has none.
Wave mutators
From wave 3, an ordinary wave (a boss or champion fights alone and never has one) may roll a mutator: 15% at wave 3, 1.5% more each wave (26% at wave 10), never above 45%. It is drawn by weight, never the one the wave before had, announced by a banner with its name and what it does as the wave starts, kept as a small tag on screen while the wave lasts, and over when the wave is cleared or the player falls. The roll is worked out from one number the run draws when it begins (saved with it) and the wave's number, so the same wave has the same mutator after a fall or a Continue, and a save from before them has none. The effects are plain numbers read by the game's generic rules; no system knows a mutator by name.
Mutators (vigil.json mutators.list)
Mutator
Weight
Share of rolls
What the banner says
In numbers
The Quickened Dead
3
20%
The dead move faster: zombies and skeletons most of all
speed ×1.1; Zombie speed ×1.6 on top; Skeleton speed ×1.3 on top
The Draughts Run Dry
2
13%
No health draughts lie in the maze this wave
no health items laid (floor, elites, quarter dead ends)
The Creeping Fog
3
20%
A fog closes in: you see no further than fifteen metres
fog: 95% of the view hidden at 15 m (density 0.115 against the maze's 0.008), closing in over 2.5 s
The Hardened Dead
2
13%
The dead are hardier: 40% more health
health ×1.4
A Great Horde
2
13%
A great horde comes: half as many again
23 enemies instead of 15 at wave 7 (×1.5)
The Few and the Fell
2
13%
Fewer come, and they are far harder to kill
health ×1.6; 9 enemies instead of 15 at wave 7 (×0.6)
Moonlit Plenty
1
7%
The moon is kind: more draughts and crystals lie in the maze
2 more Minor Health Draught on the floor; 3 more Lesser Mana Crystal on the floor
Cursed relics
Strong items with a real drawback, and always the player's choice: an item with damned: true in items.json is never taken by walking over it. Look at it (within 2.8 m, so its plate is up) and press X. Its plate says what it gives and what it costs, in the Damned colour #E0409A with the tag DAMNED, and that it is bound for the run: it cannot be put down (a drop key would make the curse a switch to flip whenever it bites), up to 2 at a time, and nothing is replaced or destroyed when the slots are full. A fall keeps them like the rest of the gear; a new game starts without any. They are laid, never given: a wave from wave 6 lays one on the floor (10%, 1% more each wave, never above 25%), a vault's loot may hold one (50%), a boss may leave one beside its reward (30%); only one the player does not carry, and only while a slot is free. Switched off with relics.enabled (no relic is laid, the use key does nothing, a saved one is ignored).
Relics (items.json, damned: true; the words come from the numbers through vigil.json relics.words)
Relic
Gives
Costs
When the curse bites
Prop (halo size)
Widow's Brand
Sword blows and shield bashes hit 50% harder
Healing draughts restore nothing
The draught heals nothing: Widow's Brand has drunk it first
drawn from shapes; Legendary-sized ring
Cinder Codex
Spells hit 60% harder
Mana crystals restore nothing
The crystal is only ash: Cinder Codex burns it before it can feed you
drawn from shapes; Legendary-sized ring
Gorged Reliquary
+40 maximum health
Stamina recovers 50% slower
always on while it is carried: the HUD marks the relic
drawn from shapes; Epic-sized ring
Spurs of the Pale Rider
Sprinting is faster: +30% of walking speed A dash is ready 50% sooner
Every blow you take hurts 40% more
always on while it is carried: the HUD marks the relic
drawn from shapes; Epic-sized ring
Tallyman's Ledger
Every kill pays 100% more bone marks 1 more draught and 1 more crystal lie in the maze each wave
The dead move 20% faster
always on while it is carried: the HUD marks the relic
drawn from shapes; Rare-sized ring
Crown of the Hungry Dead
Every kill heals 6 health Wounds close by themselves, 1.5 a second
-30 maximum health
always on while it is carried: the HUD marks the relic
drawn from shapes; Epic-sized ring
Ember Crown
Spells hit 40% harder
Healing draughts restore 50% less
always on while it is carried: the HUD marks the relic
drawn from shapes; Mythic / Relic-sized ring
The effects are the passives' own numbers (EFFECT_KEYS: a key ending in Mult is multiplied in, any other is added) folded into the same table, so a relic and a passive that act on the same thing multiply (the Widow's Brand's ×1.5 and Crimson Fury's ×1.15 are ×1.725) and nothing is capped. A maximum-health change is made once, when the relic is taken. The relics are in the codex like any item (the card has the same lines, no prompt); the Nemesis's gift and every boss list never name one.
The active slot
One item rides on a key of its own, V, with a cooldown, apart from the Rune Bombs on G. It is an item of kind active in items.json with an action block; the game knows 4 kinds of action (stagger, reveal, phase, subjugate), each implemented once and read from the numbers, so no system knows an item by name. One slot, one cooldown: carrying a second item means swapping, and a swap does not give a fresh cooldown. Walking over one takes it when the slot is empty; with the slot full it stays lying and the use key (X, looking at it within 2.8 m) swaps it for the one carried, which is laid where the new one lay: nothing is destroyed (until a fall: the item laid down is loose in the maze like any floor loot and goes with the wave). A fall keeps the item like the rest of the gear, and the cooldown is clear when you stand up again (it is not saved). The key does nothing while a choice of passive is open, on your knees, in a finisher or with nothing in the slot; a refusal says how long is left. They are laid, never given: a wave from wave 4 may lay one on the floor (8%, 1% more each wave, never above 16%) and a vault's loot may hold one (50%); never the one carried, and a boss's drop lists are untouched. Switched off with actives.enabled.
Active items (items.json kind active; the lines are made from the numbers through vigil.json actives.words)
Item
Action
What it does
Cooldown
Horn of the Shaken Dead Rare
stagger
Staggers every ordinary enemy within 9 m for 3 s A champion reels for 1.2 s A boss is not moved
28 s
Lantern of Revealing Rare
reveal
Every Shade within 40 m is seen for 8 s, as by a lit torch
30 s
Veilstep Sigil Epic
phase
Steps 5 m the way you look, through a thin wall if one is in the way Nothing hurts you for 0.35 s Never ends inside a wall, a gate or a sealed vault: with no room to land it fails
14 s
Collar of Subjugation Epic
subjugate
Binds the ordinary enemy under the crosshair, within 3 m, to fight beside you until it dies It keeps within 4.5 m of you, and goes for the nearest enemy within 14 m A boss, a champion, an elite, a thrall or a nemesis cannot be bound; a refused use costs nothing When it falls the collar lies where it fell: take it up to use it again
45 s
The step (phase) walks the line the player looks along in 0.25 m steps and lands on the farthest place of it that is at least 1.5 m away and where the body fits: inside the maze, touching no wall, pillar, choke stub or portcullis, clear of other bodies and not in a vault that is still sealed. It may pass through at most 1.2 m of wall on the way, so a maze wall can be crossed but not a thick mass. A wall straight ahead sends the player to the first free floor behind it; at the edge of the maze or with no room to land, the step fails (the cooldown is not spent). The horn staggers a champion for less and a boss not at all (a staggered enemy wears the execution mark). The lantern uses the Shade's own reveal, the one a lit torch and the Veil-Piercing Lens use.
Boss fights in the ruins
On a boss or champion wave the fighter stands in the middle of the ruins from the start of the wave instead of walking in from a far cell, holding, while the spire and beam turn red. It holds until the player comes within 14 m, hits it, or 40 s have passed; then it fights as usual. The alarm lasts until it falls. (The collapsing floor and the flooding arena are not built.)
The Bell of Challenge
A bell stands in the middle of the maze from the start of the wave before a boss or champion wave until that wave starts. X within 2.2 m rings it, up to 3 times; each ring adds its row to the next fighter and gives 1 more drop. It costs nothing: it is a choice to risk the fight.
Rings (vigil.json challenge.rings)
Ring
Health
Speed
Comes with it
1
×1.3
×1
2 Skeleton
2
×1.3
×1.15
nothing
3
×1.4
×1
2 Shade
Room templates and spawning rules
Room templates and the rules the planner follows (src/util/layout.js planLayout; vigil.json layout)
Template
Shape
How many
Where
What it is for
Courtyard
3×3 cells round the start with every inner wall down; the Tree of Life stands at the exact middle (two trunks with a walkable gap between them), the five maidens on a ring under it, the five tombstones on a wider ring, the bell and the start in the room that is left
1
opened first, so nothing else is placed in it or in the cells touching it; its outer walls keep every opening the maze gave them
the middle of the maze: the hub that grows with every maiden, and the stones of the fallen
Wide hall
2×2, 2×3, 3×2 cells (either way round); the inner walls come down, a 0.9 m pillar stands at every inner corner, a brazier in two corner cells
3
at least 4 cells from the start (measured to the hall's middle), one cell from the border, never touching another feature
a room to fight in with cover: the enemies reach you from several sides
Overgrown ruins
3×3 cells open; a sunken ring, rubble, four broken columns of different heights, moss, a 9 m spire with a green beam taller than the walls
1
at least 7 cells from the start
the landmark: seen over the walls, marked on the minimap from the start
Choke point
a stub of wall (0.9 m thick) each side of a straight corridor: a gap of 2.9 m in the 6 m opening
up to 12
straight corridor cells at least 3 cells from the start, 3+ cells apart, never in a hall
a gate: the walls, the sight lines and bodies see it, the flow field does not need to
Moon Fountain
a dead-end cell with a basin, a spout orb and a floor ring
1
a dead end 5+ cells from the start, 5+ from another point of interest, from the farther half by walking distance
a full heal, once, when needed
Shrine of blessing
a dead-end cell with an altar and a floating moon crystal
1
same rules as the fountain
a 90 s boost
Shrine of Trial
a dead-end cell with an iron brazier on a plinth and a red flame
1
same rules as the fountain; used on a key
a pack of 3+ after 1.4 s; 35 bone marks and Minor Health Draught and Lesser Mana Crystal if it is won
Gambler's Well
a dead-end cell with a stone well of green water and a turning gold coin
1
same rules as the fountain; used on a key
20 bone marks (+10 each time, 3 times) for a 60% chance of a gift
Blood Basin
a dead-end cell with a shallow basin of dark blood, glowing like a slow heart
1
same rules as the fountain; used on a key
30 health for 45 bone marks, 3 times; never the last point
Sealed treasure vault
a dead-end cell whose way in is walled up, with a glowing runed seal and two chests
1
a dead end 8+ cells from the start, far by walking
loot and wardens, behind a Rune Bomb
Crossroads
a cell with three or four ways out: a floor rune ring, a sigil on a wall, and a torch
every one (59 in this maze; 14 torches at most)
3+ openings, outside halls and points of interest
a landmark per quarter of the maze, so the player can tell where they are
Rules that hold for every seed (the smoke test checks them over 40 mazes): nothing overlaps; nothing is close to the start; everything that is not a sealed vault can still be walked to from the start; a vault is closed (no flow field reaches it, nothing spawns in it) until its seal breaks and is reachable once it has; a choke never jams a boss.
Landmarks
no picture shot-maze-hall
Wide Hall3 in the sample maze
Room templateHall
Inner walls down in a block of 2×2 / 2×3 / 3×2 cells; 0.9 m pillars at the inner corners (they are collision boxes: bodies and sight lines meet them like walls)
A bronze brazier in two corner cells: a warm focal point with the flicker of a torch
Open ground: enemies come from every side, the pillars are the cover
no picture shot-maze-choke
Choke Point8 in the sample maze
Room templateCorridor
A gap of 2.9 m in a 6 m opening: never narrower than twice the radius of the biggest enemy (the Bone Colossus, 1.25 m) plus 0.3, or a boss would jam in it
A faint gold strip on the floor marks the gate from a distance
Sight lines through the gap are clear; through a stub they are not
no picture shot-maze-ruins
Overgrown Ruinsthe landmark
LandmarkBeacon
A 3×3 block of cells with no inner walls: the one open, distinct zone in the maze
A sunken ring with a rim of rubble, four broken columns (1.2 to 3.6 m), patches of moss, a green-lit spire 9 m tall and a thin beam above it: taller than the walls, so it is seen from any corridor that looks up
Marked on the minimap from the start (a green ring)
no picture shot-maze-fountain
Moon Fountaina secluded, lit alcove
ShrineFountainOne use
A moonlit fountain murmurs here: its water heals every wound, once
Heals health, mana and stamina in full, once; the water goes dark afterwards
With nothing to heal it waits (and says so): the player may come back
no picture shot-maze-blessing
Shrine of Blessinga secluded, lit alcove
ShrineBlessingOne use
A shrine of the moon: its blessing strengthens whoever kneels
Touching it starts the Moonlit Blessing for 90 s (shown under the bars with a running line); it refills the stamina pool too
The crystal dims and stops turning once it is used
no picture shot-maze-trial
Shrine of Triala pack, for a reward
ShrineTrial1 use
A shrine of iron and flame: it calls a pack for whoever dares, and pays the one who wins
Press X at it: it flares, and 1.4 s later a pack stands round it (3 and one more every 4 waves, of the kinds whose wave has come, as tough as the wave's own), counted into the wave
Win and it pays 35 bone marks and lays Minor Health Draught and Lesser Mana Crystal; a fall ends the trial without the reward
no picture shot-maze-well
Gambler's Wella chance at a gift
ShrineChance3 uses
A well of green water, a coin turning above it: bone marks go in, and sometimes a gift comes out
Press X: it takes 20 bone marks, 30 the second time and 40 the third
A 60% chance of a gift at the well (Minor Health Draught 4, Lesser Mana Crystal 3, Cache of Rune Bombs 2, by weight); otherwise it keeps the marks
no picture shot-maze-basin
Blood Basinblood for bone marks
ShrineBlood3 uses
A basin of dark blood: it takes what you can spare and pays in bone marks
Press X: 30 health for 45 bone marks
Never the last point: with 30 health or less it says so and takes nothing
no picture shot-maze-vault
Sealed Treasure Vaultlocked: a bomb, a key or a held ring opens it
VaultBomb, key or ringGuarded
A sealed vault: the wall is cracked and runed. A Rune Bomb would break it
Bomb lock: a bomb that goes off within its own radius (4 m) plus 1.3 m of the seal, in the corridor with a clear line to the wall, breaks it; a blast round a corner does nothing
Key lock: from wave 2, one of an ordinary wave's enemies is an elite that carries the key (a gold ring and a key over its head; never a Wisp or Shade); its death drops it; X within 2.4 m of the seal opens the vault and spends the key. A bomb does not break it
Ring lock:X in the ring (1.9 m) begins it; hold it for 24 s (it runs down 1.5 s a second while you are out of it) while 3 groups of Skeletons come (1 each, one more for every 4 waves), the first at once, then evenly, each 1.2 s after a flash of the ring. A bomb does not break it
Inside: Bound Vitality Vessel, Lunar Moth Sigil, 2 × Cache of Rune Bombs, 2 × Lesser Mana Crystal, one sword or shield that is a step up, sometimes (50%) one cursed relic, which has to be chosen, sometimes (50%) one item for the active slot
The wardens wake (after a bomb or a key; the ring's came while it was held): 2 Skeletons, one more for every 5 waves, as tough as the wave's ordinary enemies; they count into the wave
no picture shot-maze-crossroads
Crossroads Wayfindingrunes, sigils, torches
WayfindingEvery crossroads
A ring of runes on the floor, a glowing sigil on a wall at torch height and, at up to 14 of them, a torch, all in the colour (and the glyph) of the quarter of the maze they are in
The runes breathe slowly, so a crossroads is seen before it is reached
The torches at crossroads are real torches: they replace some of the random ones, so the light count does not change
Wayfinding: the four quarters
Every crossroads gets the same three things, in the colour of the quarter of the maze it lies in (north, east, south or west of the middle, the diagonals splitting them). After a short while the colour alone says where you are.
The four quarters of the maze, seen from the middle (the diagonals split them): each has its own colour and glyph (vigil.json layout.crossroads.colors; src/scenes/LevelDecor.js)
Quarter
Colour
Sigil
North
#ffb347
sun
East
#3fd0c9
waves
South
#a56bff
star
West
#ff4f5e
crescent
What the shrines and the vault do
Found. A landmark is found when it is within 7 m and in sight (a clear line at eye height). The message line says what it is and the minimap marks it from then on: the fountain a blue drop, the blessing a gold diamond, the vault a square (the colour of its lock while sealed: red, gold or violet; green once open); the ruins are marked from the start.
Moon Fountain. Walk up to it (1.9 m). If any of health, mana or stamina is below full it heals all three in full, once; otherwise it waits.
Shrine of blessing. Touching it starts the blessing, once, for 90 s: it is a timed layer of the same effect table as the passives.
Vault. A sealed vault opens one of three ways, its lock, drawn for each vault from the hash of its cell (weights 1 : 1 : 1): a Rune Bomb breaks the seal; or a key that an elite of the wave carries opens it; or holding a ring on the floor for 24 s while 3 groups of wardens come. The loot lies in a ring in the vault; the wardens wake in it (not after the ring: they came). A bomb is needed only for the bomb lock.
The blessing (vigil.json pois.shrine.blessing.effects)
Effect
Value
In play
attackMult
×1.2
sword, shield bash, Moon Wave and spells hit harder
staminaRegenMult
×1.5
stamina recovers quicker
sprintDrainMult
×0.7
a sprint costs less
manaRegenMult
×1.5
mana recovers quicker
the seal of the vault, from three metres
Update 26 Oct 2026Model Polish Logs
A log of the three model fixes of the update: what was wrong, the numbers before and after (the "now" column is read from src/data/enemies.json) and pictures from the model lab (lab.html) with the real rigs and clips.
Demon: the armour was blown out
The rebuilt Demon's single material arrived with the file's defaults: the colour map doubled as an emissive map at full strength, so her gold armour was lit by the scene and by its own texture, and came out a flat pale yellow with no relief and a hot, chalky highlight. The surface is now set when the model is built (src/util/materials.js setSurface, new brightness knob; src/prefabs/enemy.js applies an enemy's material). The values were chosen by trying candidates live in the lab: A (emissive 0.25) and C (0.2, more metal) beside the original; the game uses A with a little more self-light (0.3) because the maze is darker than the lab.
The Demon's surface (enemies.json demon.material, applied by util/materials.js setSurface when the model is built)
Knob
Before
After
What it does
emissive
1
0.3
the share of the colour map still added as light of its own. The Meshy file ships with its colour map also as an emissive map at full strength, so the armour was lit twice (by the scene and by its own texture)
metalness
0.3 (the file's 1, clamped by buildEnemyModel)
0.25
polished, not a mirror
roughness
1
0.55
a soft highlight instead of a chalky one
specular
1 (the file asks for 2)
0.45
the strength of the sheen
brightness
1
0.95
a factor on the colour map itself: takes the top off a gold the light already blows out
before: gold lit twice, no relieftrial A: emissive 0.25, metalness 0.2, roughness 0.6: the embossing and a warm sheentrial C: emissive 0.2, metalness 0.45, roughness 0.42: more metal, darker
The hurt flash, the telegraph glow and the freeze tint are emissive colours; the base emissive is captured after this look is applied, so they still work (the flash is max(base, flash)).
Shield Skeleton: the mace crosses the fist
In every pose the mace's shaft ran along the forearm beside the hand instead of crossing the fist. Its socket was re-fitted (below); the shield's grip, which was nearly right, was centred. The shield's unguarded and broken poses, the guard overlay on the left arm and every clip are unchanged.
Before: idle: the mace lies along the forearmAfter: idle: the shaft crosses the palm
Before: the slam: the hand under the shaftAfter: the slam: the fist round the shaft, head forward
Before: walking (the walk clip, 0.35 s in)After: the same frame
Before: the attack clip, 1.35 s inAfter: the same moment: mace and shield sit on the hands
Skeleton Archer: the bow in the palm
At rest the bow hung behind an open hand at the side. Its rest grip now puts the riser in the left palm, with the limbs leaning forward; the draw pose (the bow upright at the end of the extended arm, the string towards the archer) is exactly what it was.
Before: idle: the bow floats behind the handAfter: idle: the riser in the palm
Before: walkingAfter: walking
Before: the draw (halfway)After: the draw: identical, by construction
Sockets and how they were found
Bone sockets (enemies.json attachments: position in metres in the bone's own axes, rotation in degrees XYZ; read live for "now")
Prop
Bone
Was: position · rotation
Now: position · rotation
Shield Skeleton: mace
RightHand
[-0.003, -0.147, -0.135] · [-144.9, 75.1, 5.7]
[-0.047, -0.018, -0.171] · [-151.3, 77.5, 34.5]
Shield Skeleton: round shield
LeftHand
[0.102, 0.059, 0.011] · [-72.5, 27.1, -32.1]
[0.079, 0.112, 0.002] · [-68.9, 33.1, -33.9]
Skeleton Archer: bow, at rest
LeftHand
[0.041, -0.016, -0.023] · [48.4, 79, 120.6]
[0.03, 0.09, 0.074] · [40.5, 80.8, 132.3]
Skeleton Archer: bow, draw state (a delta on the rest frame)
same
[0, 0, 0] · [-8.1, -39.1, 98.6]
[-0.111, 0.092, 0.01] · [-13.5, -38.4, 93.6]
How the grips were worked out (the model lab: lab.fit and lab.focus, measured on the real rig)
Thing
Rule
The hand
the skeletons have no finger bones: the prop is rigid on the wrist, so a grip is one transform; the palm centre is 0.07 m on from the wrist along the forearm (elbow to wrist)
The mace
head at the top of the model, pommel at the bottom, 0.60 m long. Gripped 0.12 m above the pommel; the shaft pitched forward and up (axis 0.12, 0.62, 0.78 in the body's frame in the idle pose, about 127° to the hanging forearm) so it crosses the fist. It had run parallel to the forearm (about 0°), beside the hand
The round shield
a disc in the XY plane with the boss on +Z and a vertical handle on the back at z ≈ -0.07: the handle goes in the fist, the face points forward in the raised guard. The old fit was already close; this one centres the handle in the palm
The bow
limbs along Y, string on +X, the riser (the grip) at x ≈ -0.095, the arrow flies towards -X. At rest the riser is in the palm and the limbs lean forward by 12°
The draw pose
a state is a delta on the rest frame, so moving the rest would have moved the draw. The new delta is rest⁻¹ × (old rest × old delta): the drawn bow ends exactly where it was
Update 1 Nov 2026The Final Vigil
The run has an end. The fifth boss, Forge Golem (wave 50), holds the Crimson Elf and drops The Keepers' Songbook, the song of the Vigil written down. The last fight, Hollow King (wave 60, once), is an exam of the five fires; when he falls the Vigil is kept: the five maidens sing the whole song, and the game offers to go on.
60the last fight, once
43passives in the pool
5capstones the book gives
122 sthe ending
51beats in it
The order of the fights
The fighter of every tenth wave (util/schedule.js, vigil.json waves): the five go round, the king comes once
Wave
Fighter
Time
Health
10
Bone Colossus
first
2,400
20
Drowned Lich
first
3,200
30
Veiled Matron
first
3,400
40
Ember Tyrant
first
2,600
50
Forge Golem
first
3,400
60
Hollow King the last fight
first
6,500
70
Bone Colossus
repeat 1
4,800
80
Drowned Lich
repeat 1
4,800
90
Veiled Matron
repeat 1
5,440
100
Ember Tyrant
repeat 1
4,160
110
Forge Golem
repeat 1
5,440
120
Bone Colossus
repeat 2
7,200
130
Drowned Lich
repeat 2
6,400
140
Veiled Matron
repeat 2
7,480
150
Ember Tyrant
repeat 2
5,720
160
Forge Golem
repeat 2
7,480
The king is never repeated: after wave 60 the five go round again, each tougher by its own hpScalePerRepeat. The Iron Knight keeps the other fifth waves and frees no maiden.
The Songbook, the verses and the capstones
The five verses (vigil.json song.verses): sung in the last fight as each pool breaks and, whole, in the ending; 12.8 s each, a line every 2.6 s
Verse
Sung by
Words
● The Hearth
The Crimson Elf
We banked the hearth when the first night fell, and kept it small, that it might last. A fire shut in must still draw breath: give it a spark while its door stands open.
● The Lamp
The Golden Elf
We hung the lamps along the long watch, each one a promise that she would come. Light is answered by light: when the hand is raised, send it a spark, and the hand lets go.
● The Veil
The Shadow Elf
We shut our eyes at the turn of the night and trusted what we could not see. Light one small flame in the dark's deep room, and what hides there must show its face.
● The Frost
The Silver Frost Elf
We drew the water from the deepest well, and the cold kept every ember honest. Three times the frost, and the proud thing stills; a fire laid on the ice will wake it.
● The Mirror
The Emerald Elf
We hung a mirror where the moon would come that she might see how bright she was. What is thrown at you, hold up and send home: it was meant for another, and it will find him.
The five capstones: a fifth passive in each maiden’s branch, offered only once the Songbook is carried (progression.json, requires "songbook")
Passive
Her branch
What it does
Hearth-Song
The Crimson Elf
A fireball bursts into three embers where it lands; each burns on for 40% of the blow.
Lamp-Song
The Golden Elf
A Healing Draught drunk under a third of your health restores double, and blows do half as much for 3 seconds.
Frost-Song
The Silver Frost Elf
An Ice Shard freezes what it hits outright for 1.5 seconds (a foe once every 6 s); a boss takes a stack and a half.
Veil-Song
The Shadow Elf
After a dash the dark takes you for 1.5 seconds: the dead lose you and bolts in the air miss. Ready every 8 seconds.
Mirror-Song
The Emerald Elf
Whatever shield you raise throws bolts back; a mirror shield does it half again as hard.
The last fight
Hollow King has 6,500 health in 5 pools (phases at 80%, 60%, 40%, 20%), and a different fire opens him in each, in the order of the maidens’ ring. At each pool’s edge the maiden of the next fire sings her verse while he kneels 7 s and cannot be hurt; with the book she mends 15% of the player’s health and 25% of their mana. The full tables are in Phase 3.
The ending
The ending, 122 s in all (vigil.json ending, util/ending.js): 51 beats in 8 shots
Shot
When
Camera
What happens
fall
0–4 s
the player’s own eye
the song drops to its drone
crown
4–10 s
the wide pose
his crown flies to the tree
turn
10–22 s
the wide pose, a slow push-in
the song rises, all five layers, calm; a maiden turns and steps in
tree
22–34 s
the rising pose
the tree flares and the stones glow; the sky turns full; his stone rises and both his stanzas are cut; a shaft of moonlight; the Ember Crown may be laid at the tree