Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ford Racing 3: problem with analog triggers and calibration #62

Open
Goblan opened this issue Jul 22, 2023 · 3 comments
Open

Ford Racing 3: problem with analog triggers and calibration #62

Goblan opened this issue Jul 22, 2023 · 3 comments

Comments

@Goblan
Copy link

Goblan commented Jul 22, 2023

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 Goblan changed the title Ford Racing 3 Ford Racing 3: problem with analog triggers and calibration Jul 22, 2023
@samuelgr
Copy link
Owner

samuelgr commented Sep 8, 2023

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?

@instinctualjealousy
Copy link

instinctualjealousy commented Oct 9, 2023

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.

@samuelgr
Copy link
Owner

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants