DROPTABLES

How Drops Work

Every wild creature defeated makes three independent rolls — one for gear, one for an enhancement (gem / rune / scroll, even split), and one for the defeated line's Stage-1 egg. Each roll uses the same per-floor chance table below. When a gear roll succeeds, the base is a uniform pick among the gear bases (weapons, armour, accessories, tags); a successful enhancement roll splits evenly across gem / rune / scroll, uniform within the family.

Per-kill chances are scaled on the game-wide rarity value ladder — C 1.0 / UC 1.5 / R 2.5 / SR 4.0 / SSR 7.0 (the same ladder as XP and Ichor) — and normalized per floor against codex/encounter_weights.csv, so each drop family lands exactly 10% per battle (3 kills) in expectation on every floor of the tower. Rarer kills pay better; the floor-wide economy never drifts.

All chances on this page are read live from the codex CSVs — drop_chances_by_floor.csv, drop_grade_weights.csv, key_drop_rates.csv, boss_loot.csv, first_win_drops.csv — the same tables the game reads. Nothing is hardcoded.

Per-Kill Drop Chances by Floor

Chance (%) that one defeated creature of each rarity drops from one family. The same table is rolled once per family (gear, enhancement, egg). Boss floors have no wild encounters.

LOADING…

Source: codex/drop_chances_by_floor.csv · normalized against codex/encounter_weights.csv

Drop Grade Weights by Floor Band

When a gear drop lands, its grade is rolled from the band of the floor it dropped on. Divine, Primordial, and Void never drop — the grading gamble (paid in Scrap) is the only path to Divine+ gear, and breeding the only path to Divine+ creatures.

LOADING…

Band shifts: Enhancements (gems, runes, scrolls) roll their grade one band behind gear. Boss gear rolls one band ahead of the boss's band (the band after the tower’s 91–100 row is the first Void Apex row, so the floor-100 boss rolls floor 101’s Rare-and-up row; Apex rows are one floor wide, so an Apex boss rolls one floor ahead (floor 102 reads 103) and floor 120 clamps to its own row). Wild and boss eggs use the floor band clamped to the Legendary wild-egg cap.

Source: codex/drop_grade_weights.csv · band rules in codex/drop_rates.csv and codex/boss_loot.csv

Boss Keys

A single zone-specific Key (ITM-KEY-010…ITM-KEY-100) is required to enter a boss floor and is consumed on entry. Every wild creature defeated on the zone's 9 preceding floors rolls for that zone's Key, per creature, scaled on the rarity value ladder and normalized so a minimum-win journey through the zone yields exactly one Key in expectation.

Guaranteed key: the first time a character clears the 9th floor of a zone (floors 9, 19, … 99), a Key is guaranteed to drop — one-time per zone per character.

LOADING…

Gates: a zone's Key cannot drop until the character has banked that zone's Min_Wins wins AND Min_Kills wild kills (zoneWins/zoneKills in the save, counted per zone, wild battles only — a boss win advances neither). Below either gate the roll is skipped entirely.

A Key that drops into a full inventory is DESTROYED. Every grant goes through one shared space check: no free item slot means the drop is discarded, never queued and never held — the victory screen reports only the generic "N drops lost — inventory full" and does not say a Key was among them. Since keys are the rarest item lane in the zone (0.46% per Common kill in Desert Plains, ~1 per 60 battles), a player farming with a full bag can lose several keys without ever knowing. Reported live 2026-08-01 by a player stranded on floor 29 with 235 zone wins and no key; his context snapshot read invCount 80 / invCap 80.

Void Apex rate (D, 2026-08-25): on each Apex key floor (101, 103, … 119) one Key is expected every two hours of chance at one won battle every 15 seconds — 1,440 kills per Key, split by the rarity ladder, normalised on that floor's encounter mix. Those ten rows are generated from that sentence (tools/gen_keyrates.py), never hand-typed; the tower's ten rows keep their authored minimum-win normalisation.

Source: codex/key_drop_rates.csv

Boss Loot

