BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A first-person, real-time dungeon crawler for mobile browsers, built in the spirit of the
1993 seed-generated dungeon classics. Pick a class, roll your stats, type a seed, and descend.
Open it on your phone and choose "Add to Home Screen" to install it as an app. It works offline after the first load.README 전문 보기 ↗A first-person, real-time dungeon crawler for mobile browsers, built in the spirit of the 1993 seed-generated dungeon classics. Pick a class, roll your stats, type a seed, and descend.
Play it now: https://dungeon-hack-mobile.vercel.app
Open it on your phone and choose "Add to Home Screen" to install it as an app. The title shows when the game is ready offline. Voice recordings download separately in the background and resume after reconnecting.
Clearer enlarged combat layout. At Larger and Double text, vital bars share space when their full labels fit and conditions scroll in one touchable row. Quick actions clear the live intent strip, with mirrored left-handed spacing and the complete message history still one tap away. The view stays steady between a visible foe’s attacks. Critical-hit, damage and miss labels keep clear of attack warnings.
Painted keeper identity in combat. The active keeper's life bar carries its painted face, so it remains identifiable when a guard fills the view. Delayed or unavailable pictures retain the complete text bar.
Quieter ceilings and recognisable forge ruins. Room roofs recede behind the action, while existing decorative rubble in the Old Forges uses painted anvils. Cave-roof shading, fog boundaries, floor cues and gameplay stay intact.
More efficient wall lighting. Shared lighting passes reduce canvas calls while preserving the painted scene, fog and combat timing. See the rendering verification.
A painted equipment stand. A neutral wooden mannequin with aged brass joints sits behind the Pack's equipment slots. Selection highlights and connectors remain live, with an independent SVG fallback while loading or on failure. Enlarged text keeps the readable equipment list. Shared panels use warm iron, parchment and brass across menus, creation, Pack, Hero and Journal.
First lessons before the storyteller. Discovery narration waits while a tutorial tip is visible, so its caption and controls cannot cover the lesson. The AAA finish roadmap tracks interface cohesion, dungeon staging, combat/audio review and real-device validation within the existing retro style.
Painted reading scrolls. Worn vellum rises in your hand while spell-coloured writing kindles and the page burns away in its original shower of embers.
A painted lantern in the dark. Weathered iron surrounds the ordinary lantern's live amber flame, with the same glow and movement beside your gear.
Local spell impacts. Painted fire and frost bursts stay bounded near their targets. Damage numbers draw above spells, and attack warnings stay clear.
Continuous torchlight. Light blends across floor and ceiling tiles as you walk and turn, preserving the existing fog, materials and torch flicker.
Sliding door panels. Door leaves slide into the wall while the surrounding masonry stays in the doorway. Damage, lock colours and burned wood stay visible through opening. Painted and fallback doors share the same fit.
Readable crowd damage. Floating damage and save labels stay apart when enemies at different depths line up in the view.
The mountain’s first fire. The Heart is a molten volcanic core bound in ancient rune-cut iron, with matching collectible, dais and ending-card art.
Outcome-aware shared pictures. Cards name the actual keeper, show the Heart, smiths’ quench or kept Heart dais for the chosen ending, and reuse the painted killer and companion cutouts. The shared line names that ending too.
Fallen hero portraits. Death screens and shared pictures show a painted skull in each class’s existing gear, including the Wayfarer. Victories retain the living portrait; installed games include all seven death portraits offline.
The Wayfarer, a hidden Spellblade. Tap the release label at the bottom of the title five times, then choose Spellblade in New Game. The unlock stays on this device, supports keyboard/controller activation, and never replaces a save. This is an Easter egg, not private account access. The six ordinary classes, Quick Start and shared Daily/Weekly heroes stay unchanged. Intelligence guides the sword. Runic Edge adds fire, frost or lightning to a sword or dagger for thirty seconds; Lantern Step crosses up to two clear, explored floor squares ahead; Spellguard catches one incoming hit for 2.2 seconds and grants +3 on the next landed blade hit within five seconds. Beyond floor eight, the held lantern gains +1 armour at floor 9, another every two floors, capped at +4 (Deepward). Runes replace each other, magic shares attack recovery, and poison and hunger pass through the guard. The class wears light armour, carries its own silver lantern, and gains six exclusive talents plus lantern lessons rather than paths or a Mythic trial. Remember the gatekeeper's oath through Deathless Inscription, Sever the Veil, The Forgotten Road, Threshold Ward, Hold Back the Night and The Debt Repaid. Each talent also adds five maximum hit points and two maximum spell points, restoring those amounts. Sever the Veil guides an active runed blade with +1 to hit. The Silver Lantern hangs from a carry handle gripped in the left fist throughout the dungeon, with its blue flame visible below the hand. Its cage stays in view when the phone is held sideways too. The angled cage has shaded side glass and rear bars. Charcoal gloves carry silver trim and a small blue rune; lantern reflections catch the fingers and blade only while it is equipped. Its weight settles after a step, with no extra motion in Calm view. These reflections do not change dungeon lighting. His own gatekeeper origin and motive appear before descent; the shared background still supplies its chosen starting modifiers. Older Wayfarer saves retain their learned lessons and receive the new choices on future levels. Its painted portrait, pixel fallback, rune clocks and class survive offline saves. Held throwing knives, including Vashti's Needles, show one gripped blade while their pack icons keep the bundle. The Quill Shield has a rear grip and forearm strap. Cuts pass through cached intermediate angles and recover with the grip attached; staffs and spears drive forward, and staffs lean into casting. Bows flex under the draw, with string ends on their nocks and the arrow passing over the bow grip. The left hand raises the bow towards the centre to aim; the right hand reaches from the right, draws back towards the cheek, then follows through and relaxes low on the right. Calm view omits the extra aiming lift. Arrows and thrown knives leave at the existing combat release times, including Vashti. The object fits short views while its sleeve may continue off-screen. Named bows retain their Pack markings; small relic glints stay on the equipment surface during attacks or staff casting and are absent in Calm view.
Art and readable mobile views. Fifty-three creature identities have painted dungeon poses: the Dark Elf Warrior and Mage, Blink Hound, Cave Wyrm, Skarrow, Lizardfolk and Shaman, Grey Dwarf and Arbalest, Slime, Rustmaw, Eyeless Stalker and Puffcap, plus Rat, Bat, Spider, Goblin, Skeleton, Zombie, Orc, Ghoul, Wraith and Ogre; Troll, Minotaur, Kobold, Archer, Basilisk, Acolyte, Moth, Thornhog, Imp and Cutpurse; Lookout, Hexer, Pikeman, Quillback, Drowned One, Emberling, chest Mimic, Lich, Heartforged and Warlord; the default knight Shade, Grisk, Vessra, Ushgar, Morrow, Orla, Gorrum, Vaelith, Hissra and Durgrim. Fallen heroes of the other six classes, barrel Mimics, six companions and keeper equipment states now have their approved paintings too. Traders, encounters, room props, remains, regional base surfaces and selected held gear and impacts also use painted exports. Each painting loads on demand with its own poses, normal lighting and warnings, and works offline. Skarrow keeps her distinct scarred, three-horned identity; the other named champions have their own atlases, while companions retain their separate appearances. Procedural art remains available if an atlas cannot load. The art coverage audit records current bindings and intentional procedural layers; the atlas roadmap records the lantern and open reading-scroll deliveries. Bestiary, companion and relic collections offer Field notes and Gallery layouts; Gallery puts the paintings first with expandable lore and statistics, preserving what each hero has learned. Layout is remembered on the device. Search matches discovered text, with folded discovery, region and type filters drawn only from known entries. Searches and filters stay while browsing between title and Journal. New discoveries carry a New marker until you inspect their portrait, open their notes or tap the marker; existing discoveries start viewed when upgrading. The selected hero has a larger portrait and a folded Backstory. On upright phones, tighter controls and a quiet log leave more room for the dungeon; fresh messages restore the log, and its full history stays one tap away. Distant surfaces use cached softer detail while nearby textures remain crisp. Pack equipment icons are larger, and new devices start with Compact bags; choosing the full grid is remembered without changing the twenty-square capacity.
Clearer combat warnings. Ordinary attack triangles carry an exclamation for a close blow, an arrow for a missile and a diamond for ranged magic. Special tricks retain their larger spiked warning, including grouped foes. Brief BLOCK, DODGED and MISSED YOU receipts distinguish avoided attacks from damage; flank misses no longer paint the damage rim red. Calm view keeps flank warnings steady. Attack timing, armour checks and damage stay the same. A text strip names the nearest visible foe's current wind-up, including shots, spells and charges; it never names a foe hidden behind stone or outside the view. Damage numbers carry a minus sign and critical hits say CRIT, so colour is not the only distinction. Short conditions show seconds remaining; their scrollable chip row keeps 44px touch targets without covering the fight. The death screen adds advice for the recorded killing source and a disclosure of conditions at the fall, alongside the killing blow and final messages.
A focused first run. Choose any class and descend with the existing eight-floor, one-life defaults. Backgrounds, rolled or bought scores, seed and dungeon settings sit under Customise hero & dungeon; mastery goals have their own disclosure. Folding settings preserves choices. The Journal starts on Quests and groups Pages, Bestiary, Companions, Relics and Combinations under Stories & collections. Attack names its existing cooldown as Ready or Recovering, enemy warning marks keep a readable exclamation before filling, and misses read MISS. Pack names use four columns on narrow phones (three at large text), with the same 20 slots; Compact view rounds to the displayed columns. The map key expands under Map symbols; Rest names its life recovery and its accessible description includes spell points, food and interruption risk.
Remembered places and travelling companions. Entered set pieces receive a short place card and a name in the map's Known landmarks and the run recap. Unvisited rooms stay hidden. Quests includes optional field notes on warbands, packs and mixed melee/ranged fights. Companion portraits show short reactions to the place, wounds and victory, plus separate learned and upcoming skill cards using their existing floor milestones. The end screen highlights one optional goal for the next hero. Recorded impacts retain bone, slime, metal or spectral responses; the Dark Elf Halls, Grey Hold, marsh, drowned halls and old forges each have their own synthesised ambience, alongside the existing sound pack.
Painted relic portraits. All 47 named relics have paintings in the discovered Relic codex and identified item details. Tap a painting, or focus it and press Enter or Space, to enlarge it. Portraits are cached for offline viewing.
Optional dungeon puzzles. At the first stair of every new custom or Quick Start run, tick Include dungeon puzzles. It starts unticked for each hero. Rune sequences, watchfire patterns and keeper-seal deductions guard some existing gold and gems, with clues beside their controls. Stand on a cache or face it and press Puzzle (Use); the dungeon pauses while it is open and keyboard focus stays inside the dialog. Start again clears a guess, and Leave for later keeps your progress. There are unlimited retries, no wrong-answer damage. Once opened, keep its gold and gems or, when the purse covers it, choose a Potion of Healing or class-usable unidentified gear instead of some coins. Remaining coins come with the item. Choose once, then collect the share from the floor; a full pack never destroys it. The lid lifts once with a short sound; Calm view and reduced-motion settings show a still open cache. Keys, relics, quest objects, passages, stairs and the Heart are never gated. Progress travels in saves, save codes and same-build replays. Daily and Weekly challenges keep puzzles off so their rules stay fixed. Floors without a suitable treasure pile, and the final floor, have no cache.
Watch a recorded delve. New runs record their actions and timing locally. After victory or defeat, choose Replay this run to watch the first-person journey, pause it or play at up to 4× speed. Playback leaves saves, trophies and Daily results untouched and works offline once cached. Records continue with saved games; older, imported, testing-aid or over-limit runs do not offer replay. Playback requires the same build and is currently available from the finished run's end screen. If storage is tight, the optional recording is dropped before retrying the game save. See recording details and limits.
A welcome on the title. Unread News comes first; otherwise a random game fact appears. Dismiss it to unlock the theme music, subject to your sound settings. The release and build are shown at the bottom of the main page.
Seeded dungeons. Every level is generated from your seed string, so the same seed always gives the same dungeon. Share seeds with friends.
Customisable descent. Choose the number of levels (2 to 16), map size, monster density, treasure density, locked doors and keys, traps, and permadeath, just like the original's dungeon-customisation screen. A difficulty picker at the top sets Easy, Normal or Hard.
One life by default. Permadeath is on unless you untick it. The run is still saved when you change levels or put the game away, so Continue picks it up, but Load stays shut and a death erases the save.
The Daily Delve. One dungeon a day, the same for everyone: the seed, the class, the background and the scores all come from the date. Eight floors, normal difficulty, one life, one try. The title then shows how it went, the Hall marks the run, a streak counts the days in a row, and Share copies a one-line result. Nothing leaves the device. A second, the Ranger & Druid Daily, deals one of those two classes, with its own record and streak.
A story you descend into. An opening sets up the valley above Karrathal and what went wrong beneath it. Each of the eight levels holds one page left by the guild crews who went first, and the Journal collects them as the account of what actually happened down there assembles itself.
Ten backgrounds. The Oathbroken, Tombwise, Ashborn, Cloistered, Deep-born and Debtor. Each gives a lasting advantage, a paragraph of the opening, and the line your run closes on. Two more are earned: The Returned opens after any win on Normal or Hard, The Heartsworn after a win on Hard. The Daily Delve only ever deals the first six.
Trophies and a relic codex. Progress that outlasts a run, kept on the device under one key. Each ordinary class earns a trophy for each difficulty it wins (daily runs included), shown as a grid at the top of the Hall of Heroes, and the victory screen says when one is new. Every relic any hero picks up or buys goes in the codex, readable from the Hall or the Journal's Relics tab; the rest show only whether they are a weapon, armour or a shield.
A choice at every level. A lesson at most levels, three offered at a time, most of them a rule (an opening blow that cannot miss, a floor's first trap stepped over, no grip holds you, every potion known, the stairs on the map) and a few a number; on every even level a class talent instead, one of three from the class's own six or seven, each changing how the class fights, and a talent passed over is held for the next offer. Self-Taught can be taken twice; the rest only once.
A path at level 3. Each ordinary class chooses one of two paths, for good, in place of that level's lesson (or at the divided stair, if it comes first): Knight or Berserker, Templar or Healer, Pyromancer or Frostweaver, Assassin or Trickster. Each changes two or three rules (a shield that catches blows, rage that grows with your wounds, fire that keeps burning, a slip aside from a blow) and some give something up for it. The path is on the Hero sheet, the end screen and the Hall of Heroes.
Mastery at level 7. A hero on a path masters it, again in place of the lesson: one of the path's two capstones, each one rule (a Knight's shield that staggers what it catches a blow from, a Berserker who will not fall once a floor, a Pyromancer's fire that deals double to what already burns, a Sharpshooter whose arrow at three squares cannot miss).
Six classes with AD&D-flavoured rules: Fighter, Cleric, Mage, Thief, Ranger, Druid. Six ability scores (4d6 drop lowest), hit dice, armour class, to-hit progression, class weapon and armour limits, experience levels up to 12. Each has its own way to stay alive: fighters are hardy and recover faster, clerics heal, mages kill at range, thieves dodge, crit often and backstab, rangers keep their distance, and druids take a bear's shape, whose hide takes the blows first (any other spell lets it go). All six can be chosen from the start.
Heroes with a past. Each class has its own backstory on the selection screen. Select a class, then tap its portrait to expand the artwork. The six hero paintings are refreshed with quieter dungeon backgrounds. The Lich, Warlord and Heartforged use the bestiary's creature compositions, equipment and dungeon settings, shared with their introductions.
Six Mythic bargains. One signature piece for each ordinary class, usable on either path, with its own power, drawback and lavender artwork. Only one Mythic may be worn at a time. In custom delves of at least eight floors, the final Vigil Lamp offers an optional extra ogre fight after its usual aid, at its usual cost. Defeat the guardian for your class's piece; a full pack leaves it safely on the floor. Daily/Weekly and shorter delves keep their current rules. Mythics are never sold by traders or offered as mastery starting gear.
Landmarks and treasure reveals. Carved stair jambs, shrine compass inlays and the final sanctum's glass floorwork use cached art, with the same fog, light and clear stair openings. Open the pack after finding a Legendary or Mythic piece to see its larger artwork, powers and lore. The brief reveal respects Calm view and reduced motion; finding treasure never opens a popup or pauses combat. Taking up a save does not repeat old reveals.
Named treasure artwork. Every Mythic, legendary piece and named relic has its own lore-led picture in the pack, treasure inspection and discovered codex, and matching held weapons, bows, shields and foci. Ordinary enchanted gear keeps its base art.
A painted bestiary. Every creature has portrait art in the bestiary and Journal, with an enlarged view and a sprite fallback if the painting cannot load. Animated creatures and fallback hero faces match the paintings' identities, anatomy and equipment while keeping their original animation style. Refined creature sprites include clearer canine and wyrm silhouettes, connected crossbows, shell shields, dimensional mimics and distinct spellcasting poses.
Melee and missile arms. Throwing knives, slings and bows reach down a corridor, so archers and casters are not the only ones with an answer at range. Monsters move faster than they swing, so a missile weapon buys you a few shots rather than an endless retreat.
Real-time combat. Monsters wake, path toward you and attack on their own clocks. A door pulled shut matters: whatever has hands opens it, but beasts must batter it down over several seconds (you hear every blow), and ogres, trolls and minotaurs smash it to splinters, for good. Fifty-three monster types, and ten named champions, including undead, poisoners, a regenerating troll, a basilisk whose gaze turns whoever meets it to stone, a rustmaw that eats your armour's enchantment, a hound that steps out of the air at your back, a quillback whose raised quills punish the blow struck into them, a wyrm whose fire runs down the passage but not under its jaws, and a life-draining boss guarding the artifact on the deepest level. Each of the first four floors has a creature of its own whose answer is not a step back (a moth whose flare dazzles, a quilled hog, an imp that comes back at your back, a goblin with a pike), so those lessons are first met where a mistake costs little. Which of them a floor holds goes by how far through the delve it is, so a short delve meets them all. Every trick is warned of, armour does not turn a warned blow, and answering one leaves an opening.
A boss fight in three acts. The Dread Lich speaks when it wakes, and its life runs across the top of the view. At two thirds it raises skeleton guards and steps back behind them to throw grave-cold over their heads; at one third it puts out every torch in its hall, quickens, and tries to drink the Heart's light to mend itself, a rite any wound breaks. A mage has answers of their own: a spell pulls the lich's shadow ward apart and gives back a third of their spell points, and grave-cold breaks on a mage's Shield.
Blows that leave a mark. Every monster bleeds its own colour, from red to a slime's green to a wraith's cold light; heavy blows and kills stain the floor, misses strike sparks, and a hard hit on you jolts the view and leaves blood on its edges. Poison, frost, webs and blessings each tint the view their own way, and timed effects count down.
Magic. Mage and Cleric spell lists (bolts, buffs, heals) with spell points, plus scrolls anyone can read.
Items. Weapons, armour and shields with enchantments, potions, scrolls, food, gems, gold, and colour-coded keys for locked doors.
Oils. Fire Oil, Silver Wash, Blade Venom and Frost Oil coat the weapon for its next 20 blows that land: more fire damage (and no troll mending), more against the undead, poison for the living, or cold that holds the foe back a moment and freezes the water round it.
Regional architecture. Crypts have carved burial masonry and long ledger stones; the Grey Hold has iron uprights, geometric paving and metal-clad doors; the marsh has muddy ground, reed litter and rope-bound weathered wood. Elven halls, the Sanctum, drowned halls and old forges have their own inlays, stains and ironwork. Details are painted into cached textures, with the existing light and fog ranges, lock colours, water cues and Calm view preserved. Broken ledger lids, discarded ironwork, crystal shards, roots and reed bundles dress the existing scenery positions without adding obstacles or changing generation.
Finishing touches. Creatures follow through after a blow and ease out of a flinch; sleeping creatures breathe more slowly. Valuable finds catch a small glint, with known rare and legendary pieces in their own colours, and selecting an item in the pack shows its framed artwork, grade and usual actions together. Hidden quality stays hidden. Force darts, thorn whips, roots, holy seals, healing motes, shields, blessings and a bear's paw give magic distinct shapes. Calm view (also the default for reduced motion) omits the new reaction poses, glints and travelling magic, retaining small, still impacts which fade away. Character, bestiary and inventory screens share rounded frames and selection marks.
A trader in the dark. One of the Lampfolk (on a goblin market floor, a goblin pedlar) sets up shop on about two floors in five, selling potions, scrolls, food and the odd weapon, and buying whatever you do not want for about a quarter of what they would ask. Buying something identifies it. Gold you never spend is just a number on your gravestone.
Two last fights. The Crypts end at the Dread Lich; the Warrens at the Goblin Warlord, who beats a war-drum for his warband, takes to his throne behind two shield-bearers at two thirds, and fights in a frenzy at one third.
Jobs from the traders. A trader may offer a job for the floor below: slay its champion, cull its creatures, or find a lost satchel. Free to take, for that floor only, and paid in gold and a flask or scroll by the next trader you meet.
A hound at your heel. On floor 2 of most delves a starving hound watches from the dark. Share your food, or win it over with a word, and it follows you down: it bites whatever stands beside it (the thing at your side first), draws the blows of anything that reaches it before you, heals when you rest and grows with you, and leaves a fight to follow you if you walk on. It finds its own way round doors and crowds, shows on both maps, and stands beside you on the picture of a won run. Walk into it to swap places; face it and press Use to tell it to stay or call it to heel. It is no help to a quiet step: sleepers hear a hero with a hound at heel a square sooner. A hound told to stay is left behind on the stair. If it falls it is gone for the run, and the epilogue remembers it.
Or a goblin with clever fingers. A delve with no hound keeps a caged goblin about halfway down. Let it out and it follows as the hound does, but it is a poor fighter and a quiet one: it picks the locks you have no key for, makes safe the traps it passes, and lends its fingers to an encounter's Dexterity test (+2). One companion a run.
Companions remembered. Open Companions from the title screen or the Journal to view portraits and descriptions of the six companion types your heroes have met. Meeting one unlocks it even if you do not recruit it; unknown types stay hidden. Discoveries persist on this device across delves, portraits can be enlarged by touch or keyboard, and all class portraits work offline. Loading older saves recovers discoveries from their companion and recorded encounters.
Companions that grow. Every new floor a companion comes down at your side counts: blooded after two, a veteran after four, tougher each time and with a trick of its kind (a hound's hamstring and pack hunting; a goblin's backstab and scrounging). A charm from a trader (a studded collar, a fang, a rowan knot) makes it tougher, fiercer or slowly self-mending.
Survival. Hunger, poison (fought off with a Constitution save), traps in corridors (dodged with a Dexterity save; a pit is only halved). Wounds close on their own only up to half your life; past that it takes a potion, a prayer or a rest. Resting costs food, is blocked by nearby enemies (the Rest button dims and says so; it never drinks for you), and thins out: the first rest on a floor restores up to two thirds of your life, the next a third, the third a quarter, and then the dark is too close to sleep. Potions are found rarely enough that the gold you carry has something to buy.
An ending that is a fight. The Heart of the Mountain will not come loose while the Dread Lich stands. Bring it down, lift the Heart, and its light floods the view and carries you out: the run is won there and then, with no long walk back.
Unknown potions and scrolls. Every dungeon shuffles appearances, so a "cloudy potion" is a different draught in each seed. Drink or read it to learn what it is.
Champions. Feral, Armoured, Ancient and Rabid monsters appear more often as you descend, and each mark changes how one fights: a Feral one charges whatever its kind, an Armoured one's plates turn the first blow, an Ancient one uses its trick twice as often, and a Rabid one never flees. They hit harder, take more killing, and always drop something worth having.
Fire, cold and lightning. Spells, the Scrolls of Fire, Frost and Lightning, a flaming or frost-oiled blade and burns each carry an element, and some kinds take half as much again from one and only half from another (slimes, spiders, zombies, trolls and quillbacks burn well; the dead barely feel the cold; rustmaws and bats draw the lightning; a cave wyrm shrugs off fire and fears the cold). The first hit that finds out says so and the bestiary keeps it. The wraith's touch and the lich's grave-cold are cold, and a Ring of Warmth halves them.
Named champions. About a third and two thirds of the way down, one floor each is held by a named foe, chosen by the seed from those that suit the depth: Grisk the Goblin King, Vessra the Web-Mother, Ushgar the Orc Warchief, Morrow the Ghoul Lord, Orla the Hollow Abbess and Gorrum the Troll-Father. Each is its kind grown great and washed in its own colour, asleep in a lair away from the stairs with some of its kin, named in the log when you arrive, and given a life bar across the top of the view once awake. Each sharpens its kind's trick (a horn that calls kin at half health, webs or a claw twice as often, a hand that drinks your life), warned of and answered like every other. It falls for a relic the traders were keeping for your class, or a +2 piece and gold once they have none left, and the bestiary, end screen and Hall of Heroes remember it.
Your dead come back. The last hero lost on a device (outside the Daily Delve) is remembered there. A later run (never a daily one) finds their bones on the floor where they fell, still wearing their gear, with their shade risen over them: made to that floor, fighting as its class did, and warned of in the log on arrival. Laying it to rest wins the gear (quality hidden again, curses and all, relics left behind) and forgets them; the Hall records who was laid to rest. The map is the seed's own either way: the bones are placed afterwards, from a stream of their own.
The deep answers strength. A hero who arrives on a floor well ahead of the usual level finds it readier for them: its creatures take more killing, hit surer and harder, and more of them are champions. A hero on pace or behind finds each floor as it was made.
Torchlit halls. Wall brackets cast real pools of light across floors, walls and monsters, each flame flickering on its own rhythm. Every depth decorates its walls its own way: iron rings and candle niches, skulls and ossuaries in the catacombs, moss and roots in the damp, frost and grates in the vaults, chains in the crypts, glowing runes in the sanctum.
Secrets. Hidden doors lead to treasure vaults. Search suspicious walls, or play a Thief and spot them in passing. Wall fountains restore you fully, once per fountain.
Ranged foes. Goblin archers and dark acolytes attack down corridors, so cover matters. Wounded monsters break and flee, and a strong character can shoulder a locked door open.
A map you can read. Explored ground is cropped and scaled to fill the screen, the player is a ringed square with a facing arrow, stairs, doors, locked doors, fountains and traders each have their own colour and symbol, and a legend names them all. A live corner minimap too. Discovery stops at the view's fog limit; unseen ground stays hidden, and both the corner and docked maps wait until the opening passage ends.
You are told what is happening. Attacks name the direction they came from, the edge of the view flashes on that side, walking into a wall says so, and the death screen names your killer and replays your last moments. Win or lose, the end screen sums up the run: your best blow, the hardest hit you took, what you killed and how many, the talents and relics you carried.
Nothing is spent for nothing. Food, potions, scrolls and spells refuse to be used when they could not help, and say why. Unidentified draughts are always usable, since refusing one would tell you what it is.
Automap of explored areas plus a live corner minimap, message log with full history, monster health bars, save/load to local storage with autosave on every level change, and a Hall of Heroes that remembers your best runs. The pack compares any weapon or armour against what you are already wearing, in damage per second or armour class. Equipment surrounds a shaded neutral mannequin shared by all classes, with a subtle class accent. It keeps its proportions as the screen turns; lines join the cards to the chest, neck and hands. Weapon is by the right hand, armour below the torso, and one left-hand slot holds a shield, focus or second weapon. Selecting equipment also highlights its body area. Selecting an item highlights its valid equipment slots; its details open in a bottom sheet with actions kept in reach. Escape or controller Back closes the details first. Tap a slot to browse compatible replacements; filters separate weapons, worn gear and supplies. A compact bag option hides unused rows while keeping all 20 squares. New finds stay marked until inspected, including across reloads; a growing stack is marked again. Before/after item stats and weapon-rate estimates share their presentation with read-only shop inspection and the discovered relic collection. Both-hand previews explain shields, second blades and two-handed grips before equipping. Under an item's Favourites and quick-use belt, protect it from dropping and selling, or pin food, potions and scrolls to three dungeon controls. Depleted belt slots retain their assignments for later refills. These preferences belong to the current run on this device. The Journal's Haul lists actual floor pickups, excluding purchases, gifts and dropped items taken back; earlier pickups from old saves are not reconstructed. Relic sets show discovery and worn progress separately, and the Companions page shows the current companion's health, learned abilities and following, waiting or fallen state. Search carried items by name, public type or a known power; search combines with the category and equipment-slot filters without identifying hidden gear. The Journal's Quests shows job progress, payment instructions and unfinished leads. Tap a status chip for Conditions, with its effect and remaining duration. Recap, also available after the run ends, brings together notable finds, paid jobs, companion milestones and defeated bosses. Follow/Stay buttons beside the companion portrait use the same facing and reach restrictions as Use. The map lists known traders, shrines, locked doors and unresolved encounters; select a landmark to centre it. Resolved encounter markers are remembered on this device from this update onward, and unexplored places stay hidden. Large text uses a readable two-column equipment list.
Sound. Placed by ear: a blow drawn back on your left is heard on your left, and a far one is quieter and duller. Blades, clubs, arrows, fists and spells each strike differently, armour and shields ring, each kind of creature has its own voice and its own death, and every spell its own sound. Each floor has its own drone and distant noises (drips, chains, wind), which tighten while the lich is fighting, and you hear your own heartbeat once badly wounded.
George narrates the story. The opening and backgrounds, found Journal pages, first region and relic discoveries, and death/victory epilogues have recorded British narration. Voice is on by default, with pause, replay, skip and its own volume and switch. Discoveries wait for quiet and stop for combat warnings. Both audio formats are saved in the background; the title says when all voice recordings are ready offline. The game can already be played offline while they download.
Music that follows the fight. Written as it plays, in each floor's own scale: a few bell notes and long silences while nothing is near, a low pulse when something awake is close, a quicker beat and a repeating figure once it comes to blows, and a horn beneath for a named champion, a shade or the lich. When the fight ends it comes home to the floor's own note and then hushes a while. It has its own switch in the Menu.
A living title screen. The menu sits over a real generated dungeon with a ghost camera walking it, drawn by the same raycaster as the game, with drifting embers and torch flicker.
Mobile first. Big touch d-pad with hold-to-walk, swipe on the view to turn or step, tap it to act, haptic feedback, portrait and landscape layouts, safe-area aware, installable as a PWA with offline support. Keyboard controls on desktop.
The code is plain ES modules with no compilation: the page loads js/main.js and the browser
resolves the rest, so what you edit is what ships. Types are written as JSDoc and checked by
TypeScript in --noEmit mode, which catches renamed fields and bad shapes without putting a
compiler between the source and the browser. Everything is original: the raycast renderer
with textured floors and ceilings, procedural
wall textures, pixel-art sprites and sound effects are all generated in code. No external
assets or dependencies. Creatures are drawn as 24x24 tone art; the outline, contact shadow and
overhead light are applied at load time so every sprite reads the same way against a dark wall.
The final Vigil Lamp in custom delves of eight floors or more offers an optional trial. Preview the bargain, choose the lamp's normal aid at its normal price (or none), then defeat its guardian. Cancelling the preview spends nothing. The reward belongs to your class and works with either path; only one Mythic can be worn. Each has its own picture, spoken lore and a cost to weigh against its power.
| Class | Mythic | Power | Drawback |
|---|---|---|---|
| Fighter | The Last Gate | Blocks 2 from ordinary close blows; stores up to 3 for the next close hit within five seconds | −1 armour class |
| Cleric | Mercy's Oath | Healing spells mend 25% more | Damaging spells cost 1 extra spell point |
| Mage | The Bloodstar | Damaging spells deal 20% more | Each costs 2 life, bypassing wards; unavailable at 2 life or less |
| Thief | Nightglass | Close hits add 2 damage, or 6 from the shadows | −1 armour class |
| Ranger | Horizon | Arrows from at least two squares add 4 damage | Draw takes 15% longer |
| Druid | The Elderseed | Bear's base hide gains 4; Entangle's base duration gains one second | Healing spells mend 20% less |
The game is a static site. The included vercel.json runs a small commit-stamping
step and configures service-worker caching and security headers; game code is not compiled.
From the dashboard
vercel.json, and leave the output
directory as the repository root.From the CLI
npm i -g vercel
vercel # preview deployment
vercel --prod # production deployment
Automatic versions and GitHub releases
For each update, stage the intended changes, then run:
npm run release:prepare -- --message "feat: describe the new feature"
git add package.json package-lock.json js/release.js sw.js
Small additions, fixes and polish default to a patch, including feat: commits.
Choose --bump minor for a substantial gameplay feature or sizeable content batch;
reserve --bump major for a major overhaul approved by the owner. Commit labels
alone never select a larger milestone. Group small changes into a release batch.
The title footer shows the release version and the deployed seven-character Git
commit ID. Vercel stamps the full commit into the page during deployment with
node stamp-commit.cjs; the local server stamps its checkout in memory. The same
identity is retained offline and used in opt-in reports. Internal release and
offline cache counters still increase with each prepared release. Docs, tests and CI-only changes leave
the numbers unchanged. Repository agent instructions require preparation before
publishing updates.
The owner reset the displayed version from 1.6.0 to 0.9.0 on 18 October 2026, with build 15. Game content and saves are retained. Earlier releases and tags stay in the history; 0.9.0 becomes the latest release. Small updates continue as 0.9.1, 0.9.2 and so on. This is a numbering reset, not a checkout of older game code.
An authorised numbering reset uses:
npm run release:prepare -- --reset-version 0.9.0 --reason "Owner requested pre-1.0 numbering"
Stage its tools/version-resets.json audit record alongside the four metadata
files. CI accepts that exact old/new version and build transition
only with one newer build/cache and no bundled gameplay changes. Never reset
builds, reuse an existing version tag or edit published history.
The pre-push hook and CI reject player changes without a suitable version/build bump. After all required matrix
test jobs pass on main, it creates the version tag and a GitHub release with
generated notes. Repeated runs skip existing releases, older main runs skip
publication, and existing tags are never moved. Release-tool-only changes use the isolated Git fixtures and both phone
release/footer/offline checks locally; the complete browser, security, rule and
performance suites still gate publication in CI. Gameplay changes retain the
full local browser and balance checks. Only that publication job receives
a write token; tests and pull requests remain read-only. Vercel continues to deploy
main on push, independently of the later GitHub release publication.
The app must be served over HTTPS for the service worker (offline mode) and "Add to Home Screen" to work. Vercel does this by default.
Reports (optional)
Players can turn on Send reports in the Menu: a short note when a run ends and when
something breaks. No account or hero-name field is sent, but seeds and error details can
include user-supplied text. The notes go to api/telemetry.js, a Vercel
function that counts them in an Upstash Redis database; dashboard.html shows real players'
win rates beside the bot's figures in the balance table below. To switch the store on, add the
Upstash for Redis integration to the project from Vercel's Marketplace (it sets
KV_REST_API_URL and KV_REST_API_TOKEN), or set UPSTASH_REDIS_REST_URL and
UPSTASH_REDIS_REST_TOKEN by hand, and redeploy. Without them the function answers and keeps
nothing, and the dashboard says no store is set up.
Only aggregate counts and opaque crash signatures are public. Individual reports and error details remain in the private Redis store. Reports are limited to 6,000 UTF-8 bytes and 60 per address per minute; short-lived rate keys use a keyed digest instead of storing the IP. Browser requests from another origin are refused. These are abuse controls, not proof that a reported run is genuine: this public endpoint does not authenticate players.
Save codes are untrusted data. Imports check dungeon dimensions, core field types and ids, reject prototype keys and excessive nesting, and leave the current hero intact on refusal. Item validation covers carried equipment, floor loot and trader stock. Belt counts are escaped as text and attributes as an additional defence against malformed quantities. Legacy Hall migration rejects inherited class IDs; progress counters tolerate malformed stored values without changing valid records. Codes/files are limited to 24 MiB before decoding and 16 MiB after decoding, including gzip expansion. Valid game numbers are preserved; this is not an anti-cheat system. Avoid putting personal information in seeds or shared saves. Browser storage and save codes are not encrypted. Exported codes omit the local recording and its starting memories; recordings remain in the browser's own save and imported recording context is discarded before persistence.
The deployment applies a restrictive Content Security Policy, blocks framing by other sites, and disables camera, microphone and geolocation access. The service worker excludes API and cross-origin requests. Development tests and tools are excluded from deployment.
Run npm run test:security for adversarial import, decompression, telemetry and local-server
checks. The browser security tests also cover markup injection and API-cache isolation.
See security policy and the 20 October review
for scope, findings and remaining operational limits.
With Node 24, use the included server, which binds only to this computer and refuses hidden files and paths outside the project:
npm start
Open http://127.0.0.1:4173 in a desktop browser. For phone/tablet testing, use the deployed site or a Vercel preview. If you choose another static server, configure its file exclusions before exposing a checkout on your network; a generic directory server can expose local configuration and development files.
npm run typecheck # JSDoc types, via tsc; nothing is compiled
npm run check:agents # reject missing or stale AGENTS.md guidance
npm run check:art # reviewed art sources/exports and offline inventory
python3 art/bestiary/export.py --check # reproduce bestiary exports without changing them
python3 art/portraits/export.py --check # reproduce current class/keeper paintings
npm test # guidance, art, types, generator, sprites, security, APIs, narration, voices and rules
npm run test:release # automatic versions and publication safeguards in isolated Git fixtures
npm run test:security # adversarial save/import, telemetry and local-server checks
npm run test:browser # Playwright suites on phone and small-phone viewports
npm run test:webkit # focused WebKit checks; CI installs this browser
npm run test:all # both
PUZZLES=solve PUZZLE_REWARD=potion FIT=1 DIFF=normal SEEDN=40 node test/playtest.js fighter 10 # healing choice when affordable; gold|gear also valid
npm run playtest # 40 simulated runs per class, all six classes (240 runs)
PERF=1 npx playwright test --project=perf --workers=1 # performance budget, run alone
The browser suite drives the real game in headless Chromium: the core loop, dungeon features,
the trader, the story layer, the endgame, and an interface pass that asserts every
control clears the 44px touch guideline, that readable text clears 4.5:1 contrast, and that a
crowded level meets its frame-rate budget under simulated CPU slowdown. Runtime depends on
the machine. CI runs three phone shards, two small-phone shards, three WebKit
shards and a separate performance job on pushes to main and pull requests.
Each WebKit shard uses one worker and checks the mobile flows tagged @mobile: first-tap music and mute choices, map fog, portrait
expansion, puzzle choices/retries/rewards/save transfer, quoted-name and compressed-save safety, touch controls and save/resume after navigating away. CI uses
Node 24, a read-only repository token and checkouts without persisted credentials.
Browser/performance jobs select runtime/test files and creature metadata through
a shared sparse-checkout step; rules and publication retain full history. All
ten required matrix jobs gate publication. Exact case coverage and working-tree
bytes are recorded in the CI execution review.
CI pins Ubuntu 24.04 because the pinned Playwright 1.59.1 does not support the
Ubuntu 26.04 image now supplied by ubuntu-latest. Runner upgrades must follow
verified browser support; all engine suites and the performance gate remain.
Class-Shade routing and Orc recovery checks verify exact idle and blink images
at known animation times.
CI retains JSON attempt reports, native browser logs, failure traces and resource
snapshots for seven days, including when a retry passes. Separate regular/offline
output directories keep the later step from deleting earlier evidence. The
browser failure audit
records the observed native Chromium SIGSEGVs and separate WebKit offline-status
timeout; their underlying causes remain open. Repeat the diagnostic retention
controls locally with CHROMIUM_PATH=/usr/bin/chromium node test/ci-diagnostics.cjs.
The default browser script uses Chromium so it works with the locally preinstalled browser. WebKit tests
supplement the real iPhone checklist; they do not verify physical
Safari, speaker output or OS tab eviction. npm start serves the game locally on
port 4173 with no server dependencies.
Playwright is pinned to 1.59.1: 1.56's WebKit has a confirmed
reload crash, fixed in 1.57.
Use Node 24 for the included server, tests and Vercel functions (package.json pins the runtime).
Guide and general accessibility audits use the shared uiReady helper to wait
for finite panel animations instead of a guessed delay. Audits retain all WCAG
rules and serious/critical assertions, with a deliberate contrast-fault guard.
The CI readiness review
records the controlled before/after comparison and its limits.
npm run playtest loads the real rules headlessly and plays complete runs with a bot that
fights, casts at range, retreats when hurt and rests when safe. It reports win rate and average
depth per class, which is how the balance below was tuned rather than guessed at. Runs take
each class's two paths in turn and report how each did; HEROPATH=knight (or any path) forces
one. The default is 20 dungeon seeds with two trials per seed for each class. For a larger,
single-class benchmark:
FIT=1 DIFF=normal SEEDN=40 npm run playtest -- fighter 10 # 400 Fighter runs
FIT=1 DIFF=hard SEEDN=40 npm run playtest -- fighter 10 # Hard difficulty
FIT=1 DIFF=normal SEEDN=40 SEEDPFX=alt npm run playtest -- fighter 10
FIT=1 DIFF=normal SEEDN=40 JSON_OUT=/tmp/balance.json npm run playtest -- fighter 10
FIT=1 places the best stat in the class's primary ability, as character creation does.
Use SEEDPFX=alt and SEEDPFX=third to compare separate seed sets. JSON_OUT
keeps exact individual outcomes, run options, seeds and trial counts; the text
summary rounds percentages. Record the revision and any other environment flags
with the command.
EARLY=1 counts deaths below level 5; deaths before choosing a path are recorded
as died && !path in the JSON. Default path rates also use different background
mixes, so use matched, forced HEROPATH runs before deciding a path needs tuning.
The bot measures balance; it does not change the game's rules. Published win rates
below are measurements at the recorded revision, not an automatic run of the
current checkout. Re-run the relevant classes and
difficulties before replacing them, recording the revision, settings and seed sets.
Balance testing is required before shipping changes to classes, enemies, abilities,
combat, loot, economy, progression or dungeon generation. Compare the previous and
changed revisions with matching settings on Normal and Hard, covering affected classes
and paths (all six public classes, plus the hidden Spellblade when affected, for shared systems). Tune on at least two seed sets and
validate the final change on bench, alt and third, normally 400 runs per class,
difficulty and set. Record commands, revisions, run counts, win rates, depth, early
deaths, death causes and resource use before updating measured results. If testing is
blocked, report it and keep the gameplay change unpushed until validated.
Review balance across all six classes before each release, including affected run lengths and ladder rungs. Existing benchmark results can be reused when gameplay has not changed. Art, audio, presentation-only UI and documentation changes need relevant regression checks; changes to controls, targeting, timing or visibility also require balance testing when they affect gameplay. The full rule lives in AGENTS.md.
The hero's own floor lighting is calculated once per projected row; torch interpolation, texture and shadow rules keep their original per-pixel results. The rendering review separates frozen pixel/timing comparisons from native-play performance and retains rejected experiments.
The named-staff overlap fixture waits for art preparation and starts native attack/consumable actions on a fresh frame. It retains the released-drive and hand-restoration assertions and their five-second windows; a guessed timer can resume after the entire short swing under load. See the fixture comparison.
npm test runs the headless generator checks, plus a rule suite that loads the real game logic and
exercises the edge cases that are easy to break quietly: enchanted duplicates not merging in the
pack, two-handed weapons stowing the shield, save surviving a JSON round trip with buffs intact,
dropping from a full pack, poison and buffs expiring, the Heart resisting sale, and a trader
charging the right price. The generator checks: every level for a set of seeds and sizes must be solvable
(keys before the doors they open, stairs or artifact reachable), deterministic, and internally
consistent. The sprite sheets are validated too. The same suite runs in GitHub Actions on every
push and pull request.
Normal and Hard were remeasured on 16 October 2026 against game revision
143d6b5 (Build 3): all six classes on eight Medium floors, FIT=1, three seed
sets (bench, alt, third), 40 dungeons and 10 trials per dungeon in each set.
That is 1,200 runs per class and difficulty, 14,400 runs total, with zero
errors or timeouts. These are bot outcomes, not player win rates. The table
rounds the new rows to one decimal; exact counts, paths, death causes, resources,
uncertainty intervals and reproduction commands are in the
full audit.
Normal’s observed class spread is 6.33 percentage points, marginally above the six-point target (Fighter 85.33%, Thief 79%). Hard’s is 4.17 points, within the observed target. No game rules or bot decisions changed in this audit. Path comparisons need matching backgrounds before a tune; the current bot’s default assignment confounds them. All other rows below are historical measurements and were not refreshed by this audit.
| Difficulty | Cleric | Fighter | Mage | Thief | Ranger | Druid | Overall |
|---|---|---|---|---|---|---|---|
| Easy | 100% | 98.5% | 100% | 98.5% | 100% | 100% | about 99.5% |
| Normal | 83.6% | 85.3% | 83.3% | 79.0% | 80.8% | 81.8% | about 82.3% |
| Hard | 63.5% | 64.6% | 65.7% | 65.6% | 62.6% | 61.5% | about 63.9% |
| Long Delve (12 floors), Normal | 81.5% | 86% | 90% | 89% | 84% | 86% | about 86% |
| Long Delve (12 floors), Hard | 74% | 74% | 72% | 70.5% | 72% | 71.5% | about 72% |
| Long Delve (16 floors), Normal | 84.5% | 82% | 82.5% | 87% | 82.5% | 82% | about 83.5% |
| Long Delve (16 floors), Hard | 62% | 62% | 61% | 65% | 63% | 62.5% | about 62.5% |
| Quick delve (2 floors), Normal | 98.5% | 97% | 98% | 94% | 98.5% | 98.5% | about 97.5% |
| Hard+1 | 59.5% | 65% | 61.5% | 58.5% | 48.5% | 54.5% | about 58% |
| Hard+2 | 56.5% | 54% | 49% | 60% | 43% | 51.5% | about 52.5% |
| Hard+3 | 55% | 48% | 38% | 50% | 35.5% | 47.5% | about 45.5% |
| Hard+4 | 50% | 49.5% | 34% | 45% | 32% | 38% | about 41.5% |
| Hard+5 | 44% | 46% | 31% | 38.5% | 30% | 34% | about 37.5% |
Optional puzzles were compared on 17 October 2026 against 98813a3, with
feature revision 779f4a4: 4,968 matched simulations, including all six classes
on Normal/Hard over three seed sets and sentinel checks for lengths, sizes and
Hard+1 through Hard+5. Puzzles off matched every state fingerprint; the solver
matched every recorded outcome/resource field, with zero errors or timeouts.
This was a regression comparison using 40-run standard cells, not a new win-rate
estimate; the table above remains tied to its larger recorded audit. See the
puzzle comparison, raw records and reproduction commands.
Budgeted puzzle rewards were compared on 17 October 2026 against build 6
(a1a4c43), using game/observer revision cc08b0b: 18,216 matched simulations
in 450 cells. All six classes on Normal/Hard use three seed sets and targeted
120-run standard cells; separate checks cover exploration, lengths, sizes and
Hard+1–5. All 1,440 off-mode fingerprints and 1,440 original-gold comparisons
match the baseline, with no errors or timeouts. Potion/gear policies met the
predefined aggregate, class and spread limits; choices can help or hurt a run.
These smaller samples do not replace the larger default-mode audit above. See the
reward comparison, scope, raw records and commands.
Mythic trials were compared on 18 October 2026 against build 12
(77c7159), using trial rules d403e87 and corrected Mage observer 93fe329:
32,160 final matched simulations, including 14,400 standard runs per variant
(all classes, Normal/Hard, three sets, 400 runs per class/difficulty/set).
The optional trial policy moves overall wins by +0.07 points on Normal and
−0.03 on Hard, with every class within the predeclared five-point limit and
class spread within its limit. All 1,440 declined-trial state fingerprints match.
Exploration and length/rung checks exercised rewards without errors/timeouts;
10,717 standard runs wore a Mythic. These optional bargains have costs: Mage
Hard moves −3.83 points while Druid Hard gains 3.25. The default table above
remains tied to its recorded policy. See the Mythic audit, original tuning,
observer corrections and exact records.
The hidden Spellblade has a separate 20 October 2026 audit. Across three seed sets, 1,200 runs per difficulty on eight Medium floors won 86.08% Normal and 62.92% Hard. The final Deepward rules were also measured over 1,200 runs per difficulty on sixteen floors: 80.42% Normal, 35.42% Hard. Long Hard remains more demanding for this Fire/Spellguard bot; these figures do not establish equal class strength or human win rates. The public-class rows above remain historical. Exact revisions, settings, compatibility comparisons, resources and raw records are in the Wayfarer audit.
The 21 October 2026 progression update replaces ordinary level choices with Wayfarer-only talents and lantern lessons. The selected three-set, 400-run-per-cell comparison measured 90.58% Normal / 69.75% Hard over eight floors and 80.83% Normal / 41.00% Hard over sixteen, versus v0.9.14’s 86.08% / 62.92% and 80.42% / 35.42%. The policy still makes limited use of movement and elemental combinations; these are bot results, not human forecasts. All 144 public-class state/log regression pairs matched. The first implementation’s losses, three tuning candidates and 9,566 fresh retained outcomes are documented in the progression comparison.
The following paragraphs describe earlier passes, not fresh measurements of every mode in the current checkout.
Every row was measured again in October 2026 at the end of Phase 8 (the path at level 3 and its mastery at 7, a floor's wear that carries, the capstones and the ladder as rules, cold and lightning for every class, the mage's relics, the economy's holes): Normal, Hard and the quick delve over three seed sets, 1,200 runs a class; Easy two sets of 200; the Long Delve rows 400 runs a class (600 for the three at the edges of the sixteen-floor Normal row); the ladder two sets of 100 a rung. What moved them at the end: the ranger has four more hit points on Hard (it fell on floors 5, 6 and 8 to the roads' champions, the basilisk and the Warlord, twice as often as the fighter: 55% to about 60%) and the cleric two (58.5% to about 60.5%). The sixteen-floor Normal row is the one over the six-point rule, the thief about 85% to the cleric's 77 and the ranger's 78 over three seed sets; a lighter brake on the cleric's deep prayers and a steeper deep lift for the ranger's shots moved neither by more than the bench's noise, so it stands as measured. Before that, every row was measured
in October 2026, after the legends, the named combinations, the champions' new fights and the
choices that come back two floors on had moved it all: Normal, Hard and the quick delve over three
seed sets (SEEDPFX=alt, SEEDPFX=third), 1,200 runs a class, since one set of 400 swings a class
by five points or more; Easy over two sets of 200; the Long Delve rows 400 runs a class (LEVELS=12
or 16, SEEDN=20, both sets), and 600 for a class on the edge of its row. The rule for the classes:
no two more than six points apart on any row. Before this pass they ran 7.9 points apart on Normal,
8.1 on Hard, 20 on the quick delve, 13.8 and 11.3 on the Long Delve's Hard rows and 7.8 and 6.8 on its
Normal ones.
Normal, Hard and the quick delve were measured again over the same three seed sets once the first four floors had creatures of their own (the glimmer moth, thornhog, gutter imp and goblin pikeman): Normal rose two points overall and Hard one, each row's classes within six points.
Every row but Easy and the ladder was measured again once the champions' marks changed how they fight (Phase 10). Normal, Hard, the quick delve and the twelve-floor Hard row hold within six points. The twelve-floor Normal row reads 8.5 apart, a row whose classes have read between 5.5 and 8.5 on these seeds over this work. The sixteen-floor rows stand 13 and 9.5 apart: they were 9.5 and 11 apart on the same seeds before the marks, so the gap is theirs, not the marks' (the marks first cost the cleric and ranger five points there through an Ancient champion's readier odds, since taken out, and the thief eight on twelve floors through an Armoured one's longer fights, since trimmed).
Then the sixteen-floor rows were evened out (Phase 10), and stand 5 and 4 points apart. On Normal the cleric's deep trim, meant for twelve floors, no longer applies on sixteen (75% to 84.5%), the bear's claws grow 6% a floor in the deep as the fighter's blows do (77% to 82%), and the ranger is lifted from the tenth floor with its shots growing 5% a floor (77% to 82.5%). On Hard the thief's lighter sneak blow past the sixth floor applies as it does below Hard (71.5% to 65%), and the ranger's shots grow 5% a floor there rather than 3.5% (56% to 63%). The classes changed were measured over three seed sets, 600 runs each; the rest are the row as it stood, over two.
Normal, Hard and the quick delve were measured again over the three seed sets once the genre's staples were in (Phase 10: the warband, traps under any walker, the cutpurse, the lookout, the hexer, the vault chests and their mimic, the Gallows Ring). Hard and the quick delve hold within four and a half points. Normal reads 6.5 apart over the three sets, the thief's third set at 75.8% and the fighter's first at 88.3%; a fourth set (SEEDPFX=fourth) gave the thief 82.5% and the fighter 82.8%, and over all four they stand at about 80% and 84.5%, four and a half apart, so the row stands as measured.
The ladder past Hard was measured over 200 runs a class at each rung (DIFF=hard+N SEEDN=10, both sets) at the end of Phase 8, with the three upper rungs rules rather than taxes and the bot resting beside the stairs on the third (a rest there wakes whatever is near enough to hear it): as a curve rather than a contest between the classes, about four to seven points a rung, from Hard's 62% through 58, 52.5, 45.5 and 41.5 to 37.5% at the top. A rung's overall figure is good to about two points; at this many runs a class's own figure swings by eight, so its spread is not held to the six points of the rows above. The first rung's prices and the fifth rung's lamp bite a player who buys draughts and sleeps by the lamp more than they bite the bot, which ends a run with three hundred gold and seldom lights one. A rung's overall figure is good to about two points, so the small last step is within the noise; at this many runs a class's own figure swings by eight, so its spread is not held to the six points of the rows above.
What moved them. The cleric starts with three more life on every difficulty: it began the weakest of the six (fifteen, where the rest have seventeen or more) and lost the most heroes before they chose a path. The fighter has two more on Hard, where a sixth of its heroes died before a path, and since the end of Phase 8 the cleric two and the ranger four there as well; the ranger four more on Easy and Normal. The thief, which led Normal and Hard, starts with one less, and seven more on a quick delve, where it trailed every other class by twenty points. There the lesser lich has less life still (a fifth of its sort's), strikes six steps less surely, and raises one of the dead at a time, not two; the quick delve is now a gentle one, nineteen in twenty, as befits a quarter of an hour. On the Long Delve below Hard a cleric's prayers and blows are a tenth weaker past the sixth floor (it won 92% of twelve floors); on Hard its spells grow 4% a floor in the deep, not 6%, the fighter's blows 6% and the ranger's shots 3.5%, the bear's claws 5% on sixteen floors; and on sixteen Normal floors the fighter's blows grow 6% a floor past the tenth, the ranger's 3.5% past the twelfth. The paragraphs below are the history before this pass.
Every row is played on Medium floors. Small and Large were measured on eight Normal floors, both
seed sets (SIZE=small|large), with the floors as they now are: a large floor holds about a third
more locks, traps and hidden rooms and half again as many encounters (three a floor at most), its corridors wander and turn
as often as a medium floor's, and a long straight one has a recess cut in its side; a small floor
has a lesser great hall, two loops at least, and fewer locks and traps. Medium floors come out
square for square as they were, so its row stands:
| Floor size, Normal | Cleric | Fighter | Mage | Thief | Ranger | Druid | Overall | Kills | Level at the end |
|---|---|---|---|---|---|---|---|---|---|
| Small (28 squares a side) | 77.5% | 78% | 79% | 76% | 79.5% | 74% | about 77% | 34 | 7.5 |
| Medium (36) | 79% | 80% | 80.5% | 83% | 79% | 80% | about 80% | 50 | 8.1 |
| Large (44) | 76.5% | 83% | 80.5% | 82% | 81% | 78% | about 80% | 66 | 8.6 |
The fighter, then the lowest on Normal at every size (75.5% on Medium, measured again the same day, 70% on Small), now starts with three more hit points on Easy and Normal, as the thief, the ranger and the druid do on every difficulty: 80% on Medium, 78% on Small, 83% on Large, 84.5% and 77.5% on twelve and sixteen floors, and the quick delve as it was (83.5%, 84.5% before). Not on Hard, where it ran level with the rest (58.5%) and the same three took it to 68.5%. It still dies more often than the others with healing draughts unused: what kills it comes in one heavy blow more than a long fight.
A small floor first had fewer hidden rooms and encounters too, by its floor space: it came to 71.5%, its heroes a third of a level lower again, so it keeps the middle size's (with fewer encounters only 75%, with fewer hidden rooms only 73%). Before any of this, Small was about 77% and Large about 80%, Large with the classes spread from 70% (the fighter) to 87.5% (the ranger); now 76.5% to 82%. That spread was not the long straight corridors it looked to be: a large floor has no more long sightlines for its floor space than a medium one (about three lines of nine squares or more to a hundred squares of floor, on both), and its longest corridors were no longer than a medium floor's.
With the bot mended, two levers were moved, each measured on both seed sets. The mage's spells on a Hard Long Delve of twelve floors grow 4% a floor past the sixth, not 6% (the mage 68% before, 63% after; sixteen floors keep 6%, where two peoples ride spells out). And a sixteen-floor delve, which goes four floors deeper than any other, now lifts its heroes below the twelfth floor on every difficulty, as Hard already did from the seventh: spells and a cleric's blows 6% a floor, a fighter's blows and a druid's 4%. On Normal the casters had died there where the thief did not (the mage 66%, the druid 63%, the thief 86%); after it the cleric won 81% (74% before), the mage 73% (66%), the fighter 73% (70%) and the druid 70.5% (63%).
The Cleric, Mage and Druid columns were measured again, both seed sets, after a fault in the bot was found: a caster with a bolt to spend would aim it at a mimic still shut, which the game will not take as a mark, and stood casting at it until the run ran out of time. A run that times out counts as a loss, and it had happened in one mage run in eight on a Long Delve (24 of 200), a few on eight floors and on sixteen, and now and then to the druid and the cleric. With the mimic left alone the mage on the Long Delve is among the strongest classes there, not one of the weakest: 68% on Hard and 83.5% on Normal where the table had 62% and 72%. Part of each move is also drift since those rows were last taken; the fighter, thief and ranger, who never cast a bolt, were not played again.
The sixteen-floor rows are new, both seed sets, measured once the delve passed three peoples: the
lizardfolk's Sunless Marsh on the fifth floor (warriors whose tail sweep knocks a hero flat, shamans
who mend them and call lightning into the water that stands in every room, and Hissra, the
Marsh-Mother), the grey dwarves' Grey Hold on the eleventh (stout now: poison never takes on them,
and they ride out a spell more often), and the dark elves on the fourteenth. On Hard the fighter
went from 53.5% (before the marsh, on the first set) to 49.5%. On Hard the spread across the classes is eight. The bot now steps back from a grey dwarf grown to twice its
height whenever a square is open (NOROOM=1 stands its ground): it made no difference worth the
name, the fighter 50.25% with it and 51.25% without, the mage (before the mimic was mended) 47.25%
and 46.25%.
Renown (a rank every 1500 experience past level 12, each a small gain) left the rows as they
were. The top level comes late: in a sixteen-floor delve on Normal the bot's heroes reach it on the
fifteenth floor or so (two in three fighters, eight in ten mages), with some 5,000 experience over by
the end, so a hero takes about three ranks, nearly all on the last floors. On the second seed set, 50
runs each, the fighter won 68% before and after and the mage 86% before and after. On twelve floors no
hero reaches the top level (the fighter ends at 9.8 on average), so renown is a sixteen-floor thing.
DETAIL=1 prints, for each class, how many runs reached the top level, on which floor, the experience
over, and the ranks taken.
The thief on sixteen floors on Normal was the outlier, 88% and 87% on the two seed sets (87.5%) where the classes together won 77.5%, and the Assassin five to eight points over the Trickster. Past the sixth floor of sixteen, on Normal or Easy, a sneak blow is now one less: 84% and 85.5% (84.75%), the two paths within a few points of each other. From the thirteenth floor only, the same trim was worth one point. A thief with no talent, path or relic to add to it strikes there as any blow does, and the log no longer calls it a sneak blow; holding the sneak blow at a double there undid the trim (87.75%), so it stays.
And from the other end: the fighter, the mage and the druid on sixteen floors on Normal, measured again on both seed sets at 200 runs each, won 72.25%, 74.5% and 71%. The deep's lift (spells 6% a floor, a fighter's blows and a druid's 4%) now begins for those three past the tenth floor rather than the twelfth: 75%, 77.5% and 75%. The spread across the classes there went from fourteen points to ten.
The bot dies now and then with healing draughts still in its pack, four or six or ten of them, and it looked as if it drank too late: it drinks below 35% of its life. Two rules that drank sooner were tried on the same seeds, 200 runs each on eight Normal floors. Drinking at half its life whenever it carried three, and while the worst blow taken on the floor could kill it: the cleric fell from 80% to 77%, the fighter from 80% to 73%. Only the second: 77% and 76.5%. A draught drunk with a foe beside it is a turn not spent finishing it, and the deaths with full packs are mostly a hero held (flat on the floor, stone, frozen) or taken from a third of their life in one blow. The old rule stands, and the rows above with it.
Measured again with the old rule, the thief, the ranger and the druid were left behind on eight Normal floors (77.25%, 73% and 73.75%, both seed sets, 200 runs each), and the thief on two floors most of all (62.25%, where every other class won 87% or more; the Dread Lich killed nearly all of them, at hero levels two to six, often with draughts in the pack). Now the thief sets out with a second healing draught (as a ranger does) and three more hit points, and its smoke holds the lich and the Goblin Warlord, who see through it, for most of two seconds rather than a moment; the ranger sets out with three more hit points; the druid with three more, and its spell points at the full measure (0.85 of it before). Eight Normal floors: thief 83.5%, ranger 76%, druid 82.25%; eight Hard floors: 60.75% (from 57.75%), 64.5% (from 60.5%), 57.5% (from 54.25%); two floors, the thief 71.75%. The druid's Long Delve rows are one seed set (86%, 67.5%, 78%, 56%). The thief's and the ranger's few more hit points at the start barely touch a long delve (the thief on sixteen Normal floors, 84%, as it was), so their Long Delve rows stand. Six more hit points for the thief put it at 86.5% on eight Normal floors: too much. The ranger stays the lowest on Normal: more hit points lifted Hard more than Normal.
Then, both seed sets throughout: the druid on twelve floors, measured again, 85.25% on Normal and 63.25% on Hard, near the top but not over it. The ranger's Steady Aim is +2 from three squares off on a delve of eight floors or fewer on Normal or Easy (+2 from two squares took it to 85.75%, the pack then rating bows the higher and the bot holding them). The thief's smoke now breaks off what the lich or the Warlord was drawing back (not the rite): worth a point on two floors, 72.75%, within the noise; the lich at the end of a short delve is simply more than a thief of level three or four can outlast. With the three lifts Normal on eight floors had come to 82% and Hard to 60%, so the shorter delves' creatures are sturdier again, a ninth on Normal (1.04 before) and a twentieth on Hard; the Long Delve, whose rows had not moved, keeps its own. All six classes measured again with all of it: the eight-floor and two-floor rows above, Normal about 79% and Hard about 59.5%. The fighter is now the lowest on Normal, at 74.25%.
The Normal, Hard and Long Delve rows were measured again, both seed sets, with the commit before played on the same seeds, after saving throws went both ways: a foe can ride out a spell that fills its square or its corridor (three quarters of it) or tear free of Entangle sooner, and the hero saves against a wraith's grave-cold, an emberling's flare and lightning through the water. Plain, the saves cost the bot's mage ten points on Hard (a goblin pack lived through Burning Hands at the first level; the lich and the Warlord saved nearly half the time) and the druid eight (held half as long, a foe under Entangle was loose before the druid had mended). So the blasts hit two or three harder than before, Call Lightning (at one foe only) is never saved against, and a foe that saves against Entangle is held two thirds as long, never less than a boss. Overall, eight floors on Hard went from 56.9% to 55.9%, on Normal from 76.9% to 79.1%; the Long Delve on Hard from 60.6% to 60.2%, on Normal from 78.8% to 79.2%. The druid on the Long Delve on Hard came down from 61% to 54%, but its 61% was one seed set at 65% (the commit before that played it at 57%), and 54% is where that row has sat before.
Fresh seeds bore the druid's drop out (57% before, 55.5% after, on two sets it had never played), so Entangle now holds for three and a half seconds rather than three, and Insect Plague bites five over its dice rather than three. The Druid column is that build, two seed sets of 200 a row, with the delve before the saves played on the same seeds: eight floors on Hard 54% (53% before), on Normal 73% (74%); the Long Delve on Normal 76% (79%, its two sets ten points apart), and on Hard, over four sets, 60% (61.5%).
The Long Delve on Hard was measured again, both seed sets, with the commit before played on the same seeds, after spells came to slide off the dark elves (a warrior one time in five, a mage one in four, Vaelith one in three) and a renegade dark elf could be hired two floors above their halls: the mage 58% before and 57% after, the cleric 65% and 68%, the fighter 56% and 62% (the renegade at its side, where no hound was). The druid lost three or four points on both sets while Entangle's roots slid off as well; with the roots exempt, over four seed sets, it won 56.1% before and 56.5% after. A sixteen-floor delve, which now passes through the grey dwarves' hold on its eleventh floor, was played on one set before and after: the fighter 49% and 53.5%, the mage 39.5% and 43.5%, a few more of them falling in the hold and fewer two floors below it.
Both Long Delve rows were measured again, both seed sets, with the commit before them played on the same seeds, after the tenth floor of twelve became the dark elves' country (their warriors and mages, and Vaelith, their High Priestess). On Hard the delve won 60.9% before and 60.6% after, every class within four points of where it was; on Normal 77.0% before and 78.8% after. The first warriors were quicker, surer and harder-hitting, and killed one thief in six who reached their floor on one seed set; at Wraith-like numbers (and a guard that answers a blow struck into it) the floor kills about as many as the floor it replaced.
The Normal and Hard rows were measured again, both seed sets, after the two roads came to build their own floors (the Crypts cut in niches and galleries, the Warrens dug in burrows) and the last floor its own hall. A lich asleep at the far end of a long hall was walked up to and struck before it woke, and almost no one died on the last floor; now it wakes as a hero sets foot in its hall, and one of the floor's creatures stands guard in the nave (two killed one druid in six who reached the hall). The last floor now takes about one hero in ten who reach it, as it did before. The new floors are a little harder on the way down, more creatures reaching the hero at once in the bigger rooms, and a floor holds about a tenth fewer for it. Normal sits at about 77% (back in the band it was tuned to before it drifted up to 82%), Hard at about 57%; the ranger and the druid trail on Normal, at 73% and 74%.
The Normal and Hard rows were measured again after the floors were built anew (rooms of many
shapes, corridors that loop, a set piece on every floor), 200 runs a class on each of the two
seed sets (SEEDN=20, then SEEDPFX=alt). A floor holds about as many creatures and finds as
before, counted by the floor its rooms cover rather than by how many there are. Normal moved by
about a point and Hard by about two. On the same seeds the old floors gave the cleric 85%, the
thief 78.5% and the druid 81%, so the cleric and the thief are within noise. The druid's drop of
about four points is not certain at 400 runs, and its wolf falls more often in the bigger rooms.
The Long Delve and quick delve rows were not measured again.
The quick delve row is one seed set, 200 runs a class (LEVELS=2 SEEDN=20). Two floors at the
pace of eight brought heroes to the lich at the second or third level, and half of them died
there. So on a quick delve the hero learns three times as fast. The lich has three tenths of its
life and strikes four steps less surely, and one skeleton guards its rite in place of a wraith.
That makes it kinder than eight floors, as a short game should be. The thief trails: at the
fourth or fifth level its daggers are short against the lich. With heroes learning only twice as
fast and the wraith still called, it won 58.5% and the mage 92.5%. On Hard the thief wins 68%.
Every row but Easy was measured again, both seed sets, after the Long Delve got a keeper of its own (the Heartforged), three more things to meet on the deep floors, the Cinder Ring and a healer to meet on the middle floors. Eight floors came up a point or two, the healer most of it. On the Long Delve the Heartforged first cost the casters five or six points against the old keepers, and two things were wrong, neither of them its numbers. Its stamp left its lines burning for longer than the opening it gave, so taking the opening meant standing in fire; the fire now goes out in a moment. And the bot's Pyromancer cast Burning Hands at it and its embers, which shrug off fire, where a player turns to the cold. Taught to reach for what hurts a thing most, the bot's mage jumped on Hard by about eight points: on eight floors too, its Frostweaver had been casting cold at the lich, which shrugs that off. The mage's second spell point drawn back from each kill on Hard and in the Long Delve had been added to make up for a mage that was only being played badly, and has gone: a mage draws back one everywhere. On eight floors of Hard it still leads, at 64% (59.5% and 68.8% on the two sets), five points over the rest; the druid's 55.5% on the Long Delve on Hard is 64% and 47% on the two sets, as it was before this batch.
The Normal and Hard rows were measured again, both seed sets, after the middle floors grew stranger (mimics, kobold trappers and their snares, floors of tremors, the Lever Door and the Lost Mule) and the sellsword came to be hired there. Normal barely moved; Hard came down about two points, the cleric most (61% to 55%), and every class is still within six points of the high fifties. The Long Delve rows were measured again after it too (Hard on both seed sets, Normal on one): both came down a few points, the Long Delve on Hard from about 63% to 58%, level with the eight floors. The druid was lowest there, at 53.5%.
Both Hard rows were measured again, both seed sets, after the deep floors came alive (smouldering floors and their emberlings, the Forge-Spirit), the druid's bear's claws came to grow with the deep floors of a Long Delve on Hard as a fighter's blows do, and the sellsword took a whetstone, a wage below the eighth floor and a cut that breaks a boss's rite. On the Long Delve the druid came up from about 50% (with the deep floors in, before its claws grew) to 58%, and every class there is within 56% to 62%. On eight floors Hard barely moved, but for the fighter, down from 56% to 53% (47.5% and 59% on the two seed sets): lowest, and still inside the six points. Played again on the commit before these changes it won 54.8% (50.5% and 59%), so the deep floors are not what took it down: it had drifted there before. Its blows now grow on an eight-floor Hard delve from the sixth floor, 4% a floor past the fifth, as they do in the deep of a Long Delve: 57.5% over both seed sets (53.5% and 61.5%; 7% a floor gave 62%), level with the rest.
The Normal row (both seed sets) and the Long Delve on Normal (one set) were measured after it too: Normal about 80%, every class within 78.5% to 83%; the Long Delve on Normal about 81%, on both seed sets now, every class within 79% to 84%. (One set alone had the ranger at 75.5% and the druid at 86.5%; the second set put them at 82.5% and 82%.)
The ranger's two paths were far apart on Hard, the Sharpshooter winning about 60% to the Warden's 74% over two seed sets. More damage at range did not close it (61% either way); staying out of reach did: a Sharpshooter's snare now holds a second and a half longer, and it wins about 67% (a point of armour instead gave 68%, both 67%), the ranger 63% on Hard, 80% on Normal and 64% on the Long Delve on Hard (62% and 66.5%; it was 58%), measured again after.
On one seed set the Long Delve on Hard looked wide (the fighter 69%, the ranger 53%); the second set brought the fighter back to the others, but the ranger was the lowest on both (53% and 56%), a few points short of the rest on the deep floors. Its shots and blows now grow 2% a floor there from the seventh, half the fighter's: 57% and 60% on the two sets (3% gave 56% and 65%, noisier and no surer). The Sharpshooter still trails the Warden there, about 58% to 72%.
The Druid's Normal and Hard rows are 400 runs each, two seed sets of 200 (SEEDN=20); its Easy
and Long Delve Normal rows are one set of 200, its Long Delve Hard row two. The overall figures are the first five classes'. Its bear
was far too strong at first (96% on Normal, 85% on Hard): a thinner hide, a dearer spell and fewer
spell points brought it into line. The Grovewarden once leaned on a companion that a third of
runs do not keep, and trailed the Shapeshifter on Hard by over twenty points; its skin now takes
the bark's grain (2 better armour class, companion or none). Once the bot also roots foes with
Entangle, the two paths are within a few points of each other on Normal and Hard (on Hard about
72% and 76%). The wolf that meets a druid in a delve with no hound was measured after: it
leaves the Druid where it was (Normal about 82%, Hard about 64%).
Hard's aim is the high fifties, and every class lands within about six points of it: the fighter lowest, the cleric and the thief highest. (The Normal and Hard rows were measured again, both seed sets, after the dungeon began to answer the elements and goblins took to throwing fire. The cleric had slipped to 53% on Hard; its prayers now take 0.85 seconds, not a second, which brings it back to 58% (a d10 hit die, tried instead, overshot to 63%). The mage, whose Pyromancer now reaches three squares with Burning Hands for a point more, is where it was. Every row was measured again after that; the Hard and Long Delve Hard rows last, with the scenes laid out for fire, the wraith's grave-cold and the acolyte's lightning, which moved no class beyond the noise.) Oils, charms, capstones and traders' jobs lifted it to about 61%, and its creatures were made a little sturdier (1.9 times as drawn, not 1.8) to bring it back; the bot uses every one of those tools, which a player will not always, so it was brought back to where it stood before them rather than to half. (It was once tuned to 42%, and later to about half.)
The Long Delve on Hard is where the classes spread widest. The casters used to die on its deep floors (8 to 12), winning 33% and 34%; since spells strike and heal harder there, floor by floor, and a cleric's blows with them, they sit with the rest. The thief keeps its lead however the back half is made harder (tried: the lich's growth, when the deep floors turn surer, how much sturdier they get, capping the thief's dodge). The ranger's figure is the noisiest: seed sets have given it anything from 37% to 62%. It trailed at about 43% until the deep floors got monsters of their own (the blink hound, the quillback and the cave wyrm), whose tricks a bow answers well; over three seed sets it now wins about 49% with no help, and giving its blows the fighter's growth as well (2% or 4% a floor) put it near 55%, past the rest then, so it had none (once the rest rose past it, it was given half the fighter's; see above). The fighter trailed there at 37%, with no spell to grow with the floors, until a fighter's blows grew 4% a floor from the seventh, as a spell does 6%. Measured again with capstones, oils, charms, jobs, the Warlord and Hard's sturdier creatures, the fighter and the ranger lead there and the thief trails, all within about seven points.
The hound (floor 2, on about two seeds in three; the bot always takes it) is worth three or four points everywhere: without it the same build wins about 74% on Normal, 51% on Hard, 74% and 53% on the Long Delve. Most of that is the early floors, where it takes blows meant for the hero; a thinner hound that fell in most runs gave nearly as much, so it is kept worth having rather than worn down to nothing.
Answering monster tricks decides runs: a warned blow lands whatever your armour, so a bot that
ignores every warning (NOREACT=1) wins roughly twenty to thirty points less on Normal.
Clearing each floor first (EXPLORE=0.8) is the slower, safer road: on Normal it wins about
84% as a cleric, 90% as a fighter, 86% as a thief, and 70% as a mage. About one hero in twelve
who reaches the last floor on Normal dies there, about half of them to the lich itself (LICH=1
breaks it down). It used to be fewer than one in thirty to the lich, the rest to the floor's
ordinary creatures on the way; now the lich hits surer and harder than its floor, and its floor
holds a quarter fewer of the rest, so the last fight is the lich and the win rates held. A fallen hero's shade
(SHADE=4 plants one on floor 4) kills about one in a hundred of the heroes who meet it, and win
rates barely move: it is a hard fight for gear worth having, not a trap. Gold carried past the last trader, and found on the
last floor, buys a ward or a blessing at the vigil lamp beside the lich's hall. Backgrounds are
rotated across runs so the figures are not one perk repeated. DODGE=1 has the bot step back from
every ordinary blow, as a twitchy player does, and DODGE=2 steps aside from the monsters that lunge;
stepping back still pays, but no longer beats everything. The bot is a steady player, not a
great one: it does not step back from ordinary blows, so a careful human does better.
The bot is a mediocre player, so a human should do considerably better; the mage trails on Hard mostly because the bot kites badly, which is exactly what a mage lives on. The test suite guards the arithmetic that matters: the boss fight must be winnable by a level 8 fighter in chain mail with a plain long sword, with a 25% margin, and every class must have a weapon that reaches at range.
Flat damage bonuses from strength and experience scale with how long a weapon takes to swing, so melee arms land within a couple of points of each other on damage per second rather than the fastest weapon always winning. Missile weapons sit deliberately below them, paying for reach. Thieves are the exception: their bonus comes from dexterity and ignores swing weight, which is what finesse means. A ranger's Steady Aim (+1 two squares off) is for bows and slings only, and the pack's figure counts it: it used to come with throwing knives too, so the bot (and the pack's comparison) chose knives, and a ranger that really held a bow on its long reach with the old +2 won about 64% on Hard against the others' 57 to 59.
| Action | Touch | Keyboard |
|---|---|---|
| Step forward / back | ▲ / ▼ (hold to keep walking) | W / S or arrows |
| Turn left / right | ↶ / ↷ | A / D |
| Sidestep | ◀ / ▶ | Q / E |
| Attack the square ahead | Attack | Space or F |
| Use (doors, stairs, pick up, search wall, drink, break a barrel) | Use or tap the view | U |
| Turn or step by gesture | swipe the view | |
| Cast the last spell, or the class's own move (Bash, Smoke, Snare) | the button under Use | C |
| Rest | Rest | R |
| Drink a healing potion | the bottle by the life bar | X |
| Read a scroll worth reading now | the scroll at the end of the log | Z |
| Map, Pack, Spells, Hero, Journal | bottom bar | M, I, P, H, J |
| Menu / close | Menu, or the phone's back gesture | Esc |
Walking into doors opens them, walking into locked doors uses a matching key, and walking into a staircase takes it.
index.html app shell, loads one module
css/style.css mobile-first styles
js/rng.js seeded PRNG
js/data.js classes, items, monsters, spells, themes, pixel art
js/assets.js procedural textures and queued creature sprites; elite tints cached on first use
js/walldecor.js moss, roots, skulls and rings on a theme's walls
js/creatures.js the creatures built from lit parts, their poses, the one list of them
js/folk.js the later creatures: traders, companions, the peoples below, deep beasts
js/parts.js the parts and the kits creatures share
js/painter.js parts to lit pixels, reusing polygon crossings per row and material ramps per part
js/props.js the encounters' props
js/champions.js named champions, a shade's gear, the heroes' portraits
js/dungeon.js level generator
js/renderer.js canvas raycaster
js/spellfx.js spells, scrolls, drinks and traps over the view
js/sound.js WebAudio sound effects
js/music.js music composed as it plays, following the fight
js/mythics.js, mythicdata.js optional Vigil trial, class Mythics and their tradeoffs
js/namedart.js individual legendary and relic pictures, shared by item views and held gear
js/bestiaryart.js painted creature portraits, with sprite fallbacks
js/heroart.js hero fallback faces matching the painted class portraits
js/creatureidentity.js cached sprite anatomy and equipment aligned to paintings
js/release.js release and stamped commit for the title footer and reports
stamp-commit.cjs stamp the deployed Git commit into the static page
js/regionart.js regional wall courses, paving and door materials, baked into textures
js/regionalprops.js regional pictures for existing scenery, without changing placement
js/arcanefx.js force, nature, holy and restorative spell effects, including Calm view
js/recording.js bounded action/timing records and deterministic replay
js/replaycontrols.js, replayview.js, replay.html isolated end-screen replay viewer
js/narration.js, storyvoice.js recorded readings and their story cues
js/game.js rules and state; combat, items, powers, pacing, saving and more in their own modules
js/puzzles.js optional seeded treasure catches; clues in puzzledata.js and controls in puzzleview.js
js/savecheck.js validation before local saves and shared codes become game state
js/foes.js monsters: waking, moving, striking, signature moves, the lich, champions
js/ui.js screens, overlays, touch and keyboard input
js/titlescene.js, shopview.js, choices.js, pack.js, mapview.js, herosheet.js, endscreen.js overlays split from ui.js
js/telemetry.js opt-in reports
api/ the reports' Vercel functions
dashboard.html real players' win rates beside the bot's
js/daily.js the Daily Delve: the day's hero, the one try, the streak
js/main.js entry point, game loop, debug surface
js/types.js JSDoc shapes for the type checker
js/offline.js title offline readiness, reconnect and worker status
sw.js core-first offline cache and resumable voice downloads
manifest.json PWA manifest
vercel.json Vercel headers
test/harness.js loads the game's modules into Node
test/run.js generator, sprite and balance checks
test/api.js the report functions' checks
test/security.js hostile imports, gzip expansion and local-server file boundaries
test/rules.js rule-level regression checks
test/playtest.js balance simulations across classes, paths, seeds and difficulties
docs/balance/ versioned audits, exact outcomes and reproduction tools
test/replay.js reproduce and verify a local recording through the bot harness
test/browser/ Playwright suites
test/server.js dependency-free static server with media byte-range support
CLAUDE.md source instructions for repository contributors and coding agents
AGENTS.md generated copy of the repository instructions
tools/agent-docs.mjs generates and checks AGENTS.md
tools/check-art.mjs verifies reviewed source/export hashes and offline art coverage
art/review.json dated review of painted art and its current file hashes
art/identity.json identifying traits reviewed for every bestiary entry and class
art/creatures/ATLAS-BRIEFS.md dungeon atlas briefs, batches and live inventory
art/creatures/ATLAS-ROADMAP.md E–V art delivery status, remaining refinements and W/X audits
art/creatures/generation-batch-a.json Batch A prompts, references and registration for art review
art/creatures/generation-batch-b.json Batch B originals, repairs and measured review registration
art/creatures/generation-batch-c.json Batch C sources, keeper/mimic variants and selected repairs
art/creatures/generation-batch-d.json Shade/champion sources, repairs and torso registration
art/creatures/generation-batch-e.json class Shade sources, selected repairs and review registration
art/creatures/generation-batch-f.json companion sources, step repairs, rest poses and Mender heal extension
art/creatures/generation-batch-g.json barrel Mimic sources, rocking repair and registration
art/creatures/batch-a-preview/ reviewed nine-pose atlases, contact sheets and phone dungeon captures
art/creatures/batch-d-preview/ champion atlases, phone captures and local validation results
art/portraits/export.py exports current class/keeper overrides, retaining original PNGs
art/bestiary/overrides/ individual corrected paintings, preserved across re-exports
Fifty-three creature identities now use painted dungeon poses, including Batch A's Rat,
Bat, Spider, Goblin, Skeleton, Zombie, Orc, Ghoul, Wraith and Ogre. Their atlases
are cached for offline play; named champions retain their own identities.
Reproduce Batch A's review and shipped exports with
python3 art/creatures/export-batch-a.py --check (Pillow, NumPy and SciPy).
Capture the integrated dungeon artwork at 390px and 320px with
node art/creatures/preview-batch-a.cjs after npm ci; this uses system Chromium
at /usr/bin/chromium, overridable with CHROMIUM_PATH, and the real runtime
loader. Captures include corrected walking, hurt and blink frames. Correction
sheets replace only named cells in the manifest, preserving other original poses.
See the Batch A review for provenance
and repairs.
Batch B's Troll through Goblin Cutpurse have preserved review sources and atlases.
Use python3 art/creatures/export-batch-b.py --check to reproduce the ten
nine-pose sheets, neutral contact sheet, walking/action comparisons and measured
registration. node art/creatures/preview-batch-b.cjs captures existing supported
poses at 390px and 320px through the real runtime loader and shipped images.
All ten are integrated and cached offline. Review files stay under
art/creatures/batch-b-preview/. See the review.
Batch C covers Lookout through the three keepers. Reproduce its exports with
python3 art/creatures/export-batch-c.py --check and capture supported poses with
node art/creatures/preview-batch-c.cjs. Chest Mimics use painted art only after
revelation. G/H now supply barrel and keeper-state paintings through the same
native loader; concealment and phase rules are unchanged.
Batch D covers the default knight Shade and nine named champions. Reproduce its
ten atlases and neutral/walking/action sheets with
python3 art/creatures/export-batch-d.py --check; capture the integrated dungeon
poses at both phone widths with node art/creatures/preview-batch-d.cjs.
Shade and Orla register their floating torsos. Non-fighter fallen heroes retain
their procedural class gear throughout loading. Existing supported poses and
special fallbacks remain unchanged. See the Batch D review
and local checks.
The E–T paragraphs below document source production and historical preview harnesses. The approved gameplay exports are now integrated in release 0.9.33; use the runtime delivery review for current bindings, offline evidence and exceptions.
Batch E has six class-specific Shade review atlases, with Mage/Ranger skeletal
repairs and measured floating torso anchors. Reproduce them with
python3 art/creatures/export-batch-e.py --check; capture substituted review
draws with node art/creatures/preview-batch-e.cjs. These are preview assets,
not shipped runtime bindings. See the review.
Batch F adds six companion review atlases and a separate Mender healing frame.
The seventh atlas cell is explicitly sit, preserving each companion's command/rest
pose. Reproduce with python3 art/creatures/export-batch-f.py --check; capture
live-pose review substitutions with node art/creatures/preview-batch-f.cjs.
These are preview assets with no runtime/offline integration. See
the review.
Batch G adds a barrel/default Mimic review atlas. Reproduce it with
python3 art/creatures/export-batch-g.py --check; capture supported poses and
check existing concealment/variant guards with node art/creatures/preview-batch-g.cjs.
The legacy barrel anatomy and active chest-shaped fallback are captured separately
by node art/creatures/reference-batch-g.cjs. This is preview artwork with no
runtime/offline integration; special and blink cells remain reserves. See
the review.
Batch H adds four boss-variant review atlases: open and white-hot Heartforged,
seated spear Warlord and standing spear Warlord. Existing Lich casting and Warlord
frenzy art are reused. Reproduce with python3 art/creatures/export-batch-h.py --check;
capture frozen phone previews with node art/creatures/preview-batch-h.cjs.
See review and state audit.
Runtime integration remains pending; these sources and reviews are published separately.
Batch I adds three static trader review figures in one sheet: Merchant, Wick and
Pedlar, revised to match the existing monster paintings with weathered faces,
muted colours and worn materials. Reproduce the active references with node art/creatures/reference-batch-i.cjs,
exports with python3 art/creatures/export-batch-i.py --check, and phone previews
with node art/creatures/preview-batch-i.cjs. These are static review assets;
source/review assets are published separately; runtime integration remains pending. See review.
Batch J adds 14 static encounter compositions plus three reused Batch F recruitment
rest cells, with authored scene crops and floating anchors. Reproduce references
with node art/creatures/reference-batch-j.cjs, exports with
python3 art/creatures/export-batch-j.py --check, and phone world/card previews
with node art/creatures/preview-batch-j.cjs. See review.
The historical source harness uses substitutions; current runtime delivery is recorded above.
Batch K adds the remaining 25 static prop review figures: 24 roadmap objects plus
the existing collapsed-bones heap. Reproduce references with
node art/creatures/reference-batch-k.cjs, exports with
python3 art/creatures/export-batch-k.py --check, and phone world/card previews
with node art/creatures/preview-batch-k.cjs. See review.
The historical source harness uses substitutions; current runtime delivery is recorded above.
Batch L adds eleven ordinary room-dressing review paintings across three sources,
with static scene anchors and sixty near/far phone captures, including concealed
Mimics and puzzle chests. Reproduce references with
node art/creatures/reference-batch-l.cjs, exports with
python3 art/creatures/export-batch-l.py --check, and previews with
node art/creatures/preview-batch-l.cjs. See review.
The historical source harness uses substitutions; current runtime delivery is recorded above.
Existing smashable containers, oil cues and regional aliases retain their rules.
Batch M adds five regional dressing paintings in two source groups, with 44 phone
review captures across eleven regional theme mappings. Reproduce references with
node art/creatures/reference-batch-m.cjs, exports with
python3 art/creatures/export-batch-m.py --check, and previews with
node art/creatures/preview-batch-m.cjs. See review.
Saved dressing kinds, sizes and fallen-rubble bypass remain unchanged.
The historical source harness uses substitutions; current runtime delivery is recorded above.
Batch N adds four low remains paintings and one atlas, with 24 phone review
captures and 56 reveal/expiry selection checks. Reproduce references with
node art/creatures/reference-batch-n.cjs, exports with
python3 art/creatures/export-batch-n.py --check, and previews with
node art/creatures/preview-batch-n.cjs. See review.
Caller selection, durations, coordinates and floor ordering remain unchanged.
The historical source harness uses substitutions; current runtime delivery is recorded above.
Batch O’s baseline material pass adds 39 native 64px wall/floor/ceiling tiles across
thirteen themes, with detail/repeat panels and 52 controlled phone captures.
Reproduce references with node art/creatures/reference-batch-o.cjs, exports with
python3 art/creatures/export-batch-o.py --check, and previews with
node art/creatures/preview-batch-o.cjs. See review
and format/architecture audit.
The historical source harness uses substitutions; current runtime delivery is recorded above.
Existing state-bearing architecture/secondary variants remain procedural; repeat,
native offline/fallback and performance integration gates are documented.
Batch P audits 95 ordinary item pictures and adds seven regional inventory sources
(six live base keys plus a reserve Tooth Charm fang), with two separate Fighter/
Cleric Rune-Cut Shield rear views. 56 phone captures, 36 fitting checks and 12 existing
held-equipment browser checks pass. Reproduce references with
node art/creatures/reference-batch-p.cjs, exports with
python3 art/creatures/export-batch-p.py --check, and previews with
node art/creatures/preview-batch-p.cjs. See review
and caller/motion audit.
Source/review assets are published; runtime integration remains pending.
The live carried-shield gap remains unfixed; seeded/named Tooth art stays unchanged.
Review this README with every change and update affected features, controls, setup, commands, tests, layout and measured balance results in the same commit. This requirement also lives in the agent instructions.
Edit CLAUDE.md when contributor guidance changes, then run npm run docs:agents to
regenerate AGENTS.md. npm run check:agents, also part of npm test, CI and the pre-push
hook, rejects a missing or outdated generated copy.
MIT. See LICENSE.
The six public hero portraits use the approved 19 October refinement, with source crops and provenance in art/portraits/refined/ and art/portraits/SOURCES.md. The hidden Spellblade has its own approved epic source and square adaptation recorded in art/portraits/generation.json.
Batch Q adds three static world effects and eight fire/frost impact phases as
local source/review artwork. See review
and state/format audit. Reproduce
with python3 art/creatures/export-batch-q.py --check; phone review uses
node art/creatures/preview-batch-q.cjs. Calm, poison and triggered traps stay
procedural. Source/review assets are published; runtime integration remains pending.
Batch R adds eight baseline architecture sources with native64/detail256 reviews,
68 frozen phone captures and eight native architecture browser checks. See
review. Export with
python3 art/creatures/export-batch-r.py --check; preview with
node art/creatures/preview-batch-r.cjs. The painted arch remains a candidate:
previews retain the exact original opening and five-colour lock bindings. Regional
material matching and runtime integration remain pending; source/review assets are published.
Batch S adds20 baseline secondary material/detail cells (floors, roofs, wall/rock
variants, fountain states and torch frames). See
review and
state/format audit. Reproduce with
python3 art/creatures/export-batch-s.py --check and
node art/creatures/preview-batch-s.cjs.84 frozen captures,144 shade levels and
six native regional browser tests pass. Source/review assets are published; repeat joins, regional matching
and runtime integration remain pending.
Batch T adds16 baseline held frames for Fighter longsword, Mage staff and Ranger
longbow. See review and
state audit. Reproduce with
python3 art/creatures/export-batch-t.py --check and
node art/creatures/preview-batch-t.cjs.54 frozen captures,162 fitting/release
cases and12 native held-equipment browser tests pass. Remaining weapon/class
coverage and runtime integration remain pending; source/review assets are published.
Batch U completes a portrait reuse audit: all seven existing approved portraits
are retained; no new painting or shipped replacement is needed. See
review and
inventory.42 native UI captures/
downloads and32 existing browser checks cover phone selection, hidden Wayfarer,
story/sheet/ending/share and seven-portrait offline reload. Reproduce audit sheets
with python3 art/creatures/export-batch-u.py --check and captures with
node art/creatures/preview-batch-u.cjs. Audit evidence is included with runtime release 0.9.33;
these existing portraits already use the runtime/offline pipeline.
Batch V audits interface art in the existing pack, details, journal, bestiary,
relic, shop and status layouts. It retains shared CSS frames, scalable control
icons and existing approved images; no new painting or runtime edit is needed
in the reviewed states. See the review
and inventory. Reproduce captures
with node art/creatures/preview-batch-v.cjs. Audit evidence is included with runtime release 0.9.33.
The approved E–T gameplay paintings now load in the game: class Shades,
companions, barrel Mimics, keeper variants, traders, encounters, room dressing,
remains, regional base materials, selected equipment and elemental impacts.
Runtime delivery maps 187 shipped files (184 E–T plus3 Y) to
reviewed sources; integration review
records native phone and offline evidence. Reproduce byte-identical exports with
python3 tools/export-painted-runtime.py --check and phone captures with
node art/creatures/preview-runtime.cjs. Per-image procedural fallbacks remain.
The exact stair arch mask, seeded amulet appearance, coloured locks and
unpainted regional/held variants retain their existing rendering. U/V reuse audits
are included in this publication. Historical batch reports describe their original
source-only state; the runtime delivery review supersedes those delivery statuses.
Batch W audits the existing major-screen illustrations: approved portrait/landscape
key art, darkened prologue reuse, hero portraits on death and all three endings,
native share cards and loading/offline fallback. No new major-scene painting is
needed in the reviewed layouts. See the review
and inventory. Reproduce layouts with
python3 art/creatures/export-batch-w.py --check and captures with
node art/creatures/preview-batch-w.cjs. Title-fact overlap at double text and share-card caption/state accents have
separate follow-ups. This audit evidence is included with release0.9.34.
Batch X completes the optional-effects audit: retain Q's integrated fire/frost
impacts and the existing procedural travel, lightning, swarm, traps/status and
Calm effects. No new effects atlas or runtime change is commissioned. Reproduce
native live-cast evidence with node art/creatures/preview-batch-x.cjs; see
the X review for scope and results.
W and X audit evidence is included with release0.9.34. The E–X roadmap is audited;
remaining presentation follow-ups are tracked individually in the roadmap.
Batch Y extends the remaining held library with three painted shield rear views:
Fighter shield, Cleric shield and Thief buckler. Their source/review evidence and
native activation ship with release0.9.34. See
review. Reproduce with
python3 art/creatures/export-batch-y.py --check; capture source fits with
node art/creatures/preview-batch-y.cjs. Existing Rune shields and named/off-class
gear retain their bindings. The roadmap records the next held-weapon priorities.
Release 0.9.34 activates Batch Y's three shield rear paintings through the native
loader and offline cache. The common delivery exporter now covers187 files:
python3 tools/export-painted-runtime.py --check. Exact class/item matching keeps
named shields, Rune shields and other kits distinct; an unavailable image retains
its own procedural fallback. See native activation evidence.
W/X audits and Y's source review are included in the same release; their historical
local/source-only reports describe the review stage, not the current bindings.
The remaining procedural-art conversion plan now lists priorities1–8 as Batches
Z–AG in the roadmap. Priority1 was completed as a
source review:23 painted frames for Cleric mace, Thief shortsword, Ranger
shortbow and Druid spear. See Z review.
Reproduce with python3 art/creatures/export-batch-z.py --check; capture source
fits with node art/creatures/preview-batch-z.cjs. These23 frames are now integrated for release0.9.35 alongside AA’s first tranche. AB–AG remain planned.
Batch AA's first wider-weapon tranche adds36 reviewed frames: Thief dagger,
Fighter battle axe, Cleric war hammer and Fighter two-handed sword. See the
AA review for120 phone captures,
360 fitting cases,12 baseline browser checks and remaining source-edge findings.
Reproduce exports with python3 art/creatures/export-batch-aa.py --check and
captures with node art/creatures/preview-batch-aa.cjs. Sword read/drink/cast
keep their procedural one-handed frame; the two-handed art is not substituted.
These paintings and Z are integrated for release0.9.35. The wider AA library is
still open; its next passes are tracked in the roadmap.
Release0.9.35 activates59 reviewed Z/AA held frames across eight exact class/weapon
pairs, bringing the common delivery inventory to246 files and shipped paintings
to414, plus3 app icons. Existing T/Y bindings and procedural fallbacks remain.
Reproduce bytes with python3 tools/export-painted-runtime.py --check; capture
native legal equip/actions/Calm/offline continuation with
node art/creatures/preview-batch-zaa-runtime.cjs. See the
native weapon review for validation.
No game rules or balance change.
AA's second ordinary-melee source pass adds36 reviewed local frames for Fighter
war hammer, Fighter/Cleric flails and Mage dagger. See the
review for120 captures,
360 fitting cases,12 passing baseline browser checks and retained source findings.
Reproduce with python3 art/creatures/export-batch-aa-melee2.py --check and
node art/creatures/preview-batch-aa-melee2.cjs. These frames are unpublished and
unactivated; the live game stays0.9.35. Remaining AA passes stay in the roadmap.
AA's third ordinary-melee source pass adds36 dagger class frames for Fighter,
Ranger, Druid and Spellblade (27 unique painted poses; Ranger reuses Fighter after
exact native pixel/grip comparison). All six legal dagger classes now have source
coverage alongside active Thief and pending Mage. See the
review for120 captures,
360 fits and12 passing baseline checks. Reproduce with
python3 art/creatures/export-batch-aa-melee3.py --check and
node art/creatures/preview-batch-aa-melee3.cjs. This and the previous source pass
remain local, unpublished and unactivated; live0.9.35 is unchanged.
Release0.9.36 activates the second and third AA melee passes:72 class frames for
Fighter war hammer, Fighter/Cleric flails and Mage/Fighter/Ranger/Druid/Spellblade
daggers. All six legal dagger classes now have active painted ordinary daggers.
The common delivery inventory is327 files, including156 held frames;495 shipped
paintings plus3 app icons. Reproduce with
python3 tools/export-painted-runtime.py --check; capture real class equipment,
actions, Calm and offline continuation with
node art/creatures/preview-batch-aa-melee-runtime.cjs. See
native activation evidence.
Exact class and named-item guards, grips/bounds and independent whole-family
fallbacks are preserved. Historical local/source-only notes above describe the
review stage; both passes are now activated. No game rules or balance change.
Native activation also adds9 painted Spellblade dagger reflection frames, bringing
the release addition to81 held frames. Its lantern normally requests lit=true;
the loader now matches the explicit lit flag rather than rejecting every lit
request. Other weapons retain their procedural reflected variants. The painted
reflection preserves silver steel, brass, class hands and muted cool edges without
changing dungeon light or visibility. Reproduce with
python3 art/creatures/export-batch-aa-reflected.py --check.
AA's fourth ordinary-melee source pass adds36 club frames for Fighter, Cleric,
Thief and Druid—all four legal club classes. See the
review for120 phone captures,
360 fits and12 passing baseline equipment checks. Reproduce with
python3 art/creatures/export-batch-aa-melee4.py --check and
node art/creatures/preview-batch-aa-melee4.cjs. The
roadmap tracks completed basic melee sources
and their remaining activation work. This batch is local, unpublished and unactivated; live0.9.36 and its
495 shipped paintings remain unchanged.
AA's fifth ordinary-melee source pass covers all five remaining basic melee groups:
Fighter mace; missing shortsword/longsword class pairs; Fighter/Cleric/Druid staff;
and Fighter/Ranger spear.97 class/state frames include18 reflected Spellblade
sword frames and20 audited Ranger reuses. See the
review for368 phone captures,
1,104 fitting cases and staff released-hand/glint checks. Reproduce with
python3 art/creatures/export-batch-aa-melee5.py --check and
node art/creatures/preview-batch-aa-melee5.cjs. All basic melee class pairs now
have source coverage; named/rare/ranged and unsupported hand states remain open.
These97 frames and36 clubs remain local/unactivated/unpublished; live0.9.36 is
unchanged. Future staff activation must preserve authored tip metadata.
AA melee4/5 are activated for0.9.37:133 newly activated class/state frames cover clubs plus the remaining basic mace, shortsword, longsword, quarterstaff and spear class pairs. Spellblade swords retain plain/reflected states; staffs retain released-hand reading/drinking/casting and authored glint tips. The catalog has289 held frames and628 shipped paintings plus3 icons. All327 earlier common delivery files remain byte-identical. See the combined runtime review for native actions, offline reloads and release validation. The source-only notes above preserve the earlier review stages. Rare/named/ranged and unsupported hand-state conversions remain on the roadmap; no rules or balance changed.
AA ranged source art is complete locally for sling, throwing knife and Dark Elf
Hand Crossbow:17 class/state frames covering all12 legal class/item pairs.
The review records292 frozen
phone captures,876 fits, release/fallback checks and12 passing browser checks.
Run python3 art/creatures/export-batch-aa-ranged.py --check to verify exports.
These assets await activation/publication; live0.9.37 stays unchanged. Remaining
bow class gaps and rare/named conversions are listed in the
atlas roadmap.
AA bow class source coverage is complete: Fighter/Thief shortbow and Fighter
longbow add9 class/state frames, including6 exact approved Ranger reuses.
The review records94 frozen phone
captures,282 fixture cases and12 passing equipment checks. Verify with
python3 art/creatures/export-batch-aa-bows.py --check. These9 plus the preceding
17 ranged frames remain pending activation/publication; live0.9.37 is unchanged.
Next atlas work is rare scimitar/dwarfhammer, greatsword released-hand states and
named/legendary/Mythic equipment; see the atlas roadmap.
AA rare weapon source art is complete for all legal Dark Elf Scimitar and
Dwarven Hammer class pairs:63 frames, including Spellblade plain/reflected and9
audited Ranger reuses. The review
records208 frozen captures,624 fits and12 passing equipment checks. Verify with
python3 art/creatures/export-batch-aa-rare.py --check. These63 plus26 earlier
ranged/bow frames remain pending activation/publication; live0.9.37 is unchanged.
Next source work is Fighter greatsword released-hand art and named equipment.
AA Fighter greatsword hand-release source art is complete:9 one-hand poses
retain painted art during read/drink/cast stress fixtures and restore the existing
two-hand family at action completion. The
review records130 captures,
390 fixture checks and12 passing equipment checks. Verify with
python3 art/creatures/export-batch-aa-greatsword.py --check. These9 plus89 prior
ranged/bow/rare frames await activation/publication (98 total); live0.9.37 stays
unchanged. Next painting work is the named/legendary/Mythic equipment library.
The first AA named held family is source-complete: the Penitent's Flail has18
Fighter/Cleric frames with its three prayer beads and cross. The
review records68 captures,
204 fixture checks and12 passing equipment tests. Verify with
python3 art/creatures/export-batch-aa-penitent.py --check and check the named
identity/class inventory with node art/creatures/audit-named-equipment.mjs --check.
These18 plus98 prior frames await activation/publication (116 total); live0.9.37
remains unchanged. Next source batch is Dawnbringer for Fighter/Cleric;30 named
weapon/shield held candidates remain without held source in the inventory audit.
AA ranged, bows, rare weapons, released-hand greatsword and Penitent are activated for release 0.9.38 (build 53, offline cache deepdelve-v113). The 116 new held frames cover every legal sling/throwing-knife/hand-crossbow pair, missing bow classes, scimitar/dwarfhammer classes, Spellblade plain/reflected scimitars, Fighter greatsword hand release and exact Fighter/Cleric relic_penitent poses. The catalog now contains 405 held frames and 744 shipped paintings plus 3 icons; all 460 previous common delivery files retain identical bytes. New delivery adds 2,027,593 compressed bytes across 116 PNGs, matching reviewed source exports.
See the activation review for native actions, family failures, offline delivery and release checks. Fifty sessions at 390px/320px exercise 25 real equipment variants, 164 actions, Calm and 50 offline Continue reloads with all 405 held frames cached. The 742 captures and 50 galleries use native updates and loaders; setup supplies equipment/resources and a durable target, so they do not establish unassisted combat or quest completion. Earlier source-only notes describe historical stages, superseded by this activation.
The named inventory now has one delivered held family (Penitent), with 30 of 31 named weapon/shield candidates still awaiting held source. Next painting order: Dawnbringer for Fighter/Cleric, then The Ogre's Toll and remaining named families. Action hands, bow strings/arrows and moving projectiles remain procedural.
All 30 remaining named weapon/shield candidates now have reviewed source art: 397 exact class/state files (381 held, 16 carried), 73 legal class families, and 347 unique paintings plus 50 verified Ranger reuses. Together with active Penitent, all 31 candidates have source coverage. The other 16 worn/inventory identities and the existing 47 relic portraits remain separate categories.
See Batch AB review and library contact sheet. Source fitting covers both phone widths and 4,746 checks. This supersedes earlier notes naming Dawnbringer or another named held family as the next painting gap. Next: activate the 381 held and 16 carried AB states, verify native actions, fallback/loading, offline caches and performance, then publish when requested. AB is currently local source art; live v0.9.38 is unchanged.
All 30 remaining named weapon/shield candidates now bind to gameplay: 381 held weapon states and 16 carried shield/focus states. Every one of the 31 named weapon/shield identities, including Penitent, has a painted runtime surface. Exact class, identity, pose, hand count and Spellblade reflections are preserved; unsupported or failed images keep their procedural fallback. Bows retain live strings, arrows and drawing hands.
The common delivery now contains 973 files (786 held states and 21 carried states among them), with all 576 prior common exports unchanged. There are 1,141 shipped paintings plus three icons. The 16 worn/inventory named identities and the 47 relic portraits remain separate surfaces. This activation supersedes Batch AB's historical source-only status.
See native activation review, source review and delivery inventory.
Seven ordinary caster frames are painted and reviewed locally: Mage spellbook, Crystal Orb and Orb of Storms; Cleric Holy Symbol, Silver Sunburst and Reliquary; and the Wayfarer's Silver Lantern. Review and reproduction commands record98 source-preview captures,294 fitting checks and12 equipment regressions. This is source art awaiting native activation/offline/release checks; public0.9.39 is unchanged. The roadmap now reserves AD for remaining ordinary shield backs and AE–AH for later passes.
Seven shield-back frames are painted locally: Fighter/Cleric/Druid bucklers, Fighter/Cleric tower shields and Fighter/Cleric Quill Shields. The full ordinary shield audit now has source coverage for all12 legal class/item pairs: five already active, seven awaiting activation. Review records112 source-preview captures and336 fitting checks. AC+AD total14 pending carried frames; public0.9.39 remains unchanged. Subsequent AE–AH source work is documented below.
AE/AF source art is complete locally: 24 empty-hand bindings and 142 small-item sources (156 new selected paintings plus ten reuses). Runtime activation/publication remains pending. See atlas roadmap.
AG/AH add 25 local regional source atlases: architecture for twelve regions, secondary materials and all thirteen regions’ decoration slots. See the source review for coverage and the remaining arch/gate/material fitting gates. Runtime activation and publication remain pending.
AC–AH are activated for 0.9.40: painted carried foci/shields, empty hands, small floor/Pack items and regional architecture/materials/decorations. Native openings, coloured locks, item identity, rarity edges and separate relic portraits remain intact. Runtime review records 1,228 native captures, independent fallback and all 1,550 catalogued art files decoding offline. Earlier source-only notes above are historical.
CI runs full-cache offline installation checks separately on one worker, retaining the same install deadlines and native offline reload assertions. Other browser checks remain parallel. Their dedicated child-process origin prepares exact static responses before navigation, keeping trace recording out of the serving loop; browsers still fetch every required file into a cold native cache. Fixture byte/header, disconnect and failure checks run with npm test.
Voice download resumption reads the offline cache index once, avoiding repeated scans of the full painted catalog.
Visual polish follow-up: review and settled phone captures. Reproduce the native running-game/portrait samples with node docs/visual/2026-10-25-art-polish/capture.cjs (system Chromium and project Playwright required).
Release0.9.42 improves enlarged-text menus: title greetings take their own space, Journal labels reflow, and trader balances and actions remain clear of Close and item descriptions. Before/after review.
Reading-scene performance: bounded picture preparation and batched log layout preserve spell timing and warning space. The review retains original/candidate profiles, failed controls and the unchanged frame-rate budget; measurements are not a universal device-speed claim.