Ace Combat 7: Skies Unknown

4.0

Enjoying the landscape from the cockpit of a F-16
Enjoying the landscape from the cockpit of a F-16

Primary Buffer Panel

This is a game I have an absolute love/hate relationship with. It’s one of the first PC ports of the franchise and this really shows. One of my main issues with the games is it’s mediocre HOTAS support, forcing the player to crawl through .ini files manually to configure all buttons and axis. The other unforgivable issue is that this game basically supports only a FULL HD resolution of 1920x1024 and does not even have a FOV slider. This is a game meant to be played with HOTAS and a wide screen!

Keep Steam Input off

Seriously. Steam Input screwed me over on this again and again. Perfectly fine looking joysticks in the Wine Control Center set to DInput never became available as long as Steam Input is enabled for this game.

Anyway, for both exist mods. Speaking of I play this with a bunch of Macross mods and a FOV to get my VF-1 “fix”. I hear there’s also a hack to extend the resolution but that involves editing the binary with a hex editor, which I don’t feel comfortable doing since the address changes with each patch. Oh and the FOV mod somehow only works with Proton 8 for me. YMMV.

I got Ace Combat 7 to spew out a constant stream of telemetry data and events in search for more immersion. The approach is the very same that I used for X4 Foundations before: Side load lib LuaSocket, get a network connection established and start dumping extracted game data to it. This is highly experimental and the result of hacking away for the last ~4 nights. This video demonstrates the results:

Watch this video on YouTube PeerTube

To be perfectly clear: I am aware that Ace Combat is not a “flight sim”, not really worth of an API, and I know that DCS or BMS does it better and in greater detail and even with realism. This is not the point. I started working on this just for fun and to satisfy my own curiosity to see if I can make it. This may be hard to believe but chipping rocks together until the computer does what I want is “quality time” for me 🤓

Launch parameters

The usual gamescope trick has not much merit here, since Ace Combat 7 will simply not allow anything over 1920x1024. SBS is possible though.

I love to play many games with my XR glasses in Side-By-Side mode where each eye is fed with a slightly different camera position resulting in 3D depth perception.

This is similar to VR but does not offer e.g. a backchannel for head tracking. Some games, like Elite Dangerous, support this natively. Other games can be forced into a SBS like mode with ReShade and a plugin like SuperDepth3D or Rendepth Reshade. In theory are Reshade shaders compatible with vkBasalt but the depth stuff is apparently exempt from this rule so that is not an option. The approach works nicely with Proton though.

The reshade-linux repo is very useful to get you started but the required steps can be done manually too, of course.

You will need gamescope on top though, because the output has usually to be rescaled or the display ratio is completely off. This also depends on the glasses. Mine do FULL SBS so a resolution of 3840x1080 is excepted in the end.

For Elite Dangerous the correct settings would e.g. be:

gamescope -h 2160 -w 3840 -H 1080 -W 3840 –scaler stretch -e – %command%

Other games may require slightly different settings here. This is an example for Ace Combat 7: Skies Unknown with Reshade and the SuperDepth3D shader:

WINEDLLOVERRIDES=“d3dcompiler_47=n;dxgi=n,b;” gamescope -h 1080 -w 1920 -H 1080 -W 3840 –scaler stretch -b -r 60 -e – %command%

YMMV but the general idea should work with almost any game.

For the sake of completeness here is also my Input.ini located in drive_c/users/steamuser/AppData/Local/BANDAI NAMCO Entertainment/ACE COMBAT 7/Config/ configured to work with my custom DIY F-16 FLCS, Thrustmaster rudder, Cougar throttle and OpenTrack head tracking (joystick output):

Do not keep unused joysticks plugged in

Make sure only the currently used joysticks are connected. Ace Combat seems to calculate some sort of median e.g. for Flight_Throttle and you’ll get grey hair trying to find out why the in-game throttle doesn’t go full way when several joysticks are configured and plugged in since you only ever move one throttle all the time.

[JoystickSetting]
EnableJoystick=True
EnableDeviceJoystick=True
EnableDeviceFlight=True
EnableDevice1stPerson=True

[JoystickMappingFormat]
HelpComment=" ObjectFormat"
HelpComment="     X, Y, Z, Rx, Ry, Rz, Slider[1-2], POV_[U, D, L, R][1-4], Button[1-32]"
HelpComment=
HelpComment=" ValueFormat"
HelpComment="     Object, Object:[P, N, R, C]...[P, N, R, C]"
HelpComment="         P:PositiveValue / N:NegativeValue / R:ReverseSign / C:ConvertRange(+1.0~-1.0 -> 0.0~1.0)"
HelpComment=
HelpComment=" MappingFormat"
HelpComment="     Value, Value1 [&, !, +, >, <] Value2"
HelpComment="         &:IfValue2!=0 / !:IfValue2==0 / +:AddValue / >:SelectLarger / <:SelectSmaller"
HelpComment=
HelpComment=" Example"
HelpComment="     Flight_Pitch=Y:R ! Button10"
HelpComment="     Flight_HatSwitchRight=POV_R1"

