The Dork Knight himself.
I need an official ruling on a few game tweaks that revolve around INI editing. I'd like to make sure that all of the Arkham runners, myself included, follow the SDA guidelines before one of us tries to submit a run.
The games currently affected by this are:
Batman: Arkham Asylum
Batman: Arkham City
Batman: Arkham Origins
Question 1: Is it SDA legal to rebind an action to multiple keys directly through the INI?
When Arkham Asylum was released, the devs shipped the PC version of the game with a config tool to setup all of your keys. Each action is allowed a primary key and a secondary key. The one thing the developers did not do was make sure the config tool could recognize the mousewheel as a valid input for setting up these keys. The engine Asylum runs on, Unreal 3, fully supports and recognizes the mousewheel as a valid key, and by default the wheel simply changes weapons.
The problem stems from a specific INI file that tells the config tool what key each DXInput keycode matches to. The specific keycodes that are for MouseScrollUp and MouseScrollDown are set to a key called 'Unassigned,' which is what the config tool uses to clear a command when setting up the keys. In fact, going through this INI file shows that about 40% of usable DXInput codes are set to Unassigned. Once you setup your keys with the config tool, it then converts those keys into standard Unreal 3 binds and stores them in the Userinput.ini file.
In order to get around this limitation, it's possible to edit the userinput.ini file to manually change/add a bind to be used in-game. Specifically, I have the same command for my spacebar (run/jump/glide all on one key) also set to my mousewheelup/down. This is what the commands look like:
default
.Bindings=(Name="SpaceBar",Command="ContextSensitive | Run | CapeGlide | AcceptConversation | Evade | CancelBatarangCamera", Shift=false, Control=false, Alt=false, bIgnoreShift=false, bIgnoreCtrl=false, bIgnoreAlt=false):META:COM_RUN_GLIDE_USE,0,-1,-1,"bRunButton",false,false,CI_RunGlide,CI_Interact
custom
.Bindings=(Name="MouseScrollUp",Command="ContextSensitive | Run | CapeGlide | AcceptConversation | Evade | CancelBatarangCamera", Shift=false, Control=false, Alt=false, bIgnoreShift=false, bIgnoreCtrl=false, bIgnoreAlt=false):META:COM_RUN_GLIDE_USE,0,-1,-1,"bRunButton",false,false,CI_RunGlide,CI_Interact
.Bindings=(Name="MouseScrollDown",Command="ContextSensitive | Run | CapeGlide | AcceptConversation | Evade | CancelBatarangCamera", Shift=false, Control=false, Alt=false, bIgnoreShift=false, bIgnoreCtrl=false, bIgnoreAlt=false):META:COM_RUN_GLIDE_USE,0,-1,-1,"bRunButton",false,false,CI_RunGlide,CI_Interact
This also gets around another developer oversight in that the engine can support up to 3 keys with the same action (possibly more but I haven't fully tested it yet). You can see that the bind itself is a multi-action command that will do different actions under different situations. The biggest reason I use this custom setup is for mashing: anytime I have to open a vent or rip down a wall, it's faster to do the mashing with my mousewheel than my spacebar. Over the course of a run (which is about 1 hour and 50 mins) using the mousewheel to mash can save about 1 minute (2 mins would be stretching). The drawback is that if I accidentally touch my mousewheel when I don't need to I can accidentally roll or stop gliding, which means I have to be careful about how I use it.
Question 2: Is it SDA legal to rebind actions from one control set to another? (aka custom keybinds)
All of the Arkham games accommodate both Xbox 360 controllers and keyboard/mouse setups. To do so, each control type has the binds setup differently. For instance, the capestun maneuver on the controller also skips conversations, while the kb/m setup uses the primary attack key (mouse1) to skip conversations. While both of these will achieve the skipping of a conversation/cutscene, with the controller bind there's no penalty for over-mashing (meaning if you hit the key too many times Batman won't inadvertently perform the capestun action), but if you over-mash with the kb/m bind Batman will immediately start attacking the air.
The same bind that is setup for the XboxTypeS_B button can be switched over to the KB/M controls and function exactly the same, with the added benefit of faster mashing. Specifically, putting that command on the mousewheel to skip in-game conversations even faster.
default
Bindings=(Name="XboxTypeS_B",Command="HangFromVantagePoint | BlockBreaker | DebugCamMoreSpeed | OnRelease DebugCamNormalSpeed | ExitAgilityMode | SkipCutscene | CancelGadget | DebugMenuSelectB | CancelBatarangCamera")
custom
Bindings=(Name="MouseScrollDown",Command="HangFromVantagePoint | BlockBreaker | DebugCamMoreSpeed | OnRelease DebugCamNormalSpeed | ExitAgilityMode | SkipCutscene | CancelGadget | DebugMenuSelectB | CancelBatarangCamera")
In each of these cases, the binds aren't created out of thin air. Instead, it's the same exact keybind that is normally setup for 1 key, but simply moved to another. In the second case, the keybind from one control type is simply moved to another control type. There are a few precedents that have been made in the past for these situations.
1. Quake/Half-Life - Speedrunners of these games will manually setup their keys through the in-game console or by directly editing the config.cfg file for each game. In the case of Half-Life, custom keybinds that aren't accessible through the in-game config menu are used. Example: The Half-Life shotgun is normally accessed by pressing 3 (bound to +slot3), then clicking mouse1 (bound to +attack). If there are other weapons in the same slot category, like the 9mmAR, you have to press 3 multiple times until the weapon desired is selected, then equip it by pressing the fire key. The custom keybind that runners use in this situation is "use weapon_shotgun" or "use weapon_9mmAR" which do not exist in the key setup menu. This allows a runner to have each weapon bound to a specific key, and 1 button press immediately brings up the weapon. Runners to ask for confirmation: oasiz, coolkid
2. Borderlands 1 (also on the Unreal engine) - On the PC version of Borderlands, there is a bind that can drop the current weapon you're holding (I believe it's either the - or = key by default). By dropping a weapon then immediately picking it up, the weapon is instantly reloaded. Due to it's position, runners will manually edit the INI file to move that key to another one that is more convenient to use, whether it be near the movement keys or on the mouse itself. This specific action is not accessible at all through the in-game menus and can only be changed through the INI files. Runners to ask for confirmation: YoukaiDragoon (I think he goes by just Youkai now), ProfessorBroman, TeaWrex
3. Software - Programs like Joy2Key allow players to adapt keyboard/mouse controls to controllers, while others (like the Razer software) allow mouse buttons to act as a keyboard button. With the Razer software, it's possible to setup the mousescrollup/down to both act as the spacebar. In this situation, it's a direct 1-to-1 change, meaning there's no macro or automation with the keypress. 1 tick of the wheel would count as 1 spacebar press, no more. These solutions have been allowed for numerous games in the past, but unfortunately I don't have any specific examples.
The games currently affected by this are:
Batman: Arkham Asylum
Batman: Arkham City
Batman: Arkham Origins
Question 1: Is it SDA legal to rebind an action to multiple keys directly through the INI?
When Arkham Asylum was released, the devs shipped the PC version of the game with a config tool to setup all of your keys. Each action is allowed a primary key and a secondary key. The one thing the developers did not do was make sure the config tool could recognize the mousewheel as a valid input for setting up these keys. The engine Asylum runs on, Unreal 3, fully supports and recognizes the mousewheel as a valid key, and by default the wheel simply changes weapons.
The problem stems from a specific INI file that tells the config tool what key each DXInput keycode matches to. The specific keycodes that are for MouseScrollUp and MouseScrollDown are set to a key called 'Unassigned,' which is what the config tool uses to clear a command when setting up the keys. In fact, going through this INI file shows that about 40% of usable DXInput codes are set to Unassigned. Once you setup your keys with the config tool, it then converts those keys into standard Unreal 3 binds and stores them in the Userinput.ini file.
In order to get around this limitation, it's possible to edit the userinput.ini file to manually change/add a bind to be used in-game. Specifically, I have the same command for my spacebar (run/jump/glide all on one key) also set to my mousewheelup/down. This is what the commands look like:
default
.Bindings=(Name="SpaceBar",Command="ContextSensitive | Run | CapeGlide | AcceptConversation | Evade | CancelBatarangCamera", Shift=false, Control=false, Alt=false, bIgnoreShift=false, bIgnoreCtrl=false, bIgnoreAlt=false):META:COM_RUN_GLIDE_USE,0,-1,-1,"bRunButton",false,false,CI_RunGlide,CI_Interact
custom
.Bindings=(Name="MouseScrollUp",Command="ContextSensitive | Run | CapeGlide | AcceptConversation | Evade | CancelBatarangCamera", Shift=false, Control=false, Alt=false, bIgnoreShift=false, bIgnoreCtrl=false, bIgnoreAlt=false):META:COM_RUN_GLIDE_USE,0,-1,-1,"bRunButton",false,false,CI_RunGlide,CI_Interact
.Bindings=(Name="MouseScrollDown",Command="ContextSensitive | Run | CapeGlide | AcceptConversation | Evade | CancelBatarangCamera", Shift=false, Control=false, Alt=false, bIgnoreShift=false, bIgnoreCtrl=false, bIgnoreAlt=false):META:COM_RUN_GLIDE_USE,0,-1,-1,"bRunButton",false,false,CI_RunGlide,CI_Interact
This also gets around another developer oversight in that the engine can support up to 3 keys with the same action (possibly more but I haven't fully tested it yet). You can see that the bind itself is a multi-action command that will do different actions under different situations. The biggest reason I use this custom setup is for mashing: anytime I have to open a vent or rip down a wall, it's faster to do the mashing with my mousewheel than my spacebar. Over the course of a run (which is about 1 hour and 50 mins) using the mousewheel to mash can save about 1 minute (2 mins would be stretching). The drawback is that if I accidentally touch my mousewheel when I don't need to I can accidentally roll or stop gliding, which means I have to be careful about how I use it.
Question 2: Is it SDA legal to rebind actions from one control set to another? (aka custom keybinds)
All of the Arkham games accommodate both Xbox 360 controllers and keyboard/mouse setups. To do so, each control type has the binds setup differently. For instance, the capestun maneuver on the controller also skips conversations, while the kb/m setup uses the primary attack key (mouse1) to skip conversations. While both of these will achieve the skipping of a conversation/cutscene, with the controller bind there's no penalty for over-mashing (meaning if you hit the key too many times Batman won't inadvertently perform the capestun action), but if you over-mash with the kb/m bind Batman will immediately start attacking the air.
The same bind that is setup for the XboxTypeS_B button can be switched over to the KB/M controls and function exactly the same, with the added benefit of faster mashing. Specifically, putting that command on the mousewheel to skip in-game conversations even faster.
default
Bindings=(Name="XboxTypeS_B",Command="HangFromVantagePoint | BlockBreaker | DebugCamMoreSpeed | OnRelease DebugCamNormalSpeed | ExitAgilityMode | SkipCutscene | CancelGadget | DebugMenuSelectB | CancelBatarangCamera")
custom
Bindings=(Name="MouseScrollDown",Command="HangFromVantagePoint | BlockBreaker | DebugCamMoreSpeed | OnRelease DebugCamNormalSpeed | ExitAgilityMode | SkipCutscene | CancelGadget | DebugMenuSelectB | CancelBatarangCamera")
In each of these cases, the binds aren't created out of thin air. Instead, it's the same exact keybind that is normally setup for 1 key, but simply moved to another. In the second case, the keybind from one control type is simply moved to another control type. There are a few precedents that have been made in the past for these situations.
1. Quake/Half-Life - Speedrunners of these games will manually setup their keys through the in-game console or by directly editing the config.cfg file for each game. In the case of Half-Life, custom keybinds that aren't accessible through the in-game config menu are used. Example: The Half-Life shotgun is normally accessed by pressing 3 (bound to +slot3), then clicking mouse1 (bound to +attack). If there are other weapons in the same slot category, like the 9mmAR, you have to press 3 multiple times until the weapon desired is selected, then equip it by pressing the fire key. The custom keybind that runners use in this situation is "use weapon_shotgun" or "use weapon_9mmAR" which do not exist in the key setup menu. This allows a runner to have each weapon bound to a specific key, and 1 button press immediately brings up the weapon. Runners to ask for confirmation: oasiz, coolkid
2. Borderlands 1 (also on the Unreal engine) - On the PC version of Borderlands, there is a bind that can drop the current weapon you're holding (I believe it's either the - or = key by default). By dropping a weapon then immediately picking it up, the weapon is instantly reloaded. Due to it's position, runners will manually edit the INI file to move that key to another one that is more convenient to use, whether it be near the movement keys or on the mouse itself. This specific action is not accessible at all through the in-game menus and can only be changed through the INI files. Runners to ask for confirmation: YoukaiDragoon (I think he goes by just Youkai now), ProfessorBroman, TeaWrex
3. Software - Programs like Joy2Key allow players to adapt keyboard/mouse controls to controllers, while others (like the Razer software) allow mouse buttons to act as a keyboard button. With the Razer software, it's possible to setup the mousescrollup/down to both act as the spacebar. In this situation, it's a direct 1-to-1 change, meaning there's no macro or automation with the keypress. 1 tick of the wheel would count as 1 spacebar press, no more. These solutions have been allowed for numerous games in the past, but unfortunately I don't have any specific examples.
Thread title: