Hotas/Joystick controls feedback thread

I couldn’t really find an appropriate thread so I made this one.

The flying with hotas already feels really nice (although the throttle stick doesn’t work on my Thrustmaster stick).
I have one complaint that I find to be really critical however.
When flying with a stick the ship drifts waaay to much to make accurate piloting possible, even when yawing a little for example, we still have to counter the orientation change because it continues to yaw a long time after we stopped working the axis.
Manually counter acting the movement is almost impossible because our motor skills just aren’t that perfect, it becomes a wobbling party,
So my wish is a stricter flight assist when it is switched on, I want the ship to stop rotating almost immediately after I let go of the stick, don’t let it drift that long, otherwise targeting becomes even worse than a stick usually is for this.
This complaint of course doesn’t apply to flight assist off flying.


WORKAROUND AND PROFILE Thrustmaster T.Flight.X Hotas

Since the z-axis/throttle stick on the T.Flight Hotas X currently doesn’t function properly I found a workaround:

  1. First install VJoy:

  2. Install UJR - Universal Joystick Remapper:

  3. Run UJR and press the button “Auto Configure Stick ID” under the “Axes 1” tab and “Buttons 1” tab.

  4. Keep the application running while playing the game.

  5. Next duplicate the “Gamepad 1” file under “Documents/Infinity Battlescape/Profiles” and rename it to “T.Flight.X”.

  6. Open the new file in a text editor and replace all content with this text:

     <!-- Ship translation -->
     <Input Event = "ShipZ" Keys = "Joystick0Axis4" Reverse="true" Type = "Axis" />
     <Input Event = "ShipForward" />
     <Input Event = "ShipBackward" />
     <Input Event = "ShipX" Keys = "" Type = "Axis" />
     <Input Event = "ShipLeft" />
     <Input Event = "ShipRight" />
     <Input Event = "ShipY" Keys = "" Reverse="false" Type = "Axis" />
     <Input Event = "ShipUp" />
     <Input Event = "ShipDown" />
     <!-- Ship orientation -->
     <Input Event = "ShipYaw" Keys = "Joystick0Axis2" Type = "Axis" />
     <Input Event = "ShipYawLeft" />
     <Input Event = "ShipYawRight" />
     <Input Event = "ShipPitch" Keys = "Joystick0Axis1" Reverse="true" Type = "Axis" />
     <Input Event = "ShipPitchUp" />
     <Input Event = "ShipPitchDown" />
     <Input Event = "ShipRoll" Keys = "Joystick0Axis0" Reverse="true" Type = "Axis" />
     <Input Event = "ShipRollLeft" />
     <Input Event = "ShipRollRight" />
     <!-- Head orientation in cockpit mode -->
     <Input Event = "HeadPitch" Keys = "" Type = "Axis" />
     <Input Event = "HeadYaw" Keys = "" Type = "Axis" />
     <Input Event = "HeadReset" DoubleTap = "true" />
     <!-- Ship controls -->
     <Input Event = "MainFire" Keys = "Joystick0Button0" />
     <Input Event = "Turbo" Keys = "Joystick0Button7" />
     <!-- Ship systems -->
     <Input Event = "Power" Keys = "P" />
     <Input Event = "Warp" Keys = "Joystick0Button4" />
     <Input Event = "ToggleFrontLights" Keys = "" />
     <Input Event = "ToggleAutoAssist" Keys = "" />
     <Input Event = "ChangeRedirectMode" Keys = "Joystick0Button5" />
     <Input Event = "ChangeFormationMode" Keys = "Joystick0Button6" />
     <Input Event = "ToggleReverseFlight" Keys = "X" />
     <!-- Target speed in flight auto assist mode -->
     <Input Event = "TargetSpeed0" Keys = "1" />
     <Input Event = "TargetSpeed1" Keys = "2" />
     <Input Event = "TargetSpeed2" Keys = "3" />
     <Input Event = "TargetSpeed3" Keys = "4" />
     <Input Event = "TargetSpeed4" Keys = "5" />
     <Input Event = "TargetSpeed5" Keys = "6" />
     <Input Event = "TargetSpeed6" Keys = "7" />
     <Input Event = "TargetSpeed7" Keys = "8" />
     <Input Event = "TargetSpeed8" Keys = "9" />
     <Input Event = "TargetSpeed9" Keys = "0" />
     <Input Event = "DeltaTargetSpeed" Keys = "" Reverse="true" Type = "Axis" />
     <Input Event = "IncrTargetSpeed" />
     <Input Event = "DecrTargetSpeed" />
     <!-- Targets selection -->
     <Input Event = "TargetCenter" Keys = "Joystick0Button1" />
     <Input Event = "TargetPrev" Keys = "Y" />
     <Input Event = "TargetNext" Keys = "U" />
     <Input Event = "TargetClosest" Keys = "C" />
     <Input Event = "TargetNone" Keys = "Backspace" />
     <!-- View controls -->
     <Input Event = "Zoom" Keys = "Joystick0Button3" />
     <Input Event = "ToggleZoom" />
     <Input Event = "CameraCockpitMode" Keys = "F1" />
     <Input Event = "CameraExternalMode" Keys = "F2" />
     <Input Event = "NextCameraMode" Keys = "F3" />
     <Input Event = "ToggleVSL" Keys = "F4" />
     <Input Event = "SwitchHUDInfoLevel" Keys = "F6" />
     <!-- Other game systems -->
     <Input Event = "Exit" Keys = "Escape" />
     <Input Event = "KeyboardMap" Keys = "Return" />
     <Input Event = "Screenshot" Keys = "F11" />
     <Input Event = "Debug" Keys = "F10" />
     <Input Event = "Debug2" Keys = "F5" />
     <Input Event = "Suicide" Keys = "F9" />
  7. Save the file and close it.

  8. Start the game and choose as keyboard profile “T.Flight.X” and as controller “DirectInput Vjoy Device”, keep the boxes “invert pitch” and “invert roll” unchecked and choose the lowest possible sensitivity in the controller sensitivity slider.

  9. Play game with T.Flight.X and lose to mouse players.


