Q: How do I download DFHack?
A: Either add to your Steam library from our Steam page or scroll to the latest release on our GitHub releases page, expand the "Assets" list, and download the file for your platform (e.g. dfhack-XX.XX-rX-Windows-64bit.zip
. If you are on Windows and are manually installing from the zip file, please remember to right click on the file after downloading, open the file properties, and select the "Unblock" checkbox. This will prevent issues with Windows antivirus programs.
This release is compatible with all distributions of Dwarf Fortress: Steam, Itch, and Classic.
Please report any issues (or feature requests) on the DFHack GitHub issue tracker. When reporting issues, please upload a zip file of your savegame and a zip file of your mods
directory to the cloud and add links to the GitHub issue. Make sure your files are downloadable by "everyone with the link". We need your savegame to reproduce the problem and test the fix, and we need your active mods so we can load your savegame. Issues with savegames and mods attached get fixed first!
Highlights
Table of contents in gui/journal, timestream bugfixes and improvements
Table of contents in gui/journal
Community contributor psychowico has continued to deliver improvements to gui/journal
. It now supports markdown syntax for section headers, and it will automatically build a hyperlinked table of contents as you add the headers.
To add a header, start a line with "# ", e.g. "# Fortress goals". You can add level 2 subheadings with "## ", and so on.
Due to the tool's popularity, there is now a global hotkey (in fort mode) for launching gui/journal
: Ctrl-j
timestream bugfixes and improvements
The FPS fixer timestream
has been significantly refined for better behavior at the highest FPS improvement levels. For example, jobs were not being generated quickly enough for the accelerated calendar rate. Also, some non-skill-based jobs, like eating and drinking, were taking too long to complete. With the updates, dwarves will no longer be left jobless or get stuck in the booze stockpile with seemingly unquenchable thirst.
Announcements
PSAs
PSAs
As always, remember that, just like the vanilla DF game, DFHack tools can also have bugs. It is a good idea to save often and keep backups of the forts that you care about.
Many DFHack tools that worked in previous (pre-Steam) versions of DF have not been updated yet and are marked with the "unavailable" tag in their docs. If you try to run them, they will show a warning and exit immediately. You can run the command again to override the warning (though of course the tools may not work). We make no guarantees of reliability for the tools that are marked as "unavailable".
The in-game interface for running DFHack commands (gui/launcher
) will not show "unavailable" tools by default. You can still run them if you know their names, or you can turn on dev mode by hitting Ctrl-D while in gui/launcher
and they will be added to the autocomplete list. Some tools do not compile yet and are not available at all, even when in dev mode.
If you see a tool complaining about the lack of a cursor, know that it's referring to the keyboard cursor (which used to be the only real option in Dwarf Fortress). You can enable the keyboard cursor by entering mining mode or selecting the dump/forbid tool and hitting Alt-K (the DFHack keybinding for toggle-kbd-cursor
). We're working on making DFHack tools more mouse-aware and accessible so this step isn't necessary in the future.
Changelog
New tools, fixes, and improvements
New Features
gui/journal
:- new hotkey, accessible from anywhere in fort mode: Ctrl-j
- new automatic table of contents. add lines that start with "# ", like "# Entry for 502-04-02", to add hyperlinked headers to the table of contents
Fixes
- Copy/Paste: Fix handling of multi-line text when interacting with the system clipboard on Windows
add-spatter
: fix a crash related to unloading a savegame with add-spatter reactions, then loading a second savegame with add-spatter reactionsautodump
: cancel any jobs that point to dumped itemsbuild-now
: fix error when building buildings that (in previous DF versions) required the architecture laborchangelayer
: fix incorrect lookup of geological region in multi-region embarksfix/dead-units
: fix error when removing dead units from burrows and the unit with the greatest ID was deadfull-heal
: fix-r --all_citizens
option combination not resurrecting citizensgui/autodump
:- prevent dumping into walls or invalid map areas
- properly turn items into projectiles when they are teleported into mid-air
gui/settings-manager
: fix position of "settings restored" message on embark when the player has no saved embark profilesgui/unit-info-viewer
: correctly display skill levels when rust is involvedlist-waves
: no longer gets confused by units that leave the map and then return (e.g. squads who go out on raids)locate-ore
: fix sometimes selecting an incorrect tile when there are multiple mineral veins in a single map blockmakeown
: ensure names given to adopted units (or units created withgui/sandbox
) are respected later in legends modeopen-legends
: don't intercept text bound for vanilla legends mode search widgetsplant
: properly detect trees in a specified cuboid that only have branches/leaves in the cuboid areaprioritize
: fix incorrect restoring of saved settings on Windowstimestream
:- fix dwarves spending too long eating and drinking
- fix jobs not being created at a sufficient rate, leading to dwarves standing around doing nothing
zone
: fix alignment of animal actions overlay panel (the one where you can click to geld/train/etc.) when the animal has a custom portrait (like named dragons)
Misc Improvements
- performance improvements for DFHack tools and infrastructure
allneeds
: display distribution of needs by how severely they are affecting the dwarfautodump
: allow dumping items into mid-air, converting them into projectiles likegui/autodump
doesbuild-now
: ifsuspendmanager
is running, run an unsuspend cycle immediately before scanning for buildings to buildgui/pathable
: give edge tiles where wagons can enter the map a special highlight to make them more identifiable. this is especially useful when the game decides that only a portion of the map edge is usable by wagons.list-waves
:- now outputs the names of the dwarves in each migration wave
- can now display information about specific migration waves (e.g.
list-waves 0
to identify your starting 7 dwarves)
Documentation
- improved docs for
dfhack.units
module functions
Removed
- The
PRELOAD_LIB
environment variable has been renamed toDF_PRELOAD
to match the naming scheme of other environment variables used by thedfhack
startup script. If you are preloading libraries (e.g. for performance testing) please defineDF_PRELOAD
instead ofPRELOAD_LIB
orLD_PRELOAD
cuboid::clamp(bool block)
: renamed tocuboid::clampMap(bool block)
, name taken bycuboid::clamp(cuboid other)
Units::getPhysicalDescription
: function requires DF call point that is no longer available. alternative is to navigate the unit info sheet and extract the description from the UI (seemarkdown
)Units::MAX_COLORS
,Units::findIndexById
,Units::getNumUnits
,Units::getUnit
: replaced byDFHack::COLOR_MAX
and the generated type-specificget_vector
functions
API
cuboid
:- construct from
df::map_block*
,forBlock
iterator to access map blocks in cuboid clamp(cuboid other)
,clampNew(cuboid other)
for cuboid intersection.clampNew
returns new cuboid instead of modifying.
- construct from
Items
: no longer need to pass MapCache parameter tomoveToGround
,moveToContainer
,moveToBuilding
,moveToInventory
,makeProjectile
, orremove
setAreaAquifer
,removeAreaAquifer
: add overloads that take cuboid range specifiersUnits::getCasteRaw
: get a caste_raw from a unit or race and casteUnits::getProfessionName
: boolland_title
to append "of Sitename" where applicable, use Prisoner/Slave and noble spouse titles (controlled byignore_noble
)Units::getProfession
: account for units with fake identitiesUnits::getRaceChildName
,getRaceChildNameById
,getRaceBabyName
,getRaceBabyNameById
: boolplural
to get plural formUnits::getReadableName
: correct display of ghost+curse names w/r/t each other and unit prof, usecurse.name
instead of iterating syndrome name effectsUnits::isDanger
: added boolhiding_curse
, passed toisUndead
to avoid spoilersUnits::isNaked
: now only checks equipped items (including rings, for now). Setting boolno_items
to true checks empty inventory like before.Units::isUndead
: boolinclude_vamps
renamed tohiding_curse
. Fn now checks that instead of bloodsucker syndrome.Units::isUnitInBox
,getUnitsInBox
: add versions that take a cuboid range, add filter fn parameter forgetUnitsInBox
Units::isVisible
: account for units in cagesUnits
: add overloads that take historical figures forgetReadableName
,getVisibleName
, andgetProfessionName
Lua
dfhack.items.moveToInventory
: makeuse_mode
andbody_part
args optionaldfhack.units
:- allow historical figures to be passed instead of units for
getReadableName
,getVisibleName
, andgetProfessionName
- add
getRaceReadableName
,getRaceReadableNameById
,getRaceNamePluralById
- allow historical figures to be passed instead of units for
gui.ZScreen
: newdefocused
property for starting screens without keyboard focus
Structures
world_site
: renameis_mountain_halls
andis_fortress
to Bay12 namesmin_depth
andmax_depth