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 answerskeep, with an optional message for the message line, orrelease. 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, andonLayoutChange()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.knownSpellFlagslists the race’s spell flags the character has seen it use, the same set the monster recall names, besidespellFlags, which lists them all (#359). - VisibleModding-API Inspecting an item gives its combat values as numbers.
inspectItemresults carrycombat: 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.keybindingscalls take an optional keyset,commands()gives each game command with its key in both keysets, andcancelCapture()stops a waiting capture so the next key reaches the game (#362). - VisibleModding-API Knowledge entries say whether the player knows them. Each
ctx.knowledgeentry hasknown, 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
statCostsgives each stat’s next cost, refund and whether it can be bought or sold, andrestoreHistory()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:controlcapability,ctx.sessionofferssave(),exitToTitle()andquit(), 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:publishcapability,ctx.shared.publish(name, version, value)publishes a named JSON value, and a mod withshared:readgets a frozen copy fromctx.shared.read(modId, name), or null when that mod is absent, disabled or has not published it (#365). - VisibleModding-API Mods now receive the
dungeonlevelevent. A mod withevent:dungeonlevelhears 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 thedepth, alevelIdmatchingctx.knownLevel(), thecause(new-game,loadorchange) 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
historyrecord now has a ref made of its chart and roll, socore:50--100is “You have blue-gray eyes, ”. A patch, replace or remove can target that one phrase. A pack’s ownhistoryrecords still replace the whole file, because the order of a chart’s records decides which phrase a roll picks (#282). - VisibleModding-API
objectInfoTextnow says where each fragment of an item description comes from. Its new second argument names the section that wrote the fragment, such asstatsfor 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.
simulateLoadoutandcompareLoadoutSlotstake{ from: "floor", x, y, index }, the grid and pile indexinspectItemuses for a floor item, understate: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.
simulateLoadoutandcompareLoadoutSlotsused 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, anddelta.unknownRunessays 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.
apiVersionreports it for this batch of loadout, player and item view changes: the floor arm ofLoadoutItemRef,LoadoutDelta.unknownRunes, comparisons andplayer()that count only runes the player has learned, the capability checks on every item a comparison names, andItemView.awarewith 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
ItemViewused 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 hasaware: false, the flavour as itslabel, aflavor:<index>key, a negativesval, nokindId, 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’sidfor an unidentified flavour names the flavour too (#369).
Fixed
- VisibleModding-APISecurity Comparing gear needs the read for every item it names.
simulateLoadoutused to check onlystate:player.read, so a mod withoutstate:inventory.readorstate:stores.readcould read pack items and shop wares through the result. It now needsstate:inventory.readfor every call, since the answer lists the pack, andstate:stores.readorstate:floor.readwhen a reference names a ware or a floor item.compareLoadoutSlotsasks for the same reads. A view built with capabilities refuses a{ from: "object" }reference outright, since only code inside the engine holds aGameObject(#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
- neo-angband-web-1.22.0.zip22 MB
- Neo.Angband-1.22.0-amd64.deb117 MB
- Neo.Angband-1.22.0-arm64-mac.dmg135 MB
- Neo.Angband-1.22.0-arm64-mac.zip135 MB
- Neo.Angband-1.22.0-portable.exe117 MB
- Neo.Angband-1.22.0-win.zip155 MB
- Neo.Angband-1.22.0-x64-mac.dmg140 MB
- Neo.Angband-1.22.0-x64-mac.zip140 MB
- Neo.Angband-1.22.0-x64.tar.gz137 MB
- Neo.Angband-1.22.0-x86_64.AppImage144 MB
- Neo.Angband.Setup.1.22.0.exe117 MB