Repository navigation
Receipts
The clean-room rule: every claim here is backed by a headless siegefx audit you can run yourself, over the bytes the retail game ships. The 2023 leak of the DS1 source is off-limits — none of this needed it.
Headline — 81 regions / 50,680 props / 7,252 NPCs / 2,829 pcontent entries / 16,275 SNO tiles / 2,086 trigger rows / 1,962 PRS animations / a 231-template spell universe, every one loaded from the shipped data.
tools/receipts.sh runs before every push (on Linux), against your own install, and passes only when every step does: the solution builds with warnings as errors; the data-free unit tests pass; test-all.sh is what test-all.bat generates; the engine's save, dialogue and multiplayer self-tests pass; the parity ledger handles no fewer items in any section than its committed baseline; and every spell's cast effect, run through the effect VM with a fixed seed, reproduces its committed trace in goldens/sfx-timelines byte for byte. CI repeats the build and the unit tests on Linux and Windows for every push and pull request, and builds the release artifacts and launches the Linux one.
The same audits agree across systems: the 248 effect traces generated on Windows come out byte for byte on Linux, and the chase-sim audit (1,122 pathfinder-verified walks) gives the same 49 failures on both.
- 81 regions — all shipped DS1 regions load through the cross-boundary streamer
-
50,680 static-prop placements — 100% textured via the runtime resolver (
region prop-textures all) -
7,252 NPCs / 7,517 texture slots — every slot resolves (
region actor-coverage all) -
2,626 ASP meshes — 274 multi-subset; the BTRI cornerStart fix landed here (
asp subset-fuzz) -
~18,000 hero variants — 7 bodies × ~32 skins × ~41 pants × 2 genders (
templates hero-variants) -
520 mood definitions + 165 SED descriptors — region ambient beds and per-fire pitch ranges driven by data (
mood list,audio sed-list) -
626 audio cues in
Sound.dsres, per-category gaps mapped (audio coverage)
-
2,829 pcontent entries (303 weapons across 10 classes + 435 armor templates) tagged with rarity (normal / rare / unique) — krug-class
#club/2-3picks a generic power-2/3 club,#armor/-rare(1)/28-80rolls only rare-tier armor in band,#*/-unique(2)/175-286picks named unique drops the normal roll never sees (pcontent dump) -
Every shipped weapon deals its authored DS1 damage — all 302 weapon-item templates (
[attack][attack_class]+ an[aspect][model]grip mesh, creatures and dev/test excluded) resolve their authoreddamage_min/damage_max1:1 through the in-gameActorStatspath an equipped weapon feeds its wielder — sword1..414, axe1..421, mace3..188, staff1..335, minigun38..350, bow2..180. 302/302, zero misreads. The only items carrying nodamage_min/maxare the 19 ammunition + throwables (arrows / bolts / rocks / grenades / bombs) whose damage comes from the launcher or explosion, not the projectile — as DS1 authors them. Audits source damage; the to-hit + armor + difficulty resolution is in Combat below (weapons damage-audit) -
Mob loot drops match shipped pacing —
siegefx loot dump <Logic.dsres> <template>prints the parsed[inventory][pcontent]Equipped/Drops trees and rolls N times. Onlyil_mainentries roll (the wornes_weapon_handweapon stays on the body). Receipts (200 rolls, seed 42):krug_gruntdrops 36/200 (avg 0.18/kill, matching the 0.15 chance gate × ~uniform 4-way pick) —#weapon/12-177.0%,#armor/6-294.0%,potion_health_small4.0%,potion_mana_small3.0%;krug_scout25/200 (avg 0.12/kill);gremal0/200 (no[inventory][pcontent]in its chain — correct, drops nothing).
-
To-hit, armor and difficulty resolve from DS1's own
[combat_constants](formulas.gas), not a hand-tuned guess.attack_rating = 0.45·skill + 0.55·dex + 0.15·int, same shape fordefend_rating;hit_chance = 50 + (AR−DR)·2.1clamped to[5, 95]; a landed hit rolls the weapon'sdamage_min..max— DS1 has no strength/skill damage bonus, attributes drive the chance to hit, not the size of the blow — then losesdefense·armor_scalar/10. Akrug_gruntmirror lands 50.0% (equal ratings) and dies in ~6 swings / 3 hits; an elite3W_goblin_grunt(armor 554) shaves ~55 dmg/hit off a 142–204 roll; the rating gap clamps goblin-vs-krug to the 95% ceiling and krug-vs-goblin to the 5% floor, where armor 554 fully absorbs the krug's 16-damage swing to the 1-HP min chip (formulas dump,templates combat <a> <b> --duels=N --seed=K).
-
16,275 SNO tiles (World + MpWorld) — every shipped retail tile parses cleanly; the doors/spots disk-order swap and the v6.2/v6.3
general_connection_section.centergate landed here (region nav-fuzz). Funnel-smoothed nav follower hugs corridor corners — fh_r1 (10,10)→(30,30) walks 30.30u vs 28.28u straight-line over 39 path triangles / 7 funnel waypoints (region follow). Water tiles ride alongside floor in the mesh (1,435 water / 26,973 floor in fh_r1), gated by a per-actorNavTraversalpolicy —--water=4onregion pathswims a 6-tri pond the default land-only policy refuses. A* open-set rewritten from SortedSet to a duplicate-tolerant binary min-heap: 2.0× pathfinder speedup at fh_r1 scale (504 µs → 247 µs per probe over 173-tri paths,region path-bench). -
Land↔water seam stitching — wires Floor↔Water boundary edges that share an XZ footprint and a wadeable Y delta (≤0.5u), since DS1 authors water surfaces in their own SNOs whose vertices don't weld to the shoreline floor. fh_r1 climbs from 0/1,435 to 37/1,435 water tris with a Floor edge; World totals 4,907 cross-kind seams across 81 regions (
region nav,region path-fuzz). -
Cross-region stitch — intra-region doors from
nodes.gas+ cross-region doors fromstitch_helper.gaswired into NavMesh adjacency, so the player walks from a surface region into its basement / cellar / cave / dungeon through any authored seam.
-
2,086 trigger rows across the World — the
[instance_triggers]matrix language is parsed and dispatched at 20 Hz alongside the message bus; 1,952/3,043 special.gas placements bear matrices, zero parse failures. 8/8 condition verbs (actor_within_sphere,go_within_sphere,party_member_within_sphere/_bounding_box/_node,party_member_entered/left_trigger_group,receive_world_message) and 5/5 action verbs (send_world_message,fade_nodes,mood_change,set_interest_radius,fade_nodes_global) dispatched; group-keyed pairing withsingle_shot/start_active/delay/reset_durationhonored. Thewhen_falsefalling-edge channel lands 83 deferred actions across 23 regions (region triggers).
-
Full chore dictionary loads per actor — every
chore_*section (default / walk / attack / die / fidget / magic / misc) is parsed at spawn and addressable by name. fh_r1 catalogue grows from 2.0 clips/actor to avg 5.99 across 181 spawns:chore_default×181, chore_fidget×181, chore_attack×179, chore_die×179, chore_walk×179, chore_magic×144, chore_misc×41(region spawn). -
1,962 / 1,962 shipped
.prsanimations parse with zero failures — 1,855 v3 (94.5%) + 62 v0x202 + 45 v0x302; 131 carry undocumented TRCR tracer chunks the loader skips via 4-byte-aligned tag-scan resync. Pre-fix every TRCR-bearing file threw and fell to a no-clip stub (including the farmboy stance-1 attack, silently demoting dagger swings to the unarmed punch); post-fix the empty-catalogue cohort in fh_r1 is 0 (prs fuzz).
-
69 offensive spell templates parse end-to-end —
[magic]block damage / mana-cost / heal expressions evaluate against caster + target stats. SpellExpr handles the**power op (19 spells), the#magic/#maxlife/#life/#src_mana/#src_lifeplaceholders, and the[[ cond ?: a : b ]]ternary. Receipts: fireball L13.85..4.67, spell_freeze#maxlife=20chargesmana=50.0, healing_hands' triple-ternary returns11 / -0.61 / 4across three contexts (spells eval,spells show). Element classification buckets all 69 — Fire 27, Lightning 16, Ice 6, Holy 6, Acid 4, Death 3, Generic 7 — and tints bolt + impact-flash per bucket (spells elements). - 231-template spell universe — the catalog now carries the full offensive + buff + summon + monster arsenal (not just the 69 offensive), with golden traces over every template.
- Sfx-script VM — the complete SiegeFX Appendix-A parameter set is parsed and executed on a deterministic timeline (committed goldens + an offscreen spell filmstrip / contact-sheet renderer), so cast effects — cylinder tubes, spinning srays, lightning, explosions, plumes, orbiters, ribbons — run from the authored data rather than reimplemented by eye.
-
Party & companions — companions are recruited through their authored
potential_memberconversation node, fight with their own equipped weapon, and trail the leader through six formations decoded 1:1 fromworld/ai/formations.gas(column, double_column, line, double_line, wedge, circle — each a 9×9 spot grid with the authored spot spacing). Followers path with the player's own navmesh traversal so they follow through human-only / gated zones. -
Doors are hinge-accurate — the door
.aspis authored Z-up with its origin on the hinge edge, confirmed bysiegefx asp info(m_i_csl_door-01: extents(-1.60,-0.05,0.00)..(0.00,0.05,2.70),-90°-about-X standup bind pose). Doors swing on that hinge on a click and play the shipped open cue. -
Monster casters fire their authored spell — a Phrak Piercer resolves
il_active_primary_spell = spell_phrak_dartfromspl_spell.gas; monster-arsenal spells carry their damage in[attack](3–5 for the dart), now read so casters deal their authored bite from standoff range.
Numbers reflect the retail World / MpWorld data set. Reproduce any line with the siegefx command in parentheses — see Diagnostic CLI Tools.