@@ -45,8 +45,15 @@ public class PinMameGamelogicEngine : MonoBehaviour, IGamelogicEngine
45
45
public PinMameGame Game { get => _game ; set => _game = value ; }
46
46
47
47
[ 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
+
50
57
public GamelogicEngineSwitch [ ] AvailableSwitches {
51
58
get {
52
59
UpdateCaches ( ) ;
@@ -102,7 +109,10 @@ public GamelogicEngineLamp[] AvailableLamps {
102
109
private double _audioInputStart ;
103
110
private double _audioOutputStart ;
104
111
private int _audioNumSamplesInput ;
105
- private int _audioNumSamplesOutput ;
112
+ private int _audioNumSamplesOutput ;
113
+
114
+ public bool _solenoidsEnabled ;
115
+ public long _solenoidDelayStart ;
106
116
107
117
private void Awake ( )
108
118
{
@@ -118,8 +128,8 @@ private void Start()
118
128
}
119
129
120
130
public void OnInit ( Player player , TableApi tableApi , BallManager ballManager )
121
- {
122
- // turn off all lamps
131
+ {
132
+ // turn off all lamps
123
133
foreach ( var lamp in _lamps . Values ) {
124
134
OnLampChanged ? . Invoke ( this , new LampEventArgs ( lamp . Id , 0 ) ) ;
125
135
}
@@ -130,8 +140,8 @@ public void OnInit(Player player, TableApi tableApi, BallManager ballManager)
130
140
_pinMame . SetHandleKeyboard ( false ) ;
131
141
_pinMame . SetHandleMechanics ( false ) ;
132
142
133
- _pinMame . OnGameStarted += GameStarted ;
134
- _pinMame . OnGameEnded += GameEnded ;
143
+ _pinMame . OnGameStarted += OnGameStarted ;
144
+ _pinMame . OnGameEnded += OnGameEnded ;
135
145
_pinMame . OnDisplayAvailable += OnDisplayAvailable ;
136
146
_pinMame . OnDisplayUpdated += OnDisplayUpdated ;
137
147
_pinMame . OnAudioAvailable += OnAudioAvailable ;
@@ -141,6 +151,8 @@ public void OnInit(Player player, TableApi tableApi, BallManager ballManager)
141
151
_pinMame . OnSolenoidUpdated += OnSolenoidUpdated ;
142
152
_player = player ;
143
153
154
+ _solenoidsEnabled = SolenoidDelay == 0 ;
155
+
144
156
try {
145
157
_pinMame . StartGame ( romId ) ;
146
158
@@ -149,12 +161,24 @@ public void OnInit(Player player, TableApi tableApi, BallManager ballManager)
149
161
}
150
162
}
151
163
152
- private void GameStarted ( )
164
+ private void OnGameStarted ( )
153
165
{
154
166
Logger . Info ( $ "[PinMAME] Game started.") ;
155
167
_isRunning = true ;
156
168
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
+
157
179
SendInitialSwitches ( ) ;
180
+
181
+ _solenoidDelayStart = DateTimeOffset . Now . ToUnixTimeMilliseconds ( ) ;
158
182
}
159
183
160
184
private void Update ( )
@@ -388,23 +412,39 @@ private void OnMechUpdated(int mechNo, PinMame.PinMameMechInfo mechInfo)
388
412
private void OnSolenoidUpdated ( int internalId , bool isActive )
389
413
{
390
414
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 } ") ;
398
439
}
399
-
400
440
}
401
441
else
402
442
{
403
443
Logger . Warn ( $ "[PinMAME] <= coil UNMAPPED { internalId } : { isActive } ") ;
404
444
}
405
445
}
406
446
407
- private void GameEnded ( )
447
+ private void OnGameEnded ( )
408
448
{
409
449
Logger . Info ( $ "[PinMAME] Game ended.") ;
410
450
_isRunning = false ;
@@ -455,8 +495,8 @@ public void StopGame()
455
495
{
456
496
if ( _pinMame != null ) {
457
497
_pinMame . StopGame ( ) ;
458
- _pinMame . OnGameStarted -= GameStarted ;
459
- _pinMame . OnGameEnded -= GameEnded ;
498
+ _pinMame . OnGameStarted -= OnGameStarted ;
499
+ _pinMame . OnGameEnded -= OnGameEnded ;
460
500
_pinMame . OnDisplayAvailable -= OnDisplayAvailable ;
461
501
_pinMame . OnDisplayUpdated -= OnDisplayUpdated ;
462
502
_pinMame . OnAudioAvailable -= OnAudioAvailable ;
0 commit comments