
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.
The boards, the rankings window and the public profile are on system-pvp.html and system-profiles.html.
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:
/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./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.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.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.Image_Path and Art_Status set immediately after each generation. Statuses: pending (awaiting approval), approved (art locked, do not regenerate), redo (flagged for regeneration).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.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.2304×1024, seamless horizontal tile. Atmospheric depth layer behind the battle background for ultrawide displays.codex/prop_assets.csv.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.
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.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.
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.
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.
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
└── classXPSix 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.
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.
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.
| Floor | Beat | Guaranteed item (server, once per account) | Arrow points at (opening.csv Anchor) |
|---|---|---|---|
| 1, the first fight | first_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 cleared | weapon_drop | a 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 cleared | materials_drop | the 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 account | the UPGRADE door (eq-upgrade) |
| 3 cleared | gem_drop | a T1 Common gem of a uniform family (Selection random_family) | a socket on the equipment screen (eq-socket) |
| 4 cleared | single_hatch | the 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 cleared | single_dismantle | — | DISMANTLE on an item's sheet (item-dismantle) |
| 6 | autoplay_open | — | the AUTOPLAY button, through the unlocks.csv autoplay rung |
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.
| Floor | Opens | FTUE arrow points at (unlocks.csv Anchor) | Server door (T6 part 2) |
|---|---|---|---|
| 1 | Class soul (handed out at creation; its upgrade opens with the souls rung) | the character soul plate on the equipment screen (eq-soul-slot) | — (open) |
| 6 | Autoplay (the end of the scripted opening, T6 part 4) | the AUTOPLAY button on the floor (autoplay) | — (client only: there is no autoplay door) |
| 8 | Hatch All, Dismantle All | the 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 |
| 12 | Souls (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 1 | the 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 |
| 15 | Auto 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) |
| 20 | Auto-optimise | AUTO-OPTIMISE on the equipment screen (eq-optimise) | — (client-only; no door) |
| 25 | Breeding | the BREEDING menu plate (menu-breed) | /api/unlock kind pen; a pen in use below the rung is the same save-door flag |
| 30 | Scrolls and enchanting | eq-scroll — no control carries it yet; the arrow waits until one does | /api/roll enchant |
| 40 | Grading (Gem / Rune / Scroll), Upgrade All, the Shadow Trader | the 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 |
| 50 | Buying classes | BUY on a class card (cls-buy) | /api/unlock kind class |
| 60 | Competitive PvP | FIND 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.
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):
| Class | Unlock cost | Endgame farm time | Path |
|---|---|---|---|
| Unpicked starters (Warrior / Mage / Archer) | 100 Scrap each | ~40 min | Gear dismantling — early-accessible |
| Brute → Warlord → Titan | 750 Scrap | ~5 h | Gear dismantling — affordable earliest of the three |
| Professor → Sage → Prophet | 100 Ink | ~5 h | Scroll/enhancement dismantling — mid |
| Assassin → Stalker → Nightblade | 750 Scrap | ~5 h | Bosses — 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).
| Class line | Stage 1 (A/D/S) | Stage 2 (A/D/S) | Stage 3 (A/D/S) | Access |
|---|---|---|---|---|
| Warrior → Knight → Paladin | 4 / 6 / 2 | 5 / 8 / 3 | 6 / 10 / 4 | Starter |
| Mage → Sorcerer → Archon | 6 / 1 / 5 | 8 / 2 / 6 | 10 / 2 / 8 | Starter |
| Archer → Ranger → Hawkeye | 5 / 2 / 5 | 7 / 3 / 6 | 8 / 4 / 8 | Starter |
| Brute → Warlord → Titan | 5 / 5 / 2 | 7 / 7 / 2 | 9 / 8 / 3 | Unlock — 750 Scrap |
| Assassin → Stalker → Nightblade | 6 / 1 / 5 | 7 / 2 / 7 | 9 / 2 / 9 | Unlock — 750 Scrap |
| Professor → Sage → Prophet | 2 / 5 / 5 | 2 / 7 / 7 | 3 / 8 / 9 | Unlock — 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.
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.
Rank thresholds (F through S) are TBD — to be balanced during development. Item description shows exact XP granted on consume.
| Formula | Expression | Purpose |
|---|---|---|
| XP required, levels 1–66 | 10 × L1.75 | Gentle journey phase — the full tower and all Stage 3 content unlock quickly |
| XP required, levels 67–100 | 234 × 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 × L | A 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 level | L0.75 then 23.4 × 1.16(L−67) | Derived — 23 battles at L67, 613 at L89, ~2,700 for 99→100 |
| Rarity | C | UC | R | SR | SSR |
|---|---|---|---|---|---|
| mr | 1.0 | 1.5 | 2.5 | 4.0 | 7.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).
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:
| Direction | Grace (0% penalty) | Ramp | Floor |
|---|---|---|---|
| Enemy higher (under-leveled) — forgiving | diff ≤ +10 | linear +10 → +50 | 90% at +50 |
| Enemy lower (over-leveled) — strict | diff ≥ −3 | linear −3 → −25 | 90% 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.
| Milestone | Battles | Casual (3 h/day) | Dedicated (12 h/day) | 24/7 autoplay |
|---|---|---|---|---|
| Level 67 — wild Stage 3 band (final advancements: Lv 56–73 by rarity) | ~885 | 10 days | 2.5 days | 1.2 days |
| Level 90 | ~5,180 | ~2 months | 14 days | 7 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.
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 | −1 | 0 | +1 | +2 | +3 |
|---|---|---|---|---|---|---|---|
| Spawn rate | 3% | 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 (10 floors each) | Levels | Battles | Zone time | Cumulative |
|---|---|---|---|---|
| Zone 1 — Grasslands | 1–10 | 39 | 0.4h | 0.4h |
| Zone 2 — Tidal Shallows | 11–20 | 84 | 0.8h | 1.1h |
| Zone 3 — Desert Plains | 21–30 | 118 | 1.1h | 2.2h |
| Zone 4 — Swarm Thicket | 31–40 | 151 | 1.4h | 3.6h |
| Zone 5 — The Crag | 41–50 | 180 | 1.7h | 5.2h |
| Zone 6 — Storm Peaks | 51–60 | 209 | 1.9h | 7.2h |
| Zone 7 — Sunken Bog | 61–70 | 237 | 2.2h | 9.3h |
| Zone 8 — Underwater Cave | 71–80 | 331 | 3.0h | 12.4h |
| Zone 9 — Gemstone Cave | 81–90 | 685 | 6.3h | 18.7h |
| Zone 10 — Flaming Hellscape | 91–100 | 1,740 | 16.0h | 34.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.
| Level | XP required | XP/battle (expected, on-level) | Battles (on-level) |
|---|---|---|---|
| 1 | 10 | 16 | 1 |
| 10 | 562 | 99 | 6 |
| 20 | 1,891 | 199 | 10 |
| 30 | 3,846 | 298 | 13 |
| 40 | 6,362 | 398 | 17 |
| 50 | 9,402 | 497 | 19 |
| 60 | 12,935 | 596 | 22 |
| 66 | 15,283 | 660 | 24 |
| 70 | 17,683 | 696 | 26 |
| 80 | 33,282 | 796 | 42 |
| 90 | 90,792 | 895 | 102 |
| 99 | 304,327 | 990 | 308 |
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).
The earlier multi-tab simultaneous-simulation design (up to 4 realm tabs at once) is retired — one character farms at a time.
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.
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.
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.
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).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.
| Rule | Detail |
|---|---|
| Re-entry is a no-op | Leaving 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 spawn | Encounter-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 credits | Refill 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-clocked | Spawn count is a pure function of server wall-clock time; client clocks are never consulted. |
| Battles remove one | A 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).
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.
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.
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.
Every boss kill guarantees two drops, delivered on the conclusion screen (params in codex/boss_loot.csv):
floor_creature_rarity.csv), not just its Home_Zone lines, weighted by the canonical rarity chances (30/30/20/10/10 over the tiers present); grade from the boss's floor band, clamped to the Legendary wild-egg cap. Breeding remains the only path to Divine+ and Void.| Element | Details |
|---|---|
| Battle trigger | Click (tag) a wandering creature on the map — identical on all floor themes. Wins count toward the floor's streak threshold. |
| Wild spawns | Persistent 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 / door | Opens 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.
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 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.
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.
| Side | PvE | PvP |
|---|---|---|
| Player | 1 avatar + 2 creatures | 1 avatar + 2 creatures |
| Enemy | 1 to N enemies (varies per encounter) | 1 avatar + 2 creatures |
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.
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.
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.
| Line | S1 / S2 / S3 | Effect |
|---|---|---|
| WARRIOR | Hold the Line / Iron Bulwark / Martyr’s Aegis | Taunt 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. |
| MAGE | Shardburst / Stonefall / Cataclysm | Strikes every enemy. Power 75 / 100 / 125 per target. |
| ARCHER | Sure Shot / Deadeye / Godpiercer | Strikes one enemy. Power 180 / 240 / 300. |
| BRUTE | Blood Price / Tyrant’s Toll / Wrath of the Pit | Retaliation 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%. |
| PROFESSOR | Recitation / Grand Thesis / Revelation | Echo: 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%. |
| ASSASSIN | Slip Away / Shadowmeld / Vanish | Strikes one enemy. Power 120 / 180 / 240, then untargetable by single-target moves for 1 / 2 / 3 rounds. |
Resolution rules and edge cases.
ceil(d/2); integer components (Speed stages, shield hits) scale then round half up with a floor of 0, so a +1 stage echoes as 0 at S1 and 1 at S2/S3 while ±2 stages echo as 1 at every stage. A clause left with no live magnitude is dropped entirely. Echoed statuses carry their source ability's key, so the standing merge rule stops a half-strength echo overwriting a running full-strength cast. With no support ability slotted the ultimate is unavailable and cannot be spent.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.
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.
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.
| Axis | Role | Scaling |
|---|---|---|
| Attack | Determines damage dealt by attacks | Scales with level |
| Defense | Reduces incoming damage; determines HP pool | Scales with level |
| Utility | Status effect potency & duration, healing/shield power | Scales with level |
| Speed | Determines turn order — highest Speed acts first | Flat — does not scale with level |
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.
| Term | Formula |
|---|---|
| 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 multiplier | AxisMult(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 |
| Speed | Speed = axisGrade (flat — no level scaling, no quality scaling, no gear sources; only temporary in-battle stat stages modify turn order) |
| HP | HP = (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 HP | Boss 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 multiplier | QM = 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.
| Grade | Off / Def / Utl | Speed (flat) | HP (at this Def grade) |
|---|---|---|---|
| 1 | 563 | 1 | 1,780 |
| 2 | 773 | 2 | 2,076 |
| 3 | 984 | 3 | 2,373 |
| 4 | 1,195 | 4 | 2,669 |
| 5 | 1,406 | 5 | 2,966 |
| 6 | 1,617 | 6 | 3,263 |
| 7 | 1,828 | 7 | 3,559 |
| 8 | 2,039 | 8 | 3,856 |
| 9 | 2,250 | 9 | 4,152 |
| 10 | 2,461 | 10 | 4,449 |
| Band | Power | Cooldown |
|---|---|---|
| Light | 50 | 0 |
| Standard | 80 | 0–1 |
| Heavy | 120 | 2 |
| Nuke | 160 | 3–4 |
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.
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 rule | Detail |
|---|---|
| Damage-per-turn proxy | DPT = 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. |
| Riders | 120-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 stacking | A 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 only | No 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 CHART | There 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 profile | Strikers (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 stages | In-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.
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:
M-CLASS-STRIKE in codex/moves.csv). Equipping any soul move removes it. Creatures never have Strike — their fillers are their own CD0 kit movesThe 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.
| Context | Target turns | Design rationale |
|---|---|---|
| Regular PvE | 3–5 | 10 per floor, ~2–3 sec/turn animation. Must feel like mowing through fodder. |
| Boss | 10–15 | Boss format is boss + 2 actives (no reserves); length comes from elevated boss durability, not bench depth. |
| PvP | 10–15 | Long enough for sequencing decisions and swap timing. Bo3 finishes in ~2–3 min total. |
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.
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:
| Event | Level | Rule |
|---|---|---|
| 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.
| Resource | Status | Rationale |
|---|---|---|
| Cooldowns | Active | Each move has a cooldown (0 = always available, 1–4 turns for stronger moves). Creature identity IS its rotation pattern. |
| Stamina / PP | Rejected | 3–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). |
| Hold | Deferred | Possible 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.
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.
| Realm | On death | Character after death | Items go to |
|---|---|---|---|
| Eternal | Soft — remain on floor, streak resets | Unchanged | — |
CharacterSaveData {
}
The mark is provenance-only and persists through trades — death-marked creatures trade normally.
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.
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.
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.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 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:
| Source | How it yields Ichor |
|---|---|
| Combat | Per 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 dismantling | Keyed 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.
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 upgrade | Effect |
|---|---|
| Capacity | More eggs incubating simultaneously |
| Grade boost | Increases 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?
| Trigger type | Example |
|---|---|
| Level threshold | Advance at level 27 (per-line, see bands below) |
| Item use | Use Advancement Stone |
| Bond/friendship | High bond + level up |
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).
| Rarity | Lines | S1 → S2 | S2 → S3 |
|---|---|---|---|
| Common | 28 | Lv 24–36 | Lv 56–68 |
| Uncommon | 28 | Lv 28–38 | Lv 61–70 |
| Rare | 20 | Lv 24–37 | Lv 63–69 |
| Super Rare | 14 | Lv 26–38 | Lv 56–70 |
| Super Super Rare | 14 | Lv 35–40 | Lv 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.
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 grade | Mutant chance |
|---|---|
| Worn | 0.01% |
| Common | 0.02% |
| Uncommon | 0.03% |
| Rare | 0.04% |
| Epic | 0.05% |
| Legendary | 0.06% |
| Abyssal | 0.07% |
| Divine | 0.08% |
| Primordial | 0.09% |
| Void | 0.10% |
Two creatures of the same species can be fused via the Fusion UI panel. Fusion consumes both creatures and produces one:
| Property | Result |
|---|---|
| XP | Combined XP of both creatures |
| Grade | Highest grade of the two is kept |
| Mutant | If either creature is Mutant, the result is Mutant |
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.
| State | Condition | Information visible |
|---|---|---|
| Undiscovered | Never encountered | Silhouette only, no data |
| Seen | Encountered in battle at least once | Name, floor levels found, basic stats ranges visible |
| Acquired | Hatched from an egg of this creature type | Full 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. | ||
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?
Each character has 8 equipment slots. Weapons and accessories provide useable abilities. Armour slots provide passive bonuses.
| Main hand | Primary weapon — ability slot |
| Off hand | Shield, off-hand weapon, or tome — ability slot |
| Accessory 1 | Ring, amulet, etc. — ability slot |
| Accessory 2 | Ring, amulet, etc. — ability slot |
| Head | Helmet |
| Chest | Body armour |
| Gloves | Gauntlets |
| Feet | Boots |
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 class | Slots | Soul effect |
|---|---|---|
| Ability slots | Main Hand, Off Hand, Accessory 1, Accessory 2 | Move 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 slots | Head, Chest, Gloves, Feet | Scoped 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 scope | Effect | Example |
|---|---|---|
| Local | Buffs 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" |
| Personal | Buffs the character's totals — moderate power (5–10% band by rarity) | Dusthound on Head: "+4% Attack" |
| Team | Buffs 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.
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.
| Rule | Detail |
|---|---|
| Multiplier | SoulMult = 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). |
| Source | Creature 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 cost | The 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 chance | Shared 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. |
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.
| Grade | Gems | Runes | Enchantments | Visual effect |
|---|---|---|---|---|
| Worn | — | — | — | — |
| Common | 1 | — | — | — |
| Uncommon | 1 | 1 | — | — |
| Rare | 1 | 1 | 1 | — |
| Epic | 2 | 1 | 1 | — |
| Legendary | 2 | 2 | 1 | — |
| Abyssal | 2 | 2 | 2 | Shadow wave rolling down over a dim red glow |
| Divine | 3 | 2 | 2 | Tiny light-green stars, blinking |
| Primordial | 3 | 3 | 2 | Flowing energy, subtle distortion |
| Void | 3 | 3 | 3 | Dark 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.
Every modifier in the game has one of three scopes, determining what it affects.
| Scope | Affects | Usage |
|---|---|---|
| Local | Only the item it's on — scales that item's own stat contribution | Default for all character gear modifiers (gems, runes, enchantments). A rune's +8% on a weapon only multiplies that weapon's base + gems. |
| Personal | The bearer as a whole — the character or the specific creature wearing it | Creature tag modifiers (tags are the exception — all tag modifiers are Personal, affecting the creature's total stats). Some creature souls. |
| Team | All allies (character + both creatures) | Some creature souls. Individually weaker per target but multiplied across 3 entities. |
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.
| Family | Dismantles into | Material pays for |
|---|---|---|
| 💎 Gems | Dust | Grading gems up (crafting removed 2026-10-01) |
| 🔷 Runes | Essence | Grading runes up (crafting removed 2026-10-01) |
| 📜 Scrolls | Ink | Grading scrolls up (crafting removed 2026-10-01), rerolling a socketed scroll's modifier (3 × tier Ink) |
tier × grade# material (a T10 Rare gem → 40 Dust)6 × tier material produces a Worn enhancement of chosen type at that tierPer 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
CreatureStat = BaseStat(grade, level)
+ Σ gem flats from both tags
× (1 + Σ rune % from both tags)
+ enchantment effects
+ Σ Team modifiers from character gear souls
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.
| Slot | Implicit | Structure |
|---|---|---|
| Main Hand / Off Hand | MH: 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 / Feet | Flat 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 & 2 | One flat stat, Local | 2 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 line | Main hand — S1 → S2 → S3 | Off hand — S1 → S2 → S3 |
|---|---|---|
| Warrior → Knight → Paladin | Arming Sword → Longsword → Great Morningstar | Kite Shield → Heater Shield → Tower Shield |
| Mage → Sorcerer → Archon | Crystal Staff → Amethyst Staff → Ruby Warstaff | Handflame Focus → Amethyst Shardring → Magma Orbit |
| Archer → Ranger → Hawkeye | Ash Shortbow → Runed Recurve → Hawkwing Greatbow | Scout's Quiver → Silvered Quiver → Obsidian Quiver |
| Brute → Warlord → Titan | Nailed Club → War-Club → Colossus Axe | Fist Cords → Iron Knucklewraps → Titan Chainwraps |
| Assassin → Stalker → Nightblade | Iron Dagger → Blackened Scimitar → Bladed Gauntlet | Paired off-hand of the same (dual wield) |
| Professor → Sage → Prophet | Cut Quill → Gilded Quill → Scribing Quill | Battered Tome → Ancient Tome → Hovering Grimoire |
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.
| Tier | Name | Level req | Craft cost |
|---|---|---|---|
| T1 | Arming Sword | 1 | 25 Scrap |
| T2 | Veteran's Arming Sword | 10 | 50 Scrap |
| T3 | Champion's Arming Sword | 20 | 75 Scrap |
| T4 | Longsword | 30 | 100 Scrap |
| T5 | Veteran's Longsword | 40 | 125 Scrap |
| T6 | Champion's Longsword | 50 | 150 Scrap |
| T7 | Great Morningstar | 60 | 175 Scrap |
| T8 | Veteran's Great Morningstar | 70 | 200 Scrap |
| T9 | Champion's Great Morningstar | 80 | 225 Scrap |
| T10 | Tyrant's Great Morningstar | 90 | 250 Scrap |
| Grade \ Tier | T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10 |
|---|---|---|---|---|---|---|---|---|---|---|
| Worn | 17 | 33 | 50 | 66 | 83 | 99 | 116 | 132 | 149 | 165 |
| Common | 18 | 37 | 55 | 74 | 92 | 111 | 129 | 148 | 166 | 185 |
| Uncommon | 20 | 41 | 61 | 82 | 102 | 123 | 143 | 164 | 184 | 205 |
| Rare | 22 | 45 | 67 | 90 | 112 | 135 | 157 | 180 | 202 | 224 |
| Epic | 24 | 49 | 73 | 98 | 122 | 147 | 171 | 195 | 220 | 244 |
| Legendary | 26 | 53 | 79 | 106 | 132 | 158 | 185 | 211 | 238 | 264 |
| Abyssal | 28 | 57 | 85 | 114 | 142 | 170 | 199 | 227 | 255 | 284 |
| Divine | 30 | 61 | 91 | 121 | 152 | 182 | 213 | 243 | 273 | 304 |
| Primordial | 32 | 65 | 97 | 129 | 162 | 194 | 226 | 259 | 291 | 323 |
| Void | 34 | 69 | 103 | 137 | 172 | 206 | 240 | 275 | 309 | 343 |
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.
| Slot | Ladder |
|---|---|
| Head | Cowl · Hood · Coif · Sallet · Barbute · Helm · Greathelm · Wyrmskull Helm · Sanctified Casque · Voidcrown |
| Chest | Padded Jerkin · Leather Jerkin · Brigandine · Scale Hauberk · Chain Hauberk · Cuirass · Warplate · Bloodforged Plate · Sanctified Bulwark · Voidplate |
| Gloves | Handwraps · Leather Grips · Studded Grips · Bracers · Chain Mitts · Steel Gauntlets · Wargauntlets · Bloodforged Fists · Sanctified Grasp · Voidclaws |
| Feet | Footwraps · Worn Boots · Hobnailed Boots · Riding Boots · Chain Boots · Greaves · Wargreaves · Bloodforged Stride · Sanctified Sabatons · Voidtreads |
| Base type | Implicit |
|---|---|
| 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.
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.
| Rule | Character gear | Creature Tags |
|---|---|---|
| Grades (Common–Supreme) | Yes | Yes |
| Gem slots | Yes | Yes |
| Rune slots | Yes | Yes |
| Enchantment slots | Yes | Yes |
| Base type implicit | Yes | Yes |
| Creature soul socket | Yes | No |
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.
craft; record). The level-requirement rows are live and are the rule (items.csv Level_Req).| Rule | Detail |
|---|---|
25 × tier Scrap produces a Worn item of chosen slot and base type at that tier (T10 = 250 Scrap) | |
| Equip requirement — character gear | Tier 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 — Tags | Same 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, scrolls | Carry 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 level | Never 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 socketing | Enhancement 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.
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.
| Rule | Detail |
|---|---|
| Currency | Scrap (gear) · Dust / Essence / Ink (enhancements) |
| Cost scaling | Rises 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 chance | Into 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 cost | 1 / 1 / 2 / 3 / 5 / 8 / 12 / 18 / 40 Ichor per attempt by target grade |
| On failure | No progress, no destruction — Ichor is consumed but grade is unchanged |
| Source | Yield |
|---|---|
| Boss kills | 1–3 Ichor per kill |
| Dismantling Rare+ gear | R 1 / E 2 / L 4 / A 8 / D 12 / P 20 / V 32 |
| Deep-floor battle drops (floors 61+) | ~2% chance per battle |
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.
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.
| Income | Rate |
|---|---|
| Gear drop | Per 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 drop | Per 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 drops | The 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) |
| Stage | What the player has | Effort |
|---|---|---|
| Level bracket 9/10 | Uncommon+ gear in all 12 slots, key pieces at Rare (first scroll socket), Uncommon enhancements socketed | Deterministic — falls out of the leveling journey (~5,200 battles by floor 90) |
| Grade 5 | Epic key pieces (~11 expected Ichor each), Rare enhancements (~45 material each) | A bit of grind — reachable within weeks of hitting 100 |
| Legendary–Divine | Market-relevant gear, the trading tier | Months; where most endgame players live |
| Primordial / Void | The chase | Year-scale per item for dedicated players (see below) |
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.
Cosmetics-only monetization is safer for player reception and avoids regulatory issues in certain markets. Decide scope early.
Tradeable items and creatures are Steam Inventory items. Ownership lives on Steam; gameplay data lives on the backend keyed to instance IDs.
SteamInventory
└── Owns CreatureToken #ItemDef_042, InstanceID 8837623
Your Backend
└── CreatureInstance_8837623 {
level, moves, stats,
}Never grant Steam inventory items from the client. Server-side only with publisher key validation.
| Tradeable | Not tradeable |
|---|---|
| Creatures — instance data and death mark travel with the token | Ladder progress / rank |
| Crafting materials | Character / class levels |
| Cosmetic items | Eggs — hatch to trade the creature |
| Equipment | Account-bound starter items |
| Soul Gems (TBD) | — |
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.| Package | Purpose |
|---|---|
| Input System | All player input — abstracted for future mobile port |
| Cinemachine | Camera management |
| TextMeshPro | All in-game text |
| Addressables | Async AI art asset loading — critical for volume |
| Newtonsoft JSON | Data serialization |
| Netcode for GameObjects | PvP battle sync |
| A* Pathfinding Project | Autoplay pathfinding on tilemap |
| Unity Localization | Future-proofing for multiple languages |
| Service | Purpose |
|---|---|
| Unity Gaming Services | Auth, cloud save, leaderboards, economy, remote config |
| Unity Relay + Lobby | PvP matchmaking and connection |
| Steamworks.NET | Steam integration, achievements, inventory, market |
| Steam Inventory Service | Tradeable item ownership (ItemDefs) |
| Cloud function (Lambda/PlayFab) | Server-side item grants, trade validation |
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 type | Contents |
|---|---|
| Event log | High-level player events: died, entered battle, completed battle (with XP and items acquired), acquired boss key, progressed to next floor |
| Battle log | Detailed per-battle record of every move and result, scoped to a single battle |
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.
codex/moves.csv Synergy clauses were authored under the original narrow definition (field-type ally empowers the move). Revisit all 100 lines and reassign clauses that would read better as the broadened forms: (b) stronger when targeting an ally of a certain type, or (c) gains an added effect when used on an ally of a certain type. See NO TYPE CHART in Battle System.Name_S1/S2/S3 for the remaining 99 lines (THORNBACK done as reference). S1 simpler, escalating to a more menacing S3.Original roadmap with top-down grid movement, player avatar, tile-based encounters. Archived for potential future use.
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.
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.
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.
| Location | What it holds |
|---|---|
eccestanczyk/dfmc | This GDD (index.html at the GitHub Pages root), the codex data CSVs under codex/, and the live codex site pages. |
eccestanczyk/dfmc-game | The 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
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.
| File | Rows | Contents |
|---|---|---|
codex/creatures.csv | 312 (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.csv | 120 | The 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.csv | 1,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.csv | 20 (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.csv | 120 | Per-floor odds of an encounter rolling into each tier; SSR/SR odds scale up over the run (see “Encounter weights” below). |
codex/maptypes.csv | 50 | Tileset / map-restyle definitions for floor-art generation. |
codex/items.csv | 617 | Full 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.csv | 417 | Complete 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.csv | 416 | Soul 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.csv | 10 | Breeding 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.csv | 20 | Zone-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.csv | 11 | Guaranteed 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.csv | 6 | Drop 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.csv | 120 | Per-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.csv | 101 | Gear-drop grade weights per floor band (24 bands; mirrors Stat & Equipment Tables §15). Divine, Primordial and Void never drop. |
codex/key_drop_rates.csv | 20 | Per-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.csv | 11 | Guaranteed 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.csv | 120 | Level 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.csv | 42 | Zone 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.
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 |
|---|---|
| 1 | Worn |
| 2 | Common |
| 3 | Uncommon |
| 4 | Rare |
| 5 | Epic |
| 6 | Legendary |
| 7 | Abyssal |
| 8 | Divine |
| 9 | Primordial |
| 10 | Void |
| Slot | Category |
|---|---|
| Main Hand | Weapon — ability slot |
| Off Hand | Weapon — ability slot |
| Accessory 1 | Weapon — ability slot |
| Accessory 2 | Weapon — ability slot |
| Head | Armour — passive |
| Chest | Armour — passive |
| Gloves | Armour — passive |
| Feet | Armour — 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.
| Name | Use |
|---|---|
| Scrap | Gear crafting (25 × tier) and gear grading |
| Scrap | Grading gear up the Worn–Void ladder — tier-scaled attempt costs (2026-07-31); enhancements grade in Dust / Essence / Ink |
| Ichor | Unified breeding currency — from completing battles and dismantling eggs |
| Wraithgold | Premium. 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.
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.
| Inventory | Soul bag | |
|---|---|---|
| Holds | Weapons, armour, accessories, tags, gems, runes, scrolls, boss keys | Creatures, eggs, class souls |
| Starting slots | 80 | 30 |
| Bought in | 10 slots at a time | 30 slots at a time |
| Maximum | 400 (raised from 160 in 0.72, #789) | 600 |
| Currency | Wraithgold (codex/inventory_slots.csv) | Wraithgold (codex/soul_slots.csv) |
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.
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).
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.
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.
Outdoors, Cave, Fishing — purely visual themes, identical mechanics.
| Floors | Zone | Primary type(s) |
|---|---|---|
| 1–10 | Grasslands | Beast |
| 11–20 | Tidal Shallows | Sea Creature |
| 21–30 | Desert Plains | Reptile, Serpent |
| 31–40 | Swarm Thicket | Insect |
| 41–50 | The Crag | Arthropod |
| 51–60 | Storm Peaks | Avian |
| 61–70 | Sunken Bog | Amphibian |
| 71–80 | Underwater Cave | Fungal, Mollusk |
| 81–90 | Gemstone Cave | Spectral, Vampiric |
| 91–100 | Flaming Hellscape | Construct |
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.
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.
| Category | Types |
|---|---|
| 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.
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 floors | Actual wild spread |
|---|---|---|
| Infant (Stage 1) | 1–33 | Floors 1–38 (SSR lines hold S1 latest) |
| Advanced (Stage 2) | 34–66 | Floors 24–71 (Commons reach S2 by ~24) |
| Final (Stage 3) | 67–100 | Floors 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.
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.
| Floor | Common | Uncommon | Rare | Super Rare | Super Super Rare |
|---|---|---|---|---|---|
| 1 | 50% | 30% | 15% | 4% | 1% |
| 51 | 32.32% | 27.47% | 22.58% | 11.07% | 6.56% |
| 99 | 15.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%.
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.
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.
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.
The creature occupies only the CENTER 70% of the frame, surrounded by clear empty background on all sides — nothing even close to any edge. Do NOT use outpainting/edits to extend — the edits endpoint degrades detail quality across the whole image even when only borders are masked. Always regenerate fresh.In a natural combat-ready stance as if facing an opponent. Full body visible with generous margin on all sides, nothing cropped at edges. Centered, painterly dark-fantasy illustration, dramatic rim lighting with clear mid-key exposure, vivid readable colors, one single cohesive creature, no text, no props, no scenery. No floating or detached parts.Image_Prompt column of codex/creatures.csv.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 |
|---|
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.
Learn_Level in ultimates.csv. The class preview describes the ultimate a line brings before it is unlocked, and the Equipment window shows the CURRENT ultimate with a live figure — expected damage for the nukes, the rider itself for the others — or the level it unlocks at while still locked.Targets=self moves no longer offer allies in target selection. See Status Effects & Buff Stacking.