After seeing numerous requests for this topic I decided to set up a very basic tutorial on setting up a non-intrusive solution to fixing Bethesda's hard-bound context menu controls. The solution involves installing http://autohotkey.com/ and setting up a hotkey toggle to switch the keys on your keyboard itself. It's not the solution we should have, which is full keybinding support, and you should let Bethesda know that http://help.bethesda.net/app/fallout_feedback
Pre-compiled script for left-handed users, which does not require AutoHotkey or any knowledge of it: http://www.gamesas.com/topic/1546356-workaround-for-hard-bound-keys-autohotkey-tutorial/page-2#entry24493404 If you just want to start playing with these controls: http://i612.photobucket.com/albums/tt201/fatesdecision/Lefties-3buttons_zpsltfhvdvx.png
This guide also contains some advanced scripts I've been working on. If you want some cool control tweaks that aren't ever going in the game, check out the control hacks section near the bottom of the post.
Easy example
- I open up a notepad file, and type
Numpad8::wNumpadDot::Numpad8NumpadAdd::EnterNumpadEnter::Space
- Then I save this file as ReallyBadMap.ahk, and double click it to run it as an administrator using http://autohotkey.com/.
- Now 8 on my numpad types w, "." on my numpad types 8, "+" on my numpad sends an Enter key, and the Enter button on my numpad types a space.
- If that's all you want to know, have at it!
Terms:
Map - Using AutoHotkey to produce an output when a key is pressed. Keys that aren't given specific functions are mapped to produce themselves.
- Green text represents the name of the physical key on your keyboard as it is labelled. For the purposes of this guide, AutoHotkey is the only program that actually reads typed keys. Fallout 4 only uses produced keys
(AHK also reads raw mouse inputs, too, but unfortunately Fallout 4 collects both the produced mouse inputs AND raw mouse inputs, which can cause conflicts)
- Gold text represents the output of a key when it is pressed. Before running an AutoHotkey script, your typed keys and produced keys will probably be the same
Bind - Establishing a produced key to carry out a particular command or action within the game that's being played, in this case Fallout 4
- Soft bindings have variable effects and most of them can be changed under Settings -> Controls in the pause menu.
- Hard bindings are keys that were hard-coded into the game by the developers to always perform an action in a specific context. These can never be changed in-game; only through the game's code.
Chances are you're here because of those hard-bindings which are either interfering with your ability to play using a familiar control scheme, or you think they are just poorly optimized. Why do you have to reach over and hit Tab whenever you want to exit out of a computer terminal? This tutorial should give you all the information you need to set up almost all of the controls you want while Bethesda hopefully eliminates the need for hardbound keys.
Step 1: Install AutoHotkey http://autohotkey.com/ I would recommend using express installation
Step 2: Create a file anywhere on your computer with the .ahk extension. The easiest way to do this is to open up notepad and [File -> Save As] and save it as the desired file name with the .ahk extension. Open the file you created and with notepad (right-click and edit).
Optional Step 3: Paste this to add an off/on switch to your remappings:
+Break:: Suspend Pause,,1return
The body of the function simply suspends the entire script with a pause buffer (which allows the function to complete so that only this particular hotkey can be used again).
The return statement indicates the ending of a function.
So what this does is that it allows you to Shift + Pause to toggle the enabling of the other hotkey functions we will create below.
Step 4: Remap your keys. On a new line, type the key that you want to press, followed by a double-colon :: and then the key that you want produced.
In this example, I will use my G key
g::e
This makes it so that whenever I press my G key it will produce an E instead.
As it turns out, remaps can be done in one line without a return statement. Anything longer than one line will require a return statement.
e::j
Now I have a function which makes pressing my E produce a J (note that it reads the raw keyboard input of pressing E, so a produced E will not be output as J such as in the previous function).
You can use the one-line method with any keys. If I want my J to type G, the next line is completely valid:
j::g
Step 5: Save the file, then double-click it to make it run. If AHK is not set to run as administrator by default, right click and run as administrator instead.
Step 6: Right-click the file and Edit, then go back to Step 4 until you are happy with it.
Some key names you may want to know are
NumpadDot
NumpadEnter
NumpadAdd
NumpadSub
NumpadMult
NumpadDiv
For a complete list of keys by name: http://www.autohotkey.com/docs/KeyList.htm
A very important note when picking your keys is that hardbound keys will always take priority over softbound keys if you could use both in the same context; the softbound control will not be used
There are several interfaces, the most important being free exploration, Pip-Boy, and the workshop.
Pip-Boy - [Pip-Boy menu] this control is softbound to closing the Pip-Boy (don't forget the statement directly above)
Forward/Back - [Pip-Boy] these are actually softbound to tab navigation. Moves the outer tabs left and right. [Workshop] allows you to move!! Any keys with workshop hardbindings will not allow you to use that key for movement
Strafe Left/Right - [Pip-Boy] navigate through the inner/sub tabs. The Left/Right arrow keys are already hardbound to do this, though. [Workshop] allows you to move
Those softbound actions are important because they have functions in the same context as almost all of the hardbound keys. It is strongly recommended that you do not bind them to any of the hardbound keys.
The following keys are all hardbound in the listed interfaces:
0-9/-/=/[Numpad +]
exploration: select item from favorites
E
all: select/use highlighted object
exploration: pull objects out of containers, interact with workstations
Pip-Boy(stats): apply stimpacks
workshop: select object category
I would recommend only binding VATS, activate, or reload to this key
R
exploration: open transfer menu
Pip-Boy(items): drop
Pip-Boy(data): show on map
Pip-Boy(map): toggle local view
transfer: take all items
crafting/workshop: scrap item
I would recommend only binding VATS, activate, or reload to this key
Wheel Up/Down, Wheel Up/Down (yes, Fallout 4 collects both produced Mouse inputs as well as actual mouse inputs)
exploration: zooms POV in/out
most menus: navigate, sometimes through a highlighted object which is selectable with Enter
Should be left alone without advanced script tweaking.
Tab
all: back out, cancel
Enter
all: the same stuff as E
Escape
workshop/pause: exit
Up/Down/Left/Right arrow keys
dialogue: picks one of the four responses
Pip-Boy: Left/Right moves through the subtabs
all other menus: highlights objects which are selectable with E
Spacebar
VATS: execute critical
Q
Pip-Boy(items): add selected to favorites hotbar
workshop: mark all items containing materials to craft the selected item (indicated with a hand lens)
T
Pip-Boy: manage skills
crafting: repair power armor/mark all items containing desired materials
workshop: unload all junk
trade screen: equip items to actor
Intro movies: skip
Z
Pip-Boy(items): sort items
X
Pip-Boy(items): inspect items
C
Pip-Boy(items): (armor) cycle damage, (junk) component view
Pip-Boy(data): show summary
Pip-Boy(map): toggle caravan view
Left Click / Left Click (unconfirmed)
VATS: select target limb
Never do an AHK basic remap of mouse clicks. Only remap Wheel Up/Down with the understanding that the remap will send Fallout 4 both Wheel Up/Down as well as the mapped output.
Control Hacks
And here's your consolation prize for figuring out how to remap your controls. These should work for some other games, too.
All of these scripts can be run separately in the background and toggled off at any time using Shift + Pause
Consolidating keys
There are all kinds of options you have for consolidating keys: E becomes R, Pip-Boy becomes Favorites, Sprint becomes Jump; all from a different variation of the same key presses.
Long Press
Hold down a key long enough and it will send a different key.
Template change a, x, and y to the desired keys (where A sends X normally and Y on a double tap):
+Break:: ;++ The same hotkey can only Suspend ;++ be declared once per file Pause,,1return*a:: KeyWait, a, t0.8 if ErrorLevel { Send {y down}{y up} } else Send {x down} KeyWait, areturn*a up::Send {x up} ; line is unnecessary if A is the same as X
Combination Keys
Pressing two buttons at once will send a third, different key. So essentially you get three keys for the price of two.
Template change a, b, x, and y to the desired keys (where A sends X normally, and A + B sends Y)
+Break:: ;++ The same hotkey can only Suspend ;++ be declared once per file Pause,,1return*a:: KeyWait, a Send {x up}{x down}returna & b::Send {y up}{y down}
Double Tapping
This one is pretty self-explanatory. You double tap one key to produce a different key. The two variations of double-tapping are
Standard: good for mapping a primary key which is usually not released and pressed in succession
Template change a, x, and y to the desired keys (where A sends X normally and Y on a double tap):
CP = 0 ; goes up at the top with other declarations+Break:: ;++ The same hotkey can only Suspend ;++ be declared once per file Pause,,1return*a:: if CP Send {y down} else { SetTimer, yTimeout, -500 }return*a up:: Send {x up}{y up} CP = 1 SetTimer, cpTimeout, -500returnyTimeout: if ! GetKeyState("y") Send {x down}returncpTimeout: if ! GetKeyState("y") CP = 0return
On-Release: if you ever need to release the primary key and then press it again, but doesn't work if you need the secondary key held down ever. This will send both keys
Example: double clicking the right mouse button(aim) sends X(bash), necessary because you may lower your sights and then quickly aim at a new target
CR = 0 ; goes up at the top with other declarations+Break:: ;++ The same hotkey can only Suspend ;++ be declared once per file Pause,,1returnRButton:: ;Send {a downtemp} if remapping a key if ! (CR) { SetTimer, crTimeout, -500 }returnRButton up:: ;Send {a up} if (CR) { Loop, 3 Send {x down}{x up} CR = 0 } else CR = 1returncrTimeout: CR = 0return
CoD-style weapon wheel Pre-compiled vertical bars: http://s000.tinyupload.com/index.php?file_id=536798354981754749261-6 Horizontal for lefties: http://s000.tinyupload.com/index.php?file_id=65866444173817788924
Do you love how, not only can you press a button to toggle your POV, but you can use the mouse wheel to adjust how far the camera is behind you? ...No? Okay then, how about we turn your mouse wheel into something useful, like a rack for all of your favorite guns! I made the first version in about an hour, which didn't work, and NINE HOURS of troubleshooting later, I had a completely different working version!!
(better) code for Vertical bar Favorites 7,8,9,0,-,=:
global x = 7 ;++ global variables MUST be declared BEFORE HOTKEYS.; ++ Otherwise this script will not work+Break:: ;++ The same hotkey can only Suspend ;++ be declared once per file Pause,,1returnWheelDown:: Click WU x+=2WheelUp:: x-- t := select() SetKeyDelay, 30 Send {%t% DownTemp}{%t% Up}returnselect() { if % (x < 7 OR x = 12) { x = 12 return "=" } if (x = 10) return 0 if (x = 11) return "-" if % (x > 12) x = 7 return x}Numpad0::$0:: SetKeyDelay, 10 Send {0 Down}{0 Up} x = 10returnNumpad7::$7:: SetKeyDelay, 10 Send {7 Down}{7 Up} x = 7returnNumpad8::$8:: SetKeyDelay, 10 Send {8 Down}{8 Up} x = 8returnNumpad9::$9:: SetKeyDelay, 10 Send {9 Down}{9 Up} x = 9returnNumpadAdd::$=:: SetKeyDelay, 10 Send {= Down}{= Up} x = 12returnNumpadSub::$-:: SetKeyDelay, 10 Send {- Down}{- Up} x = 11return
(lefty) code for horizontal Favorites 1-6:
x = 1+Break:: ;++ The same hotkey can only Suspend ;++ be declared once per file Pause,,1returnWheelUp:: if % (x < 2) x = 7 x-- SetKeyDelay, 30 Send {%x% DownTemp}{%x% Up}returnWheelDown:: Click WU if % (x > 5) x = 0 x++ SetKeyDelay, 30 Send {%x% DownTemp}{%x% Up}returnNumpad1::$1:: SetKeyDelay, 10 Send {1 Down}{1 Up} x = 1returnNumpad2::$2:: SetKeyDelay, 10 Send {2 Down}{2 Up} x = 2returnNumpad3::$3:: SetKeyDelay, 10 Send {3 Down}{3 Up} x = 3returnNumpad4::$4:: SetKeyDelay, 10 Send {4 Down}{4 Up} x = 4returnNumpad5::$5:: SetKeyDelay, 10 Send {5 Down}{5 Up} x = 5returnNumpad6::$6:: SetKeyDelay, 10 Send {6 Down}{6 Up} x = 6return
How it works:
Arrange all of your weapons in the vertical bars of your favorites crosshair in positions 7,8,9,0,-,= (for the lefty version it's the horizontal bars 1-6). Move ALL consumables out of those favorites or you will end up eating them when you want to switch guns. Now simply scroll the mouse wheel up and down and you can switch through your weapons just like you would in most modern FPS games.
Mouse Wheel Up/Down: Cycle through weapons
Modifyer Key(Ctrl, Alt, Shift, Windows) + Mouse Wheel Up/Down: Zoom in or out, or Scroll up/down
Additional notes:
FAQ
Q: Does AutoHotkey work on Mac?
A: IronAHK is the Mac version of AHK, you'll have to download that instead. This guide works for IronAHK.
Q: How can I turn AutoHotkey off permanently?
A: It should be listed as a process with the other icons in the lower right of your taskbar; just right click and exit. Otherwise, open task manager and end the process.
Q: What about GlovePIE?
A: While it predates AHK by a few years, it's bulkier, lacks express installation, and runs much hotter with fewer features.
Q: My script stops working as soon as I boot up the game
A: DirectX will disable lower-priority background programs dealing with sound and controls. Make sure you are running your script as an administrator.
Q: I don't want the remapped keys to work outside of Fallout 4
A: Add
#ifWinActive, ahk_class Fallout4
at the very top of your script. Thanks to Mav99 for this one
Q: AHK keeps minimizing my game and telling me that I've pressed "x hotkeys in y seconds"
A: This can be disabled by putting
#MaxHotkeysPerInterval 2000
at the top of your script. ty @Mav99