Every boss kill guarantees two drops, delivered on the battle-conclusion screen straight to inventory:

One piece of equipment — a uniform pick among the Weapon / Armour / Accessory bases, at the boss floor's tier, with grade rolled one band ahead of the boss's floor band: the band after the tower’s 91–100 row is the first Void Apex row, so the floor-100 boss rolls floor 101’s Rare-and-up row; Apex rows are one floor wide, so an Apex boss rolls one floor ahead (floor 102 reads 103) and floor 120 clamps to its own row. Divine+ never drops.

One native egg — a Stage-1 egg of any line that spawns on the zone’s floors (floor_creature_rarity.csv: a line counts when any of its stages spawns there; the egg is its Stage 1) — 69–87 lines per tower zone, not just the ten lines creatures.csv files under that zone as home, weighted by the canonical rarity chances 30/30/20/10/10 (C/UC/R/SR/SSR) normalized over the tiers present in the zone. Grade from the boss's floor band, clamped to the Legendary wild-egg cap — breeding remains the only path to Divine+ and Void creatures. Void Apex bosses (102–120): the pool is the Apex's own line list (all 100 lines) and the tier weights come from that boss floor's row in apex_boss_egg_rarity.csv instead of the 30/30/20/10/10 above; the egg is any line, including the lines of the three creatures in the fight — nothing is excluded (D ruling 2026-08-27: “apex boss is any egg ok”). Full mechanics on Void Apex. On DEV since 2026-08-27, on release at the next push.

Source: codex/boss_loot.csv

First-Win Bonus Drops

The first 10 wild-battle wins each grant an additional guaranteed drop on top of the normal rolls. All grants spawn at Worn, Tier 1. Boss wins do not advance the counter. Win 1 rolls the accessory family at random; win 4 grants the complement. Egg grants (wins 1 and 9) give the Stage-1 egg of the lowest-rarity enemy present, random among ties.

LOADING…

Source: codex/first_win_drops.csv

Drop Rules by Item Type

