Game Design Document
Living document · Last updated July 2026 · In Development

Overview

Genre
Competitive Turn-Based RPG / Creature Collector
Platform
PC — Steam (F2P)
Engine
Web client (HTML/JS) + Cloudflare Worker
Art style
Dark fantasy, AI-generated painting

Concept

A creature-collecting competitive turn-based RPG where players climb an ever-ascending tower floor by floor. Each floor is a simple map where the Collector triggers battles until a win threshold opens the portal to the next floor. All metagame systems (breeding, crafting, hatchery) are accessible as UI panels at any time during PvE — no physical base.

Game modes

Ladders

The boards, the rankings window and the public profile are on system-pvp.html and system-profiles.html.

Art pipeline

Dark-fantasy painterly style generated with gpt-image-2.5-flare (pinned snapshot gpt-image-2.5-flare-2026-09-08) via OpenAI API (sizes in use: 1024×1024, 1536×1024, 1024×1536, and 1536×512 / 512×1536 for strips). Generation model is gpt-image-2.5-flare everywhere (creatures, floors, props, item icons) — it is sharper than every predecessor (~1.5–2× the edge sharpness of gpt-image-1.5, ~6× gpt-image-1); the legacy gpt-image-1/gpt-image-1.5 models are deprecated for generation. Transparency: gpt-image-2.5-flare renders background:"transparent" natively. The PvP Arena (2026-09-28) and Premium Shop (2026-10-01) ornament sets ship the API's own alpha with no matte pass (tools/make_pvp_art.py, tools/make_shop_art.py in the client repo). The old gpt-image-2-2026-04-21 rejected transparent, which is where the opaque-then-matte rule came from. X7 is ruled (T23, 2026-10-18: “Model cuts it out; cutout service as backup”): new creature art is generated background:"transparent" on gpt-image-2.5-flare and ships the API's own alpha (tools/make_creature_art.py in the client repo, first used for DFMC-301–312 on 2026-11-02); the remove.bg + despill pass below is the BACKUP for a roll whose alpha comes back bad. The opaque-then-matte rule that follows is the record of how the 300 approved rows were made and still governs any legacy chroma art: generate opaque on a flat neutral background whose value CONTRASTS the creature's dominant luminance, then obtain transparency via the remove.bg + despill pass below. Adaptive background rule (remove.bg segments by contrast — a same-tone background destroys the subject): dark/black-dominant creatures → flat WHITE or light-gray background. To force the model to actually render a light backdrop, describe the BACKGROUND as "a plain flat pure-white seamless backdrop" — but do NOT describe the LIGHTING as "studio / high-key / bright even lighting / product shot": that phrasing desaturates and flattens the creature (measured creature saturation drops to ~16–38 vs ~70 on a dark backdrop), producing washed-out photographic results that lose the dark-fantasy style. Background color and creature lighting are INDEPENDENT. Always keep the creature description on "richly saturated vivid colors, dramatic dark-fantasy rim lighting with deep shadows, moody painterly rendering, NOT washed out, NOT overexposed" regardless of background value; light/white-dominant creatures → flat dark-gray or black background; mid-tone creatures → mid-gray (#808080). NEVER strong chroma (green/magenta/pink) — they bake edge halos no pass can fully clean. After a white/light background, run a white-halo despill (darken over-bright edge-band pixels) in addition to the green/magenta despill. (The “native transparency is 1.x only” note that stood here was written against gpt-image-2-2026-04-21; gpt-image-2.5-flare renders it, see Transparency above.) Legacy creature art follows this pipeline:

