@@ -45,8 +45,15 @@ public class PinMameGamelogicEngine : MonoBehaviour, IGamelogicEngine
4545 public PinMameGame Game { get => _game ; set => _game = value ; }
4646
4747 [ HideInInspector ]
48- public string romId = string . Empty ;
49-
48+ public string romId = string . Empty ;
49+
50+ [ Tooltip ( "Disable built in mechs" ) ]
51+ public bool DisableMechs = true ;
52+
53+ [ Min ( 0f ) ]
54+ [ Tooltip ( "Delay after startup to listen for solenoid events." ) ]
55+ public float SolenoidDelay = 0 ;
56+
5057 public GamelogicEngineSwitch [ ] AvailableSwitches {
5158 get {
5259 UpdateCaches ( ) ;
@@ -102,7 +109,10 @@ public GamelogicEngineLamp[] AvailableLamps {
102109 private double _audioInputStart ;
103110 private double _audioOutputStart ;
104111 private int _audioNumSamplesInput ;
105- private int _audioNumSamplesOutput ;
112+ private int _audioNumSamplesOutput ;
113+
114+ public bool _solenoidsEnabled ;
115+ public long _solenoidDelayStart ;
106116
107117 private void Awake ( )
108118 {
@@ -118,8 +128,8 @@ private void Start()
118128 }
119129
120130 public void OnInit ( Player player , TableApi tableApi , BallManager ballManager )
121- {
122- // turn off all lamps
131+ {
132+ // turn off all lamps
123133 foreach ( var lamp in _lamps . Values ) {
124134 OnLampChanged ? . Invoke ( this , new LampEventArgs ( lamp . Id , 0 ) ) ;
125135 }
@@ -130,8 +140,8 @@ public void OnInit(Player player, TableApi tableApi, BallManager ballManager)
130140 _pinMame . SetHandleKeyboard ( false ) ;
131141 _pinMame . SetHandleMechanics ( false ) ;
132142
133- _pinMame . OnGameStarted += GameStarted ;
134- _pinMame . OnGameEnded += GameEnded ;
143+ _pinMame . OnGameStarted += OnGameStarted ;
144+ _pinMame . OnGameEnded += OnGameEnded ;
135145 _pinMame . OnDisplayAvailable += OnDisplayAvailable ;
136146 _pinMame . OnDisplayUpdated += OnDisplayUpdated ;
137147 _pinMame . OnAudioAvailable += OnAudioAvailable ;
@@ -141,6 +151,8 @@ public void OnInit(Player player, TableApi tableApi, BallManager ballManager)
141151 _pinMame . OnSolenoidUpdated += OnSolenoidUpdated ;
142152 _player = player ;
143153
154+ _solenoidsEnabled = SolenoidDelay == 0 ;
155+
144156 try {
145157 _pinMame . StartGame ( romId ) ;
146158
@@ -149,12 +161,24 @@ public void OnInit(Player player, TableApi tableApi, BallManager ballManager)
149161 }
150162 }
151163
152- private void GameStarted ( )
164+ private void OnGameStarted ( )
153165 {
154166 Logger . Info ( $ "[PinMAME] Game started.") ;
155167 _isRunning = true ;
156168
169+ if ( DisableMechs )
170+ {
171+ for ( int id = 0 ; id < 10 ; id ++ )
172+ {
173+ Logger . Info ( $ "Disabling mech { id } ") ;
174+
175+ _pinMame . SetMech ( id , null ) ;
176+ }
177+ }
178+
157179 SendInitialSwitches ( ) ;
180+
181+ _solenoidDelayStart = DateTimeOffset . Now . ToUnixTimeMilliseconds ( ) ;
158182 }
159183
160184 private void Update ( )
@@ -388,23 +412,39 @@ private void OnMechUpdated(int mechNo, PinMame.PinMameMechInfo mechInfo)
388412 private void OnSolenoidUpdated ( int internalId , bool isActive )
389413 {
390414 if ( _coils . ContainsKey ( internalId ) )
391- {
392- Logger . Info ( $ "[PinMAME] <= coil { _coils [ internalId ] . Id } ({ internalId } ): { isActive } | { _coils [ internalId ] . Description } ") ;
393-
394- lock ( _dispatchQueue )
395- {
396- _dispatchQueue . Enqueue ( ( ) =>
397- OnCoilChanged ? . Invoke ( this , new CoilEventArgs ( _coils [ internalId ] . Id , isActive ) ) ) ;
415+ {
416+ if ( ! _solenoidsEnabled )
417+ {
418+ _solenoidsEnabled = ( DateTimeOffset . Now . ToUnixTimeMilliseconds ( ) - _solenoidDelayStart ) >= SolenoidDelay ;
419+
420+ if ( _solenoidsEnabled )
421+ {
422+ Logger . Info ( $ "Solenoids enabled, { SolenoidDelay } ms passed") ;
423+ }
424+ }
425+
426+ if ( _solenoidsEnabled )
427+ {
428+ Logger . Info ( $ "[PinMAME] <= coil { _coils [ internalId ] . Id } ({ internalId } ): { isActive } | { _coils [ internalId ] . Description } ") ;
429+
430+ lock ( _dispatchQueue )
431+ {
432+ _dispatchQueue . Enqueue ( ( ) =>
433+ OnCoilChanged ? . Invoke ( this , new CoilEventArgs ( _coils [ internalId ] . Id , isActive ) ) ) ;
434+ }
435+ }
436+ else
437+ {
438+ Logger . Info ( $ "[PinMAME] <= solenoids disabled, coil { _coils [ internalId ] . Id } ({ internalId } ): { isActive } | { _coils [ internalId ] . Description } ") ;
398439 }
399-
400440 }
401441 else
402442 {
403443 Logger . Warn ( $ "[PinMAME] <= coil UNMAPPED { internalId } : { isActive } ") ;
404444 }
405445 }
406446
407- private void GameEnded ( )
447+ private void OnGameEnded ( )
408448 {
409449 Logger . Info ( $ "[PinMAME] Game ended.") ;
410450 _isRunning = false ;
@@ -455,8 +495,8 @@ public void StopGame()
455495 {
456496 if ( _pinMame != null ) {
457497 _pinMame . StopGame ( ) ;
458- _pinMame . OnGameStarted -= GameStarted ;
459- _pinMame . OnGameEnded -= GameEnded ;
498+ _pinMame . OnGameStarted -= OnGameStarted ;
499+ _pinMame . OnGameEnded -= OnGameEnded ;
460500 _pinMame . OnDisplayAvailable -= OnDisplayAvailable ;
461501 _pinMame . OnDisplayUpdated -= OnDisplayUpdated ;
462502 _pinMame . OnAudioAvailable -= OnAudioAvailable ;
0 commit comments