[Joystick-0402044F-0000-0000-0000-504944564944]
ProductName=ThrustMaster, Inc. F-16 Flight Control System
Flight_Gun=Button1
Flight_Missile=Button4
Flight_Weapon=Button10
Flight_Target=Button5
Flight_Radar=Button14
Flight_Flare=Button17
Flight_View=Button3
Flight_AccelerationDeceleration=
Flight_AutoPilot=Button12
Flight_Pause=
Flight_HatSwitchUp=POV_U1
Flight_HatSwitchDown=POV_D1
Flight_HatSwitchLeft=POV_L1
Flight_HatSwitchRight=POV_R1
Flight_Pitch=Y:R
Flight_Roll=X:R
Flight_Yaw=
Flight_Throttle=
Flight_CameraPitch=
Flight_CameraYaw=
UI_B=Button4
UI_A=Button3
UI_X=Button1
UI_Y=Button5
UI_LB=
UI_RB=
UI_LT=Button15
UI_RT=Button9
UI_LeftStickPress=Button7
UI_RightStickPress=Button5
UI_DPadUp=POV_U1
UI_DPadDown=POV_D1
UI_DPadLeft=POV_L1
UI_DPadRight=POV_R1
UI_LeftStickUp=Y:N
UI_LeftStickDown=Y:P
UI_LeftStickLeft=X:NR
UI_LeftStickRight=X:P
UI_RightStickUp=
UI_RightStickDown=
UI_RightStickLeft=
UI_RightStickRight=
UI_Menu=Button12

[Joystick-B679044F-0000-0000-0000-504944564944]
ProductName=ThrustMaster, Inc. Thrustmaster Rudder
Flight_Gun=
Flight_Missile=
Flight_Weapon=
Flight_Target=
Flight_Radar=
Flight_Flare=
Flight_View=
Flight_AccelerationDeceleration=
Flight_AutoPilot=
Flight_Pause=
Flight_HatSwitchUp=
Flight_HatSwitchDown=
Flight_HatSwitchLeft=
Flight_HatSwitchRight=
Flight_Pitch=
Flight_Roll=
Flight_Yaw=X
Flight_Throttle=
Flight_CameraPitch=
Flight_CameraYaw=
UI_B=
UI_A=
UI_X=
UI_Y=
UI_LB=
UI_RB=
UI_LT=
UI_RT=
UI_LeftStickPress=
UI_RightStickPress=
UI_DPadUp=
UI_DPadDown=
UI_DPadLeft=
UI_DPadRight=
UI_LeftStickUp=
UI_LeftStickDown=
UI_LeftStickLeft=
UI_LeftStickRight=
UI_RightStickUp=
UI_RightStickDown=
UI_RightStickLeft=
UI_RightStickRight=
UI_Menu=

[Joystick-B687044F-0000-0000-0000-504944564944]
ProductName=ThrustMaster, Inc. Cougar Throttle
Flight_Gun=
Flight_Missile=
Flight_Weapon=Button9
Flight_Target=
Flight_Radar=Button11
Flight_Flare=Button1
Flight_View=Button13
Flight_AccelerationDeceleration=Button7
Flight_AutoPilot=Button3
Flight_Pause=Button10
Flight_HatSwitchUp=POV_U1
Flight_HatSwitchDown=POV_D1
Flight_HatSwitchLeft=POV_L1
Flight_HatSwitchRight=POV_R1
Flight_Pitch=
Flight_Roll=
Flight_Yaw=
Flight_Throttle=Rx
Flight_CameraPitch=
Flight_CameraYaw=
UI_B=
UI_A=
UI_X=
UI_Y=
UI_LB=
UI_RB=
UI_LT=
UI_RT=
UI_LeftStickPress=
UI_RightStickPress=
UI_DPadUp=POV_U1
UI_DPadDown=POV_D1
UI_DPadLeft=POV_L1
UI_DPadRight=POV_R1
UI_LeftStickUp=Y:N
UI_LeftStickDown=Y:P
UI_LeftStickLeft=X:N
UI_LeftStickRight=X:P
UI_RightStickUp=
UI_RightStickDown=
UI_RightStickLeft=
UI_RightStickRight=
UI_Menu=Button10

[Joystick-00000000-0000-0000-0000-504944564944]
ProductName=Opentrack
Flight_Gun=
Flight_Missile=
Flight_Weapon=
Flight_Target=
Flight_Radar=
Flight_Flare=
Flight_View=
Flight_AccelerationDeceleration=
Flight_AutoPilot=
Flight_Pause=
Flight_HatSwitchUp=
Flight_HatSwitchDown=
Flight_HatSwitchLeft=
Flight_HatSwitchRight=
Flight_Pitch=
Flight_Roll=
Flight_Yaw=
Flight_Throttle=
Flight_CameraPitch=X
Flight_CameraYaw=Y
UI_B=
UI_A=
UI_X=
UI_Y=
UI_LB=
UI_RB=
UI_LT=
UI_RT=
UI_LeftStickPress=
UI_RightStickPress=
UI_DPadUp=
UI_DPadDown=
UI_DPadLeft=
UI_DPadRight=
UI_LeftStickUp=
UI_LeftStickDown=
UI_LeftStickLeft=
UI_LeftStickRight=
UI_RightStickUp=
UI_RightStickDown=
UI_RightStickLeft=
UI_RightStickRight=
UI_Menu=

Head tracking

Ace Combat 7 does only support look-around with a gamepad / joystick. It also goes bonkers after a while and requires a game restart. I think this is because it tries to “auto calibrate” all the time and is eventually completely off when the tracker gets recentered externally by e.g. OpenTrack. Until then it works remarkable well. The forced “deadzone” in the middle is a little bit annoying, as it snaps the player camera back in place when coming to close to it.

Demo

Snippets of mission 11: Fleet Destruction / Operation Siren’s Song. In this mission Trigger gets to sink the Erusean Njord Fleet and destroy supply lines. It’s a rather long going mission with the option of doing own supply runs (which I did twice). Also flares.. I needed so many flares in this one.

Watch this video on YouTube PeerTube