Creature art pipeline (per line, 3 images)
  1. Stage 2 (core concept) — Fresh text-to-image generation via /images/generations on gpt-image-2.5-flare. Full descriptive prompt with stacked anatomical deviations (4–5 per creature), explicit color palette, combat-ready stance, generous framing margin, transparent or neutral-gray background. Prefer background: "transparent"; fall back to background: "opaque" with solid gray (#808080) or black (#000000) in the prompt if transparency causes edge issues. Never green or magenta/pink. Upload raw to codex.
  2. Stage 1 (infant) & Stage 3 (final form) — Stage 2 image sent as visual reference via /images/edits on gpt-image-2.5-flare. The prompt is a full descriptive brief for a new creature — never framed as "edit this image" or "make a smaller/bigger version" (that drifts/fuses anatomy). The image reference maintains visual lineage; the prompt drives a fresh generation. Same background approach as Stage 2 (transparent or gray/black — never green or magenta). Known limitation: the /images/edits endpoint ignores flat-background and center-70% framing instructions when handed a reference — it paints dark atmospheric scenery and fills the frame regardless of prompt emphasis. This is cosmetic only: the subject renders correctly and the matte pass strips the dark haze cleanly (~2–3% semi-alpha, no halo). If a truly clean solid background is required, use /images/generations (text-to-image, no reference), which respects background and framing — at the cost of the Stage-2 visual-lineage link.
  3. Art-approval gate (do NOT crop early) — "Generate new option", "Generate new crop"(when art not yet approved), and "Regenerate" place the RAW generated art WITH its background into the slot and stop there. remove.bg cropping is a PAID step and runs ONLY after the art is approved. Never remove.bg a freshly-generated option/regen — it wastes credits and skips the approval gate. Cropping happens at approval time (approve option → crop → promote to A).
  4. Background removal — Separate pass after art approval. Matte-only methods only — the method must never repaint the subject. Priority order: (1) remove.bg API — zero RGB drift, clean edges, commercially licensed only when processed with paid credits (subscription/PAYG); the 50 free calls/month return 500×500 previews that are not commercially licensed — quality-gate use only, never shipped. (2) BiRefNet general checkpoint (MIT) locally on the dev PC — zero drift, best on fine detail, free; use plain BiRefNet, never BRIA RMBG-2.0 (BiRefNet-based but non-commercial license — disqualified for a commercial Steam release). (3) rembg new_session("isnet-general-use"), plain, NO alpha matting — light fallback for simple silhouettes. Never gpt-image-1/gpt-image-2.5-flare edits for removal (regenerates the whole frame — measured 12–17 RGB drift, warps anatomy) and never rembg default u2net (halos, destroys ethereal creatures). Despill pass (mandatory on legacy chroma art): creatures generated on the retired green/magenta backgrounds have colored fringe baked into their edge pixels — no matte can remove it since it is part of the subject. After matting, neutralize the cast in the partial-alpha edge band only (interior untouched): subtract magenta cast max(0, min(R,B)−G) or green cast max(0, G−max(R,B)), weighted by edge alpha. Fixes ~99% of legacy images in place without regeneration; only creatures whose soft ethereal edges (wisps, fine foliage) carried their color in the chroma bleed are regen candidates. New art on transparent/gray/black needs no despill. Originals preserved in codex/images/originals/ before overwrite (>1MB files: read via the git blobs API, not the Contents API inline field). BG_Status: has_chroma → bg_pending → bg_approved or manual.
  5. Crop option slots — the codex shows each creature's candidate cutouts as sequential tabs: A = codex/images/<ID>.png (main/original), B = codex/images/cropped/<ID>.png, C = codex/images/cropped_c/<ID>.png, D = cropped_d/, etc. A new option ALWAYS fills the next empty slot in order (A→B→C→D). Never skip a slot — the codex will not render a C when B is empty. If only A exists, a new crop goes to B; if A+B exist, it goes to C. On approval, the chosen crop is promoted to A (main) and all other slot files are deleted so no dead tabs remain. Slots are contiguous and RESHUFFLE on deletion: deleting any slot shifts every higher slot down to fill the gap — delete A → B becomes A, C becomes B, D becomes C; delete B → C becomes B, D becomes C. There is never a gap (no C without B, no A absent while B exists). Physically this means moving each higher slot's file content down one path (cropped/→main, cropped_c/→cropped/, …) and deleting the now-empty trailing path.
  6. CSV update — Image_Path and Art_Status set immediately after each generation. Statuses: pending (awaiting approval), approved (art locked, do not regenerate), redo (flagged for regeneration).
  7. Served sizes (client, #1047) — the client paints a fixed 1920×1080 stage, so every family ships at the size it is painted: codex/images/med/ 512px (the creature sheet, the item card, the pens at ~200px, battle), codex/images/tile/ 192px (every grid: soul bag 95px, codex 128px, equipment slots 71px, floor atlas 58px, rankings; baked from med by tools/bake_tile_art.py, same framing), tile/mutants/ 192px, opt/classes/ 1024px (the master), card/classes/ 512px (the class screen's card, painted contain-fit at 170px) and tile/classes/ 256px (the class soul tile), opt/eggs/ 256px, opt/items/ 128px, floors/ground_plates/1080/ 1920×1080. A grid that paints a 512px source into a 95px box costs 4× the bytes and 16× the decode for nothing the eye can see; tools/img_audit.py is the table.
Floor art pipeline (per floor, 3+ assets)
  1. Battle background — Text-to-image, 1536×1024 (regular floors) or 1024×1024 (boss arenas). Prompt includes zone visual theme, encounter type, and atmosphere. Transparent background not used — these are full scene paintings. Tracked in codex/floor_assets.csv.
  2. Parallax layer — One per zone (10 total), 2304×1024, seamless horizontal tile. Atmospheric depth layer behind the battle background for ultrawide displays.
  3. Props — 3–4 per zone, transparent background. Environmental dressing placed on the floor map: standing stones, skull heaps, glowing crystals, etc. Tracked in codex/prop_assets.csv.
  4. Map preview — Two renders per floor: empty (background + props, no creatures) and populated (with creatures placed). For approval only, not shipped assets. Tracked in floor_assets.csv Map_Preview_Status / Map_Populated_Status.

Floor assets live in floors/backgrounds/, floors/parallax/, floors/props/{zone}/. Preview/mockup floor art now lives under _parking/floors/. The floor sheet (codex/floor_assets.csv) references which assets each floor uses — decoupling floor identity from art allows infinite floor extension later by reusing zone asset pools.

Item art pipeline (per base type, 1 image)
  1. Generation — Text-to-image, 1024×1024, opaque flat mid-gray #808080 background, then remove.bg + despill (a rule from gpt-image-2, which rejected transparent; gpt-image-2.5-flare renders native alpha, so a new icon set may skip the matte the way the ornament sets do). Every weapon (36), armour piece (40), and accessory tier gets its own icon; enhancement tiers (Rough → Sublime, Faded → Elder, Tattered → Fated) get tier-specific prompts describing the item's visual state at that power level.
  2. Approval — Same status flow as creatures: prompt_ready → generated → approved. Tracked in codex/items.csv Art_Status column.

All 585 items catalogued in codex/items.csv with flavor text and image prompts. Prompt boilerplate: isolated dark-fantasy game item icon, oil-painted style, dramatic rim lighting, rich vivid colors, item centered 70% of frame, three-quarter angle, on a plain flat mid-gray (#808080) seamless background.

Character system

One character per realm, always

Every account has a character in every realm they have unlocked, starting at level 1. The character slot is permanent — death does not remove or demote the character. Only their items, creatures, and class XP are lost.

Player level, character level, class level

The player level is account-wide and uncapped: it accumulates every point of XP the account ever earns, uses the standard curve to 100, then costs a flat 354,245 XP per level forever (XPCurve.csv row 100 XP_Account_Flat; ~185 battles, ~6h). Creature, class, and character levels all cap at 100.

The character has a character level — a global level aggregated from XP across all classes. Character level scales base stats (HP, stamina, resistances). Each class has its own class level tracked separately, unlocking class-specific bonuses. Switching classes does not reset others. Built 2026-10-01: each class earns its own class XP from level 1; only the account level is shared. Switching the active class unequips everything attached to the character — all 8 gear slots return to inventory (socketed gems, runes, enchantments and attached souls stay on their items); the new class starts bare and is re-equipped from inventory.

XP & level model
Account
├── playerLevel      → all XP ever earned → uncapped, grants nothing (see XP & Leveling)
│                      levels 101+ cost a flat XP_Account_Flat = 354,245 each; survives death
└── Character
├── characterLevel   → sum of all class XP → scales base stats
├── Warrior
│   ├── classLevel   → scales warrior power
│   └── classXP
├── Archer
│   ├── classLevel
│   └── classXP
└── Mage
    ├── classLevel
    └── classXP

Classes

Six classes, each a linear advancement line of three stages. The class advances at class level 33 (Stage 1 → 2) and class level 66 (Stage 2 → 3) — fixed breakpoints, not the per-line levels creatures use (D ruling, 2026-07-27). Advancing re-skins the character and moves it onto that stage's row in codex/classes.csv, so its Attack / Defense / Speed grades rise with the form; the stage is derived from the class level, so the two can never drift apart. There is no branching specialization; a Warrior is always a Warrior, just stronger and re-skinned. Characters use three stat axes only: Attack, Defense, Speed (Utility is a creature-only measure — a character can wield any ability regardless of stats). Speed is capped at 10 like all axes and has no gear sources.

Stat sums scale by stage, matching creature grade tiers spread across three axes: Stage 1 ≈ 12 (Common-tier), Stage 2 ≈ 16 (Rare-tier), Stage 3 ≈ 20 (SSR-tier). Every axis value stays ≤ 10.

Starter classes (pick one free at character creation)

Character creation opens on the class-select screen: Warrior, Archer, or Mage. Each option displays its two fixed starter creatures — two Common lines, at Worn quality grade: Warrior Thornback (Bristle) + Cindershard (Ember) · Mage Stormcrow (Fledgling) + Gloomcap (Button) · Archer Dusthound (Whelp) + Gustwing (Chick) — recorded in codex/classes.csv (Starter_A / Starter_B, Stage-1 creature IDs; Common since 2026-11-02 — they were an SR + SSR pair before, see the changelog). After picking a class the player names the character; creation then completes with that class, its two starter creatures (genders rolled 50/50 at grant, account-bound — never tradeable), and its T1 class weapons (main + off hand) equipped. The two unpicked starter classes become purchasable for 100 Scrap each — class + T1 weapons only, no creatures.

Warrior → Knight → Paladin
High Defense, moderate Attack, low Speed. The armored frontliner — soaks the alpha strike, acts late.

Stage 3: Atk 6 · Def 10 · Spd 4
Mage → Sorcerer → Archon
Highest Attack, lowest Defense, moderate Speed. The glass cannon — the game's top damage ceiling, pays with fragility.

Stage 3: Atk 10 · Def 2 · Spd 8
Archer → Ranger → Hawkeye
High Attack, low Defense, high Speed. The fast ranged striker — wins initiative, hits hard, folds under pressure.

Stage 3: Atk 8 · Def 3 · Spd 9

Unlockable classes (earned in-game; DLC post-prototype)

Brute → Warlord → Titan
High Attack, high Defense, lowest Speed. The heavy bruiser — hits and survives, but always moves last.

Stage 3: Atk 9 · Def 8 · Spd 3
Assassin → Stalker → Nightblade
High Attack, lowest Defense, highest Speed. The pure glass-cannon striker — faster and squishier than the Mage.

Stage 3: Atk 9 · Def 2 · Spd 9
Professor → Sage → Prophet
High Defense, high Speed, low Attack. The tanky-fast controller — survives and acts early, but does not hit hard. The scholar who sees it coming.

Stage 3: Atk 3 · Def 8 · Spd 9

The opening, floors 1-6 (T6 part 4, 2026-10-22)

Floors 1-9 are a scripted sequence, not a set of unlocks (D, 2026-09-09): fight → a guaranteed weapon drop teaches equipping → guaranteed materials teach upgrading → a guaranteed gem teaches socketing → autoplay opens. "The guaranteed items exist so the lesson never waits on RNG." The table is codex/opening.csv, one row per beat. The item columns (Category, Family, Tier, Grade, Selection, Item_ID) are the server's: the Worker's battle credit mints the row's item once per account on the first credited victory with the progress ratchet past the row's Floor (the ratchet is the server's only floor-clear signal), through the same drops array as every other drop, tagged op:<beat>, and only while the account is still inside the opening (see system-networking.html, "The scripted opening"). The Anchor and Label columns are the client's part-3 arrow: the same ftue flag, the same one click, the same Settings > Tutorials RESET row; a first-fight beat is pending while the best floor is still 1, any other beat once its Floor is cleared. Single hatch and single dismantle are open from floor 1. The autoplay beat has no item and no arrow of its own: the autoplay,6 row of unlocks.csv carries the gate and the arrow.

FloorBeatGuaranteed item (server, once per account)Arrow points at (opening.csv Anchor)
1, the first fightfirst_fight_move → first_fight_ult → first_fight_order—a move slot (bt-move-slot), the ultimate plate (bt-ultimate), the SPEED ORDER plate (bt-order); the chain of 11.11
1 clearedweapon_dropa T1 Common main-hand weapon of the account's class line (saves.charSoul → items.csv Family; Selection class_weapon)the main-hand slot on the equipment screen (eq-weapon-slot)
2 clearedmaterials_dropthe materials for one upgrade attempt (ITM-0391 Scrap): a server wallet credit on the first floor-2 clear, exactly the first attempt's grading.csv price (Gear T1 Common→Uncommon = 1 Scrap), once per accountthe UPGRADE door (eq-upgrade)
3 clearedgem_dropa T1 Common gem of a uniform family (Selection random_family)a socket on the equipment screen (eq-socket)
4 clearedsingle_hatchthe Worn egg of the weakest named kill of that victory (Selection lowest_rarity_tie_random; waits for a victory with a kill the server can name)HATCH on the egg (hatch-yes)
5 clearedsingle_dismantle—DISMANTLE on an item's sheet (item-dismantle)
6autoplay_open—the AUTOPLAY button, through the unlocks.csv autoplay rung

System unlocks (T6 part 1, 2026-10-22)

Every system opens at the account's best floor (the server's progress ratchet, the number only credited battles can raise), never the current floor. A locked system stays visible with the floor that opens it (D, 2026-09-09) and refuses with the same line: OPENS AT FLOOR N. Drops are never gated: every system's items, materials and currencies flow from floor 1 and wait in the bag. Single hatch and single dismantle are open from the start; floors 1-9 are a scripted opening (equip, upgrade, socket, autoplay), not a set of unlocks. The table is codex/unlocks.csv.

FloorOpensFTUE arrow points at (unlocks.csv Anchor)Server door (T6 part 2)
1Class soul (handed out at creation; its upgrade opens with the souls rung)the character soul plate on the equipment screen (eq-soul-slot)— (open)
6Autoplay (the end of the scripted opening, T6 part 4)the AUTOPLAY button on the floor (autoplay)— (client only: there is no autoplay door)
8Hatch All, Dismantle Allthe HATCH ALL plate in the soul bag / the DISMANTLE plate in the inventory (inv-hatch-all, inv-dismantle)/api/hatch batch form, /api/dismantle multi-row — the single hatch / single dismantle stay open
12Souls (the soul slot on equipment, the class soul's upgrade), Devour. The soul bag window is open from floor 1: eggs live there and the single hatch is open from floor 1the soul slot (eq-soul-slot) / DEVOUR on the creature sheet (sheet-devour); the lesson's arrow still starts at the SOUL BAG menu plate (menu-souls)/api/roll soul_grade, /api/devour; a soul equipped below the rung is a save-door flag (unlock_claim_bad), never a refusal
15Auto PvP (the queue is never empty from this rung: every snapshotted account at 15+ defends, matched inside a power window, with a TOWER ECHO house team when nobody is in it — T6 part 5, system-auto-pvp)the PVP ARENA menu plate (menu-pvp)/api/apvp/queue (the mint), /api/apvp/finish (the settle)
20Auto-optimiseAUTO-OPTIMISE on the equipment screen (eq-optimise)— (client-only; no door)
25Breedingthe BREEDING menu plate (menu-breed)/api/unlock kind pen; a pen in use below the rung is the same save-door flag
30Scrolls and enchantingeq-scroll — no control carries it yet; the arrow waits until one does/api/roll enchant
40Grading (Gem / Rune / Scroll), Upgrade All, the Shadow Traderthe GRADE door of the dismantle window (inv-grading) / UPGRADE ALL in the bench (upg-all-in) / the SHADOW TRADER tab (shop-trader-tab)/api/roll grade on a non-Gear category (the Gear step stays open), /api/roll with all (the ALL-IN ticket), GET /api/shop/trader + POST /api/shop/trade
50Buying classesBUY on a class card (cls-buy)/api/unlock kind class
60Competitive PvPFIND MATCH in the arena (pvp-find-match)POST /api/pvp/mm/queue (poll / ready stay open so a queued ticket can finish)

The FTUE (T6 part 3, 2026-10-22): when a rung opens, one arrow with the system's Label points at its Anchor control (the column above) until the player clicks that control once; it follows the control across layout, hides while its window is closed, never blocks a click and opens nothing. One arrow at a time, oldest rung first among the controls on screen. The click leaves a one-time read line in the Adventure Log ("Souls opened at floor 12"). Settings > Tutorials turns the arrows off, or resets one system's arrow (Settings). The flags ride the save's ftue object beside skull and letter101.

Class unlocks

All six classes are earnable in-game in the prototype — the three advanced classes ship as DLC post-prototype (the earned path remains). Unlocking a class grants the class + its T1 class weapons (main + off hand) only — never creatures. Costs are farm-time-normalized on the canonical endgame income weights (Scrap ≈150–225/h at endgame after the Ichor→Scrap fold at 15:1 : Dust/Essence/Ink 20/h) and live in codex/classes.csv (Unlock_Cost):

ClassUnlock costEndgame farm timePath
Unpicked starters (Warrior / Mage / Archer)100 Scrap each~40 minGear dismantling — early-accessible
Brute → Warlord → Titan750 Scrap~5 hGear dismantling — affordable earliest of the three
Professor → Sage → Prophet100 Ink~5 hScroll/enhancement dismantling — mid
Assassin → Stalker → Nightblade750 Scrap~5 hBosses — de facto latest (priced against endgame Scrap income)

The three advanced unlocks cost equal endgame farm time but diverge in when they become realistically affordable — a soft unlock ordering without hard gates. Ichor is excluded (breeding-only economy).

Stat progression by stage

Class lineStage 1 (A/D/S)Stage 2 (A/D/S)Stage 3 (A/D/S)Access
Warrior → Knight → Paladin4 / 6 / 25 / 8 / 36 / 10 / 4Starter
Mage → Sorcerer → Archon6 / 1 / 58 / 2 / 610 / 2 / 8Starter
Archer → Ranger → Hawkeye5 / 2 / 57 / 3 / 68 / 4 / 8Starter
Brute → Warlord → Titan5 / 5 / 27 / 7 / 29 / 8 / 3Unlock — 750 Scrap
Assassin → Stalker → Nightblade6 / 1 / 57 / 2 / 79 / 2 / 9Unlock — 750 Scrap
Professor → Sage → Prophet2 / 5 / 52 / 7 / 73 / 8 / 9Unlock — 100 Ink

Class stats are multipliers, not pools. A class stage stat feeds AxisMult = (3 × stat + 5) / 8 and multiplies the summed item stats for that axis — Paladin Def 10 means ×1.75 on all armour Defense; Mage Def 2 means ×0.55. The character has no innate stat pool beyond a flat +10 Attack / +10 Defense floor applied after all multipliers (July 2026); gear provides everything else. Same curve as creature axis grades.

Additional class lines (pure-wall, balanced-duelist, speed-specialist, etc.) are reserved as possible future content.

Soul gems

One Soul Gem is generated per class the character had any XP in. Rank scales with XP amount. Consuming a gem grants that XP to the character's matching class.

S
Soul of the Mage S
Grants 999,999 Mage XP on consume
E
Soul of the Archer E
Grants 250 Archer XP on consume
F
Soul of the Warrior F
Grants 100 Warrior XP on consume

Rank thresholds (F through S) are TBD — to be balanced during development. Item description shows exact XP granted on consume.

XP & progression

XP formulas

FormulaExpressionPurpose
XP required, levels 1–6610 × L1.75Gentle journey phase — the full tower and all Stage 3 content unlock quickly
XP required, levels 67–100234 × L × 1.16(L−67)Geometric endgame phase — battles per level grow +16% each level (continuous with phase 1 at L67)
XP per battle (expected)10 × LA battle defeats 3 enemies (tagged + 2 conjured); their kill XP sums to 10 × zone level in expectation — every battle-denominated table below is unchanged
XP per kill (level C, rarity r)max(4, round(10⁄3 × C × mr ⁄ M̄(C)))mr = rarity multiplier (table below); M̄(C) = expected multiplier under the floor-C encounter weights (codex/encounter_weights.csv) — normalizes expected battle XP to exactly 10 × L
Battles per levelL0.75 then 23.4 × 1.16(L−67)Derived — 23 battles at L67, 613 at L89, ~2,700 for 99→100

Rarity XP multipliers

RarityCUCRSRSSR
mr1.01.52.54.07.0

Same ladder as Ichor — one rarity-value scale game-wide. The ⁄M̄(C) normalization holds expected battle XP at exactly 10 × L on every floor even as encounter weights drift toward rarer tiers over the run (un-normalized, endgame XP would inflate 2.8×). The 4-XP-per-kill floor only lifts level 1–2 Commons/Uncommons: it makes the worst possible first battle (3 level-1 Commons) grant 12 XP — a guaranteed full first level (10 needed) with no special-case rule. Baked per-level, per-rarity values are the game-side authority: dfmc-game/Assets/Data/XPCurve.csv.

The curve is deliberately back-loaded for an autoplay game: 75% of all leveling time sits in levels 90–100 (50% in the last five levels). Total to max level: ~20,300 battles ≈ 680 h at 2 minutes per battle. Reaching level 67 — where wild Stage 3 creatures appear — takes only ~885 battles (~30 h). Owned-creature final advancements land between levels 56–73 depending on line rarity (see Creature advancements).

XP distribution & level penalty

End-of-battle XP is awarded to every creature in the party and the avatar, not only the participants. Dying in battle does not forfeit XP — a fainted creature or downed avatar still receives its full share. Each recipient's XP is then scaled by a penalty based on its own level versus the defeated enemy's level (diff = enemyLevel − recipientLevel). The two directions are asymmetric:

DirectionGrace (0% penalty)RampFloor
Enemy higher (under-leveled) — forgivingdiff ≤ +10linear +10 → +5090% at +50
Enemy lower (over-leveled) — strictdiff ≥ −3linear −3 → −2590% at −25

Under-leveling into hard content stays rewarding (push up freely); grinding trivial enemies is quickly gutted — the over-leveled curve reaches the 90% floor in half the level span of the under-leveled one. Full curve, chart, and live calculator: Other Systems › Level Penalty.

Time to milestones by play profile

MilestoneBattlesCasual (3 h/day)Dedicated (12 h/day)24/7 autoplay
Level 67 — wild Stage 3 band (final advancements: Lv 56–73 by rarity)~88510 days2.5 days1.2 days
Level 90~5,180~2 months14 days7 days
Level 100~20,300~7.5 months~2 months~1 month

There is no XP multiplier bonus for fighting creatures above the player’s level. The only incentive to push harder content is the higher flat XP that higher-level battles naturally grant (a level-40 battle yields 400 XP in expectation vs 300 at level 30). This keeps the system clean and unexploitable.

Zone creature level distribution

Creatures on each floor spawn within ±3 levels of the zone’s base level, following a symmetric bell distribution. The offsets are symmetric, so the mean enemy level is the zone’s base level.

Offset from zone level−3−2−10+1+2+3
Spawn rate3%7%12%56%12%7%3%

Average preservation: Σ(rate × offset) = 0.03(−3) + 0.07(−2) + 0.12(−1) + 0.56(0) + 0.12(+1) + 0.07(+2) + 0.03(+3) = 0. Level offsets cancel: the mean enemy level is the zone’s base level. What a battle at that level pays is the reference table above (expected XP of three on-level kills), not a flat multiple of the zone level. Offsets: src/worker.js deriveSlot OFF; generated by tools/codex_tables.py.

Zone progression estimate

Zone (10 floors each)LevelsBattlesZone timeCumulative
Zone 1 — Grasslands1–10390.4h0.4h
Zone 2 — Tidal Shallows11–20840.8h1.1h
Zone 3 — Desert Plains21–301181.1h2.2h
Zone 4 — Swarm Thicket31–401511.4h3.6h
Zone 5 — The Crag41–501801.7h5.2h
Zone 6 — Storm Peaks51–602091.9h7.2h
Zone 7 — Sunken Bog61–702372.2h9.3h
Zone 8 — Underwater Cave71–803313.0h12.4h
Zone 9 — Gemstone Cave81–906856.3h18.7h
Zone 10 — Flaming Hellscape91–1001,74016.0h34.6h

Battles = the sum of the reference table’s per-level count for each level of the zone (on-level, wild battles); hours at 109 battles/h (dfmc-client tools/sim_econ.mjs BATTLES_PER_HOUR). Generated by tools/codex_tables.py.

XP reference table

LevelXP requiredXP/battle (expected, on-level)Battles (on-level)
110161
10562996
201,89119910
303,84629813
406,36239817
509,40249719
6012,93559622
6615,28366024
7017,68369626
8033,28279642
9090,792895102
99304,327990308

Core loop

Single active character

The game runs one realm character at a time. Switching realms switches the active character; only the active character simulates. There is no offline progression; being in-game is the only way to advance. All economy balancing is denominated in battles for this one active character (~109 battles/h on autoplay, the economy simulator’s figure, dfmc-client tools/sim_econ.mjs BATTLES_PER_HOUR).

Manual mode
Default state. Player directly controls the active character. Autoplay must be explicitly enabled to hand off control.
Autoplay mode
Opt-in. The active character grinds the current floor automatically. Disable to return to manual control.

The earlier multi-tab simultaneous-simulation design (up to 4 realm tabs at once) is retired — one character farms at a time.

Floor presentation (Simplified Static)

There is no player avatar. Each floor is a static painted map (1536×1024 px, 3:2; parallax background at 1.5× for ultrawide; boss floors are 1024×1024 arenas). Creatures wander the map autonomously; hovering a creature highlights it by rarity; clicking (tagging) it starts the battle. Grid movement is archived — see Roadmap.

Map design

Maps are small and simple — no elaborate handcrafted circuits or secret areas. Battles start the same way on every floor: click a wandering creature. Floor themes are purely visual — they change the art, not the mechanics.

🌿 Outdoors
Visual theme only — open-air backdrop, grass and foliage dressing.
🕳️ Cave
Visual theme only — enclosed rock backdrop, darker palette.
🎣 Fishing
Visual theme only — waterside backdrop, aquatic dressing.

Floor theme is fixed per floor and purely cosmetic. The battle trigger (click a creature), win condition (consecutive win streak scaled by floor depth), and boss key drop are identical across all three themes.

🏆 Win condition
Win a streak of consecutive battles on a floor to open the portal. Threshold scales with floor depth: ceil(floor0.65) — floor 1 needs 1 win, floor 10 needs ~4, floor 50 needs ~13, floor 100 needs ~20. Losing a battle resets the streak to zero. Boss floors always require exactly 1 battle (the boss fight).
👑 Boss floors
Every 10th floor is a boss room (floors 10, 20, … 100). Entry requires consuming a Key, which has a chance to drop from any battle across the previous 9 floors. Guaranteed key: the first time a player completes floor 9 of any zone (floors 9, 19, 29, … 99), they are guaranteed a key drop for that zone's boss. This is a one-time reward per zone per character — subsequent visits use the normal random drop rate.

Wild spawns — persistent floor pool

Each floor holds a persistent pool of up to 10 wild creatures, refilled by a serial respawner: one spawn per 60 seconds while below cap. The timer runs in real time whether the player is on the floor, elsewhere in the tower, or offline; every floor ticks independently in parallel. A floor spawns its full pool of 10 the first time the player enters it; from then on the pool is persistent.

RuleDetail
Re-entry is a no-opLeaving and re-entering a floor never respawns or rerolls its creatures. Kills are the only removals; the respawn tick is the only addition. There is no reroll-by-entrance.
Roll once, at spawnEncounter-table rarity, the Mutant colouring roll, and the quality grade roll happen once, when the creature spawns. A spawned creature keeps its identity and roll until killed.
No banked creditsRefill on access = min(elapsed_minutes, 10 − current); overflow is discarded. At cap the timer is frozen — a full floor rolls nothing, so absence banks at most 10 fresh rolls.
Server-clockedSpawn count is a pure function of server wall-clock time; client clocks are never consulted.
Battles remove oneA won battle removes only the tagged creature from the pool. The two battle companions are conjured extras (see Battle party rules) — pool count and the respawn timer are untouched by them.

Throughput: the refill ceiling is 60 spawns/hour per floor (src/tables.json spawn_budget, 10 banked) — 0.55× the ~109 battles/h autoplay pace (the economy simulator’s figure, dfmc-client tools/sim_econ.mjs BATTLES_PER_HOUR), so an autoplay player camping one floor rides the drip. Sustained single-floor farming is throttled at the spawner; speed builds, like everyone else, scale through floor rotation (≈10 per floor per pass).

Wild quality & virtual gear

Every wild spawn rolls a quality grade once, at spawn, from the zone-banded weights in codex/wild_quality_weights.csv — floors 1–9 are all-Worn (×0.84), the curve begins at floor 11, and the roll is capped at Legendary — Abyssal–Void quality exists only through breeding and never appears in the wild. The rolled grade sets the creature's quality multiplier (QM) on Attack, Defense, and HP. There is no catching — wild creatures are fought, never taken; their lines enter the roster only through egg drops and hatching.

Deep-zone wilds also carry virtual gear: zone 1 none; zones 2–4 one tag; zones 5–10 both combat tags. The single tag is Fang when the species' Grade_Attack ≥ Grade_Defense, otherwise Carapace — never Heart (HP scales through QM only; wall inflation stays capped at the source). Tag value is the canonical tag implicit at the at-floor tier, socketed the way a player tag of the creature’s quality is (the gear slot table: gems then runes): each gem is the items.csv Gem row of that stat at that tier, each rune the Rune row’s own Effect curve (6%+3%×(g−1)+0.6%×T today) — the same rows a player socket reads, no constant in code. No item instances; nothing enters the loot tables. Drops, eggs, XP, and Ichor are computed exactly as before — enemy quality never feeds the reward economy.

Streak counter

After every battle, a compact rectangle appears mid-screen showing the current streak status as X / Y (battles won / threshold). On a win, X scrolls up to the new count and the text pops in size briefly. On a loss, the rectangle visually cracks and X rolls back down through each number to 0. The counter only appears on floors not yet cleared.

Boss key

A single Key is required to enter a boss floor, accessible via the portal or directly through the map selector. Keys are zone-specific items (ITM-KEY-010…ITM-KEY-100). Every wild creature defeated on the 9 floors preceding a boss rolls for that zone's Key. The roll is per creature and scales with the creature's rarity — on the game-wide rarity value ladder (C 1.0 / UC 1.5 / R 2.5 / SR 4.0 / SSR 7.0 — same as Ichor and XP), normalized against the zone's encounter weights so a minimum-win journey (3 kills per win) yields exactly one Key in expectation: p(zone, r) = mr ⁄ Σfloors(3 × ceil(floor0.65) × M̄(floor)). Void Apex zones (101–120) are the exception (D ruling 2026-08-25, report #533): each Apex key floor expects one Key every two hours of chance at one won battle every 15 seconds — 480 wins × 3 kills = 1,440 kills per Key, mix-weighted on that floor's encounter weights, the same ladder — derived by tools/gen_keyrates.py in the client repo (--check proves the file matches; the tower rows it never touches). Full table in codex/key_drop_rates.csv. Guaranteed key: the first time a player completes the 9th floor of a zone (floors 9, 19, 29, … 99), a key is guaranteed to drop. This is a one-time reward per zone per character. The Key is consumed on boss entry.

Boss loot

Every boss kill guarantees two drops, delivered on the conclusion screen (params in codex/boss_loot.csv):

Floor structure

ElementDetails
Battle triggerClick (tag) a wandering creature on the map — identical on all floor themes. Wins count toward the floor's streak threshold.
Wild spawnsPersistent pool, cap 10, serial 60 s respawner (see Wild spawns above). Re-entry never rerolls the pool.
Boss (every 10th floor)Requires consuming a Key. One-time encounter, gates the next zone. First completion of the 9th floor in each zone guarantees a key (one-time only).
Portal / doorOpens after the win streak threshold is met. Leads to the next floor.

All equipment and crafting materials now come exclusively from battle rewards — there is no resource gathering layer. Gathering nodes have been removed from active scope; see Roadmap for details.

Defeat

Losing a battle does not remove the player from the floor. The team remains on the current floor and the win streak resets to zero. There is no forced exit, no floor lock, and no return to floor select.

Autoplay

Autoplay is disabled by default and must be enabled per character. A quick toggle sits directly on the gameplay screen; the Auto tab in the options menu holds the full customization. It can be enabled on any tab including the currently selected one. To take manual control of a character, disable autoplay on that tab.

Loop: every few seconds after exiting a battle, autoplay tags a random creature on the map while the camera gently pans over to it, resolves the battle, then repeats — advancing or descending floors according to the options below.

Auto advance floors
When the win streak threshold is met and the portal opens, automatically advance to the next floor. Off — keep farming the current floor.
On death
( ) Stay — remain on the current floor and rebuild the streak. ( ) Go down — drop one floor and continue there. Triggering a death-descent automatically switches Auto advance floors OFF; the player re-enables it manually.

Healing

Healing items have been removed from the game entirely — there are no consumable heals, in or out of battle. The team is restored to full HP after every battle, win or lose. Attrition therefore exists only within a single battle; difficulty pressure comes from the streak reset on defeat, not from resource depletion between fights.

Battle system

Party composition

SidePvEPvP
Player1 avatar + 2 creatures1 avatar + 2 creatures
Enemy1 to N enemies (varies per encounter)1 avatar + 2 creatures

PvP format

Architecture

BattleManager (state machine)
├── PlayerSide: [Avatar] [Creature1] [Creature2]
├── EnemySide: [1–N enemies] (PvE) / [Avatar + 2] (PvP)
├── TurnManager
├── ActionQueue
├── AnimationController
└── BattleResultHandler

Every battle is a deterministic replay — initial state + per-round RNG seed + committed move log, persisted once per round before resolution renders. PvE has no move timer. Details: PvP, Timers & Persistence.

Turn structure

Simultaneous selection, sequential resolution. Both sides select actions blind (double-blind). Once locked, all actions resolve in Speed order — highest Speed acts first. Status effects queued (poison, stun, burn, etc.) resolve after move resolution. This makes Speed the decisive tactical axis: a faster creature can KO a threat before it acts, even if both sides chose to attack the same target.

Class ultimates

Every class line carries one ultimate, authored in codex/ultimates.csv (one row per line per stage, 18 rows). It is learned at class level 10 (authored per row as Learn_Level, so it can be retuned per line or per stage without a code change) — below that level the ultimate does not exist for play at all: no plate, no autoplay pick, no priority action, though the class preview still describes it. It costs the avatar's action for that round, is usable once per battle, and resolves in a priority bracket ahead of every normal action, regardless of Speed. Two ultimates cast in the same round tie on the committed round seed — a 50/50 both sides commit to blind. Spending is stamped on the avatar unit itself, so it survives a crash-resume and a PvP reconnect, and clears only when a fresh battle builds its units. An action denied that round (bind) does not consume it.

LineS1 / S2 / S3Effect
WARRIORHold the Line / Iron Bulwark / Martyr’s AegisTaunt for the round. S2 adds +10% Defense for the rest of the battle; S3 adds 5% of maximum HP healed per hit taken this round.
MAGEShardburst / Stonefall / CataclysmStrikes every enemy. Power 75 / 100 / 125 per target.
ARCHERSure Shot / Deadeye / GodpiercerStrikes one enemy. Power 180 / 240 / 300.
BRUTEBlood Price / Tyrant’s Toll / Wrath of the PitRetaliation stance for the round: each hit taken answers with a 50 / 65 / 80 power counter and raises Attack 4 / 5 / 6% for the rest of the battle, capped at +40 / 50 / 60%.
PROFESSORRecitation / Grand Thesis / RevelationEcho: every support ability in the hero’s soul slots fires at once on the whole party, the hero included — self-only and ally-type abilities alike, and the type gate does not apply. Bonuses land at 40 / 50 / 60% strength (a +50% buff becomes +20% / +25% / +30%) and durations are halved, rounded up. Whole-number effects of one step round away to nothing at 40%.
ASSASSINSlip Away / Shadowmeld / VanishStrikes one enemy. Power 120 / 180 / 240, then untargetable by single-target moves for 1 / 2 / 3 rounds.

Resolution rules and edge cases.

Autoplay carries a matching option, ULTIMATE — FIRST TURN / NEVER USE (default FIRST TURN): it fires on the first round the ultimate is legal and falls through to a normal move on any round it is not, retrying the next round. The PvP timeout/disconnect AI never fires it. In the client the ultimate is a stylised plate above the move parchment; once spent the plate goes dead and reads ( ULTIMATE USED ).

Release note: ultimates.csv is newer than older release data pins. A client serving a snapshot without the file simply has no ultimate — the loader is quiet by design and warns nothing.

PvP sync

Both players submit actions simultaneously. Server resolves outcomes. Unity Relay for connection. Never resolved client-side.

Anti-cheat: Server-authoritative or server-verified only for PvP.

Combat stat axes

4 axes per creature and character. No Physical/Special split — single damage lane. Grade (1–10) determines base stat value identically across all species: a 6/10 Attack creature always has the same base Attack as any other 6/10 creature at the same level.

AxisRoleScaling
AttackDetermines damage dealt by attacksScales with level
DefenseReduces incoming damage; determines HP poolScales with level
UtilityStatus effect potency & duration, healing/shield powerScales with level
SpeedDetermines turn order — highest Speed acts firstFlat — does not scale with level

Stat formulas

Stats are built from two independent parts: a magnitude pool (level core + items) and an innate axis multiplier. Axis grades and class stage stats are multipliers of the item/level pool — identity scales power, gear provides it. Full numerical tables live in the Stat & Equipment Tables.

TermFormula
Core (creatures)Core(level) = 0.6 × 7.5 × (level + 25) — the grade-5 baseline pool (562.5 at level 100); 7.5 is STAT_SCALE
Axis multiplierAxisMult(g) = (3g + 5) / 8 — grade 1 ×1.00 · grade 5 ×2.50 · grade 10 ×4.375. Same curve for creature axis grades and class stage stats.
Creature Atk / Def(Core(level) + Σ TagStats) × AxisMult(grade) × QM
Character Atk / Def((Σ ItemStats + 0.25 × Core(level)) × AxisMult(classStageStat) × (1 + Σ increased%) + 188) × ClassSoulMult — gear plus a 25% level term, multiplied by the class; the flat +188 per axis (25 × 7.5) is an innate floor applied after the class and increased% multipliers, and the class soul grade multiplier scales the finished number, floor included
SpeedSpeed = axisGrade (flat — no level scaling, no quality scaling, no gear sources; only temporary in-battle stat stages modify turn order)
HPHP = (4 × level + 35) × (5 + Defense_Grade) / 11 × 7.5 + Σ flat HP items (×QM for creatures; characters take the core ×1.5, then ×(1 + soul HP%) × ClassSoulMult)
Boss HPBoss HP = 5 × Floor + 150 — an explicit budget (stored per boss in bosses.csv), replacing creature-formula HP for bosses. Tuned so an on-progression party (2 effective attackers on the boss while its SR actives pressure the third, grade-6 mid-quality striker, average rotation power 100) kills in 8–13 turns at every boss floor; high-Defense bosses naturally sit at the long end.
Quality multiplierQM = 0.80 + 0.04 × qualityGrade — multiplies creature Atk/Def/HP, never Speed. Worn ×0.84 → Void ×1.20. Creatures only.

Naked-creature numbers are identical to the previous flat-base model (Core × AxisMult; the (grade×30+50) curve was exact under the pre-2026-07-26 model (k 1.6 with axisMult = (3g+5)/20) and two shipped balance changes have moved it since: 43112a0 2026-07-26 took axisMult to (3g+5)/8 and k to 1.0, and da53dc7 2026-08-02 (D order) took k to 0.60) — all existing creature tuning carries over unchanged. What changed: Tag stats now scale with the creature's axis multiplier, and character stats are a pure product of gear × class.

Creature base stats at level 100 (Core × AxisMult, no tags, before quality multiplier)

GradeOff / Def / UtlSpeed (flat)HP (at this Def grade)
156311,780
277322,076
398432,373
41,19542,669
51,40652,966
61,61763,263
71,82873,559
82,03983,856
92,25094,152
102,461104,449

Move power bands

BandPowerCooldown
Light500
Standard800–1
Heavy1202
Nuke1603–4

Damage formula

RawDamage = ((2 × Level / 5 + 2) × MovePower × √(Attack / Defense)) / (130 / 7.5)
          + 15 + Attack / 50

FinalDamage = RawDamage
            × Synergy/Anti clause modifiers × Random(0.9–1.1)
            × (1 + Σ increased%)
            × Π(more multipliers)

Square-root ratio (T4, D 2026-10-22, verdict C1): the Attack / Defense ratio enters as its square root. On the plain ratio a geared attacker against a lagging Defense ended fights in two rounds (PvP median 2, 56% of fights over in ≤ 2; PvE medians 7 / 9 / 5 / 3 by floor band, floors 50–89 won only 61%). With the root, and the HP side of C1 (wild max HP ×0.6 / 0.7 / 1.0 / 1.2 on floors 1–49 / 50–89 / 90–109 / 110–119; Auto PVP fights on ×1.5 HP, see PvP), the sim lands PvP at a 5-round median and PvE at 5 / 6 / 6 / 5. No class or species stat changed. Bosses and their companions keep ×1 HP.

Divisor retuned 120 → 130 (July 2026) alongside the symmetric random band 0.9–1.1 (mean 1.0, was 0.85–1.0 mean 0.925) — mean damage is unchanged, hits can now roll over 100%. The + Attack/50 overwhelm term makes absolute stat growth matter: negligible early (level 10 ≈ +1), it prevents fully-optimized mirror walls from stalling ratio-based damage — validated max-vs-max bands: maxed striker vs maxed char wall 15, maxed creature mirror 16 (HP-stacked creature wall 19), PvE trash still melts. Level in the formula is the attacker’s level. Multi-hit moves (“damage as N hits”) use MovePower / N per hit and split the 15 + Attack/50 term by N (the flat 2 and the /130 divisor were scaled by STAT_SCALE 7.5 in the July magnitude rework: engine divisor 130/7.5, flat 2 × 7.5 = 15); the 0.9–1.1 roll is per hit — a move’s expected total equals its single-hit budget exactly (July 2026).

AoE moves: the authored Power is the per-target truth. Every foe takes the full listed power — there is no hidden per-target factor anywhere in the damage path. (A ×0.62 AoE multiplier existed in the engine's AoE resolution branch and never on any card or page; it was retired 2026-07-31 by ruling, and the AoE kit powers were re-authored to per-target truth in the same change: Onslaught / Pyroclasm / Stranglehold / Sunspot Strike 160 → 100, Sand Scour 80 → 50.) What a move card shows is what each target takes.

Moves

Every creature line has exactly 4 fixed moves — no move customization (creature customization is Tags/equipment only). Moves persist across the 3 advancement stages, growing stronger: Stage 2 ≈ 80% of Stage 3 power with reduced effect magnitudes; Stage 1 ≈ 60% power with one effect component removed. All 416 moves are catalogued in codex/moves.csv (104 lines × 4).

Budget ruleDetail
Damage-per-turn proxyDPT = Power / (1 + Cooldown), anchored at Standard 80 @ CD0 = 80. Heavy 120 @ CD2 = 40, Nuke 160 @ CD3 = 40 — the DPT deficit is the headroom that pays for rider effects.
Riders120-power carries one named debuff at CD2; 160-power carries a strong debuff or second component at CD3–4; 50-power can carry a strong effect at CD0–1; 0-power status moves carry very strong effects at CD1–4.
Buff stackingA status is identified by the ability that applied it. Two different abilities stack and their magnitudes add (+50% and +15% is +65%); one ability never stacks with itself, and re-applying it refreshes duration and keeps the stronger magnitude. Full rules, including Synergy-clause self-inclusion and targeting: Status Effects & Buff Stacking.
Named debuffs onlyNo generic statuses. Every buff/debuff is named and owned by one move (e.g. Mothervenom belongs to Echidna’s Viper Spit). Families: Shred (−Def), Sap (−Off), Mire (−Speed stages), named DoTs, Marks (+damage taken), and rare action-denial.
NO TYPE CHARTThere is no global type-effectiveness matrix and never will be. All type interaction lives inside individual moves: Synergy clauses — a move is empowered by allied types in one of three ways: (a) an ally of a certain type on the field boosts the move (+20–50% band); (b) the move is stronger when it targets an ally of a certain type (buffs/heals, +20–50% band); or (c) the move gains an added effect when used on an ally of a certain type and Anti clauses (bonus vs specific target types, +30–60% band, thematically justified). Every type appears as both a synergy-giver and an anti-target.
Kit shape by stat profileStrikers (A8–10): spam → utility-lite → Heavy CD2 → Nuke CD3–4 signature. Walls (D8–10): Def buffs, reflection, chip. Utility (U8–10): strong named debuffs/buffs, the game’s few heals (7 healers game-wide), damage held to Light/Standard. Speed (S8–10): first-strike riders and momentum.
Speed stagesIn-battle Speed buffs/debuffs are the only thing that modifies turn order. They are temporary stages (±1, ±2), never gear.

Move counts and the power bands (0 / 50 / 80 / 120 / 160 at S3) counted from codex/moves.csv; DPT computed on them. The cooldown anchors, rider and kit rules are design text. Generated by tools/codex_tables.py.

Character abilities — soul-granted moves

The player character has no innate abilities beyond a single fallback. Each ability slot mirrors the move of a creature soul equipped on the character's weapons and accessories. Rules:

Battle party rules

The base formula follows the proven creature-battler core. The increased/more split is bolted onto the modifier chain — increased sources add together (diminishing returns within a category), more sources multiply (always valuable). This rewards diversifying modifier sources over stacking one type.

Turn count targets

ContextTarget turnsDesign rationale
Regular PvE3–510 per floor, ~2–3 sec/turn animation. Must feel like mowing through fodder.
Boss10–15Boss format is boss + 2 actives (no reserves); length comes from elevated boss durability, not bench depth.
PvP10–15Long enough for sequencing decisions and swap timing. Bo3 finishes in ~2–3 min total.

Move system

Creatures have a fixed set of moves tied to their species and theme. Moves are not swappable or customizable. Hostile effects target enemies only; the sole exception is a deliberate self-cost rider on the caster, permitted when the move's upside is powerful (Monolith Skin's self-slow, Phylactery's post-survival Defense dip). Ally-targeted debuffs do not exist.

Move learning & upgrades

Creatures do not start with all four moves, and move versions improve with level — granular power steps between advancements, not only at them. Both schedules are derived per line from its own advancement levels (E1, E2) and stored in codex/moves.csv:

EventLevelRule
Learn (per move)Level_Learned: 1, then ceil(0.2·E1), ceil(0.4·E1), ceil(0.6·E1)Learn order is cheapest cooldown first (ties by slot) — every creature starts with a spammable and earns its signature nuke last.
Version 2 (all moves)Level_Upgrade_V2: ceil(0.8·E1)A pre-advancement power surge; the move's _S2 name/power/effect become active.
Version 3 (all moves)Level_Upgrade_V3: ceil((E1+E2)/2)Midway between advancements; the _S3 version becomes active. Versions never lag stage.

The _S1/_S2/_S3 move columns denote versions, gated by the upgrade levels above. Wild creatures obey the same schedule at their level (floor = level), so early floors field 1–2-move wilds; bosses are exempt (fixed kits). UI: on reaching an upgrade level, a power-up popup presents the creature and the move's old version beside its new one — names and numbers side by side.

ResourceStatusRationale
CooldownsActiveEach move has a cooldown (0 = always available, 1–4 turns for stronger moves). Creature identity IS its rotation pattern.
Stamina / PPRejected3–5 turn PvE fights end before resource pressure materializes. Autoplay AI can't meaningfully manage stamina — it either plays conservatively (boring) or burns recklessly (frustrating).
HoldDeferredPossible future addition: strong moves start on cooldown, preventing alpha-strike metas. Shelved until balance testing reveals need.

Healing is deliberately rare across creature movesets. Stall is countered through scarcity rather than resource attrition.

Creatures & characters

Realms & death system

One character per realm per account, always. Every account starts with a level 1 character in every unlocked realm. Death never removes or moves the character — it wipes them back to level 1 in place. Only items, creatures, and class XP are lost.

Death table

RealmOn deathCharacter after deathItems go to
EternalSoft — remain on floor, streak resetsUnchanged—

Season end migration

SUPERSEDED — history. There are no seasons in the game (D, #900 2026-09-14; T33). Nothing below runs. The live death rules are on system-realms.html.
↓
↓
  1. 3All class XP converted to soul gems — one per class with any XP, rank by XP amount
  1. 3All class XP converted to soul gems — one per class with any XP, rank by XP amount

Death mark data

CharacterSaveData {
}
The mark is provenance-only and persists through trades — death-marked creatures trade normally.

Metagame systems

All metagame systems are accessible as UI panels at any time during PvE floors, including during battles. They are locked during PvP. There is no physical base — everything is menu-driven.

🧬 Breeding
Six breeding pens (1 free, 1 bought with Ichor, 4 DLC). A pen holds a ♂/♀ pair sharing at least one type; toggled on, it drains Ichor per minute and fills a bar, dropping an egg into inventory each time it completes and continuing automatically. Rates key off pair grade P = ⌊mean of parent grades⌋. Parents are locked out of the battle party; removing one resets the meter. Full rules: Breeding.
🔧 Crafting REMOVED 2026-10-01
Removed from the game (D, card craft). Materials feed Upgrading; the record is crafting.html.
🥚 Hatchery SUPERSEDED
Eggs hatch from the soul bag at once — one, or Hatch All from floor 8 (eggs.html, unlocks). The original design: Egg incubation managed via UI. Set eggs to incubate, return after the timer. Hatchery level (upgraded via crafting resources) improves grade odds and slot count.

Creature acquisition

There is no capture mechanic. All creatures come from eggs — either dropped in combat or produced via breeding. Every egg must be incubated in the Hatchery panel before hatching. Egg grade weights the hatchling's grade roll — it does not fix it. Any egg can hatch a creature up to 4 grades above its own grade, or any grade below it; higher-grade eggs shift the roll upward and away from the low grades, but the top grades stay rare from any egg. Full weight table in the Eggs codex.

🥚 Wild eggs
Drop from combat encounters — every defeated wild creature rolls its line's Stage-1 egg at a rarity-scaled chance (codex/drop_rates.csv, Egg_Drop_Chance_*; 10% per battle in expectation), grade from the floor band's weights. Grade range: Worn through Legendary only — no wild eggs above grade 6. Grade determines stat range at hatch.
🧬 Bred eggs
Produced via the Breeding UI panel by selecting two parent creatures and spending Ichor. No grade cap — can produce up to Void. Higher grade parents significantly increase odds of higher grade output. Hatchery level also increases the chance of higher grade eggs independently of parent grade.
⭐ Starter creatures
Granted at character creation via the class-select screen — each starter class carries two fixed creatures, two Common lines at Worn quality grade (D 2026-11-02; classes.csv Starter_A / Starter_B). Genders roll 50/50 at grant on the server; starter creatures are account-bound (never tradeable). Later class unlocks grant no creatures. Assignments: Warrior — Thornback (Bristle) + Cindershard (Ember); Mage — Stormcrow (Fledgling) + Gloomcap (Button); Archer — Dusthound (Whelp) + Gustwing (Chick).

Ichor

Ichor is the metagame currency that runs the breeding pens. It has no other sink, so Ichor income is the hard ceiling on egg production — pen count never raises it. Two sources feed the same pool:

SourceHow it yields Ichor
CombatPer defeated enemy: round(2 × (1 + min(100, enemyLevel) / 100) × RarityMult) — RarityMult C 1.0 / UC 1.1 / R 1.2 / SR 1.35 / SSR 1.5. Roughly 670 Ichor/h at floor 1, 990 at floor 25, 1,540 at floor 99 (deep floors pay more: higher levels and richer SSR/SR encounter odds).
Egg dismantlingKeyed to egg grade — 15 / 25 / 45 / 70 / 46 / 72 / 108 / 164 / 244 / 344 (Worn → Void). Tuned against the hatch-weight matrix to always return 27–30% of what a pen would spend breeding that grade: a refund on a bad roll, never an engine.

Pen drain, egg duration, and Ichor-per-egg are authored per pair grade in codex/breeding.csv — Worn 3 Ichor/min / 15 min / 45 Ichor, up to Void 26 Ichor/min / 110 min / 2,860 Ichor. A single Void pen eats 88% of a floor-119 player’s kill Ichor (~1,780/h), and that income buys ~0.6 Void eggs per hour no matter how many pens are owned. Full rules: Breeding.

Kill Ichor at 109 battles/h (dfmc-client tools/sim_econ.mjs BATTLES_PER_HOUR) on encounter_weights.csv, rounded to 10. Generated by tools/codex_tables.py.

Incubation & hatchery

SUPERSEDED — history. There is no incubation and no hatchery panel. An egg in the soul bag hatches on the spot (single hatch from floor 1, Hatch All from floor 8); the hatch roll is the server's and its weights are egg_hatch_weights.csv on eggs.html.

All eggs must be incubated before hatching, managed via the Hatchery UI panel. The hatchery has two upgrade vectors, improved by spending crafting resources:

Hatchery upgradeEffect
CapacityMore eggs incubating simultaneously
Grade boostIncreases probability of higher grade eggs on hatch, independent of parent grade

Open decision: Does incubation time scale with egg grade (higher = longer wait), or is it a flat timer?

Creature advancements

Trigger typeExample
Level thresholdAdvance at level 27 (per-line, see bands below)
Item useUse Advancement Stone
Bond/friendshipHigh bond + level up

Advancement level bands (by rarity)

Advancement levels are per-line, stored in the Evolve_Level column of codex/creatures.csv (set on Stage 1 and Stage 2 rows — the level at which that stage advances to the next). Levels are spread within a rarity band so the player sees advancements frequently rather than in two synchronized waves. Commons advance earliest, SSRs latest. Within each rarity, lines cycle evenly through the band by line number (deterministic).

RarityLinesS1 → S2S2 → S3
Common28Lv 24–36Lv 56–68
Uncommon28Lv 28–38Lv 61–70
Rare20Lv 24–37Lv 63–69
Super Rare14Lv 26–38Lv 56–70
Super Super Rare14Lv 35–40Lv 67–73

Wild encounter stage-banding by floor is computed from these same per-line levels (see the wild-encounter section) — the two systems stay consistent because floor equals level.

Mutant variants

Any egg has a small chance to hatch as a Mutant — a creature with an alternate color scheme caused by a rare pigmentation mutation. Mutant status is purely cosmetic: it grants a medal on the creature sheet and changes the creature's color palette, but has no effect on stats or gameplay. Every wild creature also rolls for Mutant colouring when it spawns, on the same odds read against its own grade. Chance scales with grade. The Codex grants up to a permanent +0.1% bonus to all mutant hatch chances, earned in ten zone tiers — Acquire every creature appearing on a zone's floors (90 per zone; sets overlap, union = all 300) for +0.01% each.

Egg gradeMutant chance
Worn0.01%
Common0.02%
Uncommon0.03%
Rare0.04%
Epic0.05%
Legendary0.06%
Abyssal0.07%
Divine0.08%
Primordial0.09%
Void0.10%

Fusion

Two creatures of the same species can be fused via the Fusion UI panel. Fusion consumes both creatures and produces one:

PropertyResult
XPCombined XP of both creatures
GradeHighest grade of the two is kept
MutantIf either creature is Mutant, the result is Mutant

Codex

The Codex is a Pokédex-style catalogue of every creature the Collector has encountered or acquired. It serves as both a reference tool and a progression record.

Entry states

StateConditionInformation visible
UndiscoveredNever encounteredSilhouette only, no data
SeenEncountered in battle at least onceName, floor levels found, basic stats ranges visible
AcquiredHatched from an egg of this creature typeFull entry — all moves, full stat ranges, advancement chain, egg grade ranges
Where the states surface. Three surfaces read the same knowledge map and must present it identically: the codex grid, the floor-map creature tiles, and the floor-map row indicator. A creature tile is blacked out with no name when Undiscovered; dimmed (grayscale, 75% brightness) with its real name and an eye medal when Seen; full colour with its rarity border and a rune medal when Acquired; and carries the mutant medal when a mutant of that species has been hatched. The floor row shows the eye when every creature on that floor is at least Seen, a tick when all are Acquired, and a double tick when all are mutant.

Entry contents (full)

📍 Encounter data
Floor levels the creature is found on, encounter type (Outdoors / Cave / Fishing), and whether it appears as a wild encounter or boss.
⚔️ Moves
All possible moves the creature can have, with damage type, effect, and unlock level. Moves the player has seen used in battle are marked separately from full unlock.
📊 Stat ranges
Min and max possible values for each stat (HP, Attack, Defense, Speed, etc.) across all grades. Higher grade creatures have higher stat ceilings.
🧬 Advancement chain
Full advancement tree for the creature line, showing trigger conditions (level, item, bond). Advancement stages link to their own Codex entries.

Codex scope

Resolved: The Codex is a UI panel viewable at any time during PvE (including during autoplay), consistent with all metagame systems — no physical base. Open decision: does the Codex track personal best stats of owned creatures, or only the theoretical range?

Equipment

Equipment slots

Each character has 8 equipment slots. Weapons and accessories provide useable abilities. Armour slots provide passive bonuses.

Weapons & accessories — grant active abilities
Main handPrimary weapon — ability slot
Off handShield, off-hand weapon, or tome — ability slot
Accessory 1Ring, amulet, etc. — ability slot
Accessory 2Ring, amulet, etc. — ability slot
Armour — grant passive bonuses
HeadHelmet
ChestBody armour
GlovesGauntlets
FeetBoots

Creature souls

Each piece of character gear can have the soul of a creature attached to it. What the soul does depends on the slot class:

Slot classSlotsSoul effect
Ability slotsMain Hand, Off Hand, Accessory 1, Accessory 2Move grant: the character gains the equipped creature's move for that ability slot (slot 1–4). Character Attack, no STAB; Synergy/Anti clauses apply. See "Character abilities — soul-granted moves" in Battle System.
Passive slotsHead, Chest, Gloves, FeetScoped passive: every creature has a unique passive per armor slot, catalogued in codex/souls.csv (400 passives). Slot flavors: Head = perception/self, Chest = core plate, Gloves = hands/attack craft, Feet = team/positioning.

Passive souls have one of three scopes:

Soul scopeEffectExample
LocalBuffs only that item's contribution — strongest per-item impact (×1.35 / ×1.40 / ×1.45 / ×1.52 / ×1.60 by rarity, Common → SSR)Thornback on Chest: "This armour's Defense ×1.35"
PersonalBuffs the character's totals — moderate power (5–10% band by rarity)Dusthound on Head: "+4% Attack"
TeamBuffs all allies (character + both creatures) — weaker per target but ×3 entities (4–8% band)Yggdrasil on Feet: "All allies +7% Defense"

Soul scope varies per creature per slot, creating targeted build decisions around which soul goes where. Passive magnitudes follow the equipped creature's stage, but NOT the way move powers do: the authored Effect_S3 value is the Stage 1 magnitude, and later stages multiply it upward. SOUL_STAGE_MULT in play/app.js is [–, 1.00, 1.12, 1.25] — Stage 1 ×1.00, Stage 2 ×1.12, Stage 3 ×1.25. The column name is historical and does not mean the value is the Stage-3 figure. Speed never appears on any soul passive. A creature whose soul is equipped in any slot cannot be summoned; one soul per creature across all 8 slots. A socketed creature is still a creature: it earns the same battle XP the party earns, it levels in the socket, and when it crosses its line's Evolve_Level it advances there, playing the same advancement scene a party creature does — which steps its passive and its granted move up a stage band. Soul grade, quality grade and XP all survive the change.

Soul grade — the second multiplier

A creature soul's grade is the source creature's quality grade, inherited from the egg (D ruling 2026-08-05). It has no independent soul grade and no resource ladder: creatures are not upgraded with resources, they are bred and hatched, so this lever is raised by breeding for a better egg. The grade multiplies the soul's output: the passive magnitude on armour slots, or the granted move's power on ability slots. Only class souls (CLS-*) grade with resources — see Class souls below and the Upgrading page.

RuleDetail
MultiplierSoulMult = 1 + (1/9) × (grade# − 1) — Worn ×1.00 → Void ×2.00. Stacks multiplicatively with stage scaling (S1 ×1.00 / S2 ×1.12 / S3 ×1.25), so the combined surface runs ×1.00 (S1 Worn) to ×2.50 (S3 Void).
SourceCreature souls: the source creature's quality grade (soulInfo() reads src.grade). Class souls: their own graded field, upgraded through codex/soul_grading.csv.
Class-soul attempt costThe fixed bundle per step in codex/soul_grading.csv — Scrap + Dust + Essence + Ink, every currency required (Worn → Common 30 Scrap + 2 each; Primordial → Void 1,200 Scrap + 80 each). No Ichor.
Class-soul success chanceShared grading ladder: 100 / 90 / 70 / 50 / 35 / 20 / 8 / 3 / 0.5% into Void — no pity, pure roll every attempt. On failure the bundle is consumed and the grade is unchanged.

Equipment grades

Grade determines how many gem, rune, and enchantment slots a piece of gear has. Equipment is also tiered every 10 character levels. From Abyssal upward, items have visual effects in addition to their color — effects appear on item icons and names in inventory, equipment UI, and the battle conclusion screen. The same layer plays behind creature portraits — the soul-bag tiles, the breeding pen cards, the equipment party cards, and the creature sheet (the window a creature opens into; 2026-09-06, LIVE on release since 2026-09-08 (0.71).).

Items never drop on the ground — all loot is delivered directly to inventory via the battle conclusion screen.

GradeGemsRunesEnchantmentsVisual effect
Worn————
Common1———
Uncommon11——
Rare111—
Epic211—
Legendary221—
Abyssal222Shadow wave rolling down over a dim red glow
Divine322Tiny light-green stars, blinking
Primordial332Flowing energy, subtle distortion
Void333Dark tendrils, particles, chromatic aberration on hover

RESOLVED — D, 2026-08-12 (report #128): Visual effects scope is all of the above — item name text, icon and full icon treatment. Built on dev (0.48) for all three surfaces this section names: inventory, equipment UI and the battle conclusion screen. Only Abyssal and above animate; the six grades below it stay completely static.

Layer order and the divine loop — D, 2026-08-13 (report #131), ON DEV: every effect sits above the icon backing and below the art — the effect layer renders at the bottom of each tile's stack and every art node (item icon, creature portrait, glyph fallback) is positioned above it, on all effect sites including the tag rows, whose icon previously WAS the tile's own background and could never sit above anything. And the divine sheen loops seamlessly: its old timeline held off-tile for the last 45% of every cycle, which read as a pause; the hold is removed and the sweep traverses edge to edge continuously, wrap invisible because both endpoints are outside the tile. Verified from the rendered client, not the source (tools/probe_gfxlayer.py 9/9: computed z-order per site plus the live keyframe rule).

Two things D ruled at the same time, both of which narrow the work: the grade border logic is correct as it stands and is left alone, and the equipment screen having no border is deliberate. Item names on the equipment slot rows are also fine as they are — those rows print art, tier badge and stat and no name, so the name effects land on the item detail panel and the currently-slotted panel, which are the only places on that screen a name appears.

Before this ruling none of the four effects existed: the words Abyssal, Divine and Primordial appeared zero times in the client markup and the item tile carried no animation at all, so every item from Worn to Void got the identical static treatment. A grade glow had been computed for every inventory tile since it was written and bound in no markup — the same dead-prop tell that found #86 and #129.

Modifier scopes

Every modifier in the game has one of three scopes, determining what it affects.

ScopeAffectsUsage
LocalOnly the item it's on — scales that item's own stat contributionDefault for all character gear modifiers (gems, runes, enchantments). A rune's +8% on a weapon only multiplies that weapon's base + gems.
PersonalThe bearer as a whole — the character or the specific creature wearing itCreature tag modifiers (tags are the exception — all tag modifiers are Personal, affecting the creature's total stats). Some creature souls.
TeamAll allies (character + both creatures)Some creature souls. Individually weaker per target but multiplied across 3 entities.

Modifier slots

💎 Gems — flat stats
Fixed flat modifiers. 3 gem types: Garnet (+Attack), Onyx (+Defense), Bloodstone (+HP) — 4.5 × T × GF each. Set at socket time, removal destroys the gem. On character gear: Local scope. On Tags: Personal scope. Up to 3 slots at Void grade.
🔷 Runes — percentage scaling
Fixed percentage modifiers. 3 rune types: Ruin (+% Attack), Aegis (+% Defense), Vitality (+% HP). Multiply the item's base + gems (Local) or the creature's total (Personal on Tags). Set at socket time, removal destroys the rune. Up to 3 slots at Void grade.
📜 Scrolls — random modifier pool
Socketable items for enchantment slots. On socket, the scroll rolls a random Local modifier: flat Attack / Defense / HP, or item-local % Attack / Defense / HP. Enchantment stats are item-local only — no Personal rolls, no loot modifiers. Rerollable for Ink. Up to 3 slots at Void grade.

Enhancement items — tiers, grades & materials

Gems, runes, and scrolls are items in their own right: each has a level tier (10 named tiers matching the 10 level brackets — e.g. Rough → Cut → … → Radiant → Sublime for gems) and a grade (Worn–Void). An enhancement's tier must be ≤ the gear's tier to socket. Full tier ladders and all values live in the Stat & Equipment Tables.

FamilyDismantles intoMaterial pays for
💎 GemsDustGrading gems up (crafting removed 2026-10-01)
🔷 RunesEssenceGrading runes up (crafting removed 2026-10-01)
📜 ScrollsInkGrading scrolls up (crafting removed 2026-10-01), rerolling a socketed scroll's modifier (3 × tier Ink)

Modifier pipeline

Character gear (Local by default)

Per item:
  ItemStat = (BaseImplicit + Σ GemFlats) × (1 + Σ Rune%)
           + enchantment effects + creature soul effect

Character total:
  ItemStat = (BaseImplicit + Σ gems)
           × (1 + Σ rune increased%)
           × (1 + Σ Local enchant increased%)   // + flat enchants into base band
           × Local soul effect (armour slots)

  CharStat = Σ all ItemStats
           × ClassAxisMult((3 × stageStat + 5) / 8)
           + Σ Team modifiers from souls
           + 188 innate floor (post-multiplier)

  CreatureStat = (Core(level) + Σ TagStats)
               × AxisMult × QM
               + Σ Team modifiers from character gear souls

Creature Tags (Personal scope — all modifiers affect creature's total stats)

CreatureStat = BaseStat(grade, level)
             + Σ gem flats from both tags
             × (1 + Σ rune % from both tags)
             + enchantment effects
             + Σ Team modifiers from character gear souls

Base types & implicit modifiers

Every equipment slot carries a flat implicit modifier, always present regardless of grade or sockets. There are no tier-prefix names (Crude → Transcendent is retired for gear) — each tier is a distinct named piece with its own image.

SlotImplicitStructure
Main Hand / Off HandMH: flat Attack 16.5 × T × GF. OH: flat Attack 4.5 (Mage/Archer/Brute/Assassin) or flat Defense 6.6 (Warrior shields, Professor tomes)Class-bound weapons, 10 tiers per hand (one every 10 levels, like all equipment). 3 art identities per hand track the class stages; within a band, tiers take the Veteran's / Champion's / Tyrant's prefix and reuse the band art. 120 weapon items, 36 art identities.
Head / Chest / Gloves / FeetFlat Defense (6.6 × T × GF)One ladder of 10 distinct named pieces per slot (40 pieces). Defense only — armour identity is visual, not statistical.
Accessory 1 & 2One flat stat, Local2 base types — the choice slots express kill-faster vs live-longer; Defense is the armour identity. Accessories carry Local stats only — no Personal or creature-affecting implicits.

Class weapons (identity follows class stage)

Class lineMain hand — S1 → S2 → S3Off hand — S1 → S2 → S3
Warrior → Knight → PaladinArming Sword → Longsword → Great MorningstarKite Shield → Heater Shield → Tower Shield
Mage → Sorcerer → ArchonCrystal Staff → Amethyst Staff → Ruby WarstaffHandflame Focus → Amethyst Shardring → Magma Orbit
Archer → Ranger → HawkeyeAsh Shortbow → Runed Recurve → Hawkwing GreatbowScout's Quiver → Silvered Quiver → Obsidian Quiver
Brute → Warlord → TitanNailed Club → War-Club → Colossus AxeFist Cords → Iron Knucklewraps → Titan Chainwraps
Assassin → Stalker → NightbladeIron Dagger → Blackened Scimitar → Bladed GauntletPaired off-hand of the same (dual wield)
Professor → Sage → ProphetCut Quill → Gilded Quill → Scribing QuillBattered Tome → Ancient Tome → Hovering Grimoire

Weapon tier progression (every 10 levels, like all equipment)

3 art identities per hand per class; within an art band, higher tiers take a prefix and reuse the band's image. Art bands: T1–T3 (stage-1 weapon) · T4–T6 (stage-2) · T7–T10 (stage-3). Craft cost follows the universal gear rule, 25 × Tier Scrap (output Worn; grade up via Ichor). Example shown on the Warrior main hand — the pattern is identical for all 12 hands.

TierNameLevel reqCraft cost
T1Arming Sword125 Scrap
T2Veteran's Arming Sword1050 Scrap
T3Champion's Arming Sword2075 Scrap
T4Longsword30100 Scrap
T5Veteran's Longsword40125 Scrap
T6Champion's Longsword50150 Scrap
T7Great Morningstar60175 Scrap
T8Veteran's Great Morningstar70200 Scrap
T9Champion's Great Morningstar80225 Scrap
T10Tyrant's Great Morningstar90250 Scrap

Main hand implicit — flat Attack per tier × grade (16.5 × T × GF, strictly increasing per tier and grade)

Grade \ TierT1T2T3T4T5T6T7T8T9T10
Worn173350668399116132149165
Common1837557492111129148166185
Uncommon20416182102123143164184205
Rare22456790112135157180202224
Epic24497398122147171195220244
Legendary265379106132158185211238264
Abyssal285785114142170199227255284
Divine306191121152182213243273304
Primordial326597129162194226259291323
Void3469103137172206240275309343

Off hand implicits

Offensive off hands (Mage / Archer / Brute / Assassin): flat Attack, 4.5 × T × GF (gem grid). Defensive off hands (Warrior shields, Professor tomes): flat Defense, 6.6 × T × GF (armour grid) — a fifth armour piece. Every class line totals the same 33 × T × GF gear budget.

Armour ladders (T1 → T10, one distinct piece per tier)

SlotLadder
HeadCowl · Hood · Coif · Sallet · Barbute · Helm · Greathelm · Wyrmskull Helm · Sanctified Casque · Voidcrown
ChestPadded Jerkin · Leather Jerkin · Brigandine · Scale Hauberk · Chain Hauberk · Cuirass · Warplate · Bloodforged Plate · Sanctified Bulwark · Voidplate
GlovesHandwraps · Leather Grips · Studded Grips · Bracers · Chain Mitts · Steel Gauntlets · Wargauntlets · Bloodforged Fists · Sanctified Grasp · Voidclaws
FeetFootwraps · Worn Boots · Hobnailed Boots · Riding Boots · Chain Boots · Greaves · Wargreaves · Bloodforged Stride · Sanctified Sabatons · Voidtreads

Accessory base types (Local only)

Base typeImplicit
Signet+Attack (6.0 × T × GF)
Relic+HP (9.0 × T × GF)

Retired item classes: Totem, Talisman, Fetish, Idol, Effigy. Ward retired separately: at the max-build anchor a Defense accessory is strictly dominated by an HP accessory (the Attack/50 damage floor is Defense-immune, and marginal flat HP on the deliberately small HP pool outvalues marginal Defense on the large Defense pool — 14.4 vs 10.7 wall turns). Character-side stats are exactly three pools: Attack, Defense, HP. Creature buffing from the character lives exclusively in Team-scope souls.

Creature equipment — Tags

Creatures have 2 equipment slots that accept Tags. Tags follow the same grade system and gem/rune/enchantment slot rules as all other equipment, with one exception: Tags cannot be equipped with creature souls.

Tag slot 1 & 2
Tags can have implicit modifiers (from base type), gems, runes, and enchantments according to their grade. No soul attachment.
No soul attachment
Unlike character gear, Tags cannot have a creature soul socketed. All other modifier rules are identical to character equipment.
RuleCharacter gearCreature Tags
Grades (Common–Supreme)YesYes
Gem slotsYesYes
Rune slotsYesYes
Enchantment slotsYesYes
Base type implicitYesYes
Creature soul socketYesNo

Nothing is useless

Every drop has value, however marginal. All gear dismantles into Scrap (plus Ichor at Rare+), and Scrap pays for gear grading and class unlocks (crafting was removed 2026-10-01). All enhancements dismantle into their family material (Dust / Essence / Ink), which grades the next tier of enhancements. A Worn Rough gem drop at floor 95 is still Dust in the pipeline.

Gear crafting & level requirements

SUPERSEDED — history. The Craft gear row below is history: crafting was removed from the game 2026-10-01 (D, card craft; record). The level-requirement rows are live and are the rule (items.csv Level_Req).
RuleDetail
Craft gear (removed)25 × tier Scrap produces a Worn item of chosen slot and base type at that tier (T10 = 250 Scrap)
Equip requirement — character gearTier N requires account level ≥ (N−1)×10 (T1 = level 1, T2 = 10, … T10 = 90) — items.csv Level_Req, judged against the account level (D ruling 2026-08-25: “Account level gates gear”; the class level plays no part). Gear above the account's level cannot be equipped.
Equip requirement — TagsSame thresholds against the creature's level: Tag A/B of Monster I test Monster I's level, Tag A/B of Monster II test Monster II's. A tag slot whose creature slot is empty has no level to test and is not gated (the tag is judged the moment a creature is seated).
Gems, runes, scrollsCarry the same Level_Req ladder ((tier−1)×10) and test the level of the piece's wearer: the account level in character gear, the creature's level in a tag. Socketing and enchanting refuse above level, before anything is consumed or rolled.
Already worn above levelNever unequipped or moved (D ruling 2026-07-28 on anything illegal): the piece — or the stone or scroll — stays where it is, contributes nothing, and its slot reads ILLEGAL · LV n in red until the wearer reaches level n, when it comes alive by itself. The server's power figure applies the same rule, so the board and the sheet agree.
Enhancement socketingEnhancement tier ≤ the gear's tier (unchanged)

Level requirements are enforced ON DEV since 2026-08-25, LIVE on release since 2026-09-01 (0.65) — before that nothing read Level_Req at all. Mechanics in full on Equipment.

Grading up

Gear can be upgraded to the next grade (e.g. Rare → Epic) using Scrap (enhancements pay their family material). Failure consumes the currency only; nothing is ever destroyed.

RuleDetail
CurrencyScrap (gear) · Dust / Essence / Ink (enhancements)
Cost scalingRises with the rung and with the item's tier (2026-07-31): the T10 column is the hour-priced ladder, lower tiers discount on the measured income curve, so the time price per rung is identical at every tier — full 9×10 grids on the Upgrading page
Success chanceInto C/UC/R/E/L/A/D/P/V: 100 / 90 / 70 / 50 / 35 / 20 / 8 / 3 / 0.5% — no pity, pure roll every attempt
Attempt cost1 / 1 / 2 / 3 / 5 / 8 / 12 / 18 / 40 Ichor per attempt by target grade
On failureNo progress, no destruction — Ichor is consumed but grade is unchanged

Ichor sources

SourceYield
Boss kills1–3 Ichor per kill
Dismantling Rare+ gearR 1 / E 2 / L 4 / A 8 / D 12 / P 20 / V 32
Deep-floor battle drops (floors 61+)~2% chance per battle

Raising an item's grade

Grade is raised only by spending resources on an attempt — Ichor for gear, and the matching currency for gems, runes and scrolls. A failure consumes the currency and changes nothing else. There is no combining of items.

Economy & marketplace

Acquisition & upgrade economy

All progression currencies flow from battles, denominated in battles (~109 battles/h on autoplay, single active character; the economy simulator’s figure, dfmc-client tools/sim_econ.mjs BATTLES_PER_HOUR). Journey milestones are near-deterministic (thousands of drop rolls); the endgame is gated by pure-RNG success rolls with no pity system anywhere — the market is the variance smoother. Full numeric tables in Stat & Equipment Tables.

IncomeRate
Gear dropPer creature defeated, rarity-scaled on the value ladder ×1/1.5/2.5/4/7, normalized per floor against encounter weights (codex/drop_chances_by_floor.csv) — exactly 10% per battle at every floor; base drawn uniformly among the gear bases (weapons, armour, accessories, tags), at-floor tier, grade weights by floor band per codex/drop_grade_weights.csv (Divine+ never drops)
Enhancement drop (gem / rune / scroll)Per creature defeated, independent roll on the same per-floor table — exactly 10% per battle; even family split, grades one band behind gear
Egg dropPer creature defeated, independent roll on the same per-floor table — exactly 10% per battle; the defeated line's Stage-1 egg, grade from the floor band clamped to the Legendary wild-egg cap
First-win bonus dropsThe first 10 wild-battle wins each grant additional guaranteed drops on top of normal rolls — Worn T1 gear and gems on an authored ladder, plus eggs (wins 1 and 9) of the lowest-rarity enemy present, random among ties. Boss wins do not advance the counter. Win 1 rolls the accessory family; win 4 grants the complement. Authored in codex/first_win_drops.csv.
Scrap~150/h endgame (dismantling)
Ichor~10/h endgame (bosses, Rare+ dismantles, deep-floor drops)
Dust / Essence / Ink~20/h per family endgame (enhancement dismantles)

Progression milestones (per premises)

StageWhat the player hasEffort
Level bracket 9/10Uncommon+ gear in all 12 slots, key pieces at Rare (first scroll socket), Uncommon enhancements socketedDeterministic — falls out of the leveling journey (~5,200 battles by floor 90)
Grade 5Epic key pieces (~11 expected Ichor each), Rare enhancements (~45 material each)A bit of grind — reachable within weeks of hitting 100
Legendary–DivineMarket-relevant gear, the trading tierMonths; where most endgame players live
Primordial / VoidThe chaseYear-scale per item for dedicated players (see below)

The endgame chase — expected / lucky / unlucky (no pity)

Success gates are geometric distributions: the spread between a lucky (p10) and unlucky (p90) player on a single gate is ~22×. Failure costs currency only — no destruction, no downgrade. Raw chance: Void 0.5%.

One item, Worn→Void grading
Expected ~54,535 Scrap at T10 ≈ 16.6 h at floor 119 (3,287 Scrap/h at 109 battles/h) (Void gate alone: p10 ~4,624 / expected 44,000 / p90 ~101,060)

A marquee item taken to Void is ~16.6 h expected at floor 119, with honest odds of doubling that on a bad run. A full 12-slot Void loadout is a long, market-aggregated pursuit; Void enhancements (expected ~141,243 material each) are rare trade goods. Casuals buy from the market; grinders and lucky rollers supply it — that variance is what gives grade-5+ items real price discovery. Hours at ~109 battles/h (the economy simulator’s figure, dfmc-client tools/sim_econ.mjs BATTLES_PER_HOUR); generated by tools/codex_tables.py.

Monetization model

SUPERSEDED — history. What is live: free to play, Wraithgold as the only premium currency with a server-owned ledger (Premium Shop), no battle pass and no seasons (T33), no marketplace. Real-money purchases open when the Steam partner account does; no account starts with Wraithgold (T56). The list below is the original plan.

Cosmetics-only monetization is safer for player reception and avoids regulatory issues in certain markets. Decide scope early.

Steam marketplace integration

Tradeable items and creatures are Steam Inventory items. Ownership lives on Steam; gameplay data lives on the backend keyed to instance IDs.

Ownership model
SteamInventory
└── Owns CreatureToken #ItemDef_042, InstanceID 8837623

Your Backend
└── CreatureInstance_8837623 {
      level, moves, stats,
    }
On fungible Community Market listings the mark is not visible pre-purchase (instances share one ItemDef listing); in peer-to-peer trade offers it is visible on the instance.

Item grant flow (server-side only)

  1. 1Player completes breed/craft action
  2. 2Client sends request to cloud function (AWS Lambda / PlayFab CloudScript)
  3. 3Server validates action is legitimate
  4. 4Server calls Steam GenerateItem API with publisher key
  5. 5Steam issues item to player inventory
  6. 6Confirmation returned to client

Never grant Steam inventory items from the client. Server-side only with publisher key validation.

Tradeable vs non-tradeable

TradeableNot tradeable
Creatures — instance data and death mark travel with the tokenLadder progress / rank
Crafting materialsCharacter / class levels
Cosmetic itemsEggs — hatch to trade the creature
EquipmentAccount-bound starter items
Soul Gems (TBD)—

Tech stack

SUPERSEDED — history. The game is not built in Unity. The live stack is a single-page web client (play/app.js, play/markup.html) on a 1920×1080 stage, a Cloudflare Worker with Durable Objects (src/worker.js), R2 backups, Steam / Google / Discord sign-in, and an Electron shell for the Steam download. See Client Shell, Networking, Integrity, Accounts. The Unity plan below is kept as history.

Unity packages

PackagePurpose
Input SystemAll player input — abstracted for future mobile port
CinemachineCamera management
TextMeshProAll in-game text
AddressablesAsync AI art asset loading — critical for volume
Newtonsoft JSONData serialization
Netcode for GameObjectsPvP battle sync
A* Pathfinding ProjectAutoplay pathfinding on tilemap
Unity LocalizationFuture-proofing for multiple languages

Backend services

ServicePurpose
Unity Gaming ServicesAuth, cloud save, leaderboards, economy, remote config
Unity Relay + LobbyPvP matchmaking and connection
Steamworks.NETSteam integration, achievements, inventory, market
Steam Inventory ServiceTradeable item ownership (ItemDefs)
Cloud function (Lambda/PlayFab)Server-side item grants, trade validation

ScriptableObject data types

Save system

Player logging system

Two separate logs give players a transparent record of what happened, both implemented after core gameplay systems (battle, leveling, items) are in place — building the export pipeline against placeholder data would mean redoing it once real systems exist.

Log typeContents
Event logHigh-level player events: died, entered battle, completed battle (with XP and items acquired), acquired boss key, progressed to next floor
Battle logDetailed per-battle record of every move and result, scoped to a single battle

Build roadmap

SUPERSEDED — history. The phases below were the Unity plan. The shipped game is tracked by release (0.92 live, 0.93 on dev) in the dfmc-client repo; checklist.html is the same history.

Active: Simplified Static (prototype)

Click-to-battle prototype — no player avatar, no grid movement. The map displays a ground plate with props and creatures wandering around. The player hovers over creatures to see rarity, clicks to battle. Floor progression rules unchanged.

  1. 1Data architecture — all ScriptableObjects and save system skeleton
  2. 2Floor renderer — load ground plate sprite + prop sprites from floor config, Y-sorted SpriteRenderers on a Transparency Sort Axis
  3. 3Creature spawning — persistent 10-cap pool per floor, serial 60 s server-clocked respawner (see Core loop → Wild spawns); rolls from encounter table with weighted rarity, place at valid positions (not on props/boundary)
  4. 4Creature wandering — random waypoint movement within floor bounds, idle pauses, speed variance per instance
  5. 5Creature interaction — mouse hover highlights creature with rarity color outline (C=grey, UC=green, R=blue, SR=purple, SSR=gold), click initiates battle
  6. 6Battle system (minimal) — 1v1 turn-based battle, creature moves, win/loss result
  7. 7Respawn system — fixed creature cap per floor, defeated creatures removed from map, one respawn per minute at random open position
  8. 8Floor progression — win streak threshold ceil(floor0.65), portal sigil activates on threshold met, click portal to advance, loss resets streak
  9. 9Multi-floor loop — floor transitions, floor data loading from CSV, 10 grasslands floors playable end-to-end
  10. 10Full battle system — expand to 3v3 (avatar + 2 creatures), moves, status effects, animations
  11. 11Boss floors — every 10th floor, boss team encounter, key drop from pre-boss floors
  12. 12Character & class system — class XP, character level, class stages
  13. 13Codex — creature catalogue, seen/acquired states
  14. 14Metagame UI — breeding, crafting, hatchery panels
  15. 15Autoplay — auto-click creatures, auto-battle, configurable thresholds
  16. 16Backend authority layer — the UGS spine before any online system: Steam-native Auth, Cloud Save keys + access classes (Protected/Private), Cloud Code transaction contract + reward validation (turn-count rate cap, sampled deterministic replay), client event buffer + reconciliation, idempotency keys + writeLock. Full spec: Backend, Save & Anti-Cheat
  17. 18PvP & ladders — matchmaking, relay, leaderboards — commit-reveal rounds, single end-of-match server verification
  18. 19Steam integration — Steamworks.NET, inventory, marketplace — server-side mint (publisher key) + transfer lock
  19. 20Monetization — economy service, battle pass, item grants
  20. 21Steam release — store page, F2P config, achievements

Design backlog (later)

Archived: Isometric Exploration (original roadmap)

Original roadmap with top-down grid movement, player avatar, tile-based encounters. Archived for potential future use.

View archived roadmap
  1. 1Data architecture — all ScriptableObjects and save system skeleton
  2. 2Single-floor overworld — grid movement, collision, camera, tilemaps
  3. 3Encounter trigger — battle scene entry, minimal 1v1 battle, return to overworld
  4. 4Full battle system — expand to 3v3, moves, status effects, animations
  5. 5Floor progression — boss gate, stairs, floor transition, multiple floors
  6. 6Floor win condition — battle win counter, portal unlock
  7. 7Boss key & boss floors — key drop chance on pre-boss floors, key consumption, boss floor access via portal or map selector
  8. 8Autoplay & multi-tab system — pathfinding, config options, death handler, simultaneous multi-character simulation
  9. 9Character & class system — class XP, character level aggregation
  10. 10Codex — creature catalogue, seen/acquired states, stat ranges, move lists, advancement chains
  11. 11Metagame UI — breeding, crafting, hatchery — all as in-game UI panels accessible during PvE
  12. 12Player logging system — event log and battle log, hooked into existing battle/leveling/item systems, file export for PC and mobile share UI
  13. 14PvP & ladders — matchmaking, relay, leaderboards
  14. 15Steam integration — Steamworks.NET, inventory, marketplace
  15. 16Monetization — economy service, battle pass, item grants
  16. 17Steam release — store page, F2P config, achievements

Critical risks

PvP anti-cheat — server-authoritative resolution required. Design this before any PvP work begins.

Art consistency — lock style-guide prompt before mass generation.

Trade duplication exploits — implement transfer lock before marketplace goes live.

Future features (cut from current scope)

Skill trees — passive skill trees (graph of stat/modifier/keystone nodes, skill points on level-up, respec) for classes and creatures are cut from this iteration. Class and creature power comes from levels, stages, grades, equipment, and souls only. Trees may return as a post-launch depth layer.

Farming — a timer-based UI system (plant a crop, return after a duration to harvest, yield rendering into crafting materials) was cut from current scope. Crops are therefore not a source of Ichor: Ichor comes only from completing battles and dismantling eggs. May return later.

Rogue Collectors — hostile NPC trainer encounters with patrol routes and line-of-sight triggers, originally part of floor structure. Removed from active scope to keep early development focused. May be reintroduced post-launch or in a content update.

Gathering nodes & secret areas — the original handcrafted circuit map design with resource nodes, HM-gated secret areas, and a node-farming layer has been replaced by the simpler battle-win-threshold map design. All equipment and crafting materials now come from battle rewards only. May be reconsidered as a future map variant or content layer.

Physical base — the original design included a physical base the Collector could walk around in, with tile-based farming, craftings stations, a hatchery building. This has been replaced entirely by UI panels accessible during PvE floors. A physical base may be reintroduced in a future content update as an optional social/cosmetic space.

Isometric Exploration — the original prototype used top-down Gen II–style grid movement with a player avatar, tile-based encounter triggers (grass/cave/fishing), and autoplay pathfinding. Archived in favor of the Simplified Static approach for faster prototyping. The full grid-movement system can be restored from the archived roadmap above.

Open decisions

Glossary

Canonical terms and naming, kept here specifically to stop naming drift across sessions and files. This page is the source of truth for what everything is called and where the data lives — a new session picking up design or coding work should read the relevant file below rather than re-deriving anything.

Repositories & data files — start here

LocationWhat it holds
eccestanczyk/dfmcThis GDD (index.html at the GitHub Pages root), the codex data CSVs under codex/, and the live codex site pages.
eccestanczyk/dfmc-gameThe Unity 6.5 project. Runtime game-data CSVs live in Assets/Data/, imported into ScriptableObjects.

Live GDD: eccestanczyk.github.io/dfmc/ · Live codex index: eccestanczyk.github.io/dfmc/floor-codex.html

Codex data — the creature roster & encounter tables

These CSVs are the source of truth for creatures and where they appear. The codex site reads them live from the main branch, so updating a CSV updates the site — no page edits needed.

FileRowsContents
codex/creatures.csv312
(104 lines × 3 stages)
Full creature roster, one row per advancement stage. Columns: ID, Line_ID, Stage, Name, Type_Primary, Type_Secondary, Type_Tertiary, Background_Key, Rarity, Floor_Found, Encounter_Type, Evolves_From, Evolves_To, Evolve_Level, Grade_Attack, Grade_Defense, Grade_Utility, Grade_Speed, Description, Image_Prompt, Image_Path, Home_Zone, Art_Status, BG_Status, Option_Slots, Sync_Status. IDs run DFMC-001…DFMC-312, assigned per line then stage (line k → 3k-2 / 3k-1 / 3k). Sync_Status tracks game-import state (not_imported / synced / needs_reimport): once a creature is imported into the game, any later change to it flips it to needs_reimport and it’s tagged with an amber ⟳ cue in the admin codex, so only altered creatures are re-imported rather than the whole roster.
codex/floors.csv120The 120 floors (20 boss floors). Columns: Floor, Zone, Encounter_Type, Is_Boss, Boss_Name, Primary_Type, Tier, Visual_Theme, Description, Cover_Image_Path, Wins_To_Clear.
codex/floor_creature_rarity.csv1,949
(81 floors × 10 slots + 10 floors × 104 slots + 9 floors × 11 slots)
The wild-encounter table. Each of the 100 wild floors maps its tier-slots (3C/3UC/2R/1SR/1SSR on a base floor) to a Creature_ID. Columns: Floor, Creature_ID, Rarity_Tier. Stage per slot computed per line from each line’s Evolve_Level (mixed stages per floor — see level bands below). Boss floors carry no rows — those are defined in codex/bosses.csv. Regenerate this whenever creatures.csv IDs change — the index joins the two by ID.
codex/bosses.csv20
(1 per boss floor)
Zone-boss definitions, one per boss floor (10, 20, … 100, then 102, 104, … 120). Columns: Floor, Zone, Boss_Name, Boss_Character, Active_Creature_1, Active_Creature_2, Difficulty_Index, Notes, Boss_ID, Boss_Type_Primary, Boss_Type_Secondary, Boss_Level, Boss_Quality_Grade, Grade_Attack, Grade_Defense, Grade_Utility, Grade_Speed, Move_1..4, Kit_Synergy, Description, Image_Prompt, Image_Path, Art_Status, BG_Status. All 20 bosses fully designed — humanoid boss characters with movesets borrowed from their zone’s creature lines (S3 magnitudes, slot order: signature / secondary damage / support ×2), 2 SR actives from the zone’s floors; bosses carry no reserves. Rendered at bosses.html.
codex/encounter_weights.csv120Per-floor odds of an encounter rolling into each tier; SSR/SR odds scale up over the run (see “Encounter weights” below).
codex/maptypes.csv50Tileset / map-restyle definitions for floor-art generation.
codex/items.csv617Full item catalog — gems (3 types × 10 tiers: Rough → Sublime), runes (3×10: Faded → Elder), scrolls (10: Tattered → Fated), class weapons (6 lines × 2 hands × 10 tiers = 120 pieces, 36 art identities), armour (4 slots × 10 named pieces = 40), accessories (2×10), tags (3×10), zone keys (20), materials (5), eggs (312). Gear tier prefixes retired — every weapon and armour tier is a distinct named piece. Columns: Item_ID, Category, Family, Slot, Name, Tier, Level_Req, Effect, Flavor_Text, Image_Prompt, Image_Path, Art_Status.
codex/moves.csv417Complete move table — 104 lines × 4 moves. Columns: Move_ID (M-{LINE}-{slot}), Line_ID, Slot, Name, Name_S1/S2/S3 (stage-progressive move names), Power_S1/S2/S3, Cooldown, Effect_S1/S2/S3, Synergy, Anti, VFX_Description. Powers use bands 0/50/80/120/160 at S3; S2 ≈ 80%, S1 ≈ 60%., Targets (derived, machine-readable: union of effect-clause sides across stages — enemy / self / ally, joined with +; display text remains authoritative for counts and amounts), Level_Learned, Level_Upgrade_V2, Level_Upgrade_V3 (per-line learn/upgrade schedule derived from advancement levels). Row 417 is M-CLASS-STRIKE (Line_ID CLASS, Slot 0) — the character’s no-souls fallback; excluded from per-line invariants and schedule regeneration
codex/souls.csv416Soul passive table — 104 lines × 4 armor slots (Head/Chest/Gloves/Feet). Columns: Soul_ID (S-{LINE}-{SLOT}), Line_ID, Gear_Slot, Scope (Local/Personal/Team), Rarity, Effect_S3 — despite the name, the authored value is the Stage-1 magnitude; stages multiply upward (S1 ×1.00, S2 ×1.12, S3 ×1.25). Ability-slot souls (MH/OH/Acc1/Acc2) grant moves instead — see moves.csv.
codex/breeding.csv10Breeding economy per pair grade. Columns: Grade_Num, Grade, Ichor_Per_Min, Minutes_Per_Egg, Ichor_Per_Egg, Egg_Dismantle_Ichor (the last keyed to egg grade, not pair grade).
codex/wild_quality_weights.csv20Zone-banded quality-grade weights for wild spawns (Worn–Void columns, 11 zones, per-band rows). Floors 1–9 all-Worn; curve begins floor 11. Rolled once at spawn; sets the wild QM and the virtual-tag grade context.
codex/first_win_drops.csv11Guaranteed bonus drops for the first 10 wild-battle wins (boss wins excluded from the counter). All grants spawn Worn T1. Selection rules: fixed Item_ID, random family, complement of win 1, or lowest-rarity enemy egg (random among ties).
codex/drop_rates.csv6Drop roll rules — points to drop_chances_by_floor.csv for chances, plus family notes and the enhancement grade-band rule. Prototypes and the game read from the tables; no hardcoding.
codex/drop_chances_by_floor.csv120Per-kill drop chance by floor and rarity — one independent roll each for gear, enhancement, and egg. Value ladder ×1/1.5/2.5/4/7 normalized per floor against encounter weights: each family lands exactly 10% per battle everywhere. Boss floors zeroed (no wilds).
codex/drop_grade_weights.csv101Gear-drop grade weights per floor band (24 bands; mirrors Stat & Equipment Tables §15). Divine, Primordial and Void never drop.
codex/key_drop_rates.csv20Per-creature boss-Key drop chances by rarity and zone, with each zone’s Key_Item_ID — one expected Key per minimum-win zone journey.
codex/boss_loot.csv11Guaranteed boss drops — one piece of equipment (grade one band ahead) and one native Stage-1 egg (rarity-weighted, Legendary-capped). Delivered on the conclusion screen.
codex/floor_assets.csv120Level design pipeline. Per-floor: battle background prompt/path/status, parallax reference, prop assignments, map preview status (empty + populated). Decoupled from floor identity for infinite floor extension.
codex/prop_assets.csv42Zone prop catalog — 3–4 props + 1 anchor prop per zone, with image prompts and art status.

Row counts and breakdowns counted from the CSVs by tools/codex_tables.py (codex-files).

Codex pages: floor-codex.html is the zone/floor index (joins floors → floor_creature_rarity → creatures by ID) · creature.html?id=DFMC-XXX a single creature · floor.html?num=N and type.html?type=X the floor and type views · reliquary.html filterable item catalog · crafting.html all crafting recipes and costs · upgrading.html grading success tables · stat-tables.html full numerical tables.

GitHub API edit workflow: GET the file's current SHA, then PUT base64-encoded content with that SHA (omitting it fails). Build CSVs with a real CSV writer, never hand-rolled strings, and validate every row's column count before pushing.

Grade scale (Worn → Void)

One shared 10-tier scale used for equipment grade, egg grade, and by extension the grade of any creature hatched from an egg of that grade. Not the same thing as encounter rarity (see below).

#Grade
1Worn
2Common
3Uncommon
4Rare
5Epic
6Legendary
7Abyssal
8Divine
9Primordial
10Void

Equipment slots (8, character gear)

SlotCategory
Main HandWeapon — ability slot
Off HandWeapon — ability slot
Accessory 1Weapon — ability slot
Accessory 2Weapon — ability slot
HeadArmour — passive
ChestArmour — passive
GlovesArmour — passive
FeetArmour — passive

Creatures separately have 2 Tag slots (equipment attached to the creature itself, not the character). Tags follow the same grade/socket rules but cannot hold a creature soul. Each party creature owns its own pair — a tag raises the stats of the creature wearing it and of nobody else — and gems and runes socketed into a tag apply to that creature too.

Currencies

NameUse
ScrapGear crafting (25 × tier) and gear grading
ScrapGrading gear up the Worn–Void ladder — tier-scaled attempt costs (2026-07-31); enhancements grade in Dust / Essence / Ink
IchorUnified breeding currency — from completing battles and dismantling eggs
WraithgoldPremium. Bought with real money — it never drops and no amount of play produces it. Its sinks today are soul-bag expansion and the Premium Shop. It is held in a server-owned append-only ledger, not in the save. A Reset Progress keeps only Wraithgold with paid provenance (T61 / T3, 2026-11-02): free or earned Wraithgold resets with the climb. Purchases are not open yet (T56: no account starts with any). PvP ladder and tournament payouts are planned and will be the only earned source that ever exists.

Wraithgold buys a determined outcome only. Real money never buys a random draw anywhere in this game — no paid hatch, no paid roll, no paid grading attempt.

The two bags

Storage is split. Gear, gems, runes, scrolls, tags and keys go in the inventory. Creatures, eggs and class souls go in the soul bag. They have separate caps and separate expansion currencies, so filling one never squeezes the other.

InventorySoul bag
HoldsWeapons, armour, accessories, tags, gems, runes, scrolls, boss keysCreatures, eggs, class souls
Starting slots8030
Bought in10 slots at a time30 slots at a time
Maximum400 (raised from 160 in 0.72, #789)600
CurrencyWraithgold (codex/inventory_slots.csv)Wraithgold (codex/soul_slots.csv)

Crossing between them

The two bags are separate menu destinations that share one window. The window carries a crossing button on the right of the category row, immediately left of Dismantling: in the inventory it reads SOUL BAG, in the soul bag it reads INVENTORY, and pressing it swaps the bag in place without closing the window. Nothing moves between the bags — an item lives in whichever bag its category belongs to and there is no transfer.

Crossing discards everything scoped to the bag being left: any open item detail panel, the slot shop, and every salvage mark plus the salvage mode itself. Marks belong to the bag they were made in, so a selection made in the inventory can never be carried into a soul-bag dismantle. Category, grade and type filters are stored per bag and survive the crossing intact.

Interim pricing. Every block in either bag currently costs 1 Wraithgold. No account starts with Wraithgold (T56, D 2026-11-02); it is the premium currency, bought in the shop. The authored curves — the inventory's Scrap ladder and the soul bag's 50 → 2,800 Wraithgold ladder — are preserved in the same CSVs under Design_Currency / Design_Cost and are what real pricing returns to.

Bulk salvage

Both bags offer the same four modes: dismantle selected, dismantle all filtered, dismantle by grade, and dismantle by tier (board 3.8). A sweep never reaches outside the bag on screen — marks made in one bag are dropped on switching, and "by grade" resolves against the open bag only. The inventory sweep never takes boss keys (tags are swept, D ruling 2026-07-28). The soul-bag sweep takes creatures and eggs; a class soul cannot be swept in any mode, and anything equipped, penned or socketed is not in the pool to begin with.

At full pricing, soul-bag expansion runs 19 purchases on a rising curve — 50 Wraithgold for the first block of 30, 2,800 for the last, 13,700 for all 600. A class soul occupies a slot for as long as the account owns it; a creature socketed into gear or placed in a breeding pen does not, because it has left the bag. The soul bag is its own main-menu entry, not a tab inside the inventory. Its filters are kind, grade, creature type, ability type (Attack / Heal / Buff / Debuff, read off the line's whole kit, #538) and New only (#1016); creature and class-soul icons both carry their current level; and the default order is class souls, then mutant creatures, then creatures, then eggs, then consumables, sorted by level and then grade (then line) within each category (soulRank / soulSort).

Class souls

A class is held as a class soul — an item in the soul bag, one per class the account owns. Open it to equip it, which switches the active class and strips the character bare; all eight gear slots return to the inventory, and the switch is refused outright if the inventory has no room for them. A class soul is untradeable and undismantleable: it is bound to the account, and no salvage, bulk sweep or trade can consume one.

Class souls grade on the Worn–Void soul ladder (codex/soul_grading.csv; creature souls take their grade from the source creature instead) — the fixed four-currency bundle per attempt (Scrap, Dust, Essence, Ink — every one required), the shared 100 / 90 / 70 / 50 / 35 / 20 / 8 / 3 / 0.5% success chain, and a failure that consumes the bundle and changes nothing else. Grade is stored per class line and survives class switching, since the soul is a property of the class and not of the character wearing it. The CLASSES window (the class image on the equipment screen) is the second road to that bench: every card of a class the account owns carries an UPGRADE button top right, which opens the same upgrade bench the soul bag's detail card opens, on that class soul; a soul already at Void reads MAX there instead, and a card the account does not own carries nothing (ui#1056, D 2026-09-30).

A creature can be dismantled from its details window, which also shows its types as badges in the header. It salvages for the same Ichor an egg of that grade salvages for. In the soul bag, bulk salvage does take creatures (and eggs) that match the sweep; only class souls, and anything equipped, penned or socketed, are never in its pool.

Mutant variants — not "Shiny"

The alt-color rare cosmetic variant is called a Mutant in this project. Never "Shiny" — it is easy to slip into by habit; don't.

Realms (4)

Floor themes (3)

Outdoors, Cave, Fishing — purely visual themes, identical mechanics.

Zones — 100-floor codex (10 zones × 10 floors)

FloorsZonePrimary type(s)
1–10GrasslandsBeast
11–20Tidal ShallowsSea Creature
21–30Desert PlainsReptile, Serpent
31–40Swarm ThicketInsect
41–50The CragArthropod
51–60Storm PeaksAvian
61–70Sunken BogAmphibian
71–80Underwater CaveFungal, Mollusk
81–90Gemstone CaveSpectral, Vampiric
91–100Flaming HellscapeConstruct

Only floor 1 is guaranteed Outdoors, and only floors 1–3 (Grasslands) are guaranteed one of each floor theme — that rule applies to the very first zone only. Every other zone just needs all three themes represented somewhere across its 10 floors. Boss floor is always the 10th floor of each zone (not the 5th), and boss floors carry no wild encounters.

Zone bosses

Every 10th floor (10, 20, … 100) is a zone boss and has no wild encounters. A boss is a full team like the player's — a boss character plus 2 Super Rare active creatures — bosses carry no reserves — not a wild creature. The SSR flagship creatures (Dagon, Ouroboros, Kraken, …) are rare wild encounters on ordinary floors, not the bosses.

Bosses scale up considerably each zone: floor 10 is the weakest, floor 100 the hardest of the base tower. Definitions live in codex/bosses.csv and render at bosses.html — all ten boss characters, movesets, stats and teams are designed. Post-level-100 content — deeper floors with fully-optimized boss teams — is out of scope for now and noted for later.

Creature types

CategoryTypes
Zone-anchored primary (13)Aquatic, Reptile, Beast, Insect, Arthropod, Avian, Amphibian, Fungal, Spectral, Construct, Serpent, Vampiric, Mollusk
Recurring primary, not zone-locked (2)Elemental, Fey
Postgame-only primary (3)Demon, Celestial, Eldritch
Floating secondary (9)Flora, Undead, Void, Aberration, Chimera, Horror, Dragon (rare-only), Parasite, Ooze

Types live in Type_Primary/Type_Secondary, plus Type_Tertiary for the rare 3-type line (e.g. VEINMOLD = Fungal/Parasite/Construct). No slash-compound names inside a single field.

Creature level bands (max level 100, for now)

A creature's floor is its level. Which advancement stage appears in the wild is gated per line by that line's own advancement levels (Evolve_Level in codex/creatures.csv) — a line shows its Stage 1 form on floors below its S1→S2 level, Stage 2 between its two advancement levels, and Stage 3 at or above its S2→S3 level. Because advancement levels are spread by rarity, floors now carry mixed stages: a Common line can already be Stage 3 on a floor where an SSR line is still Stage 2. The old fixed 33/66 cutoffs below are the reference midpoint only; actual wild stage per slot is computed from each line's advancement levels and baked into codex/floor_creature_rarity.csv (regenerate whenever Evolve_Level changes).

Band (reference)Nominal floorsActual wild spread
Infant (Stage 1)1–33Floors 1–38 (SSR lines hold S1 latest)
Advanced (Stage 2)34–66Floors 24–71 (Commons reach S2 by ~24)
Final (Stage 3)67–100Floors 57–99 (Commons reach S3 by ~56)

All 104 creature lines are full 3-stage — no exceptions. Rarity (C/UC/R/SR/SSR) is a fixed property of the line, independent of stage, since every creature on a given floor is necessarily the same stage. 104 lines split: 28 Common, 28 Uncommon, 20 Rare, 14 Super Rare, 14 Super Super Rare. Spread counted from floor_creature_rarity.csv (floors 1–100) by tools/codex_tables.py.

Encounter weights — SSR/SR odds scale up over the run

Two separate tables work together. codex/floor_creature_rarity.csv says which species are eligible in each tier on a given floor (always 3C/3UC/2R/1SR/1SSR — fixed). codex/encounter_weights.csv says the actual odds of an encounter rolling into each tier on that floor — and those odds move as the run progresses, so flagship lines are technically always "on the table" but genuinely hard to actually meet early on.

FloorCommonUncommonRareSuper RareSuper Super Rare
150%30%15%4%1%
5132.32%27.47%22.58%11.07%6.56%
9915.35%25.05%29.85%17.86%11.89%

Linear scaling floor 1→100 between those endpoints, every floor's row sums to exactly 100%.

Per-floor creature encounter rarity (C / UC / R / SR / SSR)

Superseded note below — kept for context, but rarity is now per-line (see level bands above), not per-stage.

Not the same scale as equipment/egg Grade above. Every wild (non-boss) floor has exactly 10 encounter slots: 3 Common, 3 Uncommon, 2 Rare, 1 Super Rare, 1 Super Super Rare. The ten boss floors have none. Data lives in codex/floor_creature_rarity.csv. A line's strongest advancement is typically SSR on a zone's earliest floors, shifting down to SR by that zone's later floors.

Creature grading design principle

Each creature line has one fixed set of 4 identity grades — Attack / Defense / Utility / Speed, scale 1–10 — that stays constant across every advancement stage in that line. Advancement scales actual battle stats later; it does not change the identity shape.

Creature naming

Every creature line name is a single word — no multi-word names, no "The ___". Dark-fantasy tone, frequently a modified myth or religious reference. Line_ID in the CSV is the uppercase line name. The three advancement stages now carry distinct names: Stage 3 keeps the line name, while Stages 1 and 2 are real-word precursor names drawn from the final name's own myth, etymology, or life-cycle (e.g. Veliger → Hafgufa → Kraken; Eyas → Haggard → Roc). Applied across all 100 lines in codex/creatures.csv. Line_ID stays the final name, so advancement links and encounter IDs are unaffected.

Image generation conventions

Creature Balance

Live data from codex/creatures.csv. Grades are fixed per line across all 3 stages. Speed determines turn order — the most tactically valuable axis.

Creature ▼ Rarity Zone Type Atk Def Utl Spd Sum Spread Archetype

Grade distribution

Speed distribution

Spread by rarity

Archetype coverage

Changelog

2026-11-03 — GDD audit against the live game (D 2026-11-03: “review the codex, clean it up, update whatever needs updating to make sure it's coherent with the current state of the game”; dfmc-client lane codexreview-b). WIKI ONLY. Marked superseded, history with a pointer to the owning page: Season end migration (no seasons, #900 / T33), Incubation & hatchery (eggs hatch from the soul bag), Gear crafting (removed 2026-10-01), the Monetization model (no battle pass, store not open, T56), Tech stack and Build roadmap (web client + Worker, not Unity). Corrected in place: the Engine card, the ladders (all-time only), the Starter creatures card (two Commons per class from classes.csv Starter_A/B, matching the Starter classes paragraph), the enhancement material table and the Wraithgold row (T61 reset keeps paid rows only). New pages linked: Accounts, Profiles, Unlocks, Report Panel.

2026-11-02 — Starter classes: the starter pair is two Commons, not an SR + SSR (D 2026-11-02 in chat: “need to downgrade the starter options to common monsters, not SSR”; dfmc-client lane starterdown). Dev data now; reaches players at the next DATA_PIN (the client and the server's bake both read classes.csv at the pin). The columns Starter_SR / Starter_SSR are renamed Starter_A / Starter_B and carry Common stage-1 ids of the class's flavour: Warrior DFMC-001 Bristle (Thornback, Beast, floor 1) + DFMC-271 Ember (Cindershard, Construct/Elemental) · Mage DFMC-154 Fledgling (Stormcrow, Avian/Elemental) + DFMC-211 Button (Gloomcap, Fungal) · Archer DFMC-004 Whelp (Dusthound, Beast, floor 1) + DFMC-151 Chick (Gustwing, Avian). Before: Warrior Ingot (SR) + Drakeling (SSR), Mage Reliquary (SR) + Wildfire (SSR), Archer Tempest (SR) + Riptide (SSR). The pair shape, the Worn grade, the server-rolled genders and the server mint (F299, system-networking.html) are unchanged; the creation card now tints each creature by its own rarity instead of a fixed SR/SSR colour. Existing accounts keep the starters they were minted.

2026-11-02 — Art pipeline: creature art is cut out by the model (ruling T23 / codex X7); the four C7 lines DFMC-301–312 are the first rows made that way (dfmc-client lane art12, rulings card T63 item 3). Dev data now; reaches players at the next DATA_PIN / ART_REF. The Art pipeline paragraph above said creature art kept the opaque-then-matte rule “until D rules on X7” and that native transparency was 1.x-only; T23 (2026-10-18) ruled “Model cuts it out; cutout service as backup”, so the paragraph now records it: new creature art is generated background:transparent on gpt-image-2.5-flare and ships the API’s alpha, remove.bg is the backup for a bad roll, the old rule stays as the record of the 300 approved rows and of legacy chroma art. Tool: dfmc-client tools/make_creature_art.py (STYLE + row Image_Prompt + cutout, one call per row, matte-only alpha fix ×255/252 and haze ≤ 8 cut, the eight derived files, Art_Status pending → review). Details on creature.html’s changelog.

2026-10-26 — Art pipeline: a refused floor creature retries against main (dfmc-client lane artretry, next-run 10-26 Step 3 item 8). Dev build now; release with the next ritual. The battle-floor sprite was a bare <img> with no error handler, so a creature whose art the CDN refused at the pinned SHA (jsDelivr will not cold-fetch a file on a 3.2 GB repo, OPS 2026-09-14) stayed a broken glyph. It now carries the same one-retry fallback the advancement scene uses: a failed dfmc@<sha> URL is retried once at dfmc@main; a miss on main is left alone, so it cannot loop. The retry is remembered per URL, not per element, because the floor reuses one sprite element for every creature that stands in that slot. No game rule changed. Gate: tools/probe_artfallback.py.

2026-10-23 — C17 part 4 (dfmc-client lane a8-s5-c17-tail, C17 part 4): the codex-file table, class ultimates, move budget, Ichor, advancement and level bands, zones, encounter weights and every ~30 battles/h sentence are generated. WIKI ONLY; no game code changed. tools/codex_tables.py writes them from the CSVs and the engine (blocks codex-files, ultimates, moves-budget, ichor, adv-bands, zones, level-bands, enc-weights, spawn-note, chase, bph-realm, bph-econ). Numbers that changed, old → new: codex files — creatures 300 (100 lines) → 312 (104 lines), IDs to DFMC-300 → DFMC-312; floors 100 → 120; floor_creature_rarity 900 → 1,949; bosses 10 → 20; encounter_weights and maptypes — → 120 and 50; items 585 → 617 (eggs 300 → 312, 20 zone keys listed); moves 401 → 417 (CLASS-STRIKE is row 417); souls 400 → 416; wild_quality_weights 10 → 20 (Worn–Void columns, no Legendary cap); drop_rates 5 → 6; drop_chances_by_floor 100 → 120; drop_grade_weights 21 → 101; key_drop_rates 10 → 20; boss_loot 6 → 11; floor_assets 100 → 120; prop_assets 40 → 42. Moves — 400 → 416 moves. Ichor — the kill formula is the engine’s round(2 × (1 + min(100, level)/100) × mult) (was level/20), RarityMult 1.0/1.5/2.5/4.0/7.0 → 1.0/1.1/1.2/1.35/1.5 (src/tables.json food_rarity_mult), per hour at floors 1/25/99 280/740/3,040 → 670/990/1,540 at 109 battles/h; egg dismantle Epic–Void 115/180/270/410/610/860 → 46/72/108/164/244/344 (breeding.csv); a Void pen is 88% of floor-119 kill Ichor, ~0.6 Void eggs/h (was “half”, “~1”). Advancement bands — Common S1 24–30 → 24–36, S2 56–64 → 56–68; Uncommon 26 → 28 lines, 28–33 → 28–38, 61–66 → 61–70; Rare 21 → 20 lines, 32–36 → 24–37, 65–69 → 63–69; SR 35–38 → 26–38, 67–70 → 56–70; SSR 11 → 14 lines, 36–40 → 35–40, 68–73 → 67–73. Level bands — Stage 2 floors 24–72 → 24–71, Commons reach S3 by ~57 → ~56, 100 → 104 lines split 28/28/20/14/14 (was 28/27/20/14/11). Zones — Tidal Shallows is Sea Creature (floors.csv), not Aquatic. Encounter weights — the 50 and 100 rows were boss floors (all-zero weights); the table shows wild floors 1 / 51 / 99, 51 = 32.32/27.47/22.58/11.07/6.56%, 99 = 15.35/25.05/29.85/17.86/11.89% (were 32.7/27.5/22.4/10.9/6.4 and 15/25/30/18/12). Battles/h — ~30 → ~109 (the economy simulator, tools/sim_econ.mjs); the spawn cap of 60/h is 0.55× that pace, not 2×; one item Worn→Void ~44,535 Scrap ≈ 222 h → ~54,535 Scrap ≈ 16.6 h at floor 119, Void gate p10/expected/p90 3,573/34,000/78,092 → 4,624/44,000/101,060, a Void enhancement ~282,000 → ~141,243 material. Class ultimates and zone ranges did not change.

2026-10-23 — C17 part 3 (dfmc-client lane c17-gen-2): the creature base stats, the level-offset table and the class stage stats are generated. WIKI ONLY; no game code changed. tools/codex_tables.py now runs src/power.js’s own coreOf / axisMult / hpFor under node for the level-100 creature table (grade 1 Off/Def/Utl 562 → 563, Math.round of 562.5; grade 6 HP 3,262 → 3,263), reads deriveSlot OFF for the offset table, and binds every class stage stat to classes.csv (Ranger read 7 / 2 / 7, the CSV says 7 / 3 / 6; Hawkeye 8 / 3 / 9 → 8 / 4 / 8). The “average preservation” note no longer claims XP per battle = 10 × zone level (retired by C1); the class-stat note’s AxisMult reads /8, as src/power.js:172 does.

2026-10-23 — the computed tables are generated from the CSVs (dfmc-client backlog C17 part 2, lane c17-gen). WIKI ONLY; no game code changed. Part 1 bound the XP reference table’s XP_To_Next to XPCurve.csv but left the Battles (on-level) column dividing the retired curve: level 99 read 2,703 battles where the C1 curve needs 166. Now the XP/battle column is the expected XP of one wild on-level battle as the server pays it (3 enemies, tier on encounter_weights.csv, level on deriveSlot’s −3..+3 offsets, XPCurve.csv XP_Kill), the battles column is XP_To_Next over it rounded up, and the zone estimate sums that per level at 109 battles/h (tools/sim_econ.mjs; the old table assumed ~30/h). The main-hand implicit grid is generated too (it matched). The weapon tier table’s level reqs read items.csv (they read the retired recipes.csv) and its craft costs are bound. 17 + 31 numbers were wrong before. tables marked <!-- gen:NAME --> are generated by tools/codex_tables.py from the CSVs with the engine’s own formulas (each generator cites the engine line it ports); its --check is a dfmc-client gate, so a CSV edit without --write fails the gates.

2026-10-23 — the codex pages read their numbers from the CSVs (dfmc-client backlog C17, ruling 11.9: “the permanent fix is that the pages read the CSVs instead of quoting them”). WIKI ONLY; no game code changed. A number a page quoted from a codex CSV was typed in by hand, so every CSV edit left the page wrong until a lane noticed. Now such a number is a <span data-csv="file.csv#row#Column"> and csv-bind.js fills it from the CSV when the page loads; the typed value stays as the fallback and is underlined as stale when the CSV cannot be read. tools/codex_numbers.py is the inventory (every static table number it can tie to a CSV cell, with the CSV row and column), the converter and the gate: a page that pastes a bound number, or a span whose row or column is gone, fails it (the dfmc-client gate run calls it). This pass bound 476 numbers on six pages (upgrading 225, Void Apex 120, stat tables 50, this page 46, breeding 30, PvP 5) and all six are converted. 11 were wrong against their CSV before: on this page the XP-required column of the levelling table at levels 20–99 still showed the curve from before the C1 re-ramp (level 99: 2,676,127 shown, 164,264 in XPCurve.csv), and two Void Apex Epic weights were 0.1 point off. The battles column next to it is computed, not a CSV cell, and is not bound.

2026-10-23 — an arrow caption moves when something renders under it later (dfmc-client lane gate-hygiene, follows screen review finding 8). Dev build now; release with the next ritual. The caption’s spot was measured once per target position and kept, so content drawn after it (the equipment stat boxes, a late data file) or a caption that grew after it (the fonts landing) never moved it: at 1600×900 CLASS SOUL sat on the HP / ATK numbers with its second line past the left edge. The kept spot is now re-checked every 0.6 s and the caption moves as soon as something lies under it; a change of the caption’s own size re-places it too, and it stays inside the window as well as the stage. Gate tools/probe_b9_ftuecap.py (now in every gate run, 8 landscape viewports, 96/96; 72/96 before).

2026-10-23 — Battle: the HP bar drains hit by hit on a multi-hit move (lane small-fixes-1, follows B17). On dev since 2026-10-23. Display only, nothing about damage changed. Since B17 every hit of a multi-hit floats its own number, but the target’s HP bar still fell to its final value the moment the act began. The bar now steps down with each hit: one segment per engine hit, each the HP that hit took, leaves on that hit’s beat (the same clock as the numbers), and the bar ends exactly where the engine put it. A single hit is unchanged. Gate tools/probe_hpdrain.py.

2026-10-23 — Wild virtual gear: the sockets read items.csv, not a copied formula (lane wild-runes, finding of C4; D: “The csvs need to be the source of all truth. Hardcoded NEVER.”). On dev since 2026-10-23. A wild’s (and an authored-grade boss’s) tag sockets were priced by a formula in code: gems 4.5×T×GF and runes 12%+1.2%×(g−1)+0.6%×T, the curve C4 retired when it moved the player rune to 6%+3%×(g−1)+0.6%×T in items.csv. The client and the T4 balance sim now read the Gem and Rune rows of the tag’s stat at its tier (the player’s own gem price with its grade-step floor, the rune’s Effect curve), and the sim reads the tag coefficient from the Tag row too. Wilds below Epic carry a smaller rune %, Epic and up a larger one; T4 holds on the same saves (PvE medians 5 / 6 / 4 / 4, wins 100 / 93 / 89 / 100%, unchanged). Gate: tools/probe_wild_runes.py 61/61 (5/61 before).

2026-10-23 — Battle: every hit of a multi-hit move is seen, and the damage floats over the target (B17 + C8, D T47-4: “the text shown must be concise, objective and useful”). On dev since 2026-10-23. Nothing about damage changed: a move whose Effect reads Damage as N hits was already split into N rolls by the battle engine and summed; the player saw one jolt, one tint and one line. The engine's playback record now carries, per target, the damage of each hit, what landed and whether it was super effective (observer only; resolution is byte-identical, and when a boss damage hook changes the total - Sealed Gate, Carapace Layers - the record holds the one number that landed, never an invented split). The target jolts and tints once per hit, 120 ms apart; each hit's number floats over the target, then the total (15 ×3). A single hit floats one number. Tags under the number come only from engine facts: WEAK (super effective), +Status for each status the act newly put on the target, KO. Heals float +N in green. There are no crit or resist tags because the engine has no crits and no resist flag. Low VFX (and Battery Saver / Reduce Motion) keeps the numbers but drops the per-hit motion; Reduce Flashing keeps the Soft tint. No stagger token was added to the VFX composition grammar: the hit count is the move's own Effect, and a second copy in move_vfx.csv could drift. Research and review: docs/hit-feedback-2026-10.md (dfmc-client). Gate tools/probe_b17_multihit.py.

2026-10-23 — The soul bag opens from floor 1, so eggs hatch from floor 1 (T6 ladder; conflict found by the FTUE floors 7-12 rerun). On dev since 2026-10-23. Eggs live in the soul bag, and the soul bag's door was the Souls rung (12): the menu plate, the SOUL BAG buttons and the menu pick all refused below 12, so the single hatch (open from floor 1, B1 2026-09-09) and Hatch All (8) could not be reached until 12, and the hatch lessons waited for 12. Now the soul bag window is open from floor 1 and shows eggs and creatures; the Souls rung (12) keeps the soul slot on equipment and the class soul's upgrade, and Devour keeps its own rung (12). The server doors are unchanged: /api/hatch judges only the batch form (Hatch All, 8). The single_hatch beat (floor 4 cleared) and the hatch_all lesson (8, two eggs) fire on their own rungs again. (dfmc-client lane hatch-access.)

2026-10-23 — an arrow caption no longer covers controls (screen review finding 8, dfmc-client lane screen-fixes). Dev build now; release with the next ritual. The caption sat centred above or below its target whatever was there — EQUIP THE WEAPON over FILTERS, HATCH ALL over the first creature row, CLASS SOUL over the soul-slot numbers. The arrow glyph now stays beside its target, pointing at it, and the two caption lines go to the nearest spot around it that covers no control, text or icon (above or below first, then right, left, sliding sideways and stepping away); where every spot is taken the one covering least wins.

2026-10-23 — an arrow never draws on the HUD behind an open window (screen review finding 7, dfmc-client lane screen-fixes). Dev build now; release with the next ritual. With the Rankings, Shop, Feedback or an (i) panel open, a lesson whose control is in another window (CLASS SOUL, in Equipment) fell back to the first step of its Via path — the MENU button, still on top beside the window — and drew over the Rankings PVP tab and the shop keeper. With any window open the arrow now takes only a control of that window, or none.

2026-10-23 — The first fight is taught; lessons lead from MENU; autoplay opens on floor 6 (FTUE item, the findings of the 2026-10 FTUE review, D 2026-10-23). On dev since 2026-10-23. opening.csv: the first fight is one chain, each beat waiting for the one before it: first_fight_start (click a creature on the floor) → first_fight_move → first_fight_target (click an enemy) → first_fight_lock (LOCK IN MOVES) → first_fight_order (turn order). first_fight_ult is now ultimate with Ready ultimate: the ultimate is learned at class level 10, so its lesson fires at the first fight where it can be used. “Equip the weapon” (weapon_drop) waits for a weapon in the bag (Ready weapon) and points at that weapon’s tile. Via is now a path, steps joined by > (for example menu>menu-inv): while the lesson’s own control is not on screen the arrow sits on the deepest step that is, starting from MENU on the floor (never mid-fight). Every row whose control is off the floor has one. Arrows show only on a control that is on top: none over the age gate or class pick, none on a control a window covers. Eggs live in the soul bag, so the hatch lessons (single_hatch, hatch_all) wait for the soul bag to open (floor 12). Devour leads through a soul’s sheet. Autoplay has no server door: it reads the floor the player stands on, so it opens on arriving at floor 6 (other rungs still read the server’s ratchet, the highest floor won on).

2026-10-23 — Starter classes: the creation screen’s copy, name rule and roll reveal (BACKLOG § 3 “starter selection pass”, D 2026-10-22; ruling 11.12, creation half). On dev since 2026-10-23. Nothing a player owns changed: the starter set is still the server’s (2026-10-22 entry below), and the roll and ENTER still wait for the name claim. What the screen now does: Choose your Path says that each path starts with the two creatures and two weapons shown, and the footer points to the Classes window. The name step is titled Name your champion and states the server’s rule: 3–16 characters, no hidden characters, unique, one name per account. The client normalises the name exactly as the server does (trim, then collapse runs of whitespace), so the claimed name and the hero name are the same string. A claim error now shows on the creation screen. It had been bound inside the codex window’s creature card since the unique-names build, so a taken name was silent. The button reads CLAIM NAME. Each starter shows a sealed ? until the server’s sex roll answers, pulses while the roll is in flight, then reveals the glyph and the word (Male / Female) under the line “Rolled by the tower. Fixed for this account”. RETURN is named by what it does: BACK TO PATHS before the roll, CHANGE NAME after it. The weapon lines drop the designer notation (for example +Attack · Ability slot 1). The AUTOPLAY HUD no longer paints over creation. Open for D: T30’s Latin-letters-digits-space-dash-underscore set is not enforced by the server yet (B15). Review: docs/starter-review-2026-10.md (dfmc-client). Gate tools/probe_starter_pass.py.

2026-10-23 — The opening and the unlock lessons: each lesson fires when its system is usable; the scroll lesson; REPLAY (T41, D 2026-10-22: “as soon as the player has an enchantment scroll and an item that can receive that scroll, you use those to teach the player how to apply it”; T6 note: specific tutorials can be re-engaged). On dev since 2026-10-23. unlocks.csv and opening.csv gain three columns: Ready (a game-state reading: scroll_target = a scroll in the bag and an equipped piece with a scroll socket, eggs = two or more eggs, dismantle = two or more unlocked dismantlable pieces, soul = a creature in the soul bag, pair = two or more creatures, gear = a weapon, armour or accessory in the bag; empty = the rung alone), Line (the arrow's one short line; empty = the generic line; no two lines alike) and Via (the control the arrow points at while the lesson's own control is not on screen). The scrolls row now points at the first scroll in the bag (bag-scroll, generic line) and waits for scroll_target. The floor-2 materials beat leads through the weapon slot (Via eq-weapon-slot) to UPGRADE and names the Scrap the server granted. Hatch All, Dismantle All, Souls, Auto PvP, Auto-optimise, Breeding, the Shadow Trader and the class soul each carry their own line. Settings > Tutorials lists every opened lesson as Replay: <label> with a REPLAY button; replaying with the arrows off turns them on. The written review of the starting experience: docs/ftue-review-2026-10.md (dfmc-client).

2026-10-23 — The opening: the floor-2 materials are granted (T42, D 2026-10-22: “the server grants materials as well … NO CLIENT AUTHORITY”). LIVE on release since 2026-10-23 (0.89). The materials beat was unbuilt. The server now credits exactly one first upgrade attempt of the opening weapon (1 Scrap, from grading.csv) on the account's first floor-2 clear, once; the client adopts it. opening.csv row 2's Family said Ichor - the attempt costs Scrap, so the row now says Scrap. Detail: system-networking.html.

2026-10-22 — Starter classes: the starter set is the server's (server-authority run § 3 item 8, F299 / F290; R6 "the server mints every identity", R9 "rules come from the csvs on the server"). LIVE on release since 2026-10-23 (0.89). Character creation no longer hands the server a loadout: the creation save (the first save that names the hero) is minted once per account from classes.csv Starter_SR / Starter_SSR and the line's two Tier-1 weapons in items.csv, with server uids, the weapons born equipped and the two creatures sexed by the same account-scoped draw the creation screen showed (cc:sr / cc:ssr). The client's proposed rows are ignored: a main hand that is not the csv weapon, a third creature or a pre-filled bag is dropped and flagged inv_seeded (a correction, no longer a watch); the answer carries the minted set and the client adopts it. Creation also waits for the name claim: a claim's 200 is relayed into the player's own object and a creation save whose name was never claimed is refused (409 name_unclaimed); the client opens ENTER only on a successful claim (a 401 / 429 / 5xx / network error now says "try again" instead of entering). Gate: tools/probe_sa_starter.py (a forged Legendary main hand, an honest creation, no-claim refusal, idempotent mint).

2026-10-22 — System unlocks: the scripted opening (T6 part 4, D: "unlocks earlier, class soul at the beginning"; B1, D 2026-09-09: "the opening, floors 1-9, a scripted sequence and not a set of unlocks ... The guaranteed items exist so the lesson never waits on RNG"). SHIPPED IN 0.90. Parts 1-3 gated the systems and drew their arrows; nothing scripted floors 1-9. Now codex/opening.csv authors one beat per row (the table above, "The opening"): the first fight's chain (a move slot → the ultimate plate → the SPEED ORDER plate, 11.11) while the best floor is still 1, then a guaranteed drop per cleared floor - the class-line main-hand weapon (floor 1), the upgrade materials (floor 2, not built yet: a wallet credit, the drop path mints items only; the arrow still points at the upgrade door), a gem (floor 3), the Worn egg of the weakest named kill (floor 4) - and the single dismantle at 5. The items are the server's: the Worker's battle credit mints them once per account on the first credited victory with the ratchet past the row's Floor, in the same drops array tagged op:<beat> (system-networking.html, "The scripted opening"). Autoplay is now a rung, autoplay,6 in unlocks.csv: locked below with the padlock toast, its part-3 arrow on the AUTOPLAY button at 6. Single hatch and single dismantle stay open from floor 1. Gate: tools/probe_t6d_opening.py (a local worker + the client fixtures at ratchet 1 / 2 / 7).

2026-10-22 — System unlocks: the arrows (T6 part 3, D: "Every unlock will need a ftue where an arrow shows where to click for each system until its target is clicked for the first time, but does not block play"). LIVE on release since 2026-10-23 (0.89). Part 1 opened the rungs silently. Now a system whose rung the best floor has reached, and whose ftue[<system>] flag is unset, is pending; the oldest pending system whose Anchor control (data-anchor in the markup = the csv Anchor) is on screen gets the one arrow (the Label, the floor line, the glyph), placed by direct DOM writes every paint / resize / 300 ms, hidden while the control is off screen or its window closed, pointer-events none. The first click on the control sets the flag, writes the UNLOCK line to the Adventure Log and saves. Settings > Tutorials: TUTORIAL ARROWS (toggle, default on) hides them all; one RESET row per open system clears its flag. eq-scroll has no control in the markup yet. Gate: tools/probe_t6c_ftue.py 0/3 → 33/33 on the ratchet 1 / 12 / 40 fixtures.

2026-10-22 — System unlocks: the server half (T6 part 2, D: "server authoritative - client can't rule ever"). LIVE on release since 2026-10-23 (0.89). Part 1 gated every entry point on the client alone; a modified client could call any door below its rung. Now the Worker reads the same codex/unlocks.csv through the pinned codex and refuses a locked system's door with 403 {error:'locked', system, floor, maxf}, judged on the account's best floor - the server's progress ratchet (PlayerDO.progressOf, the value T5 priced the trader on), never the current floor: the Server door column above names the door per rung; the forms the ladder leaves open (single hatch, single dismantle, the Gear grading step, mm poll/ready) are never refused. The ratchet reaches the client on the boot GET /api/save, /api/me, /api/floor/enter and the battle credit (maxf), so a padlock lifts the moment the floor is credited. Save-only systems (a soul equipped before 12, a pen in use before 25) are flagged unlock_claim_bad (class system), never refused. A missing table fails OPEN with an ops line, the client's rule. Fresh accounts after the wipe, no migration. Gate: tools/probe_t6b_unlock_doors.py (a local worker, ratchet 1 / 10 / 30 / 60 per door).

2026-10-22 — System unlocks: the ladder (T6 part 1, D: "Tighten it a bit, unlocks earlier. Class soul earlier, at the beginning"). LIVE on release since 2026-10-23 (0.89). Nothing was gated: every system was open from floor 1 (0.89-4 board card Q15). The ladder is data, codex/unlocks.csv (System, Floor, Label, Anchor, Page), keyed on the account's best floor (the server's progress ratchet, the value T5 priced the trader on), never the current floor: class soul 1 · Hatch All + Dismantle All 8 · Souls + Devour 12 · Auto PvP 15 · Auto-optimise 20 · Breeding 25 · Scrolls + enchanting 30 · Grading + Upgrade All + the Shadow Trader 40 · Buy classes 50 · Competitive PvP 60. A locked system is visible with the floor that opens it (D 2026-09-09) and refuses with OPENS AT FLOOR N; drops are never gated. The client half (every entry point, the menu plates, the padlock chips) is this entry; the server refusals are part 2, the FTUE arrows and the settings toggles part 3, the scripted floors 1-9 part 4. Tower rulings form card T6. Gate: tools/probe_t6a_unlocks.py on fresh-account fixtures at ratchet 1 / 10 / 30 / 60.

2026-10-22 — Battle system: the damage formula takes the square root of Attack / Defense; wild HP by floor band; Auto PVP on ×1.5 HP (T4, D: "C1"). LIVE on release since 2026-10-23 (0.89). Needs a worker deploy. Tower rulings form card T4. The 0.89-4 board card Q13 sim measured the live engine at a PvP median of 2 rounds (56% of fights over in ≤ 2) and PvE medians of 7 / 9 / 5 / 3 by floor band, with floors 50–89 won only 61%; classes on equal gear sat at 38–52% and all 100 species at 41–50%, so no class or species stat moves. D picked C1: RawDamage uses √(Attack / Defense) (the thorns pre-mitigation chain and the card label's avgDmg carry the same root), a wild monster's max HP is ×0.6 / 0.7 / 1.0 / 1.2 on floors 1–49 / 50–89 / 90–109 / 110–119 (bosses and their companions untouched), and every unit in an Auto PVP fight stands on ×1.5 of its team-card HP, both seats. Re-run on the real engine (tools/probe_t4.py, the gate): PvP median 5 (38% of fights in 4–6), PvE medians 5 / 6 / 6 / 5, wins 99 / 98 / 89 / 100%. The client repo's docs/balance-history-2026-09-03.md carries the dated section.

2026-10-22 — Battle system: the intro and the advancement reveal wait for the creature's cry to end (T15, D). LIVE on release since 2026-10-23 (0.89). Tower rulings form card T15 ("Keep 1.2 s. Should not overlap but be sequential."). The cry ceiling stays at 1.2 s and no cry is trimmed. The battle intro's first beat used to come at a fixed 850 ms and the reveal's new form at a fixed 800 ms after the cry, while a stage-3 cry runs up to 1.2 s, so it played over the next step. The step now waits for the cry's own length when that is longer than its fixed time, never past 1.2 s, and keeps the fixed time when the cry is shorter or absent (audio off, muted, no row), so nothing can stall; the intro's later beats move with the first and keep their spacing (at most 350 ms later). Details on the creature page.

2026-10-18 — Battle system: a target that dies mid-round is re-aimed by Targeting in autoplay (T13, D). LIVE on release since 2026-10-23 (0.89). Needs a worker deploy. Tower rulings form card T13. The shared resolver used to send a pending single-target attack whose target had died this round to the first living enemy in slot order; in autoplay it now follows the side’s Targeting (the player’s in PvE, the pinned defense’s in Auto PVP), with Random drawing one roll off the round’s seeded stream so client and server agree. Manual play, Competitive and wild enemies are unchanged; the Auto PVP attacker is unchanged too, pending D (the match row does not carry its Targeting). Details and the gate on Autoplay.

2026-10-01 — every class has its own level (D, Rulings board card classlevel: “Every class is a different level. Only the account level stays shared.”). LIVE on release since 2026-10-23 (0.89). Since 2026-07-27 the build kept one classXp for every class, so switching class kept the number and every class shared one level, against what this design always said. Now classXp and clsAdv are the active class’s, and clsXpBy / clsAdvBy bank every other class. A newly bought class starts at level 1 and earns its own XP on the same curve (cap at level 100). Switching banks the class you leave and loads the class you take; its soul in the bag shows its own level. The server owns it: /api/battle credits class XP to the class the battle was fought as (if the account owns it), in a per-class ledger (ledger_cls), and the gap penalty uses that class’s level; the save door clamps each class’s XP to what that class was credited plus the usual grace, grow-only per class. Account XP and the account level are unchanged and shared. No migration: a save from before this has its classXp on its active class and every other class at level 1 until the wipe. Gates tools/probe_classlevel.py 1/9 → 9/9 and tools/probe_classlevel.mjs 6/19 → 19/19.

2026-10-01 — the Art pipeline card: transparency and sizes follow the live model (Rulings board card artcard, D: “review and update to latest models”). WIKI ONLY. The model name was already gpt-image-2.5-flare (snapshot gpt-image-2.5-flare-2026-09-08, the value both live generators pin), but the card still said the model rejects background:"transparent" — true of the retired gpt-image-2-2026-04-21, not of Flare: the PvP and Premium Shop raws in local-only/art_raw are RGBA straight off the API, including 1536×512 and 512×1536 strips the size list said were not offered. The caveat now names the old model, the size list carries the strips, and two leftover “gpt-image-2” mentions are fixed. Creature art keeps remove.bg + despill after approval: no creature has been generated with native alpha, and that switch is D’s open X7.

2026-10-01 — boss loot text matches the server (Rulings board card bossloot). WIKI ONLY. The floor-100 boss rolls its gear on floor 101’s row (the first Apex band), not a clamped tower band; an Apex boss reads one floor ahead; a tower boss egg comes from any line that spawns in the zone, not the Home_Zone lines. Details on Drop Tables.

2026-10-01 — five battle-engine bugs: enemy cooldowns tick, a stack counts once, soul thorns ask the rise-once rule, Soul Beyond Reach holds against area hits and damage over time, and area hits trigger the on-hit answers (Bug Run 0.89 ENGINE; D accepted review Q9 option A, findings F057 F058 F061 F062 F063). LIVE on release since 2026-10-23 (0.89). Battle numbers move; a balance pass follows. F057: the end-of-round cooldown pass ran over the three allies only, and nothing else ever set an enemy’s cooldown, so every wild creature, every boss and every Auto PVP defense fired its CD3 nuke every round while the attacker waited three. Cooldowns above says each move has one; the pass now covers both sides, the enemies’ picks join it, and an opponent queue naming a move still cooling sits the round out (the rule allies already had). F058: a status that stacks was counted twice — its magnitude was compounded per stack and then multiplied by the stack count again, so three −10% Defense stacks gave −70% (the clamp floor). It is now the Status Effects formula, 1 + Σ(mul − 1) × stacks: −10 / −20 / −30%. F061: a thorns soul could down the attacker without asking the rise-once signatures (Sethek, floor 106; Two Deaths, 118) and without marking it downed; it now does both, as status thorns already did. F062: Soul Beyond Reach (“the first killing blow this battle leaves the user at 1 HP”) was read by single-target hits only; an area hit or a damage-over-time tick killed through it. Both are killing blows and both are held now. F063: an area hit skipped the whole on-hit pipeline. Retaliation answers each damaging hit taken that round and Paladin heal counts damaging impacts … per hit say otherwise, and only taunt redirect is documented as bypassed by area moves. Each target an area move hits is now one damaging hit taken: retaliation counters and stacks Attack, the Paladin taunt heals 5%, soul and status thorns reflect, a counter status lands on the sweeper. A thorns source no longer hits an attacker already downed by an earlier target’s reflection. Gated in tools/probe_engine.py on the shared engine the client ships (15 checks).

2026-10-01 — the class card paints a 512px derivative; eggs follow the art ref (ui#1047 leftovers C and D, D's Bug Run 0.89 Q13). LIVE on release since 2026-10-23 (0.89); the card bake reaches players when DATA_PIN / ART_REF moves past this commit. Measured on tools/probe_01047_img.py: the CLASSES window's card painted the 1024px class master contain-fit in a 425×170 box (170px painted, 6.0×; 348 KB for six cards). codex/images/card/classes/ is the 512px derivative (same LANCZOS bake as the tile, tools/bake_tile_art.py; 18 files, 1.7 MB → 0.7 MB), served behind its own one-request flag so a ref without the card bake falls back to the master: 3.0×, 138 KB. The egg icon URL was built on the data ref, not the art ref (the drift ui#1117 fixed for class art): on dev a week-cached @main URL while every other art family followed the HEAD SHA. It now builds on the art ref; the eggs resolve at DATA_PIN and at HEAD. See the Art pipeline card's Served sizes.

2026-10-01 — the grids paint a 192px tile, not the 512px cutout (ui#1047, D 2026-09-30). ON DEV; the tile bake lands on release with the next DATA_PIN. Measured on tools/probe_01047.py: the soul bag (95px boxes), the codex (128px), the equipment slots (71px) and the floor atlas (58px) all painted the 512px med cutout, and the class soul tile the 1024px class master; one codex open pulled 302 images, 18 MB, 6.0 s to the last image and 327 MB of decoded raster, and the equipment window still fetched 11 of its 20 images on first open because the boot warm never covered the equipped creatures, the pens, the class art or the window chrome. tools/bake_tile_art.py bakes codex/images/tile/ (192px, same framing as med), tile/mutants/ and tile/classes/ (256px); the client's TILE/TILEM/TILEC builders serve them behind a one-request feature flag that falls back to the med family on a ref older than the bake, so a release pinned before it still draws. The boot warm now covers the equipped creatures, the pens, the party units, the class souls, eggs by type and the equipment/pen chrome, and a fourth idle tier warms all 300 codex tiles (~1.7 MB). See the Art pipeline card's Served sizes.

2026-10-01 — the class cards carry UPGRADE (ui#1056, D 2026-09-30). ON DEV. The CLASSES window listed the owned classes with ACTIVE / SWITCH and the rest with UNLOCK, and the only road to a class soul's upgrade bench was the soul bag: open the soul, then UPGRADE on its detail card. Every card of a class the account owns now carries an UPGRADE button top right, which opens that class soul's bench — the existing one, over the still-open window, so closing it lands back on the cards. A soul already at Void reads MAX there rather than a button that could open nothing, and an unowned card carries neither. See Class souls. Gate tools/probe_01056.py 1/6 → 6/6.

2026-09-30 — two ultimates in one round tie on the seed, and a synergy buff keys the same on client and server (client review F065, F6-007). ON DEV. F065: Class ultimates says two ultimates cast in the same round tie on the committed round seed, a blind 50/50; the engine had sorted the pair by Speed since the day ultimates shipped, so the faster caster always went first. The pair now orders on the seeded coin (measured 198 of 400 seeds for the slower caster), identically on both sides; everything else in the round orders as before. F6-007: a synergy buff (“Beast allies also gain +10% Defense”) shares its ability’s key with the base buff so the two merge by stronger magnitude and an “instead” synergy never double-dips. The client took that key from its own move table; the server’s Auto PVP replay had no table and fell back to the move’s name, so it stacked a second buff where the client merged, the two ended a fight on different HP, and an honest Auto PVP result could be flagged. The key is now read off the move itself, the same bytes on both sides. The rule is unchanged; the server now follows it.

2026-09-30 — the Art pipeline card names the canonical model, gpt-image-2.5-flare (review P6 X7, D 2026-09-10). WIKI ONLY. The card still pinned gpt-image-2-2026-04-21 at four sites (the lead sentence, Stage 2, Stage 1/3, and the never-use-edits-for-removal rule). D on 2026-09-10, answering the gpt-image-2.5 comparison: “we need to do a few tests with is to refine our pipeline but we need to change our project directions based on using this new model and not the old one”; on 2026-09-11 he picked the Flare tier (“I meant the flare one”). The live tool pins the snapshot gpt-image-2.5-flare-2026-09-08. Model name only: the transparency / remove.bg caveats and the item-icon generation line are left as written, because whether 2.5-flare’s native alpha replaces the remove.bg pass is D’s open question X7.

2026-09-30 — review drift fixes: F075, F147, F148, F336, F337. Codex only. The overview caught up with the engine and the owning pages; no rule changed. F075: Stat formulas and Damage formula predated the July magnitude rework — Core is now 0.6 × 7.5 × (L+25), AxisMult (3g+5)/8, the damage divisor 130/7.5 with a flat 15 + Atk/50, the character floor +188 with the 25% level term and the class soul multiplier; the level-100 creature table is recomputed. F147: Soul grading described an independent per-soul grade with a resource ladder; a creature soul reads its source creature’s quality grade, and only class souls grade with resources. F148: Local soul band is ×1.35–×1.60 (Thornback Chest ×1.35), per souls.csv. F336: soul-bag order is rank (class soul, mutant, creature, egg, consumable) then level then grade; ability-type and New filters added. F337: bulk salvage has four modes (by tier added); the soul-bag sweep does take creatures, and tags are swept in the inventory.

2026-09-25 — move effect icons on the battle buttons: crowded buttons fold to a count, damage-over-time and ignores-defense get icons, the hover window shows the duration. SHIPPED IN 0.87. Three things on the move selector buttons and the details window that opens when one is hovered. First, a move that deals damage and carries more than two additional effects no longer spreads every icon across its button: the left of the damage number shows a small square with the number of additional effects, the cooldown stays to its right, and the hover window lists every icon in full. The count is the effect icons plus the synergy and anti badges; the targeting icon is not an effect and stays beside the square. Second, two effects that had no icon on the button now have one, built from glyphs the icon set already ships: a damage-over-time effect that is not a bleed, poison or burn (twenty moves, I Am the Storm Entire among them) shows the sword with an hourglass, and a move that ignores part of the target’s Defense (twelve moves, Spear of the Sky’s Wrath among them) shows a shield with an X over it. The ignores-defense moves had an approved icon before this (the Pierce glyph on Move Effect Icons), but the client read the move text expecting “ignores 20% of defense” and every move is authored “of target Defense”, so none of the twelve ever showed it; the damage itself was always computed correctly. The Pierce glyph stays in the gallery, unpainted, until D chooses between it and the shield-with-an-X he asked for. Third, the hover window carries the duration hourglass with the turns beside it, the same figure the button shows when it is not folded.

2026-09-12 — the Primordial bubbles drift the cheap way. ON DEV (0.78). No visual change: same twelve bubbles per tile, same seven-second loop, same seamless rise. What changed is how the browser is asked to draw them. The bubbles were moved by shifting a background image, which is not something a phone’s graphics chip can do on its own — so every Primordial tile was fully redrawn on every frame, on every screen that shows one: the pen, the parent picker, the inventory, the soul bag, the equipment window. They are moved by a transform now, which the graphics chip does handle, and the loop stays seamless because one period of travel is still exactly one tile of bubbles. This matters most when zooming on Android, where the browser redraws every layer at the new zoom level and the work multiplies. The other three grade effects were checked at the same time. Abyssal’s shadow wave and Void’s drift were already drawing the cheap way. Divine’s twinkle is not, and is deliberately left alone: the only cheap version of it makes the stars blink without growing, which is a change to how it looks rather than to how it is drawn, and that is a design decision rather than a repair.

2026-09-10 — battle effects were missing on most casts at every stage, not just stages 1 and 2 (D handoff). ON DEV. The client built its effect table keyed on the Name column of move_vfx.csv and looked it up with the move’s stage name, and the two are not the same string. Measured against the two CSVs: that Name matches the stage-1 name on 257 of 400 rows, the stage-3 name on sixteen, and neither on the rest, because the move names drifted after the VFX rows were authored — Choking Pall is authored for a move called Dust Cough at stage 1 and Suffocating Pall at stage 3. So the table resolved 255 / 116 / 16 of 401 moves at stages 1 / 2 / 3: stage three was the worst, and every miss quietly drew the neutral impact. The table is now keyed on Move_ID, which does not change with the version, and the move’s stage rides into the renderer so one archetype can escalate per stage. The sparse VFX_Archetype_S2/_S3 and AFX_* columns are read defensively — blank inherits the base — so the client worked before they were authored and works now that they are. Resolution goes to 394 of 401 at all three stages. The silent fallback is deleted: a move with no implemented effect now says so once instead of drawing a plausible ring, which is how this went a month unnoticed. That immediately surfaced two gaps needing a ruling: speed_up and speed_down are authored but have no renderer (six moves), and M-CLASS-STRIKE has no VFX row at all. Both are pinned by name in the gate so the list can only shrink.

2026-09-10 — the Sage’s ultimate carries the whole ability, and its own description said so ambiguously (D ruling). ON DEV. The Echo ultimate (Recitation / Grand Thesis / Revelation) fires every support ability in the hero’s soul slots at once on the whole party. It was tested against all 90 slottable support abilities and seven fired nothing at all while sixty-four lost part of themselves — the ultimate spent either way. Four causes, all now fixed: the line synergy clause was never applied (44 abilities; two of them are nothing but that clause), cleanse was dropped (13), the survive and flat self-heal riders were dropped, and counter stances, thorns and next-attack riders were scaled by nothing and then discarded. Under the Echo the ally-type gate does not apply — whole party, the same rule that spreads a self-only buff — and a stance’s punishment is halved with it. D’s rounding rule is now applied to every whole number the Echo carries: “40% of stage one does nothing if multiplying a 1. 50% and 60% at stages 2 and 3 get it rounded up to 1.” Measured after: at 50% and 60% all ninety abilities fire on the whole party; at 40% nine do not, and every one of them is a single-step effect, which is exactly the rule. The three ultimates.csv descriptions were rewritten with D’s own wording — they now name the hero soul slots, say the whole party including the hero, and give the arithmetic (“+50% Attack becomes +20%”) instead of the ambiguous “40% magnitude”.

2026-09-10 — the VFX and AFX review page (D). WIKI ONLY, no game behaviour. Every move now has a placeholder visual effect and a placeholder sound, and a page to judge them on: VFX & AFX Review. A battle runs at the top with a random party on each side; picking a move from the creature grid below puts that creature on both sides and loops the move, ally then enemy, on a legally chosen target. The 400 moves share 20 visual archetypes and 14 sound archetypes, authored in codex/move_vfx.csv and described in codex/VFX_SPEC.md — the single source both this page and the game client read, so nothing can drift. Sounds are synthesised in the browser: no audio files, nothing to host. Approvals live on a small store of their own, so they follow you between browsers and devices and survive clearing the backlog or the cache; the backlog stays local, with its own copy and clear buttons. A move approved shows a check in the grid, and a creature whose four moves are all approved shows one too.

2026-09-09 — three dead panels on the codex pages, found from one report (D). WIKI ONLY. D read Nauplius (DFMC-031) and saw NOT YET GENERATED where its mutant should be. The MUTANT VARIANT box on creature.html was static markup no code ever filled, so it said that on all 300 creature pages while the art existed for every one of them; it now renders the recolour. The MOVE PROGRESSION box on the same page (“move design not yet started”, also all 300 pages) is removed — the MOVES panel above it has printed the full ladder since 2026-08-05. type.html said no move data exists to show type advantages; it now lists, per type, the moves that hit it harder and the moves that boost its allies, read from codex/moves.csv. And the balance table on this page linked every creature to codex/creature.html, which 404s — corrected to creature.html. DESCRIPTIVE ONLY: no game behaviour changes.

2026-09-09 — the inventory and soul bag buttons are almost twice the size (#794, D). LIVE on release since 2026-09-09 (0.73). They went from 64 to 120 pixels tall. That is not a chosen number: it is the largest the busier of the two rows can hold, so the soul bag’s row now fills all but two pixels of its width. Every button in both windows keeps the same size and the same shape — nothing is stretched and nothing overlaps. The inventory row holds four buttons rather than seven, so it is less full at the same size. Gate tools/probe_bagbuttons.py 6/6, red 5/6.

2026-09-09 — Crafting and the Discord invite leave the main menu (#810 / #811, D). LIVE on release since 2026-09-09 (0.73). Crafting is retired for now and its menu button is gone; the Discord invite button is gone too. Neither system was deleted — the crafting window and the invite link are still in the build, so either can come back as a single menu entry when it is wanted. Every other menu item is untouched. Gate tools/probe_menuretire.py 5/5, red 3/5.

2026-09-06 — grade effects on the creature sheet (#748, D; board 10.9). LIVE on release since 2026-09-08 (0.71). The window a creature opens into — from the soul bag, from press-and-hold on a breeding pen card or an equipment party card, or from a fight on one of your own party creatures — now plays the grade effect behind the portrait: the shadow wave (Abyssal), the blinking stars (Divine), the flowing energy and rising bubbles (Primordial), the drifting tendrils with the hover shimmer (Void). It is the same layer every tile and card already carries, at the sheet’s size, under the art. A sheet with no individual behind it (the codex gallery, a wild creature) and grades below Abyssal draw nothing, as everywhere else. Gate tools/probe_sheetgfx.py 13/13, red-first 5/13.

2026-09-04 — every move variant tested through the live engine; two defects fixed (board 2.1, 2.1a, 2.1b). LIVE on release since 2026-09-06 (0.70). A harness now runs all 1,203 move variants (each move at stage 1/2/3) through the real battle engine, once used by a creature and once used by the hero as a soul move, on nine fixtures (plain, enemies striking back, low-HP and debuffed targets, round three, the move’s anti type on the target, its synergy type on an ally, named-status and act-order conditions, self and ally debuffs, a lethal hit) against a same-power control. 941 do what their text says, 239 damage-only moves land, and 23 did not: Synergy clauses never applied on single-target damaging moves — the engine ran the synergy step on team, area and support moves only, so “allies of type X gain +N%” paid on nothing that hits one foe (Rotfly, Dusthound, Voidsiphon, Slagworm, Vertigo, Nosferatu, Demiurge) — fixed; and “Steal N buff from the target” was read as “hand your own debuffs to the target” (Doppelganger) — fixed. All 1,203 now pass; the harness is a gate.

2026-09-04 — a fifteenth menu plate: RANKINGS (#733, D). LIVE on release since 2026-09-06 (0.70). The leaderboards left the PvP Arena for a window of their own; the menu tile sits right after PVP ARENA.

2026-09-04 — Abyssal and Divine grade effects redrawn (D). LIVE on release since 2026-09-06 (0.70). Abyssal: the red pulse is gone; a near-black shadow band rolls slowly downward over a dimmer red glow, opaque at its dark edge and thinning to nothing, then darkening again, in a seamless loop (7.5 s per tile). Divine: the light sweep is gone; 24 tiny light-green stars sit scattered over the icon and blink in three groups — each star grows slightly and brightens, then shrinks and dims — on three different cycles so no two groups blink together. Both stay below the art, so the creature or item hides the part it covers. Table above updated.

2026-09-03 — no advancement-line row on the battle plate (#711, D). LIVE on release since 2026-09-03 (0.69). Hovering a creature in battle no longer adds its line and stage under the name; the plates on the floor and in Equipment keep it. Gate tools/probe_battlehover.py 2/2.

2026-09-03 — the creature sheet pays the individual’s grade (D, soul-bag report). LIVE on release since 2026-09-03 (0.69). A Void Wychroot read “+8.8%” on its sheet and “+17.5%” in the gloves picker for the same soul line. The sheet had the stage lever (2026-08-31) but pinned grade at ×1.00 on the argument that an unsocketed creature has no soul grade. D’s ruling: a creature on the codex has no grade, but one in the soul bag does, and its sheet reflects that. The individual’s own quality grade is its soul grade — the same lever the equipment window pays once it is socketed (Worn ×1.00 … Void ×2.00) — so the sheet’s “when slotted in passive armour” lines now print the picker’s numbers, and each move row prints the power a weapon-slot soul pays at that grade, with the base and the lever on hover. Codex entries, wild creatures and battle units carry no individual grade: they print the base with a “· NO GRADE” frame so a base is never read as a pay. Gate tools/probe_sheetgrade.py 5/5 (1/5 before); probe_sheetmoves 7/7 and verify_sheetlive unchanged.

2026-09-02 — onboarding 11.3: the creature name plate (D). LIVE on release since 2026-09-02 (0.68). Hovering a creature (a tap on touch) shows one plate everywhere: the name, its line and stage (“Thornback line · Stage 1”), and its type(s). Three surfaces read it from the creature's own row, so they cannot disagree: on the floor the plate hangs above the sprite (the old name label under a floor creature was built and never mounted — the same dead-prop family as #86); in battle the line and stage join the unit's plate under its name (its type medals already sit beside the name); on the party card the plate opens over the card. No rarity anywhere on the plate — D: hidden from players. Gate tools/probe_nameplate.py 10/10 on the real client with a real pointer (4/10 before).

2026-09-02 — #662 (D): the Primordial grade effect. LIVE on release since 2026-09-02 (0.66). The flat layer’s opacity pulse — the “blinking” — is gone; it sits at a fixed mid opacity. And the bubbles had never moved: the layer animated background-position from 0 to -100% on a tile the same height as the layer, and a percentage offset is (container − image) × P, which is zero when the image is the container. The tile is now half the layer height, so -100% is exactly one tile of travel — seamless by construction, and the pattern repeats twice — with six more bubbles on top, twelve per tile. Rendered gate tools/probe_primbubbles.py: 0 changed pixels between two frames 1.5 s apart with every other animation frozen, then 540.

2026-09-01 — Soul stage scaling and the soul grade multiplier corrected to engine truth. Three statements on this page said soul passive magnitudes scale down from the authored value (S1 ≈ 60% / S2 ≈ 80% / S3 100%), as if Effect_S3 held the Stage-3 figure. The engine does the opposite: SOUL_STAGE_MULT is [–, 1.00, 1.12, 1.25], so the authored value is the Stage-1 magnitude and stages 2 and 3 multiply it up by ×1.12 and ×1.25. The column name is historical. Separately, the Multiplier row read SoulMult = 1 + 0.05 × (grade# − 1), Worn ×1.00 → Void ×1.45; the shipped formula is 1 + (1/9) × (grade# − 1), Worn ×1.00 → Void ×2.00 (SOUL_GRADE_STEP = 1/9, and soulMultOf() carries that same statement as its own comment). Every soul in the game was therefore documented low at every stage above the first and at every grade above Worn. The MOVE power bands (S2 ≈ 80%, S1 ≈ 60% of S3) are a different mechanic with authored per-stage columns and are unchanged. Documentation corrected to the shipped engine; no code, CSV or DATA_PIN touched, and no player-visible change.

2026-08-31 — Accessory implicits corrected to codex/items.csv truth: Signet 2.0 → 6.0, Relic 3.0 → 9.0; and the creature base-stat table rebased onto the shipped coreOf(). The accessory rows were missed by the 2026-07-30 coefficient sweep, which recorded itself as complete. The base-stat table’s Off / Def / Utl column was 16/15 of the shipped value on every one of the ten grades — it was authored against the pre-2026-07-26 model (k 1.6, axisMult = (3g+5)/20), which produced grade×30+50 exactly; 43112a0 (2026-07-26) and da53dc7 (2026-08-02, k 1.00 → 0.60) both moved it and the table followed neither; the identity claim above the table (“= the old (grade×30+50) curve exactly”) went with it. HP was already correct on all ten. Found by the consistency audit (dfmc-client tools/audit), which now checks this table against coreOf(), axisMult() and hpFor() on a live client. DESCRIPTIVE ONLY: no game behaviour changes — these numbers describe what release already does.

2026-08-25 — Void Apex boss-Key drop rates re-derived from D's rule: one Key every two hours of chance at one won battle every 15 seconds, on each Apex key floor (D ruling on report #533; the tower's zones 1–10 keep their authored rows). Codex data; dev at once, release at the next data pin. Apex floor 103 goes from ~1,800 kills per Key (~15 h at that pace) to 1,440 (2 h); the rarity ladder is kept (C 1 / UC 1.5 / R 2.5 / SR 4 / SSR 7) and the first-clear guarantee is unchanged. Generator and check: tools/gen_keyrates.py. (A first cut the same hour applied a four-hour rule to every zone; D corrected it within the hour and the tower rows are byte-identical to before.)

2026-08-25 — refinement purged from the design (D order: “Refinement does not exist and needs to be purged from all text in the game and codex”; the mechanic itself was ruled out on 2026-08-10). The Refinement section, its odds/cost table, the “× Refinement” terms in the modifier pipeline, the +N columns of the progression and endgame-chase tables and every passing mention on this page are gone; Scrap's job is gear crafting and gear grading. Same pass on upgrading, item, crafting, hub, droptables, reliquary, grade, equipment, pvp, checklist, analytics and admin pages. In the game (ON DEV): the item tooltip, the slot rows, the current-item panel and the compare note no longer print “Refine +0” / “· +0”, and Scrap's catalogue text reads “gear crafting”. dismantle.csv keeps its Refinement column as the gear lookup key, fixed at +0 by construction; the 1,000 dead +1…+10 rows were removed.

2026-08-25 — level requirements are enforced: the account level gates gear, the creature's level gates its tags, and gems, runes and scrolls test the level of the piece they enter (D report + ruling). On release. The “Gear crafting & level requirements” table above now states the rule as the build applies it, including what happens to a piece already worn above level (inert, ILLEGAL · LV n, never moved). Full mechanics on Equipment; the socketing half on Sockets; the XP page's player-level note corrected.

2026-08-13 — grade effects layer under the art, and the divine sheen loops seamlessly (report #131). On release. Note in the visual-effects section above.