- v50 information can now be added to pages in the main namespace. v0.47 information can still be found in the DF2014 namespace. See here for more details on the new versioning policy.
- Use this page to report any issues related to the migration.
Difference between revisions of "40d:Macros and keymaps"
m (Rule G) |
|||
(31 intermediate revisions by 22 users not shown) | |||
Line 1: | Line 1: | ||
− | Playing Dwarf Fortress means lots of typing. Although the game | + | {{Quality|Superior|11:05, 18 May 2015 (UTC)}} |
+ | {{av}} | ||
+ | Playing Dwarf Fortress means lots of typing. Although the game has no internal macro/keymap system (except in alpha version 40d12), using an external program can save you a great deal of time when dumping, rewalling, designating, and so forth. | ||
# Go to [[Utilities#AutoHotKey]] and download AutoHotKey. Installation is simple and the program uses few system resources. | # Go to [[Utilities#AutoHotKey]] and download AutoHotKey. Installation is simple and the program uses few system resources. | ||
Line 8: | Line 10: | ||
Users may experience some issues in getting scripts to work, particularly when using looping scripts when experiencing low frame-rates. | Users may experience some issues in getting scripts to work, particularly when using looping scripts when experiencing low frame-rates. | ||
* If experiencing low frame-rates, try adding delays ("Sleep 100" to pause for 100 milliseconds for example) within loops to allow the interface to keep up. If there are nested loops, sometimes adding a pause at the end of an inner loop is all that is needed to flush the keyboard buffer | * If experiencing low frame-rates, try adding delays ("Sleep 100" to pause for 100 milliseconds for example) within loops to allow the interface to keep up. If there are nested loops, sometimes adding a pause at the end of an inner loop is all that is needed to flush the keyboard buffer | ||
+ | * Another way to add delay during and after each simulated key press is to put <B>SetKeyDelay, 40, 40</B> at the start of the macro. | ||
* Make sure that Dwarf Fortress maintains focus. IM windows are the enemy! Who needs friends anyhow? You've got Dwarf Fortress. | * Make sure that Dwarf Fortress maintains focus. IM windows are the enemy! Who needs friends anyhow? You've got Dwarf Fortress. | ||
* This may go without saying, but most macros assume standard key-mappings. If you're using non-standard ones, you may have to edit the macro to get it to work. | * This may go without saying, but most macros assume standard key-mappings. If you're using non-standard ones, you may have to edit the macro to get it to work. | ||
* Visiting liaisons can bring up screens that eat keystrokes, throwing a long-looping script out-of-phase with where it expects the game to be. Wait for the farewell screen before running a long script. | * Visiting liaisons can bring up screens that eat keystrokes, throwing a long-looping script out-of-phase with where it expects the game to be. Wait for the farewell screen before running a long script. | ||
* The <B>SendPlay</B> function supports keys that the <B>Send</B> function does not, for example {{key|Shift-Enter}}. According to the AutoHotKey documentation, <B>SendPlay</B> may also be better at preventing dropped keystrokes. | * The <B>SendPlay</B> function supports keys that the <B>Send</B> function does not, for example {{key|Shift-Enter}}. According to the AutoHotKey documentation, <B>SendPlay</B> may also be better at preventing dropped keystrokes. | ||
+ | |||
+ | == [http://sun2design.com/quickfort/ Quickfort] == | ||
+ | |||
+ | Quickfort is an AutoHotkey-based utility for Dwarf Fortress that helps you build fortresses from "blueprint" .CSV files (comma separated values). These files are easily created and edited in an app like Excel. Most building-oriented DF commands are supported through the use of multiple .CSV files to describe the different phases of DF construction (designation, building, stockpiles, and making adjustments). Many of the examples below can be reproduced in Quickfort. | ||
+ | |||
+ | |||
+ | == Built-in Macros == | ||
+ | |||
+ | With the release of df_28_181_40d13, Dwarf Fortress supports macros without any outside program. They can be created by hitting escape to access the options menu and choosing the Key Bindings section. Once in the Key Bindings menu hit Shift+Tab to open the macro screen. The macros you create here are saved in the file "\data\init\interface.txt". Adding the following to the end of that file will create a macro that selects every item on the trade screen when you hit the tilde key (`). | ||
+ | |||
+ | <pre> | ||
+ | [BIND:MACRO0] | ||
+ | [SYM:`] | ||
+ | [MACRO:SELECT:1] | ||
+ | [MACRO:STANDARDSCROLL_DOWN:1] | ||
+ | [MACRO:SELECT:1] | ||
+ | [MACRO:STANDARDSCROLL_DOWN:1] | ||
+ | [MACRO:SELECT:1] | ||
+ | [MACRO:STANDARDSCROLL_DOWN:1] | ||
+ | [MACRO:SELECT:1] | ||
+ | [MACRO:STANDARDSCROLL_DOWN:1] | ||
+ | [MACRO:SELECT:1] | ||
+ | [MACRO:STANDARDSCROLL_DOWN:1] | ||
+ | [MACRO:SELECT:1] | ||
+ | [MACRO:STANDARDSCROLL_DOWN:1] | ||
+ | [MACRO:SELECT:1] | ||
+ | [MACRO:STANDARDSCROLL_DOWN:1] | ||
+ | [MACRO:SELECT:1] | ||
+ | [MACRO:STANDARDSCROLL_DOWN:1] | ||
+ | [MACRO:SELECT:1] | ||
+ | [MACRO:STANDARDSCROLL_DOWN:1] | ||
+ | [MACRO:SELECT:1] | ||
+ | [MACRO:STANDARDSCROLL_DOWN:1] | ||
+ | [MACRO:SELECT:1] | ||
+ | [MACRO:STANDARDSCROLL_DOWN:1] | ||
+ | [MACRO:SELECT:1] | ||
+ | [MACRO:STANDARDSCROLL_DOWN:1] | ||
+ | [MACRO:SELECT:1] | ||
+ | [MACRO:STANDARDSCROLL_DOWN:1] | ||
+ | </pre> | ||
+ | |||
+ | Performance can be increased by changing the macro pause, MACRO_MS, from the default 150ms per command to zero. Most dig macros can be created using combinations of the following: | ||
+ | <pre> | ||
+ | [MACRO:CURSOR_UP:1] | ||
+ | [MACRO:CURSOR_DOWN:1] | ||
+ | [MACRO:CURSOR_LEFT:1] | ||
+ | [MACRO:CURSOR_RIGHT:1] | ||
+ | [MACRO:SELECT:1] | ||
+ | [MACRO:DESIGNATE_DIG:1] | ||
+ | [MACRO:DESIGNATE_UNDO:1] | ||
+ | [MACRO:CURSOR_UP_FAST:1] | ||
+ | [MACRO:CURSOR_DOWN_FAST:1] | ||
+ | [MACRO:CURSOR_LEFT_FAST:1] | ||
+ | [MACRO:CURSOR_RIGHT_FAST:1] | ||
+ | [MACRO:MACRO123:1] | ||
+ | </pre> | ||
+ | Most of these should be self-explanatory. Each command is followed with a quantity. To call other macros, use <pre>[MACRO:MACRO###:1]</pre> Each new macro begins with a bind command, consisting of BIND, the macro number, and a description: | ||
+ | <pre>[BIND:MACRO11:dig_round_room]</pre> Spaces are not allowed in the description{{verify}}. To bind this macro to a key, SYM is used.<pre>[SYM:Ctrl+Right]</pre> Ctrl, Alt, and Shift combinations are allowed, but not chords with more than one{{verify}}, like Ctrl+Shift+Right. Also, the windows, or meta key, does not appear to be supported{{verify}}. Macros appear to only be terminated by the start of a new macro (BIND command) or the end of the interface.txt file. | ||
+ | |||
+ | Visit this [http://www.bay12games.com/forum/index.php?topic=40751.0 forum post] for additional macros, and discussion on macro creation. | ||
== AutoHotKey Examples == | == AutoHotKey Examples == | ||
===Dumping=== | ===Dumping=== | ||
+ | |||
+ | ====[[GuiDumper.ahk]]==== | ||
+ | This script allows the user to specify a range of squares to dump. | ||
+ | |||
====Stock Screen Dump==== | ====Stock Screen Dump==== | ||
Taken from an old version of [[User:Jackard|Jackard's user page]]. | Taken from an old version of [[User:Jackard|Jackard's user page]]. | ||
− | To use, first have your | + | To use, first have your bookkeeper do enough desk work so you can view individual items in the stocks listing. Then bring it up and press del to quickly mark stuff. To adjust the key repeat rate, edit the KEY_HOLD_MS value in \data\init\init.txt. |
<pre> | <pre> | ||
Line 40: | Line 107: | ||
This script uses a system similar the commands in the designations menu to mark most of the contents of a large area for dumping. [[User:Dukederek|My talk page]] has more detailed instruction. | This script uses a system similar the commands in the designations menu to mark most of the contents of a large area for dumping. [[User:Dukederek|My talk page]] has more detailed instruction. | ||
− | Essentially you need to create two text files with the following titles and content. When playing DF it is safe to have blockdumpinit running constantly as long as you | + | Essentially you need to create two text files with the following titles and content. When playing DF it is safe to have blockdumpinit running constantly as long as you don't plan on using the ctrl-d combination for something else. |
'''blockdumpinit.ahk''' | '''blockdumpinit.ahk''' | ||
Line 282: | Line 349: | ||
SetKeyDelay, 12 ;Key delay, to keep Dwarf Fortress from being overwhelmed. | SetKeyDelay, 12 ;Key delay, to keep Dwarf Fortress from being overwhelmed. | ||
− | + | ;Set higher if you get weird results, or lower to get the | |
− | + | ;script to run faster | |
SLEEPTIME = 12 ;same thing, only used in the repeated key press loops though | SLEEPTIME = 12 ;same thing, only used in the repeated key press loops though | ||
Line 725: | Line 792: | ||
===Bed Assigning macro=== | ===Bed Assigning macro=== | ||
− | This will assign bedrooms to your | + | This will assign bedrooms to your dwarves. Press F3 followed by a single digit indicating how many beds to assign. Can repeat the action, as the number of beds assigned is stored in a counter. Room size is default, but easily edited into the script. By [[User:Napsterbater|Napsterbater]]. |
<pre> | <pre> | ||
Line 754: | Line 821: | ||
This macro can read a spreadsheet and designate rooms according to it. [http://www.bay12games.com/forum/index.php?topic=1428.0 Version 1] | This macro can read a spreadsheet and designate rooms according to it. [http://www.bay12games.com/forum/index.php?topic=1428.0 Version 1] | ||
− | Version 2 of this macro apparently only works in versions up to and including 38c | + | Version 2 of this macro apparently only works in versions up to and including 38c {{verify}}, and can be found here: [http://www.bay12games.com/forum/index.php?topic=1890.0 Version 2] |
====Fedor's chambered circle==== | ====Fedor's chambered circle==== | ||
Line 858: | Line 925: | ||
====LordGrunt's room macro==== | ====LordGrunt's room macro==== | ||
− | Based on 1 of the fractal [[Bedroom_design| bedroom designs.]] | + | Based on 1 of the fractal [[Bedroom_design|bedroom designs.]] |
[http://mkv25.net/dfma/movie-1226-fractalbedrooms Demo Movie] | [http://mkv25.net/dfma/movie-1226-fractalbedrooms Demo Movie] | ||
Line 1,647: | Line 1,714: | ||
====The MOUSE control==== | ====The MOUSE control==== | ||
− | For unrivaled mouse control in DF try [ | + | For unrivaled mouse control in DF try [[User:Digger|this DF Mouse script]] |
====Tile Counter or Scrolling Accelerator==== | ====Tile Counter or Scrolling Accelerator==== | ||
Lack of reference plus slow scroll speed make planning digging area frustrating,so here is the script that shows coordinate and speed scrolling up. | Lack of reference plus slow scroll speed make planning digging area frustrating,so here is the script that shows coordinate and speed scrolling up. | ||
− | [ | + | [[User:Daedalusai|ShowXY]] |
===4-Pour Water Creation script=== | ===4-Pour Water Creation script=== | ||
Line 1,918: | Line 1,985: | ||
</pre> | </pre> | ||
+ | ===File pattern builder=== | ||
+ | |||
+ | This is a script to create a macro out of any building pattern you like. If you like tesselated, this script will do it. If you like blocky, this script can do that, too. Just create a text file that contains the pattern you want to use and this macro will create it like nobody's business. | ||
+ | |||
+ | <pre> | ||
+ | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
+ | ; File Pattern.ahk ; | ||
+ | ; this is an ahk script to read a text file and use ; | ||
+ | ; the pattern contained inside as a blueprint for digging ; | ||
+ | ; press d and place the cursor ; | ||
+ | ; in a corner of the area to be explored ; | ||
+ | ; then use ctrl+shift+d to run ; | ||
+ | ; to change parameters, use ctrl+shift+f ; | ||
+ | ; ; | ||
+ | ; NOTE: ; | ||
+ | ; Author: Corey Amend ; | ||
+ | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
+ | filename = C:\pattern.txt | ||
+ | loc = ul | ||
+ | wait = 100 | ||
+ | |||
+ | wallsymbol = 1 | ||
+ | floorsymbol = 0 | ||
+ | updownsymbol = 2 | ||
+ | downsymbol = 3 | ||
+ | upsymbol = 4 | ||
+ | rampsymbol = 5 | ||
+ | channelsymbol = 6 | ||
+ | |||
+ | digcommand = d | ||
+ | upcommand = u | ||
+ | downcommand = j | ||
+ | updowncommand = i | ||
+ | rampcommand = r | ||
+ | channelcommand = h | ||
+ | |||
+ | hdir = {Right} | ||
+ | vdir = {Down} | ||
+ | |||
+ | upperleft = ul | ||
+ | upperright = ur | ||
+ | lowerleft = ll | ||
+ | lowerright = lr | ||
+ | |||
+ | inrun = 0 | ||
+ | |||
+ | ^+f:: | ||
+ | inputbox filename, Enter Path, Enter the full path to the file that contains the pattern to use | ||
+ | inputbox loc, Enter Cursor Location, Enter the location of the cursor within the pattern (Upper Left = ul`, Lower Right = lr...etc.) | ||
+ | inputbox wait, Enter Delay, Enter the delay to use (default is 100) | ||
+ | return | ||
+ | |||
+ | ^+d:: | ||
+ | |||
+ | IfExist, %filename% | ||
+ | { | ||
+ | FileRead, contents, %filename% | ||
+ | StringSplit Array, contents, `r, `n | ||
+ | |||
+ | if (loc = upperleft) | ||
+ | { | ||
+ | hdir = {Right} | ||
+ | vdir = {Down} | ||
+ | } | ||
+ | else if (loc = upperright) | ||
+ | { | ||
+ | hdir = {Left} | ||
+ | vdir = {Down} | ||
+ | } | ||
+ | else if (loc = lowerleft) | ||
+ | { | ||
+ | hdir = {Right} | ||
+ | vdir = {Up} | ||
+ | } | ||
+ | else if (loc = lowerright) | ||
+ | { | ||
+ | hdir = {Left} | ||
+ | vdir = {Up} | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | MsgBox, Invalid cursor location! | ||
+ | return | ||
+ | } | ||
+ | |||
+ | Loop %Array0% | ||
+ | { | ||
+ | if (loc = upperleft || loc = upperright) | ||
+ | { | ||
+ | current_line = %a_index% | ||
+ | } | ||
+ | else if (loc = lowerleft || loc = lowerright) | ||
+ | { | ||
+ | current_line := (Array0 - a_index + 1) | ||
+ | } | ||
+ | |||
+ | current_value := Array%current_line% | ||
+ | |||
+ | len := StrLen(current_value) | ||
+ | |||
+ | if (hdir = "{Left}") | ||
+ | { | ||
+ | new_value = | ||
+ | |||
+ | Loop %len% | ||
+ | { | ||
+ | new_value := new_value . SubStr(current_value, (len - a_index) + 1, 1) | ||
+ | } | ||
+ | |||
+ | current_value := new_value | ||
+ | } | ||
+ | |||
+ | Loop %len% | ||
+ | { | ||
+ | current_char := SubStr(current_value, a_index, 1) | ||
+ | |||
+ | if (current_char != wallsymbol) | ||
+ | { | ||
+ | if (!inrun) | ||
+ | { | ||
+ | if (current_char = floorsymbol) | ||
+ | { | ||
+ | Send %digcommand% | ||
+ | } | ||
+ | else if (current_char = updownsymbol) | ||
+ | { | ||
+ | Send %updowncommand% | ||
+ | } | ||
+ | else if (current_char = downsymbol) | ||
+ | { | ||
+ | Send %downcommand% | ||
+ | } | ||
+ | else if (current_char = upsymbol) | ||
+ | { | ||
+ | Send %upcommand% | ||
+ | } | ||
+ | else if (current_char = rampsymbol) | ||
+ | { | ||
+ | Send %rampcommand% | ||
+ | } | ||
+ | else if (current_char = channelsymbol) | ||
+ | { | ||
+ | Send %channelcommand% | ||
+ | } | ||
+ | |||
+ | Send {Enter} | ||
+ | inrun = 1 | ||
+ | } | ||
+ | |||
+ | ;;If we're at the end of a line or the next char is different, then end the run | ||
+ | if ((a_index >= len) || (current_char != SubStr(current_value, a_index + 1, 1))) | ||
+ | { | ||
+ | Send {Enter} | ||
+ | inrun = 0 | ||
+ | Sleep %wait% | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if (a_index < len) | ||
+ | { | ||
+ | Send %hdir% | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if (a_index < Array0) | ||
+ | { | ||
+ | Send %vdir% | ||
+ | |||
+ | if (hdir = "{Right}") | ||
+ | { | ||
+ | hdir = {Left} | ||
+ | } | ||
+ | else if (hdir = "{Left}") | ||
+ | { | ||
+ | hdir = {Right} | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | MsgBox File not found | ||
+ | } | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | Sample file to show how this all works: | ||
+ | |||
+ | <pre> | ||
+ | |||
+ | 111111 | ||
+ | 100001 | ||
+ | 100201 | ||
+ | 103001 | ||
+ | 100401 | ||
+ | 105001 | ||
+ | 100601 | ||
+ | 100001 | ||
+ | 111111 | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | This creates a room filled with up/down stairs, a ramp, and a channel. | ||
+ | |||
+ | And finally, here's a sample pattern based on the decentralized workshop: | ||
+ | |||
+ | <pre> | ||
+ | |||
+ | 1111111111111111111111111111111111111 | ||
+ | 1000000000000001000001000000000000001 | ||
+ | 1000000000000001000001000000000000001 | ||
+ | 1000000000000000000000000000000000001 | ||
+ | 1000000000000001000001000000000000001 | ||
+ | 1000000000000001000001000000000000001 | ||
+ | 1000111101111111110111111111011110001 | ||
+ | 1000100000001000100010001000000010001 | ||
+ | 1000100000001000100010001000000010001 | ||
+ | 1000100000001000100010001000000010001 | ||
+ | 1000000000000010000000100000000000001 | ||
+ | 1000111101111000100010001111011110001 | ||
+ | 1000100000001000100010001000000010001 | ||
+ | 1101100010001000100010001000100011011 | ||
+ | 1000100000001000100010001000000010001 | ||
+ | 1000111101111111100011111111011110001 | ||
+ | 1000100000000000030400000000000010001 | ||
+ | 1010000000000000030400000000000000101 | ||
+ | 1000100000000000030400000000000010001 | ||
+ | 1000111101111111100011111111011110001 | ||
+ | 1000100000001000100010001000000010001 | ||
+ | 1101100010001000100010001000100011011 | ||
+ | 1000100000001000100010001000000010001 | ||
+ | 1000111101111000100010001111011110001 | ||
+ | 1000000000000010000000100000000000001 | ||
+ | 1000100000001000100010001000000010001 | ||
+ | 1000100000001000100010001000000010001 | ||
+ | 1000100000001000100010001000000010001 | ||
+ | 1000111101111111110111111111011110001 | ||
+ | 1000000000000001000001000000000000001 | ||
+ | 1000000000000001000001000000000000001 | ||
+ | 1000000000000000000000000000000000001 | ||
+ | 1000000000000001000001000000000000001 | ||
+ | 1000000000000001000001000000000000001 | ||
+ | 1111111111111111111111111111111111111 | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | === jokermatt999's pump stack builder === | ||
+ | |||
+ | Just a simple macro to place one mined level of a pump stack room, as illustrated in the pump stack page on this wiki. It's recommended you exit out after finishing up with it, as the macro is just assigned to p. Hit/Hold down p for multiple layers. | ||
+ | |||
+ | <pre> | ||
+ | p::Send i{Enter}{Enter}{Right}d{Enter}{Right}{Right}{Down}{Down}{Enter}h{Enter}{Enter}{Up}{Left}x{Enter}{Enter}{Left}{Left}{Down}h{Enter}{Enter}{Up}{Up}{Shift Down}.{Shift Up} | ||
+ | </pre> | ||
+ | |||
+ | <pre> | ||
+ | p:: | ||
+ | Send i{Enter 2} | ||
+ | Send d6{Enter}33{Enter} | ||
+ | Send h{Enter 2} | ||
+ | Send x7{Enter 2} | ||
+ | Send h14{Enter 2} | ||
+ | Send 88{Shift Down}.{Shift Up} | ||
+ | return | ||
+ | </pre> | ||
{{Game_Interface FAQ}} | {{Game_Interface FAQ}} | ||
[[Category:ahk scripts]] | [[Category:ahk scripts]] |
Latest revision as of 12:24, 29 July 2021
This article is about an older version of DF. |
Playing Dwarf Fortress means lots of typing. Although the game has no internal macro/keymap system (except in alpha version 40d12), using an external program can save you a great deal of time when dumping, rewalling, designating, and so forth.
- Go to Utilities#AutoHotKey and download AutoHotKey. Installation is simple and the program uses few system resources.
- Write macro scripts (file type .ahk), which may contain any number of commands. You activate scripts by double-clicking .ahk files and deactivate them by right-clicking the AutoHotKey icon on the task bar. Both of these can be done at any time - even right in the middle of a game. AutoHotKey also allows for automated activation of scripts.
Troubleshooting Scripts[edit]
Users may experience some issues in getting scripts to work, particularly when using looping scripts when experiencing low frame-rates.
- If experiencing low frame-rates, try adding delays ("Sleep 100" to pause for 100 milliseconds for example) within loops to allow the interface to keep up. If there are nested loops, sometimes adding a pause at the end of an inner loop is all that is needed to flush the keyboard buffer
- Another way to add delay during and after each simulated key press is to put SetKeyDelay, 40, 40 at the start of the macro.
- Make sure that Dwarf Fortress maintains focus. IM windows are the enemy! Who needs friends anyhow? You've got Dwarf Fortress.
- This may go without saying, but most macros assume standard key-mappings. If you're using non-standard ones, you may have to edit the macro to get it to work.
- Visiting liaisons can bring up screens that eat keystrokes, throwing a long-looping script out-of-phase with where it expects the game to be. Wait for the farewell screen before running a long script.
- The SendPlay function supports keys that the Send function does not, for example Shift-Enter. According to the AutoHotKey documentation, SendPlay may also be better at preventing dropped keystrokes.
Quickfort[edit]
Quickfort is an AutoHotkey-based utility for Dwarf Fortress that helps you build fortresses from "blueprint" .CSV files (comma separated values). These files are easily created and edited in an app like Excel. Most building-oriented DF commands are supported through the use of multiple .CSV files to describe the different phases of DF construction (designation, building, stockpiles, and making adjustments). Many of the examples below can be reproduced in Quickfort.
Built-in Macros[edit]
With the release of df_28_181_40d13, Dwarf Fortress supports macros without any outside program. They can be created by hitting escape to access the options menu and choosing the Key Bindings section. Once in the Key Bindings menu hit Shift+Tab to open the macro screen. The macros you create here are saved in the file "\data\init\interface.txt". Adding the following to the end of that file will create a macro that selects every item on the trade screen when you hit the tilde key (`).
[BIND:MACRO0] [SYM:`] [MACRO:SELECT:1] [MACRO:STANDARDSCROLL_DOWN:1] [MACRO:SELECT:1] [MACRO:STANDARDSCROLL_DOWN:1] [MACRO:SELECT:1] [MACRO:STANDARDSCROLL_DOWN:1] [MACRO:SELECT:1] [MACRO:STANDARDSCROLL_DOWN:1] [MACRO:SELECT:1] [MACRO:STANDARDSCROLL_DOWN:1] [MACRO:SELECT:1] [MACRO:STANDARDSCROLL_DOWN:1] [MACRO:SELECT:1] [MACRO:STANDARDSCROLL_DOWN:1] [MACRO:SELECT:1] [MACRO:STANDARDSCROLL_DOWN:1] [MACRO:SELECT:1] [MACRO:STANDARDSCROLL_DOWN:1] [MACRO:SELECT:1] [MACRO:STANDARDSCROLL_DOWN:1] [MACRO:SELECT:1] [MACRO:STANDARDSCROLL_DOWN:1] [MACRO:SELECT:1] [MACRO:STANDARDSCROLL_DOWN:1] [MACRO:SELECT:1] [MACRO:STANDARDSCROLL_DOWN:1]
Performance can be increased by changing the macro pause, MACRO_MS, from the default 150ms per command to zero. Most dig macros can be created using combinations of the following:
[MACRO:CURSOR_UP:1] [MACRO:CURSOR_DOWN:1] [MACRO:CURSOR_LEFT:1] [MACRO:CURSOR_RIGHT:1] [MACRO:SELECT:1] [MACRO:DESIGNATE_DIG:1] [MACRO:DESIGNATE_UNDO:1] [MACRO:CURSOR_UP_FAST:1] [MACRO:CURSOR_DOWN_FAST:1] [MACRO:CURSOR_LEFT_FAST:1] [MACRO:CURSOR_RIGHT_FAST:1] [MACRO:MACRO123:1]
Most of these should be self-explanatory. Each command is followed with a quantity. To call other macros, use
[MACRO:MACRO###:1]
Each new macro begins with a bind command, consisting of BIND, the macro number, and a description:
[BIND:MACRO11:dig_round_room]
Spaces are not allowed in the description[Verify]. To bind this macro to a key, SYM is used.
[SYM:Ctrl+Right]
Ctrl, Alt, and Shift combinations are allowed, but not chords with more than one[Verify], like Ctrl+Shift+Right. Also, the windows, or meta key, does not appear to be supported[Verify]. Macros appear to only be terminated by the start of a new macro (BIND command) or the end of the interface.txt file.
Visit this forum post for additional macros, and discussion on macro creation.
AutoHotKey Examples[edit]
Dumping[edit]
GuiDumper.ahk[edit]
This script allows the user to specify a range of squares to dump.
Stock Screen Dump[edit]
Taken from an old version of Jackard's user page.
To use, first have your bookkeeper do enough desk work so you can view individual items in the stocks listing. Then bring it up and press del to quickly mark stuff. To adjust the key repeat rate, edit the KEY_HOLD_MS value in \data\init\init.txt.
del:: IfWinActive Dwarf Fortress { send d{down} return } else { send {del} return }
Designation Dump[edit]
A dumping script by Dukederek:
This script uses a system similar the commands in the designations menu to mark most of the contents of a large area for dumping. My talk page has more detailed instruction.
Essentially you need to create two text files with the following titles and content. When playing DF it is safe to have blockdumpinit running constantly as long as you don't plan on using the ctrl-d combination for something else.
blockdumpinit.ahk
^d:: RunWait, "blockdumpmain.ahk" Return
blockdumpmain.ahk
SetKeyDelay 25 return:: Send k return up:: Send w return left:: Send a return down:: Send s return right:: Send d return q:: ExitApp return shift:: x := 0 y := 1 Loop{ Input, keypress, B, {esc} , w,a,s,d,k,q if keypress = w { y := --y Send {up} continue }else if keypress = s { y := ++y Send {down} continue }else if keypress = a { x := --x Send {left} continue }else if keypress = d { x := ++x Send {right} continue }else if keypress = k { break }else if keypress = q { ExitApp } } y := y / 2 z := y z := Floor(z) z := y/z Send d{NumpadAdd}d If z = 0 { If x = 0 ExitApp Else{ Loop %x%{ Send {left}d }ExitApp } }If z <> 1 { Loop %y%{ Loop %x%{ Send {left}d{NumpadAdd}d }Send {up}d Loop %x%{ Send {right}d{NumpadAdd}d }Send {up}d{NumpadAdd}d }Loop %x%{ Send {left}d{NumpadAdd}d } }Else If z = 1 { y := y + 0.5 Loop %y%{ Loop %x%{ Send {left}d{NumpadAdd}d }Send {up}d Loop %x%{ Send {right}d{NumpadAdd}d }Send {up}d{NumpadAdd}d }Send d{NumpadSub}d }ExitApp
Rewalling[edit]
Taken from Valdemar's user page.
This is a macro to aid with rewalling. To use, copy-paste the script into a new .ahk file and run the script with AutoHotkey. Then, in Dwarf Fortress, press b-C-w, move the cursor to where you want to start the wall, and hold Ctrl-Shift-Arrowkey, using the direction you want to rewall in. To build floors, press b-C-f instead, and use Ctrl-Alt-Arrowkey. To stop, just release the keys.
The script will use the first material in the list. I suggest you create a stockpile near the construction site that only accepts the item you wish to build with and temporarily forbid any nearby materials you don't want to build with.
$^+Left:: ProcessEvent("Left","w") $^+Right:: ProcessEvent("Right","w") $^+Up:: ProcessEvent("Up","w") $^+Down:: ProcessEvent("Down","w") $^!Left:: ProcessEvent("Left","f") $^!Right:: ProcessEvent("Right","f") $^!Up:: ProcessEvent("Up","f") $^!Down:: ProcessEvent("Down","f") ProcessEvent(direction, type) { Send {Enter} Sleep 100 Send {Enter} Sleep 100 Send %type% Sleep 100 Send {%direction%} Loop { if not GetKeyState(direction, "P") break Send {Enter} Sleep 100 Send {Enter} Sleep 100 Send %type% Sleep 100 Send {%direction%} } }
Grid-by-grid designation[edit]
For easier diagonal and fancy mining. Assumes that DF is active. "^!" means ctrl-alt-direction.
^!NumpadEnd:: send {Enter}{Enter}{NumpadEnd} return ^!NumpadDown:: send {Enter}{Enter}{NumpadDown} return ^!NumpadPgDn:: send {Enter}{Enter}{NumpadPgDn} return ^!NumpadLeft:: send {Enter}{Enter}{NumpadLeft} return ^!NumpadRight:: send {Enter}{Enter}{NumpadRight} return ^!NumpadHome:: send {Enter}{Enter}{NumpadHome} return ^!NumpadUp:: send {Enter}{Enter}{NumpadUp} return ^!NumpadPgUp:: send {Enter}{Enter}{NumpadPgUp} return
Embark Settings macros[edit]
These macros are used to ease the setup of skills and supplies before you embark.
Improved Food/Alcohol buying macro[edit]
This macro buys all the cost-2 food (that I have seen), as well as the four types of alcohol. Just press ctrl+f on the Items screen. It can deal with meat or drink that you already have, or is not currently featured. By Redfenix.
^f:: send ndwarven{SPACE}ale{RIGHT}{ENTER}{F9} send ndwarven{SPACE}rum{RIGHT}{ENTER}{F9} send ndwarven{SPACE}beer{RIGHT}{ENTER}{F9} send ndwarven{SPACE}wine{RIGHT}{ENTER}{F9} send ndonkey{SPACE}meat{RIGHT}{ENTER}{F9} send nchimpanzee{SPACE}meat{RIGHT}{ENTER}{F9} send ngazelle{SPACE}meat{RIGHT}{ENTER}{F9} send nbonobo{SPACE}meat{RIGHT}{ENTER}{F9} send nmule{SPACE}meat{RIGHT}{ENTER}{F9} send ndeer{SPACE}meat{RIGHT}{ENTER}{F9} send nraccoon{SPACE}meat{RIGHT}{ENTER}{F9} send nfox{SPACE}meat{RIGHT}{ENTER}{F9} send nrhesus{SPACE}macaque{SPACE}meat{RIGHT}{ENTER}{F9} send nhorse{SPACE}meat{RIGHT}{ENTER}{F9} send ngroundhog{SPACE}meat{RIGHT}{ENTER}{F9} send nmountain{SPACE}goat{SPACE}meat{RIGHT}{ENTER}{F9} send nhoary{SPACE}marmot{SPACE}meat{RIGHT}{ENTER}{F9} send ngorilla{SPACE}meat{RIGHT}{ENTER}{F9} send norangutan{SPACE}meat{RIGHT}{ENTER}{F9} send nsiamang{SPACE}meat{RIGHT}{ENTER}{F9} send nbilou{SPACE}meat{RIGHT}{ENTER}{F9} send npileated{SPACE}gibbon{SPACE}meat{RIGHT}{ENTER}{F9} send nmandrill{SPACE}meat{RIGHT}{ENTER}{F9} send nturtle{RIGHT}{ENTER}{F9}
'First Fortress' setup[edit]
This macro works with the default setup of DF, and starts you with (almost) the setup suggested in the "Your first fortress" tutorial. The amounts are adjustable with the variables at the top of the macro.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; materialplanner.ahk ; ; this is a ahk script to set up the embark settings roughly as ; ;suggested in the "your first fortress" tutorial. Inventory ; ;can be customized slightly. ; ; use ctrl+shift+e to run ; ; ; ; NOTEs: ; ; change variables to suit your desires ; ; the fourth guy is a Stonecrafter instead of Herbalist ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;; ;;VARIABLES;; ;;;;;;;;;;;;; PICKS = 2 ;number of picks to pack AXES = 1 ;number of axes to pack ANVILS = 0 ;number of anvils to pack MEATS = 7 ;how much meat to take, each buys one of each cheap type (total number depends on locale) DRINKS = 26 ;how many drinks to take, each one buys 4 drinks, one of each type SEEDS = 5 ;each increment buys 5 plump helmet spawn, 2 pig tail, and 2 rock nuts SetKeyDelay, 12 ;Key delay, to keep Dwarf Fortress from being overwhelmed. ;Set higher if you get weird results, or lower to get the ;script to run faster SLEEPTIME = 12 ;same thing, only used in the repeated key press loops though ;;;;;;;;;;;; ;;The code;; ;;;;;;;;;;;; ^+e:: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;remove all of the items Send {Tab} loop 105{ Send {NumpadSub} Sleep %SLEEPTIME% } Send {Tab} ;place the skills ;first guy ;Proficient Miner Send {right} loop 5{ Send {NumpadAdd} Sleep %SLEEPTIME% } ;novice appraiser Send {PgUp} loop 7{ Send {Up} Sleep %SLEEPTIME% } Send {NumpadAdd} ;novice Judge of Intent Send {Up} Send {NumpadAdd} ;competent gem setter Send {PgUp} Send {PgUp} loop 7{ Send {Up} Sleep %SLEEPTIME% } loop 3{ Send {NumpadAdd} Sleep %SLEEPTIME% } ;second guy Send {Left} Send {Down} Send {Right} Send {PgUp} ;Proficient Miner loop 5{ Send {NumpadAdd} Sleep %SLEEPTIME% } ;Proficient Mason loop 3{ Send {Down} Sleep %SLEEPTIME% } loop 5{ Send {NumpadAdd} Sleep %SLEEPTIME% } ;third guy Send {Left} Send {Down} Send {Right} ;Proficient Carpenter Send {UP} loop 5{ Send {NumpadAdd} Sleep %SLEEPTIME% } ;Proficient Wood Cutter Send {UP} loop 5{ Send {NumpadAdd} Sleep %SLEEPTIME% } ;fourth guy Send {Left} Send {Down} Send {Right} ;Proficient Grower Send {PgDn} Send {Down} Send {Down} loop 5{ Send {NumpadAdd} Sleep %SLEEPTIME% } ;Proficient Stone Crafter loop 9{ Send {Up} Sleep %SLEEPTIME% } loop 5{ Send {NumpadAdd} Sleep %SLEEPTIME% } ;fifth guy Send {Left} Send {Down} Send {Right} ;Proficient Mechanic loop 5{ Send {Down} Sleep %SLEEPTIME% } loop 5{ Send {NumpadAdd} Sleep %SLEEPTIME% } ;Proficient Building Designer Send {PgUp} loop 5{ Send {Down} Sleep %SLEEPTIME% } loop 5{ Send {NumpadAdd} Sleep %SLEEPTIME% } ;sixth guy Send {Left} Send {Down} Send {Right} ;Proficient Weaponsmith loop 1{ Send {Down} Sleep %SLEEPTIME% } loop 5{ Send {NumpadAdd} Sleep %SLEEPTIME% } ;Proficient Armorsmith loop 2{ Send {Down} Sleep %SLEEPTIME% } loop 5{ Send {NumpadAdd} Sleep %SLEEPTIME% } ;seventh guy Send {Left} Send {Down} Send {Right} ;Proficient Cook Send {PgDn} loop 2{ Send {Up} Sleep %SLEEPTIME% } loop 5{ Send {NumpadAdd} Sleep %SLEEPTIME% } ;Proficient Brewer loop 1{ Send {Up} Sleep %SLEEPTIME% } loop 5{ Send {NumpadAdd} Sleep %SLEEPTIME% } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;do the inventory Send {Tab} ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Meat if MEATS > 0 { tmp := MEATS - 1 send ndonkey{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send nchimpanzee{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send ngazelle{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send nbonobo{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send nmule{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send ndeer{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send nraccoon{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send nfox{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send nrhesus{SPACE}macaque{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send nhorse{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send ngroundhog{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send nmountain{SPACE}goat{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send nhoary{SPACE}marmot{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send ngorilla{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send norangutan{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send nsiamang{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send nbilou{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send npileated{SPACE}gibbon{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send nmandrill{SPACE}meat{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} send nturtle{RIGHT}{ENTER} loop %tmp%{ Send {NumpadAdd} } Send {F9} } ;copper picks if PICKS > 0 { Send {n}copper picks{Right}{Enter} tmp := PICKS - 1 loop %tmp%{ Send {NumpadAdd} Sleep %SLEEPTIME% } } ;Axes if AXES > 0 { Send {n}steel axes{Right}{Enter} tmp := AXES - 1 loop %tmp%{ Send {NumpadAdd} Sleep %SLEEPTIME% } } ;Seeds if SEEDS > 0 { send {n}Rock nuts{Right}{Enter} Send {NumpadAdd} send {n}plump helmet spawn{Right}{Enter} Send {NumpadAdd} Send {NumpadAdd} Send {NumpadAdd} Send {NumpadAdd} send {n}Pig tail Seeds{Right}{Enter} Send {NumpadAdd} tmp := SEEDS - 1 loop %tmp%{ Send {NumpadAdd} Send {NumpadAdd} } Send {up} loop %tmp%{ Send {NumpadAdd} Send {NumpadAdd} Send {NumpadAdd} Send {NumpadAdd} Send {NumpadAdd} } Send {up} loop %tmp%{ Send {NumpadAdd} Send {NumpadAdd} } } ;Anvils if ANVILS > 0 { Send {n}iron anvils{Right}{Enter} tmp := ANVILS - 1 loop %tmp%{ Send {NumpadAdd} Sleep %SLEEPTIME% } } ;Drinks if DRINKS > 0{ send {n}Dwarven ale{Right}{Enter} send {n}Dwarven beer{Right}{Enter} send {n}Dwarven wine{Right}{Enter} send {n}Dwarven rum{Right}{Enter} tmp := DRINKS - 1 loop 4{ loop %tmp%{ Send {NumpadAdd} } Send {up} } return
A more modular approach[edit]
Hit WIN+G to go once you are on the empty item screen
#g:: ;add an anvil Additem("iron anvils",1) ;add 31 of the boozes (kind of iffy might end up with dwarven cheese or something if the civilization does not have 4 boozes) Additem("dw",31) Additem("dw",31) Additem("dw",31) Additem("dw",31) ;adds copper nuggets Additem("copper n",5) ;adds cassiterite Additem("cass",5) ;bitumous coal Additem("coal",5) ;tower cap logs Additem("logs",11) return IsCurrentItemThere() { ;color of text in the new item screen 0xFFFF00(selected) or 0x808000 (unselected) ;location of text in the new item screen 305, 150 PixelSearch, , , 305, 150, 315, 160, 0x808000, 3, return !ErrorLevel } AddItem(name,amount) { Sleep 100 amount -= 1 SetKeyDelay 150 SendInput n SendInput %name% ;MsgBox Name Check Sleep 200 if IsCurrentItemThere() { Sleep 200 SendInput {Right} SendInput {Enter} Sleep 200 Loop { if amount <= 0 { break } SendInput {NumpadAdd} Sleep 10 amount -- } ;MsgBox Done } else { SendInput {F9} } }
Bed Assigning macro[edit]
This will assign bedrooms to your dwarves. Press F3 followed by a single digit indicating how many beds to assign. Can repeat the action, as the number of beds assigned is stored in a counter. Room size is default, but easily edited into the script. By Napsterbater.
bedcounter = 0 F3:: Input, counter, L1 SetKeyDelay, 100 loop %counter% { loop %bedcounter% send {Down} loop % A_Index - 1 send {Down} send {q}{r}{Enter}{a} loop %bedcounter% send {NumPadAdd} loop % A_Index - 1 send {NumPadAdd} send {NumPadAdd}{Enter} send {space}{r} } bedcounter += counter return
Room-designation macros[edit]
Valdemar's Designator Macro[edit]
This macro can read a spreadsheet and designate rooms according to it. Version 1
Version 2 of this macro apparently only works in versions up to and including 38c [Verify], and can be found here: Version 2
Fedor's chambered circle[edit]
A circular room with eight equal-sized chambers, suitable for everything from housing to workshops to a mausoleum.
See this macro in action
Macro text
Valdemar's bedroom complex[edit]
A large fractal bedroom/dining complex, with 56 bedrooms and room for 24 tables.
You can press Alt-B to create a bedroom block, or Alt-C to create a full complex with 4 bedroom blocks and a dining block in the center.
Note - the macro is much faster than the demo movie shows, it is done in under a minute.
Tulip's room macros[edit]
Based on the bedroom designs.
^g means alt+g, !g means ctrl+g, and so on. Open up the designations window before using these:
; This will make a basic 'x' pattern workshop/room layout ; and will 'land' back on the same tile it starts on each time, ; which happens to be the center. ; It is modified so that you will have 3 staircases, and an extra tile ; because many workshops do not have corner access. !r:: Send di2{enter}88{enter}4d{enter}4{enter}67{enter}77{enter}66666666 Send {enter}11{enter}1{enter}6{enter}114{enter}4{enter}2{enter}11{enter} Send 66666666{enter}77{enter}7{enter}6{enter}74 return ; This makes GnomeChomsky's Tessellated Apartments, bedrooms only. ; Your cursor will be over the left staircase. !g:: Send i999866{enter}{enter}33332{enter}{enter}11114{enter}{enter} Send d3{enter}22{enter}4{enter}{enter} Send 78{enter}44{enter}8{enter}{enter} Send 96{enter}88{enter}6{enter}{enter} Send 32{enter}66{enter}2{enter}{enter} Send 96{enter}{enter}6{enter}88{enter} Send 96{enter}{enter}8{enter}44{enter} Send 1444{enter}{enter}2{enter}66{enter} Send 88{enter}88{enter}6{enter}{enter} Send 78{enter}{enter}8{enter}44{enter} Send 78{enter}{enter}4{enter}22{enter} Send 14{enter}{enter}2{enter}66{enter} Send 66{enter}22{enter}4{enter}{enter} Send 14{enter}{enter}8{enter}44{enter} Send 78{enter}{enter}4{enter}22{enter} Send 14{enter}{enter}2{enter}66{enter} Send 32{enter}{enter}6{enter}88{enter}7i{enter}{enter} return ; This makes GnomeChomsky's Tessellated Apartments, bedrooms plus dining. ; Everything above applies. ^g:: Send i{enter}{enter}999866{enter}{enter}33332{enter}{enter}11114{enter}{enter}d Send 444{enter}{enter}2{enter}66{enter} Send 32{enter}{enter}6{enter}88{enter} Send 9966{enter}{enter}6{enter}88{enter} Send 96{enter}{enter}8{enter}44{enter} Send 7788{enter}{enter}8{enter}44{enter} Send 78{enter}{enter}4{enter}22{enter} Send 1144{enter}{enter}4{enter}22{enter} Send 14{enter}{enter}2{enter}66{enter} Send 36{enter}8886666666{enter} Send 9{enter}4444444{enter} Send 8{enter}6666{enter}744{enter}{enter} Send 222222441{enter}6666666{enter} Send {enter}22{enter}8{enter}4444{enter} Send 7778 return ; This makes THLawrence's Living Pods (the A is for Arabia). ; Put your cursor where you want the upper left staircase to be. ; Like my other scripts, it recenters on that tile. ; Also, thank you THLawrence, this one was really easy write! !a:: Send i{enter}{enter}d7{enter}7{enter}666{enter}3{enter}22{enter}1{enter}44{enter}7{enter} Send 96666666 Send i{enter}{enter}d7{enter}7{enter}666{enter}3{enter}22{enter}1{enter}44{enter}7{enter} Send 33222 Send i{enter}{enter}d7{enter}7{enter}666{enter}3{enter}22{enter}1{enter}44{enter}7{enter} Send 7444 Send i{enter}{enter}d7{enter}7{enter}666{enter}3{enter}22{enter}1{enter}44{enter}7{enter} Send 9988888 return ; This makes the lobby for THLawrence's Living pods. ^a:: Send i{enter}{enter}d7{enter}7{enter}666{enter}3{enter}66{enter}9{enter}66{enter}3{enter}41i{enter}{enter} Send 36d{enter}1444444{enter} Send 74{enter}1{enter}22{enter}3{enter}3i{enter}{enter}d1{enter}1{enter}666{enter}9{enter} Send 66{enter}3{enter}66{enter}9{enter}88{enter}7{enter}74{enter}1144{enter} Send 36666i{enter}{enter}777777 return
LordGrunt's room macro[edit]
Based on 1 of the fractal bedroom designs.
; ; Fractal Apts ; Start script while in 'dig' mode with cursor on desired position of left up staircase ; ; ALT+G to generate, ; CTRL+ALT+G to erase in case of failure ; !g:: base_cross() sleep 100 mid_sqr() sleep 100 corridors() sleep 100 all_rooms() return base_cross() { Send i{ENTER}3{ENTER} Send d1{ENTER}6{SHIFT}+2{SHIFT}+2{SHIFT}+2{SHIFT}+28{ENTER} Send d{SHIFT}+8{SHIFT}+8{SHIFT}+8{SHIFT}+888{ENTER}4{SHIFT}+8{SHIFT}+8{SHIFT}+8{SHIFT}+82{ENTER} Send d{SHIFT}+2{SHIFT}+2{SHIFT}+2{SHIFT}+24{ENTER}2{SHIFT}+4{SHIFT}+4{SHIFT}+4{SHIFT}+46{ENTER} Send d{SHIFT}+6{SHIFT}+6{SHIFT}+6{SHIFT}+666{ENTER}8{SHIFT}+6{SHIFT}+6{SHIFT}+6{SHIFT}+64{ENTER} Send d{SHIFT}+4{SHIFT}+4{SHIFT}+4{SHIFT}+4474{SHIFT}+8{SHIFT}+888888{ENTER}66666{SHIFT}+2{SHIFT}+2{SHIFT}+2{SHIFT}+2{SHIFT}+2222{ENTER}8 Send d{SHIFT}+8{SHIFT}+88884488888{SHIFT}+6{SHIFT}+6666666{ENTER}22222{SHIFT}+4{SHIFT}+4{SHIFT}+4{SHIFT}+4{SHIFT}+4444{ENTER}6 } mid_sqr() { Send d{SHIFT}+3666 send d{ENTER}{SHIFT}+9{SHIFT}+999999{ENTER}1{ENTER}9999{ENTER}9{ENTER}111{ENTER} send d{SHIFT}+1{SHIFT}+1{SHIFT}+1{ENTER}999{ENTER}99{ENTER}1111{ENTER}99 send d{SHIFT}+8{SHIFT}+8{SHIFT}+8444{ENTER}333{ENTER}33{ENTER}7777{ENTER} send d{SHIFT}+3{SHIFT}+3{SHIFT}+37{ENTER}333{ENTER}7{ENTER}7777{ENTER} } corridors() { send d{SHIFT}+7{SHIFT}+7{SHIFT}+7999{ENTER}{SHIFT}+6{SHIFT}+6{SHIFT}+66{ENTER} send d333333{ENTER}{SHIFT}+2{SHIFT}+2{SHIFT}+22{ENTER} send d111111{ENTER}{SHIFT}+4{SHIFT}+4{SHIFT}+44{ENTER} send d777777{ENTER}{SHIFT}+8{SHIFT}+8{SHIFT}+88{ENTER} sleep 100 send d3333222{ENTER}{SHIFT}+466{ENTER} send d{SHIFT}+2{SHIFT}+2888{ENTER}{SHIFT}+644{ENTER} send d{SHIFT}+9{SHIFT}+9{SHIFT}+6{SHIFT}+6333 send d{ENTER}{SHIFT}+466{ENTER} send d{SHIFT}+2{SHIFT}+2888{ENTER}{SHIFT}+644{ENTER} sleep 100 send d{SHIFT}+4{SHIFT}+1966 send d{ENTER}{SHIFT}+288{ENTER} send d{SHIFT}+4{SHIFT}+4666{ENTER}{SHIFT}+822{ENTER} sleep 100 send d{SHIFT}+9{SHIFT}+9{SHIFT}+8{SHIFT}+8777 send d{ENTER}{SHIFT}+288{ENTER} send d{SHIFT}+4{SHIFT}+4666{ENTER}{SHIFT}+822{ENTER} sleep 100 send d999988{ENTER}{SHIFT}+64{ENTER} send d{SHIFT}+3{SHIFT}+3{SHIFT}+3777{ENTER}{SHIFT}+28{ENTER} send d{SHIFT}+1{SHIFT}+1{SHIFT}+1999{ENTER}{SHIFT}+46{ENTER} send d{SHIFT}+7{SHIFT}+7{SHIFT}+7333{ENTER}{SHIFT}+82{ENTER} } rooms_up() { send d78{ENTER}96{ENTER} send d223{ENTER}32{ENTER} send d44444{ENTER}87{ENTER} send d63{ENTER}{ENTER}98{ENTER}{ENTER}23{ENTER}{ENTER}7 } rooms_down() { send d32{ENTER}14{ENTER} send d887{ENTER}78{ENTER} send d66666{ENTER}32{ENTER} send d74{ENTER}{ENTER}21{ENTER}{ENTER}78{ENTER}{ENTER}3 } rooms_left() { send d14{ENTER}87{ENTER} send d996{ENTER}63{ENTER} send d2222{ENTER}41{ENTER} send d98{ENTER}{ENTER}47{ENTER}{ENTER}96{ENTER}{ENTER}1 } rooms_right() { send d96{ENTER}32{ENTER} send d114{ENTER}47{ENTER} send d8888{ENTER}96{ENTER} send d21{ENTER}{ENTER}63{ENTER}{ENTER}14{ENTER}{ENTER}9 } ;======= WIDE rooms_upw() { send d78{ENTER}966{ENTER} send d223{ENTER}32{ENTER} send d444444{ENTER}87{ENTER} send d63{ENTER}{ENTER}98{ENTER}6{ENTER}23{ENTER}{ENTER}74 } rooms_downw() { send d32{ENTER}144{ENTER} send d887{ENTER}78{ENTER} send d666666{ENTER}32{ENTER} send d74{ENTER}{ENTER}21{ENTER}4{ENTER}78{ENTER}{ENTER}36 } rooms_leftw() { send d14{ENTER}887{ENTER} send d996{ENTER}63{ENTER} send d22222{ENTER}41{ENTER} send d98{ENTER}{ENTER}47{ENTER}8{ENTER}96{ENTER}{ENTER}12 } rooms_rightw() { send d96{ENTER}322{ENTER} send d114{ENTER}47{ENTER} send d88888{ENTER}96{ENTER} send d21{ENTER}{ENTER}63{ENTER}2{ENTER}14{ENTER}{ENTER}98 } ;============ rooms3up() { send d8888888 rooms_up() send d1111222 rooms_left() send d66666666 rooms_right() send d4444 } rooms3down() { send d2222222 rooms_down() send d7777888 rooms_left() send d66666666 rooms_right() send d4444 } rooms3left() { send d4444444 rooms_left() send d9999666 rooms_up() send d22222222 rooms_down() send d8888 } rooms3right() { send d6666666 rooms_right() send d7777444 rooms_up() send d22222222 rooms_down() send d8888 } ;========== all_rooms() { ;left wide: rooms_up() send d222222222 rooms_down() send d7777444 rooms_leftw() ;bottom wide: send d{SHIFT}+3{SHIFT}+3{SHIFT}+3{SHIFT}+378 rooms_downw() send d9999888 rooms_right() send d444444444 rooms_left() ;right wide: send d{SHIFT}+9{SHIFT}+9{SHIFT}+999{SHIFT}+66 rooms_rightw() send d7777444 rooms_up() send d222222222 rooms_down() ;top wide send d{SHIFT}+7{SHIFT}+7{SHIFT}+777{SHIFT}+88 rooms_upw() send d1111222 rooms_left() send d666666666 rooms_right() ;remainin 9-room chambers send d{SHIFT}+26666 rooms3right() send d{SHIFT}+4{SHIFT}+4666 rooms3left() send d{SHIFT}+1111 rooms3up() send d{SHIFT}+2{SHIFT}+2888 rooms3down() send d{SHIFT}+3333 rooms3left() send d{SHIFT}+6{SHIFT}+6444 rooms3right() send d{SHIFT}+9999 rooms3down() send d{SHIFT}+8{SHIFT}+8222 rooms3up() ;send d{SHIFT}+7777 ;rooms3right() ;send d{SHIFT}+2{SHIFT}+4666 ;rooms3left() send d1111144499{ENTER}{SHIFT}+1{SHIFT}+4{SHIFT}+41{ENTER} send d77444444444{ENTER}8888888{SHIFT}+6{SHIFT}+6{SHIFT}+6{SHIFT}+6{SHIFT}+6666{ENTER} send d{SHIFT}+7{SHIFT}+487{ENTER}{SHIFT}+1{SHIFT}+2{SHIFT}+21{ENTER} send d33222222222{ENTER}6666666{SHIFT}+8{SHIFT}+8{SHIFT}+8{SHIFT}+8{SHIFT}+8888{ENTER} send d{SHIFT}+2{SHIFT}+2221111 send i{ENTER}3{ENTER}7 deco() } deco() { send x77774{ENTER}{ENTER}9{ENTER}{ENTER}6669{ENTER}6{ENTER}3666{ENTER}{ENTER}3{ENTER}{ENTER} send x2223{ENTER}2{ENTER}1222{ENTER}{ENTER}1{ENTER}{ENTER}1444{ENTER}4{ENTER}4447 send x{ENTER}{ENTER}7{ENTER}{ENTER}7888{ENTER}8{ENTER}666666 } ; CTRL+ALT+G to erase all !^g:: send x{SHIFT}+1{SHIFT}+1{SHIFT}+1{SHIFT}+1{SHIFT}+1{ENTER}{SHIFT}+9{SHIFT}+9{SHIFT}+9{SHIFT}+9{SHIFT}+9{SHIFT}+9{SHIFT}+9{SHIFT}+9{SHIFT}+9{SHIFT}+9{ENTER}{SHIFT}+1{SHIFT}+1{SHIFT}+1{SHIFT}+1{SHIFT}+1 return
Pyrofyr's room macro[edit]
Based on Palin88's Apartment design based on Raynard's Fractal Design.
/* * Macro by Pyrofyr for Room Design -- Cleaned up by 0x517A5D * Enter (d)esignate mode, position the cursor where you want the * middle of the design to be, then press Ctrl+Alt+D to start the Macro. */ ;Attn Pyrofor: for slash-star style comments, the ending star-slash must ;be the first thing on its line. Otherwise the comment isn't terminated. #SingleInstance Force #IfWinActive, Dwarf Fortress SetKeyDelay 0,, Play ; Ctrl+Alt+D ^!d:: send d{NumPadUp 18}{NumPadLeft 18} ;Attn Pyrofor: note how repeated keystrokes are done in AHK. ;no need for tehLoop(). directions() send {NumPadRight 18} directions() send {NumPadLeft 18} send {NumPadDown 18} directions() send {NumPadRight 18} directions() middle() stairs() return directions() { ;hallway box send {Enter}{NumPadRight 18}{Enter} send {Enter}{NumPadDown 18}{Enter} send {Enter}{NumPadLeft 18}{Enter} send {Enter}{NumPadUp 18}{Enter} ;indentations on box send {Enter}{NumPadRight 1}{NumPadDown 2}{Enter} send {NumPadDown 6}{Enter}{NumPadDown 2}{NumPadRight 1}{Enter} send {NumPadLeft 1}{NumPadDown 6}{Enter}{NumPadDown 1}{Enter} send {NumPadRight 6}{Enter}{NumPadRight 4}{Enter} send {NumPadRight 6}{Enter}{NumPadUp 1}{Enter} send {NumPadUp 6}{Enter}{NumPadUp 2}{NumPadLeft 1}{Enter} send {NumPadRight 1}{NumPadUp 6}{Enter}{NumPadUp 1}{Enter} send {NumPadLeft 6}{Enter}{NumPadLeft 4}{Enter} ; middle hallways send {NumPadRight 2}{Enter}{NumPadDown 6}{Enter} send {NumPadRight 1}{Enter}{NumPadDown 4}{NumPadLeft 2}{Enter} send {NumPadRight 1}{Enter}{NumPadDown 6}{Enter} send {NumPadUp 8}{NumPadLeft 6}{Enter}{NumPadRight 14}{Enter} ; cross apartments, horizontal segments send {NumPadDown 4}{Enter}{NumPadLeft 2}{Enter} send {NumPadDown 1}{NumPadLeft 3}{Enter}{NumPadLeft 6}{Enter} send {NumPadUp 1}{NumPadLeft 3}{Enter}{NumPadLeft 2}{Enter} send {NumPadDown 3}{NumPadRight 2}{Enter}{NumPadRight 2}{Enter} send {NumPadRight 8}{Enter}{NumPadRight 2}{Enter} send {NumPadUp 5}{NumPadLeft 1}{Enter}{NumPadLeft 2}{Enter} send {NumPadLeft 6}{Enter}{NumPadLeft 2}{Enter} send {NumPadUp 4}{Enter}{NumPadRight 2}{Enter} send {NumPadRight 6}{Enter}{NumPadRight 2}{Enter} send {NumPadRight 3}{NumPadUp 2}{Enter}{NumPadLeft 2}{Enter} send {NumPadUp 1}{NumPadLeft 3}{Enter}{NumPadLeft 6}{Enter} send {NumPadDown 1}{NumPadLeft 3}{Enter}{NumPadLeft 2}{Enter} send {NumPadUp 3}{NumPadRight 2}{Enter}{NumPadRight 2}{Enter} send {NumPadRight 8}{Enter}{NumPadRight 2}{Enter} ; cross apartments, vertical segments send {NumPadRight 1}{NumPadDown 2}{Enter}{NumPadDown 2}{Enter} send {NumPadDown 6}{Enter}{NumPadDown 2}{Enter} send {NumPadDown 3}{NumPadLeft 2}{Enter}{NumPadUp 2}{Enter} send {NumPadLeft 1}{NumPadUp 3}{Enter}{NumPadUp 6}{Enter} send {NumPadRight 1}{NumPadUp 3}{Enter}{NumPadUp 2}{Enter} send {NumPadLeft 3}{NumPadDown 2}{Enter}{NumPadDown 2}{Enter} send {NumPadDown 8}{Enter}{NumPadDown 2}{Enter} send {NumPadLeft 4}{Enter}{NumPadUp 2}{Enter} send {NumPadUp 8}{Enter}{NumPadUp 2}{Enter} send {NumPadUp 2}{NumPadLeft 3}{Enter}{NumPadDown 2}{Enter} send {NumPadRight 1}{NumPadDown 3}{Enter}{NumPadDown 6}{Enter} send {NumPadLeft 1}{NumPadDown 3}{Enter}{NumPadDown 2}{Enter} send {NumPadLeft 2}{NumPadUp 3}{Enter}{NumPadUp 2}{Enter} send {NumPadUp 6}{Enter}{NumPadUp 2}{Enter} send {NumPadUp 4}{NumPadLeft 2} } middle() { send {NumPadUp 10}{NumPadLeft 2}{Enter}{NumPadRight 4}{NumPadDown 20}{Enter} send {NumPadUp 5}{NumPadRight 1}{Enter}{NumPadUp 10}{NumPadLeft 6}{Enter} send {NumPadLeft 1}{NumPadDown 1}{Enter}{NumPadDown 8}{NumPadRight 8}{Enter} send {NumPadUp 2}{NumPadRight 1}{Enter}{NumPadUp 4}{NumPadLeft 10}{Enter} send {NumPadDown 1}{NumPadLeft 6}{Enter}{NumPadDown 2}{NumPadRight 22}{Enter} send {NumPadUp 1}{NumPadLeft 11} } stairs() { send i{NumPadUp 18}{NumPadLeft 9}{Enter 2} send {NumPadRight 18}{Enter 2} send {NumPadRight 9}{NumPadDown 9}{Enter 2} send {NumPadLeft 18}{Enter 2} send {NumPadLeft 18}{Enter 2} send {NumPadRight 9}{NumPadDown 9}{Enter 2} send {NumPadRight 18}{Enter 2} send {NumPadRight 9}{NumPadDown 9}{Enter 2} send {NumPadLeft 18}{Enter 2} send {NumPadLeft 18}{Enter 2} send {NumPadDown 9}{NumPadRight 9}{Enter 2} send {NumPadRight 18}{Enter 2} send {NumPadLeft 9}{NumPadUp 18} }
Easy Exploration Mining in 2 steps[edit]
This macro will make a 5 row, 11 column UP/DOWN stairway grid (2 empty spaces between each row/column).
Starting point as indicated (row 3, column 11)
MUST BE IN DESIGNATION MODE WITH CURSOR AT THE <-- START HERE LOCATION
Link is <ctrl> <windowskey> `
Dive is <ctrl> <alt> `
Link X--X--X--X--X--X--X--X--X--X--X | | | | | | X--X--X--X--X--X--X--X--X--X--X | | | | | | X--X--X--X--X--X--X--X--X--X--X <-- start here | | | | | | X--X--X--X--X--X--X--X--X--X--X | | | | | | X--X--X--X--X--X--X--X--X--X--X
Filename is ExploreMine-Link.ahk
;Link ^#`:: send d send {Enter} tehLoop(30,"{NumPadLeft}") send {Enter} send {Enter} tehLoop(6,"{NumPadUp}") send {Enter} send {Enter} tehLoop(30,"{NumPadRight}") send {Enter} send {Enter} tehLoop(12,"{NumPadDown}") send {Enter} send {Enter} tehLoop(30,"{NumPadLeft}") send {Enter} send {Enter} tehLoop(9,"{NumPadUp}") send {Enter} send {Enter} tehLoop(30,"{NumPadRight}") send {Enter} tehLoop(6,"{NumPadDown}") send {Enter} tehLoop(30,"{NumPadLeft}") send {Enter} tehLoop(3,"{NumPadDown}") tehLoop(15,"{NumPadRight}") send {Enter} tehLoop(12,"{NumPadUp}") send {Enter} tehLoop(15,"{NumPadLeft}") send i send {Enter}{Enter} tehOtherLoop("{NumPadDown}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadUp}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadDown}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadUp}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadDown}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadUp}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadDown}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadUp}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadDown}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadUp}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadDown}") tehLoop(6,"{NumPadUp}") tehLoop(tehTimes,tehDir) { loop { if tehTimes <= 0 { break } send %tehDir% tehTimes-- } } tehOtherLoop(tehOtherDir) { loop 4 { tehLoop(3,tehOtherDir) send {Enter}{Enter} } }
Dive X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X <-- start here X X X X X X X X X X X X X X X X X X X X X X
Filename is ExploreMine-Dive.ahk
;Dive ^!`:: tehLoop(30,"{NumPadLeft}") tehLoop(6,"{NumPadUp}") send i send {Enter}{Enter} tehOtherLoop("{NumPadDown}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadUp}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadDown}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadUp}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadDown}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadUp}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadDown}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadUp}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadDown}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadUp}") tehLoop(3,"{NumPadRight}") send {Enter}{Enter} tehOtherLoop("{NumPadDown}") tehLoop(6,"{NumPadUp}") tehLoop(tehTimes,tehDir) { loop { if tehTimes <= 0 { break } send %tehDir% tehTimes-- } } tehOtherLoop(tehOtherDir) { loop 4 { tehLoop(3,tehOtherDir) send {Enter}{Enter} } }
Fancy Exploration Mining[edit]
This script digs a connected series of mine shafts, as in Mineshaft Stitching. Start this script in the upper-left corner of the area you want to explore. Set the spacing to a value greater than 1 if you want to look for large clusters. Note that this pattern creates a very long walkway back to the start of the mineshafts. If you do not excavate routinely, consider connecting the top-level paths of areas you have already explored.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; stitching.ahk ; ; this is an ahk script to place exploratory mine shafts. ; ; press d and place the cursor ; ; in the top left corner of the area to be explored ; ; then use ctrl+shift+s to run ; ; to change parameters, use ctrl+shift+c ; ; Increasing spacing will increase some shafts ; ; This version resets it's state so that it can be re-run ; ; without having to reload the script ; ; ; ; NOTE: ; ; Author: Corey Amend ; ; Based on a script by Seth Fogarty, ; ; Which was based on a script by StrawberryBunny ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; x = 4 y = 4 depth = 3 wait = 100 spacing = 1 vdir = +. DropShaft(vertdir, depth, wait) { Send i Send {Enter} Send {Enter} Loop %depth% { Send %vertdir% Send {Enter} Send {Enter} Sleep %wait% } } ^+c:: inputbox x, Input Length, Vertical pattern length: x-axis inputbox y, Input Width, Horizontal pattern width: y-axis inputbox depth, Input Depth, Mineshaft depth: z-axis inputbox spacing, Input Spacing, Spacing multiplier (1 for complete visiblity) inputbox wait, Input Delay, Delay in miliseconds (100 recommended) return ^+s:: shafts := (x * y) -1 i := x-1 hdir = {Down} next = {Up} Loop %shafts% { DropShaft(vdir, depth, wait) if (vdir = "+.") { vdir = +, } else { vdir = +. } Send d k := spacing-1 Send %hdir% Send {Enter} Loop %k% { Send %hdir% Send {Enter} Send %hdir% Send {Enter} Send %hdir% Sleep %wait% } Send %hdir% Send {Enter} Send %hdir% Sleep %wait% i-- if (i = 0) { if (hdir = "{Down}") { hdir = {Right} next = {Up} i=1 } else if (hdir = "{Right}") { hdir = %next% i := x-1 } else if (hdir = "{Up}") { hdir = {Right} next = {Down} i=1 } } } DropShaft(vdir, depth, wait) if (vdir = "+.") { Loop %depth% { Send +, } } else { vdir = +. } return
Upstairs Mineshaft Finisher[edit]
This script is used to create a series of up staircases in a pattern for use with mineshaft scripts (like the mineshaft stitching above). Most mineshaft scripts use up/down staircases all the way to the bottom, but the lowest z-level will not allow up/down staircases so you mineshafts will be unfinished. This script allows you to correct this problem and place up stairs where the up/down stairs would be.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Upstair stitching.ahk ; ; this is an ahk script to place up stairs at regular ; ; intervals (useful for completing mine shafts). ; ; press d and place the cursor ; ; in the top left corner of the area to be explored ; ; then use ctrl+shift+u to run ; ; to change parameters, use ctrl+shift+p ; ; Increasing spacing will increase some shafts ; ; ; ; NOTE: ; ; Author: Corey Amend ; ; Based on a script by Seth Fogarty, ; ; Which was based on a script by StrawberryBunny ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; x = 4 y = 4 wait = 100 spacing = 1 vdir = +. ^+p:: inputbox x, Input Length, Vertical pattern length: x-axis inputbox y, Input Width, Horizontal pattern width: y-axis inputbox spacing, Input Spacing, Spacing multiplier (1 for complete visiblity) inputbox wait, Input Delay, Delay in miliseconds (100 recommended) return ^+u:: shafts := (x * y) -1 i := x-1 hdir = {Down} next = {Up} Loop %shafts% { Send u Send {Enter} Send {Enter} Sleep %wait% k := spacing-1 Send %hdir% Loop %k% { Send %hdir% Send %hdir% Send %hdir% Sleep %wait% } Send %hdir% Send %hdir% Sleep %wait% i-- if (i = 0) { if (hdir = "{Down}") { hdir = {Right} next = {Up} i=1 } else if (hdir = "{Right}") { hdir = %next% i := x-1 } else if (hdir = "{Up}") { hdir = {Right} next = {Down} i=1 } } } Send u Send {Enter} Send {Enter} Sleep %wait% return
Interface Enhancement Scripts[edit]
The MOUSE control[edit]
For unrivaled mouse control in DF try this DF Mouse script
Tile Counter or Scrolling Accelerator[edit]
Lack of reference plus slow scroll speed make planning digging area frustrating,so here is the script that shows coordinate and speed scrolling up. ShowXY
4-Pour Water Creation script[edit]
For Automating creation of water using Gibbeds Tweak.
; ; 4-pour.ahk ; Dwarf fortress water creation script. ; ;Use this script in conjunction with Gibbeds Dwarf Fortress Tweak to create endless amounts of water.; ; ;Directions ; ;1. Have DF running and position the screen such that when you press "K" the X will appear where you ;want the water to appear. ;2. Have Gbbed's Dwarf Fortress tweak running in the background (with the proper process selected) ;3. run the 4-pour script ;4. press alt-p to get Pouring ; ;The script will then begin a cycle that moves the cursor around in a little 2x2 square editing each ;tile to have 7/7 of water, it then pauses for a half a seond to let the water flow a bit, and repeats. ;It does this until you.. ; ;5. press and hold <shift> to stop ; ;As always, save before you experiment with this ;I hold no responsibility for what this script ends up doing to your dwarves/fortress/computer/carpet ;Feel free to clean it up, make it more usable, whatever ; ; #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. SendMode Input ; Recommended for new scripts due to its superior speed and reliability. SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. !p:: loop { GetKeyState, state, Shift if state = D Break IfWinActive Dwarf Fortress { WinActivate } send k sleep 100 send {NumpadRight} IfWinExist Gibbed's Dwarf Fortress Tweak [1.2.0.0] { WinActivate } click 38, 184, 2 sleep 100 IfWinExist Tile Edit { WinActivate } sleep 100 click 63, 448 sleep 100 click 106, 70 sleep 100 click 207, 255 sleep 100 send {backspace} sleep 100 send 7 sleep 100 click 348, 449 sleep 100 IfWinExist Dwarf Fortress { WinActivate } sleep 100 send {NumpadDown} IfWinExist Gibbed's Dwarf Fortress Tweak [1.2.0.0] { WinActivate } click 38, 184, 2 sleep 100 IfWinExist Tile Edit { WinActivate } sleep 100 click 63, 448 sleep 100 click 106, 70 sleep 100 click 207, 255 sleep 100 send {backspace} sleep 100 send 7 sleep 100 click 348, 449 sleep 100 IfWinExist Dwarf Fortress { WinActivate } sleep 100 send {NumpadLeft} IfWinExist Gibbed's Dwarf Fortress Tweak [1.2.0.0] { WinActivate } click 38, 184, 2 sleep 100 IfWinExist Tile Edit { WinActivate } sleep 100 click 63, 448 sleep 100 click 106, 70 sleep 100 click 207, 255 sleep 100 send {backspace} sleep 100 send 7 sleep 100 click 348, 449 sleep 100 IfWinExist Dwarf Fortress { WinActivate } sleep 100 send {NumpadUp} IfWinExist Gibbed's Dwarf Fortress Tweak [1.2.0.0] { WinActivate } click 38, 184, 2 sleep 100 IfWinExist Tile Edit { WinActivate } sleep 100 click 63, 448 sleep 100 click 106, 70 sleep 100 click 207, 255 sleep 100 send {backspace} sleep 100 send 7 sleep 100 click 348, 449 sleep 100 IfWinExist Dwarf Fortress { WinActivate } send {space} sleep 800 }
Tesselated Apartments Builder[edit]
This one is another tesselated apartments script, with some larger areas added. Credit for layout to GnomeChomsky.
; ; TessApts.ahk ; Start script while in 'dig' mode with cursor on desired position of leftmost staircase ; ; CTRL+G : Central room, 8 apartments (necessary on at least one z-level) ; ALT+G : No central room, 16 apartments ; CTRL+ALT+G : Four "central room" layouts connected in center (28 apartments) ; CTRL+SHIFT+G : Four "16 apartment" layouts, unconnected in center ; !g:: Send i{ENTER}{ENTER}33332{ENTER}{ENTER}99996{ENTER}{ENTER}77778{ENTER}{ENTER} Send d7{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 111{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 333333{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER} Send 99999988{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}114444444 return ^g:: Send i{ENTER}{ENTER}33332{ENTER}{ENTER}99996{ENTER}{ENTER}77778{ENTER}{ENTER} Send d7{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 111{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 333333{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER} Send 99999988{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER} Send 7444{ENTER}{ENTER}1114{ENTER}{ENTER}3332{ENTER}{ENTER}9996{ENTER}{ENTER}788{ENTER}11111{ENTER} return !^g:: Send i{ENTER}{ENTER}33332{ENTER}{ENTER}99996{ENTER}{ENTER}77778{ENTER}{ENTER} Send d7{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 111{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 333333{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER} Send 99999988{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER} Send 7444{ENTER}{ENTER}1114{ENTER}{ENTER}3332{ENTER}{ENTER}9996{ENTER}{ENTER}788{ENTER}11111{ENTER}88899999999 Send i{ENTER}{ENTER}33332{ENTER}{ENTER}99996{ENTER}{ENTER}77778{ENTER}{ENTER} Send d7{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 111{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 333333{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER} Send 99999988{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER} Send 7444{ENTER}{ENTER}1114{ENTER}{ENTER}3332{ENTER}{ENTER}9996{ENTER}{ENTER}788{ENTER}11111{ENTER}3333332 Send i{ENTER}{ENTER}33332{ENTER}{ENTER}99996{ENTER}{ENTER}77778{ENTER}{ENTER} Send d7{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 111{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 333333{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER} Send 99999988{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER} Send 7444{ENTER}{ENTER}1114{ENTER}{ENTER}3332{ENTER}{ENTER}9996{ENTER}{ENTER}788{ENTER}11111{ENTER}111114444444 Send i{ENTER}{ENTER}33332{ENTER}{ENTER}99996{ENTER}{ENTER}77778{ENTER}{ENTER} Send d7{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 111{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 333333{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER} Send 99999988{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER} Send 7444{ENTER}{ENTER}1114{ENTER}{ENTER}3332{ENTER}{ENTER}9996{ENTER}{ENTER}788{ENTER}11111{ENTER} Send 9988888888{ENTER}999{ENTER}+444444 return +^g:: Send i{ENTER}{ENTER}33332{ENTER}{ENTER}99996{ENTER}{ENTER}77778{ENTER}{ENTER} Send d7{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 111{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 333333{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER} Send 99999988{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}888889 Send i{ENTER}{ENTER}33332{ENTER}{ENTER}99996{ENTER}{ENTER}77778{ENTER}{ENTER} Send d7{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 111{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 333333{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER} Send 99999988{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}+221 Send i{ENTER}{ENTER}33332{ENTER}{ENTER}99996{ENTER}{ENTER}77778{ENTER}{ENTER} Send d7{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 111{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 333333{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER} Send 99999988{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}+1+46 Send i{ENTER}{ENTER}33332{ENTER}{ENTER}99996{ENTER}{ENTER}77778{ENTER}{ENTER} Send d7{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 111{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER} Send 333333{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}32{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER} Send 99999988{ENTER}66{ENTER}2{ENTER}{ENTER}14{ENTER}22{ENTER}4{ENTER}{ENTER}78{ENTER}44{ENTER}8{ENTER}{ENTER}96{ENTER}88{ENTER}6{ENTER}{ENTER}+71144444
File pattern builder[edit]
This is a script to create a macro out of any building pattern you like. If you like tesselated, this script will do it. If you like blocky, this script can do that, too. Just create a text file that contains the pattern you want to use and this macro will create it like nobody's business.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; File Pattern.ahk ; ; this is an ahk script to read a text file and use ; ; the pattern contained inside as a blueprint for digging ; ; press d and place the cursor ; ; in a corner of the area to be explored ; ; then use ctrl+shift+d to run ; ; to change parameters, use ctrl+shift+f ; ; ; ; NOTE: ; ; Author: Corey Amend ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; filename = C:\pattern.txt loc = ul wait = 100 wallsymbol = 1 floorsymbol = 0 updownsymbol = 2 downsymbol = 3 upsymbol = 4 rampsymbol = 5 channelsymbol = 6 digcommand = d upcommand = u downcommand = j updowncommand = i rampcommand = r channelcommand = h hdir = {Right} vdir = {Down} upperleft = ul upperright = ur lowerleft = ll lowerright = lr inrun = 0 ^+f:: inputbox filename, Enter Path, Enter the full path to the file that contains the pattern to use inputbox loc, Enter Cursor Location, Enter the location of the cursor within the pattern (Upper Left = ul`, Lower Right = lr...etc.) inputbox wait, Enter Delay, Enter the delay to use (default is 100) return ^+d:: IfExist, %filename% { FileRead, contents, %filename% StringSplit Array, contents, `r, `n if (loc = upperleft) { hdir = {Right} vdir = {Down} } else if (loc = upperright) { hdir = {Left} vdir = {Down} } else if (loc = lowerleft) { hdir = {Right} vdir = {Up} } else if (loc = lowerright) { hdir = {Left} vdir = {Up} } else { MsgBox, Invalid cursor location! return } Loop %Array0% { if (loc = upperleft || loc = upperright) { current_line = %a_index% } else if (loc = lowerleft || loc = lowerright) { current_line := (Array0 - a_index + 1) } current_value := Array%current_line% len := StrLen(current_value) if (hdir = "{Left}") { new_value = Loop %len% { new_value := new_value . SubStr(current_value, (len - a_index) + 1, 1) } current_value := new_value } Loop %len% { current_char := SubStr(current_value, a_index, 1) if (current_char != wallsymbol) { if (!inrun) { if (current_char = floorsymbol) { Send %digcommand% } else if (current_char = updownsymbol) { Send %updowncommand% } else if (current_char = downsymbol) { Send %downcommand% } else if (current_char = upsymbol) { Send %upcommand% } else if (current_char = rampsymbol) { Send %rampcommand% } else if (current_char = channelsymbol) { Send %channelcommand% } Send {Enter} inrun = 1 } ;;If we're at the end of a line or the next char is different, then end the run if ((a_index >= len) || (current_char != SubStr(current_value, a_index + 1, 1))) { Send {Enter} inrun = 0 Sleep %wait% } } if (a_index < len) { Send %hdir% } } if (a_index < Array0) { Send %vdir% if (hdir = "{Right}") { hdir = {Left} } else if (hdir = "{Left}") { hdir = {Right} } } } } else { MsgBox File not found }
Sample file to show how this all works:
111111 100001 100201 103001 100401 105001 100601 100001 111111
This creates a room filled with up/down stairs, a ramp, and a channel.
And finally, here's a sample pattern based on the decentralized workshop:
1111111111111111111111111111111111111 1000000000000001000001000000000000001 1000000000000001000001000000000000001 1000000000000000000000000000000000001 1000000000000001000001000000000000001 1000000000000001000001000000000000001 1000111101111111110111111111011110001 1000100000001000100010001000000010001 1000100000001000100010001000000010001 1000100000001000100010001000000010001 1000000000000010000000100000000000001 1000111101111000100010001111011110001 1000100000001000100010001000000010001 1101100010001000100010001000100011011 1000100000001000100010001000000010001 1000111101111111100011111111011110001 1000100000000000030400000000000010001 1010000000000000030400000000000000101 1000100000000000030400000000000010001 1000111101111111100011111111011110001 1000100000001000100010001000000010001 1101100010001000100010001000100011011 1000100000001000100010001000000010001 1000111101111000100010001111011110001 1000000000000010000000100000000000001 1000100000001000100010001000000010001 1000100000001000100010001000000010001 1000100000001000100010001000000010001 1000111101111111110111111111011110001 1000000000000001000001000000000000001 1000000000000001000001000000000000001 1000000000000000000000000000000000001 1000000000000001000001000000000000001 1000000000000001000001000000000000001 1111111111111111111111111111111111111
jokermatt999's pump stack builder[edit]
Just a simple macro to place one mined level of a pump stack room, as illustrated in the pump stack page on this wiki. It's recommended you exit out after finishing up with it, as the macro is just assigned to p. Hit/Hold down p for multiple layers.
p::Send i{Enter}{Enter}{Right}d{Enter}{Right}{Right}{Down}{Down}{Enter}h{Enter}{Enter}{Up}{Left}x{Enter}{Enter}{Left}{Left}{Down}h{Enter}{Enter}{Up}{Up}{Shift Down}.{Shift Up}
p:: Send i{Enter 2} Send d6{Enter}33{Enter} Send h{Enter 2} Send x7{Enter 2} Send h14{Enter 2} Send 88{Shift Down}.{Shift Up} return