The Ledger

August 19, 2026

Neo Angband v0.21.0

Current state of the project at version 0.21.0 - the modding-onboarding release. Nothing about the game’s rules changed; what changed is how much you have to read before you can modify them.

Added

  • A registry:store discount-roll seam (StoreBehaviourRegistry.registerDiscountRoll, StoreFacade.setDiscountRoll), alongside the existing stack-size seam. Lets a mod restore a store’s price-discount roll; core installs no handler, so no store discounts anything by default.
  • feature-restoration added to the recommended first-party mods (mods/registry.json): restores spells and mechanics later Angband versions quietly dropped, each behind its own opt-in toggle (default off).
  • Six modding tutorials (docs/modding/tutorials/), each teaching one idea and ending in a visible result - from changing a single value to running code behind a player-facing switch. Every tutorial’s finished mod is a real folder under samples/tutorials/, composed against the shipped game data on every test run and checked against the game’s own mods-folder reader, so a tutorial cannot go quietly stale and its finished mod cannot stop being installable. Copy any of the six into mods/ to run them without typing anything.
  • Feature restoration written up as a named concept: vanilla stays vanilla, and dropped mechanics come back as optional mods - with the research rules (name the version, respect the modern surrounding system, one switch per feature, everything off by default) that keep a restoration honest.
  • The character dump names the enabled mods. A dump is what players hand each other, and a mod’s change is indistinguishable from a core bug in one. Written only when a mod is enabled, so an unmodded dump is unchanged.

Changed

  • The README is rewritten for players rather than engineers. What the project is, why you might want it, and how to play come first; parity methodology, architecture and provenance move behind links. A prominent “want to make a mod?” path now leads to a tutorial rather than to an API reference.
  • AI_POLICY.md renamed AI_USAGE_POLICY.md, revised for a clearer disclosure section and a narrower, engineering-focused correctness claim.
  • The item and monster tutorials now say what a mod gets for free, and what it does not. An item you add is eligible for every ego, brand, rune and quality enchantment that applies to its kind, from the moment the mod is on - a Padded Jerkin of Resist Fire needs nothing declared. A monster you add carries its own colour but inherits its glyph from its base, and in a tile set it keeps drawing as a letter until a mod supplies a tile. Both are now written down where the beginner meets them.

Fixed

  • The tutorials’ finished mods could not be installed. All six shipped in folders whose names did not match their manifest ids, and the game refuses such a pack - so the one thing a reader is most likely to try, dropping the finished article into mods/ to compare against their own, failed. The folders are renamed and the test suite now drives the game’s real mods-folder reader rather than assembling the packs itself.
  • Two doc claims the code had already outgrown. docs/MODS.md and docs/modding/MOD_REACH.md still said a mod installed from disk could supply data only and that record layering reached 24 of 44 files. Both gates closed some time ago - a mod folder ships plugin.js and reaches the capability registries from wherever it was installed from, and every record of every shipped file is addressable. The stale passages are marked as the before-picture rather than deleted, since the reasoning still explains the design.

Known limitations

  • A mod cannot add one entry to a list. Field patches can set, merge, add or remove a flag and do arithmetic, but they cannot append to an array - so putting a new item in a shop’s stock means replacing that shop’s whole list, and two mods cannot both do it. Everything else about an added item composes cleanly with other mods; this does not.

Downloads