This obviously means that mouse players need to be nerfed.

MOUSE OP NURFFFZ!!! :stuck_out_tongue:

In all seriousness, thanks for figuring this out! I’ll give this a shot tomorrow when I get a chance. :wink:

1 Like

This method can also be used to use two single devices (sticks) with the current Prototype. @Zen

UJR is an application to remap one or more physical joysticks onto one virtual joystick.

It supports axis inversion, deadzones, sensitivity, axis merging and more.

Also on the vJoy download page. Click the big green “Download” Image and don’t accidentally download the older versions further down. (Happened to me :frowning: )


Moved this thread out of the private section of the forums, in case some of the Alpha weekend guys wanna use a HOTAS.


I have modified UJR to add individually settable dead zones at both ends of axes and some other useful features. I’ll get it uploaded somewhere soon.


My modified version of Universal Joystick Remapper:

Sorry it took a few days. My changes were originally against UJR 6.6 and I wanted to update them to 6.10, but my original changes weren’t in git.

In these screenshots you can see that there are now 4 configurable deadzone areas for each axis. Hopefully it’s clear enough what they each do (at least if you experiment a bit).

Plus there is a new merge mode ‘Scale’ which you can use to enter a sort of ‘Fine Control’ mode.

In the bottom screenshot I have my Y axis pushed fully forward so it’s value would normally be 100, however I have it merged with physical axis 3 (a slider) in scale mode, and axis 3 is at 50%, therefore the final value for the Y axis is reduced by 50% to make it 75.
(Y axis rests in middle at 50, so half of 100 is 75. If I pulled Y axis fully back, it would be 0 before scaling, 25 after scaling.)


I plugged my old Saitek Cyborg 3D joystick in and tried out the throttle slider in game.

It’s detected fine, but there is no appropriate event to map it to.

I tried mapping it to DeltaTargetSpeed however, as expected this results in my slider position setting the delta (ie rate of change) of my target speed, rather than my target speed itself.
This could be perfect if someone wanted to use a throttle and brake pedal to control their flight assist target speed: You accelerate while pressing the pedal, then when you take your foot off the axis output is 0 so the target speed stops changing but remains where it is.

@INovaeFlavien, if it’s not too much trouble, I’d like for there to be a TargetSpeed ‘event’ added that could be mapped to an axis such that:
A value of -1 would mean target speed = stop.
A value of 0 would mean target speed = 50%
A value of 1 would mean target speed = 100%
This is effectively an analogue version of TargetSpeed0 through TargetSpeed9.


Sounds good, will do.


Great! Thanks.

I’ve just had an idea… I think it could be really useful to have one key or axis do something different depending on whether flight assist was on or off. This could be specified by another attribute in the XML.

