Development changelog

This file contains changes grouped by the release (stable or development) in which they first appeared. See Building the changelogs for more information.

See Changelog for a list of changes grouped by stable releases.

DFHack 50.12-r1


  • gui/design: no longer comes up when Ctrl-D is pressed but other DFHack windows have focus

  • gui/notify: persist notification settings when toggled in the UI

Misc Improvements

  • gui/launcher: developer mode hotkey restored to Ctrl-D

  • sort: squad assignment overlay rewritten for compatiblity with new vanilla data structures and screen layouts


  • burrow: removed overlay 3D box select since it is now provided by the vanilla UI

  • sort: removed Search widgets for screens that now have vanilla search


  • Gui::getWidget: retrieve a vanilla DF widget by name or index


  • dfhack.gui.getWidgetChildren: retrieve a list of child widgets for a given widget container

  • dfhack.gui.getWidget: retrieve a vanilla DF widget by hierarchy path, with each step specified by a widget name or index

DFHack 50.11-r7

New Tools

  • add-thought: (reinstated) add custom thoughts to a dwarf

  • combat-harden: (reinstated) set a dwarf’s resistence to being affected by visible corpses

  • devel/input-monitor: interactive UI for debugging input issues

  • gui/notify: display important notifications that vanilla doesn’t support yet and provide quick zoom links to notification targets.

  • gui/petitions: (reinstated) show outstanding (or all historical) petition agreements for guildhalls and temples

  • list-waves: (reinstated) show migration wave information

  • make-legendary: (reinstated) make a dwarf legendary in specified skills

  • pet-uncapper: (reinstated, renamed from petcapRemover) allow pets to breed beyond the default population cap of 50

  • tweak: (reinstated) a collection of small bugfixes and gameplay tweaks

  • undump-buildings: (reinstated) remove dump designation from in-use building materials

New Features

  • cleanowned: Add a “nodump” option to allow for confiscating items without dumping

  • tweak: Add “flask-contents”, makes flasks/vials/waterskins be named according to their contents


  • autoclothing: Fix enabled behavior

  • caravan: display book and scroll titles in the goods and trade dialogs instead of generic scroll descriptions

  • dig-now: fix digging stairs in the surface sometimes creating underworld gates.

  • dig: overlay that shows damp designations in ASCII mode now propertly highlights tiles that are damp because of an aquifer in the layer above

  • fix/retrieve-units: prevent pulling in duplicate units from offscreen

  • gui/blueprint: changed hotkey for setting blueprint origin tile so it doesn’t conflict with default map movement keys

  • gui/control-panel: fix error when toggling autostart settings

  • gui/design: clicking the center point when there is a design mark behind it will no longer simultaneously enter both mark dragging and center dragging modes. Now you can click once to move the shape, and click twice to move only the mark behind the center point.

  • gui/launcher: developer mode hotkey changed from Ctrl-D to Alt-D so as not to conflict with the hotkey for gui/design

  • item: avoid error when scanning items that have no quality rating (like bars and other construction materials)

  • source: fix issue where removing sources would make some other sources inactive

  • strangemood: correctly recognize Stonecutter and Stone Carver as moodable skills, move the Mason’s boosted mood chance to the Stone Carver, and select Fell/Macabre based on long-term stress

  • warn-stranded:
    • don’t complain about units that aren’t on the map (e.g. soldiers out on raids)

    • when there was at least one truly stuck unit and miners were actively mining, the miners were also confusingly shown in the stuck units list

  • gui.View:getMouseFramePos: function now detects the correct coordinates even when the widget is nested within other frames

  • Gui::makeAnnouncement, Gui::autoDFAnnouncement: don’t display popup for all announcement types

  • Gui::revealInDwarfmodeMap: properly center the zoom even when the target tile is near the edge of the map

  • Units::getVisibleName: don’t reveal the true identities of units that are impersonating other historical figures

Misc Improvements

  • autonestbox: assign egg layers to the nestbox they have chosen if they have already chosen a nestbox

  • buildingplan: use closest matching item rather than newest matching item

  • caravan: move goods to trade depot dialog now allocates more space for the display of the value of very expensive items

  • exportlegends: make progress increase smoothly over the entire export and increase precision of progress percentage

  • extinguish: allow selecting units/items/buildings in the UI to target them for extinguishing; keyboard cursor is only required for extinguishing map tiles that cannot be selected any other way

  • gui/autobutcher: ask for confirmation before zeroing out targets for all races

  • gui/mod-manager: will automatically unmark the default mod profile from being the default if it fails to load (due to missing or incompatible mods)

  • gui/quickfort:
    • can now dynamically adjust the dig priority of tiles designated by dig blueprints

    • can now opt to apply dig blueprints in marker mode

  • item:
    • change syntax so descriptions can be searched for without indicating the --description option. e.g. it’s now item count royal instead of item count --description royal

    • add --verbose option to print each item as it is matched

  • probe: act on the selected building/unit instead of requiring placement of the keyboard cursor for bprobe and cprobe

  • regrass: also regrow depleted cavern moss

  • zone:
    • animal assignment dialog now shows distance to pasture/cage and allows sorting by distance

    • animal assignment dialog shows number of creatures assigned to this pasture/cage/etc.



  • Gui focus strings will now include dwarfmode/Default if the only other panel open is the Squads panel

  • Gui module Announcement functions now use DF’s new announcement alert system

  • Gui::addCombatReport, Gui::addCombatReportAuto: add versions that take report * instead of report vector index

  • Gui::MTB_clean, Gui::MTB_parse, Gui::MTB_set_width: new functions for manipulating markup_text_boxst

  • Gui::revealInDwarfmodeMap: unfollow any currently followed units/items so the viewport doesn’t just jump back to where it was

  • toupper_cp437(char), tolower_cp437(char): new MiscUtils functions, return a char with case changed, respecting CP437

  • toUpper, toLower: MiscUtils functions renamed to toUpper_cp437 and toLower_cp437, CP437 compliant


  • Overlay framework now respects active and visible widget attributes

  • dfhack.gui announcement functions use default arguments when omitted

  • dfhack.units.getCitizens now only returns units that are on the map

  • dfhack.upperCp437(string), dfhack.lowerCp437(string): new functions, return string with all chars changed, respecting CP437 code page


  • buildings_other: add correct types for civzone building vectors

  • job_skill: correct moodable property for several professions

DFHack 50.11-r6

New Features

  • zone: Add overlay for toggling butchering/gelding/adoption/taming options in animal “Overview” tabs


  • dig-now:
    • remove diagonal ramps rendered unusable by digging

    • fix error propagating “light” and “outside” properties to newly exposed tiles when piercing the surface

  • item: fix missing item categories when using --by-type

  • makeown: fix error when adopting units that need a historical figure to be created

  • sort: fix potential crash when switching between certain info tabs

  • suspendmanager: overlays for suspended building info panels no longer disappear when another window has focus

Misc Improvements

  • autonestbox: don’t automatically assign partially trained egg-layers to nestboxes if they don’t have an ongoing trainer assigned since they might revert to wild

  • buildingplan: replace [edit filters] button in planner overlay with abbreviated filter information

  • reveal: automatically reset saved map state when a new save is loaded


  • nopause: functionality has moved to spectate


  • Gui::getAnyJob: get the job associated with the selected game element (item, unit, workshop, etc.)

  • Gui::getAnyWorkshopJob: get the first job associated with the selected workshop

  • Units::assignTrainer: assign a trainer to a trainable animal

  • Units::unassignTrainer: unassign a trainer from an animal


  • dfhack.gui.getAnyJob: expose API to Lua

  • dfhack.gui.getAnyWorkshopJob: expose API to Lua

  • dfhack.units.assignTrainer: expose API to Lua

  • dfhack.units.isTamable: return false for invaders to match vanilla logic

  • dfhack.units.unassignTrainer: expose API to Lua


  • soundst: fix alignment

DFHack 50.11-r5

New Tools

  • control-panel: new commandline interface for control panel functions

  • gui/biomes: visualize and inspect biome regions on the map

  • gui/embark-anywhere:
    • new keybinding (active when choosing an embark site): Ctrl-A

    • bypass those pesky warnings and embark anywhere you want to

  • gui/reveal: temporarily unhide terrain and then automatically hide it again when you’re ready to unpause

  • gui/teleport: mouse-driven interface for selecting and teleporting units

  • item: perform bulk operations on groups of items.

  • uniform-unstick: (reinstated) force squad members to drop items that they picked up in the wrong order so they can get everything equipped properly

New Features

  • gui/mass-remove: new global keybinding: Ctrl-M while on the fort map

  • gui/settings-manager: save and load embark difficulty settings and standing orders; options for auto-load on new embark

  • sort: search and sort for the “choose unit to elevate to the barony” screen. units are sorted by the number of item preferences they have and the units are annotated with the items that they have preferences for

  • uniform-unstick: add overlay to the squad equipment screen to show a equipment conflict report and give you a one-click button to (attempt to) fix

  • zone: add button to location details page for retiring unused locations


  • DFHack tabs (e.g. in gui/control-panel) are now rendered correctly when there are certain vanilla screen elements behind them

  • Dreamfort: fix holes in the “Inside+” burrow on the farming level (burrow autoexpand is interrupted by the pre-dug miasma vents to the surface)

  • When passing map movement keys through to the map from DFHack tool windows, also pass fast z movements (shift-scroll by default)

  • ban-cooking: fix banning creature alcohols resulting in error

  • buildingplan:
    • when you save a game and load it again, newly planned buildings are now correctly placed in line after existing planned buildings of the same type

    • treat items in wheelbarrows as unavailable, just as vanilla DF does. Make sure the fix/empty-wheelbarrows fix is enabled so those items aren’t permanently unavailable!

    • show correct number of materials required when laying down areas of constructions and some of those constructions are on invalid tiles

  • caravan: ensure items are marked for trade when the move trade goods dialog is closed even when they were selected and then the list filters were changed such that the items were no longer actively shown

  • confirm: properly detect clicks on the remove zone button even when the unit selection screen is also open (e.g. the vanilla assign animal to pasture panel)

  • empty-bin: now correctly sends ammunition in carried quivers to the tile underneath the unit instead of teleporting them to an invalid (or possibly just far away) location

  • fastdwarf:
    • prevent units from teleporting to inaccessible areas when in teledwarf mode

    • allow units to meander and satisfy needs when they have no current job and teledwarf mode is enabled

  • getplants: fix crash when processing mod-added plants with invalid materials

  • gui/design:
    • fix incorrect highlight when box selecting area in ASCII mode

    • fix incorrect dimensions being shown when you’re placing a stockpile, but a start coordinate hasn’t been selected yet

  • misery: fix error when changing the misery factor

  • quickfort: if a blueprint specifies an up/down stair, but the tile the blueprint is applied to cannot make an up stair (e.g. it has already been dug out), still designate a down stair if possible

  • reveal: now avoids revealing blocks that contain divine treasures, encased horrors, and deep vein hollows (so the surprise triggers are not triggered prematurely)

  • sort:
    • fix mouse clicks falling through the squad assignment overlay panel when clicking on the panel but not on a clickable widget

    • fix potential crash when removing jobs directly from the Tasks info screen

  • source: water and magma sources and sinks now persist with fort across saves and loads

  • stonesense: fix crash in cleanup code after mega screenshot (Ctrl-F5) completes; however, the mega screenshot will still make stonesense unresponsive. close and open the stonesense window to continue using it.

  • suspendmanager: correctly handle building collisions with smoothing designations when the building is on the edge of the map

  • warn-stranded: don’t warn for citizens who are only transiently stranded, like those on stepladders gathering plants or digging themselves out of a hole

  • Maps::getBiomeType, Maps::getBiomeTypeWithRef: fix identification of tropical oceans

Misc Improvements

  • Dreamfort: put more chairs adjacent to each other to make the tavern more “social”

  • The “PAUSE FORCED” badge will blink briefly to draw attention if the player attempts to unpause when a DFHack tool window requires the game to be paused

  • wherever units are listed in DFHack tools, properties like “agitated” or (-trained-) are now shown

  • autochop: better error output when target burrows are not specified on the commandline

  • autoclothing : now does not consider worn (x) clothing as usable/available; reduces overproduction when using tailor at same time

  • buildingplan: add option for preventing constructions from being planned on top of existing constructions (e.g. don’t build floors on top of floors)

  • burrow: flood fill now requires an explicit toggle before it is enabled to help prevent accidental flood fills

  • confirm:
    • updated confirmation dialogs to use clickable widgets and draggable windows

    • added confirmation prompt for right clicking out of the trade agreement screen (so your trade agreement selections aren’t lost)

    • added confirmation prompts for irreversible actions on the trade screen

    • added confirmation prompt for deleting a uniform

    • added confirmation prompt for convicting a criminal

    • added confirmation prompt for re-running the embark site finder

    • added confirmation prompt for reassigning or clearing zoom hotkeys

    • added confirmation prompt for exiting the uniform customization page without saving

  • fastdwarf: now saves its state with the fort

  • fix/stuck-instruments: now handles instruments that are left in the “in job” state but that don’t have any actual jobs associated with them

  • gui/autobutcher: interface redesigned to better support mouse control

  • gui/control-panel:
    • reduce frequency for warn-stranded check to once every 2 days

    • tools are now organized by type: automation, bugfix, and gameplay

  • gui/launcher:
    • now persists the most recent 32KB of command output even if you close it and bring it back up

    • make autocomplete case insensitive

  • gui/mass-remove:
    • can now differentiate planned constructions, stockpiles, and regular buildings

    • can now remove zones

    • can now cancel removal for buildings and constructions

  • gui/quickcmd: clickable buttons for command add/remove/edit operations

  • orders: reduce prepared meal target and raise booze target in basic importable orders in the orders library

  • sort:
    • add “Toggle all filters” hotkey button to the squad assignment panel

    • rename “Weak mental fortitude” filter to “Dislikes combat”, which should be more understandable

  • uniform-unstick: warn if a unit belongs to a squad from a different site (can happen with migrants from previous forts)

  • warn-stranded: center the screen on the unit when you select one in the list

  • work-now: now saves its enabled status with the fort

  • zone:
    • add include/only/exclude filter for juveniles to the pasture/pit/cage/restraint assignment screen

    • show geld status and custom profession (if set, it’s the lower editable line in creature description) in pasture/pit/cage/restraint assignment screen


  • channel-safely: (temporarily) removed due to stability issues with the underlying DF API

  • persist-table: replaced by new dfhack.persistent API


  • New plugin API for saving and loading persistent data. See plugins/examples/skeleton.cpp and plugins/examples/persistent_per_save_example.cpp for details

  • Plugin ABI (binary interface) version bump! Any external plugins must be recompiled against this version of DFHack source code in order to load.

  • capitalize_string_words: new MiscUtils function, returns string with all words capitalized

  • Constructions::designateRemove: no longer designates the non-removable “pseudo” construtions that represent the top of walls

  • grab_token_string_pos: new MiscUtils function, used for parsing tokens

  • Items: add item melting logic canMelt(item), markForMelting(item), and cancelMelting(item)

  • Persistence:
    • persistent keys are now namespaced by an entity_id (e.g. a player fort site ID)

    • data is now stored one file per entity ID (plus one for the global world) in the DF savegame directory

  • random_index, vector_get_random: new MiscUtils functions, for getting a random entry in a vector

  • Units.isDanger: now returns true for agitated wildlife

  • World:
    • GetCurrentSiteId() returns the loaded fort site ID (or -1 if no site is loaded)

    • IsSiteLoaded() check to detect if a site (e.g. a player fort) is active (as opposed to the world or a map)

    • AddPersistentData and related functions replaced with AddPersistentSiteData and AddPersistentWorldData equivalents


  • dfhack.capitalizeStringWords: new function, returns string with all words capitalized

  • dfhack.isSiteLoaded: returns whether a site (e.g. a player fort) is loaded

  • dfhack.items: access to canMelt(item), markForMelting(item), and cancelMelting(item) from Items module

  • dfhack.persistent: new, table-driven API for easier world- and site-associated persistent storage. See the Lua API docs for details.

  • returns the df.world_site instance of the currently loaded fort

  • widgets.Divider: linear divider to split an existing frame; configurable T-junction edges and frame style matching


  • alert_button_announcement_id: now int32_t vector (contains report ids)

  • announcement_alertst: defined

  • announcement_alert_type: enum defined

  • announcement_type: added alert_type enum attribute

  • feature_init_flags: more enum values defined

  • markup_text_boxst: updated based on information from Bay12

  • markup_text_linkst, markup_text_wordst, script_environmentst: defined

  • occupation: realigned

  • plotinfost: unk23c8_flags renamed to flags, updated based on information from Bay12

  • service_orderst: type defined

  • service_order_type: enum defined

  • soundst: defined

  • viewscreen_choose_start_sitest: fix structure of warning flags – convert series of bools to a proper bitmask

  • world_raws: unk_v50_1, unk_v50_2, unk_v50_3 renamed to text_set, music, sound


  • DFHack developer’s guide updated, with refreshed Architecture diagrams

  • UTF-8 text in tool docs is now properly displayed in-game in gui/launcher (assuming that it can be converted to cp-437)

  • Installing DFHack: Add installation instructions for wineskin on Mac

  • DFHack modding guide: Add examples for script-only and blueprint-only mods that you can upload to DF’s Steam Workshop

DFHack 50.11-r4

New Tools

  • build-now: (reinstated) instantly complete unsuspended buildings that are ready to be built


  • RemoteServer: don’t shut down the socket prematurely, allowing continuing connections from, for example, dfhack-run

  • buildingplan: fix choosing the wrong mechanism (or something that isn’t a mechanism) when linking a lever and manually choosing a mechanism, but then canceling the selection

  • combine: prevent stack sizes from growing beyond quantities that you would normally see in vanilla gameplay

  • gui/design: Center dragging shapes now track the mouse correctly

  • sort:
    • fix potential crash when exiting and re-entering a creatures subtab with a search active

    • prevent keyboard keys from affecting the UI when search is active and multiple keys are hit at once

  • tailor: fix corner case where existing stock was being ignored, leading to over-ordering

Misc Improvements

  • buildingplan:
    • save magma safe mechanisms for when magma safety is requested when linking levers and pressure plates to targets

    • when choosing mechanisms for linking levers/pressure plates, filter out unreachable mechanisms

  • caravan: enable searching within containers in trade screen when in “trade bin with contents” mode

  • sort: when searching on the Tasks tab, also search the names of the things the task is associated with, such as the name of the stockpile that an item will be stored in

DFHack 50.11-r3

New Tools

  • burrow: (reinstated) automatically expand burrows as you dig

  • sync-windmills: synchronize or randomize movement of active windmills

  • trackstop: (reimplemented) integrated overlay for changing track stop and roller settings after construction

New Features

  • buildingplan: allow specific mechanisms to be selected when linking levers or pressure plates

  • burrow: integrated 3d box fill and 2d/3d flood fill extensions for burrow painting mode

  • fix/dead-units: gained ability to scrub dead units from burrow membership lists

  • gui/design: show selected dimensions next to the mouse cursor when designating with vanilla tools, for example when painting a burrow or designating digging

  • prospector: can now give you an estimate of resources from the embark screen. hover the mouse over a potential embark area and run prospector.

  • quickfort: new burrow blueprint mode for designating or manipulating burrows

  • sort: military and burrow membership filters for the burrow assignment screen

  • unforbid: now ignores worn and tattered items by default (X/XX), use -X to bypass


  • RemoteServer: continue to accept connections as long as the listening socket is valid instead of closing the socket after the first disconnect

  • buildingplan: overlay and filter editor gui now uses ctrl-d to delete the filter to avoid conflict with increasing the filter’s minimum quality (shift-x)

  • caravan: price of vermin swarms correctly adjusted down. a stack of 10000 bees is worth 10, not 10000

  • emigration: fix clearing of work details assigned to units that leave the fort

  • gui/unit-syndromes: show the syndrome names properly in the UI

  • sort: when filtering out already-established temples in the location assignment screen, also filter out the “No specific deity” option if a non-denominational temple has already been established

  • stockpiles: hide configure and help buttons when the overlay panel is minimized

  • tailor: fix crash on Linux where scanned unit is wearing damaged non-clothing (e.g. a crown)

Misc Improvements

  • buildingplan:
    • display how many items are available on the planner panel

    • make it easier to build single-tile staircases of any shape (up, down, or up/down)

  • Dreamfort: Inside+ and Clearcutting burrows now automatically created and managed

  • sort:
    • allow searching by profession on the squad assignment page

    • add search for places screens

    • add search for work animal assignment screen; allow filtering by miltary/squad/civilian/burrow

    • on the squad assignment screen, make effectiveness and potential ratings use the same scale so effectiveness is always less than or equal to potential for a given unit. this way you can also tell when units are approaching their maximum potential

    • new overlay on the animal assignment screen that shows how many work animals each visible unit already has assigned to them

  • warn-stranded: don’t warn for units that are temporarily on unwalkable tiles (e.g. as they pass under a waterfall)


  • gui/control-panel:
    • removed always-on system services from the System tab: buildingplan, confirm, logistics, and overlay. The base services should not be turned off by the player. Individual confirmation prompts can be managed via gui/confirm, and overlays (including those for buildingplan and logistics) are managed on the control panel Overlays tab.

    • removed autolabor from the Fort and Autostart tabs. The tool does not function correctly with the new labor types, and is causing confusion. You can still enable autolabor from the commandline with enable autolabor if you understand and accept its limitations.


  • Buildings::completebuild: used to link a newly created building into the world

  • Burrows::setAssignedUnit: now properly handles inactive burrows

  • Gui::getMousePos: now takes an optional allow_out_of_bounds parameter so coordinates can be returned for mouse positions outside of the game map (i.e. in the blank space around the map)

  • Gui::revealInDwarfmodeMap: gained highlight parameter to control setting the tile highlight on the zoom target

  • Maps::getWalkableGroup: get the walkability group of a tile

  • Units::getReadableName: now returns the untranslated name


  • dfhack.buildings.completebuild: expose new module API

  • dfhack.gui.getMousePos: support new optional allow_out_of_bounds parameter

  • dfhack.gui.revealInDwarfmodeMap: gained highlight parameter to control setting the tile highlight on the zoom target

  • dfhack.maps.getWalkableGroup: get the walkability group of a tile

  • gui.FRAME_THIN: a panel frame suitable for floating tooltips


  • burrow: add new graphics mode texture and color fields

  • job_item_flags3: identify additional flags


  • Document the Lua API for the module

DFHack 50.11-r2

New Tools

  • add-recipe: (reinstated) add reactions to your civ (e.g. for high boots if your civ didn’t start with the ability to make high boots)

  • burial: (reinstated) create tomb zones for unzoned coffins

  • fix/corrupt-jobs: prevents crashes by automatically removing corrupted jobs

  • preserve-tombs: keep tombs assigned to units when they die

  • spectate: (reinstated) automatically follow dwarves, cycling among interesting ones

New Scripts

New Features

  • burial: new options to configure automatic burial and limit scope to the current z-level

  • drain-aquifer:
    • gained ability to drain just above or below a certain z-level

    • new option to drain all layers except for the first N aquifer layers, in case you want some aquifer layers but not too many

  • gui/control-panel: drain-aquifer --top 2 added as an autostart option

  • logistics: automelt now optionally supports melting masterworks; click on gear icon on stockpiles overlay frame

  • sort:
    • new search widgets for Info panel tabs, including all “Creatures” subtabs, all “Objects” subtabs, “Tasks”, candidate assignment on the “Noble” subtab, and the “Work details” subtab under “Labor”

    • new search and filter widgets for the “Interrogate” and “Convict” screens under “Justice”

    • new search widgets for location selection screen (when you’re choosing what kind of guildhall or temple to dedicate)

    • new search widgets for burrow assignment screen and other unit assignment dialogs

    • new search widgets for artifacts on the world/raid screen

    • new search widgets for slab engraving menu; can filter for only units that need a slab to prevent rising as a ghost

  • stocks: hotkey for collapsing all categories on stocks screen


  • buildingplan:
    • remove bars of ash, coal, and soap as valid building materials to match v50 rules

    • fix incorrect required items being displayed sometimes when switching the planner overlay on and off

  • dwarfvet: fix invalid job id assigned to Rest job, which could cause crashes on reload

  • full-heal: fix removal of corpse after resurrection

  • gui/sandbox: fix scrollbar moving double distance on click

  • hide-tutorials: fix the embark tutorial prompt sometimes not being skipped

  • sort: don’t count mercenaries as appointed officials in the squad assignment screen

  • suspendmanager: fix errors when constructing near the map edge

  • toggle-kbd-cursor: clear the cursor position when disabling, preventing the game from sometimes jumping the viewport around when cursor keys are hit

  • zone:
    • races without specific child or baby names will now get generic child/baby names instead of an empty string

    • don’t show animal assignment link for cages and restraints linked to dungeon zones (which aren’t normally assignable)

Misc Improvements

  • Help icons added to several complex overlays. clicking the icon runs gui/launcher with the help text in the help area

  • buildingplan:
    • support filtering cages by whether they are occupied

    • show how many items you need to make when planning buildings

  • gui/gm-editor: for fields with primitive types, change from click to edit to click to select, double-click to edit. this should help prevent accidental modifications to the data and make hotkeys easier to use (since you have to click on a data item to use a hotkey on it)

  • gui/overlay: filter overlays by current context so there are fewer on the screen at once and you can more easily click on the one you want to reposition

  • orders: recheck command now only resets orders that have conditions that can be rechecked

  • overlay: allow overlay_onupdate_max_freq_seconds to be dynamically set to 0 for a burst of high-frequency updates

  • prioritize: refuse to automatically prioritize dig and smooth/carve job types since it can break the DF job scheduler; instead, print a suggestion that the player use specialized units and vanilla designation priorities

  • quickfort: now allows constructions to be built on top of constructed floors and ramps, just like vanilla. however, to allow blueprints to be safely reapplied to the same area, for example to fill in buildings whose constructions were canceled due to lost items, floors will not be rebuilt on top of floors and ramps will not be rebuilt on top of ramps

  • sort: added help button for squad assignment search/filter/sort

  • tailor: now adds to existing orders if possilbe instead of creating new ones

  • zone: animals trained for war or hunting are now labeled as such in animal assignment screens


  • FILTER_FULL_TEXT: moved from gui.widgets to utils; if your full text search preference is lost, please reset it in gui/control-panel


  • added Items::getCapacity, returns the capacity of an item as a container (reverse-engineered), needed for combine


  • added dfhack.items.getCapacity to expose the new module API

  • added GRAY color aliases for GREY colors

  • utils.search_text: text search routine (generalized from internal widgets.FilteredList logic)


  • add new globals: translate_name, buildingst_completebuild

  • artifact_rumor_locationst: defined

  • viewscreen_worldst: defined types for view_mode and artifacts_arl fields

  • world_view_mode_type: defined


  • unavailable tools are no longer listed in the tag indices in the online docs

DFHack 50.11-r1

New Tools

  • startdwarf: (reinstated) set number of starting dwarves

  • tubefill: (reinstated) replenishes mined-out adamantine

New Features

  • A new searchable, sortable, filterable dialog for selecting items for display on pedestals and display cases

  • startdwarf: overlay scrollbar so you can scroll through your starting dwarves if they don’t all fit on the screen


  • EventManager: Unit death event no longer misfires on units leaving the map

  • autolabor: ensure vanilla work details are reinstated when the fort or the plugin is unloaded

  • suspendmanager: fixed a bug where floor grates, bars, bridges etc. wouldn’t be recognised as walkable, leading to unnecessary suspensions in certain cases.

  • dfhack.TranslateName(): fixed crash on certain invalid names, which affected warn-starving

Misc Improvements

  • EventManager:
    • guard against potential iterator invalidation if one of the event listeners were to modify the global data structure being iterated over

    • for onBuildingCreatedDestroyed events, changed firing order of events so destroyed events come before created events

  • devel/inspect-screen: display total grid size for UI and map layers

  • dig:
    • designate only visible tiles by default, and use “auto” dig mode for following veins

    • added options for designating only current z-level, this z-level and above, and this z-level and below

  • hotkeys:
    • make the DFHack logo brighten on hover in ascii mode to indicate that it is clickable

    • use vertical bars instead of “!” symbols for the DFHack logo in ascii mode to make it easier to read

  • suspendmanager: now suspends constructions that would cave-in immediately on completion


  • mouse key events are now aligned with internal DF semantics: _MOUSE_L indicates that the left mouse button has just been pressed and _MOUSE_L_DOWN indicates that the left mouse button is being held down. similarly for _MOUSE_R and _MOUSE_M. 3rd party scripts may have to adjust.


  • add new global: start_dwarf_count

DFHack 50.10-r1


  • ‘fix/general-strike: fix issue where too many seeds were getting planted in farm plots

  • Linux launcher: allow Steam Overlay and game streaming to function

  • autobutcher: don’t ignore semi-wild units when marking units for slaughter

Misc Improvements

  • ‘sort’: Improve combat skill scale thresholds

DFHack 50.09-r4

New Features

  • dig: new overlay for ASCII mode that visualizes designations for smoothing, engraving, carving tracks, and carving fortifications


  • buildingplan: make the construction dimensions readout visible again

  • gui/mod-manager: don’t continue to display overlay after the raws loading progress bar appears

  • seedwatch: fix a crash when reading data saved by very very old versions of the plugin

Misc Improvements

  • autofish: changed --raw argument format to allow explicit setting to on or off

  • caravan: move goods to depot screen can now see/search/trade items inside of barrels and pots

  • gui/launcher: show tagged tools in the autocomplete list when a tag name is typed

  • sort:
    • add sort option for training need on squad assignment screen

    • filter mothers with infants, units with weak mental fortitude, and critically injured units on the squad assignment screen

    • display a rating relative to the current sort order next to the visible units on the squad assignment screen


  • overlay: overlay widgets can now declare a version attribute. changing the version of a widget will reset its settings to defaults. this is useful when changing the overlay layout and old saved positions will no longer be valid.


  • argparse.boolean: convert arguments to lua boolean values.


  • Identified a number of previously anonymous virtual methods in itemst


  • add instructions for downloading development builds to the Installing page

DFHack 50.09-r3

New Tools

New Features

  • buildingplan: one-click magma/fire safety filter for planned buildings

  • exportlegends: new overlay that integrates with the vanilla “Export XML” button. Now you can generate both the vanilla export and the extended data export with a single click!

  • sort: search, sort, and filter for squad assignment screen

  • zone: advanced unit assignment screens for cages, restraints, and pits/ponds


  • Core:
    • reload scripts in mods when a world is unloaded and immediately loaded again

    • fix text getting added to DFHack text entry widgets when Alt- or Ctrl- keys are hit

  • autobutcher: fix ticks commandline option incorrectly rejecting positive integers as valid values

  • buildingplan: ensure selected barrels and buckets are empty (or at least free of lye and milk) as per the requirements of the building

  • caravan:
    • corrected prices for cages that have units inside of them

    • correct price adjustment values in trade agreement details screen

    • apply both import and export trade agreement price adjustments to items being both bought or sold to align with how vanilla DF calculates prices

    • cancel any active TradeAtDepot jobs if all caravans are instructed to leave

  • emigration:
    • fix errors loading forts after dwarves assigned to work details or workshops have emigrated

    • fix citizens sometimes “emigrating” to the fortress site

  • fix/retrieve-units: fix retrieved units sometimes becoming duplicated on the map

  • gui/launcher, gui/gm-editor: recover gracefully when the saved frame position is now offscreen

  • gui/sandbox: correctly load equipment materials in modded games that categorize non-wood plants as wood

  • orders: prevent import/export overlay from appearing on the create workorder screen

  • quickfort: cancel old dig jobs that point to a tile when a new designation is applied to the tile

  • seedwatch: ignore unplantable tree seeds

  • starvingdead: ensure sieges end properly when undead siegers starve

  • suspendmanager:
    • Fix the overlay enabling/disabling suspendmanager unexpectedly

    • improve the detection on “T” and “+” shaped high walls

  • tailor: remove crash caused by clothing items with an invalid maker_race

  • dialogs.MessageBox: fix spacing around scrollable text

Misc Improvements

  • Surround DFHack-specific UI elements with square brackets instead of red-yellow blocks for better readability

  • autobutcher: don’t mark animals for butchering if they are already marked for some kind of training (war, hunt)

  • caravan: optionally display items within bins in bring goods to depot screen

  • createitem: support creating items inside of bags

  • devel/lsmem: added support for filtering by memory addresses and filenames

  • gui/design: change “auto commit” hotkey from c to Alt-c to avoid conflict with the default keybinding for z-level down

  • gui/gm-editor:
    • hold down shift and right click to exit, regardless of how many substructures deep you are

    • display in the title bar whether the editor window is scanning for live updates

  • gui/liquids: support removing river sources by converting them into stone floors

  • gui/quickfort: blueprint details screen can now be closed with Ctrl-D (the same hotkey used to open the details)

  • hotkeys: don’t display DFHack logo in legends mode since it covers up important interface elements. the Ctrl-Shift-C hotkey to bring up the menu and the mouseover hotspot still function, though.

  • quickfort: linked stockpiles and workshops can now be specified by ID instead of only by name. this is mostly useful when dynamically generating blueprints and applying them via the quickfort API

  • sort: animals are now sortable by race on the assignment screens

  • suspendmanager: display a different color for jobs suspended by suspendmanager


  • RemoteFortressReader: add a force_reload option to the GetBlockList RPC API to return blocks regardless of whether they have changed since the last request

  • Gui: getAnyStockpile and getAnyCivzone (along with their getSelected variants) now work through layers of ZScreens. This means that they will still return valid results even if a DFHack tool window is in the foereground.

  • Items::getValue(): remove caravan_buying parameter since the identity of the selling party doesn’t actually affect the item value

  • Units: new animal propery check functions isMarkedForTraining(unit), isMarkedForTaming(unit), isMarkedForWarTraining(unit), and isMarkedForHuntTraining(unit)


  • dfhack.gui: new getAnyCivZone and getAnyStockpile functions; also behavior of getSelectedCivZone and getSelectedStockpile functions has changes as per the related API notes

  • dfhack.items.getValue(): remove caravan_buying param as per C++ API change

  • dfhack.screen.readTile(): now populates extended tile property fields (like top_of_text) in the returned Pen object

  • dfhack.units: new animal propery check functions isMarkedForTraining(unit), isMarkedForTaming(unit), isMarkedForWarTraining(unit), and isMarkedForHuntTraining(unit)

  • new(): improved error handling so that certain errors that were previously uncatchable (creating objects with members with unknown vtables) are now catchable with pcall()

  • widgets.BannerPanel: panel with distinctive border for marking DFHack UI elements on otherwise vanilla screens

  • widgets.Panel: new functions to override instead of setting corresponding properties (useful when subclassing instead of just setting attributes): onDragBegin, onDragEnd, onResizeBegin, onResizeEnd


  • Added global_table global and corresponding global_table_entry type

  • help_context_type: fix typo in enum name: EMBARK_TUTORIAL_CHICE -> EMBARK_TUTORIAL_CHOICE

  • plotinfo: name the fields related to tutorial popups

  • viewscreen_legendsst: realign structure

  • viewscreen_new_arenast: added (first appeared in 50.06)

DFHack 50.09-r2

New Plugins

  • 3dveins: reinstated for v50, this plugin replaces vanilla DF’s blobby vein generation with veins that flow smoothly and naturally between z-levels

  • dig: new dig.asciiwarmdamp overlay that highlights warm and damp tiles when in ASCII mode. there is no effect in graphics mode since the tiles are already highlighted there

  • dwarfvet: reinstated and updated for v50’s new hospital mechanics; allow your animals to have their wounds treated at hospitals

  • zone: new searchable, sortable, filterable screen for assigning units to pastures

New Scripts

  • caravan: new trade screen UI replacements for bringing goods to trade depot and trading

  • fix/empty-wheelbarrows: new script to empty stuck rocks from all wheelbarrows on the map


  • Fix extra keys appearing in DFHack text boxes when shift (or any other modifier) is released before the other key you were pressing

  • gui/autodump: when “include items claimed by jobs” is on, actually cancel the job so the item can be teleported

  • gui/create-item: when choosing a citizen to create the chosen items, avoid choosing a dead citizen

  • gui/gm-unit: fix commandline processing when a unit id is specified

  • logistics:
    • don’t autotrain domestic animals brought by invaders (they’ll get attacked by friendly creatures as soon as you let them out of their cage)

    • don’t bring trade goods to depot if the only caravans present are tribute caravans

    • fix potential crash when removing stockpiles or turning off stockpile features

  • suspendmanager:
    • take in account already built blocking buildings

    • don’t consider tree branches as a suitable access path to a building

Misc Improvements

  • Dreamfort: give noble suites double-thick walls and add apartment doors

  • Suppress DF keyboard events when a DFHack keybinding is matched. This prevents, for example, a backtick from appearing in a textbox as text when you launch gui/launcher from the backtick keybinding.

  • autonick: add more variety to nicknames based on famous literary dwarves

  • gui/unit-syndromes: make lists searchable

  • logistics: bring an autotraded bin to the depot if any item inside is tradeable instead of marking all items within the bin as untradeable if any individual item is untradeable

  • quickfort: blueprint libraries are now moddable – add a blueprints/ directory to your mod and they’ll show up in quickfort and gui/quickfort!

  • stockpiles: include exotic pets in the “tameable” filter

  • suspendmanager: display the suspension reason when viewing a suspended building

  • widgets.EditField: DFHack edit fields now support cut/copy/paste with the system clipboard with Ctrl-X/Ctrl-C/Ctrl-V


  • Items::markForTrade(), Items::isRequestedTradeGood(), Items::getValue: see Lua notes below

  • Units::getUnitByNobleRole, Units::getUnitsByNobleRole: unit lookup API by role


  • Price calculations fixed for many item types


  • dfhack.items.getValue: gained optional caravan and caravan_buying parameters for prices that take trader races and agreements into account

  • dfhack.items.isRequestedTradeGood: discover whether an item is named in a trade agreement with an active caravan

  • dfhack.items.markForTrade: mark items for trade

  • dfhack.units.getUnitByNobleRole, dfhack.units.getUnitsByNobleRole: unit lookup API by role

  • widgets.TextButton: wraps a HotkeyLabel and decorates it to look more like a button


  • build_req_choicest: realign structure and fix vmethods

  • squad_orderst: fix vmethods


  • misery: rewrite the documentation to clarify the actual effects of the plugin

DFHack 50.09-r1

Misc Improvements

  • caravan: new overlay for selecting all/none on trade request screen

  • suspendmanager: don’t suspend constructions that are built over open space


  • Core: update SDL interface from SDL1 to SDL2


  • tiletype_shape: changed RAMP_TOP and ENDLESS_PIT to not walkable to reflect how scripts actually need these types to be treated

DFHack 50.08-r4

New Plugins

  • logistics: automatically mark and route items or animals that come to monitored stockpiles. options are toggleable on an overlay that comes up when you have a stockpile selected.


  • buildingplan: don’t include artifacts when max quality is masterful

  • dig-now: clear item occupancy flags for channeled tiles that had items on them

  • emigration: reassign home site for emigrating units so they don’t just come right back to the fort

  • gui/create-item: allow blocks to be made out of wood when using the restrictive filters

  • gui/liquids: ensure tile temperature is set correctly when painting water or magma

  • gui/quickfort:
    • allow traffic designations to be applied over buildings

    • protect against meta blueprints recursing infinitely if they include themselves

  • gui/sandbox: allow creatures that have separate caste-based graphics to be spawned (like ewes/rams)

  • RemoteFortressReader: fix a crash with engravings with undefined images

  • workorder: prevent autoMilkCreature from over-counting milkable animals, which was leading to cancellation spam for the MilkCreature job

Misc Improvements

  • Blueprint library:
    • dreamfort: full rewrite and update for DF v50

    • pump_stack: updated walkthrough and separated dig and channel steps so boulders can be cleared

    • aquifer_tap: updated walkthrough

  • autonick: additional nicknames based on burrowing animals, colours, gems, and minerals

  • combine: reduce max different stacks in containers to 30 to prevent contaners from getting overfull

  • dig-now: can now handle digging obsidian that has been formed from magma and water

  • gui/autodump: add option to clear the trader flag from teleported items, allowing you to reclaim items dropped by merchants

  • gui/control-panel:
  • gui/quickfort:
    • adapt “cursor lock” to mouse controls so it’s easier to see the full preview for multi-level blueprints before you apply them

    • only display post-blueprint messages once when repeating the blueprint up or down z-levels

  • gui/sandbox: when creating citizens, give them names appropriate for their races

  • orders:
    • only display import/export/sort/clear panel on main orders screen

    • refine order conditions for library orders to reduce cancellation spam

  • prioritize: add wild animal management tasks and lever pulling to the default list of prioritized job types

  • quickfort: significant rewrite for DF v50! now handles zones, locations, stockpile configuration, hauling routes, and more

  • stockpiles: added barrels, organic, artifacts, and masterworks stockpile presets

  • suspendmanager:
    • now suspends construction jobs on top of floor designations, protecting the designations from being erased

    • suspend blocking jobs when building high walls or filling corridors

  • workorder: reduce existing orders for automatic shearing and milking jobs when animals are no longer available


  • gui/automelt: replaced by an overlay panel that appears when you click on a stockpile


  • abstract_building_libraryst: initialize unknown variables as DF does

  • misc_trait_type: realign


DFHack 50.08-r3


  • Fix crash for some players when they launch DF outside of the Steam client

DFHack 50.08-r2

New Plugins

  • add-spatter: (reinstated) allow mods to add poisons and magical effects to weapons

  • changeitem: (reinstated) change item material, quality, and subtype

  • createitem: (reinstated) create arbitrary items from the command line

  • deramp: (reinstated) removes all ramps designated for removal from the map

  • flows: (reinstated) counts map blocks with flowing liquids

  • lair: (reinstated) mark the map as a monster lair (this avoids item scatter when the fortress is abandoned)

  • luasocket: (reinstated) provides a Lua API for accessing network sockets

  • work-now: (reinstated, renamed from workNow) prevent dwarves from wandering aimlessly with “No job” after completing a task

New Scripts

  • assign-minecarts: (reinstated) quickly assign minecarts to hauling routes

  • diplomacy: view or alter diplomatic relationships

  • exportlegends: (reinstated) export extended legends information for external browsing

  • fix/stuck-instruments: fix instruments that are attached to invalid jobs, making them unusable. turn on automatic fixing in gui/control-panel in the Maintenance tab.

  • gui/autodump: point and click item teleportation and destruction interface (available only if armok tools are shown)

  • gui/mod-manager: automatically restore your list of active mods when generating new worlds

  • gui/sandbox: creation interface for units, trees, and items (available only if armok tools are shown)

  • light-aquifers-only: (reinstated) convert heavy aquifers to light

  • modtools/create-item: (reinstated) commandline and API interface for creating items

  • necronomicon: search fort for items containing the secrets of life and death


  • DFHack screen backgrounds now use appropriate tiles in DF Classic

  • RemoteServer: fix crash on malformed json in dfhack-config/remote-server.json

  • autolabor: work detail override warning now only appears on the work details screen

  • deathcause: fix incorrect weapon sometimes being reported

  • gui/create-item: allow armor to be made out of leather when using the restrictive filters

  • gui/design: Fix building and stairs designation

  • quickfort:
    • properly allow dwarves to smooth, engrave, and carve beneath walkable tiles of buildings

    • fixed detection of tiles where machines are allowed (e.g. water wheels can be built on stairs if there is a machine support nearby)

    • fixed rotation of blueprints with carved track tiles

  • RemoteFortressReader: ensured names are transmitted in UTF-8 instead of CP437

