Nobody Saves the World

Nobody Saves the World

Not enough ratings
How to make controls less awful
By <MasterThomy>
For people preferring kb+m
Using autohotkey for great success!
   
Award
Favorite
Favorited
Unfavorite
Intro
I've made an .ahk (autoHotkey) script for myself because kb+m in this game is atrocious, and figured I'd share with others here who prefer using mouse in games even if there's no mouse support.

Script has following features:
- Making quick swap work with mouse movement
- Hold direction key when already moving turns you around till you let go (for kiting)
- Putting abilities/attack on mouse buttons
- Toggle map button also closes the menu after (seriously, why does it not do that...)
- Mouse wheel instead of q/e for the menu
How to make it work
  • First you'll need to install autohotkey: https://www.autohotkey.com/

    This is quite a useful program for any game really, allows you to rebind your keys to some other keys, and even to write complicated scripts. Useful when some game doesn't let you bind to mouse buttons, or rebind some specific keys, and you don't like conforming to these awful desing choices (oh hey, like this game!)

  • Second create a new file with .ahk extension (right click anywhere -> New -> AutoHotkey Script), and copy below script in there (right click on file -> Edit script)
    #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. ; #Warn ; Enable warnings to assist with detecting common errors. SendMode Input ; Recommended for new scripts due to its superior speed and reliability. SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. CoordMode, Mouse, Screen disableMove:=0 #if disableMove == 1 Up::Return Down::Return Left::Return Right::Return #IfWinActive ahk_exe NStW_x64.exe *XButton2:: MouseMove, 400, 400 X1:=400 Y1:=400 Send {k down} Send {left up} Send {right up} Send {up up} Send {down up} disableMove:=1 while GetKeyState("XButton2", "P") { MouseGetPos, X2, Y2 xDelta:=X2-X1 yDelta:=Y2-Y1 deadZone:=30 if(Abs(xDelta)>deadZone || Abs(yDelta)>deadZone) { MouseMove, %X1%, %Y1% Send {left up} Send {right up} Send {up up} Send {down up} if (yDelta > deadzone && Abs(xDelta) < deadZone/1.5) Send {down down} else if (yDelta < deadzone && Abs(xDelta) < deadZone/1.5) Send {up down} else if (xDelta > deadzone && Abs(yDelta) < deadZone/1.5) Send {right down} else if (xDelta < deadzone && Abs(yDelta) < deadZone/1.5) Send {left down} else if (xDelta > 0 && yDelta > 0) { Send {down down} Send {right down} } else if (xDelta > 0 && yDelta < 0) { Send {up down} Send {right down} } else if (xDelta < 0 && yDelta > 0) { Send {down down} Send {left down} } else if (xDelta < 0 && yDelta < 0) { Send {up down} Send {left down} } } sleep 50 } Send {k up} sleep 40 Send {left up} Send {right up} Send {up up} Send {down up} if GetKeyState("Up", "P") Send {up down} if GetKeyState("Down", "P") Send {down down} if GetKeyState("Left", "P") Send {left down} if GetKeyState("Right", "P") Send {right down} disableMove:=0 Return RShift:: if GetKeyState("Up", "P") { Send {up up} Send {down down} Sleep 40 Send {RShift down} Send {up down} Send {down up} } else if GetKeyState("Down", "P") { Send {down up} Send {up down} Sleep 40 Send {RShift down} Send {down down} Send {up up} } else if GetKeyState("Left", "P") { Send {left up} Send {right down} Sleep 40 Send {RShift down} Send {left down} Send {right up} } else if GetKeyState("Right", "P") { Send {right up} Send {left down} Sleep 40 Send {RShift down} Send {right down} Send {left up} } else Send {RShift down} while GetKeyState("RShift", "P") { Sleep 40 } Send {RShift up} return ~LButton::s RButton::a MButton::w ~Enter::s XButton1:: SendInput {m down} sleep 40 SendInput {m up} sleep 10 SendInput {Esc down} sleep 40 SendInput {Esc up} return WheelDown:: SendInput {e down} sleep 40 SendInput {e up} return WheelUp:: SendInput {q down} sleep 40 SendInput {q up} return

  • After that you need to run the script (which will start up autohotkey), and it should just work (will only do anything when game window is active)
Script assumes controls ingame are set as:
  • Toggle map: m
  • Quick swap: k
  • Hold direction: Right shift
  • Movement and abilites 1-2-3 are on default setting (arrow keys, s/a/w)
  • All other actions can be set to anything
Important notes
I'm using mouse with 5 buttons, so that's how keys are bound here, but you can put them on any other button you like, for reference:
  • LButton, RButton, MButton (left/right/middle mouse) are for abilities 1-2-3 (4th one you can put on whatever key ingame)
  • Xbutton1, XButton2 (side mouse buttons) are for "toggle map" and "quick swap"
Be aware if you want to change XButton2 you also need to change it a few lines below (in GetKeyState)

I also made Enter act same as the attack button (for chests/talking it was weird that you need to Attack and not Use)

Quick swap can be a bit finicky, but it works nice enough if you don't hesitate on your choice too much (shouldn't interrupt your movement while you do it either)

I'm playing with 120fps, so if some things seem to work wonky at 60 fps then it might help to increase all the sleep-s to 70 or so (didn't test so maybe it's fine...)
5 Comments
悲しみ痛む 21 Dec, 2022 @ 12:10am 
thanks for taking the time to write this guide!
Souled 19 Apr, 2022 @ 3:06am 
what do i change in the script if i don't want my arrow keys to be movement?
Thorncrypt 1 Feb, 2022 @ 10:24am 
thanks for taking the time to write this guide!
<MasterThomy>  [author] 26 Jan, 2022 @ 10:21am 
I have absolutely no idea. Feel free to try..
Btw autohotkey should to have an option to only extract files somewhere, don't need to "install" necessarily.
kameltoes 26 Jan, 2022 @ 9:55am 
Instead of installing autohotkey, I wonder if this can be done in logitech Gaming software for the G502?