The Ledger

October 3, 2026

Neo Angband v1.22.0

Added

  • VisibleModding-API An autoplayer mod can choose what a key press does while it has the keyboard. A controller install can include onKey, which answers keep, with an optional message for the message line, or release. Escape and Ctrl-Z always give the keyboard back, whatever the mod answers (#334).
  • VisibleModding-API A mod can save and restore the whole subwindow layout. ctx.subwindows.layout() returns the arrangement as a layout document, setLayout() applies one, and onLayoutChange() reports each change once it finishes, so a mod can offer undo and redo or named layouts (#287).
  • VisibleModding-API The agent view tells a mod which monster spells the character has learned. MonsterView.knownSpellFlags lists the race’s spell flags the character has seen it use, the same set the monster recall names, beside spellFlags, which lists them all (#359).
  • VisibleModding-API Inspecting an item gives its combat values as numbers. inspectItem results carry combat: blows per round, average damage per round or per throw with a line for each known brand and slay, shooting power, range and breakage chance, from the same calculation as the description (#360).
  • VisibleModding-API The keybindings seam edits either keyset and lists the game’s commands. ctx.keybindings calls take an optional keyset, commands() gives each game command with its key in both keysets, and cancelCapture() stops a waiting capture so the next key reaches the game (#362).
  • VisibleModding-API Knowledge entries say whether the player knows them. Each ctx.knowledge entry has known, false for an object flavour seen but not identified (#362).
  • VisibleModding-API A mod can change its own settings. ctx.settings.set(id, value) clamps, saves and announces the value, as the Mods screen does (#362).
  • VisibleModding-API Character creation gives point-buy costs and can restore the generated background. The draft’s statCosts gives each stat’s next cost, refund and whether it can be bought or sold, and restoreHistory() undoes an edit to the background (#362).
  • VisibleModding-API A mod can save the game, return to the title screen or quit. Under the new session:control capability, ctx.session offers save(), exitToTitle() and quit(), each saving first and staying in the game if the save fails (#361).
  • VisibleModding-API Mods can share data with each other. Under the new shared:publish capability, ctx.shared.publish(name, version, value) publishes a named JSON value, and a mod with shared:read gets a frozen copy from ctx.shared.read(modId, name), or null when that mod is absent, disabled or has not published it (#365).
  • VisibleModding-API Mods now receive the dungeonlevel event. A mod with event:dungeonlevel hears it once each time the character arrives on a level, the town included, and once for the first level after a new character starts or a save loads. The payload gives the depth, a levelId matching ctx.knownLevel(), the cause (new-game, load or change) and whether the level is the arena. A listener that throws is logged, and the arrival still completes (#363).
  • VisibleModding-API A mod can correct one background phrase with a content patch. Each history record now has a ref made of its chart and roll, so core:50--100 is “You have blue-gray eyes, ”. A patch, replace or remove can target that one phrase. A pack’s own history records still replace the whole file, because the order of a chart’s records decides which phrase a roll picks (#282).
  • VisibleModding-API objectInfoText now says where each fragment of an item description comes from. Its new second argument names the section that wrote the fragment, such as stats for the “Affects your” lines, and gives the item’s tval and whether the player knows its kind. The kind is named only once the player knows it; before that the hook gets the flavour the player sees, such as “Light Blue”. A hook that takes only the text keeps working, and with no mod installed every description is unchanged (#282).
  • VisibleModding-API A mod can compare an item on the floor against what the character wears. simulateLoadout and compareLoadoutSlots take { from: "floor", x, y, index }, the grid and pile index inspectItem uses for a floor item, under state:floor.read. Only an object the player remembers on that grid resolves, and the index must be a whole number (#364).
  • VisibleUISecurityDocs Mods by other authors can be listed in the game, and every released mod has a page. The Recommended mods screen shows listed community mods under their own Community mods heading, after the first-party ones. Installing or updating one needs Allow third-party mods turned on, as for a mod added by its repository address, and the install-all and update-all actions leave them out. Before a new release of a community mod replaces the installed one, the game shows the mod, both versions and the repository’s owner, and installs it only on a yes. The list starts empty, and authors ask to join it with the new List a community mod issue form. A generated mod list in the docs shows each released mod with its newest release and the game builds it runs on (#373).

Changed

  • Visible Switching windows no longer stops an autoplayer. Alt-Tab, the Windows key and its shortcuts, Shift, Control, Alt, the lock keys and an input method’s keys leave it driving. Any other key still gives you the keyboard back unless the mod handles keys itself, and the banner now names Escape, which always works (#334).
  • Visible The log records what took the keyboard back from an autoplayer. Each hand-back writes one line naming the key, the touch or gamepad stop, or the mod’s own release and its reason (#334).
  • VisibleUI The autoplayer banner and the hand-back line name the mod properly. They used to show its id, so Squire appeared as “squire”; they now use the name from the mod’s manifest, and the log still records the id.
  • VisibleModding-API Gear comparisons count only what the player knows about an item. simulateLoadout and compareLoadoutSlots used to work from the item’s real properties, so a comparison could show a resist or bonus from a rune the player had not learned. They now use the same calculation as the character sheet, and delta.unknownRunes says when an item put on or taken off may have runes the player has not learned. An autoplayer choosing between unidentified items can choose differently (#366).
  • VisibleModding-APISecurity The agent player view shows only what the player knows about worn gear. player() used to read armour class, to-hit, to-dam, the object flags and the fear status from the real state, so a mod could put an item on and read off a resist or bonus from a rune the player had not learned. These fields now come from the known state the character sheet prints and change when the player learns the rune. The Borg and Squire see the same numbers the player does (#368).
  • VisibleModding-API The agent API version is now 1.5.0. apiVersion reports it for this batch of loadout, player and item view changes: the floor arm of LoadoutItemRef, LoadoutDelta.unknownRunes, comparisons and player() that count only runes the player has learned, the capability checks on every item a comparison names, and ItemView.aware with flavour-named fields for an item the player has not identified (#364, #366, #367, #368, #369).
  • VisibleModding-APISecurity Mods see an unidentified potion, scroll or other flavoured item by its flavour. An ItemView used to carry the kind’s name, key, sval and content id, and its full value, before the player had learned the flavour, so a mod could tell a Potion of Speed from a Potion of Salt Water before either was tried. Such an item now has aware: false, the flavour as its label, a flavor:<index> key, a negative sval, no kindId, and the value the game guesses from its tval. This holds in the pack, on the floor, in the home and in the full map read. A shop’s wares keep their kind names, as the shop screen shows them, and the knowledge list’s id for an unidentified flavour names the flavour too (#369).

Fixed

  • VisibleModding-APISecurity Comparing gear needs the read for every item it names. simulateLoadout used to check only state:player.read, so a mod without state:inventory.read or state:stores.read could read pack items and shop wares through the result. It now needs state:inventory.read for every call, since the answer lists the pack, and state:stores.read or state:floor.read when a reference names a ware or a floor item. compareLoadoutSlots asks for the same reads. A view built with capabilities refuses a { from: "object" } reference outright, since only code inside the engine holds a GameObject (#367).
  • VisibleModding-APISecurity Item descriptions no longer count bonuses you have not learned. With an unidentified +to-dam or +to-hit on a ring or armour you wear, a weapon’s blows and melee damage lines used to include it, and mods read the same text through inspectItem. The lines now use what you know, as 4.2.6 does, and they count a worn curse’s stat penalties once you know the stat rune. The thrown and missile damage lines still use your real to-hit, as 4.2.6’s do (#370).

Downloads