<Input Event = "ShipZ" Keys = "Joystick0Axis6" Type = "Axis" FlightAssist="off" />
<Input Event = "TargetSpeed" Keys = "Joystick0Axis6" Type = "Axis" FlightAssist="on" />

I can imagine plenty of other uses, eg the W and S keys.

What do you think @INovaeFlavien?

It starts to get pretty complicated, first of all because the input / mapper doesn’t know anything that is game-specific ( it’s part of the engine, not the game ), and secondly because it’ll make the GUI menu / window ( when we’ll implement it ) pretty complicated. I’m afraid it’ll scare first time users…

Interesting. So the game registers events with the engine, and the engine maps the inputs onto the events? Or something like that?
I imagine the easiest to implement would be having the game listen for two more events for each existing one: ShipZ_FAon and ShipZ_FAoff, TargetSpeed_FAon, etc.

However, it sounds like the most consistent with your current architecture might be to have alternate input modes handled by the engine that the game doesn’t even have to know about.

<CycleInputScheme Keys = "Space" />
  <InputScheme Id="A">
    <Input Event = "ShipZ" Keys = "Joystick0Axis6" Type = "Axis" />
    <Input Event = "ShipForward" />
    <Input Event = "ShipBackward" />
    <Input Event = "ShipX" />
    <Input Event = "ShipLeft" Keys="Joystick0Button11" />
    <Input Event = "ShipRight" Keys="Joystick0Button13" />
    <Input Event = "ShipY" />
    <Input Event = "TargetSpeed" />
    <Input Event = "ToggleFlightAssist" Keys = "Space" />
  <InputScheme  Id="B">
    <Input Event = "ShipZ"/>
    <Input Event = "ShipForward" Keys = "W" />
    <Input Event = "ShipBackward" Keys = "S" />
    <Input Event = "ShipX" />
    <Input Event = "ShipLeft" Keys="Joystick0Button11" />
    <Input Event = "ShipRight" Keys="Joystick0Button13" />
    <Input Event = "ShipY" />
    <Input Event = "TargetSpeed" Keys = "Joystick0Axis6" Type = "Axis" />
    <Input Event = "ToggleFlightAssist" Keys = "Space" />

I’ve intentionally used Space to toggle input scheme as well as toggle flight assist so that they switch at the same time, however you could obviously use different keys.

I’m sure an intuitive GUI can be designed, just ask your community!

It may be worth it to have the GUI simple but add support for those who know how to make further changes directly in the xml files.


I tried with a X-box one controller and a Logitech Extreme 3D Pro. They were both detected they both
did not seem to work exactly right. Now my key bindings and mouse do not seem to be correct.

[Q] and [A] have switched.

How do you go in and set the key binds for key board and the HOTAS and please make an example so that
even I can follow what to do. And not mess it up !

Xbox controllers are supported by default, just use the gamepad settings or use this profile which I very like:

To change keybindings you have to edit your custom keybindings xml file with a text editor, the values are self explainatory. You can also use the detect input tool which is now somewhere in the games folder. I hope that helps.


thanks ill give it a try.

Is this workaround still required or does it work now? The program mentioned in this thread - Universal Joystick Remapper - is no longer available.

Speaking of joysticks, we’ve detected a conflict bug between multiple devices that was introduced a couple patches ago. It’ll be fixed in the next patch ( in a week and a half ).


Its not necessary anymore. Works fine without it.
Here is a working profile for it:

Just put that in your “C:\Users\Username\Documents\I-Novae Studios\Infinity Battlescape\Profiles” folder and choose it in the launcher. The profile is made for the T.Flight Hotas X when it is connected in PS3 mode to pc.
Just toggle the switch on the backside from “PC” to “PS3” and connect it to the pc.(was easier to configure, but you can also make your own profile in PC mode)

Here is a short list:

escape - toggle keymapping screen
F1 - cockpit camera
F2 - outside camera
SE Button - Leaderboard
ST button - game menu

stick - yaw and pitch
twist and shoulder whip - roll
hat stick - up and down and strafe movement
fire key R1 - primary fire
fire key L1 - secondary fire
L3 Stick key - missile fire
R3 Stick key - chaff fire

Throttle Stick:
throttle - throttle
twist and shoulder whip - roll
Backside R2 button - target center
Backside L2 button - target none (holding the button and moving the right stick also lets you change your view)
Thumb button 8 - boost
Thumb button 5 - system menu
Thumb button 6 - weapons menu
Thumb button 7 - comms menu


So does it support rudder pedals?