Misc Improvements

  • Core: new commandline flag/environment var: pass --disable-dfhack on the Dwarf Fortress commandline or specify DFHACK_DISABLE=1 in the environment to disable DFHack for the current session.

  • Dreamfort: improve traffic patterns throughout the fortress

  • Settings: recover gracefully when settings files become corrupted (e.g. by DF CTD)

  • Window behavior:
    • non-resizable windows now allow dragging by their frame edges by default

    • if you have multiple DFHack tool windows open, scrolling the mouse wheel while over an unfocused window will focus it and raise it to the top

  • autodump: no longer checks for a keyboard cursor before executing, so autodump destroy (which doesn’t require a cursor) can still function

  • gui/autodump: fort-mode keybinding: Ctrl-H (when armok tools are enabled in gui/control-panel)

  • gui/blueprint: recording of stockpile layouts and categories is now supported. note that detailed stockpile configurations will not be saved (yet)

  • gui/control-panel: new preference for whether filters in lists search for substrings in the middle of words (e.g. if set to true, then “ee” will match “steel”)

  • gui/create-item: ask for number of items to spawn by default

  • gui/design: Improved performance for drawing shapes

  • gui/gm-editor:
    • when passing the --freeze option, further ensure that the game is frozen by halting all rendering (other than for DFHack tool windows)

    • Alt-A now enables auto-update mode, where you can watch values change live when the game is unpaused

  • gui/quickfort:
    • blueprints that designate items for dumping/forbidding/etc. no longer show an error highlight for tiles that have no items on them

    • place (stockpile layout) mode is now supported. note that detailed stockpile configurations were part of query mode and are not yet supported

    • you can now generate manager orders for items required to complete bluerpints

  • light-aquifers-only: now available as a fort Autostart option in gui/control-panel. note that it will only appear if “armok” tools are configured to be shown on the Preferences tab.

  • orders: update orders in library for prepared meals, bins, archer uniforms, and weapons

  • overlay: add links to the quickstart guide and the control panel on the DF title screen

  • stockpiles: allow filtering creatures by tameability


  • orders: library/military_include_artifact_materials library file removed since recent research indicates that platinum blunt weapons and silver crossbows are not more effective than standard steel. the alternate military orders file was also causing unneeded confusion.


  • dfhack.internal: added memory analysis functions: msizeAddress, getHeapState, heapTakeSnapshot, isAddressInHeap, isAddressActiveInHeap, isAddressUsedAfterFreeInHeap, getAddressSizeInHeap, and getRootAddressOfHeapObject


  • ensure_keys: walks a series of keys, creating new tables for any missing values

  • gui: changed frame naming scheme to FRAME_X rather than X_FRAME, and added aliases for backwards compatibility. (for example BOLD_FRAME is now called FRAME_BOLD)

  • overlay.reload(): has been renamed to overlay.rescan() so as not to conflict with the global reload() function. If you are developing an overlay, please take note of the new function name for reloading your overlay during development.


  • Removed steam_mod_manager and game_extra globals. Their contents have been merged back into game.

  • abstract_building_contents: identify fields and flags related to location item counts

  • arena_tree: identify fields related to tree creation

  • arena_unit: identify fields related to unit creation

  • mod_headerst: rename non_vanilla flag to vanilla to reflect its actual usage

  • profession: renamed captions Cheese Maker to Cheesemaker, Bee Keeper to Beekeeper, and Bone Setter to Bone Doctor

DFHack 50.08-r1


  • autoclothing: eliminate game lag when there are many inventory items in the fort

  • buildingplan:
    • fixed size limit calculations for rollers

    • fixed items not being checked for accessibility in the filter and item selection dialogs

  • deteriorate: ensure remains of enemy dwarves are properly deteriorated

  • dig-now: properly detect and complete smoothing designations that have been converted into active jobs

  • suspendmanager: Fix over-aggressive suspension of jobs that could still possibly be done (e.g. jobs that are partially submerged in water)

Misc Improvements

  • buildingplan:
    • planner panel is minimized by default and now remembers minimized state

    • can now filter by gems (for gem windows) and yarn (for ropes in wells)

  • combine: Now supports ammo, parts, powders, and seeds, and combines into containers

  • deteriorate: add option to exclude useable parts from deterioration

  • gui/control-panel:
    • add preference option for hiding the terminal console on startup

    • add preference option for hiding “armok” tools in command lists

  • gui/gm-editor:
    • press g to move the map to the currently selected item/unit/building

    • press Ctrl-D to toggle read-only mode to protect from accidental changes; this state persists across sessions

    • new --freeze option for ensuring the game doesn’t change while you’re inspecting it

  • gui/launcher: DFHack version now shown in the default help text

  • gui/prerelease-warning: widgets are now clickable

  • overlay: add the DFHack version string to the DF title screen

  • Dwarf Therapist: add a warning to the Labors screen when Dwarf Therapist is active so players know that changes they make to that screen will have no effect. If you’re starting a new embark and nobody seems to be doing anything, check your Labors tab for this warning to see if Dwarf Therapist thinks it is in control (even if it’s not running).

  • toggle-kbd-cursor: add hotkey for toggling the keyboard cursor (Alt-K)

  • version: add alias to display the DFHack help (including the version number) so something happens when players try to run “version”



  • gui.ZScreenModal: ZScreen subclass for modal dialogs

  • widgets.CycleHotkeyLabel: exposed “key_sep” and “option_gap” attributes for improved stylistic control.

  • widgets.RangeSlider: new mouse-controlled two-headed slider widget


  • convert mod_manager fields to pointers

DFHack 50.07-r1

New Plugins

  • faststart: speeds up the “Loading…” screen so the Main Menu appears faster


  • blueprint: interpret saplings, shrubs, and twigs as floors instead of walls

  • caravan: fix trade good list sometimes disappearing when you collapse a bin

  • combine: fix error processing stockpiles with boundaries that extend outside of the map

  • gui/control-panel: the config UI for automelt is no longer offered when not in fortress mode

  • gui/gm-editor: no longer nudges last open window when opening a new one

  • hotkeys: hotkey hints on menu popup will no longer get their last character cut off by the scrollbar

  • prospector: display both “raw” Z levels and “cooked” elevations

  • stockpiles:
    • fix crash when importing settings for gems from other worlds

    • allow numbers in saved stockpile filenames

  • warn-starving: no longer warns for dead units

  • launchdf: launch Dwarf Fortress via the Steam client so Steam Workshop is functional

Misc Improvements

  • Core: hide DFHack terminal console by default when running on Steam Deck

  • Mods:
    • scripts in mods that are only in the steam workshop directory are now accessible. this means that a script-only mod that you never mark as “active” when generating a world will still receive automatic updates and be usable from in-game

    • scripts from only the most recent version of an installed mod are added to the script path

    • give active mods a chance to reattach their load hooks when a world is reloaded

  • buildingplan:
    • items in the item selection dialog should now use the same item quality symbols as the base game

    • hide planner overlay while the DF tutorial is active so that it can detect when you have placed the carpenter’s workshop and bed and allow you to finish the tutorial

    • can now filter by cloth and silk materials (for ropes)

    • rearranged elements of planneroverlay interface

    • rearranged elements of itemselection interface

  • gui/control-panel:
    • bugfix services are now enabled by default

    • add faststart to the system services

  • gui/gm-editor:
    • can now jump to material info objects from a mat_type reference with a mat_index using i

    • the key column now auto-fits to the widest key

  • prioritize: revise and simplify the default list of prioritized jobs – be sure to tell us if your forts are running noticeably better (or worse!)


  • added two new window borders: gui.BOLD_FRAME for accented elements and gui.INTERIOR_MEDIUM_FRAME for a signature-less frame that’s thicker than the existing gui.INTERIOR_FRAME


  • correct bit size of tree body data

  • identified fields in deep_vein_hollow, glowing_barrier, and cursed_tomb map events

  • identified divine_treasure and encased_horror map events


DFHack 50.07-beta2

New Plugins

  • getplants: reinstated: designate trees for chopping and shrubs for gathering according to type

  • prospector: reinstated: get stone, ore, gem, and other tile property counts in fort mode.

New Scripts


  • buildingplan:
    • filters are now properly applied to planned stairs

    • existing carved up/down stairs are now taken into account when determining which stair shape to construct

    • upright spike traps are now placed extended rather than retracted

    • you can no longer designate constructions on tiles with magma or deep water, mirroring the vanilla restrictions

    • fixed material filters getting lost for planning buildings on save/reload

    • respect building size limits (e.g. roads and bridges cannot be more than 31 tiles in any dimension)

  • caravan: item list length now correct when expanding and collapsing containers

  • prioritize: fixed all watched job type names showing as nil after a game load

  • suspendmanager:
    • does not suspend non-blocking jobs such as floor bars or bridges anymore

    • fix occasional bad identification of buildingplan jobs

  • tailor:
    • properly discriminate between dyed and undyed cloth

    • no longer default to using adamantine cloth for producing clothes

    • take queued orders into account when calculating available materials

    • skip units who can’t wear clothes

    • identify more available items as available, solving issues with over-production

  • warn-starving: no longer warns for enemy and neutral units

Misc Improvements

  • Mods: scripts in mods are now automatically added to the DFHack script path. DFHack recognizes two directories in a mod’s folder: scripts_modinstalled/ and scripts_modactive/. scripts_modinstalled/ folders will always be added the script path, regardless of whether the mod is active in a world. scripts_modactive/ folders will only be added to the script path when the mod is active in the current loaded world.

  • automelt: now allows metal chests to be melted (workaround for DF bug 2493 is no longer needed)

  • buildingplan:
    • filters and global settings are now ignored when manually choosing items for a building, allowing you to make custom choices independently of the filters that would otherwise be used

    • if suspendmanager is running, then planned buildings will be left suspended when their items are all attached. suspendmanager will unsuspsend them for construction when it is safe to do so.

    • add option for autoselecting the last manually chosen item (like automaterial used to do)

  • combine:
    • you can select a target stockpile in the UI instead of having to use the keyboard cursor

    • added --quiet option for no output when there are no changes

  • confirm: adds confirmation for removing burrows via the repaint menu

  • enable: can now interpret aliases defined with the alias command

  • exterminate: add support for vaporize kill method for when you don’t want to leave a corpse

  • gui/control-panel:
    • Now detects overlays from scripts named with capital letters

    • added combine all maintenance option for automatic combining of partial stacks in stockpiles

    • added general-strike maintenance option for automatic fixing of (at least one cause of) the general strike bug

  • gui/cp437-table:
    • now has larger key buttons and clickable backspace/submit/cancel buttons, making it fully usable on the Steam Deck and other systems that don’t have an accessible keyboard

    • dialog is now fully controllable with the mouse, including highlighting which key you are hovering over and adding a clickable backspace button

  • gui/design: Now supports placing constructions using ‘Building’ mode. Inner and Outer tile constructions are configurable. Uses buildingplan filters set up with the regular buildingplan interface.

  • orders:
    • add minimize button to overlay panel so you can get it out of the way to read long statue descriptions when choosing a subject in the details screen

    • add option to delete exported files from the import dialog

  • stockpiles:
    • support applying stockpile configurations with fully enabled categories to stockpiles in worlds other than the one where the configuration was exported from

    • support partial application of a saved config based on dynamic filtering (e.g. disable all tallow in a food stockpile, even tallow from world-specific generated creatures)

    • additive and subtractive modes when applying a second stockpile configuration on top of a first

    • write player-exported stockpile configurations to the dfhack-config/stockpiles folder. If you have any stockpile configs in other directories, please move them to that folder.

    • now includes a library of useful stockpile configs (see docs for details)

  • stripcaged:
    • added --skip-forbidden option for greater control over which items are marked for dumping

    • items that are marked for dumping are now automatically unforbidden (unless --skip-forbidden is set)



  • widgets.CycleHotkeyLabel:
    • options that are bare integers will no longer be interpreted as the pen color in addition to being the label and value

    • option labels and pens can now be functions that return a label or pen

  • widgets.Label:
    • tokens can now specify a htile property to indicate the tile that should be shown when the Label is hovered over with the mouse

    • click handlers no longer get the label itself as the first param to the click handler


  • realigned furniture_type enum (added BAG)

  • realigned stockpile_settings for new “corpses” vector


  • the untested tag has been renamed to unavailable to better reflect the status of the remaining unavaialable tools. most of the simply “untested” tools have now been tested and marked as working. the remaining tools are known to need development work before they are available again.

  • DFHack modding guide: guide updated to include information for 3rd party script developers

DFHack 50.07-beta1

New Scripts


  • buildingplan:
    • items are now attached correctly to screw pumps and other multi-item buildings

    • buildings with different material filters will no longer get “stuck” if one of the filters currently matches no items

  • gui/launcher: tab characters in command output now appear as a space instead of a code page 437 “blob”

  • quicksave: now reliably triggers an autosave, even if one has been performed recently

  • showmood properly count required number of bars and cloth when they aren’t the main item for the strange mood

Misc Improvements

  • Quickfort blueprint library:
    • library blueprints have moved from blueprints to hack/data/blueprints

    • player-created blueprints should now go in the dfhack-config/blueprints folder. please move your existing blueprints from blueprints to dfhack-config/blueprints. you don’t need to move the library blueprints – those can be safely deleted from the old blueprints directory.

  • blueprint: now writes blueprints to the dfhack-config/blueprints directory

  • buildingplan:
    • can now filter by clay materials

    • remember choice per building type for whether the player wants to choose specific items

    • you can now attach multiple weapons to spike traps

    • can now filter by whether a slab is engraved

    • add “minimize” button to temporarily get the planner overlay out of the way if you would rather use the vanilla UI for placing the current building

    • add buildingplan reset command for resetting all filters to defaults

    • rename “Build” button to “Confirm” on the item selection dialog and change the hotkey from “B” to “C”

  • gui/gm-editor: can now open the selected stockpile if run without parameters

  • quickfort: now reads player-created blueprints from dfhack-config/blueprints/ instead of the old blueprints/ directory. Be sure to move over your personal blueprints to the new directory!

  • showmood: clarify how many bars and/or cloth items are actually needed for the mood


  • buildingplan: “heat safety” setting is temporarily removed while we investigate incorrect item matching


  • identified two fields related to saves/autosaves to facilitate quicksave implementation

DFHack 50.07-alpha3


  • dig-now: fixed multi-layer channel designations only channeling every second layer

  • gui/create-item: fix generic corpsepiece spawning

  • dfhack.job.isSuitableMaterial: now properly detects lack of fire and magma safety for vulnerable materials with high melting points

  • widgets.HotkeyLabel: don’t trigger on click if the widget is disabled

Misc Improvements

  • buildingplan: entirely new UI for building placement, item selection, and materials filtering!

  • dig-now: added handling of dig designations that have been converted into active jobs

  • gui/create-item: added ability to spawn ‘whole’ corpsepieces (every layer of a part)

  • gui/dig:
    • Allow placing an extra point (curve) while still placing the second main point

    • Allow placing n-point shapes, shape rotation/mirroring

    • Allow second bezier point, mirror-mode for freeform shapes, symmetry mode



  • Gui focus strings will no longer get the “dfhack/” prefix if the string “dfhack/” already exists in the focus string

  • Maps::GetBiomeTypeRef renamed to Maps::getBiomeTypeRef for consistency

  • Maps::GetBiomeType renamed to Maps::getBiomeType for consistency

  • Military:
    • New module for military functionality

    • new makeSquad to create a squad

    • changed getSquadName to take a squad identifier

    • new updateRoomAssignments for assigning a squad to a barracks and archery range


  • dfhack.job.attachJobItem(): allows you to attach specific items to a job

  • dfhack.screen.paintTile(): you can now explicitly clear the interface cursor from a map tile by passing 0 as the tile value

  • gui.INTERIOR_FRAME: a panel frame style for use in highlighting off interior areas of a UI

  • maps.getBiomeType: exposed preexisting function to Lua

  • widgets.CycleHotkeyLabel: add label_below attribute for compact 2-line output

  • widgets.FilteredList: search key matching is now case insensitive by default

  • widgets.Label: token tile properties can now be functions that return a value


  • history_eventst: Removed history_event_masterpiece_created_arch_designst and related enum value

  • plot_infost.``unk_8``: renamed to theft_intrigues. Fields unk_1 thru unk_8 renamed to target_item, mastermind_hf, mastermind_plot_id, corruptor_hf, corruptor, corruptee_hf, corruptee, and theft_agreement. unk_1 renamed to item_known_pos.

  • specific_ref_type: Removed BUILDING_PARTY, PETINFO_PET, and PETINFO_OWNER enum values to fix alignment.

DFHack 50.07-alpha2

New Scripts

  • combine: combines stacks of food and plant items.


  • autobutcher: implemented work-around for Dwarf Fortress not setting nicknames properly, so that nicknames created in the in-game interface are detected & protect animals from being butchered properly. Note that nicknames for unnamed units are not currently saved by dwarf fortress - use enable fix/protect-nicks to fix any nicknames created/removed within dwarf fortress so they can be saved/reloaded when you reload the game.

  • autochop: generate default names for burrows with no assigned names

  • autodump: changed behaviour to only change dump and forbid flags if an item is successfully dumped.

  • channel-safely: fix an out of bounds error regarding the REPORT event listener receiving (presumably) stale id’s

  • confirm: fix fps drop when enabled

  • devel/query: can now properly index vectors in the –table argument

  • forbid: fix detection of unreachable items for items in containers

  • gui/blueprint: correctly use setting presets passed on the commandline

  • gui/quickfort: correctly use settings presets passed on the commandline

  • makeown: fixes errors caused by using makeown on an invader

  • nestboxes: fixed bug causing nestboxes themselves to be forbidden, which prevented citizens from using them to lay eggs. Now only eggs are forbidden.

  • seedwatch: fix saving and loading of seed stock targets

  • tailor: block making clothing sized for toads; make replacement clothing orders use the size of the wearer, not the size of the garment

  • troubleshoot-item: fix printing of job details for chosen item

  • unforbid: fix detection of unreachable items for items in containers

  • Buildings::StockpileIterator: fix check for stockpile items on block boundary.

Misc Improvements

  • DFHack tool windows that capture mouse clicks (and therefore prevent you from clicking on the “pause” button) now unconditionally pause the game when they open (but you can still unpause with the keyboard if you want to). Examples of this behavior: gui/quickfort, gui/blueprint, gui/liquids

  • Stopped mouse clicks from affecting the map when a click on a DFHack screen dismisses the window

  • autobutcher: logs activity to the console terminal instead of making disruptive in-game announcements

  • caravan: add trade screen overlay that assists with seleting groups of items and collapsing groups in the UI

  • confirm: configuration data is now persisted globally.

  • devel/query: will now search for jobs at the map coordinate highlighted, if no explicit job is highlighted and there is a map tile highlighted

  • devel/visualize-structure: now automatically inspects the contents of most pointer fields, rather than inspecting the pointers themselves

  • gui/gm-editor: will now inspect a selected building itself if the building has no current jobs

  • showmood: now shows the number of items needed for cloth and bars in addition to the technically correct but always confusing “total dimension” (150 per bar or 10,000 per cloth)

  • tailor: add support for adamantine cloth (off by default); improve logging

  • troubleshoot-item:
    • output as bullet point list with indenting, with item description and ID at top

    • reports on items that are hidden, artifacts, in containers, and held by a unit

    • reports on the contents of containers with counts for each contained item type



  • Units module: added new predicates for isGeldable(), isMarkedForGelding(), and isPet()

  • Gui::any_civzone_hotkey, Gui::getAnyCivZone, Gui::getSelectedCivZone: new functions to operate on the new zone system


  • dfhack.gui.getSelectedCivZone: returns the Zone that the user has selected currently

  • widgets.FilteredList: Added edit_on_change optional parameter to allow a custom callback on filter edit change.

  • widgets.TabBar: new library widget (migrated from control-panel.lua)


  • corrected alignment in world.status

  • identify item vmethod 213 (applies a thread improvements to appropriate items based on an RNG)

  • identify two anons in difficultyst

  • identify various data types related to job completion/cancellation

  • split gamest into gamest and gamest_extra to accommodate steam-specific data in gamest.mod_manager

  • activity_info: unit_actor, unit_noble, and place converted from pointers to integer references.

  • dipscript_popup: meeting_holder converted from unit pointer into two unit refs meeting_holder_actor and meeting_holder_noble.

  • plotinfost.``equipment``: Converted items_unmanifested, items_unassigned, and items_assigned vectors from pointers to item refs

DFHack 50.07-alpha1

New Scripts

  • gui/design: digging and construction designation tool with shapes and patterns

  • makeown: makes the selected unit a citizen of your fortress


  • Fix persisted data not being written on manual save

  • Fix right click sometimes closing both a DFHack window and a vanilla panel

  • Fixed issue with scrollable lists having some data off-screen if they were scrolled before being made visible

  • autochop: fixed bug related to lua stack smashing behavior in returned stockpile configs

  • automelt: fixed bug related to lua stack smashing behavior in returned stockpile configs

  • channel-safely: fixed bug resulting in marker mode never being set for any designation

  • fix/protect-nicks: now works by setting the historical figure nickname

  • gui/dig: Fix for ‘continuing’ auto-stair designation. Avoid nil index issue for tile_type

  • gui/liquids: fixed issues with unit pathing after adding/removing liquids

  • gui/unit-syndromes: allow the window widgets to be interacted with

  • nestboxes:
    • now cancels any in-progress hauling jobs when it protects a fertile egg

    • now scans for eggs more frequently and cancels any in-progress hauling jobs when it protects a fertile egg

  • Units::isFortControlled: Account for agitated wildlife

Misc Improvements

  • replaced DFHack logo used for the hover hotspot with a crisper image

  • autobutcher:
    • changed defaults from 5 females / 1 male to 4 females / 2 males so a single unfortunate accident doesn’t leave players without a mating pair

    • now immediately loads races available at game start into the watchlist

  • autodump:
    • reinstate autodump-destroy-item, hotkey: Ctrl-K

    • new hotkey for autodump-destroy-here: Ctrl-H

  • automelt: is now more resistent to vanilla savegame corruption

  • cleaners: new hotkey for cleaners: Ctrl-C

  • dig: new hotkeys for vein designation on z-level (Ctrl-V) and vein designation across z-levels (Ctrl-Shift-V)

  • gui/dig : Added ‘Line’ shape that also can draw curves, added draggable center handle

  • gui/gm-editor:
    • now supports multiple independent data inspection windows

    • now prints out contents of coordinate vars instead of just the type

  • hotkeys: DFHack logo is now hidden on screens where it covers important information when in the default position (e.g. when choosing an embark site)

  • misery: now persists state with the fort

  • orders: recipe for silver crossbows removed from library/military as it is not a vanilla recipe, but is available in library/military_include_artifact_materials

  • rejuvenate: now takes an –age parameter to choose a desired age.

  • stonesense: added an INVERT_MOUSE_Z option to invert the mouse wheel direction


  • overlay: overlay widgets can now specify focus paths for the viewscreens they attach to so they only appear in specific contexts. see DFHack overlay dev guide for details.

  • widgets.CycleHotkeyLabel: Added key_back optional parameter to cycle backwards.

  • widgets.FilteredList: Added case_sensitive optional paramter to determine if filtering is case sensitive.

  • widgets.HotkeyLabel:
    • Added setLabel method to allow easily updating the label text without mangling the keyboard shortcut.

    • Added setOnActivate method to allow easily updating the on_activate callback.


  • added missing tiletypes and corrected a few old ones based on a list supplied by Toady

DFHack 50.05-alpha3.1


  • gui/launcher: no longer resets to the Help tab on every keystroke

  • seedwatch: fix parameter parsing when setting targets

DFHack 50.05-alpha3

New Plugins

  • autoslab: automatically create work orders to engrave slabs for ghostly dwarves

New Scripts


  • allow launcher tools to launch themselves without hanging the game

  • DF screens can no longer get “stuck” on transitions when DFHack tool windows are visible. Instead, those DF screens are force-paused while DFHack windows are visible so the player can close them first and not corrupt the screen sequence. The “PAUSE FORCED” indicator will appear on these DFHack windows to indicate what is happening.

  • fix issues with clicks “passing through” some DFHack window elements to the screen below

  • autochop: fixed a crash when processing trees with corrupt data structures (e.g. when a trunk tile fails to fall when the rest of the tree is chopped down)

  • autoclothing: fixed a crash that can happen when units are holding invalid items.

  • build-now: now correctly avoids adjusting non-empty tiles above constructions that it builds

  • catsplosion: now only affects live, active units

  • getplants: trees are now designated correctly

  • orders:
    • fix orders in library/basic that create bags

    • library/military now sticks to vanilla rules and does not add orders for normally-mood-only platinum weapons. A new library orders file library/military_include_artifact_materials is now offered as an alternate library/military set of orders that still includes the platinum weapons.

  • quickfort: allow floor bars, floor grates, and hatches to be placed over all stair types like vanilla allows

Misc Improvements

  • DFHack windows can now be “defocused” by clicking somewhere not over the tool window. This has the same effect as pinning previously did, but without the extra clicking.

  • New borders for DFHack tool windows – tell us what you think!

  • Windows now display “PAUSE FORCED” on the lower border if the tool is forcing the game to pause

  • autoclothing: merged the two separate reports into the same command.

  • automelt: stockpile configuration can now be set from the commandline

  • ban-cooking:
    • ban announcements are now hidden by default; use new option --verbose to show them.

    • report number of items banned.

  • build-now: now handles dirt roads and initializes farm plots properly

  • channel-safely: new monitoring for cave-in prevention

  • devel/click-monitor: report on middle mouse button actions

  • getplants: ID values will now be accepted regardless of case

  • gui/autochop: hide uninteresting burrows by default

  • gui/blueprint: allow map movement with the keyboard while the UI is open

  • gui/control-panel:
    • you can now configure whether DFHack tool windows should pause the game by default

    • new global hotkey for quick access: Ctrl-Shift-E

  • gui/create-item:
    • support spawning corpse pieces (e.g. shells) under “body part”

    • added search and filter capabilities to the selection lists

    • added whole corpse spawning alongside corpsepieces. (under “corpse”)

  • gui/launcher:
    • sped up initialization time for faster window appearance

    • make command output scrollback separate from the help text so players can continue to see the output of the previous command as they type the next one

    • allow double spacebar to pause/unpause the game, even while typing a command

    • clarify what is being shown in the autocomplete list (all commands, autocompletion of partially typed command, or commands related to typed command)

    • support running commands directly from the autocomplete list via double-clicking

  • gui/liquids: interface overhaul, also now allows spawning river sources, setting/adding/removing liquid levels, and cleaning water from being salty or stagnant

  • gui/overlay: now focuses on repositioning overlay widgets; enabling, disabling, and getting help for overlay widgets has moved to the new gui/control-panel

  • gui/quickcmd:
    • now has its own global keybinding for your convenience: Ctrl-Shift-A

    • now acts like a regular window instead of a modal dialog

  • gui/quickfort: don’t close the window when applying a blueprint so players can apply the same blueprint multiple times more easily

  • hotkeys: clicking on the DFHack logo no longer closes the popup menu

  • locate-ore: now only searches revealed tiles by default

  • modtools/spawn-liquid: sets tile temperature to stable levels when spawning water or magma

  • nestboxes: now saves enabled state in your savegame

  • orders: orders plugin functionality is now accessible via an overlay widget when the manager orders screen is open

  • prioritize:
    • pushing minecarts is now included in the default priortization list

    • now automatically starts boosting the default list of job types when enabled

  • quickfort: planned buildings are now properly attached to any pertinent overlapping zones

  • seedwatch: now persists enabled state in the savegame, automatically loads useful defaults, and respects reachability when counting available seeds

  • unforbid: avoids unforbidding unreachable and underwater items by default



  • overlay: overlay widgets can now specify a default enabled state if they are not already set in the player’s overlay config file

  • Buildings::containsTile(): no longer takes a room parameter since that’s not how rooms work anymore. If the building has extents, the extents will be checked. otherwise, the result just depends on whether the tile is within the building’s bounding box.

  • Lua::Push: now supports std::unordered_map

  • Screen::Pen: now accepts top_of_text and bottom_of_text properties to support offset text in graphics mode

  • Units::getCitizens(): gets a list of citizens, which otherwise you’d have to iterate over all units the world to discover


  • helpdb:
    • new function: helpdb.refresh() to force a refresh of the database. Call if you are a developer adding new scripts, loading new plugins, or changing help text during play

    • changed from auto-refreshing every 60 seconds to only refreshing on explicit call to helpdb.refresh(). docs very rarely change during a play session, and the automatic database refreshes were slowing down the startup of gui/launcher and anything else that displays help text.

  • tiletypes: now has a Lua API! tiletypes_setTile

  • dfhack.units.getCitizens(): gets a list of citizens

  • gui.ZScreen: new attribute: defocusable for controlling whether a window loses keyboard focus when the map is clicked

  • widgets.Label:
    • label.scroll() now understands home and end keywords for scrolling to the top or bottom

    • token tile properties can now be either pens or numeric texture ids

  • widgets.List: new callbacks for double click and shift double click


  • add “hospital” language name category

  • corrected misalignment in unitst (affecting occupation and adjective)

  • identified fields for squads and other military structures

  • identified some anons in unitst related to textures (thanks, putnam)

  • identify a table of daily events scheduled to take place inthe current year

  • realigned and fleshed out entity_site_link (again, thanks, putnam)

  • remove some no-longer-valid reputation types

  • building_design: corrected misalignments

  • creature_raw_graphics: corrected misalignments

  • item.setSharpness(): more info about params

  • occupation_type: add enum values for new occupations related to hospitals


  • Quickstart guide has been updated with info on new window behavior and how to use the control panel

  • Compilation: instructions added for cross-compiling DFHack for Windows from a Linux Docker builder

DFHack 50.05-alpha2


  • autofarm: don’t duplicate status line entries for crops with no current supply

  • build-now: don’t error on constructions that do not have an item attached

  • gui/gm-editor: fix errors displayed while viewing help screen

  • orders: allow the orders library to be listed and imported properly (if you previously copied the orders library into your dfhack-config/orders directory to work around this bug, you can remove those files now)

  • tailor: now respects the setting of the “used dyed clothing” standing order toggle



  • corrected misalignment in historical_entity

  • identified two old and one new language name groups

  • partially identified squad-related structures in plotinfo and corrected position of civ_alert_idx (does not affect alignment)

DFHack 50.05-alpha1

New Scripts

  • allneeds: list all unmet needs sorted by how many dwarves suffer from them.

  • devel/tile-browser: page through available textures and see their texture ids

  • gui/autochop: configuration frontend and status monitor for the autochop plugin


  • make-legendary: “MilitaryUnarmed” option now functional

  • widgets.WrappedLabel: no longer resets scroll position when window is moved or resized

