YOUR NEXT ADVENTURE STARTS HERE

Make your mark
on Vestige.

Learn the essentials, shape your build and find what you need for the next upgrade.

17 monsters · 87 items · 24 actions · 6 regions

About this edition

Release codex — computed tables exported by the game server; no player data included.

Player guide

Quick start

Keep moving. Read the enemy. Build your power from what survives.

Create your character

Sign in with your account name and password. A missing name creates an account only when it contains 5 to 25 Unicode code points: Unicode letters, ordinary spaces or digits 0-9, with -, _ and ' also allowed inside the name. Leading and trailing whitespace is removed before validation; internal spaces are kept. -, _ and ' cannot be the first or last character; repeated internal separators are allowed. Other punctuation, emojis, non-ASCII digits and separate combining marks are not allowed in new names. Existing accounts keep their names and can still sign in even when the name does not meet the creation rule. Matching remains case-insensitive under the existing lowercase mapping. Use the same spelling when you return.

Move, attack and cast

Move with the physical WASD positions (ZQSD on AZERTY) or the arrow keys and hold Shift to sprint. The primary attack follows your equipped weapon; the right mouse button uses your selected magic. E interacts with nearby objects. Attacks and spells take priority over movement for facing. A primary attack must finish its own recovery before it can start again; Haste and Frozen affect that recovery when the attack starts.

Inventory and quick slots

Open the inventory with Tab. Drag an item to its matching equipment slot, or drag a potion or an item granting a spell to one of the four quick slots. Press its assigned key to drink the potion or cast the spell toward the world cursor. Clicking a spell shortcut uses the last world aim; no cast is sent without a valid aim. A spell shortcut does not require equipping or consume its item, and locked copies can cast. It uses the highest spell-level copy currently owned (lowest stack ID breaks ties), with the normal mana cost and cast timing. A slot follows the item type rather than one stack; depleted bindings remain assigned and work again when that item is acquired. Right-click a shortcut to clear it. A spell shares its own cooldown across weapon, equipped-spell and quick-slot casting; switching the source does not bypass it. The cooldown starts when a cast is accepted, and a rejected attempt spends neither mana nor a new cooldown. Favorite potions remain usable by quick key, clicking the shortcut or Use item; the remaining stack keeps its lock and potency. Hotbar stock includes locked, unreserved doses. Hover details reuse the inventory information for the selected owned spell or the first usable potion, including its real progression or potency. Empty or depleted bindings never retain an old exemplar's statistics.

Spell cooldowns

Accepted spells whose initial cooldown exceeds one second show an icon and remaining time in the Cooldowns row immediately above the quick-slot bar. The row follows the actual bar bounds; it wraps on small screens and folds excess display entries rather than covering the shortcuts. Weapon, equipped-spell and quick-slot casts share the same action timer, even when items are rebound. A rejected attempt does not start or restart it. The display continues through the last second, vanishes at expiry and never grants permission to cast: the server remains authoritative.

Rebind keys and close menus

Quick keys use the physical top row, so an AZERTY keyboard does not require Shift. The Game menu lets you reassign them. Escape first cancels a drag or closes the active layer; with nothing left to close, it opens the menu. Cancelling an alchemy material drag keeps Preparation open and leaves the recipe and inventory unchanged. The multiplayer world never pauses.

Essential keyboard shortcuts

M toggles the explored map, Enter opens chat, V toggles life bars for players and monsters and H toggles hitboxes and live entity skeletons. Anatomical left bones are cyan, right bones magenta, the central chain white, and attachment sockets gold. P requests a PvP state change and O opens the server-wide online roster (name and effective PvP state only). Keyboard shortcuts are suppressed while you type or perform an incompatible UI interaction.

Read the compass

The compass marks logical north with N (upper-left in the isometric projection). The independent gold marker tracks the world origin; inside a dungeon it tracks a discovered exit, without revealing an unknown exit.

Use chat commands

Open chat to use private player commands such as /help, /where, /stats and /spawn. Tab completion and Up/Down history belong to chat only, not to gameplay shortcuts.

Manage your inventory

Use the inventory tabs to browse All, Equipment, Spells, Consumables, Souls or Materials. Spells contains items equipped in the spell slot; weapons that grant spells, such as Bone Staff, stay under Equipment. Search and sorting work within the selected tab. In All, sorting by Type groups spells separately from equipment. From Spells, double-click a spell or drag it to the spell slot to equip it, or drag it to a quick slot to bind it. Tab closes an open inventory even when its widgets have focus, cancelling local drag/drop/split dialogs without changing items. Chat keeps Tab completion. Loose items show their inventory identity icon; a neutral question mark is shown only while an image is unavailable. Drag one unlocked backpack stack onto another with the same complete identity to merge them, or use Stack all to compact compatible stacks across the whole inventory, even while a tab or search hides some items. Equipped copies stay reserved, the destination ID survives and any overflow remains in the source; locked stacks and fused souls are not merged. Locking potions, consumables or materials protects the whole stack without allocating a new slot, while equipment, spell-bearing items and souls keep individual-exemplar protection. Locks still prevent dropping, splitting, merging, manual salvage and material spending; intentional potion use is separate. The client sends a request and waits for the saved authoritative inventory instead of changing quantities locally.

Average equipped level

The Equipment panel shows the average level of your occupied equipment slots, including the equipped soul as one entry. Each equipped item counts once, regardless of stack quantity. For an item with both equipment and spell progression, its highest level is used. Empty slots and items in the backpack do not lower or raise the average. The value updates with your inventory and is shown to one decimal place; an empty loadout displays 0.0. This is a summary value, not an additional combat bonus.

Open the wiki

Use the Wiki button in the corner of the Web client to open the codex. There is no wiki keyboard shortcut or shortcut preference. Wiki, Play, Discord and Support the game open an isolated new tab only on request. Movement remains physical WASD/ZQSD; opening a community link does not change inventory or character statistics.

Understand large numbers

Large gameplay numbers use compact notation: 1,200 becomes 1k2, 1,200,000 becomes 1m2 and 1,200,000,000 becomes 1b2. Values below 1,000 keep their normal numeric precision; exact levels and editable quantities remain numeric. Very large values use scientific notation. This changes labels only, never stored quantities or transaction costs. Inventory quantities and currency costs use unsigned 64-bit integers: at most 18,446,744,073,709,551,615 per stack or counter. Aggregate counters and quadratic prices saturate at that boundary; overflowing transactions are refused. Drop and split dialogs accept exact decimal integers with a Max button. Soul levels remain unsigned 32-bit integers, independently of currency limits. An inventory holds at most 10,000 stacks. At that limit, an operation needing another stack is refused without losing its items; adding to an available matching stack or freeing a stack can still succeed.

Player guide

Soul system

A creature's imprint becomes part of your build.

Find souls and fragments

Natural souls are generated from soul-template items in the authored loot tables. A soul drop and a fragment drop are separate entries: one is not a fallback for the other. Equip one soul in the special Soul slot to gain its passive bonuses. Carrying an unequipped soul does not grant those bonuses. For an eligible non-guaranteed soul entry from a Normal monster of level M, chance is min(8%, 2.5% + 0.1% × (M−1)), multiplied by 1/1.5/3 for Normal/Elite/Boss. Minimum levels and zero-chance exclusions still apply. Guaranteed entries retain their level gate and certainty. Containers keep their authored chances. Monster fragment entries keep their chance and draw the authored base quantity q, then yield round(q × M^1.5 × R), with R = 1/2/4 for Normal/Elite/Boss and unsigned 64-bit saturation. Container quantities do not scale.

Equip and stack souls

A natural soul records its monster identity and its own soul level. Souls with the same identity and level can stack; different levels cannot. Soul drops can reach the source monster's full level, with a minimum of 1 and no species cap. A level-50 or level-500 monster can drop a soul of level 50 or 500 respectively. Conditional on a successful drop, level k from 1 through source level M has weight 1 / (k + 0.1 × M)^2, normalized over that range. This same distribution applies to equipment and standalone spells. These are conditional level probabilities, not per-kill drop chances. Sampling remains bounded at extreme source levels.

Upgrade a soul

At a Soul Altar, spend Soul Fragments to attempt one +1 upgrade or use Upgrade to max on one exemplar, including fused souls. Each paid attempt has a 1% chance to recycle that soul at its pre-failure level and stop the batch. Successful steps retain the existing progression rules. The upgrade from level L to L+1 costs base upgrade cost × L² + floor(base upgrade cost × (L−1)² / 4) Soul Fragments. The extra cost gradually approaches 25%; the first upgrade retains its original price. At level L, natural and fused soul damage, defense, life and mana bonuses use (1 + 0.3 × (L−1))^1.5. Critical chance and critical damage bonuses use 1 + 0.6 × ln(L); dodge bonuses use 1 + 0.25 × ln(L), while regeneration percentage bonuses use 1 + 0.15 × ln(L). All multipliers equal one at level one. The per-soul tables are exported from the same resolver used by the altar, including rounding, level limits and integer saturation.

Upgrade equipped or locked souls

An equipped soul may be upgraded; its equipment reservation follows a successful upgrade and is removed if it breaks. Locked souls may be upgraded or selected for fusion, and the lock does not protect them from the confirmed risk. Manual dismantling of locked souls remains blocked. Locked payment fragments are never spent. Natural and fused souls have no gameplay upgrade cap. Costs follow the quadratic curve and saturate at the integer currency limit; levels retain the technical u32 storage boundary. Extremely large bonuses saturate at a finite numeric ceiling with headroom for critical-hit arithmetic. The wiki lists reference levels 1–100, not a maximum level.

Dismantle souls

Dismantling consumes the selected unreserved units and returns generic Soul Fragments. At level L, the per-unit yield is floor(base cost × (1 + sum of k² for k from 1 through L−1) / (2 × 2)), with a minimum of one and saturation at the integer currency limit after division. Rounding happens before multiplying by stack quantity. Salvage uses the original quadratic valuation; the additional upgrade charge is not refunded. Only completed levels enter the refund, so upgrading then dismantling cannot create fragments. Existing souls use this new valuation; historical payments are not tracked. Removing a whole stack multiplies that per-unit yield; equipped units cannot be dismantled.

Fuse two souls

Fusion accepts two available, unreserved souls, including locked candidates. After confirmation it has a 60% success chance and 40% failure chance. Success consumes both candidates and produces one unique fused instance using the existing result rules. Failure recycles exactly those two units at their current normal fragment yields, with no result soul. Equipped exemplars remain excluded. Two units of the same stack are allowed when both are available; no other copies are consumed. There is no extra fragment fee. On success, the result level is drawn inclusively between the two parent levels.

How fusion chooses bonuses

Both parents' bonuses are evaluated at the result level before attributes are selected. The result retains at least the larger parent's number of non-zero attributes and at most their union. Counts have descending weights: 50, 30, 15, 5, then successive halvings. When possible, an exclusive attribute from each parent is retained. A shared attribute is drawn between the two scaled parent values; an exclusive attribute retains its parent's scaled value.

Saved soul compatibility

The historical bonus-growth and upgrade-cost-growth fields remain readable for save compatibility but no longer determine progression. All souls share the configured stat-family curves. Neither parent imposes a level cap on the fused soul. The base upgrade cost is the rounded geometric mean, with a minimum of one. Fusion interpolates level-one bases directly, mathematically equivalent to interpolating at the result level with each shared family multiplier, without dividing saturated high-level values. Existing fused souls preserve their saved precise level-one traits, level, identity and provenance; their current bonuses are recalculated under the loaded rules. Values already lost to historical saturation cannot be reconstructed from parent names.

Fused soul names and stacking

Fused souls never stack and can be fused again. Their bounded names are based on the dominant normalized bonus family: Ravage, Arcane, Bastion, Shadow, Vitality or Source; near ties use Confluence. Parent names are retained as provenance rather than concatenated into an endlessly growing title.

Soul aura removal

Player soul auras were removed in R34.8.1 and are not rendered or previewed by the current game. Soul statistics, natural-soul bonuses and fusion behavior are unchanged by that visual removal. Elite and Boss rank auras are a separate retained legacy procedural presentation with no authored sprite sequence; the wiki reports that absence instead of reconstructing, capturing or fabricating a replacement.

What remains

Natural souls

Separate the monster’s source level from the level of the soul you equip.

souls

Soul of Ashen Cultist

View details

Ashen Cultist

No soul level capUpgradeable
CharacteristicBonus
Maximum mana+8
Magical damage+0.8

Next level: 11 fragments

Dismantle one: 2 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
1112
2465
311016
420041
531985
6464154
7638253
8838387
91067563
101322786
1116061061
1219161394
1322551790
1426202255
1530142794
1634343412
1738834116
1843584911
1948625802
2053926795
2159517895
2265369108
23715010439
24779011893
25845913477
26915415196
27987817055
281062819060
291140721216
301221223529
311304626004
321390628646
331479531462
341571034457
351665437636
361762441005
371862344569
381964848334
392070252305
402178256487
412289160887
422402665510
432519070361
442638075446
452759980770
462884486339
473011892158
483141898232
4932747104568
5034102111171
5135486118046
5236896125199
5338335132635
5439800140360
5541294148379
5642814156697
5744363165321
5845938174256
5947542183507
6049172193080
6150831202980
6252516213213
6354230223784
6455970234698
6557739245962
6659534257581
6761358269560
6863208281905
6965087294621
7066992307714
7168926321189
7270886335051
7372875349307
7474890363962
7576934379021
7679004394490
7781103410374
7883228426679
7985382443410
8087562460572
8189771478172
8292006496215
8394270514706
8496560533651
8598879553055
86101224572924
87103598593263
88105998614077
89108427635373
90110882657156
91113366679431
92115876702204
93118415725480
94120980749265
95123574773564
96126194798382
97128843823726
98131518849601
99134222876012
100136952902965
Authored parameterValue
Base upgrade cost11
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/ashen_cultist/entity.json

souls

Soul of Black Bear

View details

Black Bear

No soul level capUpgradeable
CharacteristicBonus
Maximum life+12
Physical defense+2

Next level: 15 fragments

Dismantle one: 3 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
1153
2637
315022
427356
5435116
6633210
7870345
81143528
91455768
1018031072
1121901447
1226131901
1330752441
1435733075
1541103810
1646834653
1752955613
1859436697
1966307912
2073539266
21811510766
22891312420
23975014235
241062316218
251153518378
261248320722
271347023257
281449325991
291555528931
301665332085
311779035460
321896339063
332017542903
342142346987
352271051322
362403355916
372539560776
382679365910
392823071325
402970377028
413121583028
423276389332
433435095947
4435973102881
4537635110141
4639333117735
4741070125670
4842843133953
4944655142593
5046503151597
5148390160972
5250313170726
5352275180866
5454273191400
5556310202335
5658383213678
5760495225438
5862643237622
5964830250237
6067053263291
6169315276791
6271613290745
6373950305160
6476323320043
6578735335403
6681183351247
6783670367582
6886193384416
6988755401756
7091353419610
7193990437985
7296663456888
7399375476328
74102123496312
75104910516847
76107733537941
77110595559601
78113493581835
79116430604650
80119403628053
81122415652053
82125463676657
83128550701872
84131673727706
85134835754166
86138033781260
87141270808995
88144543837378
89147855866418
90151203896122
91154590926497
92158013957551
93161475989291
941649731021725
951685101054860
961720831088703
971756951123263
981793431158547
991830301194562
1001867531231316
Authored parameterValue
Base upgrade cost15
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/black_bear/entity.json

souls

Soul of Blood Acolyte

View details

Blood Acolyte

No soul level capUpgradeable
CharacteristicBonus
Maximum life % / second+0.2
Magical damage+0.8

Next level: 14 fragments

Dismantle one: 3 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
1143
2597
314021
425552
5406108
6591196
7812322
81067493
91358717
1016831001
1120441351
1224391774
1328702278
1433352870
1538363556
1643714343
1749425239
1855476251
1961887385
2068638648
21757410048
22831911592
23910013286
24991515137
251076617153
261165119341
271257221707
281352724258
291451827002
301554329946
311660433096
321769936459
331883040043
341999543855
352119647901
362243152188
372370256724
382500761516
392634866570
402772371893
412913477493
423057983377
433206089551
443357596022
4535126102798
4636711109886
4738332117292
4839987125023
4941678133087
5043403141491
5145164150241
5246959159344
5348790168808
5450655178640
5552556188846
5654491199433
5756462210409
5858467221781
5960508233555
6062583245738
6164694258338
6266839271362
6369020284816
6471235298707
6573486313043
6675771327831
6778092343077
6880447358788
6982838374972
7085263391636
7187724408786
7290219426429
7392750444573
7495315463225
7597916482391
76100551502078
77103222522294
78105927543046
79108668564340
80111443586183
81114254608583
82117099631547
83119980655081
84122895679192
85125846703888
86128831729176
87131852755062
88134907781553
89137998808657
90141123836381
91144284864731
92147479893714
93150710923338
94153975953610
95157276984536
961606111016123
971639821048379
981673871081311
991708281114925
1001743031149228
Authored parameterValue
Base upgrade cost14
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/blood_acolyte/entity.json

souls

Soul of Bone Priest

View details

Bone Priest

No soul level capUpgradeable
CharacteristicBonus
Maximum mana % / second+0.25
Magical defense+2

Next level: 15 fragments

Dismantle one: 3 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
1153
2637
315022
427356
5435116
6633210
7870345
81143528
91455768
1018031072
1121901447
1226131901
1330752441
1435733075
1541103810
1646834653
1752955613
1859436697
1966307912
2073539266
21811510766
22891312420
23975014235
241062316218
251153518378
261248320722
271347023257
281449325991
291555528931
301665332085
311779035460
321896339063
332017542903
342142346987
352271051322
362403355916
372539560776
382679365910
392823071325
402970377028
413121583028
423276389332
433435095947
4435973102881
4537635110141
4639333117735
4741070125670
4842843133953
4944655142593
5046503151597
5148390160972
5250313170726
5352275180866
5454273191400
5556310202335
5658383213678
5760495225438
5862643237622
5964830250237
6067053263291
6169315276791
6271613290745
6373950305160
6476323320043
6578735335403
6681183351247
6783670367582
6886193384416
6988755401756
7091353419610
7193990437985
7296663456888
7399375476328
74102123496312
75104910516847
76107733537941
77110595559601
78113493581835
79116430604650
80119403628053
81122415652053
82125463676657
83128550701872
84131673727706
85134835754166
86138033781260
87141270808995
88144543837378
89147855866418
90151203896122
91154590926497
92158013957551
93161475989291
941649731021725
951685101054860
961720831088703
971756951123263
981793431158547
991830301194562
1001867531231316
Authored parameterValue
Base upgrade cost15
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/bone_priest/entity.json

souls

Soul of Carrion Hound

View details

Carrion Hound

No soul level capUpgradeable
CharacteristicBonus
Maximum life % / second+0.15
Physical damage+0.72

Next level: 11 fragments

Dismantle one: 2 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
1112
2465
311016
420041
531985
6464154
7638253
8838387
91067563
101322786
1116061061
1219161394
1322551790
1426202255
1530142794
1634343412
1738834116
1843584911
1948625802
2053926795
2159517895
2265369108
23715010439
24779011893
25845913477
26915415196
27987817055
281062819060
291140721216
301221223529
311304626004
321390628646
331479531462
341571034457
351665437636
361762441005
371862344569
381964848334
392070252305
402178256487
412289160887
422402665510
432519070361
442638075446
452759980770
462884486339
473011892158
483141898232
4932747104568
5034102111171
5135486118046
5236896125199
5338335132635
5439800140360
5541294148379
5642814156697
5744363165321
5845938174256
5947542183507
6049172193080
6150831202980
6252516213213
6354230223784
6455970234698
6557739245962
6659534257581
6761358269560
6863208281905
6965087294621
7066992307714
7168926321189
7270886335051
7372875349307
7474890363962
7576934379021
7679004394490
7781103410374
7883228426679
7985382443410
8087562460572
8189771478172
8292006496215
8394270514706
8496560533651
8598879553055
86101224572924
87103598593263
88105998614077
89108427635373
90110882657156
91113366679431
92115876702204
93118415725480
94120980749265
95123574773564
96126194798382
97128843823726
98131518849601
99134222876012
100136952902965
Authored parameterValue
Base upgrade cost11
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/carrion_hound/entity.json

souls

Soul of Corrupted Boar

View details

Corrupted Boar

No soul level capUpgradeable
CharacteristicBonus
Maximum life+10
Physical damage+0.88
Physical defense+1.5

Next level: 13 fragments

Dismantle one: 3 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
1133
2556
313019
423748
5377100
6549182
7754299
8991458
91261666
101563929
1118981254
1222651647
1326652115
1430972665
1535623302
1640594033
1745894865
1851515804
1957466857
2063738030
2170339330
22772510764
23845012337
24920714056
25999715928
261081917959
271167420156
281256122525
291348125073
301443327807
311541830732
321643533855
331748537183
341856740722
351968244479
362082948460
372200952672
382322157122
392446661815
402574366758
412705371958
422839577421
432977083154
443117789163
453261795455
4634089102037
4735594108914
4837131116093
4938701123581
5040303131384
5141938139509
5243605147962
5345305156750
5447037165880
5548802175357
5650599185188
5752429195380
5854291205939
5956186216872
6058113228185
6160073239885
6262065251979
6364090264472
6466147277371
6568237290683
6670359304414
6772514318571
6874701333160
6976921348188
7079173363662
7181458379587
7283775395970
7386125412818
7488507430137
7590922447934
7693369466215
7795849484987
7898361504257
79100906524030
80103483544313
81106093565113
82108735586436
83111410608289
84114117630678
85116857653610
86119629677092
87122434701129
88125271725728
89128141750896
90131043776639
91133978802964
92136945829877
93139945857385
94142977885495
95146042914212
96149139943543
97152269973495
981554311004074
991586261035287
1001618531067140
Authored parameterValue
Base upgrade cost13
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/corrupted_boar/entity.json

souls

Soul of Crypt Ghost

View details

Crypt Ghost

No soul level capUpgradeable
CharacteristicBonus
Maximum mana+10
Dodge chance+2%

Next level: 13 fragments

Dismantle one: 3 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
1133
2556
313019
423748
5377100
6549182
7754299
8991458
91261666
101563929
1118981254
1222651647
1326652115
1430972665
1535623302
1640594033
1745894865
1851515804
1957466857
2063738030
2170339330
22772510764
23845012337
24920714056
25999715928
261081917959
271167420156
281256122525
291348125073
301443327807
311541830732
321643533855
331748537183
341856740722
351968244479
362082948460
372200952672
382322157122
392446661815
402574366758
412705371958
422839577421
432977083154
443117789163
453261795455
4634089102037
4735594108914
4837131116093
4938701123581
5040303131384
5141938139509
5243605147962
5345305156750
5447037165880
5548802175357
5650599185188
5752429195380
5854291205939
5956186216872
6058113228185
6160073239885
6262065251979
6364090264472
6466147277371
6568237290683
6670359304414
6772514318571
6874701333160
6976921348188
7079173363662
7181458379587
7283775395970
7386125412818
7488507430137
7590922447934
7693369466215
7795849484987
7898361504257
79100906524030
80103483544313
81106093565113
82108735586436
83111410608289
84114117630678
85116857653610
86119629677092
87122434701129
88125271725728
89128141750896
90131043776639
91133978802964
92136945829877
93139945857385
94142977885495
95146042914212
96149139943543
97152269973495
981554311004074
991586261035287
1001618531067140
Authored parameterValue
Base upgrade cost13
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/crypt_ghost/entity.json

souls

Soul of Crypt Knight

View details

Crypt Knight

No soul level capUpgradeable
CharacteristicBonus
Maximum life+10
Physical defense+2.5
Magical defense+1.5

Next level: 16 fragments

Dismantle one: 4 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
1164
2688
316024
429260
5464124
6676224
7928368
81220564
91552820
1019241144
1123361544
1227882028
1332802604
1438123280
1543844064
1649964964
1756485988
1863407144
1970728440
2078449884
21865611484
22950813248
231040015184
241133217300
251230419604
261331622104
271436824808
281546027724
291659230860
301776434224
311897637824
322022841668
332152045764
342285250120
352422454744
362563659644
372708864828
382858070304
393011276080
403168482164
413329688564
423494895288
4336640102344
4438372109740
4540144117484
4641956125584
4743808134048
4845700142884
4947632152100
5049604161704
5151616171704
5253668182108
5355760192924
5457892204160
5560064215824
5662276227924
5764528240468
5866820253464
5969152266920
6071524280844
6173936295244
6276388310128
6378880325504
6481412341380
6583984357764
6686596374664
6789248392088
6891940410044
6994672428540
7097444447584
71100256467184
72103108487348
73106000508084
74108932529400
75111904551304
76114916573804
77117968596908
78121060620624
79124192644960
80127364669924
81130576695524
82133828721768
83137120748664
84140452776220
85143824804444
86147236833344
87150688862928
88154180893204
89157712924180
90161284955864
91164896988264
921685481021388
931722401055244
941759721089840
951797441125184
961835561161284
971874081198148
981913001235784
991952321274200
1001992041313404
Authored parameterValue
Base upgrade cost16
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/crypt_knight/entity.json

souls

Soul of the Ashen Mage

View details

Ashen Cult Mage

No soul level capUpgradeable
CharacteristicBonus
Maximum mana+12
Maximum mana % / second+0.25
Magical damage+1.35

Next level: 9 fragments

Dismantle one: 2 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
192
2384
39013
416433
526169
6380126
7522207
8686317
9873461
101082643
111314868
1215681140
1318451464
1421441845
1524662286
1628102792
1731773368
1835664018
1939784747
2044125559
2148696459
2253487452
2358508541
2463749731
25692111027
26749012433
27808213954
28869615594
29933317358
30999219251
311067421276
321137823438
331210525742
341285428192
351362630793
361442033549
371523736465
381607639546
391693842795
401782246217
411872949817
421965853599
432061057568
442158461728
452258166084
462360070641
472464275402
482570680372
492679385556
502790290958
512903496583
5230188102435
5331365108519
5432564114840
5533786121401
5635030128207
5736297135263
5837586142573
5938898150142
6040232157974
6141589166074
6242968174447
6344370183096
6445794192026
6547241201242
6648710210748
6750202220549
6851716230649
6953253241053
7054812251766
7156394262791
7257998274133
7359625285797
7461274297787
7562946310108
7664640322764
7766357335760
7868096349101
7969858362790
8071642376832
8173449391232
8275278405994
8377130421123
8479004436623
8580901452499
8682820468756
8784762485397
8886726502427
8988713519851
9090722537673
9192754555898
9294808574530
9396885593574
9498984613035
95101106632916
96103250653222
97105417673958
98107606695128
99109818716737
100112052738789
Authored parameterValue
Base upgrade cost9
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/cult_mage/entity.json

souls

Soul of Dark Prelate

View details

Dark Prelate

No soul level capUpgradeable
CharacteristicBonus
Maximum mana+12
Magical damage+1.36
Magical defense+2

Next level: 19 fragments

Dismantle one: 4 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
1194
2809
319028
434671
5551147
6802266
71102437
81448669
91843973
1022841358
1127741833
1233102408
1338953092
1445263895
1552064826
1659325894
1767077110
1875288483
19839810022
20931411737
211027913637
221129015732
231235018031
241345620543
251461123279
261581226248
271706229459
281835832922
291970336646
302109440641
312253444916
322402049480
332555554344
342713659517
352876665008
363044270827
373216776983
383393883486
393575890345
403762497569
4139539105169
4241500113154
4343510121533
4445566130316
4547671139512
4649822149131
4752022159182
4854268169674
4956563180618
5058904192023
5161294203898
5263730216253
5366215229097
5468746242440
5571326256291
5673952270659
5776627285555
5879348300988
5982118316967
6084934333502
6187799350602
6290710368277
6393670386536
6496676405388
6599731424844
66102832444913
67105982465604
68109178486927
69112423508891
70115714531506
71119054554781
72122440578725
73125875603349
74129356628662
75132886654673
76136462681392
77140087708828
78143758736991
79147478765890
80151244795534
81155059825934
82158920857099
83162830889038
84166786921761
85170791955277
86174842989596
871789421024727
881830881060679
891872831097463
901915241135088
911958141173563
922001501212898
932045351253102
942089661294185
952134461336156
962179721379024
972225471422800
982271681467493
992318381513112
1002365541559667
Authored parameterValue
Base upgrade cost19
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/dark_prelate/entity.json

souls

Soul of Dire Wolf

View details

Dire Wolf

No soul level capUpgradeable
CharacteristicBonus
Physical damage+0.8
Critical chance+1%
Critical multiplier+0.05×

Next level: 12 fragments

Dismantle one: 3 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
1123
2516
312018
421945
534893
6507168
7696276
8915423
91164615
101443858
1117521158
1220911521
1324601953
1428592460
1532883048
1637473723
1742364491
1847555358
1953046330
2058837413
2164928613
2271319936
23780011388
24849912975
25922814703
26998716578
271077618606
281159520793
291244423145
301332325668
311423228368
321517131251
331614034323
341713937590
351816841058
361922744733
372031648621
382143552728
392258457060
402376361623
412497266423
422621171466
432748076758
442877982305
453010888113
463146794188
4732856100536
4834275107163
4935724114075
5037203121278
5138712128778
5240251136581
5341820144693
5443419153120
5545048161868
5646707170943
5748396180351
5850115190098
5951864200190
6053643210633
6155452221433
6257291232596
6359160244128
6461059256035
6562988268323
6664947280998
6766936294066
6868955307533
6971004321405
7073083335688
7175192350388
7277331365511
7379500381063
7481699397050
7583928413478
7686187430353
7788476447681
7890795465468
7993144483720
8095523502443
8197932521643
82100371541326
83102840561498
84105339582165
85107868603333
86110427625008
87113016647196
88115635669903
89118284693135
90120963716898
91123672741198
92126411766041
93129180791433
94131979817380
95134808843888
96137667870963
97140556898611
98143475926838
99146424955650
100149403985053
Authored parameterValue
Base upgrade cost12
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/dire_wolf/entity.json

souls

Soul of Executioner

View details

Executioner

No soul level capUpgradeable
CharacteristicBonus
Maximum life+8
Physical damage+1.2
Critical multiplier+0.1×

Next level: 17 fragments

Dismantle one: 4 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
1174
2728
317025
431063
5493131
6718238
7986391
81296599
91649871
1020441215
1124821640
1229622154
1334852766
1440503485
1546584318
1653085274
1760016362
1867367590
1975148967
20833410501
21919712201
221010214076
231105016133
241204018381
251307320829
261414823485
271526626358
281642629456
291762932788
301887436363
312016240188
322149244272
332286548624
342428053252
352573858165
362723863371
372878168879
383036674698
393199480835
403366487299
413537794099
4237132101243
4338930108740
4440770116598
4542653124826
4644578133433
4746546142426
4848556151814
4950609161606
5052704171810
5154842182435
5257022193489
5359245204981
5461510216920
5563818229313
5666168242169
5768561255497
5870996269305
5973474283602
6075994298396
6178557313696
6281162329511
6383810345848
6486500362716
6589233380124
6692008398080
6794826416593
6897686435671
69100589455323
70103534475558
71106522496383
72109552517807
73112625539839
74115740562487
75118898585760
76122098609666
77125341634214
78128626659413
79131954685270
80135324711794
81138737738994
82142192766878
83145690795455
84149230824733
85152813854721
86156438885428
87160106916861
88163816949029
89167569981941
901713641015605
911752021050030
921790821085224
931830051121196
941869701157955
951909781195508
961950281233864
971991211273032
982032561313020
992074341353837
1002116541395491
Authored parameterValue
Base upgrade cost17
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/executioner/entity.json

souls

Soul of Giant Rat

View details

Giant Rat

No soul level capUpgradeable
CharacteristicBonus
Maximum life+6
Dodge chance+1.5%

Next level: 9 fragments

Dismantle one: 2 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
192
2384
39013
416433
526169
6380126
7522207
8686317
9873461
101082643
111314868
1215681140
1318451464
1421441845
1524662286
1628102792
1731773368
1835664018
1939784747
2044125559
2148696459
2253487452
2358508541
2463749731
25692111027
26749012433
27808213954
28869615594
29933317358
30999219251
311067421276
321137823438
331210525742
341285428192
351362630793
361442033549
371523736465
381607639546
391693842795
401782246217
411872949817
421965853599
432061057568
442158461728
452258166084
462360070641
472464275402
482570680372
492679385556
502790290958
512903496583
5230188102435
5331365108519
5432564114840
5533786121401
5635030128207
5736297135263
5837586142573
5938898150142
6040232157974
6141589166074
6242968174447
6344370183096
6445794192026
6547241201242
6648710210748
6750202220549
6851716230649
6953253241053
7054812251766
7156394262791
7257998274133
7359625285797
7461274297787
7562946310108
7664640322764
7766357335760
7868096349101
7969858362790
8071642376832
8173449391232
8275278405994
8377130421123
8479004436623
8580901452499
8682820468756
8784762485397
8886726502427
8988713519851
9090722537673
9192754555898
9294808574530
9396885593574
9498984613035
95101106632916
96103250653222
97105417673958
98107606695128
99109818716737
100112052738789
Authored parameterValue
Base upgrade cost9
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/giant_rat/entity.json

souls

Soul of Grave Wraith

View details

Grave Wraith

No soul level capUpgradeable
CharacteristicBonus
Maximum mana+8
Magical damage+1.2
Critical multiplier+0.08×

Next level: 14 fragments

Dismantle one: 3 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
1143
2597
314021
425552
5406108
6591196
7812322
81067493
91358717
1016831001
1120441351
1224391774
1328702278
1433352870
1538363556
1643714343
1749425239
1855476251
1961887385
2068638648
21757410048
22831911592
23910013286
24991515137
251076617153
261165119341
271257221707
281352724258
291451827002
301554329946
311660433096
321769936459
331883040043
341999543855
352119647901
362243152188
372370256724
382500761516
392634866570
402772371893
412913477493
423057983377
433206089551
443357596022
4535126102798
4636711109886
4738332117292
4839987125023
4941678133087
5043403141491
5145164150241
5246959159344
5348790168808
5450655178640
5552556188846
5654491199433
5756462210409
5858467221781
5960508233555
6062583245738
6164694258338
6266839271362
6369020284816
6471235298707
6573486313043
6675771327831
6778092343077
6880447358788
6982838374972
7085263391636
7187724408786
7290219426429
7392750444573
7495315463225
7597916482391
76100551502078
77103222522294
78105927543046
79108668564340
80111443586183
81114254608583
82117099631547
83119980655081
84122895679192
85125846703888
86128831729176
87131852755062
88134907781553
89137998808657
90141123836381
91144284864731
92147479893714
93150710923338
94153975953610
95157276984536
961606111016123
971639821048379
981673871081311
991708281114925
1001743031149228
Authored parameterValue
Base upgrade cost14
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/grave_wraith/entity.json

souls

Soul of Skeleton Archer

View details

Skeleton Archer

No soul level capUpgradeable
CharacteristicBonus
Physical damage+0.8
Critical chance+2%

Next level: 12 fragments

Dismantle one: 3 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
1123
2516
312018
421945
534893
6507168
7696276
8915423
91164615
101443858
1117521158
1220911521
1324601953
1428592460
1532883048
1637473723
1742364491
1847555358
1953046330
2058837413
2164928613
2271319936
23780011388
24849912975
25922814703
26998716578
271077618606
281159520793
291244423145
301332325668
311423228368
321517131251
331614034323
341713937590
351816841058
361922744733
372031648621
382143552728
392258457060
402376361623
412497266423
422621171466
432748076758
442877982305
453010888113
463146794188
4732856100536
4834275107163
4935724114075
5037203121278
5138712128778
5240251136581
5341820144693
5443419153120
5545048161868
5646707170943
5748396180351
5850115190098
5951864200190
6053643210633
6155452221433
6257291232596
6359160244128
6461059256035
6562988268323
6664947280998
6766936294066
6868955307533
6971004321405
7073083335688
7175192350388
7277331365511
7379500381063
7481699397050
7583928413478
7686187430353
7788476447681
7890795465468
7993144483720
8095523502443
8197932521643
82100371541326
83102840561498
84105339582165
85107868603333
86110427625008
87113016647196
88115635669903
89118284693135
90120963716898
91123672741198
92126411766041
93129180791433
94131979817380
95134808843888
96137667870963
97140556898611
98143475926838
99146424955650
100149403985053
Authored parameterValue
Base upgrade cost12
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/skeleton_archer/entity.json

souls

Soul of Skeleton Warrior

View details

Skeleton Warrior

No soul level capUpgradeable
CharacteristicBonus
Physical damage+0.72
Physical defense+2

Next level: 11 fragments

Dismantle one: 2 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
1112
2465
311016
420041
531985
6464154
7638253
8838387
91067563
101322786
1116061061
1219161394
1322551790
1426202255
1530142794
1634343412
1738834116
1843584911
1948625802
2053926795
2159517895
2265369108
23715010439
24779011893
25845913477
26915415196
27987817055
281062819060
291140721216
301221223529
311304626004
321390628646
331479531462
341571034457
351665437636
361762441005
371862344569
381964848334
392070252305
402178256487
412289160887
422402665510
432519070361
442638075446
452759980770
462884486339
473011892158
483141898232
4932747104568
5034102111171
5135486118046
5236896125199
5338335132635
5439800140360
5541294148379
5642814156697
5744363165321
5845938174256
5947542183507
6049172193080
6150831202980
6252516213213
6354230223784
6455970234698
6557739245962
6659534257581
6761358269560
6863208281905
6965087294621
7066992307714
7168926321189
7270886335051
7372875349307
7474890363962
7576934379021
7679004394490
7781103410374
7883228426679
7985382443410
8087562460572
8189771478172
8292006496215
8394270514706
8496560533651
8598879553055
86101224572924
87103598593263
88105998614077
89108427635373
90110882657156
91113366679431
92115876702204
93118415725480
94120980749265
95123574773564
96126194798382
97128843823726
98131518849601
99134222876012
100136952902965
Authored parameterValue
Base upgrade cost11
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/skeleton_warrior/entity.json

souls

Soul of the Dire Wolf

View details

Wolf

No soul level capUpgradeable
CharacteristicBonus
Maximum life+5
Physical damage+0.7
Dodge chance+1.5%

Next level: 7 fragments

Dismantle one: 1 fragments

Reference values for levels 1–100; this table is not a gameplay cap. Drops can reach the source monster level, and upgrades continue beyond 100.

Complete cost and yield table for reference levels 1–100 (no JavaScript required)
LevelNext upgradeDismantle
171
2293
37010
412726
520354
629598
7406161
8533246
9679358
10841500
111022675
121219887
1314351139
1416671435
1519181778
1621852171
1724712619
1827733125
1930943692
2034314324
2137875024
2241595796
2345506643
2449577568
2553838576
2658259670
27628610853
28676312129
29725913501
30777114973
31830216548
32884918229
33941520021
34999721927
351059823950
361121526094
371185128362
381250330758
391317433285
401386135946
411456738746
421528941688
431603044775
441678748011
451756351399
461835554943
471916658646
481999362511
492083966543
502170170745
512258275120
522347979672
532439584404
542532789320
552627894423
562724599716
5728231105204
5829233110890
5930254116777
6031291122869
6132347129169
6233419135681
6334510142408
6435617149353
6536743156521
6637885163915
6739046171538
6840223179394
6941419187486
7042631195818
7143862204393
7245109213214
7346375222286
7447657231612
7548958241195
7650275251039
7751611261147
7852963271523
7954334282170
8055721293091
8157127304291
8258549315773
8359990327540
8461447339596
8562923351944
8664415364588
8765926377531
8867453390776
8968999404328
9070561418190
9172142432365
9273739446857
9375355461669
9476987476805
9578638492268
9680305508061
9781991524189
9883693540655
9985414557462
10087151574614
Authored parameterValue
Base upgrade cost7
Upgrade priceBase × L² + floor(Base × (L−1)² / 4)
Source recordassets/entities/wolf/entity.json

Tools of survival

Items & equipment

Compare bonuses, find where items drop and check upgrade costs. Bonuses from equipped items add together. Level selectors show reference levels 1–100; upgrades can continue beyond 100.

items

Ashen Ritual Cape

View details
backDroppable
CharacteristicBonus
Maximum mana+4
Magical damage+2

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Ashen Cultist, Dark Prelate.

Source recordassets/items/ashen_ritual_cape/item.json

items

Ashroot

View details
Material / otherDroppable

No authored statistic bonuses.

Loot sources: Ashroot.

Source recordassets/items/ashroot/item.json

items

Beast Marrow

View details
Material / otherDroppable

No authored statistic bonuses.

Loot sources: Wolf.

Source recordassets/items/beast_marrow/item.json

items

Bloodleaf

View details
Material / otherDroppable

No authored statistic bonuses.

Loot sources: Bloodleaf.

Source recordassets/items/bloodleaf/item.json

items

Blue Lightning

View details
spellDroppable

No authored statistic bonuses.

Granted actions: Blue Lightning

Loot sources: Dark Prelate.

Starting loadouts: Human Player ×1.

Source recordassets/items/spell_blue_lightning/item.json

items

Bone Dust

View details
Material / otherDroppable

No authored statistic bonuses.

Loot sources: Skeleton Warrior.

Source recordassets/items/bone_dust/item.json

items

Bone Greaves

View details
legsDroppable
CharacteristicBonus
Maximum life+10
Physical defense+5

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Sealed Reliquary, Executioner, Skeleton Warrior.

Source recordassets/items/bone_greaves/item.json

items

Bone Harness

View details
bodyDroppable
CharacteristicBonus
Physical defense+6
Critical chance+2%

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Bone Priest, Skeleton Warrior.

Source recordassets/items/bone_harness/item.json

items

Bone Hood

View details
headDroppable
CharacteristicBonus
Physical defense+2.5
Magical defense+1.5

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Bone Priest.

Source recordassets/items/bone_hood/item.json

items

Bone Spear

View details
spellDroppable

No authored statistic bonuses.

Granted actions: Bone Spear

Loot sources: Bone Priest, Dark Prelate.

Source recordassets/items/spell_bone_spear/item.json

items

Bone Staff

View details
weaponDroppable
CharacteristicBonus
Maximum mana+18
Magical damage+12

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Granted actions: Bone Spear

Loot sources: Bone Priest, Dark Prelate.

Source recordassets/items/bone_staff/item.json

items

Crypt Key

View details
Material / otherDroppable

No authored statistic bonuses.

Loot sources: Sealed Reliquary, Dark Prelate.

Source recordassets/items/crypt_key/item.json

items

Cultist Cowl

View details
headDroppable
CharacteristicBonus
Maximum mana+6
Magical damage+2

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Ashen Cultist, Ashen Cult Mage.

Source recordassets/items/cultist_cowl/item.json

items

Cultist Robe

View details
bodyDroppable
CharacteristicBonus
Maximum mana+22
Magical defense+8

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Ashen Cultist, Ashen Cult Mage.

Source recordassets/items/cultist_robe/item.json

items

Cultist Wand

View details
weaponDroppable
CharacteristicBonus
Magical damage+10
Critical chance+3%

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Granted actions: Shadow Bolt

Loot sources: Blood Acolyte, Sealed Reliquary, Ashen Cult Mage.

Source recordassets/items/cultist_wand/item.json

items

Executioner's Axe

View details
weaponDroppable
CharacteristicBonus
Physical damage+18
Critical multiplier+0.2×

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Granted actions: Sword Slash

Loot sources: Dark Prelate, Executioner.

Source recordassets/items/executioners_axe/item.json

items

Fireball

View details
spellDroppable

No authored statistic bonuses.

Granted actions: Fireball

Loot sources: Ashen Cult Mage.

Starting loadouts: Human Player ×1.

Source recordassets/items/spell_fireball/item.json

items

Frost Shard

View details
spellDroppable

No authored statistic bonuses.

Granted actions: Frost Shard

Loot sources: Crypt Ghost.

Source recordassets/items/spell_frost_shard/item.json

items

Funeral Shield

View details
offhandDroppable
CharacteristicBonus
Physical defense+6
Magical defense+3

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Crypt Knight, Dark Prelate.

Source recordassets/items/funeral_shield/item.json

items

Funeral Veil

View details
headDroppable
CharacteristicBonus
Maximum mana % / second+0.2
Magical defense+3

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Blood Acolyte, Dark Prelate.

Source recordassets/items/funeral_veil/item.json

items

Ghostbloom

View details
Material / otherDroppable

No authored statistic bonuses.

Loot sources: Ghostbloom.

Source recordassets/items/ghostbloom/item.json

items

Graveguard Helm

View details
headDroppable
CharacteristicBonus
Physical defense+6
Magical defense+2

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Sealed Reliquary, Crypt Knight.

Source recordassets/items/graveguard_helm/item.json

items

Graveguard Mail

View details
bodyDroppable
CharacteristicBonus
Maximum life+24
Physical defense+11

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Crypt Knight, Dark Prelate.

Source recordassets/items/graveguard_mail/item.json

items

Graveguard Mantle

View details
backDroppable
CharacteristicBonus
Physical defense+3
Magical defense+1

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Crypt Knight.

Source recordassets/items/graveguard_mantle/item.json

items

Greater Health Potion

View details
ConsumableDroppable

No authored statistic bonuses.

Units consumed: 1

EffectAuthored amount
Heal85

Loot sources: Dark Prelate.

Source recordassets/items/greater_health_potion/item.json

items

Greater Mana Potion

View details
ConsumableDroppable

No authored statistic bonuses.

Units consumed: 1

EffectAuthored amount
Mana70

Loot sources: Bone Priest, Sealed Reliquary, Dark Prelate.

Source recordassets/items/greater_mana_potion/item.json

items

Haste Aura

View details
spellDroppable

No authored statistic bonuses.

Granted actions: Haste Aura

Loot sources: Dark Prelate.

Source recordassets/items/spell_haste_aura/item.json

items

Haste Potion

View details
ConsumableDroppable

No authored statistic bonuses.

Units consumed: 1

EffectAuthored amount
HasteMovement and attack/cast cadence +15% · 30 s (40/50/60 s with 1/2/3 doses)

Loot sources: No known loot source.

Source recordassets/items/haste_potion/item.json

items

Health Potion

View details
ConsumableDroppable

No authored statistic bonuses.

Units consumed: 1

EffectAuthored amount
Heal50

Loot sources: Blood Acolyte, Sealed Reliquary.

Starting loadouts: Human Player ×5.

Source recordassets/items/health_potion/item.json

items

Herb

View details
Material / otherDroppable

No authored statistic bonuses.

Loot sources: Herb Patch.

Source recordassets/items/herb/item.json

items

Hunter's Cape

View details
backDroppable
CharacteristicBonus
Dodge chance+2.5%
Critical chance+1%

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Skeleton Archer.

Source recordassets/items/hunters_cape/item.json

items

Hunter's Jerkin

View details
bodyDroppable
CharacteristicBonus
Physical defense+5
Dodge chance+3%

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Sealed Reliquary, Skeleton Archer.

Source recordassets/items/hunters_jerkin/item.json

items

Hunter's Quiver

View details
offhandDroppable
CharacteristicBonus
Physical damage+3
Critical chance+2%

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Skeleton Archer.

Source recordassets/items/hunters_quiver/item.json

items

Hunting Bow

View details
weaponDroppable
CharacteristicBonus
Physical damage+9

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Granted actions: Ranged Attack

Loot sources: Skeleton Archer.

Source recordassets/items/hunting_bow/item.json

items

Iron Helmet

View details
headDroppable
CharacteristicBonus
Physical defense+3

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Weathered Crypt Chest.

Starting loadouts: Human Player ×1.

Source recordassets/items/iron_helmet/item.json

items

Iron Sword

View details
weaponDroppable
CharacteristicBonus
Physical damage+12

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Granted actions: Sword Slash

Loot sources: Weathered Crypt Chest.

Starting loadouts: Human Player ×1.

Source recordassets/items/iron_sword/item.json

items

Leather Armor

View details
bodyDroppable
CharacteristicBonus
Physical defense+7

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Weathered Crypt Chest.

Starting loadouts: Human Player ×1.

Source recordassets/items/leather_armor/item.json

items

Leather Hood

View details
headDroppable
CharacteristicBonus
Physical defense+3
Dodge chance+2%

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Weathered Crypt Chest, Skeleton Archer.

Source recordassets/items/leather_hood/item.json

items

Leather Pants

View details
legsDroppable
CharacteristicBonus
Physical defense+4

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Weathered Crypt Chest.

Starting loadouts: Human Player ×1.

Source recordassets/items/leather_pants/item.json

items

Lesser Health Potion

View details
ConsumableDroppable

No authored statistic bonuses.

Units consumed: 1

EffectAuthored amount
Heal35

Loot sources: Weathered Crypt Chest.

Source recordassets/items/lesser_health_potion/item.json

items

Lesser Mana Potion

View details
ConsumableDroppable

No authored statistic bonuses.

Units consumed: 1

EffectAuthored amount
Mana28

Loot sources: Ashen Cultist, Weathered Crypt Chest, Ashen Cult Mage.

Source recordassets/items/lesser_mana_potion/item.json

items

Liquid Chaos

View details
Material / otherDroppable

No authored statistic bonuses.

Loot sources: No known loot source.

Source recordassets/items/liquid_chaos/item.json

items

Might Aura

View details
spellDroppable

No authored statistic bonuses.

Granted actions: Might Aura

Loot sources: Dark Prelate.

Source recordassets/items/spell_might_aura/item.json

items

Might Potion

View details
ConsumableDroppable

No authored statistic bonuses.

Units consumed: 1

EffectAuthored amount
MightPhysical and magical damage +20% · 30 s (40/50/60 s with 1/2/3 doses)

Loot sources: No known loot source.

Source recordassets/items/might_potion/item.json

items

Monster Bile

View details
Material / otherDroppable

No authored statistic bonuses.

Loot sources: Ashen Cult Mage.

Source recordassets/items/monster_bile/item.json

items

Mooncap

View details
Material / otherDroppable

No authored statistic bonuses.

Loot sources: Mooncap.

Source recordassets/items/mooncap/item.json

items

Padded Coif

View details
headDroppable
CharacteristicBonus
Physical defense+2

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Weathered Crypt Chest.

Starting loadouts: Human Player ×1.

Source recordassets/items/padded_coif/item.json

items

Precision Aura

View details
spellDroppable

No authored statistic bonuses.

Granted actions: Precision Aura

Loot sources: Dark Prelate.

Source recordassets/items/spell_precision_aura/item.json

items

Precision Potion

View details
ConsumableDroppable

No authored statistic bonuses.

Units consumed: 1

EffectAuthored amount
PrecisionCritical chance +8 percentage points · 30 s (40/50/60 s with 1/2/3 doses)

Loot sources: No known loot source.

Source recordassets/items/precision_potion/item.json

items

Quest Relic

View details
Material / otherProtected

No authored statistic bonuses.

Loot sources: No known loot source.

Source recordassets/items/quest_relic/item.json

items

Restoration Potion

View details
ConsumableDroppable

No authored statistic bonuses.

Units consumed: 1

EffectAuthored amount
Heal35
Mana35

Loot sources: No known loot source.

Source recordassets/items/restoration_potion/item.json

items

Rusted Buckler

View details
offhandDroppable
CharacteristicBonus
Physical defense+4
Dodge chance+1%

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Skeleton Warrior.

Source recordassets/items/rusted_buckler/item.json

items

Rusted Longsword

View details
weaponDroppable
CharacteristicBonus
Physical damage+8

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Granted actions: Sword Slash

Loot sources: Crypt Knight, Skeleton Warrior.

Source recordassets/items/rusted_longsword/item.json

items

Scraps

View details
Material / otherDroppable

No authored statistic bonuses.

Loot sources: No known loot source.

Source recordassets/items/scraps/item.json

items

Soul of Ashen Cult Mage

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of the Ashen Mage, with a source-dependent soul level.

Loot sources: Ashen Cult Mage.

Source recordassets/items/cult_mage_soul/item.json

items

Soul of Ashen Cultist

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Ashen Cultist, with a source-dependent soul level.

Loot sources: Ashen Cultist.

Source recordassets/items/ashen_cultist_soul/item.json

items

Soul of Black Bear

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Black Bear, with a source-dependent soul level.

Loot sources: Black Bear.

Source recordassets/items/black_bear_soul/item.json

items

Soul of Blood Acolyte

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Blood Acolyte, with a source-dependent soul level.

Loot sources: Blood Acolyte.

Source recordassets/items/blood_acolyte_soul/item.json

items

Soul of Bone Priest

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Bone Priest, with a source-dependent soul level.

Loot sources: Bone Priest.

Source recordassets/items/bone_priest_soul/item.json

items

Soul of Carrion Hound

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Carrion Hound, with a source-dependent soul level.

Loot sources: Carrion Hound.

Source recordassets/items/carrion_hound_soul/item.json

items

Soul of Corrupted Boar

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Corrupted Boar, with a source-dependent soul level.

Loot sources: Corrupted Boar.

Source recordassets/items/corrupted_boar_soul/item.json

items

Soul of Crypt Ghost

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Crypt Ghost, with a source-dependent soul level.

Loot sources: Crypt Ghost.

Source recordassets/items/crypt_ghost_soul/item.json

items

Soul of Crypt Knight

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Crypt Knight, with a source-dependent soul level.

Loot sources: Crypt Knight.

Source recordassets/items/crypt_knight_soul/item.json

items

Soul of Dark Prelate

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Dark Prelate, with a source-dependent soul level.

Loot sources: Dark Prelate.

Source recordassets/items/dark_prelate_soul/item.json

items

Soul of Dire Wolf

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Dire Wolf, with a source-dependent soul level.

Loot sources: Dire Wolf.

Source recordassets/items/dire_wolf_soul/item.json

items

Soul of Executioner

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Executioner, with a source-dependent soul level.

Loot sources: Executioner.

Source recordassets/items/executioner_soul/item.json

items

Soul of Giant Rat

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Giant Rat, with a source-dependent soul level.

Loot sources: Giant Rat.

Source recordassets/items/giant_rat_soul/item.json

items

Soul of Grave Wraith

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Grave Wraith, with a source-dependent soul level.

Loot sources: Grave Wraith.

Source recordassets/items/grave_wraith_soul/item.json

items

Soul of Skeleton Archer

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Skeleton Archer, with a source-dependent soul level.

Loot sources: Skeleton Archer.

Source recordassets/items/skeleton_archer_soul/item.json

items

Soul of Skeleton Warrior

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of Skeleton Warrior, with a source-dependent soul level.

Loot sources: Skeleton Warrior.

Source recordassets/items/skeleton_warrior_soul/item.json

items

Soul of the Dire Wolf

View details
Soul templateDroppable

No authored statistic bonuses.

Materializes as Soul of the Dire Wolf, with a source-dependent soul level.

Loot sources: Wolf.

Source recordassets/items/wolf_soul/item.json

items

Spectral Residue

View details
Material / otherDroppable

No authored statistic bonuses.

Loot sources: Crypt Ghost.

Source recordassets/items/spectral_residue/item.json

items

Training Torch

View details
offhandDroppable
CharacteristicBonus
Physical damage+3.5

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Units consumed: 1

EffectAuthored amount
Start Fire1

Granted actions: Sword Slash

Loot sources: Weathered Crypt Chest.

Starting loadouts: Human Player ×1.

Source recordassets/items/training_torch/item.json

items

Volatile Chaos

View details
Material / otherDroppable

No authored statistic bonuses.

Loot sources: No known loot source.

Source recordassets/items/volatile_chaos/item.json

items

Ward Aura

View details
spellDroppable

No authored statistic bonuses.

Granted actions: Ward Aura

Loot sources: Dark Prelate.

Source recordassets/items/spell_ward_aura/item.json

items

Ward Potion

View details
ConsumableDroppable

No authored statistic bonuses.

Units consumed: 1

EffectAuthored amount
WardPhysical and magical defense +25% · 30 s (40/50/60 s with 1/2/3 doses)

Loot sources: No known loot source.

Source recordassets/items/ward_potion/item.json

items

Water Wave

View details
spellDroppable

No authored statistic bonuses.

Granted actions: Water Wave

Loot sources: Crypt Ghost.

Starting loadouts: Human Player ×1.

Source recordassets/items/spell_water_wave/item.json

items

Worn Brigandine

View details
bodyDroppable
CharacteristicBonus
Maximum life+5
Physical defense+7

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Sealed Reliquary, Executioner.

Source recordassets/items/worn_brigandine/item.json

items

Worn Traveller's Cape

View details
backDroppable
CharacteristicBonus
Physical defense+1.5
Dodge chance+1%

Next upgrade: 8 Scraps · Dismantle: 1 Scraps.

Loot sources: Weathered Crypt Chest.

Starting loadouts: Human Player ×1.

Source recordassets/items/worn_travellers_cape/item.json

Steel, bone and sorcery

Actions & spells

Base values from the action definitions; effective damage and healing also use the caster’s statistics.

actions

Bite

View details
primarymelee_arcphysical
ParameterAuthored value
Mana cost0
Cooldown (s)0.9
Release delay (s)0.3
Minimum base damage4
Maximum base damage7
Maximum range70
Reach72
Area radius0
Hit radius0
Arc (degrees)90
Thickness22

Used by: Dire Wolf, Wolf

Source recordassets/actions/wolf_bite/action.json

actions

Blood Nova

View details
spellself_aoemagical
ParameterEvaluated value
Mana cost18
Cooldown (s)1.2
Release delay (s)0.35
Minimum base damage18
Maximum base damage28
Maximum range0
Reach0
Area radius115
Hit radius0
Arc (degrees)0
Thickness0

Next upgrade: 8 Volatile Chaos · Dismantle: 1 Volatile Chaos.

Status effects

StatusChance per eligible targetDurationEffect
Bleeding50%5 s8% of resolved triggering hit per second

Authored visual preview

These players replay the original authored frames referenced by this wiki. Only one preview plays at a time. Static projectile art stays static; the pixels do not define gameplay hit areas or timing.

Authored art
Cast16 authored frames · 0.348 s preview cyclecast_blood_aura
Authored art
Release · Ground16 authored frames · 0.800 s preview cycleblood_nova_release
Authored art
Release · Front16 authored frames · 0.615 s preview cycleblood_nova_release
Authored art
Status · Bleeding16 authored frames · 1 s preview cyclefx/statuses/bleeding.png

Used by: Blood Acolyte, Dark Prelate, Grave Wraith, Blood Nova

Source recordassets/actions/blood_nova/action.json

actions

Blue Lightning

View details
spellbeammagical
ParameterEvaluated value
Mana cost18
Cooldown (s)0.65
Release delay (s)0.42
Minimum base damage24
Maximum base damage34
Maximum range520
Reach0
Area radius0
Hit radius36
Arc (degrees)0
Thickness0

Next upgrade: 8 Volatile Chaos · Dismantle: 1 Volatile Chaos.

Authored visual preview

These players replay the original authored frames referenced by this wiki. Only one preview plays at a time. Static projectile art stays static; the pixels do not define gameplay hit areas or timing.

Authored art
Cast16 authored frames · 0.421 s preview cyclecast_lightning_aura
Authored art
Beam16 authored frames · 0.222 s preview cycleblue_lightning

Used by: Blue Lightning

Source recordassets/actions/blue_lightning/action.json

actions

Bone Spear

View details
spellprojectilemagical
ParameterEvaluated value
Mana cost11
Cooldown (s)0.65
Release delay (s)0.35
Minimum base damage14
Maximum base damage22
Maximum range620
Reach0
Area radius0
Hit radius22
Arc (degrees)0
Thickness0
Projectile speed310
Flight duration (server ticks)60

Next upgrade: 8 Volatile Chaos · Dismantle: 1 Volatile Chaos.

Status effects

StatusChance per eligible targetDurationEffect
Bleeding35%5 s8% of resolved triggering hit per second

Pierces: 3 targets · 100%, 80%, 60% raw damage in contact order. Each actor is encountered once per flight; a dodge consumes a contact. Solid terrain stops the projectile.

Authored visual preview

These players replay the original authored frames referenced by this wiki. Only one preview plays at a time. Static projectile art stays static; the pixels do not define gameplay hit areas or timing.

Authored art
Cast16 authored frames · 0.348 s preview cyclecast_bone_spear
Authored art
ProjectileStatic authored framebone_spear_projectile
Authored art
Impact16 authored frames · 0.533 s preview cyclebone_spear_impact
Authored art
Status · Bleeding16 authored frames · 1 s preview cyclefx/statuses/bleeding.png

Used by: Bone Priest, Dark Prelate, Bone Staff, Bone Spear

Source recordassets/actions/bone_spear/action.json

actions

Carrion Bite

View details
primarymelee_arcphysical
ParameterAuthored value
Mana cost0
Cooldown (s)0.9
Release delay (s)0.3
Minimum base damage4
Maximum base damage7
Maximum range70
Reach72
Area radius0
Hit radius0
Arc (degrees)90
Thickness22

Used by: Carrion Hound

Source recordassets/actions/carrion_bite/action.json

actions

Cleanse

View details
spellself_aoeNot specified
ParameterEvaluated value
Mana cost20
Cooldown (s)60
Release delay (s)0.35
Minimum base damage0
Maximum base damage0
Maximum range0
Reach0
Area radius90
Hit radius0
Arc (degrees)0
Thickness0

Next upgrade: 8 Volatile Chaos · Dismantle: 1 Volatile Chaos.

Authored visual preview

These players replay the original authored frames referenced by this wiki. Only one preview plays at a time. Static projectile art stays static; the pixels do not define gameplay hit areas or timing.

Authored art
Cast16 authored frames · 0.348 s preview cyclecast_healing_light
Authored art
Release · Ground16 authored frames · 0.800 s preview cyclehealing_light_release
Authored art
Release · Front16 authored frames · 0.667 s preview cyclehealing_light_release

Used by: Cleanse

Source recordassets/actions/cleanse/action.json

actions

Fireball

View details
spellprojectilemagical
ParameterEvaluated value
Mana cost12
Cooldown (s)0.55
Release delay (s)0.42
Minimum base damage16
Maximum base damage24
Maximum range640
Reach0
Area radius58
Hit radius34
Arc (degrees)0
Thickness0
Projectile speed240
Flight duration (server ticks)80

Next upgrade: 8 Volatile Chaos · Dismantle: 1 Volatile Chaos.

Status effects

StatusChance per eligible targetDurationEffect
Burning100%4 s12% of resolved triggering hit per second

Authored visual preview

These players replay the original authored frames referenced by this wiki. Only one preview plays at a time. Static projectile art stays static; the pixels do not define gameplay hit areas or timing.

Authored art
Cast16 authored frames · 0.421 s preview cyclecast_fire_aura
Authored art
Projectile16 authored frames · 0.667 s preview cyclefireball
Authored art
Impact · Ground16 authored frames · 0.800 s preview cycleexplosion
Authored art
Impact · Front16 authored frames · 0.533 s preview cycleexplosion
Authored art
Status · Burning16 authored frames · 1 s preview cyclefx/statuses/burning.png

Used by: Ashen Cult Mage, Fireball

Source recordassets/actions/fireball/action.json

actions

Frost Shard

View details
spellprojectilemagical
ParameterEvaluated value
Mana cost10
Cooldown (s)0.55
Release delay (s)0.35
Minimum base damage12
Maximum base damage20
Maximum range580
Reach0
Area radius18
Hit radius24
Arc (degrees)0
Thickness0
Projectile speed310
Flight duration (server ticks)57

Next upgrade: 8 Volatile Chaos · Dismantle: 1 Volatile Chaos.

Status effects

StatusChance per eligible targetDurationEffect
Frozen100%3 sMovement −25%; attack/cast cadence −20%

Authored visual preview

These players replay the original authored frames referenced by this wiki. Only one preview plays at a time. Static projectile art stays static; the pixels do not define gameplay hit areas or timing.

Authored art
Cast16 authored frames · 0.348 s preview cyclecast_frost_shard
Authored art
ProjectileStatic authored framefrost_shard_projectile
Authored art
Impact · Ground16 authored frames · 0.800 s preview cyclefrost_shard_impact
Authored art
Impact · Front16 authored frames · 0.533 s preview cyclefrost_shard_impact
Authored art
Status · Frozen16 authored frames · 1 s preview cyclefx/statuses/frozen.png

Used by: Crypt Ghost, Frost Shard

Source recordassets/actions/frost_shard/action.json

actions

Gnaw

View details
primarymelee_arcphysical
ParameterAuthored value
Mana cost0
Cooldown (s)0.9
Release delay (s)0.3
Minimum base damage4
Maximum base damage7
Maximum range70
Reach72
Area radius0
Hit radius0
Arc (degrees)90
Thickness22

Used by: Giant Rat

Source recordassets/actions/rat_bite/action.json

actions

Haste Aura

View details
spellself_aoeNot specified
ParameterEvaluated value
Mana cost46
Cooldown (s)30
Release delay (s)0.8
Minimum base damage0
Maximum base damage0
Maximum range0
Reach0
Area radius100
Hit radius0
Arc (degrees)0
Thickness0

Next upgrade: 8 Volatile Chaos · Dismantle: 1 Volatile Chaos.

Status effects

StatusChance per eligible targetDurationEffect
Haste100%15 sMovement and attack/cast cadence +5%

Authored visual preview

These players replay the original authored frames referenced by this wiki. Only one preview plays at a time. Static projectile art stays static; the pixels do not define gameplay hit areas or timing.

Authored art
Cast16 authored frames · 0.800 s preview cyclecast_haste_aura
Authored art
Release · Ground16 authored frames · 0.800 s preview cyclehaste_aura_release
Authored art
Status · Haste16 authored frames · 1 s preview cyclefx/statuses/haste.png

Used by: Haste Aura

Source recordassets/actions/haste_aura/action.json

actions

Healing Light

View details
spellself_aoemagical
ParameterEvaluated value
Mana cost20
Cooldown (s)2.5
Release delay (s)0.35
Base heal28
Maximum range0
Reach0
Area radius90
Hit radius0
Arc (degrees)0
Thickness0

Next upgrade: 8 Volatile Chaos · Dismantle: 1 Volatile Chaos.

Status effects

StatusChance per eligible targetDurationEffect
Renewal100%5 s8% of evaluated initial healing per second

Authored visual preview

These players replay the original authored frames referenced by this wiki. Only one preview plays at a time. Static projectile art stays static; the pixels do not define gameplay hit areas or timing.

Authored art
Cast16 authored frames · 0.348 s preview cyclecast_healing_light
Authored art
Release · Ground16 authored frames · 0.800 s preview cyclehealing_light_release
Authored art
Release · Front16 authored frames · 0.667 s preview cyclehealing_light_release
Authored art
Status · Renewal16 authored frames · 1 s preview cyclefx/statuses/renewal.png

Used by: Healing Light

Source recordassets/actions/healing_light/action.json

actions

Leaping Rend

View details
primarymelee_arcphysical
ParameterAuthored value
Mana cost0
Cooldown (s)1.7
Release delay (s)0.42
Minimum base damage7
Maximum base damage11
Maximum range132
Reach136
Area radius0
Hit radius0
Arc (degrees)75
Thickness28

Used by: Dire Wolf, Wolf

Source recordassets/actions/wolf_leap/action.json

actions

Maul

View details
primarymelee_arcphysical
ParameterAuthored value
Mana cost0
Cooldown (s)0.9
Release delay (s)0.3
Minimum base damage4
Maximum base damage7
Maximum range70
Reach72
Area radius0
Hit radius0
Arc (degrees)90
Thickness22

Used by: Black Bear

Source recordassets/actions/bear_maul/action.json

actions

Might Aura

View details
spellself_aoeNot specified
ParameterEvaluated value
Mana cost38
Cooldown (s)24
Release delay (s)0.8
Minimum base damage0
Maximum base damage0
Maximum range0
Reach0
Area radius110
Hit radius0
Arc (degrees)0
Thickness0

Next upgrade: 8 Volatile Chaos · Dismantle: 1 Volatile Chaos.

Status effects

StatusChance per eligible targetDurationEffect
Might100%15 sPhysical and magical damage +5%

Authored visual preview

These players replay the original authored frames referenced by this wiki. Only one preview plays at a time. Static projectile art stays static; the pixels do not define gameplay hit areas or timing.

Authored art
Cast16 authored frames · 0.800 s preview cyclecast_might_aura
Authored art
Release · Ground16 authored frames · 0.800 s preview cyclemight_aura_release
Authored art
Status · Might16 authored frames · 1 s preview cyclefx/statuses/might.png

Used by: Might Aura

Source recordassets/actions/might_aura/action.json

actions

Monster Slash

View details
primarymelee_arcphysical
ParameterAuthored value
Mana cost0
Cooldown (s)0.9
Release delay (s)0.34
Minimum base damage0
Maximum base damage0
Maximum range108
Reach110
Area radius0
Hit radius0
Arc (degrees)112
Thickness25

Used by: Ashen Cultist, Crypt Knight, Executioner, Skeleton Warrior

Source recordassets/actions/monster_slash/action.json

actions

Precision Aura

View details
spellself_aoeNot specified
ParameterEvaluated value
Mana cost34
Cooldown (s)22
Release delay (s)0.8
Minimum base damage0
Maximum base damage0
Maximum range0
Reach0
Area radius120
Hit radius0
Arc (degrees)0
Thickness0

Next upgrade: 8 Volatile Chaos · Dismantle: 1 Volatile Chaos.

Status effects

StatusChance per eligible targetDurationEffect
Precision100%15 sCritical chance +5 percentage points

Authored visual preview

These players replay the original authored frames referenced by this wiki. Only one preview plays at a time. Static projectile art stays static; the pixels do not define gameplay hit areas or timing.

Authored art
Cast16 authored frames · 0.800 s preview cyclecast_precision_aura
Authored art
Release · Ground16 authored frames · 0.800 s preview cycleprecision_aura_release
Authored art
Status · Precision16 authored frames · 1 s preview cyclefx/statuses/precision.png

Used by: Precision Aura

Source recordassets/actions/precision_aura/action.json

actions

Ranged Attack

View details
primaryprojectilephysical
ParameterAuthored value
Mana cost0
Cooldown (s)0
Release delay (s)0.28
Minimum base damage0
Maximum base damage0
Maximum range560
Reach0
Area radius0
Hit radius14
Arc (degrees)0
Thickness0

Used by: Skeleton Archer, Hunting Bow

Source recordassets/actions/ranged_attack/action.json

actions

Shadow Bolt

View details
spellprojectilemagical
ParameterEvaluated value
Mana cost14
Cooldown (s)0.8
Release delay (s)0.35
Minimum base damage17
Maximum base damage27
Maximum range650
Reach0
Area radius26
Hit radius28
Arc (degrees)0
Thickness0
Projectile speed310
Flight duration (server ticks)63

Next upgrade: 8 Volatile Chaos · Dismantle: 1 Volatile Chaos.

Authored visual preview

These players replay the original authored frames referenced by this wiki. Only one preview plays at a time. Static projectile art stays static; the pixels do not define gameplay hit areas or timing.

Authored art
Cast16 authored frames · 0.348 s preview cyclecast_shadow_bolt
Authored art
ProjectileStatic authored frameshadow_bolt_projectile
Authored art
Impact · Ground16 authored frames · 0.800 s preview cycleshadow_bolt_impact
Authored art
Impact · Front16 authored frames · 0.533 s preview cycleshadow_bolt_impact

Used by: Blood Acolyte, Dark Prelate, Grave Wraith, Cultist Wand, Shadow Bolt

Source recordassets/actions/shadow_bolt/action.json

actions

Staff Strike

View details
primarymelee_arcphysical
ParameterAuthored value
Mana cost0
Cooldown (s)0.9
Release delay (s)0.32
Minimum base damage3
Maximum base damage6
Maximum range86
Reach88
Area radius0
Hit radius0
Arc (degrees)110
Thickness24

Used by: Ashen Cult Mage

Source recordassets/actions/cult_staff_strike/action.json

actions

Sweeping Gore

View details
primarymelee_arcphysical
ParameterAuthored value
Mana cost0
Cooldown (s)1.7
Release delay (s)0.42
Minimum base damage7
Maximum base damage11
Maximum range132
Reach136
Area radius0
Hit radius0
Arc (degrees)75
Thickness28

Used by: Corrupted Boar

Source recordassets/actions/boar_sweep/action.json

actions

Sword Slash

View details
primarymelee_arcphysical
ParameterAuthored value
Mana cost0
Cooldown (s)0.38
Release delay (s)0.2
Minimum base damage0
Maximum base damage0
Maximum range112
Reach112
Area radius0
Hit radius0
Arc (degrees)120
Thickness26

Used by: Executioner's Axe, Iron Sword, Rusted Longsword, Training Torch

Source recordassets/actions/attack_slash/action.json

actions

Tusk Gore

View details
primarymelee_arcphysical
ParameterAuthored value
Mana cost0
Cooldown (s)0.9
Release delay (s)0.3
Minimum base damage4
Maximum base damage7
Maximum range70
Reach72
Area radius0
Hit radius0
Arc (degrees)90
Thickness22

Used by: Corrupted Boar

Source recordassets/actions/boar_gore/action.json

actions

Ward Aura

View details
spellself_aoeNot specified
ParameterEvaluated value
Mana cost40
Cooldown (s)26
Release delay (s)0.8
Minimum base damage0
Maximum base damage0
Maximum range0
Reach0
Area radius110
Hit radius0
Arc (degrees)0
Thickness0

Next upgrade: 8 Volatile Chaos · Dismantle: 1 Volatile Chaos.

Status effects

StatusChance per eligible targetDurationEffect
Ward100%15 sPhysical and magical defense +5%

Authored visual preview

These players replay the original authored frames referenced by this wiki. Only one preview plays at a time. Static projectile art stays static; the pixels do not define gameplay hit areas or timing.

Authored art
Cast16 authored frames · 0.800 s preview cyclecast_ward_aura
Authored art
Release · Ground16 authored frames · 0.800 s preview cycleward_aura_release
Authored art
Status · Ward16 authored frames · 1 s preview cyclefx/statuses/ward.png

Used by: Ward Aura

Source recordassets/actions/ward_aura/action.json

actions

Water Wave

View details
spellself_aoemagical
ParameterEvaluated value
Mana cost10
Cooldown (s)0.75
Release delay (s)0.42
Minimum base damage12
Maximum base damage19
Maximum range0
Reach0
Area radius120
Hit radius0
Arc (degrees)360
Thickness0

Next upgrade: 8 Volatile Chaos · Dismantle: 1 Volatile Chaos.

Authored visual preview

These players replay the original authored frames referenced by this wiki. Only one preview plays at a time. Static projectile art stays static; the pixels do not define gameplay hit areas or timing.

Authored art
Cast16 authored frames · 0.421 s preview cyclecast_water_aura
Authored art
Release · Ground16 authored frames · 0.800 s preview cyclewater_wave

Used by: Water Wave

Source recordassets/actions/water_wave/action.json

Player guide

Combat & characteristics

Direct statistics. No hidden attribute conversion.

Your core statistics

Vestige uses physical damage, magical damage, physical defense, magical defense, dodge chance, critical chance, critical damage, maximum life, maximum mana and resource regeneration directly. There is no STR/DEX/INT/VIT conversion in the current combat model.

How bonuses stack

Equipment bonuses and the equipped soul are added to the base statistics. An item in the backpack grants no equipment bonus. Critical damage bonuses are additive to the multiplier: a +0.10 bonus raises 1.50× to 1.60×, rather than adding ten percentage points of critical chance. Changing equipped items or souls preserves the current life and mana proportions, so removing and re-equipping cannot restore resources; empty mana remains empty.

How attacks deal damage

An offensive action rolls within its authored base-damage range, then adds the matching non-negative damage statistic. Dodge is checked first. A non-dodged hit may become critical; the resulting raw damage is mitigated by the matching defense. Physical defense does not reduce magical damage, and magical defense does not reduce physical damage. Animated melee swings, casting effects and impact effects are visual feedback; their artwork does not change attack damage, hit areas or the server's attack timing. Bone Spear's casting aura surrounds the caster and stops when the cast ends; it is not the spear's destruction animation. Its terminal bone fragments follow the flight direction and appear on a valid terminal collision, not on expiry, invalidation or loss of visibility. Intermediate piercing contacts do not gain an invented area effect. These visual effects do not add hits or change the existing piercing, damage or server timing. The melee swing trail keeps a stable elevation above the attacker's projected body and is advanced slightly in the captured attack direction, toward the melee hit region. This is a visual translation: its local pivot and isometric shape are unchanged. It follows the rendered actor, not the weapon, and does not change hit range or damage.

Upgrade equipment and spells

Equipment and spell progression are per exemplar, with no gameplay level cap (technical u32 boundary). At level L, positive equipment damage, defense, life and mana bonuses use (1 + 0.2 × (L−1))^1.3; negative and absent modifiers do not grow. Spell damage and healing use (1 + 0.15 × (L−1))^1.25, and mana cost uses (1 + 0.15 × (L−1))^0.65. Equipment critical chance and critical damage bonuses use 1 + 0.6 × ln(L); dodge bonuses use 1 + 0.25 × ln(L); equipment regeneration percentage bonuses use 1 + 0.15 × ln(L). Projectile/beam range adds 1% of base per level up to 40%, area radius adds 0.75% up to 30%, and projectile speed adds 0.5% up to 20%. Cooldowns are unchanged except for Cleanse, whose dedicated level curve is documented with temporary effects. Level L to L+1 costs B × L² + floor(B × (L−1)² / 4), with B = 8 Scraps for equipment or 8 Volatile Chaos for spells, saturating at the currency limit. Equipment salvage starts with 2 + 4 × the sum of k² for k from 1 through L−1, then divides by 2, rounding down with a minimum of one for a previously nonzero return. A spell-bearing item sums completed-level squares across all its spell actions, with only one base return for the whole item. Equipment that also grants spells returns both resources independently. Currency-limit saturation applies after division; batch quantities multiply the rounded per-item return. The additional upgrade charge is not refunded. Locked equipment, spells and souls remain eligible upgrade targets; locked payment materials cannot be spent. Every paid +1 attempt has a 1% chance to recycle the target at its level before that failed attempt. The failed cost is spent. An equipped target is unequipped if it breaks; surviving upgrades retain the lock and equipment reservation. A failed spell upgrade recycles the entire carrier, including its equipment and other spell progress. Manual dismantling still excludes locked items. Upgrade to max handles one exemplar and the selected spell only, stopping at the first break, unaffordable step or technical level limit. Confirmation shows the attainable level without a break, maximum cost, steps and cumulative break chance 1 − (1 − p)^steps, where p is the per-attempt break probability. It never continues onto another copy in the stack. The server commits one durable result before confirming it; replaying a command cannot reroll that result.

Defense, dodge and critical hits

Damage after defense = max(raw damage, 0) × 100 / (100 + max(defense, 0)). Dodge is clamped to 0–95%, critical chance to 0–100%, and the critical multiplier has a minimum of 1×. The chance values on these pages are probabilities, not ratings.

Healing spells

Healing Light's base heal comes from its action definition. Spell healing before critical = base heal + max(magical damage, 0) × 0.25. The server rolls critical healing per eligible target using the caster's critical chance and critical multiplier, with the same clamps as damage; defense and dodge do not reduce healing. The result is capped by missing life. Floating green numbers show life actually restored with a + prefix; critical heals use a brighter green, larger text and an exclamation mark. A full-life target produces no healing number. Healing does not resurrect a dead target. The existing same-team, range and world restrictions still apply. Potions and passive regeneration are not turned into critical spell heals.

Monster progression

The base-monster tables show Normal rank and exclude equipment and temporary combat circumstances. After level scaling, Normal/Elite/Boss multiply maximum life by 1/2/8; rank does not multiply damage. Normal/Elite/Boss multiply authored base mana regeneration by 1/5/5 once at creation. Later equipment and soul regeneration bonuses remain additive and are not multiplied by rank. Rank does not change life regeneration or player regeneration. The monster curves preserve each species’ effective level-one anchor. At level L, life uses (1 + 0.25 × (L−1))^1.65, physical and magical damage use (1 + 0.2 × (L−1))^1.4, and defenses use 1 + 1 × ln(L). Monster mana, dodge and critical values retain their existing scaling. Base life and mana regeneration percentages remain fixed as actor level rises; their absolute recovery grows with maximum resources. Equipment, soul and monster bonuses retain finite numeric saturation for extreme levels.

Life and mana regeneration

Life and mana regenerate while alive at a percentage of the effective maximum per second. The authored player has 1% life/s and 4.5% mana/s before bonuses. Regeneration bonuses add percentage points: 1% base plus 0.5 bonus gives 1.5%/s, or 150 life/s at 10,000 maximum life. The rate uses maximum resources, not current or missing resources. Soul and equipment regeneration bonuses grow with 1 + 0.15 × ln(level); the base rate does not grow with level. Existing saved bonus coefficients become percentage points, with their effective upgrade values recalculated. The character sheet shows both the percentage and the resulting units per second. Recovery clamps to the maximum, starts from empty mana, and never revives zero-health actors. A potion's actual restored amount is limited by the missing resource. Using a life or mana potion when its affected resource is already full is refused without consuming it. Check each consumable for its own effects and consumption amount. During player combat, the complete passive life and mana rates, including bonuses, are multiplied by 0.1. Combat lasts 10 seconds after the latest valid hostile exchange in PvE or PvP, including damage over time and a genuine attack that is dodged. Proximity, attacking empty space and sanctuary-blocked attempts do not refresh it. Potions, direct healing, Renewal and monster regeneration are unchanged. Entering a sanctuary does not clear an existing combat timer. On reconnection, saved absolute combat deadlines are restored conservatively; new hostility uses the configured window independently of longer PvP/return locks.

Levels and progression

The current content defines character levels and regional enemy levels. This codex does not infer an experience curve, quests, resistance system or progression mechanic that is absent from the sources.

Projectile collisions

Fireball, Shadow Bolt and Frost Shard resolve one hit per eligible actor at the swept contact point. All three have a real splash area whose radius follows spell progression. The actor that triggers the impact is included even when the projectile's contact radius exceeds its splash radius. Other actors must overlap the evaluated splash area with their combat radius; tangency is included, so a touched actor's center can lie beyond the ground footprint. Direct contact and splash never produce two hits on the same actor; defense, dodge, critical hits, team, PvP and world restrictions still apply. A wall impact includes only actors in its splash area, not a later contact beyond it. Authored AOE ground sprites follow the evaluated radius and origin carried by the server, not the projectile's flight height. Separate vertical layers need not scale like the ground. A missing calibration or missing frames leave the effect absent rather than substitute an uncalibrated impact. Projectile expiry, invalidation and loss of visibility do not fabricate collisions. Water Wave remains a self-centered area action; its artwork does not create extra damage ticks. Non-AOE attacks, including Bone Spear, do not receive an area footprint.

Piercing and area spells

Bone Spear encounters at most three eligible actors in travel order, multiplying its raw damage by 100%, 80%, then 60% before each target’s defense and critical/dodge resolution. An actor is encountered only once per flight. Dodging still consumes that contact. Opted-out players and actors in another world do not block or consume it. Solid blocked terrain and missing cells of a known world stop projectile travel. Tile contact uses a conservative radius-expanded rectangle. Its authoritative lifetime uses the shared server flight duration derived from evaluated range and evaluated projectile speed. Intermediate piercing visuals do not apply damage.

Equipment drop levels

Equipment loot rolls a level from 1 through the source level, with inverse-square weights as for souls; high levels are possible but rarer. An equipment drop from a level-500 source can therefore exceed level 100. Standalone spell items also roll upgraded spell levels through the full source level, without the old level-100 cap. Ordinary materials and potions retain their base identity. For non-guaranteed monster drops, equipment chance is multiplied by 0.75, or ordinary spell-item chance by 0.8. Equipment takes precedence when it also grants a spell; it receives only the equipment level roll. Rare items tagged buff retain their chance. Other categories, container chances and guaranteed chances are unchanged. Monster fragment quantities scale with level and rank as described in the soul guide. A multi-unit roll shares one rolled progression. Codex progression tables show reference levels 1–100, not a gameplay cap. Pure SelfAoe buff spells apply their evaluated positive statuses directly to living same-team actors inside the authored radius, including the caster when eligible. They create no synthetic damage or healing event, do not mutate last-hit or PvP damage state, and use the normal bounded status registry: duplicate fixed-buff families merge, authored absolute expiry is preserved, and persisted or reconnected characters resume only the remaining lifetime rather than refreshing it.

DefenseDamage received from a raw 100-point hit
0100
2580
5066.6667
10050
20033.3333
50016.6667

Player guide

Status effects

Read your buffs and ailments, prepare the right potion and keep fighting through temporary effects.

Recognize buffs and ailments

Bleeding, Burning and Frozen are negative statuses; Renewal, Precision, Might, Ward and Haste are positive. Icons show remaining time near your resource gauges and on monster life bars. Each family also has its own detailed sixteen-frame sprite animation around the character, visible even when V hides life bars. Transparent layers and stable placement keep the character readable. Cosmetic effects never intercept aiming or change hitboxes. Blessings and Afflictions use space reserved for the full timer label, with a visible gap between entries. On narrow windows each group wraps within its own side of the HUD. The duration format and expiry times are unchanged.

Subtle buff sprites

Might, Ward, Precision and Haste use their authored cast sprites without an extra procedural release ring. Their cast sprites and persistent status sprites multiply the authored alpha by 0.5, preserving the colors, sixteen-frame animation and front/back placement. This is a visual reduction only: bonuses, area, durations, costs and cooldowns are unchanged. Negative status effects, Renewal and Healing Light retain their existing opacity.

Read remaining durations

Status and spell-cooldown labels use the same whole units: seconds below one minute, minutes from 60 seconds, and hours from 3600 seconds. Seconds round up; minutes and hours round down to completed units with no decimals (90 seconds = 1 min; 7560 seconds = 2h). These are display units only; status deadlines and spell recovery rules are unchanged.

Bleeding and Burning

A successful physical melee hit has a 20% chance to cause Bleeding for five seconds: each second deals 8% of the resolved triggering hit. Bone Spear applies Bleeding with a 35% chance, and Blood Nova with a 50% chance. Fireball applies Burning to each eligible hit target for four seconds, dealing 12% of the resolved hit per second. A dodge, a dead target or a hit causing no damage applies no offensive status. Periodic damage inherits the original defense and critical result; it does not roll another critical, apply defense again or trigger further statuses.

Frozen and Haste

Frost Shard applies Frozen for three seconds: movement speed falls by 25% and attack/cast cadence by 20%, without immobilizing the target. Elites receive 75% of that strength and duration; bosses receive 50%. Haste adds 15% movement speed and cadence. Frozen and Haste modifiers add together. Cadence affects preparation and recovery for newly started actions; an action already in progress and a spell’s own cooldown are unchanged.

Healing over time

Healing Light preserves its immediate healing and gives eligible living allied targets Renewal, including those already at full life. Renewal lasts 5 seconds at level 1, 15 seconds at level 100, 20 seconds at level 1000, with linear interpolation between milestones and the final duration capped thereafter. Each second it restores 8% of the evaluated initial healing power, before limiting by missing life. Its tick cadence and power ratio do not increase with spell level; only the duration follows this curve. It shares the initial critical roll and never resurrects dead targets. Periodic amounts are fixed at application, so changing equipment later does not retroactively increase them. Renewal continues for its remaining duration when its recipient or living caster changes worlds. Healing Light has distinct casting and release sprites: the release uses a separate sixteen-frame green/gold animation with transparent space around its silhouette. The artwork adds no healing ticks or area effects.

Cleanse afflictions

Cleanse is a beneficial self-centered area spell with the same authored base area as Healing Light. On release it removes Bleeding, Burning and Frozen from every eligible living player in the evaluated area while preserving Renewal, Might, Ward, Precision and Haste. Multiplayer eligibility follows Healing Light: a solo caster can support nearby players, while a caster in a party affects only self and current party members; enemies, other worlds and out-of-area players are untouched. Its cooldown follows the selected spell exemplar: 60 seconds at level 1, 40 seconds at level 100, 20 seconds at level 1000, interpolated linearly between milestones and capped at the final value. Cleanse does not heal, damage or restart preserved buffs. It reuses the reviewed Healing Light cast/release sprites; that artwork adds no gameplay effect.

Stacking and refreshing

Different families coexist, but only one effect of each family can affect a target, even with multiple attackers. Equal potency refreshes duration; a stronger application replaces the potency and refreshes duration. A weaker application cannot extend a stronger effect. Refreshing preserves the next periodic tick, so repeated hits neither postpone ticks indefinitely nor generate extra immediate ticks. Except for Healing Light's Renewal duration, hostile periodic effects and Frozen keep their authored durations regardless of soul or spell level; periodic amounts follow the existing attack/healing progression.

Buff potions

Precision Potion adds 8 percentage points of critical chance, respecting the existing cap. Might Potion adds 20% physical and magical damage; Ward Potion adds 25% physical and magical defense; Haste Potion adds 15% movement speed and attack/cast cadence. These buffs last 30 seconds; one, two and three Liquid Chaos doses extend them to 40, 50 and 60 seconds without increasing their bonuses. They work at full life and mana, support quick slots and allow deliberate use of locked copies without clearing protection from the remainder. Drinking cannot stack their power, and a dose that neither improves nor prolongs a buff is refused. The corresponding pure buff spells use the level of the selected spell exemplar: 5% at level 1, 30% at level 100, interpolated linearly and capped at the last milestone. For Precision these are additive percentage points of critical chance. Duration is 15 seconds at level 1, 120 seconds at level 10, 300 seconds at level 100, 3600 seconds at level 1000, with linear interpolation between milestones and the final duration as cap thereafter. These spell rules do not change potion bonuses or periodic effects. A weaker application cannot replace or extend a stronger buff; an equal-strength application may refresh only its deadline. Upgrading a spell changes subsequent casts, not a buff already active. Codex selectors show levels 1–100 as reference tables, not the gameplay cap.

Death, travel and offline duration

Statuses are authoritative on the server. Death removes them. World changes preserve personal buffs and remove hostile statuses. Stored absolute deadlines continue to elapse while offline or across a server restart; returning never restarts a full duration or applies missed ticks retroactively. Periodic damage follows world, team and PvP restrictions, interrupts recall and keeps combat locks active. A lethal periodic tick credits its author once through the normal death path, even if that author has died or disconnected. Rewards for an offline author are saved and delivered on their next login. Long spell buffs keep the same absolute expiry through saving and reconnecting; they are not truncated to the old 60-second runtime bound or restarted from a full hour.

Authored status & aura previews

The eight persistent status sheets are shown directly from the shipped PNGs. Start any player to inspect its sixteen authored frames.

Authored art
Bleeding16 authored frames · 1 s preview cyclefx/statuses/bleeding.png
Authored art
Burning16 authored frames · 1 s preview cyclefx/statuses/burning.png
Authored art
Frozen16 authored frames · 1 s preview cyclefx/statuses/frozen.png
Authored art
Haste16 authored frames · 1 s preview cyclefx/statuses/haste.png
Authored art
Might16 authored frames · 1 s preview cyclefx/statuses/might.png
Authored art
Precision16 authored frames · 1 s preview cyclefx/statuses/precision.png
Authored art
Renewal16 authored frames · 1 s preview cyclefx/statuses/renewal.png
Authored art
Ward16 authored frames · 1 s preview cyclefx/statuses/ward.png

Elite/Boss rank auras use a retained legacy procedural renderer and have no authored sprite sequence to preview. Player soul auras were removed in R34.8.1; this wiki does not recreate or restore them.

Know what hunts you

Bestiary

Discover enemy abilities, compare their statistics and find the souls and items they can drop.

monsters

Ashen Cult Mage

View details
aggressiveAuthored level 5
CharacteristicValue
Level5
Maximum life97.9786
Maximum mana48
Maximum life % / second0
Maximum mana % / second0.9
Physical damage2.8378
Magical damage12.5094
Physical defense1.5097
Magical defense6.0389
Dodge chance4%
Critical chance8%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Staff Strike, Fireball

Soul: Soul of the Ashen Mage

Open drop table

Source recordassets/entities/cult_mage/entity.json

monsters

Ashen Cultist

View details
aggressiveAuthored level 4
CharacteristicValue
Level4
Maximum life85.4813
Maximum mana0
Maximum life % / second0
Maximum mana % / second0
Physical damage7.5509
Magical damage1.0787
Physical defense5.9578
Magical defense4.4683
Dodge chance4%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Monster Slash

Soul: Soul of Ashen Cultist

Open drop table

Source recordassets/entities/ashen_cultist/entity.json

monsters

Black Bear

View details
neutralAuthored level 8
CharacteristicValue
Level8
Maximum life320.0842
Maximum mana0
Maximum life % / second0
Maximum mana % / second0
Physical damage21.3348
Magical damage0
Physical defense15.1852
Magical defense7.5926
Dodge chance4%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Maul

Soul: Soul of Black Bear

Open drop table

Source recordassets/entities/black_bear/entity.json

monsters

Blood Acolyte

View details
aggressiveAuthored level 7
CharacteristicValue
Level7
Maximum life134.0497
Maximum mana56
Maximum life % / second0
Maximum mana % / second0.8
Physical damage3.9955
Magical damage17.3139
Physical defense6.0806
Magical defense13.6813
Dodge chance4%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Blood Nova, Shadow Bolt

Soul: Soul of Blood Acolyte

Open drop table

Source recordassets/entities/blood_acolyte/entity.json

monsters

Bone Priest

View details
aggressiveAuthored level 8
CharacteristicValue
Level8
Maximum life134.1305
Maximum mana55
Maximum life % / second0
Maximum mana % / second0.8
Physical damage2.8446
Magical damage19.9125
Physical defense4.5556
Magical defense18.2223
Dodge chance4%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Bone Spear

Soul: Soul of Bone Priest

Open drop table

Source recordassets/entities/bone_priest/entity.json

monsters

Carrion Hound

View details
aggressiveAuthored level 4
CharacteristicValue
Level4
Maximum life89.865
Maximum mana0
Maximum life % / second0
Maximum mana % / second0
Physical damage7.5509
Magical damage0
Physical defense4.4683
Magical defense2.9789
Dodge chance4%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Carrion Bite

Soul: Soul of Carrion Hound

Open drop table

Source recordassets/entities/carrion_hound/entity.json

monsters

Corrupted Boar

View details
neutralAuthored level 6
CharacteristicValue
Level6
Maximum life188.6159
Maximum mana0
Maximum life % / second0
Maximum mana % / second0
Physical damage14.9211
Magical damage0
Physical defense12.145
Magical defense4.5544
Dodge chance4%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Tusk Gore, Sweeping Gore

Soul: Soul of Corrupted Boar

Open drop table

Source recordassets/entities/corrupted_boar/entity.json

monsters

Crypt Ghost

View details
aggressiveAuthored level 6
CharacteristicValue
Level6
Maximum life98.8608
Maximum mana50
Maximum life % / second0
Maximum mana % / second0.65
Physical damage1.2434
Magical damage12.4342
Physical defense3.0362
Magical defense13.6631
Dodge chance8%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Frost Shard

Soul: Soul of Crypt Ghost

Open drop table

Source recordassets/entities/crypt_ghost/entity.json

monsters

Crypt Knight

View details
aggressiveAuthored level 9
CharacteristicValue
Level9
Maximum life270.5132
Maximum mana0
Maximum life % / second0
Maximum mana % / second0
Physical damage19.6845
Magical damage3.0284
Physical defense24.2354
Magical defense10.603
Dodge chance4%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Monster Slash

Soul: Soul of Crypt Knight

Open drop table

Source recordassets/entities/crypt_knight/entity.json

monsters

Dark Prelate

View details
aggressiveAuthored level 12
CharacteristicValue
Level12
Maximum life478.4693
Maximum mana66
Maximum life % / second0
Maximum mana % / second1
Physical damage14.3563
Magical damage35.8909
Physical defense17.966
Magical defense26.949
Dodge chance4%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Shadow Bolt, Blood Nova, Bone Spear

Soul: Soul of Dark Prelate

Open drop table

Source recordassets/entities/dark_prelate/entity.json

monsters

Dire Wolf

View details
aggressiveAuthored level 5
CharacteristicValue
Level5
Maximum life119.4861
Maximum mana0
Maximum life % / second0
Maximum mana % / second0
Physical damage10.4245
Magical damage0
Physical defense6.0389
Magical defense3.0194
Dodge chance4%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Bite, Leaping Rend

Soul: Soul of Dire Wolf

Open drop table

Source recordassets/entities/dire_wolf/entity.json

monsters

Executioner

View details
aggressiveAuthored level 10
CharacteristicValue
Level10
Maximum life333.7038
Maximum mana0
Maximum life % / second0
Maximum mana % / second0
Physical damage27.3193
Magical damage0
Physical defense16.6053
Magical defense7.5479
Dodge chance4%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Monster Slash

Soul: Soul of Executioner

Open drop table

Source recordassets/entities/executioner/entity.json

monsters

Giant Rat

View details
neutralAuthored level 2
CharacteristicValue
Level2
Maximum life40.0436
Maximum mana0
Maximum life % / second0
Maximum mana % / second0
Physical damage3.8591
Magical damage0
Physical defense1.3377
Magical defense1.3377
Dodge chance4%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Gnaw

Soul: Soul of Giant Rat

Open drop table

Source recordassets/entities/giant_rat/entity.json

monsters

Grave Wraith

View details
aggressiveAuthored level 7
CharacteristicValue
Level7
Maximum life129.8165
Maximum mana56
Maximum life % / second0
Maximum mana % / second0.7
Physical damage2.6637
Magical damage15.982
Physical defense3.0403
Magical defense15.2015
Dodge chance4%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Shadow Bolt, Blood Nova

Soul: Soul of Grave Wraith

Open drop table

Source recordassets/entities/grave_wraith/entity.json

monsters

Skeleton Archer

View details
aggressiveAuthored level 5
CharacteristicValue
Level5
Maximum life83.6403
Maximum mana0
Maximum life % / second0
Maximum mana % / second0
Physical damage15.0577
Magical damage0
Physical defense4.5292
Magical defense4.5292
Dodge chance4%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Ranged Attack

Soul: Soul of Skeleton Archer

Open drop table

Source recordassets/entities/skeleton_archer/entity.json

monsters

Skeleton Warrior

View details
aggressiveAuthored level 4
CharacteristicValue
Level4
Maximum life93.1528
Maximum mana0
Maximum life % / second0
Maximum mana % / second0
Physical damage6.4722
Magical damage0
Physical defense10.4261
Magical defense2.9789
Dodge chance4%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Monster Slash

Soul: Soul of Skeleton Warrior

Open drop table

Source recordassets/entities/skeleton_warrior/entity.json

monsters

Wolf

View details
aggressiveAuthored level 3
CharacteristicValue
Level3
Maximum life68.6731
Maximum mana0
Maximum life % / second0
Maximum mana % / second0
Physical damage4.2407
Magical damage0
Physical defense4.3334
Magical defense0.7222
Dodge chance8%
Critical chance6%
Critical multiplier1.5×

Base stats only; excludes equipment bonuses.

Actions: Bite, Leaping Rend

Soul: Soul of the Dire Wolf

Open drop table

Source recordassets/entities/wolf/entity.json

Beyond the refuge

World & dungeons

Regional levels are fixed by authored content, not scaled to the current visitor.

RegionChunksAuthored recommended levels
Dark Road793–50
Dungeon Gate114–14
Haunted Woods693–40
Old Cemetery1063–50
Ruined Chapel333–48
Village11–1
5048454342403939383939404243454850484543413937363535353637394143454845434038363331292929313336384043454341383531282524232425283135384143423936312723201918192023273136394240373328231917151415171923283337403936312520171411911141720253136393935292419151163611151924293539383529231814931391418232935383935292419151163611151924293539393631252017141191114172025313639403733282319171514151719232833374042393631272320191819202327313639424341383531282524232425283135384143454340383633312929293133363840434548454341393736353535363739414345485048454342403939383939404243454850

North is up. Cells show authored recommended levels, not the level of every individual encounter. Legacy chunks retain their saved-content compatibility.

Player guide

Terraces, ramps and cliffs

Use connected routes to move between heights.

Connected routes

Terraces connect through ramps and stairs across the demo world. You can climb and descend a connected route; cliffs and open void block walking in both directions. There is no automatic jump or fall. The mouse selects supported ground at its visible height.

The demo landscape

The main world combines valleys, ridges and terraces with connected routes, contour trails and passes across region boundaries. Existing settlements, landmarks and dungeon entrances keep their positions and regional level progression. Follow a pass around a cliff instead of trying to cross its edge.

Area spells across heights

Area spells keep their classic sprite shapes and animations. The server checks their reach in three dimensions, so a nearby ally a little higher can still receive healing or cleansing. A larger vertical separation uses more of the available reach. At equal height, reach stays the same. Existing ally, world and spell eligibility rules still apply.

Directed attacks

Directed attacks also account for elevation: melee needs a connected ground route, while projectiles and beams can cross open space and strike terrain that blocks their flight. A projectile follows its released trajectory rather than tracing the hills underneath it.

Ruined chapel example

The ruined chapel east of the village contains an example terrace. From the village, approach its western ramp around world position(976,880). The terrace at(1232,880) also connects to southern stairs and a northern descent returning to low ground near(1232,1120). A collapsed pit and the terrace edges demonstrate blocked shortcuts.

Player guide

Dungeons and encounter ranks

Explore wider rooms, optional treasure branches and increasingly dangerous encounters.

Rooms and corridors

The Forgotten Crypt is a connected labyrinth with branching paths, dead ends, loops and optional treasure rooms. The boss occupies a room with maximum shortest-path depth from the entrance, calculated after loops are added. Depth counts room transitions, not straight-line distance or generation order. Outside room and corridor stone floors, chunk cells remain visually empty and impassable instead of displaying a dirt fill. Corridors and turns are three cells wide. Larger templates include a 26 × 24 boss arena. A seed reproduces the same layout and encounter composition. Normal encounter rooms use these weighted options: 60%: 1 group(s) of 2–6 monsters; 30%: 2 group(s) of 1–3 monsters; 10%: 3 group(s) of 1–2 monsters. Counts are sampled uniformly once from the seed and become fixed refill capacities. Groups share the encounter area while actor positions remain distinct, walkable and away from doors. Species vary where the pool permits and no room has more than 2 ranged/caster monsters. Elite and boss rooms contain exactly one ranked monster plus 2–4 Normal guards, with no duplicate boss. Entrance and treasure rooms remain free of forced combat. These are room-spawner budgets, not a cap on monsters drawn in from neighboring rooms.

Room terraces and slopes

Dungeon rooms occupy flat terraces that descend with their shortest-path depth from the entrance. Three-cell-wide corridors connect them through ramps or stairs with flat landings. Loops and optional branches remain traversable in both directions; a visual gap outside the stone floor is impassable. Elevation does not change the encounter and loot rules below.

Enemy levels and difficulty

Dungeon level comes from the entry region and portal minimum, with the profile minimum applied; it does not follow your equipped soul. For depth d (entrance depth zero) and difficulty D (at least one), normal encounter level is N = ceil(5 × dungeon level / 4) + 2d + 4(D − 1). Elite encounter level is ceil(6N / 5); boss level is ceil(3N / 2). Levels saturate at the unsigned 32-bit boundary. Existing monster stat and loot progression use these resulting levels.

Recognize elites and bosses

Elites carry a gold aura with a broken solar seal and rising filaments. Bosses carry a larger red double seal, eight thorns and a taller rear crown. These effects identify server-assigned encounter rank, independently of species or level, remain visible when V hides health bars, and disappear on death. Auras follow interpolated feet positions and never intercept aiming or clicks. The four rare buff-spell items—Might, Ward, Precision and Haste—have one authored acquisition source: the Dark Prelate, the Forgotten Crypt boss. They require source level 8, roll independently at sub-1% individual chances at that level, are never guaranteed, and remain below a 3% combined chance even after their individual caps are reached.

Boss respawn

The Boss-rank leader respawns one hour after its death in the same instance. This cooldown continues while its room is inactive or unloaded; an elapsed cooldown creates the boss when the room next becomes active. Normal guards keep their usual refill cadence. Instance expiration discards the cooldown, and a fresh instance has its boss available immediately. The reliquary has been removed. Its 14 loot rolls join the Dark Prelate’s 9 existing rolls without merging duplicate item entries or changing their authored parameters. All 23 rolls now use the monster death and durable party-reward pipeline: the boss’s effective level, category chance modifiers and rank-scaled fragment quantities, rather than the former container rules at instance level. At the same source level the four rare buffs retain their authored chance formula and minimum level 8. Other containers retain their existing loot and refill behavior.

Instance lifetime and return marks

Each dungeon entrance owns its live instance, shared by all players using that entrance; this is not a private instance per player. Two distinct entrances do not share an instance even if they use the same dungeon profile. An authored entrance retains its identity when its world chunk unloads and reloads. New generation rules apply when an instance is created; live instances keep their existing layout. Instances expire after three minutes without players and are not saved across server restarts; they do not reset on a daily schedule. Dungeon map exploration is scoped to the live instance incarnation, so reusing the same numeric instance ID with a new epoch never restores exploration from the older incarnation. /mark remains forbidden inside dungeons.

Read the odds

Drop tables

Containers retain authored chance = clamp(min(base + scaling × (source level − 1), cap), 0, 1). Monster drops apply the balance rules in the soul guide and combat guide. Guaranteed rows bypass the random roll, not the minimum-level gate. Independent rows are not normalized to total 100%. Quantities are per successful entry; source level controls both computed chance and fragment quantity.

drops

Ashen Cultist

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot18–2439.5%
Soul of Ashen CultistAuthored loot112.8%
Cultist RobeAuthored loot413.225%
Ashen Ritual CapeAuthored loot313.225%
Cultist CowlAuthored loot313.225%
Lesser Mana PotionAuthored loot1112%
Bronze CoinConfigured currency112–1833.3333%
Silver CoinConfigured currency11–28.3333%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/ashen_cultist/entity.json

drops

Ashroot

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

ItemSourceMin. levelQuantityChance
AshrootAuthored loot11100%

Refill: 60 seconds after the final item is removed.

Source recordassets/entities/ashroot_plant/entity.json

drops

Black Bear

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot123–6845.5%
Soul of Black BearAuthored loot113.2%
Bronze CoinConfigured currency114–2344.4444%
Silver CoinConfigured currency11–319.4444%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/black_bear/entity.json

drops

Blood Acolyte

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot119–5644%
Soul of Blood AcolyteAuthored loot113.1%
Cultist WandAuthored loot414.2%
Funeral VeilAuthored loot613.075%
Blood NovaAuthored loot613.04%
Shadow BoltAuthored loot412.24%
Health PotionAuthored loot1112%
Bronze CoinConfigured currency113–2241.6667%
Silver CoinConfigured currency11–216.6667%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/blood_acolyte/entity.json

drops

Bloodleaf

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

ItemSourceMin. levelQuantityChance
BloodleafAuthored loot11100%

Refill: 60 seconds after the final item is removed.

Source recordassets/entities/bloodleaf_plant/entity.json

drops

Bone Priest

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot123–6845.5%
Soul of Bone PriestAuthored loot113.2%
Bone StaffAuthored loot615.025%
Bone HoodAuthored loot413.525%
Bone HarnessAuthored loot412.775%
Bone SpearAuthored loot513.08%
Healing LightAuthored loot512.28%
CleanseAuthored loot512.28%
Greater Mana PotionAuthored loot1112%
Bronze CoinConfigured currency114–2344.4444%
Silver CoinConfigured currency11–319.4444%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/bone_priest/entity.json

drops

Carrion Hound

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot18–2439.5%
Soul of Carrion HoundAuthored loot112.8%
Bronze CoinConfigured currency112–1833.3333%
Silver CoinConfigured currency11–28.3333%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/carrion_hound/entity.json

drops

Corrupted Boar

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot115–4442.5%
Soul of Corrupted BoarAuthored loot113%
Bronze CoinConfigured currency113–2138.8889%
Silver CoinConfigured currency11–213.8889%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/corrupted_boar/entity.json

drops

Weathered Crypt Chest

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

ItemSourceMin. levelQuantityChance
Lesser Health PotionAuthored loot11–2100%
Lesser Mana PotionAuthored loot11–255%
Soul FragmentAuthored loot11–340%
Iron SwordAuthored loot113.5%
Iron HelmetAuthored loot113.5%
Leather ArmorAuthored loot113.5%
Leather PantsAuthored loot113.5%
Leather HoodAuthored loot113.5%
Padded CoifAuthored loot113.5%
Worn Traveller's CapeAuthored loot113.5%
Training TorchAuthored loot113.5%

Refill: 300 seconds after the final item is removed.

Source recordassets/entities/crypt_common_chest/entity.json

drops

Sealed Reliquary

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

ItemSourceMin. levelQuantityChance
Health PotionAuthored loot11–2100%
Greater Mana PotionAuthored loot1160%
Soul FragmentAuthored loot12–575%
Crypt KeyAuthored loot1118%
Worn BrigandineAuthored loot410%
Bone GreavesAuthored loot410%
Graveguard HelmAuthored loot710%
Cultist WandAuthored loot410%
Hunter's JerkinAuthored loot310%
Healing LightAuthored loot510%
CleanseAuthored loot510%

Refill: 600 seconds after the final item is removed.

Source recordassets/entities/crypt_elite_chest/entity.json

drops

Crypt Ghost

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot115–4442.5%
Soul of Crypt GhostAuthored loot113%
Frost ShardAuthored loot412.6%
Water WaveAuthored loot411.8%
Spectral ResidueAuthored loot1135%
Bronze CoinConfigured currency113–2138.8889%
Silver CoinConfigured currency11–213.8889%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/crypt_ghost/entity.json

drops

Crypt Knight

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot127–8147%
Soul of Crypt KnightAuthored loot113.3%
Graveguard MailAuthored loot814.35%
Graveguard HelmAuthored loot713.975%
Graveguard MantleAuthored loot613.6%
Funeral ShieldAuthored loot713.6%
Rusted LongswordAuthored loot114.35%
Bronze CoinConfigured currency114–2447.2222%
Silver CoinConfigured currency11–322.2222%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/crypt_knight/entity.json

drops

Ashen Cult Mage

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot111–4564%
Soul of Ashen Cult MageAuthored loot112.9%
Cultist WandAuthored loot414.8%
Cultist RobeAuthored loot413.3%
Cultist CowlAuthored loot313.3%
FireballAuthored loot312.96%
Lesser Mana PotionAuthored loot1118%
Monster BileAuthored loot1135%
Bronze CoinConfigured currency112–1936.1111%
Silver CoinConfigured currency11–211.1111%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/cult_mage/entity.json

drops

Dark Prelate

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot142–12551.5%
Soul of Dark PrelateAuthored loot113.6%
Bone StaffAuthored loot615.325%
Funeral VeilAuthored loot614.575%
Ashen Ritual CapeAuthored loot313.825%
Shadow BoltAuthored loot413.64%
Blood NovaAuthored loot613.64%
Bone SpearAuthored loot512.84%
Blue LightningAuthored loot812.44%
Crypt KeyAuthored loot11100%
Greater Health PotionAuthored loot11–2100%
Greater Mana PotionAuthored loot11–280%
Soul FragmentAuthored loot1166–333100%
Executioner's AxeAuthored loot819.825%
Bone StaffAuthored loot618.325%
Graveguard MailAuthored loot818.325%
Funeral ShieldAuthored loot716.825%
Blue LightningAuthored loot813.64%
Healing LightAuthored loot513.64%
CleanseAuthored loot513.64%
Might AuraAuthored loot810.355%
Ward AuraAuthored loot810.405%
Precision AuraAuthored loot810.2995%
Haste AuraAuthored loot810.244%
Bronze CoinConfigured currency117–2851.25%
Silver CoinConfigured currency11–426.25%
Gold CoinConfigured currency110.0025%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/dark_prelate/entity.json

drops

Dire Wolf

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot111–3441%
Soul of Dire WolfAuthored loot112.9%
Bronze CoinConfigured currency112–1936.1111%
Silver CoinConfigured currency11–211.1111%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/dire_wolf/entity.json

drops

Executioner

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot132–9548.5%
Soul of ExecutionerAuthored loot113.4%
Executioner's AxeAuthored loot915.925%
Bone GreavesAuthored loot413.675%
Worn BrigandineAuthored loot413.675%
Bronze CoinConfigured currency115–2550%
Silver CoinConfigured currency11–325%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/executioner/entity.json

drops

Ghostbloom

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

ItemSourceMin. levelQuantityChance
GhostbloomAuthored loot11100%

Refill: 60 seconds after the final item is removed.

Source recordassets/entities/ghostbloom_plant/entity.json

drops

Giant Rat

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot13–836.5%
Soul of Giant RatAuthored loot112.6%
Bronze CoinConfigured currency111–1627.7778%
Silver CoinConfigured currency112.7778%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/giant_rat/entity.json

drops

Grave Wraith

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot119–5644%
Soul of Grave WraithAuthored loot113.1%
Shadow BoltAuthored loot412.64%
Blood NovaAuthored loot611.84%
Bronze CoinConfigured currency113–2241.6667%
Silver CoinConfigured currency11–216.6667%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/grave_wraith/entity.json

drops

Herb Patch

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

ItemSourceMin. levelQuantityChance
HerbAuthored loot11100%

Refill: 60 seconds after the final item is removed.

Source recordassets/entities/herb_patch/entity.json

drops

Mooncap

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

ItemSourceMin. levelQuantityChance
MooncapAuthored loot11100%

Refill: 60 seconds after the final item is removed.

Source recordassets/entities/mooncap_plant/entity.json

drops

Skeleton Archer

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot111–3441%
Soul of Skeleton ArcherAuthored loot112.9%
Hunting BowAuthored loot315.55%
Hunter's QuiverAuthored loot313.3%
Hunter's JerkinAuthored loot313.3%
Hunter's CapeAuthored loot312.925%
Leather HoodAuthored loot113.3%
Bronze CoinConfigured currency112–1936.1111%
Silver CoinConfigured currency11–211.1111%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/skeleton_archer/entity.json

drops

Skeleton Warrior

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot18–2439.5%
Soul of Skeleton WarriorAuthored loot112.8%
Rusted LongswordAuthored loot115.475%
Bone GreavesAuthored loot413.225%
Bone HarnessAuthored loot413.225%
Rusted BucklerAuthored loot113.225%
Bone DustAuthored loot1135%
Bronze CoinConfigured currency112–1833.3333%
Silver CoinConfigured currency11–28.3333%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/skeleton_warrior/entity.json

drops

Wolf

View details

Each entry is an independent roll. Guaranteed entries still require their minimum source level.

Normal-rank monster. Eligible non-guaranteed soul chance is ×1.5 for Elite and ×3 for Boss; fragment quantities use ×2 and ×4 before rounding. Other listed chances do not change with rank.

ItemSourceMin. levelQuantityChance
Soul FragmentAuthored loot15–1663%
Soul of the Dire WolfAuthored loot112.7%
Beast MarrowAuthored loot1135%
Bronze CoinConfigured currency111–1730.5556%
Silver CoinConfigured currency115.5556%
Gold CoinConfigured currency110%

Each denomination has its own roll in addition to authored loot. Currency chances and quantities follow the source level shown in the exported table; neither changes with monster rank. Listed quantities are the global reward before party sharing.

Source recordassets/entities/wolf/entity.json

Authoritative economy

Stations & upgrades

Each +1 upgrade has a 1% chance to recycle the chosen exemplar, including locked items. Upgrade to max previews the level, cost, attempts and cumulative risk, then stops at the first break or resource limit. A failed spell upgrade recycles its whole carrier. Locked payment materials cannot be spent. Manual dismantling excludes locked or reserved exemplars. Fusion accepts locked but unreserved souls: 60% success, 40% failure with recycling of both candidates. Stay close to the station to complete the transaction.

StationPurpose
Soul AltarUpgrade, dismantle or fuse Souls
WorkbenchUpgrade or dismantle equipment
Chaos AltarUpgrade or dismantle spells
Alchemy StationBrew exact ingredient recipes and enhance potions
Trading PostBuy, sell and recover fixed-price lots

Alchemy: preparation, recipes and ingredient sources · Trading post: currencies, listings and returns

Complete equipment and spell cost/yield table
Current levelEquipment next upgradeSpell next upgradeDismantle
1881
234343
3808011
414614629
523223261
6338338111
7464464183
8610610281
9776776409
10962962571
1111681168771
12139413941013
13164016401301
14190619061639
15219221922031
16249824982481
17282428242993
18317031703571
19353635364219
20392239224941
21432843285741
22475447546623
23520052007591
24566656668649
25615261529801
266658665811051
277184718412403
287730773013861
298296829615429
308882888217111
319488948818911
32101141011420833
33107601076022881
34114261142625059
35121121211227371
36128181281829821
37135441354432413
38142901429035151
39150561505638039
40158421584241081
41166481664844281
42174741747447643
43183201832051171
44191861918654869
45200722007258741
46209782097862791
47219042190467023
48228502285071441
49238162381676049
50248022480280851
51258082580885851
52268342683491053
53278802788096461
542894628946102079
553003230032107911
563113831138113961
573226432264120233
583341033410126731
593457634576133459
603576235762140421
613696836968147621
623819438194155063
633944039440162751
644070640706170689
654199241992178881
664329843298187331
674462444624196043
684597045970205021
694733647336214269
704872248722223791
715012850128233591
725155451554243673
735300053000254041
745446654466264699
755595255952275651
765745857458286901
775898458984298453
786053060530310311
796209662096322479
806368263682334961
816528865288347761
826691466914360883
836856068560374331
847022670226388109
857191271912402221
867361873618416671
877534475344431463
887709077090446601
897885678856462089
908064280642477931
918244882448494131
928427484274510693
938612086120527621
948798687986544919
958987289872562591
969177891778580641
979370493704599073
989565095650617891
999761697616637099
1009960299602656701

Player guide

Alchemy

Gather ingredients, prepare an exact recipe and brew potions at the Alchemy Station.

Open the alchemy station

Approach an Alchemy Station and press E. Its Materials inventory stays open on the left, beside Preparation on the right. Harvest Bloodleaf, Mooncap, Ashroot and Ghostbloom plants, and collect the monster ingredients listed below. Ingredient links open their item records; source links lead to the creature or harvest drop table.

Prepare ingredients

Drag a material from Materials into Preparation, or click it to add one unit per potion. Adjust each ingredient amount directly; use × to remove an ingredient or Clear to reset ingredients and Liquid Chaos doses. The preparation is local: adding materials does not consume inventory. Dropping outside Preparation cancels the addition. Escape cancels an active drag without closing Preparation or changing the recipe.

Match a recipe

Ingredient order does not matter, but the ingredient types and quantities per potion must exactly match a recipe. Do not multiply Preparation amounts to make a batch: choose the batch quantity separately. Result shows the matching potion and its effects. A combination without a matching recipe cannot be brewed.

Enhance potions

Liquid Chaos is an optional enhancement, separate from recipe ingredients. Choose zero to three doses per potion; each dose adds 10% of base life/mana restoration. For Precision, Might, Ward and Haste potions, doses extend duration to 30, 40, 50 or 60 seconds without increasing the bonus. The entire batch uses the same dose setting and consumes that many Liquid Chaos units for each potion produced.

Brew one or a batch

Choose Brew one, Brew with your selected quantity, or Brew max. The preview lists total materials needed for the batch. Available stock excludes locked, protected and reserved materials; a changed inventory can reduce the prepared amounts or the maximum batch. Controls wait for the pending request to finish. The server rechecks ingredients, stock and station distance before committing the transaction; a rejected brew consumes nothing.

Reclaim potions

Open Reclaim potions to dismantle available potions into Liquid Chaos. Check the return before confirming: the exported table below gives the rounded Liquid Chaos return for each dose count. Reclaiming destroys the selected potions and does not return their recipe ingredients. Restoration from a consumed potion is still limited by the life or mana you are missing.

Alchemy recipes

RecipeExact ingredients per potionOutput
Precision PotionMooncap ×2, Bone Dust ×1Precision Potion
Might PotionBloodleaf ×2, Monster Bile ×1Might Potion
Ward PotionAshroot ×2, Spectral Residue ×1Ward Potion
Haste PotionGhostbloom ×2, Beast Marrow ×1Haste Potion
Lesser Health PotionBloodleaf ×1, Ashroot ×1Lesser Health Potion
Greater Mana PotionMooncap ×1, Ghostbloom ×1Greater Mana Potion
Health PotionBloodleaf ×2, Beast Marrow ×1Health Potion
Greater Mana PotionMooncap ×2, Spectral Residue ×1Greater Mana Potion
Health PotionAshroot ×2, Bone Dust ×1Health Potion
Greater Mana PotionGhostbloom ×2, Monster Bile ×1Greater Mana Potion
Restoration PotionBloodleaf ×1, Mooncap ×1, Monster Bile ×1Restoration Potion

Ingredient sources

Recipe inputs are order-independent but their ratios are exact. Batch size is capped at 1,000. Station transactions permit at most 10,000 inventory stacks. Potion enhancement accepts at most three Liquid Chaos doses; each dose adds 10% of base life/mana restoration. For buff potions, doses extend the duration to 40/50/60 seconds without increasing the bonus.

Potion dismantling

Added doses per potionLiquid Chaos returned per potion
01
10
21
31

Player guide

Death, persistence & PvP

The server owns the outcome.

Death and respawn

When your life reaches zero, movement and pending attacks stop. You respawn with full life and mana. In the authored world, the nearest soul altar is preferred; a missing altar falls back to the world's safe spawn. In an existing dungeon instance, the entry is the respawn point. The current player lifecycle preserves inventory, equipment, souls and preferences. While dead, local movement and map revelation remain stopped until your authoritative respawn.

What the server saves

Accounts and character possessions are stored on the server. Durable inventory changes are acknowledged only after the database commit. Movement and other non-economic state use periodic checkpoints, so a crash may lose a short interval of movement. Generated dungeon topology is transient; a saved character whose instance no longer exists returns to the safe world spawn.

Enable PvP

PvP is voluntary. Damage between players requires both players to be active in PvP. White names indicate PvP off; red names indicate PvP on. Press P to request a change; the client waits for server confirmation.

PvP delays and combat locks

Activation has a warm-up. Deactivation is held until the combat lock expires after the latest PvP interaction. The server preserves pending deadlines across reconnects. A projectile fired before its owner's opt-in cannot acquire PvP damage retroactively, and an opted-out player does not become an accidental projectile shield. Soul Altars and dungeon respawn entries protect a radius of 96 world units in their own world or instance. Sanctuary — combat disabled means no incoming or outgoing PvE/PvP, including melee, projectiles already in flight, areas and hostile effects. Existing hostile effects keep expiring but cannot deal damage there. Blocked attempts do not renew combat or PvP locks, so pending PvP OFF completes when the existing 10-second lock expires. Monsters disengage from protected players, return and recover life on a full reset, preventing repeated safe-zone attacks.

Player kill rewards

Player kills do not transfer inventory, generate souls or provide a kill reward. The wiki documents the default rules; it does not inspect a running server's overrides or expose player accounts.

Return home: /spawn, /mark and /recall

Returning to the main-world spawn requires a 5-second stationary channel, no damage exchange for 10 seconds, and a 120-second cooldown after success. Movement, an attack, a spell, damage, death or changing worlds interrupts it. Return damage locks include PvE and PvP. The cooldown and combat deadline survive reconnects; an interrupted channel does not. A successful return does not restore life or mana and does not turn PvP off. /mark saves or replaces the exact current walkable destination only while alive, out of combat and persistence-ready. /recall uses the same channel, combat lock and successful-return cooldown as /spawn. A running channel keeps the admitted target even if the preference changes. Main-world marks have no expiration and survive restart. /mark is forbidden inside dungeons and a rejected attempt preserves the previous mark. Dungeons still expire after three minutes without players and are not persisted across server restarts. Existing legacy dungeon marks require the same still-live incarnation, so a recycled instance ID cannot capture them. Invalid, expired or newly blocked marks fail without fallback or recreation.

Default server timingsValue
Simulation30 ticks / second
Return channel5 seconds
Return damage lock10 seconds
Return cooldown after success120 seconds
PvP activation warm-up3 seconds
PvP combat lock10 seconds
Respawn delay1.5 seconds
Loose item expiration600 seconds (configurable at server startup)

Player guide

Currencies & trading post

Keep your coins, compare whole lots and trade safely at the settlement counter.

Three independent currencies

Bronze, Silver and Gold are separate inventory currencies. Your carrying caps are 100000 Bronze, 10000 Silver and 1000 Gold. There is no automatic conversion between denominations. Locked or reserved coins cannot fund a purchase.

Earn coins and respect caps

Monster coin rewards are independent rolls in addition to authored item drops. Each denomination has authored level points for chance and successful-drop quantity bounds. Between points the authoritative Rust evaluator interpolates linearly; at and above the last point it keeps the final values. A failed roll is the zero-coin outcome, so a materialized currency reward always contains at least one coin. The drop tables below use server-exported values for the selected level; the wiki does not recompute the curve. Monster rank changes neither chance nor quantity.

Find the trading post

Approach the trading post near the main-world settlement and interact while alive. Buy lists active offers, Sell selects your own goods, and Pending shows deposits waiting to return. The server checks your position again while processing a request. Moving away or dying can prevent a new operation.

Read the whole lot price

A displayed price applies to the entire lot. Every positive Bronze, Silver and Gold component must be paid together. Read the item level, upgrades, spell progression and actual fused-soul properties before confirming. A purchase gives that lot directly to you and is never divided among your party.

List your goods

Select an available, unlocked item and an exact quantity in Sell. Equipped, locked or reserved goods are unavailable. Review the full lot and price in the confirmation before submitting. You may own at most 20 deposits, including cancelled lots waiting to return.

Cancel and recover a deposit

Listing removes the selected goods from your inventory into escrow. Cancelling an active listing returns the whole lot immediately when it fits. Otherwise the deposit moves to Pending; use Return there once your inventory can accept all its contents. Pending deposits continue to occupy a slot. The seller must also have room for every payment denomination or the purchase is refused.

Filter and browse offers

Use search, category, level bounds, enabled payment denominations, affordable-only and sorting to narrow the offers. Enabling several denominations permits mixed prices using those denominations. Follow Next whenever it is offered, even after a short or empty page: filtering can require scanning another part of the market.

Wait for confirmation and retry safely

An offer may change while you read it. A stale offer is refused and refreshed rather than silently buying different goods. Wait for the server receipt and inventory update; the interface does not grant goods before confirmation. If a connection is lost, reconnect with the same account and return to a trading post to retry the saved operation. Repeating that operation recovers its receipt without paying or delivering twice.

Player guide

Parties & cooperation

Adventure together with explicit invitations, shared monster rewards and friendly healing.

Invite and manage members

A party supports 4 members. Invite another online player and let them accept; an invitation expires after 60 seconds. The leader manages membership. Leaving, removing a member or disbanding changes the party for future actions.

Reconnect to your party

A disconnected member keeps their place for 120 seconds. Reconnecting within that grace rejoins the same party. Presence and invitations are temporary social state, not an extra persistent character inventory.

Heal allies and prevent friendly damage

Party members can heal one another and cannot damage each other through ordinary player-versus-player attacks. These checks use current server membership, so enabling PvP does not override party protection. Leaving a party changes the eligibility of later actions.

Freeze eligible monster rewards

A monster reward takes one snapshot of eligible party members in the same world within 1024 world units. The snapshot includes nearby living members and a nearby fallen member still engaged in that fight. Moving or changing membership afterwards does not reroll that snapshot.

Share materials and exemplars

Currencies and passive material or upgrade-material stacks conserve the monster's rolled quantity and divide it as evenly as whole units allow across the eligible snapshot. Bronze, Silver and Gold each keep an independent remainder rotation, and each material identity keeps its own rotation, so unrelated loot cannot decide who receives the next rare remainder. Equipment, standalone spells and Souls instead choose one recipient per exemplar. Inventory saturation can leave a saved share undelivered; it never multiplies the reward or rerolls a unique item.

Keep personal rewards personal

Only the monster reward path shares party loot. Trading-post purchases, cancelled-deposit returns, direct inventory grants and other personal rewards remain private. Your loot feed describes only the goods actually delivered to your character.

Player guide

Chat channels & privacy

Choose the audience before sending a message.

Global and local audiences

Global chat reaches the connected server population. Local chat reaches nearby players in the same world instance within 1024 world units. Being at matching coordinates in another instance does not make a player a local recipient.

Party chat and whispers

Party chat reaches your current party. A whisper reaches its named recipient, with a copy for its sender; unrelated players do not receive it. Select the channel or use the commands shown by /help. Command feedback and delivery errors are private to you.

Message limits

Messages have size and rate limits. Empty, invalid or over-limit messages are rejected rather than broadcast partially. The client retains a bounded chat history; a reconnect does not expose somebody else’s private messages.

Moderation and privacy

Accepted messages are recorded by the server for moderation, including the channel and participants. Party messages and whispers are private from other players, but are not secret from the server operator. Do not send passwords or other credentials in chat.

Player chat commands

Command feedback is private; channel messages use their selected audience. Open chat with Enter; Tab completes commands and Up/Down browse your history. Use /help in game to see the available commands.

CommandPurpose
/help [command]Private command list or detailed help.
/spawnChannel a protected return to the main-world spawn.
/markSave your exact location while alive and out of combat.
/recallReturn to your saved mark; shares /spawn channel and cooldown rules.
/cancelCancel a return without consuming its cooldown.
/unstuckAlias of /spawn; identical combat and cooldown rules.
/whereCurrent world, coordinates and regional difficulty.
/statsEffective character statistics, including equipment and soul.
/pvp [on|off]Inspect or request PvP with the same rules as P.
/pingMeasured client latency and server version/protocol.
/clearClear only your local chat display.
/party [invite <player>|accept|decline|leave|kick <player>|promote <player>|list]Manage your party. Player names may contain spaces.

/spawn and /unstuck return to a walkable position near the authored main-world spawn. /mark saves the current exact walkable world position while alive, out of combat and after persistence is ready. /recall channels to that admitted mark; new dungeon marks are forbidden. A legacy dungeon mark remains valid only for the same live incarnation. Reused or expired instances and blocked destinations fail without fallback. The channel, its interruption rules and the post-success cooldown apply to /spawn, /unstuck and /recall. Moving, acting, damage, death, world changes or /cancel interrupt without consuming the cooldown. A successful return restores neither life nor mana and is confirmed only after durable storage.

Online players: press O outside chat and conflicting panels. The server-wide list refreshes at most every five seconds and displays only name and effective PvP state.

Reference

Assets API

The complete authored assets/api.json, with an index of its definitions. JSON is displayed as written data; constraints are not interpreted. Local JSON Pointer references open the containing document or definition. References are never expanded or fetched.

Definition index

Assets API

Complete API document

Self-contained Generic 2D World Entity Content API — V10

Content API v10: generic rigs/animations/entities/items/worlds, exact-identity inventory objects, tradeable monster Souls, authored persistent monster spawners, and unified refillable loot containers. Item actions are defined solely by granted_actions.

View complete JSON and references

References

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "api.json",
  "title": "Self-contained Generic 2D World Entity Content API \u2014 V10",
  "description": "Content API v10: generic rigs/animations/entities/items/worlds, exact-identity inventory objects, tradeable monster Souls, authored persistent monster spawners, and unified refillable loot containers. Item actions are defined solely by granted_actions.",
  "x-api-version": 10,
  "oneOf": [
    {
      "$ref": "#/$defs/rig_part"
    },
    {
      "$ref": "#/$defs/item"
    },
    {
      "$ref": "#/$defs/entity"
    },
    {
      "$ref": "#/$defs/world"
    },
    {
      "$ref": "#/$defs/animation"
    }
  ],
  "$defs": {
    "identifier": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_-]*$",
      "minLength": 1
    },
    "asset_png": {
      "type": "string",
      "minLength": 1,
      "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\\\]+\\.png$",
      "description": "PNG path relative to the JSON document that contains this property. Absolute paths, backslashes and parent-directory traversal (..) are forbidden. The runtime also validates file existence, PNG signature and expected dimensions."
    },
    "point2_pixel": {
      "type": "array",
      "prefixItems": [
        {
          "type": "number",
          "minimum": 0,
          "maximum": 31
        },
        {
          "type": "number",
          "minimum": 0,
          "maximum": 31
        }
      ],
      "items": false,
      "minItems": 2,
      "maxItems": 2
    },
    "point2": {
      "type": "array",
      "prefixItems": [
        {
          "type": "number"
        },
        {
          "type": "number"
        }
      ],
      "items": false,
      "minItems": 2,
      "maxItems": 2
    },
    "uvec2": {
      "type": "array",
      "prefixItems": [
        {
          "type": "integer",
          "minimum": 1
        },
        {
          "type": "integer",
          "minimum": 1
        }
      ],
      "items": false,
      "minItems": 2,
      "maxItems": 2
    },
    "directional_point": {
      "type": "object",
      "required": [
        "n",
        "ne",
        "e",
        "se",
        "s",
        "sw",
        "w",
        "nw"
      ],
      "additionalProperties": false,
      "properties": {
        "n": {
          "$ref": "#/$defs/point2_pixel"
        },
        "ne": {
          "$ref": "#/$defs/point2_pixel"
        },
        "e": {
          "$ref": "#/$defs/point2_pixel"
        },
        "se": {
          "$ref": "#/$defs/point2_pixel"
        },
        "s": {
          "$ref": "#/$defs/point2_pixel"
        },
        "sw": {
          "$ref": "#/$defs/point2_pixel"
        },
        "w": {
          "$ref": "#/$defs/point2_pixel"
        },
        "nw": {
          "$ref": "#/$defs/point2_pixel"
        }
      }
    },
    "directional_scalar": {
      "type": "object",
      "required": [
        "n",
        "ne",
        "e",
        "se",
        "s",
        "sw",
        "w",
        "nw"
      ],
      "additionalProperties": false,
      "properties": {
        "n": {
          "type": "number"
        },
        "ne": {
          "type": "number"
        },
        "e": {
          "type": "number"
        },
        "se": {
          "type": "number"
        },
        "s": {
          "type": "number"
        },
        "sw": {
          "type": "number"
        },
        "w": {
          "type": "number"
        },
        "nw": {
          "type": "number"
        }
      },
      "description": "Eight independently authored direction-dependent numeric values. No direction is synthesized by mirroring."
    },
    "visual_tint": {
      "type": "string",
      "enum": [
        "skin",
        "none"
      ]
    },
    "rig_visual": {
      "type": "object",
      "required": [
        "id",
        "depth"
      ],
      "additionalProperties": false,
      "properties": {
        "id": {
          "$ref": "#/$defs/identifier"
        },
        "image": {
          "$ref": "#/$defs/asset_png",
          "description": "Optional rig-owned PNG path relative to this rig-part JSON. If omitted, the runtime resolves the visual from the spawning entity folder: sprites/rig/<body_type>/<visual_id>.png when an appearance/body_type exists, otherwise sprites/rig/<visual_id>.png."
        },
        "pivot": {
          "$ref": "#/$defs/directional_point"
        },
        "attach_to": {
          "$ref": "#/$defs/identifier"
        },
        "tint": {
          "$ref": "#/$defs/visual_tint",
          "default": "skin"
        },
        "occlusion_tag": {
          "$ref": "#/$defs/identifier"
        },
        "depth": {
          "$ref": "#/$defs/directional_scalar",
          "description": "Direction-dependent semantic intra-entity layer depth; mapped to a small local-Z offset."
        },
        "active_depth": {
          "type": "number",
          "description": "Optional semantic depth used while the active animation clip depth_window is active."
        }
      }
    },
    "rig_part": {
      "title": "RigPart",
      "type": "object",
      "required": [
        "$schema",
        "schema_version",
        "id",
        "pivot"
      ],
      "additionalProperties": false,
      "properties": {
        "$schema": {
          "type": "string",
          "pattern": "api\\.json#/\\$defs/rig_part$"
        },
        "schema_version": {
          "type": "integer",
          "const": 8
        },
        "id": {
          "$ref": "#/$defs/identifier"
        },
        "parent": {
          "oneOf": [
            {
              "$ref": "#/$defs/identifier"
            },
            {
              "type": "null"
            }
          ]
        },
        "attach_to": {
          "$ref": "#/$defs/identifier"
        },
        "pivot": {
          "$ref": "#/$defs/directional_point"
        },
        "sockets": {
          "type": "object",
          "propertyNames": {
            "$ref": "#/$defs/identifier"
          },
          "additionalProperties": {
            "$ref": "#/$defs/directional_point"
          },
          "default": {}
        },
        "visuals": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/rig_visual"
          },
          "default": []
        },
        "hair_anchor": {
          "type": "boolean",
          "default": false
        }
      }
    },
    "effect": {
      "type": "object",
      "required": [
        "type"
      ],
      "properties": {
        "type": {
          "$ref": "#/$defs/identifier"
        },
        "status": {
          "$ref": "#/$defs/status_application"
        }
      },
      "additionalProperties": true
    },
    "item_visual_piece": {
      "type": "object",
      "required": [
        "image",
        "bone",
        "depth"
      ],
      "additionalProperties": false,
      "properties": {
        "image": {
          "$ref": "#/$defs/asset_png",
          "description": "PNG path relative to the item.json that owns this equipment piece."
        },
        "bone": {
          "$ref": "#/$defs/identifier"
        },
        "attach_to": {
          "$ref": "#/$defs/identifier"
        },
        "pivot": {
          "$ref": "#/$defs/directional_point"
        },
        "depth": {
          "$ref": "#/$defs/directional_scalar",
          "description": "Direction-dependent semantic intra-entity layer depth; mapped to a small local-Z offset."
        },
        "rotation": {
          "$ref": "#/$defs/directional_scalar",
          "description": "Optional static local rotation in radians around the piece pivot/attachment. Useful for weapons whose blade should not be collinear with the arm."
        },
        "active_depth": {
          "type": "number",
          "description": "Optional semantic depth used while the active animation clip depth_window is active."
        }
      }
    },
    "equippable": {
      "type": "object",
      "required": [
        "slot"
      ],
      "allOf": [
        {
          "if": {
            "properties": {
              "slot": {
                "enum": [
                  "head",
                  "body",
                  "legs",
                  "weapon",
                  "offhand",
                  "back"
                ]
              }
            },
            "required": [
              "slot"
            ]
          },
          "then": {
            "required": [
              "pieces"
            ],
            "properties": {
              "pieces": {
                "minItems": 1
              }
            }
          }
        }
      ],
      "additionalProperties": false,
      "properties": {
        "slot": {
          "$ref": "#/$defs/identifier"
        },
        "hides": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/identifier"
          },
          "uniqueItems": true,
          "default": []
        },
        "pieces": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/item_visual_piece"
          },
          "default": []
        }
      }
    },
    "consumable": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "consume_amount": {
          "type": "integer",
          "minimum": 1,
          "default": 1,
          "maximum": 18446744073709551615
        },
        "effects": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/effect"
          },
          "default": []
        }
      }
    },
    "item": {
      "title": "ItemDefinition",
      "type": "object",
      "required": [
        "$schema",
        "schema_version",
        "id",
        "sprite"
      ],
      "additionalProperties": false,
      "properties": {
        "$schema": {
          "type": "string",
          "pattern": "api\\.json#/\\$defs/item$"
        },
        "schema_version": {
          "type": "integer",
          "const": 9
        },
        "id": {
          "$ref": "#/$defs/identifier"
        },
        "name": {
          "type": "string",
          "minLength": 1
        },
        "tags": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/identifier"
          },
          "uniqueItems": true,
          "default": []
        },
        "sprite": {
          "$ref": "#/$defs/asset_png",
          "description": "Square single-view South-facing UI-only item icon. Inventory UI draws the full image with full UVs."
        },
        "deletable": {
          "type": "boolean",
          "default": true
        },
        "equippable": {
          "$ref": "#/$defs/equippable"
        },
        "consumable": {
          "$ref": "#/$defs/consumable"
        },
        "stats": {
          "$ref": "#/$defs/item_stats"
        },
        "granted_actions": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/identifier"
          },
          "uniqueItems": true,
          "default": []
        },
        "soul_identity": {
          "$ref": "#/$defs/soul_item_identity"
        },
        "currency": {
          "type": "string",
          "enum": [
            "bronze",
            "silver",
            "gold"
          ],
          "description": "Optional typed currency denomination. Currency items remain ordinary inventory items and must be passive."
        }
      },
      "description": "Tradeable item definition. Inventory stacks have no authored capacity or footprint: exact ItemInstance identity stacks up to u64::MAX and occupies one UI cell."
    },
    "controller": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "kind": {
          "type": "string",
          "minLength": 1,
          "default": "player"
        }
      }
    },
    "movement": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "speed": {
          "type": "number",
          "minimum": 0,
          "default": 120
        },
        "mode": {
          "type": "string",
          "minLength": 1,
          "default": "ground"
        },
        "sprint_multiplier": {
          "type": "number",
          "minimum": 1.0,
          "default": 1.65,
          "description": "Multiplier applied to base movement speed while the player sprint input is held."
        }
      }
    },
    "appearance": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "body_type": {
          "type": "string",
          "enum": [
            "slim",
            "standard",
            "broad"
          ]
        },
        "skin_tone": {
          "type": "string",
          "enum": [
            "light",
            "tan",
            "brown",
            "dark"
          ]
        },
        "hair_style": {
          "type": "string",
          "enum": [
            "bald",
            "short",
            "long"
          ]
        },
        "hair_color": {
          "type": "string",
          "enum": [
            "black",
            "brown",
            "blond",
            "red",
            "white"
          ]
        },
        "hair_back_depth": {
          "$ref": "#/$defs/directional_scalar",
          "description": "Per-facing local depth for the authored rear-hair layer. Current hair-bearing entities author this explicitly."
        }
      }
    },
    "rig_root": {
      "type": "object",
      "required": [
        "part"
      ],
      "additionalProperties": false,
      "properties": {
        "part": {
          "$ref": "#/$defs/identifier"
        },
        "offset": {
          "$ref": "#/$defs/directional_vec2",
          "description": "Per-facing entity-local offset from the gameplay/world origin (ground point between the feet) to this root bone. Values use Bevy local coordinates (+Y upward)."
        }
      }
    },
    "entity_rig": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "roots": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/rig_root"
          },
          "default": []
        },
        "library": {
          "$ref": "#/$defs/identifier",
          "description": "Rig-part library folder name under assets/rigs/."
        },
        "animation_library": {
          "$ref": "#/$defs/identifier",
          "description": "Optional animation library. Defaults to library, allowing morphology variants to reuse compatible clips without duplicating them."
        }
      },
      "required": [
        "library"
      ]
    },
    "simple_sprite": {
      "type": "object",
      "required": [
        "image"
      ],
      "additionalProperties": false,
      "properties": {
        "image": {
          "$ref": "#/$defs/asset_png",
          "description": "PNG path relative to the entity.json that owns this sprite."
        },
        "cell_size": {
          "$ref": "#/$defs/uvec2",
          "default": [
            32,
            32
          ]
        },
        "columns": {
          "type": "integer",
          "minimum": 1,
          "default": 1
        },
        "rows": {
          "type": "integer",
          "minimum": 1,
          "default": 1
        },
        "frame_count": {
          "type": "integer",
          "minimum": 1,
          "default": 1
        },
        "fps": {
          "type": "number",
          "minimum": 0,
          "default": 0
        },
        "looping": {
          "type": "boolean",
          "default": false
        },
        "anchor": {
          "$ref": "#/$defs/point2",
          "default": [
            16,
            16
          ]
        },
        "offset": {
          "$ref": "#/$defs/point2",
          "default": [
            0,
            0
          ]
        },
        "depth": {
          "type": "number",
          "default": 0,
          "description": "Semantic intra-entity layer depth. The runtime maps this to a small local-Z offset so world-level Y sorting remains authoritative."
        },
        "source_scale": {
          "type": "integer",
          "minimum": 1,
          "maximum": 8,
          "default": 4,
          "description": "Source PNG pixels per logical sprite pixel. Defaults to ART_DENSITY (4)."
        }
      }
    },
    "item_stack": {
      "type": "object",
      "required": [
        "item"
      ],
      "additionalProperties": false,
      "properties": {
        "item": {
          "$ref": "#/$defs/identifier"
        },
        "quantity": {
          "type": "integer",
          "minimum": 1,
          "default": 1,
          "maximum": 18446744073709551615
        }
      }
    },
    "inventory": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "items": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/item_stack"
          },
          "default": []
        }
      }
    },
    "entity_equipment": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "auto_first_per_slot": {
          "type": "boolean",
          "default": false
        },
        "loadout": {
          "type": "object",
          "propertyNames": {
            "$ref": "#/$defs/identifier"
          },
          "additionalProperties": {
            "$ref": "#/$defs/identifier"
          },
          "default": {}
        }
      }
    },
    "interactable": {
      "type": "object",
      "required": [
        "radius"
      ],
      "additionalProperties": false,
      "properties": {
        "radius": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "actions": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/effect"
          },
          "default": []
        },
        "kind": {
          "$ref": "#/$defs/identifier",
          "default": ""
        }
      }
    },
    "loot_container": {
      "type": "object",
      "required": [
        "full_sprite",
        "empty_sprite"
      ],
      "additionalProperties": false,
      "properties": {
        "refill_seconds": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "full_sprite": {
          "$ref": "#/$defs/simple_sprite"
        },
        "empty_sprite": {
          "$ref": "#/$defs/simple_sprite"
        }
      }
    },
    "projectile": {
      "type": "object",
      "required": [
        "speed"
      ],
      "additionalProperties": false,
      "properties": {
        "speed": {
          "type": "number",
          "exclusiveMinimum": 0
        }
      }
    },
    "lifetime": {
      "type": "object",
      "required": [
        "seconds"
      ],
      "additionalProperties": false,
      "properties": {
        "seconds": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "on_expire_spawn": {
          "$ref": "#/$defs/identifier"
        }
      }
    },
    "entity": {
      "title": "EntityDefinition",
      "type": "object",
      "required": [
        "$schema",
        "schema_version",
        "id"
      ],
      "additionalProperties": false,
      "allOf": [
        {
          "not": {
            "required": [
              "loot_container",
              "sprites"
            ]
          }
        }
      ],
      "properties": {
        "$schema": {
          "type": "string",
          "pattern": "api\\.json#/\\$defs/entity$"
        },
        "schema_version": {
          "type": "integer",
          "const": 10
        },
        "id": {
          "$ref": "#/$defs/identifier"
        },
        "name": {
          "type": "string",
          "minLength": 1
        },
        "tags": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/identifier"
          },
          "uniqueItems": true,
          "default": []
        },
        "scale": {
          "type": "number",
          "exclusiveMinimum": 0,
          "default": 4
        },
        "controller": {
          "$ref": "#/$defs/controller"
        },
        "movement": {
          "$ref": "#/$defs/movement"
        },
        "appearance": {
          "$ref": "#/$defs/appearance"
        },
        "inventory_sprite": {
          "$ref": "#/$defs/asset_png",
          "description": "Optional square single-view South-facing inventory/UI icon. Required by the runtime when soul is configured; never used for world presentation."
        },
        "rig": {
          "$ref": "#/$defs/entity_rig"
        },
        "sprites": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/simple_sprite"
          },
          "default": []
        },
        "inventory": {
          "$ref": "#/$defs/inventory"
        },
        "equipment": {
          "$ref": "#/$defs/entity_equipment"
        },
        "interactable": {
          "$ref": "#/$defs/interactable"
        },
        "loot_container": {
          "$ref": "#/$defs/loot_container"
        },
        "projectile": {
          "$ref": "#/$defs/projectile"
        },
        "lifetime": {
          "$ref": "#/$defs/lifetime"
        },
        "animation_bindings": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/$defs/identifier"
          },
          "description": "Arbitrary gameplay/action name -> clip id bindings. Keys are not schema-enumerated."
        },
        "stats": {
          "$ref": "#/$defs/entity_stats"
        },
        "soul": {
          "$ref": "#/$defs/soul_definition"
        },
        "combat_radius": {
          "type": "number",
          "default": 20,
          "exclusiveMinimum": 0,
          "description": "Gameplay collision/combat radius used for generous hit tests."
        },
        "actions": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/identifier"
          },
          "uniqueItems": true,
          "default": []
        },
        "loot_table": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/loot_entry"
          },
          "default": []
        },
        "behavior": {
          "$ref": "#/$defs/actor_behavior"
        },
        "death_profile": {
          "$ref": "#/$defs/death_profile"
        },
        "portal": {
          "$ref": "#/$defs/portal"
        }
      },
      "description": "Reusable world-entity definition. The entity Transform.translation is its gameplay/world origin; all visuals and rig roots are relative to it."
    },
    "facing": {
      "type": "string",
      "enum": [
        "north",
        "north_east",
        "east",
        "south_east",
        "south",
        "south_west",
        "west",
        "north_west",
        "n",
        "ne",
        "e",
        "se",
        "s",
        "sw",
        "so",
        "w",
        "o",
        "nw",
        "no"
      ]
    },
    "world_spawn": {
      "type": "object",
      "required": [
        "entity",
        "position"
      ],
      "additionalProperties": false,
      "properties": {
        "entity": {
          "$ref": "#/$defs/identifier"
        },
        "position": {
          "$ref": "#/$defs/point2"
        },
        "facing": {
          "$ref": "#/$defs/facing"
        },
        "velocity": {
          "$ref": "#/$defs/point2"
        },
        "kind": {
          "type": "string"
        }
      }
    },
    "world": {
      "title": "WorldDefinition",
      "type": "object",
      "required": [
        "$schema",
        "schema_version",
        "id",
        "chunks"
      ],
      "additionalProperties": false,
      "properties": {
        "$schema": {
          "type": "string",
          "pattern": "api\\.json#/\\$defs/world$"
        },
        "schema_version": {
          "type": "integer",
          "const": 9
        },
        "id": {
          "$ref": "#/$defs/identifier"
        },
        "seed": {
          "type": "integer",
          "minimum": 0,
          "default": 0
        },
        "regions": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/identifier"
          },
          "uniqueItems": true,
          "default": []
        },
        "chunks": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "pattern": "^chunks/.+\\.json$"
          },
          "uniqueItems": true
        },
        "spawn_position": {
          "$ref": "#/$defs/point2"
        }
      },
      "description": "R24 chunked world manifest. Terrain/entities/spawners live in independently streamable chunk documents."
    },
    "animation_rotation_keyframe": {
      "type": "object",
      "required": [
        "t",
        "value"
      ],
      "additionalProperties": false,
      "properties": {
        "t": {
          "type": "number",
          "minimum": 0,
          "maximum": 1
        },
        "value": {
          "$ref": "#/$defs/directional_scalar"
        }
      }
    },
    "animation_translation_keyframe": {
      "type": "object",
      "required": [
        "t",
        "value"
      ],
      "additionalProperties": false,
      "properties": {
        "t": {
          "type": "number",
          "minimum": 0,
          "maximum": 1
        },
        "value": {
          "$ref": "#/$defs/directional_vec2"
        }
      }
    },
    "animation_track": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "translation": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/animation_translation_keyframe"
          }
        },
        "rotation": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/animation_rotation_keyframe"
          }
        }
      }
    },
    "animation_event": {
      "type": "object",
      "required": [
        "t",
        "name"
      ],
      "additionalProperties": false,
      "properties": {
        "t": {
          "type": "number",
          "minimum": 0,
          "maximum": 1
        },
        "name": {
          "$ref": "#/$defs/identifier"
        },
        "params": {
          "type": "object",
          "additionalProperties": true
        }
      }
    },
    "animation": {
      "type": "object",
      "required": [
        "$schema",
        "schema_version",
        "id",
        "duration",
        "looping",
        "tracks"
      ],
      "additionalProperties": false,
      "properties": {
        "$schema": {
          "type": "string"
        },
        "schema_version": {
          "const": 8
        },
        "id": {
          "$ref": "#/$defs/identifier"
        },
        "name": {
          "type": "string"
        },
        "duration": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "looping": {
          "type": "boolean"
        },
        "tracks": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/$defs/animation_track"
          }
        },
        "events": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/animation_event"
          }
        },
        "depth_window": {
          "type": "array",
          "minItems": 2,
          "maxItems": 2,
          "items": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "description": "Optional normalized [start,end] window that enables visual active_depth."
        },
        "sample_fps": {
          "type": "number",
          "exclusiveMinimum": 0,
          "description": "Optional visual sampling rate in frames per second. The animation player quantizes the sampled pose to this rate while elapsed time stays continuous."
        }
      }
    },
    "vec2": {
      "type": "array",
      "minItems": 2,
      "maxItems": 2,
      "prefixItems": [
        {
          "type": "number"
        },
        {
          "type": "number"
        }
      ],
      "description": "Unbounded 2D vector used for animation translation offsets."
    },
    "directional_vec2": {
      "type": "object",
      "required": [
        "n",
        "ne",
        "e",
        "se",
        "s",
        "sw",
        "w",
        "nw"
      ],
      "additionalProperties": false,
      "properties": {
        "n": {
          "$ref": "#/$defs/vec2"
        },
        "ne": {
          "$ref": "#/$defs/vec2"
        },
        "e": {
          "$ref": "#/$defs/vec2"
        },
        "se": {
          "$ref": "#/$defs/vec2"
        },
        "s": {
          "$ref": "#/$defs/vec2"
        },
        "sw": {
          "$ref": "#/$defs/vec2"
        },
        "w": {
          "$ref": "#/$defs/vec2"
        },
        "nw": {
          "$ref": "#/$defs/vec2"
        }
      },
      "description": "Eight independently authored unbounded 2D vectors. No direction is synthesized by mirroring."
    },
    "item_stats": {
      "type": "object",
      "additionalProperties": false,
      "default": {},
      "properties": {
        "physical_damage": {
          "type": "number",
          "default": 0
        },
        "magical_damage": {
          "type": "number",
          "default": 0
        },
        "physical_defense": {
          "type": "number",
          "default": 0
        },
        "magical_defense": {
          "type": "number",
          "default": 0
        },
        "dodge_chance": {
          "type": "number",
          "default": 0
        },
        "critical_chance": {
          "type": "number",
          "default": 0
        },
        "critical_damage": {
          "type": "number",
          "default": 0
        },
        "max_health": {
          "type": "number",
          "default": 0
        },
        "max_mana": {
          "type": "number",
          "default": 0
        },
        "health_regen": {
          "type": "number",
          "default": 0
        },
        "mana_regen": {
          "type": "number",
          "default": 0
        }
      }
    },
    "entity_stats": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "level": {
          "type": "integer",
          "minimum": 1,
          "default": 1
        },
        "max_health": {
          "type": "number",
          "default": 100,
          "exclusiveMinimum": 0
        },
        "health_regen": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "max_mana": {
          "type": "number",
          "default": 40,
          "minimum": 0
        },
        "mana_regen": {
          "type": "number",
          "default": 2.5,
          "minimum": 0
        },
        "physical_damage": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "magical_damage": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "physical_defense": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "magical_defense": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "dodge_chance": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "maximum": 1
        },
        "critical_chance": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "maximum": 1
        },
        "critical_damage": {
          "type": "number",
          "default": 1.5,
          "minimum": 1
        }
      }
    },
    "soul_bonuses": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "physical_damage": {
          "type": "number",
          "default": 0
        },
        "magical_damage": {
          "type": "number",
          "default": 0
        },
        "physical_defense": {
          "type": "number",
          "default": 0
        },
        "magical_defense": {
          "type": "number",
          "default": 0
        },
        "dodge_chance": {
          "type": "number",
          "default": 0
        },
        "critical_chance": {
          "type": "number",
          "default": 0
        },
        "critical_damage": {
          "type": "number",
          "default": 0
        },
        "max_health": {
          "type": "number",
          "default": 0
        },
        "max_mana": {
          "type": "number",
          "default": 0
        },
        "health_regen": {
          "type": "number",
          "default": 0
        },
        "mana_regen": {
          "type": "number",
          "default": 0
        }
      }
    },
    "soul_definition": {
      "type": "object",
      "required": [
        "name",
        "bonuses"
      ],
      "additionalProperties": false,
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1
        },
        "upgrade_base_cost": {
          "type": "integer",
          "minimum": 1,
          "default": 8,
          "maximum": 18446744073709551615
        },
        "upgrade_cost_growth": {
          "type": "number",
          "exclusiveMinimum": 1,
          "default": 1.8
        },
        "bonus_growth": {
          "type": "number",
          "exclusiveMinimum": 1,
          "default": 1.3
        },
        "max_level": {
          "type": "integer",
          "minimum": 1,
          "default": 20
        },
        "bonuses": {
          "$ref": "#/$defs/soul_bonuses"
        }
      },
      "description": "Optional monster Soul progression and passive bonuses. Drop probabilities live exclusively in the entity loot_table; Soul items are normal loot entries."
    },
    "world_spawner": {
      "type": "object",
      "required": [
        "entity",
        "position",
        "max_alive",
        "reset_time",
        "level_multiplier"
      ],
      "additionalProperties": false,
      "properties": {
        "entity": {
          "$ref": "#/$defs/identifier",
          "description": "Monster entity definition spawned and visually represented by this spawner."
        },
        "position": {
          "$ref": "#/$defs/point2"
        },
        "facing": {
          "$ref": "#/$defs/facing"
        },
        "max_alive": {
          "type": "integer",
          "minimum": 1,
          "maximum": 4294967295
        },
        "reset_time": {
          "type": "number",
          "exclusiveMinimum": 0,
          "description": "Seconds between replenishment checks. Only dead/missing linked monsters are respawned."
        },
        "level_multiplier": {
          "type": "number",
          "exclusiveMinimum": 0,
          "description": "effective_level = max(1, round(base_level * level_multiplier)); combat stats scale by effective/base level ratio."
        },
        "spawn_radius": {
          "type": "number",
          "exclusiveMinimum": 0,
          "default": 78,
          "description": "Radius in world pixels used to distribute linked monsters around the spawner."
        },
        "temperament": {
          "type": "string",
          "enum": [
            "passive",
            "neutral",
            "aggressive"
          ]
        }
      },
      "description": "Indestructible world spawner. All monsters it creates are linked to it; each reset replenishes only the deficit up to max_alive."
    },
    "loot_entry": {
      "type": "object",
      "required": [
        "item_id",
        "base_chance"
      ],
      "additionalProperties": false,
      "properties": {
        "item_id": {
          "$ref": "#/$defs/identifier"
        },
        "base_chance": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "maximum": 1
        },
        "level_scaling": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "max_chance": {
          "type": "number",
          "default": 1,
          "minimum": 0,
          "maximum": 1
        },
        "min_level": {
          "type": "integer",
          "minimum": 1,
          "default": 1
        },
        "min_quantity": {
          "type": "integer",
          "minimum": 1,
          "default": 1
        },
        "max_quantity": {
          "type": "integer",
          "minimum": 1,
          "default": 1
        },
        "guaranteed": {
          "type": "boolean",
          "default": false
        }
      },
      "description": "Independent monster/chest loot roll. effective_chance = min(max_chance, base_chance + level_scaling * (level - 1))."
    },
    "soul_item_identity": {
      "type": "object",
      "required": [
        "monster_id"
      ],
      "additionalProperties": false,
      "properties": {
        "monster_id": {
          "$ref": "#/$defs/identifier"
        }
      }
    },
    "action": {
      "title": "ActionDefinition",
      "type": "object",
      "required": [
        "schema_version",
        "id",
        "name",
        "action_kind",
        "delivery"
      ],
      "additionalProperties": false,
      "properties": {
        "$schema": {
          "type": "string",
          "pattern": "api\\.json#/\\$defs/action$"
        },
        "schema_version": {
          "type": "integer",
          "const": 1
        },
        "id": {
          "$ref": "#/$defs/identifier"
        },
        "name": {
          "type": "string",
          "minLength": 1
        },
        "action_kind": {
          "type": "string",
          "enum": [
            "primary",
            "spell",
            "utility"
          ]
        },
        "damage_kind": {
          "type": "string",
          "enum": [
            "physical",
            "magical"
          ]
        },
        "delivery": {
          "type": "string",
          "enum": [
            "melee_arc",
            "projectile",
            "self_aoe",
            "targeted",
            "beam",
            "cone"
          ]
        },
        "mana_cost": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "cooldown": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "preferred_range": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "min_range": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "max_range": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "damage_min": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "damage_max": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "reach": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "hit_radius": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "area_radius": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "arc_angle_deg": {
          "type": "number",
          "default": 0,
          "minimum": 0,
          "maximum": 360
        },
        "thickness": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "animation": {
          "type": "string",
          "default": ""
        },
        "vfx": {
          "$ref": "#/$defs/identifier"
        },
        "critical_vfx": {
          "$ref": "#/$defs/identifier"
        },
        "effect_entity": {
          "$ref": "#/$defs/identifier"
        },
        "cast_fx": {
          "$ref": "#/$defs/identifier"
        },
        "release_fx": {
          "$ref": "#/$defs/identifier"
        },
        "release_delay": {
          "type": "number",
          "default": 0,
          "minimum": 0
        },
        "healing": {
          "type": "number",
          "minimum": 0
        },
        "pierce": {
          "type": [
            "object",
            "null"
          ],
          "additionalProperties": false,
          "required": [
            "damage_multipliers"
          ],
          "properties": {
            "damage_multipliers": {
              "type": "array",
              "minItems": 2,
              "maxItems": 16,
              "items": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 1
              }
            }
          }
        },
        "status_effects": {
          "type": "array",
          "maxItems": 8,
          "items": {
            "$ref": "#/$defs/status_application"
          },
          "default": []
        }
      }
    },
    "actor_behavior": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "temperament": {
          "type": "string",
          "enum": [
            "passive",
            "neutral",
            "aggressive"
          ],
          "default": "aggressive"
        },
        "aggro_radius": {
          "type": "number",
          "minimum": 0,
          "default": 360
        },
        "roam_radius": {
          "type": "number",
          "minimum": 0,
          "default": 160
        },
        "leash_radius": {
          "type": "number",
          "minimum": 0,
          "default": 520
        },
        "decision_interval_ticks": {
          "type": "integer",
          "minimum": 1,
          "default": 6
        }
      }
    },
    "death_part": {
      "type": "object",
      "required": [
        "effect_entity",
        "chance"
      ],
      "additionalProperties": false,
      "properties": {
        "effect_entity": {
          "$ref": "#/$defs/identifier"
        },
        "chance": {
          "type": "number",
          "minimum": 0,
          "maximum": 1
        },
        "min_speed": {
          "type": "number",
          "minimum": 0,
          "default": 20
        },
        "max_speed": {
          "type": "number",
          "minimum": 0,
          "default": 80
        },
        "min_angular_speed": {
          "type": "number",
          "default": -6
        },
        "max_angular_speed": {
          "type": "number",
          "default": 6
        }
      }
    },
    "death_profile": {
      "type": "object",
      "required": [
        "parts"
      ],
      "additionalProperties": false,
      "properties": {
        "parts": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/death_part"
          },
          "minItems": 1
        }
      }
    },
    "chunk_id": {
      "type": "object",
      "required": [
        "x",
        "y"
      ],
      "additionalProperties": false,
      "properties": {
        "x": {
          "type": "integer"
        },
        "y": {
          "type": "integer"
        }
      }
    },
    "cell_collision": {
      "type": "string",
      "enum": [
        "free",
        "blocked",
        "partial"
      ]
    },
    "ground_surface": {
      "title": "GroundSurface",
      "description": "One supported surface per XY cell. Legacy cells default to flat elevation zero; stairs use a continuous support plane and authored treads.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "kind": {
          "type": "string",
          "enum": [
            "flat",
            "ramp",
            "stairs",
            "void"
          ],
          "default": "flat"
        },
        "elevation": {
          "type": "integer",
          "minimum": -1024,
          "maximum": 1024,
          "default": 0
        },
        "rise": {
          "type": "integer",
          "minimum": 0,
          "maximum": 16,
          "default": 0
        },
        "direction": {
          "type": "string",
          "enum": [
            "east",
            "north",
            "west",
            "south"
          ],
          "default": "east"
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "kind": {
                "enum": [
                  "ramp",
                  "stairs"
                ]
              }
            },
            "required": [
              "kind"
            ]
          },
          "then": {
            "required": [
              "rise"
            ],
            "properties": {
              "rise": {
                "minimum": 1
              }
            }
          },
          "else": {
            "properties": {
              "rise": {
                "const": 0
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 1
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1023
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 2
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1022
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 3
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1021
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 4
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1020
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 5
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1019
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 6
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1018
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 7
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1017
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 8
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1016
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 9
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1015
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 10
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1014
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 11
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1013
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 12
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1012
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 13
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1011
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 14
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1010
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 15
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1009
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "rise": {
                "const": 16
              }
            },
            "required": [
              "rise"
            ]
          },
          "then": {
            "properties": {
              "elevation": {
                "maximum": 1008
              }
            }
          }
        }
      ],
      "default": {
        "kind": "flat",
        "elevation": 0,
        "rise": 0,
        "direction": "east"
      }
    },
    "world_cell": {
      "type": "object",
      "required": [
        "ground"
      ],
      "additionalProperties": false,
      "allOf": [
        {
          "if": {
            "properties": {
              "ground": {
                "const": ""
              }
            },
            "required": [
              "ground"
            ]
          },
          "then": {
            "required": [
              "surface"
            ],
            "properties": {
              "surface": {
                "required": [
                  "kind"
                ],
                "properties": {
                  "kind": {
                    "const": "void"
                  }
                }
              }
            }
          }
        }
      ],
      "properties": {
        "ground": {
          "anyOf": [
            {
              "$ref": "#/$defs/identifier"
            },
            {
              "const": ""
            }
          ]
        },
        "surface": {
          "$ref": "#/$defs/ground_surface"
        },
        "overlay": {
          "anyOf": [
            {
              "$ref": "#/$defs/identifier"
            },
            {
              "type": "null"
            }
          ]
        },
        "decoration": {
          "anyOf": [
            {
              "$ref": "#/$defs/identifier"
            },
            {
              "type": "null"
            }
          ]
        },
        "collision": {
          "$ref": "#/$defs/cell_collision"
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "default": []
        }
      }
    },
    "world_chunk": {
      "title": "WorldChunkDefinition",
      "type": "object",
      "required": [
        "$schema",
        "schema_version",
        "id",
        "cells"
      ],
      "additionalProperties": false,
      "properties": {
        "$schema": {
          "type": "string",
          "pattern": "api\\.json#/\\$defs/world_chunk$"
        },
        "schema_version": {
          "type": "integer",
          "const": 1
        },
        "id": {
          "$ref": "#/$defs/chunk_id"
        },
        "region": {
          "type": "string",
          "default": ""
        },
        "cells": {
          "type": "array",
          "minItems": 1024,
          "maxItems": 1024,
          "items": {
            "$ref": "#/$defs/world_cell"
          }
        },
        "entities": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/world_spawn"
          },
          "default": []
        },
        "spawners": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/world_spawner"
          },
          "default": []
        },
        "recommended_level": {
          "type": "integer",
          "minimum": 0,
          "maximum": 50,
          "default": 0,
          "description": "Fixed regional content level; absent/zero retains legacy level one. Independent of player levels."
        }
      }
    },
    "tile_definition": {
      "type": "object",
      "required": [
        "id",
        "variants",
        "visual"
      ],
      "additionalProperties": false,
      "properties": {
        "id": {
          "$ref": "#/$defs/identifier"
        },
        "variants": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/asset_png"
          }
        },
        "walkable": {
          "type": "boolean",
          "default": false
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "default": []
        },
        "visual": {
          "$ref": "#/$defs/tile_visual"
        }
      }
    },
    "tile_visual": {
      "type": "object",
      "required": [
        "size",
        "offset",
        "layer"
      ],
      "additionalProperties": false,
      "properties": {
        "size": {
          "type": "array",
          "prefixItems": [
            {
              "type": "number",
              "exclusiveMinimum": 0
            },
            {
              "type": "number",
              "exclusiveMinimum": 0
            }
          ],
          "items": false,
          "minItems": 2,
          "maxItems": 2
        },
        "offset": {
          "$ref": "#/$defs/point2"
        },
        "layer": {
          "type": "string",
          "enum": [
            "ground",
            "overlay",
            "decoration"
          ]
        }
      }
    },
    "tile_palette": {
      "title": "WorldTilePalette",
      "type": "object",
      "required": [
        "$schema",
        "schema_version",
        "tiles"
      ],
      "additionalProperties": false,
      "properties": {
        "$schema": {
          "type": "string",
          "pattern": "api\\.json#/\\$defs/tile_palette$"
        },
        "schema_version": {
          "type": "integer",
          "const": 1
        },
        "tiles": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/tile_definition"
          }
        }
      }
    },
    "portal": {
      "title": "Portal",
      "type": "object",
      "required": [
        "dungeon_profile"
      ],
      "additionalProperties": false,
      "properties": {
        "dungeon_profile": {
          "type": "string",
          "minLength": 1
        },
        "min_level": {
          "type": "integer",
          "minimum": 0
        },
        "difficulty": {
          "type": "integer",
          "minimum": 1
        }
      }
    },
    "status_application": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "kind",
        "chance",
        "duration_seconds",
        "power_ratio"
      ],
      "properties": {
        "kind": {
          "enum": [
            "bleeding",
            "burning",
            "frozen",
            "renewal",
            "precision",
            "might",
            "ward",
            "haste"
          ]
        },
        "chance": {
          "type": "number",
          "minimum": 0,
          "maximum": 1
        },
        "duration_seconds": {
          "type": "number",
          "exclusiveMinimum": 0,
          "maximum": 60
        },
        "power_ratio": {
          "type": "number",
          "exclusiveMinimum": 0,
          "maximum": 1.0
        }
      }
    }
  }
}

Assets API

identifier

JSON Pointer: /$defs/identifier

View complete JSON and references
{
  "type": "string",
  "pattern": "^[a-z][a-z0-9_-]*$",
  "minLength": 1
}

Assets API

asset_png

PNG path relative to the JSON document that contains this property. Absolute paths, backslashes and parent-directory traversal (..) are forbidden. The runtime also validates file existence, PNG signature and expected dimensions.

JSON Pointer: /$defs/asset_png

View complete JSON and references
{
  "type": "string",
  "minLength": 1,
  "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\\\]+\\.png$",
  "description": "PNG path relative to the JSON document that contains this property. Absolute paths, backslashes and parent-directory traversal (..) are forbidden. The runtime also validates file existence, PNG signature and expected dimensions."
}

Assets API

point2_pixel

JSON Pointer: /$defs/point2_pixel

View complete JSON and references
{
  "type": "array",
  "prefixItems": [
    {
      "type": "number",
      "minimum": 0,
      "maximum": 31
    },
    {
      "type": "number",
      "minimum": 0,
      "maximum": 31
    }
  ],
  "items": false,
  "minItems": 2,
  "maxItems": 2
}

Assets API

point2

JSON Pointer: /$defs/point2

View complete JSON and references
{
  "type": "array",
  "prefixItems": [
    {
      "type": "number"
    },
    {
      "type": "number"
    }
  ],
  "items": false,
  "minItems": 2,
  "maxItems": 2
}

Assets API

uvec2

JSON Pointer: /$defs/uvec2

View complete JSON and references
{
  "type": "array",
  "prefixItems": [
    {
      "type": "integer",
      "minimum": 1
    },
    {
      "type": "integer",
      "minimum": 1
    }
  ],
  "items": false,
  "minItems": 2,
  "maxItems": 2
}

Assets API

directional_point

JSON Pointer: /$defs/directional_point

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "n",
    "ne",
    "e",
    "se",
    "s",
    "sw",
    "w",
    "nw"
  ],
  "additionalProperties": false,
  "properties": {
    "n": {
      "$ref": "#/$defs/point2_pixel"
    },
    "ne": {
      "$ref": "#/$defs/point2_pixel"
    },
    "e": {
      "$ref": "#/$defs/point2_pixel"
    },
    "se": {
      "$ref": "#/$defs/point2_pixel"
    },
    "s": {
      "$ref": "#/$defs/point2_pixel"
    },
    "sw": {
      "$ref": "#/$defs/point2_pixel"
    },
    "w": {
      "$ref": "#/$defs/point2_pixel"
    },
    "nw": {
      "$ref": "#/$defs/point2_pixel"
    }
  }
}

Assets API

directional_scalar

Eight independently authored direction-dependent numeric values. No direction is synthesized by mirroring.

JSON Pointer: /$defs/directional_scalar

View complete JSON and references
{
  "type": "object",
  "required": [
    "n",
    "ne",
    "e",
    "se",
    "s",
    "sw",
    "w",
    "nw"
  ],
  "additionalProperties": false,
  "properties": {
    "n": {
      "type": "number"
    },
    "ne": {
      "type": "number"
    },
    "e": {
      "type": "number"
    },
    "se": {
      "type": "number"
    },
    "s": {
      "type": "number"
    },
    "sw": {
      "type": "number"
    },
    "w": {
      "type": "number"
    },
    "nw": {
      "type": "number"
    }
  },
  "description": "Eight independently authored direction-dependent numeric values. No direction is synthesized by mirroring."
}

Assets API

visual_tint

JSON Pointer: /$defs/visual_tint

View complete JSON and references
{
  "type": "string",
  "enum": [
    "skin",
    "none"
  ]
}

Assets API

rig_visual

JSON Pointer: /$defs/rig_visual

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "id",
    "depth"
  ],
  "additionalProperties": false,
  "properties": {
    "id": {
      "$ref": "#/$defs/identifier"
    },
    "image": {
      "$ref": "#/$defs/asset_png",
      "description": "Optional rig-owned PNG path relative to this rig-part JSON. If omitted, the runtime resolves the visual from the spawning entity folder: sprites/rig/<body_type>/<visual_id>.png when an appearance/body_type exists, otherwise sprites/rig/<visual_id>.png."
    },
    "pivot": {
      "$ref": "#/$defs/directional_point"
    },
    "attach_to": {
      "$ref": "#/$defs/identifier"
    },
    "tint": {
      "$ref": "#/$defs/visual_tint",
      "default": "skin"
    },
    "occlusion_tag": {
      "$ref": "#/$defs/identifier"
    },
    "depth": {
      "$ref": "#/$defs/directional_scalar",
      "description": "Direction-dependent semantic intra-entity layer depth; mapped to a small local-Z offset."
    },
    "active_depth": {
      "type": "number",
      "description": "Optional semantic depth used while the active animation clip depth_window is active."
    }
  }
}

Assets API

rig_part

RigPart

JSON Pointer: /$defs/rig_part

View complete JSON and references

References

{
  "title": "RigPart",
  "type": "object",
  "required": [
    "$schema",
    "schema_version",
    "id",
    "pivot"
  ],
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "type": "string",
      "pattern": "api\\.json#/\\$defs/rig_part$"
    },
    "schema_version": {
      "type": "integer",
      "const": 8
    },
    "id": {
      "$ref": "#/$defs/identifier"
    },
    "parent": {
      "oneOf": [
        {
          "$ref": "#/$defs/identifier"
        },
        {
          "type": "null"
        }
      ]
    },
    "attach_to": {
      "$ref": "#/$defs/identifier"
    },
    "pivot": {
      "$ref": "#/$defs/directional_point"
    },
    "sockets": {
      "type": "object",
      "propertyNames": {
        "$ref": "#/$defs/identifier"
      },
      "additionalProperties": {
        "$ref": "#/$defs/directional_point"
      },
      "default": {}
    },
    "visuals": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/rig_visual"
      },
      "default": []
    },
    "hair_anchor": {
      "type": "boolean",
      "default": false
    }
  }
}

Assets API

effect

JSON Pointer: /$defs/effect

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "type"
  ],
  "properties": {
    "type": {
      "$ref": "#/$defs/identifier"
    },
    "status": {
      "$ref": "#/$defs/status_application"
    }
  },
  "additionalProperties": true
}

Assets API

item_visual_piece

JSON Pointer: /$defs/item_visual_piece

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "image",
    "bone",
    "depth"
  ],
  "additionalProperties": false,
  "properties": {
    "image": {
      "$ref": "#/$defs/asset_png",
      "description": "PNG path relative to the item.json that owns this equipment piece."
    },
    "bone": {
      "$ref": "#/$defs/identifier"
    },
    "attach_to": {
      "$ref": "#/$defs/identifier"
    },
    "pivot": {
      "$ref": "#/$defs/directional_point"
    },
    "depth": {
      "$ref": "#/$defs/directional_scalar",
      "description": "Direction-dependent semantic intra-entity layer depth; mapped to a small local-Z offset."
    },
    "rotation": {
      "$ref": "#/$defs/directional_scalar",
      "description": "Optional static local rotation in radians around the piece pivot/attachment. Useful for weapons whose blade should not be collinear with the arm."
    },
    "active_depth": {
      "type": "number",
      "description": "Optional semantic depth used while the active animation clip depth_window is active."
    }
  }
}

Assets API

equippable

JSON Pointer: /$defs/equippable

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "slot"
  ],
  "allOf": [
    {
      "if": {
        "properties": {
          "slot": {
            "enum": [
              "head",
              "body",
              "legs",
              "weapon",
              "offhand",
              "back"
            ]
          }
        },
        "required": [
          "slot"
        ]
      },
      "then": {
        "required": [
          "pieces"
        ],
        "properties": {
          "pieces": {
            "minItems": 1
          }
        }
      }
    }
  ],
  "additionalProperties": false,
  "properties": {
    "slot": {
      "$ref": "#/$defs/identifier"
    },
    "hides": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/identifier"
      },
      "uniqueItems": true,
      "default": []
    },
    "pieces": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/item_visual_piece"
      },
      "default": []
    }
  }
}

Assets API

consumable

JSON Pointer: /$defs/consumable

View complete JSON and references

References

{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "consume_amount": {
      "type": "integer",
      "minimum": 1,
      "default": 1,
      "maximum": 18446744073709551615
    },
    "effects": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/effect"
      },
      "default": []
    }
  }
}

Assets API

item

ItemDefinition

Tradeable item definition. Inventory stacks have no authored capacity or footprint: exact ItemInstance identity stacks up to u64::MAX and occupies one UI cell.

JSON Pointer: /$defs/item

View complete JSON and references

References

{
  "title": "ItemDefinition",
  "type": "object",
  "required": [
    "$schema",
    "schema_version",
    "id",
    "sprite"
  ],
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "type": "string",
      "pattern": "api\\.json#/\\$defs/item$"
    },
    "schema_version": {
      "type": "integer",
      "const": 9
    },
    "id": {
      "$ref": "#/$defs/identifier"
    },
    "name": {
      "type": "string",
      "minLength": 1
    },
    "tags": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/identifier"
      },
      "uniqueItems": true,
      "default": []
    },
    "sprite": {
      "$ref": "#/$defs/asset_png",
      "description": "Square single-view South-facing UI-only item icon. Inventory UI draws the full image with full UVs."
    },
    "deletable": {
      "type": "boolean",
      "default": true
    },
    "equippable": {
      "$ref": "#/$defs/equippable"
    },
    "consumable": {
      "$ref": "#/$defs/consumable"
    },
    "stats": {
      "$ref": "#/$defs/item_stats"
    },
    "granted_actions": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/identifier"
      },
      "uniqueItems": true,
      "default": []
    },
    "soul_identity": {
      "$ref": "#/$defs/soul_item_identity"
    },
    "currency": {
      "type": "string",
      "enum": [
        "bronze",
        "silver",
        "gold"
      ],
      "description": "Optional typed currency denomination. Currency items remain ordinary inventory items and must be passive."
    }
  },
  "description": "Tradeable item definition. Inventory stacks have no authored capacity or footprint: exact ItemInstance identity stacks up to u64::MAX and occupies one UI cell."
}

Assets API

controller

JSON Pointer: /$defs/controller

View complete JSON and references
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "kind": {
      "type": "string",
      "minLength": 1,
      "default": "player"
    }
  }
}

Assets API

movement

JSON Pointer: /$defs/movement

View complete JSON and references
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "speed": {
      "type": "number",
      "minimum": 0,
      "default": 120
    },
    "mode": {
      "type": "string",
      "minLength": 1,
      "default": "ground"
    },
    "sprint_multiplier": {
      "type": "number",
      "minimum": 1.0,
      "default": 1.65,
      "description": "Multiplier applied to base movement speed while the player sprint input is held."
    }
  }
}

Assets API

appearance

JSON Pointer: /$defs/appearance

View complete JSON and references

References

{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "body_type": {
      "type": "string",
      "enum": [
        "slim",
        "standard",
        "broad"
      ]
    },
    "skin_tone": {
      "type": "string",
      "enum": [
        "light",
        "tan",
        "brown",
        "dark"
      ]
    },
    "hair_style": {
      "type": "string",
      "enum": [
        "bald",
        "short",
        "long"
      ]
    },
    "hair_color": {
      "type": "string",
      "enum": [
        "black",
        "brown",
        "blond",
        "red",
        "white"
      ]
    },
    "hair_back_depth": {
      "$ref": "#/$defs/directional_scalar",
      "description": "Per-facing local depth for the authored rear-hair layer. Current hair-bearing entities author this explicitly."
    }
  }
}

Assets API

rig_root

JSON Pointer: /$defs/rig_root

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "part"
  ],
  "additionalProperties": false,
  "properties": {
    "part": {
      "$ref": "#/$defs/identifier"
    },
    "offset": {
      "$ref": "#/$defs/directional_vec2",
      "description": "Per-facing entity-local offset from the gameplay/world origin (ground point between the feet) to this root bone. Values use Bevy local coordinates (+Y upward)."
    }
  }
}

Assets API

entity_rig

JSON Pointer: /$defs/entity_rig

View complete JSON and references

References

{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "roots": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/rig_root"
      },
      "default": []
    },
    "library": {
      "$ref": "#/$defs/identifier",
      "description": "Rig-part library folder name under assets/rigs/."
    },
    "animation_library": {
      "$ref": "#/$defs/identifier",
      "description": "Optional animation library. Defaults to library, allowing morphology variants to reuse compatible clips without duplicating them."
    }
  },
  "required": [
    "library"
  ]
}

Assets API

simple_sprite

JSON Pointer: /$defs/simple_sprite

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "image"
  ],
  "additionalProperties": false,
  "properties": {
    "image": {
      "$ref": "#/$defs/asset_png",
      "description": "PNG path relative to the entity.json that owns this sprite."
    },
    "cell_size": {
      "$ref": "#/$defs/uvec2",
      "default": [
        32,
        32
      ]
    },
    "columns": {
      "type": "integer",
      "minimum": 1,
      "default": 1
    },
    "rows": {
      "type": "integer",
      "minimum": 1,
      "default": 1
    },
    "frame_count": {
      "type": "integer",
      "minimum": 1,
      "default": 1
    },
    "fps": {
      "type": "number",
      "minimum": 0,
      "default": 0
    },
    "looping": {
      "type": "boolean",
      "default": false
    },
    "anchor": {
      "$ref": "#/$defs/point2",
      "default": [
        16,
        16
      ]
    },
    "offset": {
      "$ref": "#/$defs/point2",
      "default": [
        0,
        0
      ]
    },
    "depth": {
      "type": "number",
      "default": 0,
      "description": "Semantic intra-entity layer depth. The runtime maps this to a small local-Z offset so world-level Y sorting remains authoritative."
    },
    "source_scale": {
      "type": "integer",
      "minimum": 1,
      "maximum": 8,
      "default": 4,
      "description": "Source PNG pixels per logical sprite pixel. Defaults to ART_DENSITY (4)."
    }
  }
}

Assets API

item_stack

JSON Pointer: /$defs/item_stack

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "item"
  ],
  "additionalProperties": false,
  "properties": {
    "item": {
      "$ref": "#/$defs/identifier"
    },
    "quantity": {
      "type": "integer",
      "minimum": 1,
      "default": 1,
      "maximum": 18446744073709551615
    }
  }
}

Assets API

inventory

JSON Pointer: /$defs/inventory

View complete JSON and references

References

{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/item_stack"
      },
      "default": []
    }
  }
}

Assets API

entity_equipment

JSON Pointer: /$defs/entity_equipment

View complete JSON and references

References

{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "auto_first_per_slot": {
      "type": "boolean",
      "default": false
    },
    "loadout": {
      "type": "object",
      "propertyNames": {
        "$ref": "#/$defs/identifier"
      },
      "additionalProperties": {
        "$ref": "#/$defs/identifier"
      },
      "default": {}
    }
  }
}

Assets API

interactable

JSON Pointer: /$defs/interactable

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "radius"
  ],
  "additionalProperties": false,
  "properties": {
    "radius": {
      "type": "number",
      "exclusiveMinimum": 0
    },
    "actions": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/effect"
      },
      "default": []
    },
    "kind": {
      "$ref": "#/$defs/identifier",
      "default": ""
    }
  }
}

Assets API

loot_container

JSON Pointer: /$defs/loot_container

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "full_sprite",
    "empty_sprite"
  ],
  "additionalProperties": false,
  "properties": {
    "refill_seconds": {
      "type": "number",
      "exclusiveMinimum": 0
    },
    "full_sprite": {
      "$ref": "#/$defs/simple_sprite"
    },
    "empty_sprite": {
      "$ref": "#/$defs/simple_sprite"
    }
  }
}

Assets API

projectile

JSON Pointer: /$defs/projectile

View complete JSON and references
{
  "type": "object",
  "required": [
    "speed"
  ],
  "additionalProperties": false,
  "properties": {
    "speed": {
      "type": "number",
      "exclusiveMinimum": 0
    }
  }
}

Assets API

lifetime

JSON Pointer: /$defs/lifetime

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "seconds"
  ],
  "additionalProperties": false,
  "properties": {
    "seconds": {
      "type": "number",
      "exclusiveMinimum": 0
    },
    "on_expire_spawn": {
      "$ref": "#/$defs/identifier"
    }
  }
}

Assets API

entity

EntityDefinition

Reusable world-entity definition. The entity Transform.translation is its gameplay/world origin; all visuals and rig roots are relative to it.

JSON Pointer: /$defs/entity

View complete JSON and references

References

{
  "title": "EntityDefinition",
  "type": "object",
  "required": [
    "$schema",
    "schema_version",
    "id"
  ],
  "additionalProperties": false,
  "allOf": [
    {
      "not": {
        "required": [
          "loot_container",
          "sprites"
        ]
      }
    }
  ],
  "properties": {
    "$schema": {
      "type": "string",
      "pattern": "api\\.json#/\\$defs/entity$"
    },
    "schema_version": {
      "type": "integer",
      "const": 10
    },
    "id": {
      "$ref": "#/$defs/identifier"
    },
    "name": {
      "type": "string",
      "minLength": 1
    },
    "tags": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/identifier"
      },
      "uniqueItems": true,
      "default": []
    },
    "scale": {
      "type": "number",
      "exclusiveMinimum": 0,
      "default": 4
    },
    "controller": {
      "$ref": "#/$defs/controller"
    },
    "movement": {
      "$ref": "#/$defs/movement"
    },
    "appearance": {
      "$ref": "#/$defs/appearance"
    },
    "inventory_sprite": {
      "$ref": "#/$defs/asset_png",
      "description": "Optional square single-view South-facing inventory/UI icon. Required by the runtime when soul is configured; never used for world presentation."
    },
    "rig": {
      "$ref": "#/$defs/entity_rig"
    },
    "sprites": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/simple_sprite"
      },
      "default": []
    },
    "inventory": {
      "$ref": "#/$defs/inventory"
    },
    "equipment": {
      "$ref": "#/$defs/entity_equipment"
    },
    "interactable": {
      "$ref": "#/$defs/interactable"
    },
    "loot_container": {
      "$ref": "#/$defs/loot_container"
    },
    "projectile": {
      "$ref": "#/$defs/projectile"
    },
    "lifetime": {
      "$ref": "#/$defs/lifetime"
    },
    "animation_bindings": {
      "type": "object",
      "additionalProperties": {
        "$ref": "#/$defs/identifier"
      },
      "description": "Arbitrary gameplay/action name -> clip id bindings. Keys are not schema-enumerated."
    },
    "stats": {
      "$ref": "#/$defs/entity_stats"
    },
    "soul": {
      "$ref": "#/$defs/soul_definition"
    },
    "combat_radius": {
      "type": "number",
      "default": 20,
      "exclusiveMinimum": 0,
      "description": "Gameplay collision/combat radius used for generous hit tests."
    },
    "actions": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/identifier"
      },
      "uniqueItems": true,
      "default": []
    },
    "loot_table": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/loot_entry"
      },
      "default": []
    },
    "behavior": {
      "$ref": "#/$defs/actor_behavior"
    },
    "death_profile": {
      "$ref": "#/$defs/death_profile"
    },
    "portal": {
      "$ref": "#/$defs/portal"
    }
  },
  "description": "Reusable world-entity definition. The entity Transform.translation is its gameplay/world origin; all visuals and rig roots are relative to it."
}

Assets API

facing

JSON Pointer: /$defs/facing

View complete JSON and references
{
  "type": "string",
  "enum": [
    "north",
    "north_east",
    "east",
    "south_east",
    "south",
    "south_west",
    "west",
    "north_west",
    "n",
    "ne",
    "e",
    "se",
    "s",
    "sw",
    "so",
    "w",
    "o",
    "nw",
    "no"
  ]
}

Assets API

world_spawn

JSON Pointer: /$defs/world_spawn

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "entity",
    "position"
  ],
  "additionalProperties": false,
  "properties": {
    "entity": {
      "$ref": "#/$defs/identifier"
    },
    "position": {
      "$ref": "#/$defs/point2"
    },
    "facing": {
      "$ref": "#/$defs/facing"
    },
    "velocity": {
      "$ref": "#/$defs/point2"
    },
    "kind": {
      "type": "string"
    }
  }
}

Assets API

world

WorldDefinition

R24 chunked world manifest. Terrain/entities/spawners live in independently streamable chunk documents.

JSON Pointer: /$defs/world

View complete JSON and references

References

{
  "title": "WorldDefinition",
  "type": "object",
  "required": [
    "$schema",
    "schema_version",
    "id",
    "chunks"
  ],
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "type": "string",
      "pattern": "api\\.json#/\\$defs/world$"
    },
    "schema_version": {
      "type": "integer",
      "const": 9
    },
    "id": {
      "$ref": "#/$defs/identifier"
    },
    "seed": {
      "type": "integer",
      "minimum": 0,
      "default": 0
    },
    "regions": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/identifier"
      },
      "uniqueItems": true,
      "default": []
    },
    "chunks": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "string",
        "pattern": "^chunks/.+\\.json$"
      },
      "uniqueItems": true
    },
    "spawn_position": {
      "$ref": "#/$defs/point2"
    }
  },
  "description": "R24 chunked world manifest. Terrain/entities/spawners live in independently streamable chunk documents."
}

Assets API

animation_rotation_keyframe

JSON Pointer: /$defs/animation_rotation_keyframe

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "t",
    "value"
  ],
  "additionalProperties": false,
  "properties": {
    "t": {
      "type": "number",
      "minimum": 0,
      "maximum": 1
    },
    "value": {
      "$ref": "#/$defs/directional_scalar"
    }
  }
}

Assets API

animation_translation_keyframe

JSON Pointer: /$defs/animation_translation_keyframe

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "t",
    "value"
  ],
  "additionalProperties": false,
  "properties": {
    "t": {
      "type": "number",
      "minimum": 0,
      "maximum": 1
    },
    "value": {
      "$ref": "#/$defs/directional_vec2"
    }
  }
}

Assets API

animation_track

JSON Pointer: /$defs/animation_track

View complete JSON and references

References

{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "translation": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/animation_translation_keyframe"
      }
    },
    "rotation": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/animation_rotation_keyframe"
      }
    }
  }
}

Assets API

animation_event

JSON Pointer: /$defs/animation_event

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "t",
    "name"
  ],
  "additionalProperties": false,
  "properties": {
    "t": {
      "type": "number",
      "minimum": 0,
      "maximum": 1
    },
    "name": {
      "$ref": "#/$defs/identifier"
    },
    "params": {
      "type": "object",
      "additionalProperties": true
    }
  }
}

Assets API

animation

JSON Pointer: /$defs/animation

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "$schema",
    "schema_version",
    "id",
    "duration",
    "looping",
    "tracks"
  ],
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "type": "string"
    },
    "schema_version": {
      "const": 8
    },
    "id": {
      "$ref": "#/$defs/identifier"
    },
    "name": {
      "type": "string"
    },
    "duration": {
      "type": "number",
      "exclusiveMinimum": 0
    },
    "looping": {
      "type": "boolean"
    },
    "tracks": {
      "type": "object",
      "additionalProperties": {
        "$ref": "#/$defs/animation_track"
      }
    },
    "events": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/animation_event"
      }
    },
    "depth_window": {
      "type": "array",
      "minItems": 2,
      "maxItems": 2,
      "items": {
        "type": "number",
        "minimum": 0,
        "maximum": 1
      },
      "description": "Optional normalized [start,end] window that enables visual active_depth."
    },
    "sample_fps": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "Optional visual sampling rate in frames per second. The animation player quantizes the sampled pose to this rate while elapsed time stays continuous."
    }
  }
}

Assets API

vec2

Unbounded 2D vector used for animation translation offsets.

JSON Pointer: /$defs/vec2

View complete JSON and references
{
  "type": "array",
  "minItems": 2,
  "maxItems": 2,
  "prefixItems": [
    {
      "type": "number"
    },
    {
      "type": "number"
    }
  ],
  "description": "Unbounded 2D vector used for animation translation offsets."
}

Assets API

directional_vec2

Eight independently authored unbounded 2D vectors. No direction is synthesized by mirroring.

JSON Pointer: /$defs/directional_vec2

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "n",
    "ne",
    "e",
    "se",
    "s",
    "sw",
    "w",
    "nw"
  ],
  "additionalProperties": false,
  "properties": {
    "n": {
      "$ref": "#/$defs/vec2"
    },
    "ne": {
      "$ref": "#/$defs/vec2"
    },
    "e": {
      "$ref": "#/$defs/vec2"
    },
    "se": {
      "$ref": "#/$defs/vec2"
    },
    "s": {
      "$ref": "#/$defs/vec2"
    },
    "sw": {
      "$ref": "#/$defs/vec2"
    },
    "w": {
      "$ref": "#/$defs/vec2"
    },
    "nw": {
      "$ref": "#/$defs/vec2"
    }
  },
  "description": "Eight independently authored unbounded 2D vectors. No direction is synthesized by mirroring."
}

Assets API

item_stats

JSON Pointer: /$defs/item_stats

View complete JSON and references
{
  "type": "object",
  "additionalProperties": false,
  "default": {},
  "properties": {
    "physical_damage": {
      "type": "number",
      "default": 0
    },
    "magical_damage": {
      "type": "number",
      "default": 0
    },
    "physical_defense": {
      "type": "number",
      "default": 0
    },
    "magical_defense": {
      "type": "number",
      "default": 0
    },
    "dodge_chance": {
      "type": "number",
      "default": 0
    },
    "critical_chance": {
      "type": "number",
      "default": 0
    },
    "critical_damage": {
      "type": "number",
      "default": 0
    },
    "max_health": {
      "type": "number",
      "default": 0
    },
    "max_mana": {
      "type": "number",
      "default": 0
    },
    "health_regen": {
      "type": "number",
      "default": 0
    },
    "mana_regen": {
      "type": "number",
      "default": 0
    }
  }
}

Assets API

entity_stats

JSON Pointer: /$defs/entity_stats

View complete JSON and references
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "level": {
      "type": "integer",
      "minimum": 1,
      "default": 1
    },
    "max_health": {
      "type": "number",
      "default": 100,
      "exclusiveMinimum": 0
    },
    "health_regen": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "max_mana": {
      "type": "number",
      "default": 40,
      "minimum": 0
    },
    "mana_regen": {
      "type": "number",
      "default": 2.5,
      "minimum": 0
    },
    "physical_damage": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "magical_damage": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "physical_defense": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "magical_defense": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "dodge_chance": {
      "type": "number",
      "default": 0,
      "minimum": 0,
      "maximum": 1
    },
    "critical_chance": {
      "type": "number",
      "default": 0,
      "minimum": 0,
      "maximum": 1
    },
    "critical_damage": {
      "type": "number",
      "default": 1.5,
      "minimum": 1
    }
  }
}

Assets API

soul_bonuses

JSON Pointer: /$defs/soul_bonuses

View complete JSON and references
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "physical_damage": {
      "type": "number",
      "default": 0
    },
    "magical_damage": {
      "type": "number",
      "default": 0
    },
    "physical_defense": {
      "type": "number",
      "default": 0
    },
    "magical_defense": {
      "type": "number",
      "default": 0
    },
    "dodge_chance": {
      "type": "number",
      "default": 0
    },
    "critical_chance": {
      "type": "number",
      "default": 0
    },
    "critical_damage": {
      "type": "number",
      "default": 0
    },
    "max_health": {
      "type": "number",
      "default": 0
    },
    "max_mana": {
      "type": "number",
      "default": 0
    },
    "health_regen": {
      "type": "number",
      "default": 0
    },
    "mana_regen": {
      "type": "number",
      "default": 0
    }
  }
}

Assets API

soul_definition

Optional monster Soul progression and passive bonuses. Drop probabilities live exclusively in the entity loot_table; Soul items are normal loot entries.

JSON Pointer: /$defs/soul_definition

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "name",
    "bonuses"
  ],
  "additionalProperties": false,
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1
    },
    "upgrade_base_cost": {
      "type": "integer",
      "minimum": 1,
      "default": 8,
      "maximum": 18446744073709551615
    },
    "upgrade_cost_growth": {
      "type": "number",
      "exclusiveMinimum": 1,
      "default": 1.8
    },
    "bonus_growth": {
      "type": "number",
      "exclusiveMinimum": 1,
      "default": 1.3
    },
    "max_level": {
      "type": "integer",
      "minimum": 1,
      "default": 20
    },
    "bonuses": {
      "$ref": "#/$defs/soul_bonuses"
    }
  },
  "description": "Optional monster Soul progression and passive bonuses. Drop probabilities live exclusively in the entity loot_table; Soul items are normal loot entries."
}

Assets API

world_spawner

Indestructible world spawner. All monsters it creates are linked to it; each reset replenishes only the deficit up to max_alive.

JSON Pointer: /$defs/world_spawner

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "entity",
    "position",
    "max_alive",
    "reset_time",
    "level_multiplier"
  ],
  "additionalProperties": false,
  "properties": {
    "entity": {
      "$ref": "#/$defs/identifier",
      "description": "Monster entity definition spawned and visually represented by this spawner."
    },
    "position": {
      "$ref": "#/$defs/point2"
    },
    "facing": {
      "$ref": "#/$defs/facing"
    },
    "max_alive": {
      "type": "integer",
      "minimum": 1,
      "maximum": 4294967295
    },
    "reset_time": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "Seconds between replenishment checks. Only dead/missing linked monsters are respawned."
    },
    "level_multiplier": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "effective_level = max(1, round(base_level * level_multiplier)); combat stats scale by effective/base level ratio."
    },
    "spawn_radius": {
      "type": "number",
      "exclusiveMinimum": 0,
      "default": 78,
      "description": "Radius in world pixels used to distribute linked monsters around the spawner."
    },
    "temperament": {
      "type": "string",
      "enum": [
        "passive",
        "neutral",
        "aggressive"
      ]
    }
  },
  "description": "Indestructible world spawner. All monsters it creates are linked to it; each reset replenishes only the deficit up to max_alive."
}

Assets API

loot_entry

Independent monster/chest loot roll. effective_chance = min(max_chance, base_chance + level_scaling * (level - 1)).

JSON Pointer: /$defs/loot_entry

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "item_id",
    "base_chance"
  ],
  "additionalProperties": false,
  "properties": {
    "item_id": {
      "$ref": "#/$defs/identifier"
    },
    "base_chance": {
      "type": "number",
      "default": 0,
      "minimum": 0,
      "maximum": 1
    },
    "level_scaling": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "max_chance": {
      "type": "number",
      "default": 1,
      "minimum": 0,
      "maximum": 1
    },
    "min_level": {
      "type": "integer",
      "minimum": 1,
      "default": 1
    },
    "min_quantity": {
      "type": "integer",
      "minimum": 1,
      "default": 1
    },
    "max_quantity": {
      "type": "integer",
      "minimum": 1,
      "default": 1
    },
    "guaranteed": {
      "type": "boolean",
      "default": false
    }
  },
  "description": "Independent monster/chest loot roll. effective_chance = min(max_chance, base_chance + level_scaling * (level - 1))."
}

Assets API

soul_item_identity

JSON Pointer: /$defs/soul_item_identity

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "monster_id"
  ],
  "additionalProperties": false,
  "properties": {
    "monster_id": {
      "$ref": "#/$defs/identifier"
    }
  }
}

Assets API

action

ActionDefinition

JSON Pointer: /$defs/action

View complete JSON and references

References

{
  "title": "ActionDefinition",
  "type": "object",
  "required": [
    "schema_version",
    "id",
    "name",
    "action_kind",
    "delivery"
  ],
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "type": "string",
      "pattern": "api\\.json#/\\$defs/action$"
    },
    "schema_version": {
      "type": "integer",
      "const": 1
    },
    "id": {
      "$ref": "#/$defs/identifier"
    },
    "name": {
      "type": "string",
      "minLength": 1
    },
    "action_kind": {
      "type": "string",
      "enum": [
        "primary",
        "spell",
        "utility"
      ]
    },
    "damage_kind": {
      "type": "string",
      "enum": [
        "physical",
        "magical"
      ]
    },
    "delivery": {
      "type": "string",
      "enum": [
        "melee_arc",
        "projectile",
        "self_aoe",
        "targeted",
        "beam",
        "cone"
      ]
    },
    "mana_cost": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "cooldown": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "preferred_range": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "min_range": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "max_range": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "damage_min": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "damage_max": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "reach": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "hit_radius": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "area_radius": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "arc_angle_deg": {
      "type": "number",
      "default": 0,
      "minimum": 0,
      "maximum": 360
    },
    "thickness": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "animation": {
      "type": "string",
      "default": ""
    },
    "vfx": {
      "$ref": "#/$defs/identifier"
    },
    "critical_vfx": {
      "$ref": "#/$defs/identifier"
    },
    "effect_entity": {
      "$ref": "#/$defs/identifier"
    },
    "cast_fx": {
      "$ref": "#/$defs/identifier"
    },
    "release_fx": {
      "$ref": "#/$defs/identifier"
    },
    "release_delay": {
      "type": "number",
      "default": 0,
      "minimum": 0
    },
    "healing": {
      "type": "number",
      "minimum": 0
    },
    "pierce": {
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": false,
      "required": [
        "damage_multipliers"
      ],
      "properties": {
        "damage_multipliers": {
          "type": "array",
          "minItems": 2,
          "maxItems": 16,
          "items": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 1
          }
        }
      }
    },
    "status_effects": {
      "type": "array",
      "maxItems": 8,
      "items": {
        "$ref": "#/$defs/status_application"
      },
      "default": []
    }
  }
}

Assets API

actor_behavior

JSON Pointer: /$defs/actor_behavior

View complete JSON and references
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "temperament": {
      "type": "string",
      "enum": [
        "passive",
        "neutral",
        "aggressive"
      ],
      "default": "aggressive"
    },
    "aggro_radius": {
      "type": "number",
      "minimum": 0,
      "default": 360
    },
    "roam_radius": {
      "type": "number",
      "minimum": 0,
      "default": 160
    },
    "leash_radius": {
      "type": "number",
      "minimum": 0,
      "default": 520
    },
    "decision_interval_ticks": {
      "type": "integer",
      "minimum": 1,
      "default": 6
    }
  }
}

Assets API

death_part

JSON Pointer: /$defs/death_part

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "effect_entity",
    "chance"
  ],
  "additionalProperties": false,
  "properties": {
    "effect_entity": {
      "$ref": "#/$defs/identifier"
    },
    "chance": {
      "type": "number",
      "minimum": 0,
      "maximum": 1
    },
    "min_speed": {
      "type": "number",
      "minimum": 0,
      "default": 20
    },
    "max_speed": {
      "type": "number",
      "minimum": 0,
      "default": 80
    },
    "min_angular_speed": {
      "type": "number",
      "default": -6
    },
    "max_angular_speed": {
      "type": "number",
      "default": 6
    }
  }
}

Assets API

death_profile

JSON Pointer: /$defs/death_profile

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "parts"
  ],
  "additionalProperties": false,
  "properties": {
    "parts": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/death_part"
      },
      "minItems": 1
    }
  }
}

Assets API

chunk_id

JSON Pointer: /$defs/chunk_id

View complete JSON and references
{
  "type": "object",
  "required": [
    "x",
    "y"
  ],
  "additionalProperties": false,
  "properties": {
    "x": {
      "type": "integer"
    },
    "y": {
      "type": "integer"
    }
  }
}

Assets API

cell_collision

JSON Pointer: /$defs/cell_collision

View complete JSON and references
{
  "type": "string",
  "enum": [
    "free",
    "blocked",
    "partial"
  ]
}

Assets API

ground_surface

GroundSurface

One supported surface per XY cell. Legacy cells default to flat elevation zero; stairs use a continuous support plane and authored treads.

JSON Pointer: /$defs/ground_surface

View complete JSON and references
{
  "title": "GroundSurface",
  "description": "One supported surface per XY cell. Legacy cells default to flat elevation zero; stairs use a continuous support plane and authored treads.",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "flat",
        "ramp",
        "stairs",
        "void"
      ],
      "default": "flat"
    },
    "elevation": {
      "type": "integer",
      "minimum": -1024,
      "maximum": 1024,
      "default": 0
    },
    "rise": {
      "type": "integer",
      "minimum": 0,
      "maximum": 16,
      "default": 0
    },
    "direction": {
      "type": "string",
      "enum": [
        "east",
        "north",
        "west",
        "south"
      ],
      "default": "east"
    }
  },
  "allOf": [
    {
      "if": {
        "properties": {
          "kind": {
            "enum": [
              "ramp",
              "stairs"
            ]
          }
        },
        "required": [
          "kind"
        ]
      },
      "then": {
        "required": [
          "rise"
        ],
        "properties": {
          "rise": {
            "minimum": 1
          }
        }
      },
      "else": {
        "properties": {
          "rise": {
            "const": 0
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 1
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1023
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 2
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1022
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 3
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1021
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 4
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1020
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 5
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1019
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 6
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1018
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 7
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1017
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 8
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1016
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 9
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1015
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 10
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1014
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 11
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1013
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 12
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1012
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 13
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1011
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 14
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1010
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 15
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1009
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "rise": {
            "const": 16
          }
        },
        "required": [
          "rise"
        ]
      },
      "then": {
        "properties": {
          "elevation": {
            "maximum": 1008
          }
        }
      }
    }
  ],
  "default": {
    "kind": "flat",
    "elevation": 0,
    "rise": 0,
    "direction": "east"
  }
}

Assets API

world_cell

JSON Pointer: /$defs/world_cell

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "ground"
  ],
  "additionalProperties": false,
  "allOf": [
    {
      "if": {
        "properties": {
          "ground": {
            "const": ""
          }
        },
        "required": [
          "ground"
        ]
      },
      "then": {
        "required": [
          "surface"
        ],
        "properties": {
          "surface": {
            "required": [
              "kind"
            ],
            "properties": {
              "kind": {
                "const": "void"
              }
            }
          }
        }
      }
    }
  ],
  "properties": {
    "ground": {
      "anyOf": [
        {
          "$ref": "#/$defs/identifier"
        },
        {
          "const": ""
        }
      ]
    },
    "surface": {
      "$ref": "#/$defs/ground_surface"
    },
    "overlay": {
      "anyOf": [
        {
          "$ref": "#/$defs/identifier"
        },
        {
          "type": "null"
        }
      ]
    },
    "decoration": {
      "anyOf": [
        {
          "$ref": "#/$defs/identifier"
        },
        {
          "type": "null"
        }
      ]
    },
    "collision": {
      "$ref": "#/$defs/cell_collision"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "default": []
    }
  }
}

Assets API

world_chunk

WorldChunkDefinition

JSON Pointer: /$defs/world_chunk

View complete JSON and references

References

{
  "title": "WorldChunkDefinition",
  "type": "object",
  "required": [
    "$schema",
    "schema_version",
    "id",
    "cells"
  ],
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "type": "string",
      "pattern": "api\\.json#/\\$defs/world_chunk$"
    },
    "schema_version": {
      "type": "integer",
      "const": 1
    },
    "id": {
      "$ref": "#/$defs/chunk_id"
    },
    "region": {
      "type": "string",
      "default": ""
    },
    "cells": {
      "type": "array",
      "minItems": 1024,
      "maxItems": 1024,
      "items": {
        "$ref": "#/$defs/world_cell"
      }
    },
    "entities": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/world_spawn"
      },
      "default": []
    },
    "spawners": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/world_spawner"
      },
      "default": []
    },
    "recommended_level": {
      "type": "integer",
      "minimum": 0,
      "maximum": 50,
      "default": 0,
      "description": "Fixed regional content level; absent/zero retains legacy level one. Independent of player levels."
    }
  }
}

Assets API

tile_definition

JSON Pointer: /$defs/tile_definition

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "id",
    "variants",
    "visual"
  ],
  "additionalProperties": false,
  "properties": {
    "id": {
      "$ref": "#/$defs/identifier"
    },
    "variants": {
      "type": "array",
      "minItems": 1,
      "items": {
        "$ref": "#/$defs/asset_png"
      }
    },
    "walkable": {
      "type": "boolean",
      "default": false
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "default": []
    },
    "visual": {
      "$ref": "#/$defs/tile_visual"
    }
  }
}

Assets API

tile_visual

JSON Pointer: /$defs/tile_visual

View complete JSON and references

References

{
  "type": "object",
  "required": [
    "size",
    "offset",
    "layer"
  ],
  "additionalProperties": false,
  "properties": {
    "size": {
      "type": "array",
      "prefixItems": [
        {
          "type": "number",
          "exclusiveMinimum": 0
        },
        {
          "type": "number",
          "exclusiveMinimum": 0
        }
      ],
      "items": false,
      "minItems": 2,
      "maxItems": 2
    },
    "offset": {
      "$ref": "#/$defs/point2"
    },
    "layer": {
      "type": "string",
      "enum": [
        "ground",
        "overlay",
        "decoration"
      ]
    }
  }
}

Assets API

tile_palette

WorldTilePalette

JSON Pointer: /$defs/tile_palette

View complete JSON and references

References

{
  "title": "WorldTilePalette",
  "type": "object",
  "required": [
    "$schema",
    "schema_version",
    "tiles"
  ],
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "type": "string",
      "pattern": "api\\.json#/\\$defs/tile_palette$"
    },
    "schema_version": {
      "type": "integer",
      "const": 1
    },
    "tiles": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/tile_definition"
      }
    }
  }
}

Assets API

portal

Portal

JSON Pointer: /$defs/portal

View complete JSON and references
{
  "title": "Portal",
  "type": "object",
  "required": [
    "dungeon_profile"
  ],
  "additionalProperties": false,
  "properties": {
    "dungeon_profile": {
      "type": "string",
      "minLength": 1
    },
    "min_level": {
      "type": "integer",
      "minimum": 0
    },
    "difficulty": {
      "type": "integer",
      "minimum": 1
    }
  }
}

Assets API

status_application

JSON Pointer: /$defs/status_application

View complete JSON and references
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "kind",
    "chance",
    "duration_seconds",
    "power_ratio"
  ],
  "properties": {
    "kind": {
      "enum": [
        "bleeding",
        "burning",
        "frozen",
        "renewal",
        "precision",
        "might",
        "ward",
        "haste"
      ]
    },
    "chance": {
      "type": "number",
      "minimum": 0,
      "maximum": 1
    },
    "duration_seconds": {
      "type": "number",
      "exclusiveMinimum": 0,
      "maximum": 60
    },
    "power_ratio": {
      "type": "number",
      "exclusiveMinimum": 0,
      "maximum": 1.0
    }
  }
}

Changelog

See what changed in each release, with the latest update first.

R37.2 — Stable movement, clearer windows and wild ingredients
  • Interpolate the local character's displayed position between collision-checked prediction steps, so walking and running advance at the rendered frame rate instead of jumping once per 30 Hz input tick.
  • Keep server correction smoothing separate from ordinary movement interpolation, and make the camera follow the same displayed position as the actor.
  • Discard stale visual movement on lifecycle resets and rejected input, preserving collision checks, network admission limits and the authoritative 30 Hz input cadence. No sprite or animation artwork changes.

Game windows

  • Give inventory, stations, soul altar, trading post, map and online-player windows consistent framing, clearer sections and layouts that adapt to the available width.
  • Separate inventory equipment, backpack and selected-item actions. Show exact owned, available and reserved quantities and signed equipment comparisons; discard stale selections when their stack disappears or is filtered out.
  • Add searchable alchemy recipes and a craftable filter while retaining manual preparation, doses and quantity controls. Explain materials, output, costs and upgrade risks before submitting an action.
  • Clarify soul selections, trading lots, prices and spendable funds; preserve transaction confirmations and authoritative pending/result handling.
  • Replace station, soul and market sell dropdowns with searchable illustrated choices. Keep the selected item, its properties and the next action together; show both fusion inputs and the possible outcome without inventing random stats.
  • Show selected inventory items and equipped comparisons with existing artwork, expose stack actions directly, and use visible sorting/filter choices. Alchemy recipe cards show effects and availability; the selected output stays beside doses and brew controls. Market listings expose progression and lot prices.
  • Group menu settings into Audio, Controls, Interface and Help. Offer interface sizes of 100%, 110% and 120%, remembered in browser storage when available.
  • Reduce the interface's base scale by 20%. The 100/110/120% choices now apply relative to this compact baseline, including previously saved preferences.
  • Keep operation and confirmation buttons in fixed window footers, while catalogues, statistics and explanations scroll separately. Sign-in fields and Play remain visible even with the logo and long account instructions. Menu sections use tabs; Alchemy separates Brew and Reclaim potions.
  • Arrange Soul fusion with both input slots stacked on the left, the possible result on the right and a searchable, scrolling Soul grid below. Use compact responsive grids for station items, recipes and market choices as well.
  • Mark favorite/locked stacks with the backpack's gold star in station, Soul and market sell grids. Replace unsupported market sort arrows with readable low-first/high-first labels for Bronze, Silver and Gold.
  • Apply market sorting immediately on selection, without waiting for Apply filters. Reject old query responses and avoid an empty-market message while the new page is loading; search and advanced filter edits still use Apply.
  • Preserve text-field side edges on hover/focus: fixed action areas reserve painting margins and the fusion body's clip only constrains its vertical area.
  • Keep the possible fusion attributes visible next to the level and bonus-count ranges. Soul slots and grid tooltips show the evaluated bonuses and values. Confirm equipment, spell and Soul upgrades (+1 or max), Soul fusion and scrap-all previews in centered modal dialogs with fixed Cancel/Confirm actions. Cancel, Escape or a backdrop click never submits the operation. Scrap all still uses the server's exact preview token and returned totals.
  • Keep inventory scroll extents finite: scrolling no longer increases the layout's own height or creates an endlessly extending blank area. Inventory storage remains unlimited; only the displayed viewport is bounded.
  • Keep interface scaling consistent with the display's pixel density, fixing the off-screen login window and gray screen on Retina displays after entering the game. Keep player names and enemy status icons anchored to their world positions at all three interface sizes.
  • Preserve existing sprites, icons, animations and world rendering. The UI refactor changes no gameplay rules or server transactions.

Harvesting across the world

  • Distribute the existing Bloodleaf, Mooncap, Ashroot and Ghostbloom plants throughout all 289 demo sectors, with three to six plants per sector and denser growth in woods and cemeteries. The four starter plants stay in place.
  • Append new placements after existing objects, preserving saved container identities, terrain, routes, encounters, harvest rewards and refill times. Reuse the existing full/empty sprites without editing artwork.
  • Keep plants on clear flat ground, away from roads, scenery, other interactions and monster spawn areas. Generation remains deterministic and idempotent.

Protocol 34, Content API 10 and persistence formats remain unchanged. The restart regression now uses command sequence numbers independent of plant placement indices, so distributed plants exercise persistence without sending duplicate or stale commands. No runtime harvesting behavior changes. The console shutdown regression now waits for initialization, verifies actual terminal saturation and measures shutdown separately from fixture preparation. It retains the shutdown deadline and terminal-restoration checks; console runtime behavior is unchanged. Collapse the trading-post refresh guard to satisfy Clippy without changing its short-circuit conditions, button visibility or refresh behavior. See the movement design (../design/r37.2-local-presentation.md), interface design (../design/r37.2-ui-redesign.md) and the validation record (../history/releases/R37.2-application-fr.md) for actual test results and the remaining in-game acceptance.

Source: docs/changelog/R37.2.md

R37.1 — Camera follow and performance diagnostics

Camera

  • Short, frame-rate-independent camera smoothing follows the displayed player position and terrain height. Discontinuous movement resets the follow position instead of sliding through a teleport or world change.

Performance investigation

  • Extend the existing bounded F3 diagnostics to distinguish synchronous transport dispatch from game-frame receive processing and expose replication backlog.
  • Preserve unsampled dispatch work and the current frame's CPU timer across session/world resets so transitions do not erase work or fabricate CPU spikes.
  • Keep message-overload protection and reliable event ordering. The reported regression in fluidity remains under investigation until comparable browser captures establish its cause; no measured performance gain is claimed yet.

Performance optimizations

  • Instantiate worn equipment pieces and reconcile loadout changes instead of keeping every catalogue item hidden on every actor. Preserve first-frame pose, body/hair occlusion and equipment on dying actors.
  • Resolve sprite registration paths once and reuse frame bounds. Compare borrowed animation names before allocating a changed name and borrow the active clip.
  • Count exact serialized message sizes without temporary byte buffers. Consume incoming snapshots and copy only surviving unchanged baseline states.
  • Reuse terrain-aware prediction until its authoritative basis, queued inputs, movement rules or collision terrain changes; extend valid replay on new input.
  • Select projectile candidates from the current tick's spatial index, retaining exact collision checks and contact/splash ordering with conservative fallbacks.
  • Cache player chunk windows, retain delivery retries and group expired chunk entities in one traversal while preserving lifecycle and reward protection.
  • Check live terrain mesh entries before building top geometry, retaining weak ownership, cache limits, shape registration and the existing work budgets.

Documentation

  • Refresh current guides and release references, including host-prepared WASM, local autonomous images, local R2 testing, CORS and Cloud Build submission.
  • Preserve historical validation records and the existing VM launch procedure.

Protocol 34, Content API 10 and persistence formats remain unchanged. Native and WASM results, the owner's complete 17-gate PASS, local image build and live-client acceptance are recorded separately in the checkpoint evidence (../history/releases/R37.1-application-fr.md). The earlier console PTY failures were not reproduced in the full workspace run; no measured performance gain or causal lag fix is claimed.

Source: docs/changelog/R37.1.md

R37 — A world with depth

CDN delivery hotfix

  • Request wiki portraits, logo, spell frames and status atlases with anonymous CORS before loading their shared game asset URLs. Keep the two browser icons on the game origin and embed them in the wiki, avoiding favicon requests to shared R2 texture URLs. Publish the updated wiki as well as the game image.
  • Request the boot logo with anonymous CORS before assigning its CDN URL, so the browser shell does not seed a no-CORS cache entry that blocks the game's subsequent texture fetch. Cache-enabled browser acceptance remains required.
  • Restore the browser shell's selection of the exact R2 JavaScript/WASM bundle declared by the server, including rejection of malformed or mixed bundles. Local builds retain same-origin client loading.
  • Load the community module using the validated build revision, preventing an older cached module from expecting controls removed by the current HTML. Community loading remains optional for starting the game.
  • Include expected/received origin and CDN response headers in CORS failure diagnostics. Keep the existing MIME, cache and content verification checks.
  • Document hostname cache purge after R2 CORS changes and browser GET validation; cached headers are not replaced merely by saving the bucket policy. No upload, purge or production deployment is performed by this source change.

Release publication

  • Browser JS/WASM/snippets are built once outside Docker and passed unchanged to the server image. Commit, protocol and byte checks reject stale or modified clients before compilation; the final image verifies their exact R2 objects.
  • Local image builds prepare the client on the host and keep self-contained assets, including for uncommitted development. Cloud Build consumes the same prepared context and receives its checked source commit.
  • CDN verification reuses connections in bounded batches and reports stalled reads. A read-only whole-assets probe checks delivery without compiling the game.
  • Docker compiles only the native server; WASM tools, the Docker client export stage and its Linux-only CLI installer are removed.
  • Release inventories and a page-version pin support separate reference-based R2 cleanup, with a read-only report and validated deletion action.
  • CDN mode serves the compiled JS/WASM and relative snippets from an immutable bundle selected by the server build descriptor, with local mode retained.
  • Repeat asset publication reuses immutable objects with verified delivery; missing or invalid objects are uploaded, with an explicit origin repair option.
  • Finder .DS_Store files are excluded from R2 publication and the staged package.
  • Explicit R2 asset publication also updates the homepage and wiki HTML in their existing EU buckets, with correct MIME, lossless gzip and revalidation caching.
  • Cloudflare initialization is documented as a dashboard configuration guide.

Terrain and exploration

  • Terrain supports terraces, continuous ramps, stairs, cliffs and voids. Actors, scenery, loot, effects and the camera follow the same support height.
  • The demo world's terrain and routes are generated coherently across chunk boundaries. Landmarks, world extent, level progression and durable object identities are retained.
  • Generated dungeons combine flat combat rooms with traversable elevation changes in corridors. Loops, dead ends and the maximum-shortest-path boss rule remain; space outside the floors is empty and impassable.
  • Combat accounts for elevation. Radial AOE checks are spherical on the server, while their existing classic sprites and planar presentation remain unchanged.
  • The editor can author surfaces and review the resulting terrain.
  • Supported saved positions stay exact. Positions made unsupported by terrain changes recover to validated ground; restored loot quantities and identities are preserved. Initial spawns, refills and dungeon returns use safe ground.

Asset delivery

  • Asset publication targets the configured EU jurisdiction for both bucket checks and uploads. Public CDN URLs remain unchanged.
  • Local R2 publication reuses Wrangler OAuth through pinned npx, without a global install or mandatory API token; CI token authentication remains supported.
  • In CDN mode, the wiki loads portraits, branding and animated previews from the same immutable R2 objects as the game, without embedding image bytes. Local builds preserve the self-contained wiki.
  • Browser assets can be served by Cloudflare R2 with immutable content keys, a verified build-bound manifest and lossless compression when worthwhile.
  • The server validates gameplay metadata without requiring local PNGs. Complete image validation remains part of building and publishing the release.
  • Release packaging supports local assets, verified existing CDN objects, explicit asset uploads and independent public icon uploads with MIME/cache metadata. Failed publication preserves the previous complete local package.
  • R37's repository configuration enables R2; an explicit local-assets build remains available without Cloudflare access. No infrastructure creation, upload, CDN purge or deployment is implied by source promotion.

Community

  • Join the Vestige Discord from the game, website and wiki using the same invitation. Links open a separate tab on request.

Inventory and controls

  • The inventory displays the arithmetic mean of equipped item levels and the equipped soul, with one decimal. Empty slots and backpack quantities do not contribute. Catalog items use their highest equipment or spell progression.
  • The Wiki button remains available. W/F1 shortcuts and their settings are removed.

Compatibility

  • Protocol 34 requires matching R37 client/server builds. Content API 10, SQLite schema 12 and runtime payload 12 remain unchanged.
  • Existing approved artwork, account data and the operator-owned Docker launch contract are preserved. Validation and visual acceptance are recorded separately.

Source: docs/changelog/R37.md

R36.2 — Catacombs, an interactive terminal and background-tab stability

Explore the labyrinth

  • Dungeon layouts include branching paths, loops and genuine dead ends.
  • The boss occupies a deepest room: shortest-path distance from the entrance is calculated after loop connections, instead of using generation order.
  • Room placement and corridors preserve the generated connections. Optional treasure rooms remain optional and all rooms are reachable.
  • Outside room and corridor stone floors, chunks remain visually empty instead of showing a rectangular dirt fill. These empty cells remain impassable.
  • A seed reproduces the layout. The editor and server share the same generator; new generation applies when a new dungeon instance is created.

Edit admin commands

  • Interactive Linux and macOS terminals use ncurses for command editing and asynchronous replies. Left/Right move the cursor; Ctrl+A/Ctrl+E jump to the beginning/end; Up/Down browse command history and restore unfinished input.
  • History keeps the last 100 unique entries in memory. Repeating a command moves its existing entry to the most recent position.
  • Non-interactive stdin retains bounded line-based input. Command dispatch, persistence acknowledgements and lifecycle controls remain server-owned.

Keep receiving while the tab is hidden

  • Browser network updates no longer wait for a displayed frame. Hidden tabs keep applying reliable state in order, within the existing queue limits.
  • The scene camera is inactive while the page is hidden. Returning to the tab restores the camera and browser-driven frame cadence; no fixed 60 FPS cap is added.
  • Losing focus clears held keyboard and mouse input. Server simulation continues while the tab is hidden; switching tabs does not pause the world.

Vestige identity

  • The approved Vestige logo appears in the public homepage, wiki, browser entry screen and account sign-in/create form, with local/offline assets.
  • Transparent PNG icons at 16, 32, 48, 64, 180, 192 and 512 pixels and a multi-resolution favicon are included in the atomic www bundle. Stable public IDs, a JSON catalogue and R2 MIME/cache metadata accompany the images.
  • The original approved artwork is preserved. The browser audio gesture and authentication flow remain unchanged.
  • An explicit release-build publication mode uploads public icons through Wrangler to the existing EU bucket, applying MIME/cache metadata from the manifest. Local builds remain offline; upload failures preserve the previous local release and report partial remote publication.

Compatibility

  • The startup hotfix terminates ncurses wide-character buffers, including empty input. This prevents a SIGSEGV with Bookworm ncurses when the container has a TTY, and keeps editing usable after deleting or cancelling the input line.
  • Terminal PTY tests accept the mutable pointer signature required by macOS while retaining compatibility with Linux.
  • PTY test input retries temporary backpressure with a deadline. On macOS, restoration checks settle the kernel's pending-input state before comparing every original terminal flag and control character.
  • Protocol 33, Content API 10 and SQLite/runtime payload 12 remain unchanged.
  • The container includes ncurses libraries. Its root user, direct server command, mounts, ports and operator-owned image tag are preserved.
  • Release checks and manual terminal/game acceptance are tracked separately; source changes do not merge or deploy the release.

Source: docs/changelog/R36.2.md

R36.1 — A home for Vestige

Public homepage

  • A new standalone homepage presents Vestige's world, character builds, souls and cooperative exploration, with direct Play, Wiki and Support links.
  • Recent news comes from the indexed release notes. Authored game art, styles and scripts are embedded in one HTML file for static hosting on Cloudflare R2.
  • The page adapts to mobile and desktop and remains readable without JavaScript.

Online presence

  • Play buttons on the homepage and wiki display the number of authenticated players currently connected across all regions and dungeons.
  • The public read-only endpoint /api/public/v1/online returns only an aggregate count, without exposing names, accounts or locations.
  • The counter refreshes while the page is visible and distinguishes a real zero from an unavailable server. Offline reference content and Play remain usable.

Browser audio

  • The web client preloads before showing Enter game, then creates its audio output from a real click or key press to respect browser autoplay policy.
  • Playback follows the actual audio output state. Suspended audio can resume on a later interaction without restarting music or resetting volume settings.

Release package and compatibility

  • Web builds explicitly enable WebAssembly sign-extension instructions in wasm-opt, avoiding an optimizer warning with older Binaryen versions.
  • The atomic release package now includes www/index.html alongside the game and wiki/index.html; the homepage can also be generated independently.
  • Protocol 33, Content API 10, SQLite/runtime payload 12, gameplay and the operator-owned Docker/image deployment remain unchanged.
  • Building these files does not upload them to R2, alter DNS or deploy the game.

Source: docs/changelog/R36.1.md

R36 — Vestige procedural sound chip

Text-authored audio

  • Music and sound effects are now synthesized by Rust from canonical JSON and bounded ABC notation; R36 requires no WAV, OGG or MP3 source asset.
  • game_shared::audio provides sine, pulse, triangle, saw and deterministic noise oscillators, ADSR envelopes, pitch sweeps, vibrato, tremolo and deterministic seeded variation.
  • Scores compile to absolute positions on a 48,000 Hz sample clock. Notes, envelopes and loop boundaries are independent from Bevy frame timing.
  • The mixer rejects non-finite inputs, bounds output with a final soft limiter and generates samples without parsing, filesystem access or per-sample heap allocation.

Contextual music

  • Every shipped overworld region owns a dedicated loop: Village, Dark Road, Dungeon Gate, Haunted Woods, Old Cemetery and Ruined Chapel.
  • Forgotten Crypt owns its own dungeon loop instead of a shared generic dungeon theme.
  • Dungeon music overrides the current region. Leaving a dungeon restores the destination region, and region/dungeon changes use one bounded sample-clock crossfade without accumulating permanent players.
  • Missing, duplicate or reused context mappings fail the Rust audio compiler.

Procedural effects

  • R36 authors UI confirmation/error, melee swing/impact, spell cast/impact, player damage, loot pickup, dungeon gate and monster death effects as layered textual definitions.
  • SFX use optional two-stage low-pass sweeps for air, dull impacts and material resonances. The approved music instruments and scores are unchanged.
  • Thirteen spells bind to nine sound families: fire, water, healing, dark, ice, lightning, bone, blood and arcane auras. Each family has distinct cast and release definitions, bringing the catalog to 28 SFX.
  • Authoritative cast/release events select those bindings. AOE releases sound even without victims or visible VFX; cast animations do not double-trigger a generic cue, and canceled casts do not emit a release.
  • World effects retain positional stereo panning; music and UI remain non-spatial.
  • Three finite SFX slots use deterministic priority and voice stealing. Event floods are bounded and cannot create unlimited polyphony.
  • Existing authoritative presentation events drive combat/death cues; no audio protocol message or client-authoritative gameplay event was introduced.

Player and authoring workflow

  • Escape exposes Global, Music and SFX sliders plus mute; F4 shares those controls. Browser settings use local storage and never mutate the server-owned character save.
  • Browser audio waits for an initial user interaction; unavailable audio does not block gameplay.
  • A native audio_preview editor binary reloads the canonical files, reports path/field/voice errors and previews looping tracks or seeded effects through the production compiler.
  • Artist and developer guides document instruments, SFX, music notation, context assignment, testing and manual audio review.
  • The seven approved Dark fantasy study tracks now replace the original music in all six regions and Forgotten Crypt. Their study_ identities, scores, instruments, gains and tempos are retained.
  • Game playback and native preview share the approved damped stereo room, selected by each track's optional ambience field. The room retains its tail across score loops, keeps bounded state and allocates no memory per sample. SFX and volume controls retain their existing behavior.

Native warning cleanup

  • Addressed the reported workspace compiler/Clippy diagnostics: removed unused paths, separated test-only helpers, initialized fixtures directly, simplified equivalent expressions and grouped helper arguments into typed contexts.
  • Named ECS queries retain the original filters and access; framework-injected systems use narrowly justified lint expectations where their arity is intrinsic.
  • Smaller internal event/audit values retain existing publication and Drop behavior. Wire messages, saves and gameplay calculations are unchanged.
  • The old transitive Metal dependency block 0.1.6 uses a local compatibility patch for its opaque C static and explicit calling convention. Its package version/API remain unchanged; no graphics dependency upgrade is introduced.

Compatibility

  • Protocol remains 33, Content API 10, SQLite schema 12 and runtime payload 12.
  • Crate version remains 2.0.1 and the existing Cargo package graph is preserved; the pure engine lives under game-shared.
  • Docker runtime, image publication, deployment and listening acceptance are separate release evidence and are not implied by the source changes.

Source: docs/changelog/R36.md

R35.3 — Monster difficulty and ranked currencies

Monster level gap

  • Monster health now follows (1 + 0.25 × (level − 1))^1.65 from the preserved effective level-one species anchor.
  • Monster physical and magical damage follow (1 + 0.20 × (level − 1))^1.40.
  • Monster physical and magical defenses keep logarithmic growth with coefficient 1.00.
  • Rank health and mana-regeneration effects remain applied exactly once after level scaling.
  • A Rust reference-combat contract uses the actual Human Player, level-10 Ashen Mage Soul, level-10 starter armour, level-10 Bone Staff and level-10 Fireball. Against representative normal monsters at level 30, that build must lose the successful-hit damage race by at least two hits; equal-level combat remains viable.

Bronze, Silver and Gold

Currency rewards are calculated in two explicit stages:

  1. the defeated monster's effective level evaluates the denomination curve;
  2. the defeated monster's rank applies the dedicated currency multipliers.

| Rank | Probability | Successful quantity | | --- | ---: | ---: | | Normal | ×1 | ×1 | | Elite | ×1.5 | ×2 | | Boss | ×3 | ×4 |

These factors apply independently to Bronze, Silver and Gold. They are authored as economy.currency_rank; Soul-drop and fragment-rank tuning cannot alter them. Player level, equipped gear, Soul level, region, dungeon and party composition do not affect the roll. Party sharing still divides the already-rolled quantity by the R35.2 equitable per-denomination allocator.

Gold remains exceptional below monster level 100. Its normal-rank anchors are:

  • level 1 and 10: 0%;
  • level 50: 0.05%, one Gold;
  • level 99: 0.20%, one Gold;
  • level 100: 1%, one Gold;
  • level 1000: 25%, one to ten Gold.

Consequently the maximum pre-100 chance is 0.20% Normal, 0.30% Elite and 0.60% Boss. At level 99, a successful Elite reward contains two Gold and a successful Boss reward contains four.

Validation diagnostics

Failed validation gates now print their complete output so an early failure is not hidden by later successful targets. Successful gates retain compact console summaries, and complete log files remain available under target/check/.

Compatibility

  • Protocol remains 33.
  • Content API remains 10.
  • SQLite schema and runtime payload remain 12.
  • Economy rules advance to schema 7 and RulesBundle to 13.
  • Progression remains 3, combat 2, encounters 1 and social 3.
  • Crate version remains 2.0.1.
  • No save migration, image publication, merge or deployment follows from these source changes alone.

Source: docs/changelog/R35.3.md

R35.2 — Chat colors and currency progression

Chat presentation

  • Player chat follows Lineage-style channel coloring: Whisper is pink/purple, Local is white, Party is green and Global is orange.
  • System and trusted admin messages retain their own colors.
  • Routing, privacy and protocol semantics are unchanged. Clan chat is still not implemented; /c remains unavailable rather than inventing a client-only channel.

Currency rewards

  • Bronze, Silver and Gold now use authored level progression points rather than a threshold plus a separate power curve.
  • The shared Rust evaluator linearly interpolates drop chance and successful-drop quantity bounds between authored points, then holds the final level-1000 values.
  • Shipped anchors are: Bronze 25/50/75/100/100% at levels 1/10/50/100/1000; Silver 0/25/50/75/100%; Gold 0/0/1/5/25%, with the corresponding quantity ranges defined in assets/rules/economy.json.
  • A failed roll is the zero-coin outcome. A successful currency row always contains at least one coin.

Party distribution

  • Currency and passive material/upgrade-material rewards conserve the quantity rolled by the monster and split it evenly in whole units across eligible party members.
  • Bronze, Silver and Gold each have an independent remainder rotation; every material identity has its own rotation as well. A Bronze/material remainder therefore cannot bias the next Silver/Gold recipient.
  • For three players, repeated 10 Bronze / 2 Silver / 1 Gold rewards rotate the Bronze bonus, the Silver zero and the single Gold recipient across all three members independently.
  • Equipment, standalone spells and Souls retain the separate fixed-recipient exemplar allocation. Group membership never multiplies a currency/material row.

Compatibility

  • Protocol remains 33, Content API 10, SQLite schema 12 and runtime payload 12.
  • Economy rules advance to schema 6 and the rules bundle to 12. Progression remains 3, combat 2 and social 3.
  • Crate version remains 2.0.1. No deployment or image publication follows from the source changes alone.

Source: docs/changelog/R35.2.md

R35.1 — Forgotten Crypt, progression and wiki previews

Forgotten Crypt lifecycle and layout

  • Dungeon generation now creates a deterministic labyrinth with a main route, multiple side branches and several dead ends. The boss sits on a lateral leaf rather than the obvious deepest route, and at least one decoy route reaches an equal or greater depth while remaining fully connected and collision-safe.
  • Each authored instanced-zone entrance has two real world sprites on the same entity: closed.png when no live instance exists and open.png while the associated instance is alive, including its empty grace period. Expiration closes the same entrance again. Late clients and streamed chunks receive the authoritative current state; no player or client owns that truth.
  • Forgotten Crypt bosses respawn one hour after death within the same live instance. The deadline is absolute, idempotent and owned by the instance, so re-entry, chunk unload/reload and failed spawn attempts cannot reset or consume it incorrectly. Destroying the instance destroys the deadline.
  • The removed boss reliquary no longer exists at runtime. Its independent loot rows are transferred to the Dark Prelate and flow through the normal durable, rank-aware monster reward and cooperative-loot pipeline.

Combat progression

  • Elite and Boss monsters use the external rank_mana_regen factors [1, 5, 5]; the multiplier is applied once to authored mana regeneration. Player regeneration, health regeneration and additive equipment/soul bonuses keep their previous rules.
  • Healing Light's Renewal duration now follows a bounded linear progression: 5 seconds at level 1, 15 seconds at level 100 and 20 seconds at level 1000. Initial healing, Renewal power and tick cadence are unchanged.
  • Cleanse is a beneficial SelfAoe spell with the same authored base area as Healing Light. It removes Bleeding, Burning and Frozen from every eligible living player in range while preserving positive statuses. Multiplayer eligibility follows Healing Light: solo casts keep nearby-player support, while a grouped caster affects only self and current party members. Enemies, other worlds and targets outside the evaluated area are untouched. Its cooldown scales from 60 seconds at level 1 to 40 at level 100 and 20 at level 1000. It uses authored Healing Light visual assets rather than a procedural replacement.

Wiki and authored visuals

  • Spell pages can preview authored cast, projectile, impact/release and persistent status sequences directly from content. Only one animated preview runs at a time; static projectiles remain static and missing authored art is reported instead of synthesized.
  • The status guide exposes authored Bleeding, Burning, Frozen, Renewal, Might, Ward, Precision and Haste sheets. Legacy procedural Elite/Boss rank effects are described as unavailable for sprite preview rather than captured as fake art.
  • The wiki includes a readable, searchable, offline representation of the real assets/api.json, preserving JSON types, exact decimal text and local schema references without network access.

Compatibility and release metadata

Protocol 33 adds authoritative dungeon-entrance state replication. Rebuild client and server together; Protocol 32 peers are incompatible. Content API 10, SQLite/runtime schema 12, station rules 2 and crate version 2.0.1 are unchanged. Progression schema is 3, combat schema 2, economy schema 5, social schema 3 and rules bundle 11.

The historical R27 closed gate remains byte-identical under its explicit closed.png path. The owner-approved open gate is authored separately and both states share one dungeon_gate entity. Orientation review now scopes the shared art-registration file to the registrations actually used by orientation assets, so unrelated props/VFX/retired containers cannot invalidate head reviews while a changed head registration still blocks.

Source promotion does not publish a Docker image, retag Cloud Build, merge the PR or deploy the VM. Final native/WASM/package gates remain recorded separately in the R35.1 validation record.

Source: docs/changelog/R35.1.md

R35 — currencies, parties and the trading post

Three currencies and exact inventory rules

  • Bronze, Silver and Gold are inventory items in the Currencies category, with authored icons and separate caps from the economy rules. They never convert automatically. Monster coin rewards supplement the existing item drop tables.
  • Coins remain occasional: Bronze rolls at 8%; Silver at 0.1% below monster level 50 and 1% from 50; Gold at 0.001% below level 100 and 0.1% from 100. Each denomination rolls independently. Server loot, editor previews and the wiki share the level-dependent economy rules; monster rank does not alter them.
  • Credits respect each currency cap. Spending excludes locked, equipped and reserved stock; arithmetic and displayed prices preserve unsigned 64-bit values. Existing above-cap inventory is normalized through the durable admission path. Escrow is separate from the inventory cap and is never silently truncated.
  • Inventory, quick slots and loot notifications retain actual item progression, potency and soul identity. R34.9 stacking and intentional use of locked potions remain available.

Chat and cooperation

  • Global, local, party and whisper channels have explicit audiences. Local chat checks world instance and radius; whispers reach only sender and recipient. Accepted messages are journaled for operator moderation, including private channels. Other players cannot read those private messages.
  • Chat stays above the vitals and quickbar, with bounded scrolling history so wrapped messages cannot grow down over the HUD.
  • Parties support invitations, leadership, removal, leaving and reconnect grace. Membership, invitation duration and grace are governed by the social rules. The compact interface shows the current roster and pending invitations, with small red health and blue mana bars without numeric labels.
  • Party relationships protect allies across melee, projectiles, areas and damage over time, and allow eligible healing and buffs. Delayed effects retain the relevant stable identities and still check current relations at resolution.
  • Monster rewards capture their eligible recipients once. The reward pool scales with the square root of that count, stackable quantities use exact integer allocation, and equipment or soul exemplars receive a fixed random recipient. Durable reward delivery prevents a retry from rerolling or duplicating goods. Purchases and deposit returns remain personal.

Shared trading post

  • An authored trading post stands near the main-world settlement. Interact while alive and nearby to open Buy, Sell and Pending. Search, category, level, payment and affordable filters use bounded pages with stable sorting and cursors.
  • Sell complete or partial stacks as fixed-price lots in any nonzero combination of Bronze, Silver and Gold. Every price component is required. Confirm the exact quantity, price and real item or fused-soul properties before submitting.
  • Listing places goods in escrow. Purchases atomically transfer the whole lot and exact payment, including for an offline seller. Full inventories or currency caps reject the transfer without a partial trade. Buying your own listing is refused. Active and cancelled pending deposits share the ownership limit.
  • Cancellation returns the whole lot immediately when it fits, or moves the deposit to Pending. Return recovers its full contents once capacity allows. Listing revision checks resolve purchase/cancellation races.
  • Durable operation receipts bind an account sequence to an exact intent. The client saves an outstanding intent for the authenticated account before sending and can retry it after reconnecting at a trading post. Replays return the original receipt without a second debit, delivery or loot notification.
  • Results and fresh inventory snapshots publish only behind persistence acknowledgement. Proximity, life, session and world are rechecked before a new transaction; a submitted transaction is drained even after disconnect or stop.

Documentation and compatibility

The current guides and generated wiki describe currencies, market operations, party rewards and chat privacy. Wiki schema 3 exports the actual protocol and market limits, and rejects mismatching data instead of inventing runtime values.

Protocol 32 requires matching R35 client and server builds. Content API 10 and station rules 2 remain compatible. The SQLite migration chain now runs through 0012; runtime schema 12, economy rules 5, social rules 3 and rules bundle 8 are independent contracts. Market deposits and receipts each use format 1. Preserve migration checksums, backups and downgrade refusal. No account or character reset is required; explicit currency normalization still applies when loading old or above-cap inventories.

This source revision completes the implementation scope for issues #17, #18, #21 and #22. The release PR retains the separate validation record: new native tests, WASM/full build and multiplayer/GPU acceptance must pass on the final candidate. Docker commands, data permissions and the operator's image selection are unchanged. No image publication, deployment or merge is implied by these notes.

Source: docs/changelog/R35.md

R34.9 — inventory stacking, protection and hotbar details

Inventory

  • Drag a backpack stack onto another compatible unlocked stack to merge it. The destination keeps its identity and stack ID; a full destination leaves the exact remainder in the source. Only unequipped copies move. Different item progression, potion potency or natural-soul level prevents a merge; fused souls remain unique. The existing per-stack unsigned 64-bit limit is unchanged.
  • Use Stack all in the inventory toolbar to compact compatible unlocked stacks across the entire inventory, including items hidden by the active tab or search. Compaction is deterministic, prefers equipped then lowest-ID destinations, preserves reserved copies and needs no spare stack slot or new identifier. Locked stacks stay untouched. Repeating the operation does not lose items.
  • Locking a fungible potion, consumable or material protects its whole stack, without extracting a single item or allocating another inventory slot. Equipment, spell-bearing items and souls keep individual-exemplar locking. Existing saves and large locked quantities are preserved.
  • Favorite potions remain usable from quick slots and Use item. The hotbar counts locked stock and describes the first usable stack's actual potency. Consuming a dose preserves the remaining stack's lock, identity and progression; it never temporarily unlocks the stack. Depleted bindings stay assigned. Full resources, dead characters, invalid effects and reserved quantities retain their existing rejection rules. Locks still protect against dropping, splitting, merging, manual salvage and spending materials; intentional use is distinct.
  • The interface sends merge/compaction commands and waits for authoritative inventory snapshots; it does not change stock optimistically. Session, epoch, replay, rate-limit and dead-player admission still apply. Inventory changes and successful economic results remain behind the database commit acknowledgement.

Hotbar item details

Hover a bound quick slot to see the same item information as inventory hover. Spell details use the actually owned highest-level copy for the selected spell, with the lowest stack ID breaking ties; locked spell copies remain eligible. Consumable details describe the first usable exemplar, including its real potency. An owned but unusable stack still displays its real protection state. An empty slot or a binding whose stock is gone never retains old exemplar statistics. Equipment and quick-slot drag routes remain available.

Authoring and contribution rules

The artist guide and AGENTS.md now describe an approximate one logical pixel per centimetre reference before camera zoom. Source texture density is separate: a one-by-three-metre silhouette is 100 by 300 logical pixels, or 200 by 600 source pixels at density two. Per-frame limits and sixteen separately authored animation frames still apply. Existing runtime assets are not resized or re-reviewed.

GitHub is the canonical delivery surface: release branch, persistent Draft PR, incremental commits, explicit validation and a maintained Commandes à lancer comment. The owner retains the final merge decision.

Compatibility and release metadata

Protocol 31 adds MergeStacks and StackAll. Rebuild the server and client together; Protocol 30 peers are incompatible. Content API 10, station rules 2 and all six SQLite migrations remain unchanged. No save reset is required.

Newer releases read their explicitly declared protocol instead of inheriting one from retained historical feature markers. Existing historical protocol contracts remain checked. BUILD_REVISION.txt and the indexed notes drive the wiki revision; there is no separate generator version constant to update.

Runtime assets, balance defaults, Docker setup and the operator-owned image tag are unchanged. This source revision does not publish an image or deploy a server. The release PR and validation record distinguish implementation from native, WASM, full-build and visual acceptance.

Source: docs/changelog/R34.9.md

Vestige R34.8.1 — soul aura removal

R34.8.1 keeps Protocol 30, Content API 10, station rules 2, crate versions 2.0.1 and the six immutable SQLite migrations. Matching client and server builds remain required; no save reset is needed.

Visual cleanup

  • Player soul auras are no longer rendered. Their client schedule, editor preview, shared composition schema and dedicated runtime/source artwork are removed.
  • Soul statistics, natural-soul bonuses, fusion behavior and network compatibility are unchanged. Elite and boss rank effects remain separate and visible.
  • The visual catalogue now describes spell effects only. Authored AOE footprints still follow the effective server radius; non-AOE spells receive no footprint.
  • Projectile AOE impacts are centered on their actual actor target; terrain impacts retain the swept contact point.

Repository and compatibility

  • Obsolete soul-aura review and packing inputs are removed rather than retained as inactive compatibility layers. Historical R34.8 notes remain indexed.
  • The offline wiki remains one autonomous HTML file generated from indexed notes and actual runtime data.
  • Operator Docker tags, mounts, launch command, data ownership and permissions are unchanged. No image publication, deployment, GPU validation or playtest is implied by this source release.

Source: docs/changelog/R34.8.1.md

Vestige R34.8 — sprite auras and spell footprints

R34.8 uses Protocol 30: rebuild client and server together. Content API 10, station rules 2, crate versions 2.0.1 and six immutable SQLite migrations remain unchanged.

Visual effects

  • Soul auras use authored sixteen-frame PNG sequences, six family palettes and four progressively larger and richer tiers. Fusions retain primary and secondary family artwork. Client and editor share the validated JSON visual catalogue.
  • AOE sprites follow the effective radius and origin evaluated by the server. Projectile termination carries its cause and authoritative geometry; only collisions trigger impacts. Actor impacts center both the splash and its sprite on the struck target; terrain impacts retain their swept contact point. Bone Spear remains non-AOE.
  • Missing or invalid art is not replaced with procedural effects. Existing elite/boss rank visuals remain a separate legacy system.
  • Shared textures, bounded visible owners and layer budgets limit runtime work. Frames follow the presentation-based texture policy, with a 512-pixel ceiling.

Multiplayer and content

  • Each dungeon entrance identifies its own shared instance. Players using the same entrance still meet; separate entrances no longer alias one instance.
  • Natural souls cover all supported bonus statistics, including physical and magical critical chance, with validated progression.
  • Six northeast shin registrations are translated to restore knee continuity during running. Existing PNGs, rigs and the other directions are preserved.

Verification and compatibility

  • Source/content guards retain exact reversible historical transitions and reject subsequent unreviewed mutations. The restart-status test checks the persisted deadline instead of assuming every real restart finishes before buff expiry.
  • The automatic wiki remains a single autonomous HTML file, generated from the indexed notes and actual server rules. Earlier release notes remain included.
  • Local automated tests and offscreen review are recorded separately from GPU, playtest, Docker execution and deployment; none of those is implied by this release identity.
  • Operator Docker tags, mounts, launch command and data permissions are unchanged.

Source: docs/changelog/R34.8.md

Vestige R34.7 — repository hygiene and external rules

R34.7 uses Protocol 29: rebuild client and server together. Content API 10, station rules 2, crate versions 2.0.1 and all six SQLite migrations are unchanged. The shipped tuning retains the R34.6 balance profile, including 60% fusion success.

Runtime configuration

  • Four required JSON documents under assets/rules/ configure progression, economy, combat and encounter populations. They are loaded and validated before the server opens persistence or serves players, not compiled into the binary.
  • Clients receive the validated rules with the content bundle. The editor loads the same rules for dungeon and loot previews. Invalid or inconsistent rules cannot replace previously installed content.
  • Rebuild and distribute the Docker image after editing JSON, and restart the server. There is no hot reload or silent compiled fallback. The unchanged Dockerfile may still invalidate Rust build caching; no cache guarantee is made.

Tests, tools and documentation

  • Gameplay regression checks execute Rust behavior tests, including real HTTP server processes, historical saves, migration checksums and extreme values. Obsolete source-spelling tests and the non-authoritative Python performance mirror have been removed. Python remains for Python build/wiki/art behavior.
  • tools/check.py is the single orchestrator; suites are organized by domain, with native/WASM/runtime checks under --full. Node remains opt-in.
  • Current documentation is indexed by task. Historical plans, release records, migrations and reviews are grouped separately; active art provenance is retained.
  • The wiki remains one standalone HTML with embedded data, images, CSS and JS. It must be regenerated after JSON changes. Runtime export drives numerical tables and configurable prose; generic changelog and atomic build protections remain.

Docker/Compose, operator-selected tags, the VM launch command, data mounts and permissions are unchanged. No image publication, deployment, artwork refresh or GPU/playtest acceptance is implied by this source release.

Source: docs/changelog/R34.7.md

Vestige R34.6 — balance

The approved 26 September 2026 balance profile uses Protocol 28 and station rules 2. Rebuild client and server together. Content API 10, the six SQLite migrations and existing saved possessions are preserved.

Combat, progression and encounters

  • Soul Altars and dungeon respawn entries provide a 96-unit sanctuary. Incoming and outgoing combat are disabled, including existing projectiles and hostile effect ticks. Blocked attempts cannot prolong combat or pending PvP OFF.
  • Player passive life/mana regeneration is reduced to 10% in combat for 10 seconds after valid hostility. Active healing stays unchanged. Equipment/soul swaps preserve resource proportions.
  • Elite maximum life is doubled and Boss life multiplied by eight after level scaling; damage is unchanged.
  • Soul, equipment and standalone spell drops use normalized inverse-square level weights over the full source level. Non-guaranteed monster equipment and ordinary spell chances are reduced; soul chances have the new 8% Normal cap with rank modifiers. Rare buffs, guaranteed chances and containers retain their chance policy.
  • Monster fragment quantities scale with source level to power 1.5 and rank.
  • Every +1 upgrade has a 1% chance to recycle its exemplar, even when locked. Upgrade to max previews and confirms a bounded sequence on one target, ending at the first break or resource limit. Failed spell upgrades recycle the entire carrier. Existing prices and normal recycling yields are preserved.
  • Soul fusion succeeds 60% of the time; failure recycles its two candidates. Locked candidates are allowed with explicit confirmation; equipped units are excluded.
  • Normal dungeon rooms contain 2–6 monsters across seeded encounter groups. Elite/Boss rooms retain one ranked monster with 2–4 guards. Distinct walkable spawn slots and a two-ranged/caster limit apply through refill.
  • Wiki drop tables use runtime monster chances and quantities, explicitly show Normal rank and update quantities with the source-level selector.

Wiki and build identity

The normal release build regenerates the wiki from the server's rule export and the indexed Markdown changelog. Its version comes from BUILD_REVISION.txt; both build scripts now reject missing or mismatched release notes before compilation or export. Newer unindexed notes also block a stale release. R34.6 is now indexed, so the wiki title, revision and latest changelog entry agree without an override. The source identity is vestige_v2_0_1_r34_6, with default image tag r34.6.

See the balance tracker (../history/plans/r34.6-tracker.md) for scope and remaining playtest targets. Source/build validation does not imply image publication, deployment or GPU/playtest acceptance.

Source: docs/changelog/R34.6.md

Vestige R34.5 — miscellaneous improvements

Account names

New accounts require 5 to 25 Unicode code points after trimming leading/trailing whitespace. Allowed characters are Unicode letters, ordinary spaces and ASCII digits 0-9, plus -, _ and ' inside the name. Those three separators cannot be the first or last character. Internal spaces and repeated separators such as Ab--C are preserved. No extra Unicode normalization, rename or migration is applied.

The server checks only after finding that the account does not exist, before hashing a new password. Both database insertion paths also enforce the new rule. Existing accounts still authenticate normally, including short or punctuated legacy names; password verification, bans and admission barriers are unchanged. Login, session materialization and administrator selectors share the 25-character lookup boundary. The combined login form explains creation requirements without blocking legacy login; rejected creations return a readable message.

Compatibility and release status

R34.5 keeps Protocol 27, Content API 10 and the same six SQLite migrations. Crate version remains 2.0.1. The Dockerfile, direct VM command and local Compose behavior are unchanged. The implemented code had a user-reported 68/68 PASS before release promotion. After R01a, the operator confirmed the full checks and final-labelled release build were OK; R01b source/package validation is therefore closed. The default build tag is r34.5. Remote image publication and real-container/GPU acceptance remain separate.

Source: docs/changelog/R34.5.md

Vestige R34.4 — local administration, readable spell HUD and direct Docker

Administration and durability

  • Add a bounded local admin console with trusted cross-world announcements, read-only player/item/server queries and help. It uses the running server's stdin, not a public remote administration endpoint or player chat commands.
  • Give catalog items with exact positive u64 quantities. Remove the arbitrary 10,000-per-item and 100,000-total caps; overflow, capacity and output-size violations reject the whole batch. Success waits for durable commit. Large quantities remain stack amounts, not one allocation per unit.
  • Route kick, safe-spawn and kill through the authoritative player lifecycle. Add permanent/timed account bans, unban and paginated ban queries. Pending administration fences concurrent admissions; durable acknowledgement precedes success and live-session revocation.
  • Make /save acknowledge a fresh committed checkpoint. /stop has one ten-second countdown, cancellable only before draining, and converges with SIGTERM on the durable shutdown path.
  • Store rotating diagnostics in logs/ beside the database. Queues are bounded, audit capacity is reserved and logging drains after persistence on graceful shutdown. Ordinary diagnostics are file-owned, not docker logs-owned.

Spell HUD and artwork

  • Share whole-unit status/cooldown formatting: seconds below one minute, minutes below one hour, then hours. Minutes/hours round down; seconds round up. Examples: 59s, 1 min at 90 seconds, 2h at 2.1 hours.
  • Reserve each status label's measured width plus ten UI points. Center it below the icon and wrap Blessings and Afflictions separately on narrow windows.
  • Show accepted spell cooldowns immediately above the actual quick-slot bar. Only initial cooldowns over one second create an entry; the last second remains visible. Rejected casts do not reset it. One action shares one server deadline across equipment/shortcuts, and room transfers do not restart the countdown.
  • Replace both Healing Light atlases separately: the cast ankh and the release sigil/leaf animation use authored sixteen-frame sprites with transparent gutters. The old release retained the rectangular backing after the earlier cast-only change; it is now replaced too. Timing, anchors and healing are unchanged.
  • Remove the generic procedural release ring for pure buffs. Buff cast sprites and persistent Might/Ward/Precision/Haste auras use 50% of authored alpha, consistently across both depth layers. Bonus strengths and durations are unchanged.
  • Explicitly prohibit new procedural gameplay VFX in AGENTS.md, including embellishments and missing-asset fallbacks. Use authored sprites/atlases only. This is not a claim that all older procedural effects were removed.
  • Type the cooldown border width explicitly as f32, removing the reported deprecated float-literal fallback without suppressing compiler warnings.

Repository and Docker workflow

  • Replace nested version-specific master validators with tools/check.py. Keep useful gameplay/art/security regressions, native tests and opt-in Node tests; remove obsolete progress snapshots, redundant scripts and instructions.
  • Use root compose.yaml for local play, publishing port 8080 and bind-mounting ./data:/data. No named data volume, UID/GID variables, ownership migration, permission helper, startup wrapper or source checkout on the VM is required.
  • Preserve the operator's detached VM command, vestige-server, vestigeNet, --restart unless-stopped and /var/data:/data. Local interactive Compose uses on-failure separately. VM stdin is not interactive; use Docker stop/start there, not assumptions about local console /stop restart behavior.
  • Keep the operator-owned Dockerfile unchanged. Tests accept valid tagged or digest-pinned image inputs and distinguish executable permissions on the image binary from forbidden permission changes on the host data mount.

Compatibility and validation status

  • Source identity is R34.4; crate version remains 2.0.1. Protocol 27 includes trusted announcements and owner-only cooldown notifications. Rebuild server and browser client together; Protocol 25/26 bundles are not interchangeable.
  • Content API 10 is unchanged. The sixth immutable SQLite migration adds account bans. An older server must not be restarted over a database whose newer ledger it does not support. Existing migration backups, checksums and one-writer checks remain in place; the metadata closeout adds no migration and resets no saves.
  • R01a aligns source labels, the changelog/wiki inputs and default build tag. After R01a, the operator confirmed that the full checks and release build were OK; R01b source/package validation is closed on that confirmation. The earlier 68/68 summary remains pre-R01a evidence, not a newly supplied detailed run log. This documentary closeout changes no game code or assets and records no remote image publication or new real-container/GPU validation.

Source: docs/changelog/R34.4.md

Vestige R34.3 — levelled buffs and isometric combat visuals

Buff spell progression

  • Might, Ward, Precision and Haste use the selected spell exemplar's level, not character level or equipment upgrade level. Strength rises linearly from 5% at level 1 to 30% at level 100, then caps; Precision grants percentage points of critical chance, not a relative multiplication of the old chance.
  • Duration interpolates linearly between 15s at level 1, 2min at level 10, 5min at level 100 and 1h at level 1000; it stays capped at one hour thereafter.
  • The server, inventory previews, active-status tooltips and exported codex use the shared evaluation. Upgrading a spell affects future casts, not active buffs.
  • Absolute expiry survives save/reconnect without a full-duration refresh. Weaker effects neither replace nor extend stronger ones. Existing potion strengths, periodic effects, mana/radius progression and cast timings remain unchanged.

Melee and spell presentation

  • Replace the procedural melee segment fan with the authored sixteen-frame swing. The pivot is the painted ellipse centre, elevated consistently from the neutral body rig; orientation is applied before isometric compression. The effect follows the displayed actor without attaching to the weapon or retargeting an active hit.
  • Advance the whole swing along the captured attack direction by 25% of reach, capped at 24 world units. Preserve the projected ellipse, critical tint/scale, 80 FPS and 0.205s lifetime. Server collision, damage, timing and reach are unchanged.
  • Replace Bone Spear's misleading cast-breakup image with a distinct hollow aura. Align its terminal effect with projected flight, retaining the last usable direction when terminal velocity is zero. Other impacts do not inherit this rotation.
  • Correct Frost Shard terminal atlas playback and explicit source-density handling introduced by the post-R34.2 fixes. Frames render individually at logical size.
  • Give Fireball all sixteen explicit registrations, preserving its authored shape rather than stretching the first frames with an obsolete four-frame square mapping.

Validation and editable artwork

  • Move the migrated active art/gameplay tests from frozen mutable-file hashes to semantic sprite, registration, binding, schema and gameplay contracts.
  • Add an explicit prepare/inspect/approve/status workflow for registered, non-directional simple VFX. Tests check geometry; review metadata identifies the inspected content. Builds never approve artwork or require manually pasted hashes.
  • Keep Node unit tests opt-in. The standard validation still requires native Rust, WASM, real runtime wiki export, HTTP loading and package construction. An unrequested Node suite is recorded separately and is not reported as passing.
  • Remove the client readability blockers by splitting existing responsibilities, without increasing limits or changing runtime behavior in that refactor.
  • Make historical Dire Wolf reproduction compare exact decoded RGBA rather than PNG compression/metadata, and make simulated macOS LLVM/Cargo tests independent of system-launch environment stripping. Do not repair a real Rust installation in response to a failure of those temporary fixtures.

Compatibility and release status

  • Protocol 25, Content API 10, entity schema 10, character payload 7 and the five SQLite migrations are unchanged. Authored world content is not a runtime save; the durable/ephemeral world boundary remains unchanged.
  • Deploy matching client and server builds together. Older builds that require fixed buff potency can reject scaled statuses even with the same protocol number. Do not roll an older server back over such saves; preserve an offline compatible backup before deploying. Existing saved potency=1 retains its original meaning.
  • The R34.3 candidate has a user-reported complete 84/84 automated PASS after the earlier I05 83/83. R01b finalizes source metadata and documents cumulative provenance; final-labelled artifacts must be rebuilt before publication. Automated PASS is not an in-game visual approval. Cumulatives are never reapplied over incremental updates.
  • Historical directional/anatomical review adapters remain outside the migrated simple-VFX workflow. No general removal of every historical identity check is claimed; their review boundaries and existing audits remain explicit.

Source: docs/changelog/R34.3.md

Vestige R34.2 — buffs, spell presentation and lifecycle hardening
  • Add four rare pure-buff spells — Might, Ward, Precision and Haste — as authored SelfAoe actions with bounded mana, cooldown, radius and absolute-duration status effects.
  • Reuse the existing authoritative status registry, replication and persistence path: duplicate fixed-buff families merge, expiries remain absolute across disconnect/reconnect, stable PlayerId attribution survives while process-local NetId sources are not reused.
  • Add distinct inventory icons, 16-frame cast/status presentation for the buff families, authored Blood Nova cast/release visuals and completed presentation passes for Fireball, Water Wave, Blue Lightning, Healing Light, Bone Spear, Shadow Bolt and Frost Shard.
  • Keep rare buff acquisition limited to the Forgotten Crypt boss reliquary with reviewed sub-1% individual chances and a combined chance below 3%.
  • Complete the integrated visual review with 21 authored 16-frame sequences, four persistent status overlays, three accepted static projectile silhouettes and 0 blockers / 0 advisories.
  • Complete the fail-closed V02 release suite at 59/59 gates, including workspace Rust tests, release server build, WASM check, browser build, orientation, quadruped, humanoid, documentation and readability gates.
  • Preserve Protocol 25, Content API 10, entity schema 10, character payload 7, WorldDto and all five SQLite migrations from R34.1.

Source: docs/changelog/R34.2.md

Vestige R34.1 — iron helmet composition hotfix
  • Fix the worn iron_helmet composition: the item hides both hair_front and hair_back, preventing rear hair from protruding behind the helmet.
  • Replace the temporary 118% raster enlargement with the actual scale fix: restore the reviewed R32 helmet atlas byte-for-byte and repair its RegisteredArt source/target rectangles.
  • Remeasure source at alpha >= 16 and normalize target to the established eight-direction headgear envelope already used by bone_hood, cultist_cowl and funeral_veil; this removes the legacy 38–57% vertical shrink applied to the iron helmet.
  • Seal the reviewed #equippable and registration transitions in tools/orientation/r34-1-iron-helmet-contract.json; advance orientation and humanoid-assembly references only for this helmet and the shared registration file fingerprint.
  • Keep Protocol 25, Content API 10, entity schema 10, character payload 7, WorldDto and all five SQLite migrations unchanged from R34.
  • Fix the container build context: keep deploy/prepare-data.sh as the only deploy/* file sent to Docker so the runtime helper copy cannot fail during Cloud Build.

Source: docs/changelog/R34.1.md

Vestige R34 — deterministic dungeons, hardened runtime and measured performance
  • Refactor the main combat, network, validation, editor and persistence hotspots into smaller responsibility-focused modules without changing their behavior before the functional R34 work.
  • Introduce an explicit deterministic logical dungeon graph, then project it into a validated non-overlapping spatial layout. Authored profiles can now explicitly omit boss rooms without creating boss spawns or boss chests.
  • Add first-class dungeon instance identity (instance_id, instance_epoch) and promote the wire contract to Protocol 25. Client exploration and automap geometry are keyed by the full identity so a reused numeric instance ID cannot inherit stale map state. Protocol 24 clients are incompatible with R34.
  • Bound externally decoded collections before allocation and add recipe ingredient/cardinality/identifier complexity budgets with hostile MAX / MAX+1 regression coverage.
  • Publish web, release and wiki outputs through same-filesystem staging plus atomic replacement, so an interrupted producer leaves either the previous complete output or the new complete output.
  • Pin active third-party container images by digest, run the game image as UID/GID 10001:10001, drop runtime capabilities, enable no-new-privileges, use a read-only root filesystem and validate both fresh and existing /data ownership before starting a writer.
  • Instrument roster, recall and spawner work. The frozen synthetic baseline identified superlinear recall/spawner scans; R34 replaces only those measured rescans with per-invocation indexes. At the large synthetic load, recall scans fall from 33,984 to 1,152 and spawner scans from 262,656 to 2,560; roster behavior remains unchanged.
  • Keep Content API 10, entity schema 10, character payload 7, WorldDto and all five SQLite migrations unchanged. R34 requires matching Protocol 25 client/server binaries but no SQLite migration.
  • Close native validation regressions exposed by the first macOS workspace build: preserve dungeon-transfer identity before moving its world ID, remove over-constrained 'static Bevy query aliases from extracted interaction handlers, restore deterministic healing-test RNG imports, and move test-only imports behind test boundaries.

Source: docs/changelog/R34.md

Vestige R33.16 — orientation contract hotfix
  • Fix the release build blocked after R33.15 by sealing the three already reviewed equipment-presentation transitions into the strict orientation pipeline contract: bone_staff, funeral_shield and rusted_buckler.
  • The update is deliberately narrow: only those three equippable contract digests move from their pre-R33.15 identities to the exact R33.15 identities. No atlas/head reference, PNG, registration, binding, rig or animation identity is bulk-refreshed.
  • Add an explicit reversible transition manifest and hostile regression tests so a later mutation cannot reuse this approval.
  • R33.16 keeps Protocol 24, Content API 10, entity schema 10, character payload 7 and the existing SQLite/WorldDto persistence boundary.

Source: docs/changelog/R33.16.md

Vestige R33.15 — equipment facing hotfix
  • Fix the two reported pre-R34 humanoid equipment presentation regressions.
  • Move funeral_shield and rusted_buckler behind the actor in view N so north-facing shields no longer render in front of the rest of the body.
  • Re-author the bone_staff carry rotation as a forward-pointing eight-direction weapon instead of an upright rear-leaning carried prop. The player and the staff-using humanoid enemies now present the staff on the forward side of the pose across the full direction set.
  • Add a targeted equipment-facing regression test and refresh the reviewed humanoid assembly identity for the exact changed equippable data only.
  • R33.15 keeps Protocol 24, Content API 10, entity schema 10 and character payload 7. No SQLite migration or persistence-schema change is required.

Source: docs/changelog/R33.15.md

Vestige R33.14 — Documentation and maintainability hardening
  • Replaces the accumulated root README with a short current-release entry point and introduces docs/README.md as the canonical documentation map.
  • Preserves the former root README under docs/history/ instead of mixing old R28–R33 deployment procedures into current onboarding.
  • Marks the current developer/operations/reference/player/editor/release surfaces explicitly and adds a documentation audit that checks release identity, canonical links and stale-current wording.
  • Expands AGENTS.md into project-wide non-negotiable guardrails for release metadata, documentation placement, generated artifacts, Rust readability, persistence boundaries and art-review gates. Agents apply these rules automatically; normal structural compliance is not a product decision requiring confirmation.
  • Adds a repository rustfmt.toml and a Rust readability audit so compressed one-line systems/tests cannot silently return. Existing source layout is normalized without intentional gameplay, wire or persistence changes; source files whose exact bytes are sealed by art/orientation contracts are preserved and tracked explicitly instead of being reapproved for formatting alone.
  • Keeps nine pre-existing >200-line functions under exact no-growth ratchets instead of performing uncompiled semantic module moves in this maintenance release.
  • R33.14 keeps Protocol 24, Content API 10, entity schema 10 and character payload 7. SQLite migrations, WorldDto and the durable-state scope are unchanged.

Source: docs/changelog/R33.14.md

Vestige R33.13 — Humanoid anatomy, death presentation and release promotion
  • Extend the backward-elbow correction from idle to walk, run, attack_slash, cast, defend, get_hit and death. Preserve signed animation motion around the reviewed neutral forearm pose while preventing side/quarter-view hyperextension that bends the elbow forward.
  • Generalize the humanoid anatomy gate across every active clip and every arm with an authored wrist socket. Add mutation coverage so a non-idle elbow regression is rejected instead of being hidden by otherwise valid joint connectivity.
  • Make authoritative Death terminal for replicated life during the current entity lifecycle. Zero buffered and presentation life, prevent queued snapshots from visually refilling a dead actor, and clear the terminal state only when the entity lifecycle genuinely restarts.
  • Empty retained monster health bars immediately on death and keep them at zero after EntityExit while the death hierarchy remains on screen to finish its animation. Add replication and death-presentation regressions for the retained-root case.
  • Correct reversed foot/toe direction in reviewed side and quarter-view cells for Ashen Cultist, Blood Acolyte, Cult Mage body variants and Crypt Knight without changing upper-shin artwork, rig targets, bones, pivots or animation timing.
  • Reflect only the lower-foot pixels below the reviewed ankle axis and recalibrate source alpha bounds while preserving target registration. Keep the historical art fixtures intact through a sealed, reversible transition instead of rewriting old baselines.
  • Add a semantic toe-facing orientation gate and mutation regression that restore a known bad foot orientation and require rejection. Preserve the existing humanoid assembly checks for joint and material continuity.
  • Promote the complete release identity to R33.13: feature revision R33.13, root=vestige_v2_0_1_r33_13, Docker/CloudBuild default tag r33.13, current README/application guidance and generated web release labels.
  • Make the wiki revision default derive from the newest changelog entry instead of a hard-coded R33.12 literal. Add a safe generated-metadata refresher so an already-built runtime wiki can receive the R33.13 revision and changelog without replacing its exported gameplay data.

R33.13 keeps protocol 24, content API 10, entity schema 10 and character payload 7. It does not require a persistence migration or saved-character rewrite.

Source: docs/changelog/R33.13.md

Vestige R33.12 — Codebase consolidation before R34
  • Audit the accumulated client, server, shared simulation, editor, persistence, network, content, web shell, build tools and test contracts. Preserve protocol 24 and character payload 7.
  • Enforce the existing durable inventory stack limit at every stack allocator, preserve rejected loot and rewards, and reclaim only the fused soul owned by an expired drop. Keep soul scrapping atomic, remove duplicate fusion staging and avoid repeated inventory scans in station loops.
  • Bound both inbound WebSocket frames and messages, exclude unjoined sockets from gameplay chat, and avoid persistence work for rejected economic commands. Support exact trusted proxy addresses with an overwritten single-IP header and fail-closed updater checks.
  • Enforce primary-attack recovery, with Haste/Frozen cadence, after preparation ends. Apply authored spell cooldowns consistently across all three admission paths, retain positive Renewal healing across world transfers, and release melee preparation at its exact authoritative deadline.
  • Share bounded swept movement checks between server, AI, client prediction and replay, including crossed cells, diagonal corners and neighboring tree trunks. Correct finite melee-sector endpoint contact.
  • Remove allocation from repeated status modifier reads, reclaim expired dungeon instance records and replace retired snapshot test copies with a decoded production replication regression.
  • Stop local movement prediction, input emission and map revelation after death or removal. Resume only on the authoritative local entity's re-entry. Clear terrain, collision and pending chunk materialization on every accepted replication epoch, including transfers that end in the same world.
  • Preserve reliable cast start/release presentation against older snapshots, for both local and remote actors.
  • Preserve fractional pointer movement in pixel-snapped editor drags. Write required chunks before publishing a world manifest, and make world reset use the discovery baseline consistently after a save.
  • Preserve integer JSON fields and equipment-slot selections in the editor. Refresh PNGs without discarding unsaved documents, and invalidate dungeon previews when their inputs change.
  • Reject nonfinite healing and invalid spawn coordinates. Bound dungeon dimensions, room counts, work and chunk allocation before generation; share validation between loading, editor and generation.
  • Close off-canvas omissions in humanoid material checks. Validate both planar transform basis columns and atlas rectangles against actual client ECS exports. Replace stale success reports with structured failures for malformed inputs, including oversized JSON integers.
  • Repair historical verification contracts through narrowly reviewed transitions while retaining original fixtures, current asset checks and mutation regressions. Correct current release metadata and include previously omitted relevant checks in the stable verifier.

This corrective release does not redraw artwork, migrate saved characters or introduce a new network protocol. The accompanying audit report records executed checks and remaining limits.

Build warning follow-up

  • Remove unused client/server runtime data, imports and retired wrappers; scope browser-only and test-only helpers to their actual targets. Keep validation and ownership regression coverage.
  • Enable nontrapping float-to-int conversions in wasm-opt, matching the saturating conversion instructions emitted by Rust. Preserve the unoptimized fallback on genuine optimizer failure.
  • Restore the pinned LLVM helper PATH after rustup on macOS and pass both valid LLVM library directories explicitly to Cargo. Keep helper preflight diagnostics active.
  • Add optimizer and macOS wrapper regressions; renew only independently reviewed software identities and the wiki mechanics source guard. See docs/history/releases/R33.12-warnings-fr.md for applying this supplementary patch and rebuilding.

Resting elbow follow-up

  • Correct backward elbow flexion in the six side/quarter views of the shared humanoid idle animation. Retain breathing motion and the existing N/S, movement and combat poses.
  • Add a geometric resting-arm regression and a build gate that reject forward-pointing player elbows, even when the joints remain connected. Review the composed player and NPC poses and compare a fresh actual-client ECS export.

Source: docs/changelog/R33.12.md

Vestige R33.11 — Humanoid assembly and salvage balance
  • Repair the active player and monster humanoid rigs: place front/back shoulders at the visible torso edges, reconnect offset elbows, and give overlapping arm/leg segments distinct draw depths. Keep held weapons between palms and fingers.
  • Fit oversized hoods and legacy torso armor to the actual body. Bind each cape as one continuous shoulder-attached cloth with its clasp, removing the duplicated full-cape assembly. Preserve the original sprite pixels and all eight authored directions.
  • Add a strict humanoid/equipment assembly gate to web and release builds. Discover active rigs, body variants and equipment; validate parent/socket references, finite directional data, registrations, animated material contacts and ambiguous overlapping depths. Produce a browsable report and block unreviewed artwork or binding changes.
  • Compare the independent assembly evaluator with actual client ECS transforms through a test-only exporter. Mutation tests preserve regressions such as missing arms, disconnected joints, tied depths and omitted review coverage.
  • Halve per-item equipment, spell and soul salvage value, rounding down with a minimum of one for previously positive returns. Ordinary/enhanced potion returns of zero or one stay unchanged. Divide before final currency saturation; preserve atomic stack dismantling, locks and equipped-item exclusions. Update wiki formulas and generated tables.

Skeleton follow-up

  • Correct anatomical shoulder placement in NE/NW and hip side placement in S/SE/NW for both active humanoid rigs. In the reported NW view, move the left arm to the left and the back/cape mount to the right.
  • Add explicit wrist mounts for separate gloves. Align the reported player's NW elbow and wrist using inspected cuff centers; place the near upper sleeve over the forearm opening.
  • Extend H debug mode with live entity bones, joints and attachment sockets. Left bones are cyan, right bones magenta, the central chain white, and sockets gold. The overlay follows actual animated global transforms and remains disabled by default.
  • Replace exhaustive animation resampling during ordinary builds with strict identity/structure/anatomy checks and all 968 rest configurations. Keep exhaustive animated review under tools/check-humanoid-assembly.py --full; request a gallery with --report. Ordinary successful builds write only the JSON result.
  • Add regressions for wrong anatomical sides, reversed segments, detached wrist bindings and misaligned cuff centers even when pixels still touch. Keep unreviewed asset or animation changes blocking.

Source: docs/changelog/R33.11.md

Vestige R33.10 — Progression tuning and animated status sprites

Progression tuning

  • Raise soul, equipment and spell upgrade costs to base × L² + floor(base × (L−1)² / 4) (base 8 for equipment/spells): +20.25% at level 10, approaching +25% at high levels. Preserve level-one prices and all salvage/drop yields so the increase adds resource grinding.
  • Raise monster life exponent from 1.20 to 1.23 and damage exponent from 1.00 to 1.05. At level 100 this means about +9.5% life and +16.4% damage; at level 1000, +17.2% life and +30.4% damage. Species anchors, defenses and player power curves stay unchanged.
  • Update the runtime wiki tables and prose together with the reviewed source fingerprints.

Animated status sprites

  • Replace procedural status meshes with eight distinct painted-style sprite animations: Bleeding, Burning, Frozen, Renewal, Precision, Might, Ward and Haste.
  • Animate sixteen authored frames per effect with a stable ground anchor and actor-relative scale. Preserve character legibility with layered transparent effects.
  • Reuse texture handles and retain the visible-effect budget, local-player priority and immediate cleanup on expiry, death or disappearance.

Source: docs/changelog/R33.10.md

Vestige R33.9 — Status effects and buff potions
  • Add eight temporary status families: Bleeding, Burning, Frozen, Renewal, Precision, Might, Ward and Haste, with server-authoritative application and expiry.
  • Physical melee hits can cause Bleeding. Fireball burns, Frost Shard slows movement and attack/cast cadence, Healing Light adds healing over time, and Bone Spear/Blood Nova can bleed. Existing immediate spell effects remain.
  • Add Precision, Might, Ward and Haste potions with unique recipes and icons. Their bonuses last 30 seconds; alchemy doses extend duration to 40/50/60 seconds. Buffs do not stack with themselves or consume useless duplicate doses.
  • Give each status an animated world effect and timed HUD icon. Keep spell/status visuals separate from soul and encounter-rank auras.
  • Preserve stronger statuses against weaker refreshes and retain periodic tick cadence when refreshed. Damage/healing snapshots avoid recursive procs and double critical/defense calculations.
  • Persist remaining status lifetimes across reconnects and restarts using absolute deadlines, without retroactive offline ticks. Upgrade protocol to 24 and save payload to 7; older characters migrate with no active statuses.
  • Preserve kill/loot attribution after the status author dies or disconnects; offline rewards survive restarts and are claimed once on login.
  • Extend the English wiki with a Status effects guide, spell effects, buff-potion details and recipes.

Source: docs/changelog/R33.9.md

Vestige R33.8 — Spell inventory tab
  • Add a Spells tab to the inventory, between Equipment and Consumables. It contains items equipped in the spell slot; Equipment now contains weapons, armor and accessories. Weapons that grant spells, such as Bone Staff, remain in Equipment.
  • Search and sorting apply within Spells. Sorting All by Type groups spells separately from ordinary equipment.
  • Keep the existing double-click, equipment drag-and-drop, quick-slot binding, locking, stacking and upgrade behavior. This is a client-side view of the same inventory: existing items and bindings require no migration, and the network protocol is unchanged.
  • Update the English wiki inventory guide and default wiki release label to R33.8.
  • Fix the inventory filter test setup: embed the required real item manifests instead of treating every entry in assets/items as an item directory. Unrelated files and directories no longer break all three tests.

Source: docs/changelog/R33.8.md

Vestige R33.7 — Ten-frame soul aura animation
  • Animate every soul family, tier and fusion through ten distinct keyframes in a two-second loop. Interpolate between adjacent frames, including the last-to-first transition, at the existing 20 Hz geometry refresh rate.
  • Add a breathing isometric seal, traveling light, varying filament thickness and rising ribbon motion. Front strands remain at the feet; taller ribbons stay behind the actor.
  • Generate and cache the ten poses once per equipped soul visual state. Rebuild them when the soul changes and release them with the aura on death, unequip or departure. Reuse the same three meshes and shared material throughout playback.
  • Preserve rank auras, crowd limits, local-player priority and the six family/fusion identities. Position tracking remains frame-by-frame.

Percentage-based resource regeneration

  • Life and mana regeneration now restore a percentage of effective maximum resources each second. Existing numeric coefficients become percentage points per second: the authored player starts at 1% life and 4.5% mana per second. Bonuses add percentage points (1% base + 0.5 bonus = 1.5%/s).
  • Soul and equipment regeneration bonuses use the logarithmic multiplier 1 + 0.15 × ln(level). A level-one bonus of 0.5 becomes approximately 0.67 at level 10, 0.85 at level 100 and 1.02 at level 1,000. Monster/base regeneration percentages no longer grow with actor level; their absolute recovery grows with maximum resources.
  • The character sheet shows both %/s and resource units/s. Item, soul, altar, /stats and wiki labels use the new units. Recovery clamps to maximum, works from empty mana and never revives zero-health actors. Calculations use f64 intermediates to avoid overflow.
  • Protocol 23 requires matching clients and server. Save payload 6 stays compatible: existing stored bonus coefficients are interpreted as percentage points and their effective upgrade bonuses are recalculated. No inventory, soul level or currency is removed.

Faster critical and dodge upgrade bonuses

  • Soul (including fused souls) and equipment critical chance and critical damage bonuses scale by 1 + 0.60 × ln(level). Dodge bonuses keep 1 + 0.25 × ln(level). Level-one values stay unchanged.
  • A base 5% critical chance bonus becomes approximately 11.91%, 18.82% and 25.72% at levels 10, 100 and 1,000 respectively. A base 5% dodge bonus remains 7.88%, 10.76% and 13.63%. These are bonus values before adding base stats and other sources. Existing final chance caps still apply.
  • Regeneration and monster defense keep their 0.15 logarithmic coefficient. Main power curves, prices, protocol 23 and save payload 6 remain unchanged. Existing items and souls automatically use the new curves.

Player-friendly wiki navigation

  • Add a home page with shortcuts for first steps, souls, alchemy and dungeons, plus navigation grouped by player goals. Browse one topic at a time with JavaScript, or read the full document offline without it.
  • Split long guides into named, expandable topics and collapse catalog details. Add equipment, spell, potion, material and soul filters to the item collection. Search across guides, recipes and catalogs, with a resettable empty state and working deep links.
  • Restore the previously omitted dungeon guide, group aura explanations with souls, put recipes before ingredient sources and label recipes by their output potion. Correct obsolete introductory equipment scaling text.
  • Preserve server-exported level tables, exact large currency values, source references and all existing catalog anchors. No game balance or protocol changes.

Wiki spell filter fix

  • Classify items equipped in spell slots under Spells instead of Equipment. Weapons that grant spells, such as Bone Staff, remain under Equipment. Add a browser regression covering all eight spell items and the equipment filter.

Source: docs/changelog/R33.7.md

Vestige R33.6 — Deeper crypts and encounter ranks
  • Forgotten Crypt now has 18–24 main-path rooms plus 3–4 optional treasure rooms (21–28 total), including 3–4 elite rooms and one final boss. Normal rooms select among all three authored layouts, deterministically by seed.
  • Corridors and their turns are three cells wide. Rooms grow to 14–20 cells across, with a 26 × 24 boss arena. Template-aware spacing preserves walls between rooms; treasure branches alternate sides and never block the route to the boss.
  • Encounter levels rise with depth: N = ceil(1.25 × dungeon level) + 2 × depth + 4 × (difficulty − 1). Elites use ceil(1.2 × N), bosses ceil(1.5 × N). The R33.4 monster stat curves remain in use; loot follows the resulting monster level.
  • At dungeon level 100, difficulty 1, the first normal encounter is level 127 and the boss is level 239–257, depending on dungeon length. At dungeon level 10, these are level 15 and 71–89. This is a progression through a longer dungeon, not player soul-level matching.
  • Replace encounter badges with gold elite auras and larger red boss auras. Elites have a broken solar seal; bosses have a double seal, eight thorns and a tall rear crown. The role remains server-assigned and survives respawn/reentry. Auras stay visible with life bars hidden and disappear on death.
  • Refine all soul and rank auras with feathered light, faint moving mist and detailed rising energy filaments. Keep each soul family's seal and fused colors. Limit rendering to 24 player auras plus 16 ranked monsters, prioritizing the local player and bosses; reuse meshes and update geometry at 20 Hz.
  • Protocol 22 requires matching client/server versions. Character saves remain compatible. Existing live dungeons retain their layout until they expire; newly generated instances use the new layout. Empty-instance expiry and the dungeon /mark restriction are unchanged.

Source: docs/changelog/R33.6.md

Vestige R33.5 — Soul rituals and distinct ingredients
  • Replace orbiting soul particles with engraved isometric seals, softly pulsing strokes and restrained side veils. Each of the six soul families has its own geometry and muted palette.
  • Add visual detail at soul levels 10, 100 and 1,000. High levels now reach the client without the former visual level-100 clamp. Final-tier size remains bounded.
  • Fused souls combine the dominant seal with secondary-family veils and outer accents. Ground, rear and front meshes use separate depths; front accents remain near the feet.
  • Reuse aura meshes, refresh geometry at 20 Hz while following player movement every frame, and limit crowded scenes to 24 auras with local-player priority. Remove meshes on death, unequip or departure.
  • Give Bone Dust, Beast Marrow, Spectral Residue, Monster Bile and Herb original transparent 128×128 sprites, shared by inventory, alchemy, dropped items and wiki.
  • Preserve the existing Bloodleaf, Mooncap, Ashroot and Ghostbloom artwork exactly. Scraps, Volatile Chaos and Liquid Chaos also retain their distinct existing icons.
  • Update the wiki and review only the changed aura rendering contract. No gameplay balance, collision, actor rig, head atlas or save-schema changes.

Source: docs/changelog/R33.5.md

Vestige R33.4 — Long-term progression and safe world marks
  • Replace exponential soul and equipment bonuses with power curves: strong at level 100, much stronger at 1,000, without reaching the numeric ceiling around level 200.
  • Soul main bonuses: (1 + 0.30 × (L−1))^1.50; equipment main bonuses: (1 + 0.20 × (L−1))^1.30.
  • Spell damage/healing: (1 + 0.15 × (L−1))^1.25; mana cost uses exponent 0.65. Remove the gameplay spell level cap for upgrades, drops, saves and previews.
  • Chance/critical bonuses grow with 1 + 0.15 × ln(L); soul/equipment regeneration uses its family base with exponent 0.65. Existing range, area, speed and final chance caps remain; cooldowns are unchanged.
  • Reduce monster growth relative to player upgrades: effective level-one HP × (1 + 0.20 × (L−1))^1.20, damage × (1 + 0.20 × (L−1)), defense × (1 + 0.15 × ln(L)).
  • Retain R33.3 quadratic upgrade costs, u64 currencies and partial dismantling refunds.
  • Preserve existing fused souls’ precise level-one traits, identities and levels. Recalculate their bonuses with the new curves; new fusions interpolate those bases without high-level saturation/division loss.
  • /mark is now restricted to the main world. Using it in a dungeon is rejected with a clear message and preserves the previous mark. Main-world marks have no expiration and survive restart; dungeon idle expiration remains unchanged. Existing dungeon marks retain safe legacy recall checks and can expire with their instance.
  • Update the wiki mechanics and runtime-derived tables. Its levels 1–100 are a reference range, not a progression cap.
  • Protocol 21 requires matching client/server builds. Save payload 6 accepts older saves and prevents old servers from loading newly saved uncapped spells.

See docs/history/reviews/r33.4-balance-validation.md for reference values and verification scope.

Source: docs/changelog/R33.4.md

Vestige R33.3 — 64-bit inventory quantities and upgrade economy
  • Inventory stacks, Soul Fragments, station resources, upgrade costs, recycling yields, loot and quantity commands now use unsigned 64-bit amounts. A stack can hold up to 18,446,744,073,709,551,615 units; aggregate counters saturate at that boundary without wrapping.
  • Soul costs and yields can exceed 4.3 billion. Upgrade costs now follow base cost × current level² for natural and fused souls; bonuses are unchanged. Quadratic costs and individual yields saturate at the new numeric ceiling. This is a currency boundary, not a soul-level cap: levels still use u32, and very high-level upgrades can continue at the saturated price.
  • Equipment and spell upgrades share the same quadratic curve: 8 × current level² Scraps or Volatile Chaos. Their recycling returns 2 plus half the costs of completed upgrades. Bonus/damage growth and the spell level-100 cap are unchanged.
  • Soul recycling returns half of the base value plus the costs of completed quadratic upgrades, taken together, rounded down with a minimum of one. The next upgrade is excluded to prevent upgrade/recycle profits. Existing souls use the new valuation.
  • Recycling and equipment refund intermediates use wider arithmetic; overflowing transactions are rejected before committing. Existing lock, equipment reservation and alchemy batch-limit rules remain in effect.
  • Drop/split dialogs use exact decimal quantity entry and a Max button, avoiding floating-point rounding above 2^53. Compact labels still abbreviate large amounts; storage and transfers retain exact integers. The wiki preserves large currency integers in its browser tables.
  • Save payload v5 reads previous payloads and upgrades them on save without changing item identities, quantities or locks. Older servers must not open v5 saves. Network protocol 20 requires a matching client and server deployment.
  • Updated the rendering contract only for the loot-feed quantity-type change; sprites, poses and rendering transforms are unchanged.

Source: docs/changelog/R33.3.md

Vestige R33.2 — spell shortcuts and orientation review fix
  • Drag potions or items granting spells into any of the four quick slots. Press the assigned key to use the potion or cast the spell toward the world cursor; clicking a spell shortcut uses the last valid world aim.
  • Shortcut spells can be cast directly from inventory, including locked copies, without consuming or equipping the item. Normal mana costs, cast timing, action-busy checks and server validation apply.
  • Bindings persist by item type. Spells use the highest spell-level copy currently owned, with the lowest stack ID breaking ties; losing all copies disables the shortcut until one is acquired again. Potion stock and consumption rules remain unchanged.
  • Updated the English wiki and menu hints. Network protocol 19 requires the matching client and server; existing saves retain their schema and potion bindings.
  • Fixed the orientation gate blocked by R33.1 compact combat labels: reviewed and updated only the two affected rendering-source fingerprints. Atlas pixels, observed directions, poses and historical repair seals are unchanged.

Source: docs/changelog/R33.2.md

Vestige R33.1 — progression balance, upgraded loot and clearer numbers
  • Monster life and damage now compound by 31% per level from each species’ preserved effective level-one values, keeping pace with natural Souls. Defenses retain moderate scaling. Player base stats are unchanged.
  • Positive equipment bonuses now compound by 10% per level instead of gaining 5% of base. Equipment levels can exceed 100; spell upgrades remain capped at 100. Existing items use the new evaluation automatically.
  • Equipment loot can roll any level up to its source level, with the same descending rarity weights as Souls. Standalone spell drops can carry upgraded spell levels up to 100. Materials, potion potency, drop chances and quantities are unchanged.
  • Locked equipment, spell items and natural/fused Souls can be upgraded without unlocking them. The selected exemplar, lock and equipment reservation are retained. Locked currency remains protected, and dismantling/fusion still reject locked items.
  • Online players (O) now displays name and PvP state without a misleading player-level column.
  • Gameplay life/mana, damage/healing, inventory, item details and station amounts use compact numbers: 1200 → 1k2, 1.2 million → 1m2, 1.2 billion → 1b2. Values below 1000 retain normal precision. Levels and editable amounts stay exact; huge values use scientific notation.
  • The English wiki documents the new rules. Its 1–100 equipment tables are reference ranges, not progression limits. Existing saves keep the same schema.

Source: docs/changelog/R33.1.md

Vestige R33 — progression, stations, world clarity and persistent return
  • Equipment and spell levels now belong to each exact exemplar and are capped at 100. Workbench and Chaos Altar upgrades use the same shared costs and evaluated values as the server, UI and generated codex.
  • Soul Altar, Workbench, Chaos Altar and Alchemy Station operations are atomic. Locked, equipped, protected or reserved items are excluded; bulk previews are rechecked before commit. Seven exact alchemy recipes use four harvests and four monster ingredients.
  • Monster life, damage and defense grow more strongly above the preserved R32.2 effective level-one baseline. Small thorn bushes and resource plants remain traversable, while the oak blocks only its trunk. Idle roam is wider without enlarging combat leash.
  • Spell launches carry evaluated range and area geometry. Four projectile bodies are visually smaller, with bounded material trails; player Souls gain bounded level/family accents. These presentation changes do not change hit geometry.
  • /mark stores a durable walkable destination and /recall channels back to it under the same interruption and cooldown rules as /spawn. Dungeon marks bind to the exact live incarnation. O opens a bounded server-wide roster containing only name, level and effective PvP state.
  • Protocol 18 and character payload/schema 4 preserve legacy quantities, equipment, Souls, locks and preferences. The English codex is generated from runtime rules through level 100.

Source: docs/changelog/R33.md

R32.2 — Stabilization before R33

Fixed

  • Tab closes the inventory even when an inventory widget owns keyboard focus. It cancels local drag/split/drop dialogs without changing possessions. Chat keeps Tab completion.
  • Loose items use their real catalog or soul icon, preserve aspect ratio, and replace the neutral fallback when the texture loads. Hover uses the same item identity and statistics as the inventory.
  • Runtime data, SQLite databases and WAL/SHM/journal files are excluded from Git and build contexts. Migration SQL and intentional fixtures remain source files. Existing local databases are never deleted by these exclusions.

Spells

  • Fireball has an expanding incandescent front, core and embers, driven by its authored area radius. Collision/explosion damage is applied once per eligible victim, not twice to the primary victim.
  • Water Wave remains a self-centered area attack, with a continuous crest, foam and a restrained interior wash.
  • Bone Spear pierces three eligible actors in travel order, at 100%, 80% and 60% raw damage before each target's defenses. A target is encountered only once per flight; a dodge still consumes that contact.
  • Opted-out players and other ineligible actors do not consume piercing contacts. Solid blocked terrain stops projectiles. The existing flight lifetime remains capped at two seconds; authored range is also an upper bound.
  • Intermediate piercing impacts are cosmetic events; only the server applies combat outcomes.

Wiki and community

  • The standalone English wiki embeds versioned Markdown changelogs, sorted by numeric release version, with no background requests.
  • Play and Support the game open their HTTPS destinations in an isolated new tab. The game provides discreet Wiki/Support links and a Wiki shortcut preference.
  • On the Web client, logical W opens the wiki only when that physical key is not movement; F1 is the fallback. Repeat, typing, stale UI state and composing/modifier keys are excluded.

Repository

  • Centralizes item identity presentation and community destinations, separates projectile contacts from other combat systems, and groups Python verification by responsibility.
  • Removes regenerable review PNGs, archives root audit reports and retains artist source inputs, rejection fixtures, migrations and regression checks.

Compatibility and validation

  • Protocol v17: rebuild the server and browser client together. SQLite remains schema 3; no character reset or new database migration.
  • No automatic deployment, bucket publication or support-site payment integration.
  • Native/WASM compilation, GPU appearance and deployed-server behavior require separate validation; a passing source-data suite does not certify them.

Source: docs/changelog/R32.2.md

R32 — Directions, anatomy and useful chat commands
  • Marks north independently from the origin/exit tracker on the compass.
  • Adds private /help, /spawn, /unstuck, /cancel, /where, /stats, /pvp, /ping and /clear commands, with chat completion/history.
  • Return to spawn channels for 5 seconds, is damage-locked for 10 seconds and has a persisted 120-second cooldown after success. It does not grant health or mana.
  • Adds stronger projectile silhouettes and impact/trail presentation.
  • Repairs the fourteen head/headgear atlases identified by the initial orientation report, retaining eight independently authored directions.
  • Replaces five broken quadruped torsos, restores uniform anatomical scaling, and redraws twenty limb atlases with role/direction checks.
  • Reduces Dire Wolf head display size by 10% and strengthens its shoulders locally while preserving corrected limb attachments.
  • Orientation, limb-role and assembly checks remain enabled. Offline image/pose checks are not proof of GPU rendering.
  • Protocol v16 and SQLite schema 3. The final art patches did not add another database migration.

Source: docs/changelog/R32.md

R31.1 — Inventory feedback, life bars and English wiki
  • Visible inventory drag preview, wider loot notifications and keyboard PvP on P.
  • Removes the extra hotbar PvP button; V toggles life bars for players and monsters together.
  • Generates one standalone English HTML wiki from versioned content and a read-only Rust rules export.
  • Python wiki entry points declare dependencies inline for uv. Export JSON and runtime-constant validation fixes are retained.
  • Healing Light displays Base heal. Green numbers report actual healing, with distinct critical-heal feedback calculated on the server.
  • Protocol v15 after the healing outcome addition. No automatic wiki publication is performed.

Source: docs/changelog/R31.1.md

R31 — Readable UI, consumables and voluntary PvP
  • Zoomed-out minimap, visible hand/forearm separation and a larger dungeon exit.
  • More distinct spell charges and water/blood effects, a larger authored world with regional difficulty, and faster sprinting.
  • Four assignable potion quick slots, Escape handling, player names and voluntary PvP with white/red name feedback.
  • Caddy/HTTPS deployment documentation preserves the persistent game and certificate volumes.
  • Client test-clock/fixture fixes and the respawn snapshot timestamp correction are retained.
  • Protocol v14.

Source: docs/changelog/R31.md

R30 — Persistent accounts and world state
  • Name/password sign-in creates a new account only when the name is absent; existing names require their password.
  • SQLite persists characters, equipment, inventories, souls, world containers and loose-item expiry. Versioned migrations run as code.
  • Economic changes are acknowledged after the storage commit; authentication and storage workers remain outside the simulation tick.
  • Docker uses persistent /data. HTTPS authentication, shutdown handling and backup operations are documented.
  • The terrain hotfix preserves reset-fenced chunk delivery after joining, reconnecting and changing worlds.
  • Protocol v13. Historical release notes do not certify a new build or deployment.

Source: docs/changelog/R30.md

R29 — responsiveness and bounded replication

Simulation-credit input acknowledgements, adaptive playback, F3 diagnostics, epoch-fenced controls/world lifecycle, complete proximity enters, acknowledged keyframe deltas, bounded priority transport and typed projectile trajectories. Protocol12; Content API10, authored content and30Hz authority preserved. Local native/WASM and joined WebSocket evidence is documented in network operations (retired procedure). No VM improvement is claimed.

Source: docs/changelog/history.md

R28 — Network playback hotfix
  • Keeps a 200 ms remote buffer and 32 received snapshots for bursts.
  • Updates clock and acknowledgement once using the newest snapshot; facing and position share the timeline.
  • Reliable projectile starts/endpoints and bounded visual retirement before impact.
  • Python controls and models; Rust tests added but not executed in that work session.
  • See docs/operations/r28-cloud-playback.md; rebuild both server and WASM.

Source: docs/changelog/history.md

R28 — Monster, loot and equipment consistency
  • Skeleton Archer uses physical arrows with its worn bow; mages use spells and fall back to melee when only the free staff attack is available.
  • Animal actions are named by species. Authored monster primary timing is protected against faster attacks granted by player weapons.
  • Thematic loot, health/mana in chests, 37 obtainable equipment/spell items, a soul for each monster and a harmonized 12% cap.
  • Completes 11 physical equipment items with 14 new atlases and 112 views; 696 offline assemblies without complete invisibility. R27 sources preserved.
  • Protocol v11 and Content API v10 unchanged. The current control at that revision was tools/check_r28.py; Rust/WASM compilation and GPU validation were separate and were not run in that work session.

Source: docs/changelog/history.md

R27 — Native density-four art migration
  • Re-authors all 428 runtime PNGs at four source pixels per logical pixel while preserving logical presentation sizes and all gameplay geometry.
  • Covers 113 player/equipment, 153 humanoid, 77 creature, 47 compact/item, 24 world and 14 VFX/UI assets with exhaustive fail-closed family gates.
  • Adds source-aware client/editor atlas selection, composed directional silhouette gates, deterministic transparency/ground-line review sheets and decoded-memory accounting (48,332,800 active bytes under a 96 MiB ceiling).
  • Preserves every declared logical pivot, socket and anchor; no logical pivot adjustments were required by the migration.
  • Keeps Protocol v11, Content API v10, gameplay timing, collision, combat and world dimensions unchanged.

Source: docs/changelog/history.md

R26.5.4 — Fitted hood/cape rendering
  • Re-authors the four head-covering atlases with fitted crowns, readable face openings and direction-aware cowls.
  • Re-authors all four capes as small clasps, shoulder-following upper cloth and tapered folded lower cloth with irregular hems.
  • Keeps all eight directions authored without runtime mirroring and preserves existing slots, attachment bones, item stats and loot tables.
  • Seeds padded_coif and worn_travellers_cape on human_player and equips both by default; iron_helmet remains in the inventory.
  • Keeps Protocol v11, Content API v10 and all gameplay behavior unchanged.

Source: docs/changelog/history.md

R26.5.3 — Editor back-slot test fixture fix
  • Replaces the invalid scalar rig pivot/socket fixture with eight directional [x, y] points.
  • Keeps cape depth fixtures as eight directional scalars and preserves the full preview/validation/save/reload test intent.
  • Changes no production Rust code, gameplay, protocol, content or assets.

Source: docs/changelog/history.md

R26.5.2 — Workspace compile surface and Vestige rename
  • Removes Debug from the editor UI state containing egui::TextureHandle, which does not implement that trait.
  • Completes the client interpolation test fixture with container and entity_visuals after the replicated-entity model expansion.
  • Replaces the obsolete prototype name on all current public surfaces with Vestige, including release roots, browser/native titles, deployment image and future deliverable names.
  • Preserves R26.5 gameplay, Protocol v11, Content API v10 and the 91 inherited component gates.

Source: docs/changelog/history.md

R26.5.1 — Shared compile dependency fix
  • Moves workspace serde_json from game-shared dev-dependencies to production dependencies because non-test content validation uses serde_json::Value.
  • Preserves the exact R26.5 gameplay, Protocol v11, Content API v10 and 91-component gate inventory.

Source: docs/changelog/history.md

R26.5 — Automap, Souls, movement, equipment and refillable containers
  • Protocol v11 exposes only public container available/refill_at state; the server keeps rolled identities and quantities secret under stable world-placement keys until atomic collection.
  • Content API v10 replaces legacy resource nodes and special chest state with one loot_container capability. Full/empty sprites, optional refill timers and the existing generic loot_table now cover both chests and harvestables; refill rerolls the table once when due.
  • M toggles a transparent, non-interactive automap centered on the player. It reveals received cells within six cells (192 logical units), retains exploration per WorldId for the client session, and shows only origin, Soul Altar and dungeon entrance/exit landmarks. The bottom hints display the current map state.
  • Fused Souls use deterministic bonus-family titles of at most 24 ASCII characters; parent names remain origins rather than recursively extending the display name.
  • Player base speed is 132.0 and sprint multiplier is 1.85. Prediction and authority retain the shared 2:1 path-aligned integration, while projected animation rate, lean, dust and cape motion sharpen feedback.
  • Adds the independent back slot and fourteen ordinary data-driven equipment items: four capes, four head coverings, three body pieces and three offhands, with eight authored worn directions and generic loot-table reachability.
  • Preserves Cartesian server authority, the R26.4.2.3.1 keyboard transform, collision, combat, lossless death/respawn, projectile release height, passive targeting, bow override, hitbox default and native World Editor behavior.

Source: docs/changelog/history.md

R26.4.2.3.1 — Path-aligned movement and editor discovery fix
  • Aligns Q+Z, D+Z, Q+S and D+S with the four visible axes of the 2:1 isometric world (about 26.6 degrees) instead of forcing 45-degree screen diagonals that drift across paths.
  • Keeps the same projected movement speed for the four single-key directions and the four combined-key directions.
  • Replaces the editor test's frozen 13-action total with discovery checks for both attack_slash and the new ranged_attack.
  • Preserves protocol v10, authoritative Cartesian simulation, collisions, sprite-facing selection and native World Editor behavior.

Source: docs/changelog/history.md

R26.4.2.3 — Stable projectile height, controls and bow primary
  • Captures the animated cast socket height at projectile release and preserves it for the entire flight instead of dropping toward a fixed 44-pixel offset.
  • Normalizes keyboard movement in projected screen space, preserving the 2:1 isometric geometry while making apparent speed equal in all eight directions.
  • Restricts the H hitbox shortcut to the live InGame state; typing a player name can no longer enable hitboxes before joining.
  • Adds the physical, mana-free ranged_attack and arrow_projectile; equipping hunting_bow now overrides left-click primary attack without changing the equipped right-click spell.
  • Makes melee, bow-primary and spell releases mutually exclusive, including commands received in the same server drain; no paid spell can be overwritten by a bow shot.
  • Starts a newly replicated projectile exactly at the captured hand socket even if its authoritative position already advanced, and keeps the captured release height afterward.
  • Uses the projected player speed for walk/run selection in every heading and resolves the local primary animation delay from the equipped weapon action.
  • Documents ZQSD for French AZERTY keyboards; the bow action declares no separate cooldown because player action cooldown state is not part of protocol v10.
  • Preserves protocol v10, authoritative Cartesian collision/combat coordinates, native World Editor behavior and all R26.4.2.2 passive-combat rules.

Source: docs/changelog/history.md

R26.4.2.2 — Isometric spell origins and passive combat surface
  • Separates authoritative ground-plane cast coordinates from client-only visual height.
  • Starts projectiles and beams at each rig's animated cast socket; cast auras remain attached to the actor's feet.
  • Gives passive actors combat stats and rejects future behavior-driven entities without stats.
  • Passive actors can be hit and killed but still never acquire or retaliate against an attacker.
  • Preserves protocol v10 and native World Editor behavior.

Source: docs/changelog/history.md

R26.4.2.1 — Native client test clock compile fix
  • Specializes the Bevy test clock as Time<()>, removing Rust E0283 from cargo test --workspace on Bevy 0.18.1.
  • Adds a focused regression gate and preserves all R26.4.2 gameplay, assets, protocol and projected-facing behavior unchanged.

Source: docs/changelog/history.md

R26.4.2 — Projected sprite facing
  • Projects authoritative logical facings before selecting client atlas rows, rig poses, hair and worn-equipment directions.
  • Makes S select the South sprite while retaining logical southwest movement in the Cartesian simulation.
  • Covers all eight screen directions and keeps protocol v10, combat, collision, assets and movement speed unchanged.

Source: docs/changelog/history.md

R26.4.1 — Screen-relative isometric controls
  • Converts keyboard directions from screen space back into the authoritative Cartesian world before prediction and transmission, preserving visible cardinal and diagonal headings at uniform logical speed.
  • Projects the logical vector toward world origin before drawing the compass, so its arrow matches the isometric camera.
  • Keeps protocol v10, simulation coordinates, collision, content, assets and the R26.4 death/respawn behavior unchanged.

Source: docs/changelog/history.md

R26.4 — MECE content, lossless death and isometric world
  • Moves item manifests to schema v9 and removes the duplicate item-level spell object. Ordered granted_actions now provides the only item-to-action relation while the spell equipment slot and spell action kind remain valid.
  • Replaces directional inventory sheets with full-texture square South-view icons. Worn equipment, entity and rig presentation remain independently authored eight-direction 256×32 atlases with no mirroring.
  • Adds an explicit server-owned player death state. Death cancels control and pending actions for exactly 45 fixed ticks (1.5 seconds), preserves all possessions and progression, and respawns the same player at a live dungeon entry, nearest authored Soul Altar, or world spawn in that priority order.
  • Keeps collision, simulation, chunks, combat, aim and wire positions Cartesian while routing client world roots, camera and pointer conversion through one canonical 2:1 isometric presentation boundary.
  • Replaces top-down terrain art with deterministic dark isometric 64×32 diamonds and 64×96 decorations whose presentation metadata does not alter gameplay cells.
  • Preserves protocol v10, Rust 1.97.0, Bevy 0.18.1, pinned macOS LLVM helpers, AssetMetaCheck::Never, the single release/assets package tree and the existing Artifact Registry path.

Source: docs/changelog/history.md

R26.3 — Pinned native LLVM tools and quiet Web assets
  • Prepends the Rust 1.97.0 sysroot LLVM binary directory on macOS, so release stripping uses the matching rust-objcopy instead of a broken helper from the mutable stable alias.
  • Preflights rust-objcopy for release profiles and preserves R26.2's absolute rust-lld selection for WASM links, with the same actionable toolchain repair diagnostic.
  • Configures the Bevy client with AssetMetaCheck::Never; Vestige uses no external asset metadata, so the browser no longer requests nonexistent sprite.png.meta sidecars for transient VFX and gore assets.
  • Keeps every referenced PNG in the generated release/assets package and documents the exact command for launching that self-contained local package.
  • Protocol remains v10; gameplay, content, editor and deployment contracts are unchanged.

Source: docs/changelog/history.md

R26.2 — Absolute pinned WASM linker
  • Fixes the remaining Apple Silicon link failure where Cargo 1.97.0 still invoked the bare rust-lld name and rustup resolved it to the broken stable linker.
  • Exports CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_LINKER with the absolute rust-lld path from the already-preflighted Rust 1.97.0 sysroot.
  • Adds an executable regression that places a failing stable linker first in PATH, preloads the same wrong Cargo linker variable, and verifies both Cargo target syntaxes still execute the pinned linker.
  • Protocol remains v10; R26.1 release layout and all gameplay/editor behavior are unchanged.

Source: docs/changelog/history.md

R26.1 — Release hygiene and macOS WASM linker fix
  • Expands .gitignore for macOS/Windows metadata, Rust/Python and WASM outputs, IDE state, logs, archives, temporary files and local secrets while keeping web sources, deploy/ operations and Cargo.lock versioned.
  • Moves generated local release artifacts from the versioned deploy/ source directory to ignored release/; packaging can no longer delete the deployment scripts.
  • Runs all release Cargo builds through the project-pinned Rust 1.97.0 toolchain, even when the shell selects the mutable stable alias.
  • On macOS, exposes the pinned sysroot library directory to dyld and preflights rust-lld before a WASM link, with exact reinstall commands when the toolchain is incomplete.
  • Updates the Docker build and active release documentation for the release/ layout and r26.1 image tag.
  • Protocol remains v10; R26 editor, documentation and deployment behavior is unchanged.

Source: docs/changelog/history.md

R26 — Vestige editor, documentation and deployment closure
  • Expands the native editor into explicit Rig, World, Content, Dungeon and Validation modes, with chunk/cell painting, entities, portals, spawners, collision, tags and AI-radius overlays.
  • Moves deterministic dungeon generation, encounter scaling and effective loot chance into game-shared; the editor preview and authoritative server now execute the same logic.
  • Adds data-driven editing for entities, items, actions, loot tables, dungeon profiles and room templates, plus an aggregated validation report over content, assets, rigs, equipment and cross-references.
  • Reorganizes active documentation by player, developer, artist, editor, operations, reference, Vestige and history audiences; the root README is reduced to entry points.
  • Adds health-gated blue-green deployment scripts for COS with a single internal port 8080, WebSocket-capable Nginx proxying and a retained previous rollback container.
  • Completes independent evidence for Vestige requirements #7, #8, #13 and #23. Static deployment validation does not substitute for a live VM/traffic smoke test.
  • Protocol remains v10; R25.5 rig namespaces and all earlier combat, world, dungeon and content behavior remain preserved.

Source: docs/changelog/history.md

R25.5 — Humanoid head fix & spectral morphologies
  • Fixes the player/all-humanoid head regression by scoping rig parts and child graphs by library; humanoid/head can no longer be overwritten by quadruped/head.
  • Applies the same library scoping in the native Content API editor, including preview, direct manipulation, equipment attachment, saving and shared animation-library lookup.
  • Separates part-library and animation-library selection so small_humanoid and tall_humanoid use distinct rest proportions without duplicating compatible humanoid clips.
  • Restores a dedicated five-part Wraith rig with floating idle/drift/rush/cast/attack/get_hit/death clips and replaces the Grave Wraith's temporary generic humanoid presentation.
  • Adds a separate five-part Ghost rig, deterministic pale spectral atlases, the Crypt Ghost monster/Soul, and Forgotten Crypt encounter-pool integration.
  • Spectral monsters dissolve without spawning blood burst/pool effects. All morphologies remain explicitly authored for eight directions without runtime mirroring.
  • Protocol remains v10; R25.4 combat fairness, dungeon scaling, mana tuning, world isolation, loot and exits are unchanged.

Source: docs/changelog/history.md

R25.4 — Reusable monster rigs & combat fairness
  • Restores the intended morphology-first presentation architecture: Forgotten Crypt humanoids use the shared humanoid rig and R25 beasts use the shared quadruped rig; animation clips live in rig libraries, not monster definitions.
  • Renames quadruped wolf_* bone ids/tracks to generic body/head/leg_* ids and adds reusable quadruped attack and get_hit clips.
  • Keeps the player's fast/generous attack_slash unchanged while monster melee uses a separate telegraphed slash plus preferred-range engagement and one per-target melee slot during cooldown/recovery.
  • Replaces linear dungeon stat multiplication with sublinear per-stat scaling; mana regeneration no longer scales with dungeon level.
  • Physical monster attacks still cost zero mana. Spellcasting monsters are tuned to roughly 3–6 consecutive casts before depletion and expose a blue mana bar under health.
  • Protocol remains v10; world isolation, dungeon generation, loot, exits and tracker statuses are unchanged.

Source: docs/changelog/history.md

R25.3 — Dungeon presentation & exit fixes
  • Adds dedicated 32×32 world sprites for every non-rig Forgotten Crypt monster and a client fallback to inventory_sprite when future entity presentation content has neither rig nor sprites.
  • Replaces Greater Health/Mana Potion glyphs with readable bottle-shaped pixel-art sprites.
  • The entrance-side dungeon_exit always allows abandoning a dungeon run; the boss chest remains server-authoritatively locked while the boss is alive.
  • Protocol remains v10; dungeon generation, encounter scaling, loot, world isolation and Vestige tracker statuses are unchanged.

Source: docs/changelog/history.md

R25.2 — Rust float-literal compile fix
  • Fixes the remaining R25/R25.1 game-server compile errors caused by Rust-invalid leading-dot float literals in dungeon generator/tests (.3 / .5 → 0.3 / 0.5).
  • Adds a lexical regression gate over all Rust sources that ignores strings/comments/ranges and rejects actual leading-dot numeric literals.
  • Protocol remains v10; dungeon generation, scaling, world isolation, combat, content, and Vestige tracker statuses are unchanged.

Source: docs/changelog/history.md

R25.1 — Cast delimiter compile fix
  • Fixes the R25 game-server compile error in crates/server/src/combat/systems.rs by removing one extra closing brace from the Delivery::Beam | Delivery::SelfAoe branch of release_casts.
  • Adds a dedicated regression gate that fails on the exact malformed }}} sequence.
  • Protocol remains v10; dungeon, combat, AI, world isolation, content, and Vestige tracker statuses are unchanged.

Source: docs/changelog/history.md

R25 — Procedural Dungeon Engine & content expansion
  • Protocol v10 adds authoritative WorldTransferred events and runtime WorldId isolation for outdoor/dungeon worlds.
  • Dungeon Gate interaction creates/reuses a DungeonInstance; instances follow Active/Empty/Expiring/Destroyed lifecycle with a grace period.
  • Forgotten Crypt uses deterministic graph-first room/corridor generation with artist-authored room templates and 1000-seed invariant coverage.
  • Dungeon encounters scale from dungeon level + room depth + elite/boss/difficulty modifiers, converted through each monster's real base level into the existing stat multiplier path.
  • Treasure/boss chests reuse the same generic loot roll engine as monsters; boss exit/chest gating and dungeon-entry respawn are server-authoritative.
  • Adds coherent Undead/Cultist/Beast families, representative equipment/consumables/keys/Souls, and Bone Spear/Blood Nova/Shadow Bolt/Frost Shard/Healing Light content with PNG assets.
  • Vestige bullets #6 and #10 move to Verified; #13 gains R25 content evidence and remains Implemented pending R26 editor/artist documentation closure.

Source: docs/changelog/history.md

R24.1 — Protocol world-import compile fix
  • Fixes the R24 game-shared compile error by importing ChunkDef and ChunkId in protocol/mod.rs.
  • Keeps CellDef and CHUNK_CELLS test-only inside the protocol test module.
  • Adds a dedicated regression gate for the import contract.
  • Protocol remains v9; R24 world streaming, gameplay, content, and Vestige tracker statuses are unchanged.

Source: docs/changelog/history.md

R24 — Chunked World Engine & rebuilt demo-world
  • Protocol v9 adds reliable ChunkLoaded / ChunkUnloaded terrain lifecycle messages; dynamic actor snapshots remain the R20 10 Hz latest-wins stream.
  • Introduces the shared World → Chunk → Cell model with 32 px cells and 32×32-cell chunks.
  • Server simulation activates chunks around players, cools them for 10 seconds before unload, suspends AI/spawners outside active chunks, and applies authored blocked-cell collision to player/AI movement.
  • Client keeps an independent streamed chunk store and renders deterministic tile variants from world seed + chunk/cell/tile identity.
  • Rebuilds the demo-world as Village, Old Cemetery, Haunted Woods, Ruined Chapel, Dark Road and Dungeon Gate regions with dark-medieval ground/overlay/vegetation/prop assets.
  • Vestige bullets #9 and #12 move to Verified; #13 moves to Implemented with world-art evidence and remains pending broader R25/R26 evidence.

Source: docs/changelog/history.md

R23.1 — Client combat debug / death-profile probability fix
  • Fixes death-profile sampling so chance = 0.0 is impossible and chance = 1.0 is guaranteed, including RNG rolls exactly equal to zero.
  • Restores H as a client-only toggle for visible combat-radius hitboxes rendered with Bevy 2D gizmos.
  • Enlarges entity hover selection to a square pick region with 40 px minimum half-extent and 14 px padding over combat radius.
  • Protocol remains v8 and R23 AI/combat semantics are unchanged.

Source: docs/changelog/history.md

R23 — Actor AI, enemy combat, death profiles and hover
  • Protocol v8 adds authoritative spawn level/temperament metadata and deterministic death presentation seeds.
  • Monsters receive ActorBrain state with passive/neutral/aggressive temperament and Roam → Chase → Combat → ReturnHome behavior.
  • Roaming is centered on the owning spawner; leash return clears stale aggro.
  • AI discovers actions from entity JSON/equipment and scores range, mana and cooldown instead of branching on monster IDs.
  • Wolf and Ashen Cult Mage have multiple data-driven actions and can damage players, including enemy projectiles.
  • Entity-specific randomized death profiles replace the generic fixed gore array.
  • Hover shows monster name/level/temperament/HP, interactable E — Interact, and loot names.
  • Vestige bullets #5, #11, #14, #15, #16 and #17 move to Verified.

Source: docs/changelog/history.md

R22.1 — Geometry regression-test boundary fix
  • Corrects only the Rust regression test wider_arc_hits_target_that_narrow_arc_misses.
  • Moves the narrow/wide comparison target from exactly 45 degrees to about 50.2 degrees so the target circle tolerance no longer legitimately overlaps the 90-degree sector boundary.
  • Production melee geometry, protocol v7, combat balance and Vestige tracker statuses are unchanged.
  • Adds an explicit geometry-boundary gate and ships a Git patch from R22 to R22.1.

Source: docs/changelog/history.md

R22 — Combat core / protocol v7
  • direct combat stats replace STR/DEX/INT/VIT/armor;
  • data-driven ActionDef catalog;
  • generic independent level-scaled loot tables, with full Souls represented as ordinary loot items;
  • server-authoritative dodge, physical/magical defense and critical outcomes;
  • protocol v7 CombatOutcome + ActionCue;
  • generous melee sector and explicit procedural swing arc;
  • Water Wave converted from projectile to self-centered AoE with expanding pulse;
  • Vestige bullets #1, #2, #3, #4, #19, #20, #21, #22 promoted to Verified by the R22 static/master gates; #6 and #14 remain in progress for R23/R25 breadth.

Source: docs/changelog/history.md

R21
  • Vestige architecture, implementation plan, and 23-point tracker installed in-repo.
  • Requirement #18 verified with .gcloudignore, version-controlled cloudbuild.yaml, and a dedicated source-upload gate.
  • Added GET /health JSON (status, version, protocol) while preserving /healthz compatibility.
  • Normalized the container-internal server port to 8080; direct host publishing is 80:8080.
  • Added shared pure content/world validation and fail-fast server startup checks.
  • Preserved protocol v6, R20 latest-wins networking/smooth reconciliation, R20.1 B0001 fix, and R20.2 memory-safe 2D build profile.

Source: docs/changelog/history.md