This is how the macro system looks like
This page contains help on making a simple and powerful macro system in NetHack.
Installation[]
This was tested on: WinXP SP3 + nethack-343-win (NetHackW.exe)
- Download AutoHotkey Basic installer http://www.autohotkey.com/download/
- Install AutoHotkey Basic
- Create runmeonce.ahk AutoHotkey script containing following code in your NetHack directory:
;This is NethackW macro system script
;DO NOT edit unless you know what you're doing
#SingleInstance ignore
if A_IsCompiled <> 1
{ ;Create launcher file
#NoTrayIcon
Loop *.ico { ;Search for icon
sIcon = %FileList%%A_LoopFileName%
Break
}
if sIcon =
{
MsgBox 16, Error, Icon is missing! Make sure if any file with .ico extension is present in Nethack directory.
Run http://nethack.wikia.com/wiki/Macro#icon
ExitApp
}
RunWait Ahk2exe.exe /in "%A_ScriptFullPath%" /out "NHLauncher.exe" /icon "%sIcon%" /pass "nethack",Hide
MsgBox 64, Information, Run NHLauncher.exe to start NetHack. Have fun!
FileDelete %A_ScriptFullPath%
FileDelete %sIcon%
ExitApp
}
IfNotExist trigger.ahk
{
MsgBox 16, Error, trigger.ahk not exist! You will be redirected to trigger.ahk source code.
Run http://nethack.wikia.com/wiki/Macro#trigger
ExitApp
}
Process, Exist, NethackW.exe
NewPID = %ErrorLevel%
if NewPID = 0
{ ;Start Nethack
GoSub RunTrigger
RunWait NethackW.exe
GoSub KillTrigger
ExitApp
} else {
MsgBox 16, Error, Nethack is already running.
ExitApp
}
return
KillTrigger:
SetTitleMatchMode, 2
DetectHiddenWindows, on
SendMessage, 0x44, 0x405, 0, , trigger.ahk - AutoHotkey v
RunWait TaskKill /pid %ErrorLevel% /fi "STATUS ne RUNNING",,Hide
return
RunTrigger:
Run trigger.ahk
return
#ifWinActive ahk_class MSNHMainWndClass
!^r::
{ ;Reset triggers manually
Gosub KillTrigger
Gosub RunTrigger
MsgBox 0, Information, Triggers script restarted
return
}
^w::
{ ;WikiHack Search Engine
InputBox, sWiki, Search on WikiHack, , , , 100
if sWiki !=
Run http://nethack.wikia.com/index.php?search=%sWiki%&fulltext=0
return
}
^m::
{ ;Add new macro
fTemp = trigger.tmp1
bFound = 0
bDelete = 0
bSuccess = 0
InputBox, sHotkey, Input trigger key,,, 200, 100
if sHotkey =
{ ;View triggers.ahk
Loop
{
FileReadLine, sLine, trigger.ahk, %A_Index%
if ErrorLevel
break
FileAppend, %sLine%`n, %fTemp%
if ((sLine) = (";In game triggers"))
fTemp = trigger.tmp2
}
FileRead Contents, trigger.tmp2
if Contents =
MsgBox 0, Information, Macro list is empty.
else MsgBox 0, Information, Macro file contains following entries:`n`n%Contents%
FileDelete trigger.tmp*
Contents = ; Free the memory.
return
}
InputBox, sAction, Input macro action,,, 200, 100
if sAction =
bDelete = 1
Loop
{ ;Read analize and save file
FileReadLine, sLine, trigger.ahk, %A_Index%
if ErrorLevel
break
IfInString, sLine, %sHotkey%:: Send
{ ;Equal entry found!
bFound = 1
if (bDelete <> 1)
{
MsgBox, 36, Old entry found!, %sLine%`n`nReplace with Send %sAction%?
IfMsgBox Yes
{
FileAppend, %sHotkey%:: Send %sAction%`n, %fTemp%
} else FileAppend, %sLine%`n, %fTemp%
bSuccess = 1
} else { ;Entry deletion
MsgBox, 292, Entry deletion , Delete entry %sLine%?
IfMsgBox No
FileAppend, %sLine%`n, %fTemp%
bSuccess = 1
}
} else FileAppend, %sLine%`n, %fTemp%
if ((sLine) = (";In game triggers"))
fTemp = trigger.tmp2
}
if (bFound = 0)
{
if (bDelete <> 1)
{
bSuccess = 1
FileAppend %sHotkey%:: Send %sAction%`n, %fTemp%
}
}
if (bSuccess <> 1)
MsgBox 0, Error, Macro action cannot be empty
{ ;Merge files and clear up
FileRead Contents, trigger.tmp2
Sort, Contents
FileAppend %Contents%, trigger.tmp1
FileCopy trigger.tmp1, trigger.ahk, 1
FileDelete trigger.tmp*
Contents = ; Free the memory.
}
GoSub KillTrigger
GoSub RunTrigger
}
- Create trigger.ahk AutoHotkey script containing following code in your NetHack directory:
#NoTrayIcon
#SingleInstance ignore
MapScrollSteps = 28
#IfWinActive ahk_class MSNHMainWndClass
/::
Loop 5 {
Send s
}
return
;Diagonal movement remapping
^a:: Send {Home}
^s:: Send {Pgup}
^z:: Send {End}
^x:: Send {Pgdn}
;Map scrolling left
^Left::
Loop %MapScrollSteps% {
Send ^{Left}
}
return
;Map scrolling right
^Right::
Loop %MapScrollSteps% {
Send ^{Right}
}
return
;WARNING! Leave one empty line at the end of file
;In game triggers
!Down:: Send o{Down}
!Left:: Send o{Left}
!Right:: Send o{Right}
!Up:: Send o{Up}
F12:: Send Oi{Enter}Oi{Enter}
- Download custom .ico file and save it in your NetHack directory (for example: http://findicons.com/icon/257701/d12_128x128) Script will automatically use first .ico file in alphabetical order.
- Run runmeonce.ahk to compile a script
In-game usage[]
- Run NHLauncher.exe to start NetHack.
- Press CTRL+M during the game and follow the on screen instructions to add a new macro action
Example: If you want to make a macro for casting your first spell (for instance to cast Extra healing on yourself)
press CTRL+M Input trigger key: F1 Input macro action: Za.
Macro has been created and can be used immediately.
- To view a full list of created macro triggers and actions press CTRL+M then ENTER
- To delete a macro press CTRL+M next input it's trigger key and leave macro action empty. You will be asked to remove it.
- Press CTRL+W and input a keyword. You will be redirected to appropriate WikiHack article.
Sample macros[]
There are already few macros in standard trigger.ahk file. Seaching macro can be removed only by editing a file so, if you don't need it you'll have to edit it by yourself. Included macros:
- Diagonal directions key mapping for laptops with uncomfortable position of [Home, End, Page Up, Page Down] keys changed to CTRL+[A, Z, S, X].
- Searching for 5 turns by pressing / key.
- F12 sorts inventory letters
- ALT+[Direction] opens a door
- CTRL+[Left, Right]Scrolls map smoothly. Change variable MapScrollSteps in trigger.ahk to adjust scroll range.
You can make your own macros during the game as well. Examples:
- TAB key to apply an oil lamp.
- F1,F2 to cast offensive spells.
- F3,F4 to wear different sets of armor.
- k for using a key/lockpick instead of kicking.