Xidi icon indicating copy to clipboard operation
Xidi copied to clipboard

Ford Racing 3: problem with analog triggers and calibration

Open Goblan opened this issue 11 months ago • 3 comments

I'm having an issue with this game on Windows 8.1, 10 and 11:

AFAIK this is a dinput 8 game, so dinput8.dll has to be used in this case. Now, when using dinput8.dll, vibration works fine but triggers won't:

In the game's mapping menu I assign left trigger to break and right trigger to accelerate. The game will recognize Left trigger as "RX Axis" and Right trigger as "RY Axis". So far, so good, cause they're 2 different axes indeed (thanks to "ExtendedGamepad" value in Xidi.ini file). Once you're racing, though, triggers behave as follows:

Right trigger

0 to halfway pressed = break/reverse Halfway to fully pressed= accelerate

Left trigger

Does absolutely nothing despite being mapped.

I guess all it needs is calibrating triggers and sticks in the game's calibration menu, but here's the issue: the game will crash when exiting calibration menu, with the following message:

JOYSTICK:1574: Failed to set device properties (0x80004001)

Problem when this happens is that changes are not saved and therefore the game will use the triggers as described. When using dinput.dll, though, the game won't crash when exiting calibration menu, but both vibration and analog triggers won't work.

The only setting I've found so far that will kinda fix the issue is changing to "XInputNative" value in Xidi.ini file, and it's fine for the most part: right trigger will accelerate and left trigger will break, just as intended. The only issue is the game recognizes both as part of the same axis, so I can't use both at the same time. I know, I know, who would want to accelerate and break at the same time, right? Sometimes I like to try a few things and also I feel I am in full control of the car, so to speak. It may not be important in this game, but some more technical games/simulators might as well make good use of it.

Do you think this coul be addressed? I will run as many tests as you require.

Thanks a lot for such incredible tool.

Goblan avatar Jul 22 '23 09:07 Goblan

Could you please reproduce the issue with logging enabled and then upload a log file from Xidi? Add this to your Xidi.ini:

[Log]
Enabled                             = yes
Level                               = 4

Also, if you created a custom mapper configuration, could you please share that too?

samuelgr avatar Sep 08 '23 01:09 samuelgr

XInputNative should be exposing separate axes as well (Z and ZRot) for LT and RT, so it's confusing why it would behave that way in FR3. What you described as XInputNative sounds like XInputSharedTriggers to me.

This may not be your issue, but it is worth noting some old games for whatever reason don't like gas and brake being on discrete axes, and some outright don't allow it (Midnight Club II). Sometimes the merged triggers of XInputSharedTriggers are desirable in this case. It's better to have working controls without the benefit of separated gas and brake, than a car that accelerates on its own or whatever madness occurs. Merged triggers are similar to an analog stick (you can't push it up and down at the same time) and my guess is due to the joystick heritage of old PC games, some games expect gas and brake to be a single axis.

Also, I'm not aware of a game that REQUIRES calibration to get input to functionally work. It's more of a legacy feature for fine-tuning a gamepad's response in a wild-west era of gamepads. You'd think minimum was minimum and maximum was maximum, and it'd just read it normally, unless it's getting confused about the virtual controller itself.

Edit: I have this game, so I went ahead and tested it- I'm convinced that while the game lets you independently assign gas and brake, it's expecting a single axis between the both of them. XInputSharedTriggers works. XInputNative for me exudes the same behavior described from you using ExtendedGamepad. Right trigger covers both gas and brake range with the halfway point being no-input (like an analog stick), and left trigger is unresponsive. I went into the calibration menu (without crash), and I don't think it's configurable enough to fundamentally change this behavior.

instinctualjealousy avatar Oct 09 '23 18:10 instinctualjealousy

Another thing about XInputNative and ExtendedGamepad that will probably really confuse old games is that games expect "not pressed" to be neutral, whereas both of these mappers use "not pressed" as extreme negative.

I'm not sure how this game handles separate vs shared axis, but one option for separating them that might be less confusing to the game:

TriggerLT           = Axis(RotX, +)
TriggerRT           = Axis(RotY, +)

What this will do is set LT and RT to report neutral (instead of extreme negative) when not pressed and extreme positive when pressed.

samuelgr avatar Oct 11 '23 05:10 samuelgr