Fandom

Wikihack

Macro

2,034pages on
this wiki
Add New Page
Talk0 Share

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Macrosystem

This is how the macro system looks like

This page contains help on making a simple and powerful macro system in NetHack.

Installation Edit

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 Edit

  • 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 Edit

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.

Links Edit

List of special key aliases

Also on Fandom

Random Wiki