Item TypeSourcesTier & Grade Rules
Gear — Character
Weapon (MH/OH, 6 classes)Wild gear roll · boss guaranteed gear · first-win ladder (crafting removed 2026-10-01)At-floor tier. Grade from the floor band; boss gear one band ahead. Divine+ never drops — the Scrap grading gamble only. Equip: tier N needs character level ≥ (N−1)×10.
Armour (Head / Chest / Gloves / Feet)Same as weaponsSame tier, grade, cap, and equip rules as weapons.
Accessory (Signet +Atk / Relic +HP)Same as weapons; win 1 rolls one family, win 4 grants the complementSame tier, grade, cap, and equip rules as weapons.
Gear — Creature
Tag (Carapace / Fang / Heart)Wild gear rollAt-floor tier, floor-band grade, Divine+ never drops. Equip: tier N needs creature level ≥ (N−1)×10. Full gem/rune/enchant slot rules; no soul socket.
Enhancements
Gem (Garnet / Onyx / Bloodstone)Wild enhancement roll (even split gem/rune/scroll) · first-win ladder (crafting removed 2026-10-01)Grade weights sit one band behind gear. Dismantles to Dust.
Rune (Ruin / Aegis / Vitality)Wild enhancement rollOne band behind gear. Dismantles to Essence.
Scroll (enchant)Wild enhancement rollOne band behind gear. Effect rolled at socket; enchants are item-local. Dismantles to Ink.
Creatures & Access
EggWild egg roll (the defeated line's Stage-1 egg) · boss guaranteed native egg · first-win ladder (wins 1, 9) · breedingDrop grade from the floor band, clamped to Legendary (wild-egg cap). Breeding is the only Divine+/Void path. Hatch grade weights on the Eggs page.
Boss Key (zone-specific)Per-kill roll on the zone's 9 wild floors · guaranteed on first 9th-floor clearOne expected Key per minimum-win zone journey. Consumed on boss entry. No grades.
Currencies & Materials
ScrapDismantling gear (all grades)Never drops directly. Feeds gear crafting.
IchorEvery kill, wild and boss: round(2 × (1 + level/100) × mult), mult C 1 / UC 1.1 / R 1.2 / SR 1.35 / SSR 1.5 (#772) · egg dismantles (breeding.csv Egg_Dismantle_Ichor). Gear dismantles pay no Ichor.Feeds the Ichor gamble — the only source of Divine+ gear.
Dust / Essence / InkDismantling gems / runes / scrolls (tier × grade#)Never drop directly. Feed enhancement crafting.

Rules mirror codex/drop_rates.csv, codex/boss_loot.csv, GDD Combat & Reward Systems, and Stat Tables §15.

The egg lane names a line, and the server is the one that names it. A wild egg is the Stage-1 egg of the line that was defeated, so the grant needs a species as well as a grade. Of the three kills in a battle, one is the spawn the server itself derived from the seeded slot — that creature’s identity is the server’s own fact and is used directly. The other two have no server-derived identity; the client names them, and the claim is accepted only if this floor’s own creature table authors that creature at the tier the kill was already clamped to. A claim the floor does not author is discarded and that kill grants no egg — the client can never talk a valuable line out of the server. The grade is band-rolled as above and then clamped to Wild_Egg_Grade_Cap in drop_rates.csv (Legendary), with the grade ladder read from the order of drop_grade_weights.csv rather than restated in code. This clamp is load-bearing: the 91–100 band authors an Abyssal weight, and without the cap a wild egg could hatch above the ceiling that makes breeding the only path to Divine and above. No cap authored means no egg is granted, the same no-fallback rule the rates use.

Boss loot and boss keys are the server's

LIVE on release since 2026-08-08 (0.42). Server-side rolls items 5 and 6. The wild drop lanes moved on 2026-08-01 and the boss lanes were left behind, so rollGearDrop → rollDropGrade → Math.random() survived on the client for the single most valuable drop in the game, and the boss-key chance was the last Math.random() on the wild-kill reward path. Both are gone.

What the server now decides

LaneRule
Boss gearCount is guaranteed (Gear_Guaranteed_Per_Kill). The grade rolls the band shifted by Gear_Grade_Band_Rule — “one_band_ahead” is a value in the CSV, not a branch name in code. The floor-100 boss reads floor 101’s row (the first Apex band), an Apex boss the next floor’s, floor 120 its own.
Boss eggOne Stage-1 egg of any line that spawns in the zone (floor_creature_rarity.csv), tiers weighted by the newly machine-readable Egg_Line_Weight_* Params, grade rolled on the boss's own band and clamped to the wild-egg cap.
Boss keyThe chance is the server's, off key_drop_rates.csv at the kill's rarity, at most one per battle. The Min_Wins/Min_Kills gate counters stay the client's, per D's ruling — “We are tracking battle wins. So it should be trivial for the client to keep the streak counter, and it should.” They are clamped to the server's own credited ledger before they are read, so an inflated claim buys nothing and costs no extra write. The deterministic first-clear key is untouched: it is a grant, not a roll.

The balance table that was prose

boss_loot.csv authored the egg's line weighting as Egg_Line_Weighting,rarity_appearance with “30/30/20/10/10 (C/UC/R/SR/SSR)” inside the Notes cell. Notes are prose, not data: nothing could read them, and the client carried the numbers as a literal. They are five Params now — Egg_Line_Weight_C through _SSR, values unchanged. A formatting fix, not a balance change, and the same failure the enchantment magnitudes had.

A drop that throws now says so. An exception in the drop roll used to leave drops simply absent, which is indistinguishable from “nothing dropped”. The boss lanes vanished for an entire probe run and the only trace was a flag nobody reads; the response carries dropNote now, and it named the cause in one run. Same lesson as the swallowed floor sync — a refusal that looks like a null result is the worst kind.

Probes. tools/probe_bossloot.py 9/9 and tools/probe_bosskey.py 5/5, full stack. The loot probe climbs to a boss floor the honest way (the Genesis rule caps a new account at floor 2) and waits out the spawn budget between kills. The key probe deliberately has no end-to-end “a key dropped” test: the cheapest authored gate is 29 wins / 87 kills, every credited kill costs a spawn credit refilling at one per minute, and the chance behind it is 1.4% for a Common — roughly ninety minutes to open the gate and hours more to land one. It tests the gate, the clamp and the naming, which are the parts that can be attacked.

Floors 101–120 use their own grade table. Everything on this page describes the 100-floor tower. The Void Apex postgame zone rolls from drop_grade_weights.csv itself — one single-floor band per Apex floor instead: four grades only — Rare, Epic, Legendary, Abyssal — with Rare as the floor and Divine, Primordial and Void never dropping. Eggs use the same curve with the Abyssal share folded into Legendary. LIVE on release since 0.48 (2026-08-13) — drop_grade_weights.csv carries eighty single-floor Apex bands and the client reads that file at boot.

Changelog

2026-08-10 — Void Apex drop band authored. Per-floor grade bands for floors 101–120, added to this page's own table,, ranked Rare through Abyssal, tuned by simulation so an Abyssal drop stays rare at the entry (0.1% per drop) and uncommon at the cap (1.5%). The last three grades remain upgrade-only everywhere. Full rules on Void Apex.

2026-08-08 — boss gear, boss eggs and boss keys are decided server-side. LIVE on release since 2026-08-08 (0.42). rollGearDrop, rollBossEgg and rollDropGrade are all deleted — the last was the final Math.random() grade roller in the client. The boss-egg tier weights became machine-readable Params in boss_loot.csv (values unchanged); DATA_PIN moves with them. Probes: tools/probe_bossloot.py 9/9, tools/probe_bosskey.py 5/5.

Who rolls the drop

The server rolls it and tells the client. The client renders the grant and never reports a drop of its own, so there is no second opinion to reconcile. Every number the roll uses is read from the files on this page — nothing about a drop is hardcoded in the backend, and there is no fallback constant anywhere in the path: if a table fails to load the drop simply does not happen and the account is flagged (drop_data). A default would quietly become the balance.

StepSource
Does it dropdrop_chances_by_floor.csv — one independent roll each for gear, enhancement and egg, per kill, at that kill's rarity. The kills are the ones the server derived from the seeded spawn slot, so floor, rarity and count are its own facts.
What gradedrop_grade_weights.csv for the floor's band. Enhancements use the band one behind gear, and that rule is read from drop_rates.csv (Enhancement_Grade_Rule) rather than assumed.
Which baseThe server picks it, uniformly among the gear bases at that tier — the rule this page already authors. Enhancements split evenly across gem / rune / scroll, then pick uniformly within. The client used to do this differently: it picked a category|family bucket uniformly and then picked inside it, giving a base that sits in a two-item family far more weight than one in a ten-item family. That was a deviation from this page rather than a balance decision, and moving the pick to the server corrects it — expect the visible distribution to change.
What tierThe zone boundaries authored in floors.csv. The client's ceil(floor/10) is a hardcoded restatement of today's zone layout — re-author the zones and it silently produces the wrong tier.
Only when earnedThe roll runs in the credited branch only. An uncredited battle — over the spawn budget, over a rate cap — earns nothing and therefore drops nothing.
Once onlyRecorded against the battle's event id, which is already deduped, so a retried or replayed battle returns the same grant instead of a second one.
How the pieces divide. The player’s Durable Object makes the draw, because that is where the secret-keyed generator lives; the Worker maps that draw onto items.csv and substitutes the concrete base on the way out. The split is not decoration: items.csv is around 208 KB and the chance tables travel inside the battle request body, so adding it there would put 208 KB on the hottest path in the game, every battle. The Worker holds it module-cached instead and the object never sees it. If it cannot be loaded the drop is dropped rather than invented, and the raw draw is stripped before the client sees the response.
Balancing. Change a rate here and the live game changes with it — the backend reads these files at DATA_PIN on release and at main on dev. No code edit, no deploy.