Misc Improvements

  • Scrollable widgets now react to mouse wheel events when the mouse is over the widget

  • the dfhack-config/scripts/ folder is now searched for scripts by default

  • autounsuspend: now saves its state with your fort

  • devel/inspect-screen: updated for new rendering semantics and can now also inspect map textures

  • emigration: now saves its state with your fort

  • exterminate: added drown method. magma and drown methods will now clean up liquids automatically.

  • gui/cp437-table: converted to a movable, mouse-enabled window

  • gui/gm-editor: converted to a movable, resizable, mouse-enabled window

  • gui/gm-unit: converted to a movable, resizable, mouse-enabled window

  • gui/launcher:
    • now supports a smaller, minimal mode. click the toggle in the launcher UI or start in minimal mode via the Ctrl-Shift-P keybinding

    • can now be dragged from anywhere on the window body

    • now remembers its size and position between invocations

  • gui/quickcmd:
    • converted to a movable, resizable, mouse-enabled window

    • commands are now stored globally so you don’t have to recreate commands for every fort

  • hotkeys: overlay hotspot widget now shows the DFHack logo in graphics mode and “DFHack” in text mode

  • prioritize: now saves its state with your fort

  • Script paths: removed “raw” directories from default script paths. now the default locations to search for scripts are dfhack-config/scripts, save/*/scripts, and hack/scripts

  • unsuspend:
    • overlay now displays different letters for different suspend states so they can be differentiated in graphics mode (P=planning, x=suspended, X=repeatedly suspended)

    • overlay now shows a marker all the time when in graphics mode. ascii mode still only shows when paused so that you can see what’s underneath.

  • init.d: directories have moved from the raw subfolder (which no longer exists) to the root of the main DF folder or a savegame folder


  • Ruby is no longer a supported DFHack scripting language

  • fix-job-postings from the workflow plugin is now obsolete since affected savegames can no longer be loaded


  • Gui::getDFViewscreen: returns the topmost underlying DF viewscreen

  • Gui::getDwarfmodeDims: now only returns map viewport dimensions; menu dimensions are obsolete

  • Screen::Pen: now accepts keep_lower and write_to_lower properties to support foreground and background textures in graphics mode


  • Removed os.execute() and io.popen() built-in functions

  • overlay: OverlayWidget now inherits from Panel instead of Widget to get all the frame and mouse integration goodies

  • dfhack.gui.getDFViewscreen(): returns the topmost underlying DF viewscreen

  • gui.CLEAR_PEN: now clears the background and foreground and writes to the background (before it would always write to the foreground)

  • gui.KEEP_LOWER_PEN: a general use pen that writes associated tiles to the foreground while keeping the existing background

  • gui.View:
    • visible and active can now be functions that return a boolean

    • new function view:getMouseFramePos() for detecting whether the mouse is within (or over) the exterior frame of a view

  • gui.ZScreen: Screen subclass that implements window raising, multi-viewscreen input handling, and viewscreen event pass-through so the underlying map can be interacted with and dragged around while DFHack screens are visible

  • widgets.CycleHotkeyLabel:
    • now supports rendering option labels in the color of your choice

    • new functions setOption() and getOptionPen()

  • widgets.Label: tiles can now have an associated width

  • widgets.Panel: new attributes to control window dragging and resizing with mouse or keyboard

  • widgets.ToggleHotkeyLabel: now renders the On option in green text

  • widgets.Window: Panel subclass with attributes preset for top-level windows


  • Renamed globals to match DF:
    • ui: renamed to plotinfo

    • ui_advmode: renamed to adventure

    • ui_build_selector: renamed to buildreq

    • ui_sidebar_menus: renamed to game

  • building_civzonest: identify two variables, dir_x and dir_y, that handle archery range direction.


  • added DFHack architecture diagrams to the dev intro

  • added DFHack Quickstart guide

  • devel/hello-world: updated to be a better example from which to start new gui scripts

  • DFHack overlay dev guide: added troubleshooting tips and common development workflows

DFHack 0.47.05-r8

New Plugins

  • channel-safely: auto-manage channel designations to keep dwarves safe

  • overlay: plugin is transformed from a single line of text that runs gui/launcher on click to a fully-featured overlay injection framework. It now houses a popup menu for keybindings relevant to the current DF screen, all the widgets previously provided by dwarfmonitor (e.g. the current date and number of happy/unhappy dwarves), the overlay that highlights suspended buildings when you pause, and others. See DFHack overlay dev guide for details.

New Scripts

  • gui/overlay: configuration interface for the DFHack overlays and overlay widgets. includes a click-and-drag interface for repositioning widgets!


  • Core: ensure foo.init always runs before foo.*.init (e.g. dfhack.init should always run before dfhack.something.init)

  • autofarm: flush output so status text is visible immediately after running the command

  • autolabor, autohauler: properly handle jobs 241, 242, and 243

  • automaterial:
    • fix the cursor jumping up a z level when clicking quickly after box select

    • fix rendering errors with box boundary markers

  • buildingplan: fix crash when canceling out of placement mode for a building with planning mode enabled and subsequently attempting to place a building that does not have planning mode enabled and that has no pertinent materials available

  • dwarf-op: fixed error when matching dwarves by name

  • gui/create-item: prevent materials list filter from intercepting sublist hotkeys

  • gui/gm-unit: fixed behavior of + and - to adjust skill values instead of populating the search field

  • hotkeys: correctly detect hotkeys bound to number keys, F11, and F12

  • labormanager: associate quern construction with the correct labor

  • mousequery: fix the cursor jumping up z levels sometimes when using TWBT

  • tiletypes: no longer resets dig priority to the default when updating other properties of a tile

  • warn-stealers:
    • register callback with correct event name so that units entering the map are detected

    • announce thieving creatures that spawn already revealed

    • cache unit IDs instead of unit objects to avoid referencing stale pointers

  • workorder: fix interpretation of json-specified orders that set the item_type field

  • EventManager:
    • fix a segmentation fault with the REPORT event

    • fix the JOB_STARTED event only sending events to the first handler listed instead of all registered handlers

Misc Improvements

  • UX:
    • List widgets now have mouse-interactive scrollbars

    • You can now hold down the mouse button on a scrollbar to make it scroll multiple times.

    • You can now drag the scrollbar up and down to scroll to a specific spot

  • autolabor, autohauler: refactored to use DFHack’s messaging system for info/debug/trace messages

  • blueprint:
    • new --smooth option for recording all smoothed floors and walls instead of just the ones that require smoothing for later carving

    • record built constructions in blueprints

    • record stockpile/building/zone names in blueprints

    • record room sizes in blueprints

    • generate meta blueprints to reduce the number of blueprints you have to apply

    • support splitting the output file into phases grouped by when they can be applied

    • when splitting output files, number them so they sort into the order you should apply them in

  • dig: new -z option for digtype to restrict designations to the current z-level and down

  • dwarfmonitor: widgets have been ported to the overlay framework and can be enabled and configured via the gui/overlay UI

  • gui/blueprint: support new blueprint phases and options

  • gui/cp437-table: new global keybinding for the clickable on-screen keyboard for players with keyboard layouts that prevent them from using certain keys: Ctrl-Shift-K

  • gui/create-item: restrict materials to those normally allowed by the game by default, introduce new --unrestricted option for full freedom in choosing materials

  • gui/launcher: show help for commands that start with ‘:’ (like :lua)

  • gui/quantum: add option to allow corpses and refuse in your quantum stockpile

  • hotkeys:
    • hotkey screen has been transformed into an interactive overlay widget that you can bring up by moving the mouse cursor over the hotspot (in the upper left corner of the screen by default). Enable/disable/reposition the hotspot in the gui/overlay UI. Even if the hotspot is disabled, the menu can be brought up at any time with the Ctrl-Shift-C hotkey.

    • now supports printing active hotkeys to the console with hotkeys list

  • ls:
    • indent tag listings and wrap them in the rightmost column for better readability

    • new --exclude option for hiding matched scripts from the output. this can be especially useful for modders who don’t want their mod scripts to be included in ls output.

  • modtools/create-unit: better unit naming, more argument checks, assign nemesis save data for units without civilization so they can be properly saved when offloaded

  • orders: replace shell craft orders in the standard orders list you get with orders import library/basic with orders for shell leggings. They have a slightly higher trade price. Also, “shleggings” is just hilarious.

  • Quickfort blueprint library: improved layout of marksdwarf barracks in the example Dreamfort blueprints

  • spectate:
    • new auto-unpause option for auto-dismissal of announcement pause events (e.g. sieges).

    • new auto-disengage option for auto-disengagement of plugin through player interaction whilst unpaused.

    • new tick-threshold option for specifying the maximum time to follow the same dwarf

    • new animals option for sometimes following animals

    • new hostiles option for sometimes following hostiles

    • new visiting option for sometimes following visiting merchants, diplomats or plain visitors

    • added persistent configuration of the plugin settings

  • unsuspend: new overlay for displaying status of suspended buildings (functionality migrated from removed resume plugin)


  • gui/create-item: removed --restricted option. it is now the default behavior

  • resume: functionality (including suspended building overlay) has moved to unsuspend


  • Constructions module: added insert() to insert constructions into the game’s sorted list.

  • MiscUtils: added the following string transformation functions (refactored from uicommon.h): int_to_string, ltrim, rtrim, and trim; added string_to_int

  • Units module:
    • added new predicates for:

    • isUnitInBox()

    • isAnimal()

    • isVisiting() any visiting unit (diplomat, merchant, visitor)

    • isVisitor() ie. not merchants or diplomats

    • isInvader()

    • isDemon() returns true for unique/regular demons

    • isTitan()

    • isMegabeast()

    • isGreatDanger() returns true if unit is a demon, titan, or megabeast

    • isSemiMegabeast()

    • isNightCreature()

    • isDanger() returns true if is a ‘GreatDanger’, semi-megabeast, night creature, undead, or invader

    • modified predicates:

    • isUndead() now optionally ignores vampires instead of always ignoring vampires

    • isCitizen() now optionally ignores insane citizens instead of always ignoring insane citizens

    • new action timer API for speeding up of slowing down units

  • Gui::anywhere_hotkey: for plugin commands bound to keybindings that can be invoked on any screen

  • Gui::autoDFAnnouncement, Gui::pauseRecenter: added functionality reverse-engineered from announcement code

  • Gui::revealInDwarfmodeMap: Now enforce valid view bounds when pos invalid, add variant accepting x, y, z

  • Lua::Push(): now handles maps with otherwise supported keys and values

  • Lua::PushInterfaceKeys(): transforms viewscreen feed() keys into something that can be interpreted by lua-based widgets


  • Constructions module: findAtTile now uses a binary search intead of a linear search

  • MSVC warning level upped to /W3, and /WX added to make warnings cause compilations to fail.


  • Lua mouse events now conform to documented behavior in DFHack Lua API Reference_MOUSE_L_DOWN will be sent exactly once per mouse click and _MOUSE_L will be sent repeatedly as long as the button is held down. Similarly for right mouse button events.

  • dfhack.constructions.findAtTile(): exposed preexisting function to Lua.

  • dfhack.constructions.insert(): exposed new function to Lua.

  • now returns self as a convenience

  • gui.View.getMousePos() now takes an optional ViewRect parameter in case the caller wants to get the mouse pos relative to a rect that is not the frame_body (such as the frame_rect that includes the frame itself)

  • widgets.EditField: now allows other widgets to process characters that the on_char callback rejects.

  • widgets.FilteredList: now provides a useful default search key for list items made up of text tokens instead of plain text

  • widgets.HotkeyLabel: now ignores mouse clicks when on_activate is not defined

  • widgets.List:
    • new getIdxUnderMouse() function for detecting the list index under the active mouse cursor. this allows for “selection follows mouse” behavior

    • shift-clicking now triggers the submit2 attribute function if it is defined

  • widgets.Panel: new frame_style and frame_title attributes for drawing frames around groups of widgets

  • widgets.ResizingPanel: now accounts for frame inset when calculating frame size

  • widgets.Scrollbar: new scrollbar widget that can be paired with an associated scrollable widget. Integrated with widgets.Label and widgets.List.


  • general_refst: type virtual union member for ITEM_GENERAL

  • historical_figure_info.T_reputation.unk_2c: identify year + year_ticks

  • itemst: identify two vmethods related to adding thread improvements to items made of cloth, and label several previously unknown return types

  • proj_magicst: correct structure fields (to match 40d)

  • unit_action_type_group: added enum and tagged unit_action_type entries with its groups for DFHack’s new action timer API.

  • world: identify type of a vector (still not known what it’s for, but it’s definitely an item vector)


  • DFHack overlay dev guide: documentation and guide for injecting functionality into DF viewscreens from Lua scripts and creating interactive overlay widgets

  • dfhack.gui.revealInDwarfmodeMap: document center bool for Lua API

DFHack 0.47.05-r7

New Plugins

  • autobutcher: split off from zone into its own plugin. Note that to enable, the command has changed from autobutcher start to enable autobutcher.

  • autonestbox: split off from zone into its own plugin. Note that to enable, the command has changed from autonestbox start to enable autonestbox.

  • overlay: display a “DFHack” button in the lower left corner that you can click to start the new GUI command launcher. The dwarfmonitor weather display had to be moved to make room for the button. If you are seeing the weather indicator rendered over the overlay button, please remove the dfhack-config/dwarfmonitor.json file to fix the weather indicator display offset.

New Scripts

  • gui/kitchen-info: adds more info to the Kitchen screen

  • gui/launcher: in-game command launcher with autocomplete, history, and context-sensitive help

  • gui/workorder-details: adjusts work orders’ input item, material, traits

  • max-wave: dynamically limit the next immigration wave, can be set to repeat

  • pop-control: persistent per fortress population cap, hermit, and max-wave management

  • warn-stealers: warn when creatures that may steal your food, drinks, or items become visible

New Internal Commands

  • tags: new built-in command to list the tool category tags and their definitions. tags associated with each tool are visible in the tool help and in the output of ls.


  • autochop: designate largest trees for chopping first, instead of the smallest

  • devel/query: fixed error when –tile is specified

  • dig-now: Fix direction of smoothed walls when adjacent to a door or floodgate

  • dwarf-op: fixed error when applying the Miner job to dwarves

  • emigration: fix emigrant logic so unhappy dwarves leave as designed

  • gui/gm-unit: allow + and - to adjust skill values as intended instead of letting the filter intercept the characters

  • gui/unit-info-viewer: fix logic for displaying undead creature names

  • gui/workflow: restore functionality to the add/remove/order hotkeys on the workflow status screen

  • modtools/moddable-gods: fixed an error when assigning spheres

  • quickfort: Dreamfort blueprint set: declare the hospital zone before building the coffer; otherwise DF fails to stock the hospital with materials

  • view-item-info: fixed a couple errors when viewing items without materials

  • dfhack.buildings.findCivzonesAt: no longer return duplicate civzones after loading a save with existing civzones

  • dfhack.run_script: ensure the arguments passed to scripts are always strings. This allows other scripts to call run_script with numeric args and it won’t break parameter parsing.

  • job.removeJob(): ensure jobs are removed from the world list when they are canceled

Misc Improvements

  • History files: dfhack.history, tiletypes.history, lua.history, and liquids.history have moved to the dfhack-config directory. If you’d like to keep the contents of your current history files, please move them to dfhack-config.

  • Init scripts: dfhack.init and other init scripts have moved to dfhack-config/init/. If you have customized your dfhack.init file and want to keep your changes, please move the part that you have customized to the new location at dfhack-config/init/dfhack.init. If you do not have changes that you want to keep, do not copy anything, and the new defaults will be used automatically.

  • UX:
    • You can now move the cursor around in DFHack text fields in gui/ scripts (e.g. gui/blueprint, gui/quickfort, or gui/gm-editor). You can move the cursor by clicking where you want it to go with the mouse or using the Left/Right arrow keys. Ctrl+Left/Right will move one word at a time, and Alt+Left/Right will move to the beginning/end of the text.

    • You can now click on the hotkey hint text in many gui/ script windows to activate the hotkey, like a button. Not all scripts have been updated to use the clickable widget yet, but you can try it in gui/blueprint or gui/quickfort.

    • Label widget scroll icons are replaced with scrollbars that represent the percentage of text on the screen and move with the position of the visible text, just like web browser scrollbars.

  • devel/query:
    • inform the user when a query has been truncated due to --maxlength being hit.

    • increased default maxlength value from 257 to 2048

  • do-job-now: new global keybinding for boosting the priority of the jobs associated with the selected building/work order/unit/item etc.: Alt-N

  • dwarf-op: replaces [ a b c ] option lists with a,b,c option lists

  • gui/gm-unit: don’t clear the list filter when you adjust a skill value

  • gui/quickfort:
    • better formatting for the generated manager orders report

    • you can now click on the map to move the blueprint anchor point to that tile instead of having to use the cursor movement keys

    • display an error message when the blueprints directory cannot be found

  • gui/workorder-details: new keybinding on the workorder details screen: D

  • keybinding: support backquote (`) as a hotkey (and assign the hotkey to the new gui/launcher interface)

  • ls: can now filter tools by substring or tag. note that dev scripts are hidden by default. pass the --dev option to show them.

  • manipulator:
    • add a library of useful default professions

    • move professions configuration from professions/ to dfhack-config/professions/ to keep it together with other dfhack configuration. If you have saved professions that you would like to keep, please manually move them to the new folder.

  • orders: added useful library of manager orders. see them with orders list and import them with, for example, orders import library/basic

  • prioritize: new defaults keyword to prioritize the list of jobs that the community agrees should generally be prioritized. Run prioritize -a defaults to try it out in your fort!

  • prospector: add new --show option to give the player control over which report sections are shown. e.g. prospect all --show ores will just show information on ores.

  • quickfort:
    • Dreamfort blueprint set improvements: set traffic designations to encourage dwarves to eat cooked food instead of raw ingredients

    • library blueprints are now included by default in quickfort list output. Use the new --useronly (or just -u) option to filter out library bluerpints.

    • better error message when the blueprints directory cannot be found

  • seedwatch: seedwatch all now adds all plants with seeds to the watchlist, not just the “basic” crops.

  • materials.ItemTraitsDialog: added a default on_select-handler which toggles the traits.



  • Removed “egg” (“eggy”) hook support (Linux only). The only remaining method of hooking into DF is by interposing SDL calls, which has been the method used by all binary releases of DFHack.

  • Removed Engravings module (C++-only). Access world.engravings directly instead.

  • Removed Notes module (C++-only). Access ui.waypoints.points directly instead.

  • Removed Windows module (C++-only) - unused.

  • Constructions module (C++-only): removed t_construction, isValid(), getCount(), getConstruction(), and copyConstruction(). Access world.constructions directly instead.

  • Gui::getSelectedItem(), Gui::getAnyItem(): added support for the artifacts screen

  • Units::teleport(): now sets unit.idle_area to discourage units from walking back to their original location (or teleporting back, if using fastdwarf)


  • Added dfhack.screen.hideGuard(): exposes the C++ Screen::Hide to Lua

  • History: added dfhack.getCommandHistory(history_id, history_filename) and dfhack.addCommandToHistory(history_id, history_filename, command) so gui scripts can access a commandline history without requiring a terminal.

  • helpdb: database and query interface for DFHack tool help text

  • tile-material: fix the order of declarations. The GetTileMat function now returns the material as intended (always returned nil before). Also changed the license info, with permission of the original author.

  • utils.df_expr_to_ref(): fixed some errors that could occur when navigating tables

  • widgets.CycleHotkeyLabel: clicking on the widget will now cycle the options and trigger on_change(). This also applies to the ToggleHotkeyLabel subclass.

  • widgets.EditField:
    • new onsubmit2 callback attribute is called when the user hits Shift-Enter.

    • new function: setCursor(position) sets the input cursor.

    • new attribute: ignore_keys lets you ignore specified characters if you want to use them as hotkeys

  • widgets.FilteredList: new attribute: edit_ignore_keys gets passed to the filter EditField as ignore_keys

  • widgets.HotkeyLabel: clicking on the widget will now call on_activate().

  • widgets.Label: scroll function now interprets the keywords +page, -page, +halfpage, and -halfpage in addition to simple positive and negative numbers.


  • Eliminate all “anon_X” names from structure fields

  • army: change squads vector type to world_site_inhabitant, identify min_smell_trigger``+``max_odor_level``+``max_low_light_vision``+``sense_creature_classes

  • cave_column_rectangle: identify coordinates

  • cave_column: identify Z coordinates

  • embark_profile: identify reclaim fields, add missing pet_count vector

  • entity_population: identify layer_id

  • feature: identify “shiftCoords” vmethod, irritation_level and irritation_attacks fields

  • flow_guide: identify “shiftCoords” vmethod

  • general_refst: name parameters on getLocation and setLocation vmethods

  • general_ref_locationst: name member fields

  • historical_entity: confirm hostility_level and siege_tier

  • item: identify method notifyCreatedMasterwork that is called when a masterwork is created.

  • language_name_type: identify ElfTree and SymbolArtifice thru SymbolFood

  • misc_trait_type: update auto-decrement markers, remove obsolete references

  • timed_event: identify layer_id

  • ui_advmode: identify several fields as containing coordinates

  • ui_build_selector: identify cur_walk_tag and min_weight_races``+``max_weight_races

  • ui: identify actual contents of unk5b88 field, identify infiltrator references

  • unitst: identify histeventcol_id field inside status2

  • viewscreen_barterst: name member fields

  • viewscreen_tradegoodsst: rename trade_reply OffendedAnimal``+``OffendedAnimalAlt to OffendedBoth``+``OffendedAnimal

  • world_site_inhabitant: rename outcast_id and founder_outcast_entity_id, identify interaction_id and interaction_effect_idx


  • Added DFHack modding guide

  • Group DFHack tools by tag so similar tools are grouped and easy to find

  • Update all DFHack tool documentation (300+ pages) with standard syntax formatting, usage examples, and overall clarified text.

DFHack 0.47.05-r6

New Scripts


  • build-now: walls built above other walls can now be deconstructed like regularly-built walls

  • eventful:
    • fix eventful.registerReaction to correctly pass call_native argument thus allowing canceling vanilla item creation. Updated related documentation.

    • renamed NEW_UNIT_ACTIVE event to UNIT_NEW_ACTIVE to match the EventManager event name

    • fixed UNIT_NEW_ACTIVE event firing too often

  • gui/dfstatus: no longer count items owned by traders

  • gui/unit-info-viewer: fix calculation/labeling of unit size

  • job.removeJob(): fixes regression in DFHack 0.47.05-r5 where items/buildings associated with the job were not getting disassociated when the job is removed. Now build-now can build buildings and gui/mass-remove can cancel building deconstruction again

  • widgets.CycleHotkeyLabel: allow initial option values to be specified as an index instead of an option value

Misc Improvements

  • build-now: buildings that were just designated with buildingplan are now built immediately (as long as there are items available to build the buildings with) instead of being skipped until buildingplan gets around to doing its regular scan

  • caravan: new unload command, fixes endless unloading at the depot by reconnecting merchant pack animals that were disconnected from their owners

  • confirm:
    • added a confirmation dialog for removing manager orders

    • allow players to pause the confirmation dialog until they exit the current screen

  • deteriorate: new now command immediately deteriorates items of the specified types

  • The “Autostart” subtab:
    • refine food preparation orders so meal types are chosen intelligently according to the amount of meals that exist and the number of aviailable items to cook with

    • reduce required stock of dye for “Dye cloth” orders

    • fix material conditions for making jugs and pots

    • make wooden jugs by default to differentiate them from other stone tools. this allows players to more easily select jugs out with a properly-configured stockpile (i.e. the new woodentools alias)

  • list-agreements: now displays translated guild names, worshipped deities, petition age, and race-appropriate professions (e.g. “Craftsdwarf” instead of “Craftsman”)

  • Quickfort blueprint creation guide:
    • new aliases: forbidsearch, permitsearch, and togglesearch use the search plugin to alter the settings for a filtered list of item types when configuring stockpiles

    • new aliases: stonetools and woodentools. the jugs alias is deprecated. please use stonetools instead, which is the same as the old jugs alias.

    • new aliases: usablehair, permitusablehair, and forbidusablehair alter settings for the types of hair/wool that can be made into cloth: sheep, llama, alpaca, and troll. The craftrefuse aliases have been altered to use this alias as well.

    • new aliases: forbidthread, permitthread, forbidadamantinethread, permitadamantinethread, forbidcloth, permitcloth, forbidadamantinecloth, and permitadamantinecloth give you more control how adamantine-derived items are stored

  • quickfort:
    • Dreamfort blueprint set improvements: automatically create tavern, library, and temple locations (restricted to residents only by default), automatically associate the rented rooms with the tavern

    • Dreamfort blueprint set improvements: new design for the services level, including were-bitten hospital recovery rooms and an appropriately-themed interrogation room next to the jail! Also fits better in a 1x1 embark for minimalist players.

  • workorder: a manager is no longer required for orders to be created (matching bevavior in the game itself)



  • word_wrap: argument bool collapse_whitespace converted to enum word_wrap_whitespace_mode mode, with valid modes WSMODE_KEEP_ALL, WSMODE_COLLAPSE_ALL, and WSMODE_TRIM_LEADING.


  • gui.View: all View subclasses (including all Widgets) can now acquire keyboard focus with the new View:setFocus() function. See docs for details.

  • materials.ItemTraitsDialog: new dialog to edit item traits (where “item” is part of a job or work order or similar). The list of traits is the same as in vanilla work order conditions “t change traits”.

  • widgets.EditField:
    • the key_sep string is now configurable

    • can now display an optional string label in addition to the activation key

    • views that have an EditField subview no longer need to manually manage the EditField activation state and input routing. This is now handled automatically by the new gui.View keyboard focus subsystem.

  • widgets.HotkeyLabel: the key_sep string is now configurable


  • art_image_elementst: identify vmethod markDiscovered and second parameter for getName2

  • art_image_propertyst: identify parameters for getName

  • building_handler: fix vmethod get_machine_hookup_list parameters

  • vermin: identify category field as new enum

  • world.unk_26a9a8: rename to allow_announcements

DFHack 0.47.05-r5

New Plugins

  • spectate: “spectator mode” – automatically follows dwarves doing things in your fort

New Scripts

New Tweaks

  • tweak: partial-items displays percentage remaining for partially-consumed items such as hospital cloth


  • autofarm: removed restriction on only planting “discovered” plants

  • cxxrandom: fixed exception when calling bool_distribution

  • devel/query:
    • fixed a problem printing parents when the starting path had lua pattern special characters in it

    • fixed a crash when trying to iterate over linked lists

  • gui/advfort: encrust and stud jobs no longer consume reagents without actually improving the target item

  • luasocket: return correct status code when closing socket connections so clients can know when to retry

  • quickfort: contructions and bridges are now properly placed over natural ramps

  • setfps: keep internal ratio of processing FPS to graphics FPS in sync when updating FPS

Misc Improvements

  • autochop:
    • only designate the amount of trees required to reach max_logs

    • preferably designate larger trees over smaller ones

  • autonick:
    • now displays help instead of modifying dwarf nicknames when run without parameters. use autonick all to rename all dwarves.

    • added --quiet and --help options

  • blueprint:
    • track phase renamed to carve

    • carved fortifications and (optionally) engravings are now captured in generated blueprints

  • cursecheck: new option, --ids prints creature and race IDs of the cursed creature

  • debug:
    • DFHack log messages now have configurable headers (e.g. timestamp, origin plugin name, etc.) via the debugfilter command of the debug plugin

    • script execution log messages (e.g. “Loading script: dfhack_extras.init” can now be controlled with the debugfilter command. To hide the messages, add this line to your dfhack.init file: debugfilter set Warning core script

  • The “Autostart” subtab:
    • add mugs to basic manager orders

    • onMapLoad_dreamfort.init remove “cheaty” commands and new tweaks that are now in the default dfhack.init-example file

  • dig-now: handle fortification carving

  • Events from EventManager:
    • add new event type JOB_STARTED, triggered when a job first gains a worker

    • add new event type UNIT_NEW_ACTIVE, triggered when a new unit appears on the active list

  • gui/blueprint: support new blueprint options and phases

  • gui/create-item: Added “(chain)” annotation text for armours with the [CHAIN_METAL_TEXT] flag set

  • manipulator: tweak colors to make the cursor easier to locate

  • quickfort:
    • support transformations for blueprints that use expansion syntax

    • adjust direction affinity when transforming buildings (e.g. bridges that open to the north now open to the south when rotated 180 degrees)

    • automatically adjust cursor movements on the map screen in #query and #config modes when the blueprint is transformed. e.g. {Up} will be played back as {Right} when the blueprint is rotated clockwise and the direction key would move the map cursor

    • new blueprint mode: #config; for playing back key sequences that don’t involve the map cursor (like configuring hotkeys, changing standing orders, or modifying military uniforms)

    • API function apply_blueprint can now take data parameters that are simple strings instead of coordinate maps. This allows easier application of blueprints that are just one cell.

  • stocks: allow search terms to match the full item label, even when the label is truncated for length

  • tweak: stable-cursor now keeps the cursor stable even when the viewport moves a small amount

  • dfhack.init-example: recently-added tweaks added to example dfhack.init file


  • add functions reverse-engineered from ambushing unit code: Units::isHidden(), Units::isFortControlled(), Units::getOuterContainerRef(), Items::getOuterContainerRef()

  • Job::removeJob(): use the job cancel vmethod graciously provided by The Toady One in place of a synthetic method derived from reverse engineering


  • custom-raw-tokens: library for accessing tokens added to raws by mods

  • dfhack.units: Lua wrappers for functions reverse-engineered from ambushing unit code: isHidden(unit), isFortControlled(unit), getOuterContainerRef(unit), getOuterContainerRef(item)

  • dialogs: show* functions now return a reference to the created dialog

  • dwarfmode.enterSidebarMode(): passing df.ui_sidebar_mode.DesignateMine now always results in you entering DesignateMine mode and not DesignateChopTrees, even when you looking at the surface (where the default designation mode is DesignateChopTrees)

  • dwarfmode.MenuOverlay:
    • if sidebar_mode attribute is set, automatically manage entering a specific sidebar mode on show and restoring the previous sidebar mode on dismiss

    • new class function renderMapOverlay to assist with painting tiles over the visible map

  • ensure_key: new global function for retrieving or dynamically creating Lua table mappings

  • safe_index: now properly handles lua sparse tables that are indexed by numbers

  • string: new function escape_pattern() escapes regex special characters within a string

  • widgets:
    • unset values in frame_inset table default to 0

    • FilteredList class now allows all punctuation to be typed into the filter and can match search keys that start with punctuation

    • minimum height of ListBox dialog is now calculated correctly when there are no items in the list (e.g. when a filter doesn’t match anything)

    • if autoarrange_subviews is set, Panels will now automatically lay out widgets vertically according to their current height. This allows you to have widgets dynamically change height or become visible/hidden and you don’t have to worry about recalculating frame layouts

    • new class ResizingPanel (subclass of Panel) automatically recalculates its own frame height based on the size, position, and visibility of its subviews

    • new class HotkeyLabel (subclass of Label) that displays and reacts to hotkeys

    • new class CycleHotkeyLabel (subclass of Label) allows users to cycle through a list of options by pressing a hotkey

    • new class ToggleHotkeyLabel (subclass of CycleHotkeyLabel) toggles between On and Off states

    • new class WrappedLabel (subclass of Label) provides autowrapping of text

    • new class TooltipLabel (subclass of WrappedLabel) provides tooltip-like behavior


  • adventure_optionst: add missing getUnitContainer vmethod

  • historical_figure.T_skills: add account_balance field

  • job: add improvement field (union with hist_figure_id and race)

  • report_init.flags: rename sparring flag to hostile_combat

  • viewscreen_loadgamest: add missing LoadingImageSets and LoadingDivinationSets enum values to cur_step field


  • add more examples to the plugin example skeleton files so they are more informative for a newbie

  • update download link and installation instructions for Visual C++ 2015 build tools on Windows

  • update information regarding obtaining a compatible Windows build environment

  • confirm: correct the command name in the plugin help text

  • cxxrandom: added usage examples

  • String class extensions: document DFHack string extensions (startswith(), endswith(), split(), trim(), wrap(), and escape_pattern())

  • Quickfort blueprint creation guide: added screenshots to the Dreamfort case study and overall clarified text

  • Client libraries: add new Rust client library

  • Lua API.rst: added isHidden(unit), isFortControlled(unit), getOuterContainerRef(unit), getOuterContainerRef(item)

DFHack 0.47.05-r4


  • blueprint:
    • fixed passing incorrect parameters to gui/blueprint when you run blueprint gui with optional params

    • key sequences for constructed walls and down stairs are now correct

  • exportlegends: fix issue where birth year was outputted as birth seconds

  • quickfort:
    • produce a useful error message instead of a code error when a bad query blueprint key sequence leaves the game in a mode that does not have an active cursor

    • restore functionality to the --verbose commandline flag

    • don’t designate tiles for digging if they are within the bounds of a planned or constructed building

    • allow grates, bars, and hatches to be built on flat floor (like DF itself allows)

    • allow tracks to be built on hard, natural rock ramps

    • allow dig priority to be properly set for track designations

    • fix incorrect directions for tracks that extend south or east from a track segment pair specified with expansion syntax (e.g. T(4x4))

    • fix parsing of multi-part extended zone configs (e.g. when you set custom supply limits for hospital zones AND set custom flags for a pond)

    • fix error when attempting to set a custom limit for plaster powder in a hospital zone

  • tailor: fixed some inconsistencies (and possible crashes) when parsing certain subcommands, e.g. tailor help

  • tiletypes, tiletypes: fix crash when running from an unsuspended core context

Misc Improvements

  • Core: DFHack now prints the name of the init script it is running to the console and stderr

  • automaterial: ensure construction tiles are laid down in order when using buildingplan to plan the constructions

  • blueprint:
    • all blueprint phases are now written to a single file, using quickfort multi-blueprint file syntax. to get the old behavior of each phase in its own file, pass the --splitby=phase parameter to blueprint

    • you can now specify the position where the cursor should be when the blueprint is played back with quickfort by passing the --playback-start parameter

    • generated blueprints now have labels so quickfort can address them by name

    • all building types are now supported

    • multi-type stockpiles are now supported

    • non-rectangular stockpiles and buildings are now supported

    • blueprints are no longer generated for phases that have nothing to do (unless those phases are explicitly enabled on the commandline or gui)

    • new “track” phase that discovers and records carved tracks

    • new “zone” phase that discovers and records activity zones, including custom configuration for ponds, gathering, and hospitals

  • dig-now: no longer leaves behind a designated tile when a tile was designated beneath a tile designated for channeling

  • gui/blueprint:
    • support the new --splitby and --format options for blueprint

    • hide help text when the screen is too short to display it

  • orders: added list subcommand to show existing exported orders

  • Quickfort blueprint library: added light aquifer tap and pump stack blueprints (with step-by-step usage guides) to the quickfort blueprint library

  • quickfort:
    • Dreamfort blueprint set improvements: added iron and flux stock level indicators on the industry level and a prisoner processing quantum stockpile in the surface barracks. also added help text for how to manage sieges and how to manage prisoners after a siege.

    • add quickfort.apply_blueprint() API function that can be called directly by other scripts

    • by default, don’t designate tiles for digging that have masterwork engravings on them. quality level to preserve is configurable with the new --preserve-engravings param

    • implement single-tile track aliases so engraved tracks can be specified tile-by-tile just like constructed tracks

    • allow blueprints to jump up or down multiple z-levels with a single command (e.g. #>5 goes down 5 levels)

    • blueprints can now be repeated up and down a specified number of z-levels via repeat markers in meta blueprints or the --repeat commandline option

    • blueprints can now be rotated, flipped, and shifted via transform and shift markers in meta blueprints or the corresponding commandline options

  • quickfort, The “Autostart” subtab: Dreamfort blueprint set improvements based on playtesting and feedback. includes updated profession definitions.



  • Buildings::findCivzonesAt(): lookups now complete in constant time instead of linearly scanning through all civzones in the game


  • argparse.processArgsGetopt(): you can now have long form parameters that are not an alias for a short form parameter. For example, you can now have a parameter like --longparam without needing to have an equivalent one-letter -l param.

  • dwarfmode.enterSidebarMode(): df.ui_sidebar_mode.DesignateMine is now a suported target sidebar mode


  • historical_figure_info.spheres: give spheres vector a usable name

  • unit.enemy: fix definition of enemy_status_slot and add combat_side_id

DFHack 0.47.05-r3

New Plugins

  • dig-now: instantly completes dig designations (including smoothing and carving tracks)

New Scripts

  • autonick: gives dwarves unique nicknames

  • build-now: instantly completes planned building constructions

  • do-job-now: makes a job involving current selection high priority

  • prioritize: automatically boosts the priority of current and/or future jobs of specified types, such as hauling food, tanning hides, or pulling levers

  • reveal-adv-map: exposes/hides all world map tiles in adventure mode


  • Core: alt keydown state is now cleared when DF loses and regains focus, ensuring the alt modifier state is not stuck on for systems that don’t send standard keyup events in response to alt-tab window manager events

  • Lua: memscan.field_offset(): fixed an issue causing devel/export-dt-ini to crash sometimes, especially on Windows

  • autofarm: autofarm will now count plant growths as well as plants toward its thresholds

  • autogems: no longer assigns gem cutting jobs to workshops with gem cutting prohibited in the workshop profile

  • devel/export-dt-ini: fixed incorrect vtable address on Windows

  • quickfort:
    • allow machines (e.g. screw pumps) to be built on ramps just like DF allows

    • fix error message when the requested label is not found in the blueprint file

Misc Improvements

  • assign-beliefs, assign-facets: now update needs of units that were changed

  • buildingplan: now displays which items are attached and which items are still missing for planned buildings

  • devel/query:
    • updated script to v3.2 (i.e. major rewrite for maintainability/readability)

    • merged options -query and -querykeys into -search

    • merged options -depth and -keydepth into -maxdepth

    • replaced option -safer with -excludetypes and -excludekinds

    • improved how tile data is dealt with identification, iteration, and searching

    • added option -findvalue

    • added option -showpaths to print full data paths instead of nested fields

    • added option -nopointers to disable printing values with memory addresses

    • added option -alignto to set the value column’s alignment

    • added options -oneline and alias -1 to avoid using two lines for fields with metadata

    • added support for matching multiple patterns

    • added support for selecting the highlighted job, plant, building, and map block data

    • added support for selecting a Lua script (e.g. Data tables)

    • added support for selecting a Json file (e.g. dwarf_profiles.json)

    • removed options -listall, -listfields, and -listkeys - these are now simply default behaviour

    • -table now accepts the same abbreviations (global names, unit, screen, etc.) as lua and gui/gm-editor

  • Data tables: integrated devel/query to show the table definitions when requested with -list

  • geld: fixed -help option

  • gui/gm-editor: made search case-insensitive

  • orders:
    • support importing and exporting reaction-specific item conditions, like “lye-containing” for soap production orders

    • new sort command. sorts orders according to their repeat frequency. this prevents daily orders from blocking other orders for simlar items from ever getting completed.

  • quickfort:
  • tailor: allow user to specify which materials to be used, and in what order

  • tiletypes, tiletypes: add --cursor and --quiet options to support non-interactive use cases

  • unretire-anyone: replaced the ‘undead’ descriptor with ‘reanimated’ to make it more mod-friendly

  • warn-starving: added an option to only check sane dwarves


  • The Items module moveTo* and remove functions now handle projectiles


  • Install tests in the scripts repo into hack/scripts/test/scripts when the CMake variable BUILD_TESTS is defined


  • new global function: safe_pairs(iterable[, iterator_fn]) will iterate over the iterable (a table or iterable userdata) with the iterator_fn (pairs if not otherwise specified) if iteration is possible. If iteration is not possible or would throw an error, for example if nil is passed as the iterable, the iteration is just silently skipped.


  • cursed_tomb: new struct type

  • job_item: identified several fields

  • ocean_wave_maker: new struct type

  • worldgen_parms: moved to new struct type


DFHack 0.47.05-r2

New Scripts

  • clear-webs: removes all webs on the map and/or frees any webbed creatures

  • devel/block-borders: overlay that displays map block borders

  • devel/luacov: generate code test coverage reports for script development. Define the DFHACK_ENABLE_LUACOV=1 environment variable to start gathering coverage metrics.

  • fix/drop-webs: causes floating webs to fall to the ground

  • gui/blueprint: interactive frontend for the blueprint plugin (with mouse support!)

  • gui/mass-remove: mass removal/suspension tool for buildings and constructions

  • reveal-hidden-sites: exposes all undiscovered sites

  • set-timeskip-duration: changes the duration of the “Updating World” process preceding the start of a new game, enabling you to jump in earlier or later than usual


  • Fixed an issue preventing some external scripts from creating zones and other abstract buildings (see note about room definitions under “Internals”)

  • Fixed an issue where scrollable text in Lua-based screens could prevent other widgets from scrolling

  • bodyswap:
    • stopped prior party members from tagging along after bodyswapping and reloading the map

    • made companions of bodyswapping targets get added to the adventurer party - they can now be viewed using the in-game party system

  • buildingplan:
    • fixed an issue where planned constructions designated with DF’s sizing keys (umkh) would sometimes be larger than requested

    • fixed an issue preventing other plugins like automaterial from planning constructions if the “enable all” buildingplan setting was turned on

    • made navigation keys work properly in the materials selection screen when alternate keybindings are used

  • color-schemes: fixed an error in the register subcommand when the DF path contains certain punctuation characters

  • command-prompt: fixed issues where overlays created by running certain commands (e.g. gui/liquids, gui/teleport) would not update the parent screen correctly

  • dwarfvet: fixed a crash that could occur with hospitals overlapping with other buildings in certain ways

  • embark-assistant: fixed faulty early exit in first search attempt when searching for waterfalls

  • gui/advfort: fixed an issue where starting a workshop job while not standing at the center of the workshop required advancing time manually

  • gui/unit-info-viewer: fixed size description displaying unrelated values instead of size

  • orders: fixed crash when importing orders with malformed IDs

  • quickfort:
    • comments in blueprint cells no longer prevent the rest of the row from being read. A cell with a single ‘#’ marker in it, though, will still stop the parser from reading further in the row.

    • fixed an off-by-one line number accounting in blueprints with implicit #dig modelines

    • changed to properly detect and report an error on sub-alias params with no values instead of just failing to apply the alias later (if you really want an empty value, use {Empty} instead)

    • improved handling of non-rectangular and non-solid extent-based structures (like fancy-shaped stockpiles and farm plots)

    • fixed conversion of numbers to DF keycodes in #query blueprints

    • fixed various errors with cropping across the map edge

    • properly reset config to default values in quickfort reset even if if the dfhack-config/quickfort/quickfort.txt config file doesn’t mention all config vars. Also now works even if the config file doesn’t exist.

  • stonesense: fixed a crash that could occur when ctrl+scrolling or closing the Stonesense window

  • quickfortress.csv blueprint: fixed refuse stockpile config and prevented stockpiles from covering stairways

Misc Improvements

  • Added adjectives to item selection dialogs, used in tools like gui/create-item - this makes it possible to differentiate between different types of high/low boots, shields, etc. (some of which are procedurally generated)

  • blueprint:
    • made depth and name parameters optional. depth now defaults to 1 (current level only) and name defaults to “blueprint”

    • depth can now be negative, which will result in the blueprints being written from the highest z-level to the lowest. Before, blueprints were always written from the lowest z-level to the highest.

    • added the --cursor option to set the starting coordinate for the generated blueprints. A game cursor is no longer necessary if this option is used.

  • devel/annc-monitor: added report enable|disable subcommand to filter combat reports

  • embark-assistant: slightly improved performance of surveying and improved code a little

  • gui/advfort: added workshop name to workshop UI

  • quickfort:
    • the Dreamfort blueprint set can now be comfortably built in a 1x1 embark

    • added the --cursor option for running a blueprint at specific coordinates instead of starting at the game cursor position

    • added more helpful error messages for invalid modeline markers

    • added support for extra space characters in blueprints

    • added a warning when an invalid alias is encountered instead of silently ignoring it

    • made more quiet when the --quiet parameter is specified

  • setfps: improved error handling

  • stonesense: sped up startup time

  • tweak hide-priority: changed so that priorities stay hidden (or visible) when exiting and re-entering the designations menu

  • unretire-anyone: the historical figure selection list now includes the SYN_NAME (necromancer, vampire, etc) of figures where applicable


  • Added dfhack.maps.getPlantAtTile(x, y, z) and dfhack.maps.getPlantAtTile(pos), and updated dfhack.gui.getSelectedPlant() to use it

  • Added dfhack.units.teleport(unit, pos)


  • Room definitions and extents are now created for abstract buildings so callers don’t have to initialize the room structure themselves

  • The DFHack test harness is now much easier to use for iterative development. Configuration can now be specified on the commandline, there are more test filter options, and the test harness can now easily rerun tests that have been run before.

  • The test/main command to invoke the test harness has been renamed to just test

  • Unit tests can now use delay_until(predicate_fn, timeout_frames) to delay until a condition is met

  • Unit tests must now match any output expected to be printed via dfhack.printerr()

  • Unit tests now support fortress mode (allowing tests that require a fortress map to be loaded) - note that these tests are skipped by continuous integration for now, pending a suitable test fortress


  • new library: argparse is a collection of commandline argument processing functions

  • new string utility functions:
    • string:wrap(width) wraps a string at space-separated word boundaries

    • string:trim() removes whitespace characters from the beginning and end of the string

    • string:split(delimiter, plain) splits a string with the given delimiter and returns a table of substrings. if plain is specified and set to true, delimiter is interpreted as a literal string instead of as a pattern (the default)

  • new utility function: utils.normalizePath(): normalizes directory slashes across platoforms to / and coaleses adjacent directory separators

  • reveal: now exposes unhideFlood(pos) functionality to Lua

  • xlsxreader: added Lua class wrappers for the xlsxreader plugin API

  • argparse.processArgsGetopt() (previously utils.processArgsGetopt()):
    • now returns negative numbers (e.g. -10) in the list of positional parameters instead of treating it as an option string equivalent to -1 -0

    • now properly handles -- like GNU getopt as a marker to treat all further parameters as non-options

    • now detects when required arguments to long-form options are missing

  • gui.dwarfmode: new function: enterSidebarMode(sidebar_mode, max_esc) which uses keypresses to get into the specified sidebar mode from whatever the current screen is

  • gui.Painter: fixed error when calling viewport() method


  • Identified remaining rhythm beat enum values

  • ui_advmode.interactions: identified some fields related to party members

  • ui_advmode_menu: identified several enum items

  • ui_advmode:
    • identified several fields

    • renamed wait to rest_mode and changed to an enum with correct values

  • viewscreen_legendsst.cur_page: added missing Books enum item, which fixes some other values


DFHack 0.47.05-r1


  • confirm: stopped exposing alternate names when convicting units

  • prospector: improved pre embark rough estimates, particularly for small clusters

Misc Improvements

  • autohauler: allowed the Alchemist labor to be enabled in manipulator and other labor screens so it can be used for its intended purpose of flagging that no hauling labors should be assigned to a dwarf. Before, the only way to set the flag was to use an external program like Dwarf Therapist.

  • embark-assistant: slightly improved performance of surveying

  • gui/no-dfhack-init: clarified how to dismiss dialog that displays when no dfhack.init file is found

  • quickfort:
    • Dreamfort blueprint set improvements: significant refinements across the entire blueprint set. Dreamfort is now much faster, much more efficient, and much easier to use. The checklist now includes a mini-walkthrough for quick reference. The spreadsheet now also includes embark profile suggestions

    • added aliases for configuring masterwork and artifact core quality for all stockpile categories that have them; made it possible to take from multiple stockpiles in the quantumstop alias

    • an active cursor is no longer required for running #notes blueprints (like the dreamfort walkthrough)

    • you can now be in any mode with an active cursor when running #query blueprints (before you could only be in a few “approved” modes, like look, query, or place)

    • refined #query blueprint sanity checks: cursor should still be on target tile at end of configuration, and it’s ok for the screen ID to change if you are destroying (or canceling destruction of) a building

    • now reports how many work orders were added when generating manager orders from blueprints in the gui dialog

    • added --dry-run option to process blueprints but not change any game state

    • you can now specify the number of desired barrels, bins, and wheelbarrows for individual stockpiles when placing them

    • quickfort orders on a #place blueprint will now enqueue manager orders for barrels, bins, or wheelbarrows that are explicitly set in the blueprint.

    • you can now add alias definitions directly to your blueprint files instead of having to put them in a separate aliases.txt file. makes sharing blueprints with custom alias definitions much easier.


  • Identified scattered enum values (some rhythm beats, a couple of corruption unit thoughts, and a few language name categories)

  • viewscreen_loadgamest: renamed cur_step enumeration to match style of viewscreen_adopt_regionst and viewscreen_savegamest

  • viewscreen_savegamest: identified cur_step enumeration


DFHack 0.47.05-beta1


  • embark-assistant: fixed bug in soil depth determination for ocean tiles

  • orders: don’t crash when importing orders with malformed JSON

  • quickfort: raw numeric Dig priorities (e.g. 3, which is a valid shorthand for d3) now works when used in .xlsx blueprints

Misc Improvements

  • quickfort: new commandline options for setting the initial state of the gui dialog. for example: quickfort gui -l dreamfort notes will start the dialog filtered for the dreamfort walkthrough blueprints


  • Dropped support for 0.47.03-0.47.04

DFHack 0.47.04-r5

New Scripts


  • embark-assistant:
    • fixed order of factors when calculating min temperature

    • improved performance of surveying

  • quickfort:
    • fixed eventual crashes when creating zones

    • fixed library aliases for tallow and iron, copper, and steel weapons

    • zones are now created in the active state by default

    • solve rare crash when changing UI modes

  • search: fixed crash when searching the k sidebar and navigating to another tile with certain keys, like < or >

  • seedwatch: fixed an issue where the plugin would disable itself on map load

  • stockflow: fixed j character being intercepted when naming stockpiles

  • stockpiles: no longer outputs hotkey help text beneath stockflow hotkey help text

Misc Improvements

  • Lua label widgets (used in all standard message boxes) are now scrollable with Up/Down/PgUp/PgDn keys

  • autofarm: now fallows farms if all plants have reached the desired count

  • buildingplan:
    • added ability to set global settings from the console, e.g. buildingplan set boulders false

    • added “enable all” option for buildingplan (so you don’t have to enable all building types individually). This setting is not persisted (just like quickfort_mode is not persisted), but it can be set from onMapLoad.init

    • modified Planning Mode status in the UI to show whether the plugin is in quickfort mode, “enable all” mode, or whether just the building type is enabled.

  • quickfort:
    • Dreamfort blueprint set improvements: added a streamlined checklist for all required dreamfort commands and gave names to stockpiles, levers, bridges, and zones

    • added aliases for bronze weapons and armor

    • added alias for tradeable crafts

    • new blueprint mode: #ignore, useful for scratch space or personal notes

    • implement {Empty} keycode for use in quickfort aliases; useful for defining blank-by-default alias values

    • more flexible commandline parsing allowing for more natural parameter ordering (e.g. where you used to have to write quickfort list dreamfort -l you can now write quickfort list -l dreamfort)

    • print out blueprint names that a #meta blueprint is applying so it’s easier to understand what meta blueprints are doing

    • whitespace is now allowed between a marker name and the opening parenthesis in blueprint modelines. for example, #dig start (5; 5) is now valid (you used to be required to write #dig start(5; 5))


  • dfhack.run_command(): changed to interface directly with the console when possible, which allows interactive commands and commands that detect the console encoding to work properly

  • processArgsGetopt() added to utils.lua, providing a callback interface for parameter parsing and getopt-like flexibility for parameter ordering and combination (see docs in library/lua/utils.lua and library/lua/3rdparty/alt_getopt.lua for details).


  • job: identified order_id field


  • Added documentation for Lua’s dfhack.run_command() and variants

DFHack 0.47.04-r4

New Scripts

  • fix/corrupt-equipment: fixes some military equipment-related corruption issues that can cause DF crashes


  • Fixed an issue on some Linux systems where DFHack installed through a package manager would attempt to write files to a non-writable folder (notably when running exportlegends or gui/autogems)

  • adaptation: fixed handling of units with no cave adaptation suffered yet

  • assign-goals: fixed error preventing new goals from being created

  • assign-preferences: fixed handling of preferences for flour

  • buildingplan:
    • fixed an issue preventing artifacts from being matched when the maximum item quality is set to artifacts

    • stopped erroneously matching items to buildings while the game is paused

    • fixed a crash when pressing 0 while having a noble room selected

  • deathcause: fixed an error when inspecting certain corpses

  • dwarfmonitor: fixed a crash when opening the prefs screen if units have vague preferences

  • dwarfvet: fixed a crash that could occur when discharging patients

  • embark-assistant:
    • fixed an issue causing incursion resource matching (e.g. sand/clay) to skip some tiles if those resources were provided only through incursions

    • corrected river size determination by performing it at the MLT level rather than the world tile level

  • quickfort:
    • fixed handling of modifier keys (e.g. {Ctrl} or {Alt}) in query blueprints

    • fixed misconfiguration of nest boxes, hives, and slabs that were preventing them from being built from build blueprints

    • fixed valid placement detection for floor hatches, floor grates, and floor bars (they were erroneously being rejected from open spaces and staircase tops)

    • fixed query blueprint statistics being added to the wrong metric when both a query and a zone blueprint are run by the same meta blueprint

    • added missing blueprint labels in gui dialog list

    • fixed occupancy settings for extent-based structures so that stockpiles can be placed within other stockpiles (e.g. in a checkerboard or bullseye pattern)

  • search: fixed an issue where search options might not display if screens were destroyed and recreated programmatically (e.g. with quickfort)

  • unsuspend: now leaves buildingplan-managed buildings alone and doesn’t unsuspend underwater tasks

  • workflow: fixed an error when creating constraints on “mill plants” jobs and some other plant-related jobs

  • zone: fixed an issue causing the enumnick subcommand to run when attempting to run assign, unassign, or slaughter

Misc Improvements

  • buildingplan:
    • added support for all buildings, furniture, and constructions (except for instruments)

    • added support for respecting building job_item filters when matching items, so you can set your own programmatic filters for buildings before submitting them to buildingplan

    • changed default filter setting for max quality from artifact to masterwork

    • changed min quality adjustment hotkeys from ‘qw’ to ‘QW’ to avoid conflict with existing hotkeys for setting roller speed - also changed max quality adjustment hotkeys from ‘QW’ to ‘AS’ to make room for the min quality hotkey changes

    • added a new global settings page accessible via the G hotkey when on any building build screen; Quickfort Mode toggle for legacy Python Quickfort has been moved to this page

    • added new global settings for whether generic building materials should match blocks, boulders, logs, and/or bars - defaults are everything but bars

  • devel/export-dt-ini: updated for Dwarf Therapist 41.2.0

  • embark-assistant: split the lair types displayed on the local map into mound, burrow, and lair

  • gui/advfort: added support for linking to hatches and pressure plates with mechanisms

  • modtools/add-syndrome: added support for specifying syndrome IDs instead of names

  • probe: added more output for designations and tile occupancy

  • quickfort:
    • The Dreamfort sample blueprints now have complete walkthroughs for each fort level and importable orders that automate basic fort stock management

    • added more blueprints to the blueprints library: several bedroom layouts, the Saracen Crypts, and the complete fortress example from Python Quickfort: TheQuickFortress

    • query blueprint aliases can now accept parameters for dynamic expansion - see dfhack-config/quickfort/aliases.txt for details

    • alias names can now include dashes and underscores (in addition to letters and numbers)

    • improved speed of first call to quickfort list significantly, especially for large blueprint libraries

    • added query_unsafe setting to disable query blueprint error checking - useful for query blueprints that send unusual key sequences

    • added support for bookcases, display cases, and offering places (altars)

    • added configuration support for zone pit/pond, gather, and hospital sub-menus in zone blueprints

    • removed buildings_use_blocks setting and replaced it with more flexible functionality in buildingplan

    • added support for creating uninitialized stockpiles with c


  • buildingplan: added Lua interface API

  • Buildings::setSize(): changed to reuse existing extents when possible

  • dfhack.job.isSuitableMaterial(): added an item type parameter so the non_economic flag can be properly handled (it was being matched for all item types instead of just boulders)


  • utils.addressof(): fixed for raw userdata


  • building_extents_type: new enum, used for building_extents.extents

  • world_mountain_peak: new struct (was previously inline) - used in world_data.mountain_peaks


DFHack 0.47.04-r3

New Plugins

  • xlsxreader: provides an API for Lua scripts to read Excel spreadsheets

New Scripts


  • ban-cooking: fixed an error in several subcommands

  • buildingplan: fixed handling of buildings that require buckets

  • getplants: fixed a crash that could occur on some maps

  • search: fixed an issue causing item counts on the trade screen to display inconsistently when searching

  • stockpiles:
    • fixed a crash when loading food stockpiles

    • fixed an error when saving furniture stockpiles

Misc Improvements

  • createitem:
    • added support for plant growths (fruit, berries, leaves, etc.)

    • added an inspect subcommand to print the item and material tokens of existing items, which can be used to create additional matching items

  • embark-assistant: added support for searching for taller waterfalls (up to 50 z-levels tall)

  • search: added support for searching for names containing non-ASCII characters using their ASCII equivalents

  • stocks: added support for searching for items containing non-ASCII characters using their ASCII equivalents

  • unretire-anyone: made undead creature names appear in the historical figure list

  • zone:
    • added an enumnick subcommand to assign enumerated nicknames (e.g “Hen 1”, “Hen 2”…)

    • added slaughter indication to uinfo output


  • Added DFHack::to_search_normalized() (Lua: dfhack.toSearchNormalized()) to convert non-ASCII alphabetic characters to their ASCII equivalents


  • history_event_masterpiece_createdst: fixed alignment, including subclasses, and identified skill_at_time

  • item_body_component: fixed some alignment issues and identified some fields (also applies to subclasses like item_corpsest)

  • stockpile_settings: removed furniture.sand_bags (no longer present)


  • Fixed syntax highlighting of most code blocks to use the appropriate language (or no language) instead of Python

DFHack 0.47.04-r2

New Scripts

New Tweaks

  • tweak do-job-now: adds a job priority toggle to the jobs list

  • tweak reaction-gloves: adds an option to make reactions produce gloves in sets with correct handedness


  • Fixed a segfault when attempting to start a headless session with a graphical PRINT_MODE setting

  • Fixed an issue with the macOS launcher failing to un-quarantine some files

  • Fixed Units::isEggLayer, Units::isGrazer, Units::isMilkable, Units::isTrainableHunting, Units::isTrainableWar, and Units::isTamable ignoring the unit’s caste

  • Linux: fixed dfhack.getDFPath() (Lua) and Process::getPath() (C++) to always return the DF root path, even if the working directory has changed

  • digfort:
    • fixed y-line tracking when .csv files contain lines with only commas

    • fixed an issue causing blueprints touching the southern or eastern edges of the map to be rejected (northern and western edges were already allowed). This allows blueprints that span the entire embark area.

  • embark-assistant: fixed a couple of incursion handling bugs.

  • embark-skills: fixed an issue with structures causing the points option to do nothing

  • exportlegends:
    • fixed an issue where two different <reason> tags could be included in a <historical_event>

    • stopped including some tags with -1 values which don’t provide useful information

  • getplants: fixed issues causing plants to be collected even if they have no growths (or unripe growths)

  • gui/advfort: fixed “operate pump” job

  • gui/load-screen: fixed an issue causing longer timezones to be cut off

  • labormanager:
    • fixed handling of new jobs in 0.47

    • fixed an issue preventing custom furnaces from being built

  • modtools/moddable-gods:
    • fixed an error when creating the historical figure

    • removed unused -domain and -description arguments

    • made -depictedAs argument work

  • names:
    • fixed an error preventing the script from working

    • fixed an issue causing renamed units to display their old name in legends mode and some other places

  • pref-adjust: fixed some compatibility issues and a potential crash

  • RemoteFortressReader:
    • fixed a couple crashes that could result from decoding invalid enum items (site_realization_building_type and improvement_type)

    • fixed an issue that could cause block coordinates to be incorrect

  • rendermax: fixed a hang that could occur when enabling some renderers, notably on Linux

  • stonesense:
    • fixed a crash when launching Stonesense

    • fixed some issues that could cause the splash screen to hang

Misc Improvements

  • Linux/macOS: Added console keybindings for deleting words (Alt+Backspace and Alt+d in most terminals)

  • add-recipe:
    • added tool recipes (minecarts, wheelbarrows, stepladders, etc.)

    • added a command explanation or error message when entering an invalid command

  • armoks-blessing: added adjustments to values and needs

  • blueprint:
    • now writes blueprints to the blueprints/ subfolder instead of the df root folder

    • now automatically creates folder trees when organizing blueprints into subfolders (e.g. blueprint 30 30 1 rooms/dining dig will create the file blueprints/rooms/dining-dig.csv); previously it would fail if the blueprints/rooms/ directory didn’t already exist

  • confirm: added a confirmation dialog for convicting dwarves of crimes

  • devel/query: added many new query options

  • digfort:
    • handled double quotes (”) at the start of a string, allowing .csv files exported from spreadsheets to work without manual modification

    • documented that removing ramps, cutting trees, and gathering plants are indeed supported

    • added a force option to truncate blueprints if the full blueprint would extend off the edge of the map

  • dwarf-op:
    • added ability to select dwarves based on migration wave

    • added ability to protect dwarves based on symbols in their custom professions

  • exportlegends:
    • changed some flags to be represented by self-closing tags instead of true/false strings (e.g. <is_volcano/>) - note that this may require changes to other XML-parsing utilities

    • changed some enum values from numbers to their string representations

    • added ability to save all files to a subfolder, named after the region folder and date by default

  • gui/advfort: added support for specifying the entity used to determine available resources

  • gui/gm-editor: added support for automatically following ref-targets when pressing the i key

  • manipulator: added a new column option to display units’ goals

  • modtools/moddable-gods: added support for neuter gender

  • pref-adjust:
    • added support for adjusting just the selected dwarf

    • added a new goth profile

  • remove-stress: added a -value argument to enable setting stress level directly

  • workorder: changed default frequency from “Daily” to “OneTime”


  • Added Filesystem::mkdir_recursive

  • Extended Filesystem::listdir_recursive to optionally make returned filenames relative to the start directory

  • Units: added goal-related functions: getGoalType(), getGoalName(), isGoalAchieved()


  • Added support for splitting scripts into multiple files in the scripts/internal folder without polluting the output of ls


  • Added a ref_target field to primitive field references, corresponding to the ref-target XML attribute

  • Made dfhack.units.getRaceNameById(), dfhack.units.getRaceBabyNameById(), and dfhack.units.getRaceChildNameById() available to Lua


  • Updated item_find and building_find to use centralized logic that works on more screens


  • Added a new <df-other-vectors-type>, which allows world.*.other collections of vectors to use the correct subtypes for items

  • creature_raw: renamed gender to sex to match the field in unit, which is more frequently used

  • crime: identified witnesses, which contains the data held by the old field named reports

  • intrigue: new type (split out from historical_figure_relationships)

  • items_other_id: removed BAD, and by extension, world.items.other.BAD, which was overlapping with world.items.bad

  • job_type: added job types new to 0.47

  • plant_raw: material_defs now contains arrays rather than loose fields

  • pronoun_type: new enum (previously documented in field comments)

  • setup_character_info: fixed a couple alignment issues (needed by embark-skills)

  • ui_advmode_menu: identified some new enum items


  • Added some new dev-facing pages, including dedicated pages about the remote API, memory research, and documentation

  • Expanded the installation guide

  • Made a couple theme adjustments

DFHack 0.47.04-r1


  • Fixed a crash in find() for some types when no world is loaded

  • Fixed translation of certain types of in-game names

  • autogems: fixed an issue with binned gems being ignored in linked stockpiles

  • catsplosion: fixed error when handling races with only one caste (e.g. harpies)

  • exportlegends: fixed error when exporting maps

  • spawnunit: fixed an error when forwarding some arguments but not a location to modtools/create-unit

  • stocks: fixed display of book titles

  • tweak embark-profile-name: fixed handling of the native shift+space key

Misc Improvements

  • exportlegends:
    • made interaction export more robust and human-readable

    • removed empty <item_subtype> and <claims> tags

  • getplants: added switches for designations for farming seeds and for max number designated per plant

  • manipulator: added intrigue to displayed skills

  • modtools/create-unit:
    • added -equip option to equip created units

    • added -skills option to give skills to units

    • added -profession and -customProfession options to adjust unit professions

  • search: added support for the fortress mode justice screen

  • dfhack.init-example: enabled autodump


  • Added Items::getBookTitle to get titles of books. Catches titles buried in improvements, unlike getDescription.


  • pairs() now returns available class methods for DF types


  • Added globals: cur_rain, cur_rain_counter, cur_snow, cur_snow_counter, weathertimer, jobvalue, jobvalue_setter, interactitem, interactinvslot, handleannounce, preserveannounce, updatelightstate

  • agreement_details_data_plot_sabotage: new struct type, along with related agreement_details_type.PlotSabotage

  • architectural_element: new enum

  • battlefield: new struct type

  • breed: new struct type

  • creature_handler: identified vmethods

  • crime: removed fields of reports that are no longer present

  • dance_form: identified most fields

  • history_event_context: identified fields

  • identity_type: new enum

  • identity: renamed civ to entity_id, identified type

  • image_set: new struct type

  • interrogation_report: new struct type

  • itemdef_flags: new enum, with GENERATED flag

  • justification: new enum

  • lever_target_type: identified LeverMechanism and TargetMechanism values

  • musical_form: identified fields, including some renames. Also identified fields in scale and rhythm

  • region_weather: new struct type

  • squad_order_cause_trouble_for_entityst: identified fields

  • unit_thought_type: added several new thought types

  • viewscreen_workquota_detailsst: identified fields

DFHack 0.47.04-beta1

New Scripts


  • Fixed a crash when starting DFHack in headless mode with no terminal

  • devel/visualize-structure: fixed padding detection for globals

  • exportlegends:
    • added UTF-8 encoding and XML escaping for more fields

    • added checking for unhandled structures to avoid generating invalid XML

    • fixed missing fields in history_event_assume_identityst export

  • full-heal:
    • when resurrected by specifying a corpse, units now appear at the location of the corpse rather than their location of death

    • resurrected units now have their tile occupancy set (and are placed in the prone position to facilitate this)

Misc Improvements

  • Added “bit” suffix to downloads (e.g. 64-bit)

  • Tests:
    • moved from DF folder to hack/scripts folder, and disabled installation by default

    • made test runner script more flexible

  • devel/export-dt-ini: updated some field names for DT for 0.47

  • devel/visualize-structure: added human-readable lengths to containers

  • dfhack-run: added color output support

  • embark-assistant:
    • updated embark aquifer info to show all aquifer kinds present

    • added neighbor display, including kobolds (SKULKING) and necro tower count

    • updated aquifer search criteria to handle the new variation

    • added search criteria for embark initial tree cover

    • added search criteria for necro tower count, neighbor civ count, and specific neighbors. Should handle additional entities, but not tested

  • exportlegends:
    • added evilness and force IDs to regions

    • added profession and weapon info to relevant entities

    • added support for many new history events in 0.47

    • added historical event relationships and supplementary data

  • full-heal:
    • made resurrection produce a historical event viewable in Legends mode

    • made error messages more explanatory

  • install-info: added DFHack build ID to report

  • modtools/create-item: added -matchingGloves and -matchingShoes arguments

  • modtools/create-unit:
    • added -duration argument to make the unit vanish after some time

    • added -locationRange argument to allow spawning in a random position within a defined area

    • added -locationType argument to specify the type of location to spawn in

  • unretire-anyone: added -dead argument to revive and enable selection of a dead historical figure to use as an adventurer in adv mode


  • Added separate changelogs in the scripts and df-structures repos

  • Improved support for tagged unions, allowing tools to access union fields more safely

  • Moved reversing scripts to df_misc repo


  • Added an XML schema for validating df-structures syntax

  • Added divination_set_next_id and image_set_next_id globals

  • activity_entry_type: new enum type

  • adventure_optionst: identified many vmethods

  • agreement_details: identified most fields of most sub-structs

  • artifact_claim: identified several fields

  • artifact_record: identified several fields

  • caste_raw_flags: renamed and identified many flags to match information from Toady

  • creature_raw_flags: renamed and identified many flags to match information from Toady

  • crime_type: new enum type

  • dfhack_room_quality_level: added enum attributes for names of rooms of each quality

  • entity_site_link_type: new enum type

  • export_map_type: new enum type

  • historical_entity.flags: identified several flags

  • historical_entity.relations: renamed from unknown1b and identified several fields

  • historical_figure.vague_relationships: identified

  • historical_figure_info.known_info: renamed from secret, identified some fields

  • historical_figure: renamed unit_id2 to nemesis_id

  • history_event_circumstance_info: new struct type (and changed several history_event subclasses to use this)

  • history_event_reason_info: new struct type (and changed several history_event subclasses to use this)

  • honors_type: identified several fields

  • interaction_effect_create_itemst: new struct type

  • interaction_effect_summon_unitst: new struct type

  • item: identified several vmethods

  • layer_type: new enum type

  • plant.damage_flags: added is_dead

  • plot_role_type: new enum type

  • plot_strategy_type: new enum type

  • relationship_event_supplement: new struct type

  • relationship_event: new struct type

  • specific_ref: moved union data to data field

  • ui_look_list: moved union fields to data and renamed to match type enum

  • ui_sidebar_menus.location: added new profession-related fields, renamed and fixed types of deity-related fields

  • ui_sidebar_mode: added ZonesLocationInfo

  • unit_action: rearranged as tagged union with new sub-types; existing code should be compatible

  • vague_relationship_type: new enum type

  • vermin_flags: identified is_roaming_colony

  • viewscreen_justicest: identified interrogation-related fields

  • world_data.field_battles: identified and named several fields

DFHack 0.47.03-beta1

New Scripts


  • adv-max-skills: fixed for 0.47

  • deep-embark:
    • prevented running in non-fortress modes

    • ensured that only the newest wagon is deconstructed

  • full-heal:
    • fixed issues with removing corpses

    • fixed resurrection for non-historical figures

  • modtools/create-unit: added handling for arena tame setting

  • teleport: fixed setting new tile occupancy

Misc Improvements


  • Dropped support for 0.44.12-0.47.02

  • abstract_building_type: added types (and subclasses) new to 0.47

  • agreement_details_type: added enum

  • agreement_details: added struct type (and many associated data types)

  • agreement_party: added struct type

  • announcement_type: added types new to 0.47

  • artifact_claim_type: added enum

  • artifact_claim: added struct type

  • breath_attack_type: added SHARP_ROCK

  • building_offering_placest: new class

  • building_type: added OfferingPlace

  • caste_raw_flags: renamed many items to match DF names

  • creature_interaction_effect: added subclasses new to 0.47

  • creature_raw_flags:
    • identified several more items

    • renamed many items to match DF names

  • d_init: added settings new to 0.47

  • entity_name_type: added MERCHANT_COMPANY, CRAFT_GUILD

  • entity_position_responsibility: added values new to 0.47

  • fortress_type: added enum

  • general_ref_type: added UNIT_INTERROGATEE

  • ghost_type: added None value

  • goal_type: added goals types new to 0.47

  • histfig_site_link: added subclasses new to 0.47

  • history_event_collection: added subtypes new to 0.47

  • history_event_context: added lots of new fields

  • history_event_reason:
    • added captions for all items

    • added items new to 0.47

  • history_event_type: added types for events new to 0.47, as well as corresponding history_event subclasses (too many to list here)

  • honors_type: added struct type

  • interaction_effect: added subtypes new to 0.47

  • interaction_source_experimentst: added class type

  • interaction_source_usage_hint: added values new to 0.47

  • interface_key: added items for keys new to 0.47

  • job_skill: added INTRIGUE, RIDING

  • lair_type: added enum

  • monument_type: added enum

  • next_global_id: added enum

  • poetic_form_action: added Beseech

  • setup_character_info: expanded significantly in 0.47

  • text_system: added layout for struct

  • tile_occupancy: added varied_heavy_aquifer


  • viewscreen_counterintelligencest: new class (only layout identified so far)

DFHack 0.44.12-r3

New Plugins

  • autoclothing: automatically manage clothing work orders

  • autofarm: replaces the previous Ruby script of the same name, with some fixes

  • map-render: allows programmatically rendering sections of the map that are off-screen

  • tailor: automatically manages keeping your dorfs clothed

New Scripts


  • Fixed a crash in the macOS/Linux console when the prompt was wider than the screen width

  • Fixed inconsistent results from Units::isGay for asexual units

  • Fixed some cases where Lua filtered lists would not properly intercept keys, potentially triggering other actions on the same screen

  • autofarm:
    • fixed biome detection to properly determine crop assignments on surface farms

    • reimplemented as a C++ plugin to make proper biome detection possible

  • bodyswap: fixed companion list not being updated often enough

  • cxxrandom: removed some extraneous debug information

  • digfort: now accounts for z-level changes when calculating maximum y dimension

  • embark-assistant:
    • fixed bug causing crash on worlds without generated metals (as well as pruning vectors as originally intended).

    • fixed bug causing mineral matching to fail to cut off at the magma sea, reporting presence of things that aren’t (like DF does currently).

    • fixed bug causing half of the river tiles not to be recognized.

    • added logic to detect some river tiles DF doesn’t generate data for (but are definitely present).

  • eventful: fixed invalid building ID in some building events

  • exportlegends: now escapes special characters in names properly

  • getplants: fixed designation of plants out of season (note that picked plants are still designated incorrectly)

  • gui/autogems: fixed error when no world is loaded

  • gui/companion-order:
    • fixed error when resetting group leaders

    • leave now properly removes companion links

  • gui/create-item: fixed module support - can now be used from other scripts

  • gui/stamper:
    • stopped “invert” from resetting the designation type

    • switched to using DF’s designation keybindings instead of custom bindings

    • fixed some typos and text overlapping

  • modtools/create-unit:
    • fixed an error associating historical entities with units

    • stopped recalculating health to avoid newly-created citizens triggering a “recover wounded” job

    • fixed units created in arena mode having blank names

    • fixed units created in arena mode having the wrong race and/or interaction effects applied after creating units manually in-game

    • stopped units from spawning with extra items or skills previously selected in the arena

    • stopped setting some unneeded flags that could result in glowing creature tiles

    • set units created in adventure mode to have no family, instead of being related to the first creature in the world

  • modtools/reaction-product-trigger:
    • fixed an error dealing with reactions in adventure mode

    • blocked \\BUILDING_ID for adventure mode reactions

    • fixed -clear to work without passing other unneeded arguments

  • modtools/reaction-trigger:
    • fixed a bug when determining whether a command was run

    • fixed handling of -resetPolicy

  • mousequery: fixed calculation of map dimensions, which was sometimes preventing scrolling the map with the mouse when TWBT was enabled

  • RemoteFortressReader: fixed a crash when a unit’s path has a length of 0

  • stonesense: fixed crash due to wagons and other soul-less creatures

  • tame: now sets the civ ID of tamed animals (fixes compatibility with autobutcher)

  • title-folder: silenced error when PRINT_MODE is set to TEXT

Misc Improvements

  • Added a note to dfhack-run when called with no arguments (which is usually unintentional)

  • On macOS, the launcher now attempts to un-quarantine the rest of DFHack

  • bodyswap: added arena mode support

  • combine-drinks: added more default output, similar to combine-plants

  • createitem: added a list of valid castes to the “invalid caste” error message, for convenience

  • devel/export-dt-ini: added more size information needed by newer Dwarf Therapist versions

  • dwarfmonitor: enabled widgets to access other scripts and plugins by switching to the core Lua context

  • embark-assistant:
    • added an in-game option to activate on the embark screen

    • changed waterfall detection to look for level drop rather than just presence

    • changed matching to take incursions, i.e. parts of other biomes, into consideration when evaluating tiles. This allows for e.g. finding multiple biomes on single tile embarks.

    • changed overlay display to show when incursion surveying is incomplete

    • changed overlay display to show evil weather

    • added optional parameter “fileresult” for crude external harness automated match support

    • improved focus movement logic to go to only required world tiles, increasing speed of subsequent searches considerably

  • exportlegends: added rivers to custom XML export

  • exterminate: added support for a special enemy caste

  • gui/gm-unit:
    • added support for editing:

    • added attribute editor

    • added orientation editor

    • added editor for bodies and body parts

    • added color editor

    • added belief editor

    • added personality editor

  • modtools/create-item: documented already-existing -quality option

  • modtools/create-unit:
    • added the ability to specify \\LOCAL for the fort group entity

    • now enables the default labours for adult units with CAN_LEARN.

    • now sets historical figure orientation.

    • improved speed of creating multiple units at once

    • made the script usable as a module (from other scripts)

  • modtools/reaction-trigger:
    • added -ignoreWorker: ignores the worker when selecting the targets

    • changed the default behavior to skip inactive/dead units; added -dontSkipInactive to include creatures that are inactive

    • added -range: controls how far elligible targets can be from the workshop

    • syndromes now are applied before commands are run, not after

    • if both a command and a syndrome are given, the command only runs if the syndrome could be applied

  • mousequery: made it more clear when features are enabled

  • RemoteFortressReader:
    • added a basic framework for controlling and reading the menus in DF (currently only supports the building menu)

    • added support for reading item raws

    • added a check for whether or not the game is currently saving or loading, for utilities to check if it’s safe to read from DF

    • added unit facing direction estimate and position within tiles

    • added unit age

    • added unit wounds

    • added tree information

    • added check for units’ current jobs when calculating the direction they are facing


  • Added new plugin_load_data and plugin_save_data events for plugins to load/save persistent data

  • Added Maps::GetBiomeType and Maps::GetBiomeTypeByRef to infer biome types properly

  • Added Units::getPhysicalDescription (note that this depends on the unit_get_physical_description offset, which is not yet available for all DF builds)


  • Added new Persistence module

  • Cut down on internal DFHack dependencies to improve build times

  • Improved concurrency in event and server handlers

  • Persistent data is now stored in JSON files instead of historical figures - existing data will be migrated when saving

  • stonesense: fixed some OpenGL build issues on Linux


  • Exposed gui.dwarfmode.get_movement_delta and gui.dwarfmode.get_hotkey_target

  • dfhack.run_command now returns the command’s return code


  • Made unit_ishostile consistently return a boolean


  • Added unit_get_physical_description function offset on some platforms

  • Added/identified types:
    • assume_identity_mode

    • musical_form_purpose

    • musical_form_style

    • musical_form_pitch_style

    • musical_form_feature

    • musical_form_vocals

    • musical_form_melodies

    • musical_form_interval

    • unit_emotion_memory

  • need_type: fixed PrayOrMeditate typo

  • personality_facet_type, value_type: added NONE values

  • twbt_render_map: added for 64-bit 0.44.12 (for map-render)

DFHack 0.44.12-r2

New Plugins

  • debug: manages runtime debug print category filtering

  • nestboxes: automatically scan for and forbid fertile eggs incubating in a nestbox

New Scripts


  • building-hacks: fixed error when dealing with custom animation tables

  • devel/test-perlin: fixed Lua error (math.pow())

  • embark-assistant: fixed crash when entering finder with a 16x16 embark selected, and added 16 to dimension choices

  • embark-skills: fixed missing skill_points_remaining field

  • full-heal:
    • stopped wagon resurrection

    • fixed a minor issue with post-resurrection hostility

  • gui/companion-order:
    • fixed issues with printing coordinates

    • fixed issues with move command

    • fixed cheat commands (and removed “Power up”, which was broken)

  • gui/gm-editor: fixed reinterpret cast (r)

  • gui/pathable: fixed error when sidebar is hidden with Tab

  • labormanager:
    • stopped assigning labors to ineligible dwarves, pets, etc.

    • stopped assigning invalid labors

    • added support for crafting jobs that use pearl

    • fixed issues causing cleaning jobs to not be assigned

    • added support for disabling management of specific labors

  • prospector: (also affected embark-tools) - fixed a crash when prospecting an unusable site (ocean, mountains, etc.) with a large default embark size in d_init.txt (e.g. 16x16)

  • siege-engine: fixed a few Lua errors (math.pow(), unit.relationship_ids)

  • tweak: fixed hotkey-clear

Misc Improvements

  • armoks-blessing: improved documentation to list all available arguments

  • devel/export-dt-ini:
    • added viewscreen offsets for DT 40.1.2

    • added item base flags offset

    • added needs offsets

  • embark-assistant:
    • added match indicator display on the right (“World”) map

    • changed ‘c’ancel to abort find if it’s under way and clear results if not, allowing use of partial surveys.

    • added Coal as a search criterion, as well as a coal indication as current embark selection info.

  • full-heal:
    • added -all, -all_civ and -all_citizens arguments

    • added module support

    • now removes historical figure death dates and ghost data

  • growcrops: added all argument to grow all crops

  • gui/load-screen: improved documentation

  • labormanager: now takes nature value into account when assigning jobs

  • open-legends: added warning about risk of save corruption and improved related documentation

  • points: added support when in viewscreen_setupdwarfgamest and improved error messages

  • siren: removed break handling (relevant misc_trait_type was no longer used - see “Structures” section)


  • New debug features related to debug plugin:
    • Classes (C++ only): Signal<Signature, type_tag>, DebugCategory, DebugManager



  • Added a usable unit test framework for basic tests, and a few basic tests

  • Added CMakeSettings.json with intellisense support

  • Changed plugins/CMakeLists.custom.txt to be ignored by git and created (if needed) at build time instead

  • Core: various thread safety and memory management improvements

  • Fixed CMake build dependencies for generated header files

  • Fixed custom CMAKE_CXX_FLAGS not being passed to plugins

  • Linux/macOS: changed recommended build backend from Make to Ninja (Make builds will be significantly slower now)


  • utils: new OrderedTable class


  • Win32: added missing vtables for viewscreen_storesst and squad_order_rescue_hfst

  • activity_event_performancest: renamed poem as written_content_id

  • body_part_status: identified gelded

  • dance_form: named musical_form_id and musical_written_content_id

  • incident_sub6_performance.participants: named performance_event and role_index

  • incident_sub6_performance:
    • made performance_event an enum

    • named poetic_form_id, musical_form_id, and dance_form_id

  • misc_trait_type: removed LikesOutdoors, Hardened, TimeSinceBreak, OnBreak (all unused by DF)

  • musical_form_instruments: named minimum_required and maximum_permitted

  • musical_form: named voices field

  • plant_tree_info: identified extent_east, etc.

  • plant_tree_tile: gave connection bits more meaningful names (e.g. connection_east instead of thick_branches_1)

  • poetic_form: identified many fields and related enum/bitfield types

  • setup_character_info: identified skill_points_remaining (for embark-skills)

  • ui.main: identified fortress_site

  • ui.squads: identified kill_rect_targets_scroll

  • ui: fixed alignment of main and squads (fixes tweak hotkey-clear and DF-AI)

  • unit_action.attack:
    • identified attack_skill

    • added lightly_tap and spar_report flags

  • unit_flags3: identified marked_for_gelding

  • unit_personality: identified stress_drain, stress_boost, likes_outdoors, combat_hardened

  • unit_storage_status: newly identified type, stores noble holdings information (used in viewscreen_layer_noblelistst)

  • unit_thought_type: added new expulsion thoughts from 0.44.12

  • viewscreen_layer_arena_creaturest: identified item- and name-related fields

  • viewscreen_layer_militaryst: identified equip.assigned.assigned_items

  • viewscreen_layer_noblelistst: identified storage_status (see unit_storage_status type)

  • viewscreen_new_regionst:
    • identified rejection_msg, raw_folder, load_world_params

    • changed many int8_t fields to bool

  • viewscreen_setupadventurest: identified some nemesis and personality fields, and page.ChooseHistfig

  • world_data: added mountain_peak_flags type, including is_volcano

  • world_history: identified names and/or types of some fields

  • world_site: identified names and/or types of some fields

  • written_content: named poetic_form

DFHack 0.44.12-r1


  • Console: fixed crash when entering long commands on Linux/macOS

  • Fixed special characters in command-prompt and other non-console in-game outputs on Linux/macOS (in tools using df2console)

  • Removed jsoncpp’s include and lib folders from DFHack builds/packages

  • die: fixed Windows crash in exit handling

  • dwarfmonitor, manipulator: fixed stress cutoffs

  • modtools/force: fixed a bug where the help text would always be displayed and nothing useful would happen

  • ruby: fixed calling conventions for vmethods that return strings (currently enabler.GetKeyDisplay())

  • startdwarf: fixed on 64-bit Linux

Misc Improvements

  • Reduced time for designation jobs from tools like dig to be assigned workers

  • embark-assistant:
    • Switched to standard scrolling keys, improved spacing slightly

    • Introduced scrolling of Finder search criteria, removing requirement for 46 lines to work properly (Help/Info still formatted for 46 lines).

    • Added Freezing search criterion, allowing searches for NA/Frozen/At_Least_Partial/Partial/At_Most_Partial/Never Freezing embarks.

  • rejuvenate:
    • Added -all argument to apply to all citizens

    • Added -force to include units under 20 years old

    • Clarified documentation


  • Added to Units module:
    • getStressCategory(unit)

    • getStressCategoryRaw(level)

    • stress_cutoffs (Lua: getStressCutoffs())


  • Added documentation for all RPC functions and a build-time check

  • Added support for build IDs to development builds

  • Changed default build architecture to 64-bit

  • Use dlsym(3) to find vtables from


  • Added start_dwarf_count on 64-bit Linux again and fixed scanning script

  • army_controller: added new vector from 0.44.11

  • belief_system: new type, few fields identified

  • mental_picture: new type, some fields identified

  • mission_report:
    • new type (renamed, was mission before)

    • identified some fields

  • mission: new type (used in viewscreen_civlistst)

  • spoils_report: new type, most fields identified

  • viewscreen_civlistst:
    • split unk_20 into 3 pointers

    • identified new pages

    • identified new messenger-related fields

  • viewscreen_image_creatorst:
    • fixed layout

    • identified many fields

  • viewscreen_reportlistst: added new mission and spoils report-related fields (fixed layout)

  • world.languages: identified (minimal information; whole languages stored elsewhere)

  • world.status:
    • mission_reports: renamed, was missions

    • spoils_reports: identified

  • world.unk_131ec0, world.unk_131ef0: researched layout

  • world.worldgen_status: identified many fields

  • world: belief_systems: identified

DFHack 0.44.12-alpha1


  • macOS: fixed renderer vtable address on x64 (fixes rendermax)

  • stonesense: fixed PLANT:DESERT_LIME:LEAF typo


  • Added C++-style linked list interface for DF linked lists


  • Dropped 0.44.11 support

  • ui.squads: Added fields new in 0.44.12

DFHack 0.44.11-beta2.1


DFHack 0.44.11-beta2


  • Windows: Fixed console failing to initialize

  • command-prompt: added support for commands that require a specific screen to be visible, e.g. cleaners

  • gui/workflow: fixed advanced constraint menu for crafts


DFHack 0.44.11-beta1


  • Fixed displayed names (from Units::getVisibleName) for units with identities

  • Fixed potential memory leak in Screen::show()

  • fix/dead-units: fixed script trying to use missing isDiplomat function

Misc Improvements

  • Console:
    • added support for multibyte characters on Linux/macOS

    • made the console exit properly when an interactive command is active (liquids, mode, tiletypes)

  • Linux: added automatic support for GCC sanitizers in dfhack script

  • Made the DFHACK_PORT environment variable take priority over remote-server.json

  • dfhack-run: added support for port specified in remote-server.json, to match DFHack’s behavior

  • digfort: added better map bounds checking

  • remove-stress:
    • added support for -all as an alternative to the existing all argument for consistency

    • sped up significantly

    • improved output/error messages

    • now removes tantrums, depression, and obliviousness

  • ruby: sped up handling of onupdate events


  • Exposed Screen::zoom() to C++ (was Lua-only)

  • New functions: Units::isDiplomat(unit)


  • jsoncpp: updated to version 1.8.4 and switched to using a git submodule


  • Added printall_recurse to print tables and DF references recursively. It can be also used with ^ from the lua interpreter.

  • gui.widgets: List:setChoices clones choices for internal table changes


  • history_event_entity_expels_hfst: added (new in 0.44.11)

  • history_event_site_surrenderedst: added (new in 0.44.11)

  • history_event_type: added SITE_SURRENDERED, ENTITY_EXPELS_HF (new in 0.44.11)

  • syndrome: identified a few fields

  • viewscreen_civlistst: fixed layout and identified many fields

DFHack 0.44.11-alpha1


  • Added support for automatically sizing arrays indexed with an enum

  • Dropped 0.44.10 support

  • Removed stale generated CSV files and DT layouts from pre-0.43.05

  • announcement_type: new in 0.44.11: NEW_HOLDING, NEW_MARKET_LINK

  • breath_attack_type: added OTHER

  • historical_figure_info.relationships.list: added unk_3a-unk_3c fields at end

  • interface_key: added bindings new in 0.44.11

  • occupation_type: new in 0.44.11: MESSENGER

  • profession: new in 0.44.11: MESSENGER

  • ui_sidebar_menus:
    • unit.in_squad: renamed to unit.squad_list_opened, fixed location

    • unit: added expel_error and other unknown fields new in 0.44.11

    • hospital: added, new in 0.44.11

    • num_speech_tokens, unk_17d8: moved out of command_line to fix layout on x64

  • viewscreen_civlistst: added a few new fields (incomplete)

  • viewscreen_locationsst: identified edit_input

DFHack 0.44.10-r2

New Plugins

  • cxxrandom: exposes some features of the C++11 random number library to Lua

New Scripts

  • add-recipe: adds unknown crafting recipes to the player’s civ

  • gui/stamper: allows manipulation of designations by transforms such as translations, reflections, rotations, and inversion


  • Fixed many tools incorrectly using the dead unit flag (they should generally check flags2.killed instead)

  • Fixed many tools passing incorrect arguments to printf-style functions, including a few possible crashes (changelayer, follow, forceequip, generated-creature-renamer)

  • Fixed several bugs in Lua scripts found by static analysis (df-luacheck)

  • Fixed -g flag (GDB) in Linux dfhack script (particularly on x64)

  • autochop, autodump, autogems, automelt, autotrade, buildingplan, dwarfmonitor, fix-unit-occupancy, fortplan, stockflow: fix issues with periodic tasks not working for some time after save/load cycles

  • autogems:
    • stop running repeatedly when paused

    • fixed crash when furnaces are linked to same stockpiles as jeweler’s workshops

  • autogems, fix-unit-occupancy: stopped running when a fort isn’t loaded (e.g. while embarking)

  • autounsuspend: now skips planned buildings

  • ban-cooking: fixed errors introduced by kitchen structure changes in 0.44.10-r1

  • buildingplan, fortplan: stopped running before a world has fully loaded

  • deramp: fixed deramp to find designations that already have jobs posted

  • dig: fixed “Inappropriate dig square” announcements if digging job has been posted

  • fixnaked: fixed errors due to emotion changes in 0.44

  • remove-stress: fixed an error when running on soul-less units (e.g. with -all)

  • reveal: stopped revealing tiles adjacent to tiles above open space inappropriately

  • stockpiles: loadstock now sets usable and unusable weapon and armor settings

  • stocks: stopped listing carried items under stockpiles where they were picked up from

Misc Improvements

  • Added script name to messages produced by qerror() in Lua scripts

  • Fixed an issue in around 30 scripts that could prevent edits to the files (adding valid arguments) from taking effect

  • Linux: Added several new options to dfhack script: --remotegdb, --gdbserver, --strace

  • bodyswap: improved error handling

  • buildingplan: added max quality setting

  • caravan: documented (new in 0.44.10-alpha1)

  • deathcause: added “slaughtered” to descriptions

  • embark-assistant:
    • changed region interaction matching to search for evil rain, syndrome rain, and reanimation rather than interaction presence (misleadingly called evil weather), reanimation, and thralling

    • gave syndrome rain and reanimation wider ranges of criterion values

  • fix/dead-units: added a delay of around 1 month before removing units

  • fix/retrieve-units: now re-adds units to active list to counteract fix/dead-units

  • modtools/create-unit:
    • added quantity argument

    • now selects a caste at random if none is specified

  • mousequery:
    • migrated several features from TWBT’s fork

    • added ability to drag with left/right buttons

    • added depth display for TWBT (when multilevel is enabled)

    • made shift+click jump to lower levels visible with TWBT

  • title-version: added version to options screen too

  • item-descriptions: fixed several grammatical errors


  • New functions (also exposed to Lua):
    • Units::isKilled()

    • Units::isActive()

    • Units::isGhost()

  • Removed Vermin module (unused and obsolete)


  • Added build option to generate symbols for large generated files containing df-structures metadata

  • Added fallback for YouCompleteMe database lookup failures (e.g. for newly-created files)

  • Improved efficiency and error handling in stl_vsprintf and related functions

  • jsoncpp: fixed constructor with long on Linux


  • Added profiler module to measure lua performance

  • Enabled shift+cursor movement in WorkshopOverlay-derived screens


  • incident_sub6_performance: identified some fields

  • item_body_component: fixed location of corpse_flags

  • job_handler: fixed static array layout

  • job_type: added is_designation attribute

  • unit_flags1: renamed dead to inactive to better reflect its use

  • unit_personality: fixed location of current_focus and undistracted_focus

  • unit_thought_type: added SawDeadBody (new in 0.44.10)

DFHack 0.44.10-r1

New Scripts

  • bodyswap: shifts player control over to another unit in adventure mode

New Tweaks

  • tweak kitchen-prefs-all: adds an option to toggle cook/brew for all visible items in kitchen preferences

  • tweak stone-status-all: adds an option to toggle the economic status of all stones


  • Lua: registered dfhack.constructions.designateRemove() correctly

  • prospector: fixed crash due to invalid vein materials

  • tweak max-wheelbarrow: fixed conflict with building renaming

  • view-item-info: stopped appending extra newlines permanently to descriptions

Misc Improvements

  • Added logo to documentation

  • Documented several missing dfhack.gui Lua functions

  • adv-rumors: bound to Ctrl-A

  • command-prompt: added support for Gui::getSelectedPlant()

  • gui/advfort: bound to Ctrl-T

  • gui/room-list: added support for Gui::getSelectedBuilding()

  • gui/unit-info-viewer: bound to Alt-I

  • modtools/create-unit: made functions available to other scripts

  • search:
    • added support for stone restrictions screen (under z: Status)

    • added support for kitchen preferences (also under z)


  • New functions (all available to Lua as well):
    • Buildings::getRoomDescription()

    • Items::checkMandates()

    • Items::canTrade()

    • Items::canTradeWithContents()

    • Items::isRouteVehicle()

    • Items::isSquadEquipment()

    • Kitchen::addExclusion()

    • Kitchen::findExclusion()

    • Kitchen::removeExclusion()

  • syndrome-util: added eraseSyndromeData()


  • Fixed compiler warnings on all supported build configurations

  • Windows build scripts now work with non-C system drives


  • dfhack_room_quality_level: new enum

  • glowing_barrier: identified triggered, added comments

  • item_flags2: renamed has_written_content to unk_book

  • kitchen_exc_type: new enum (for

  • mandate.mode: now an enum

  • unit_personality.emotions.flags.memory: identified

  • viewscreen_kitchenprefst.forbidden, possible: now a bitfield, kitchen_pref_flag

  • world_data.feature_map: added extensive documentation (in XML)

DFHack 0.44.10-beta1

New Scripts


  • Units::getAnyUnit(): fixed a couple problematic conditions and potential segfaults if global addresses are missing

  • autodump, automelt, autotrade, stocks, stockpiles: fixed conflict with building renaming

  • exterminate: fixed documentation of this option

  • full-heal:
    • units no longer have a tendency to melt after being healed

    • healed units are no longer treated as patients by hospital staff

    • healed units no longer attempt to clean themselves unsuccessfully

    • wounded fliers now regain the ability to fly upon being healing

    • now heals suffocation, numbness, infection, spilled guts and gelding

  • modtools/create-unit:
    • creatures of the appropriate age are now spawned as babies or children where applicable

    • fix: civ_id is now properly assigned to historical_figure, resolving several hostility issues (spawned pets are no longer attacked by fortress military!)

    • fix: unnamed creatures are no longer spawned with a string of numbers as a first name

  • stockpiles: stopped sidebar option from overlapping with autodump

  • tweak block-labors: fixed two causes of crashes related in the v-p-l menu

Misc Improvements


  • Added function names to DFHack’s NullPointer and InvalidArgument exceptions

  • Added Gui::inRenameBuilding()

  • Linux: required plugins to have symbols resolved at link time, for consistency with other platforms

DFHack 0.44.10-alpha1

New Scripts


  • Fixed uninitialized pointer being returned from Gui::getAnyUnit() in rare cases

  • autohauler, autolabor, labormanager: fixed fencepost error and potential crash

  • dwarfvet: fixed infinite loop if an animal is not accepted at a hospital

  • liquids: fixed “range” command to default to 1 for dimensions consistently

  • search: fixed 4/6 keys in unit screen search

  • view-item-info: fixed an error with some armor

Misc Improvements


  • Added some build scripts for Sublime Text

  • Changed submodule URLs to relative URLs so that they can be cloned consistently over different protocols (e.g. SSH)

DFHack 0.44.09-r1


Misc Improvements

  • Reorganized changelogs and improved changelog editing process

  • modtools/item-trigger: added support for multiple type/material/contaminant conditions


  • OS X: Can now build with GCC 7 (or older)


  • army: added vector new in 0.44.07

  • building_type: added human-readable name attribute

  • furnace_type: added human-readable name attribute

  • renderer: fixed vtable addresses on 64-bit OS X

  • site_reputation_report: named reports vector

  • workshop_type: added human-readable name attribute

DFHack 0.44.09-alpha1


  • dig: stopped designating non-vein tiles (open space, trees, etc.)

  • labormanager: fixed crash due to dig jobs targeting some unrevealed map blocks

DFHack 0.44.08-alpha1


  • fix/dead-units: fixed a bug that could remove some arriving (not dead) units

DFHack 0.44.07-beta1

Misc Improvements


DFHack 0.44.07-alpha1


  • Fixed some CMake warnings (CMP0022)

  • Support for building on Ubuntu 18.04

  • embark-assistant: fixed detection of reanimating biomes

Misc Improvements

  • embark-assistant:
    • Added search for adamantine

    • Now supports saving/loading profiles

  • fillneeds: added -all option to apply to all units

  • RemoteFortressReader: added flows, instruments, tool names, campfires, ocean waves, spiderwebs


  • Several new names in instrument raw structures

  • identity: identified profession, civ

  • manager_order_template: fixed last field type

  • viewscreen_createquotast: fixed layout

  • world.language: moved colors, shapes, patterns to world.descriptors

  • world.reactions, world.reaction_categories: moved to new compound, world.reactions. Requires renaming:
    • world.reactions to world.reactions.reactions

    • world.reaction_categories to world.reactions.reaction_categories

DFHack 0.44.05-r2

New Plugins

New Scripts

  • adv-fix-sleepers: fixes units in adventure mode who refuse to wake up (Bug 6798)

  • hermit: blocks caravans, migrants, diplomats (for hermit challenge)

New Features

  • With PRINT_MODE:TEXT, setting the DFHACK_HEADLESS environment variable will hide DF’s display and allow the console to be used normally. (Note that this is intended for testing and is not very useful for actual gameplay.)


Misc Improvements

DFHack 0.44.05-r1

New Scripts

  • break-dance: Breaks up a stuck dance activity

  • fillneeds: Use with a unit selected to make them focused and unstressed

  • firestarter: Lights things on fire: items, locations, entire inventories even!

  • flashstep: Teleports adventurer to cursor

  • ghostly: Turns an adventurer into a ghost or back

  • questport: Sends your adventurer to the location of your quest log cursor

  • view-unit-reports: opens the reports screen with combat reports for the selected unit


  • devel/inject-raws: now recognizes spaces in reaction names

  • dig: added support for designation priorities - fixes issues with designations from digv and related commands having extremely high priority

  • dwarfmonitor:
    • fixed display of creatures and poetic/music/dance forms on prefs screen

    • added “view unit” option

    • now exposes the selected unit to other tools

  • names: fixed many errors

  • quicksave: fixed an issue where the “Saving…” indicator often wouldn’t appear

Misc Improvements

  • binpatch: now reports errors for empty patch files

  • force: now provides useful help

  • full-heal:
    • can now select corpses to resurrect

    • now resets body part temperatures upon resurrection to prevent creatures from freezing/melting again

    • now resets units’ vanish countdown to reverse effects of exterminate

  • gui/gm-unit:
    • added a profession editor

    • misc. layout improvements

  • launch: can now ride creatures

  • names: can now edit names of units

  • RemoteFortressReader:
    • support for moving adventurers

    • support for vehicles, gem shapes, item volume, art images, item improvements



  • Gui::getAnyUnit() supports many more screens/menus


  • New globals: soul_next_id

DFHack 0.44.05-alpha1

Misc Improvements

  • gui/liquids: added more keybindings: 0-7 to change liquid level, P/B to cycle backwards


  • incident: re-aligned again to match disassembly

DFHack 0.44.04-alpha1



  • artifact_record: fixed layout (changed in 0.44.04)

  • incident: fixed layout (changed in 0.44.01) - note that many fields have moved

DFHack 0.44.03-beta1


Misc Improvements


  • Added job_type.PutItemOnDisplay

  • Added twbt_render_map code offset on x64

  • Fixed an issue preventing enabler from being allocated by DFHack

  • Found renderer vtable on osx64

  • New globals:
    • version

    • min_load_version

    • movie_version

    • basic_seed

    • title

    • title_spaced

    • ui_building_resize_radius

  • adventure_movement_optionst, adventure_movement_hold_tilest, adventure_movement_climbst: named coordinate fields

  • mission: added type

  • unit: added 3 new vmethods: getCreatureTile, getCorpseTile, getGlowTile

  • viewscreen_assign_display_itemst: fixed layout on x64 and identified many fields

  • viewscreen_reportlistst: fixed layout, added mission_id vector

  • world.status: named missions vector

DFHack 0.44.03-alpha1


  • Improved json I/O error messages

  • Stopped a crash when trying to create instances of classes whose vtable addresses are not available

DFHack 0.44.02-beta1

New Scripts


  • Fixed issues with the console output color affecting the prompt on Windows

  • createitem: stopped items from teleporting away in some forts

  • gui/gm-unit: can now edit mining skill

  • gui/quickcmd: stopped error from adding too many commands

  • modtools/create-unit: fixed error when domesticating units

Misc Improvements

  • The console now provides suggestions for built-in commands

  • devel/export-dt-ini: avoid hardcoding flags

  • exportlegends:
    • reordered some tags to match DF’s order

    • added progress indicators for exporting long lists

  • gui/gm-editor: added enum names to enum edit dialogs

  • gui/gm-unit: made skill search case-insensitive

  • gui/rename: added “clear” and “special characters” options

  • RemoteFortressReader:
    • includes item stack sizes

    • some performance improvements



  • Exposed get_vector() (from C++) for all types that support find(), e.g. df.unit.get_vector() ==


  • Added buildings_other_id.DISPLAY_CASE

  • Fixed unit alignment

  • Fixed viewscreen_titlest.start_savegames alignment

  • Identified historical_entity.unknown1b.deities (deity IDs)

  • Located start_dwarf_count offset for all builds except 64-bit Linux; startdwarf should work now

DFHack 0.44.02-alpha1

New Scripts


  • Fixed a crash that could occur if a symbol table in symbols.xml had no content


  • Added a new dfhack.console API

  • API can now wrap functions with 12 or 13 parameters


  • The former announcements global is now a field in d_init

  • The ui_menu_width global is now a 2-byte array; the second item is the former ui_area_map_width global, which is now removed

  • world fields formerly beginning with job_ are now fields of, e.g. world.job_list is now