@@ -21,6 +21,9 @@ final class LauncherModel: ObservableObject {
2121 @ Published var showAtStartup : Bool { didSet { defaults . set ( showAtStartup , forKey : Prefs . showAtStartup ) } }
2222 @ Published var wideHUD : Bool { didSet { defaults . set ( wideHUD , forKey : Prefs . wideHUD ) } }
2323 private var setHUDPOS = false // HUDPOS was set by us (not by the caller)
24+ @ Published var controller : Bool { didSet { defaults . set ( controller , forKey : Prefs . controller ) } }
25+ @ Published var stickDeadzone : Double { didSet { defaults . set ( stickDeadzone , forKey : Prefs . stickDeadzone ) } }
26+ private var setPad = false // NFSU2_PAD / NFSU2_PAD_DEADZONE were set by us
2427 @ Published var job : Job ? = nil
2528 @ Published var notice : String ? = nil
2629
@@ -41,7 +44,7 @@ final class LauncherModel: ObservableObject {
4144 let fm = FileManager . default
4245 let hasOriginal = fm . isExecutableFile ( atPath : Paths . engine ( nil , hd : false ) . path )
4346 let hasHD = fm . isExecutableFile ( atPath : Paths . engine ( nil , hd : true ) . path )
44- defaults . register ( defaults : [ Prefs . showAtStartup : true ] )
47+ defaults . register ( defaults : [ Prefs . showAtStartup : true , Prefs . controller : true , Prefs . stickDeadzone : 0.10 ] )
4548 var e = Engine ( rawValue : defaults . string ( forKey : Prefs . engine ) ?? " " ) ?? . original
4649 if let env = ProcessInfo . processInfo . environment [ " NFSU2_ENGINE " ] , let f = Engine ( rawValue : env ) { e = f }
4750 if e == . hd && ! hasHD { e = . original }
@@ -51,6 +54,8 @@ final class LauncherModel: ObservableObject {
5154 fullscreen = defaults . bool ( forKey : Prefs . fullscreen )
5255 showAtStartup = defaults . bool ( forKey : Prefs . showAtStartup )
5356 wideHUD = defaults . bool ( forKey : Prefs . wideHUD )
57+ controller = defaults . bool ( forKey : Prefs . controller )
58+ stickDeadzone = min ( 0.5 , max ( 0 , defaults . double ( forKey : Prefs . stickDeadzone ) ) )
5459 }
5560
5661 var location : GameLocation ? {
@@ -118,6 +123,13 @@ final class LauncherModel: ObservableObject {
118123 if wideHUD { setenv ( " HUDPOS " , " 1 " , 1 ) ; setHUDPOS = true }
119124 else if setHUDPOS { unsetenv ( " HUDPOS " ) ; setHUDPOS = false }
120125 }
126+ // Controller settings; NFSU2_PAD / NFSU2_PAD_DEADZONE set by hand still win. Ours
127+ // are overwritten on every Play, so a change takes effect without restarting.
128+ if setPad || ( env [ " NFSU2_PAD " ] == nil && env [ " NFSU2_PAD_DEADZONE " ] == nil ) {
129+ setenv ( " NFSU2_PAD " , controller ? " 1 " : " 0 " , 1 )
130+ setenv ( " NFSU2_PAD_DEADZONE " , String ( format : " %.2f " , stickDeadzone ) , 1 )
131+ setPad = true
132+ }
121133 var e = engine
122134 if ! hasEngine ( e ) { e = ( e == . hd ) ? . original : . hd }
123135 let path = Paths . engine ( loc . build , hd : e == . hd ) . path
0 commit comments