1
1
using LCDonald . Core . Model ;
2
2
using System ;
3
- using System . Collections . Concurrent ;
4
3
using System . Collections . Generic ;
5
4
using System . Linq ;
6
5
using System . Text ;
@@ -73,8 +72,8 @@ public override List<LCDGameInput> GetAvailableInputs()
73
72
private int _ringsMissed ;
74
73
private int _level ;
75
74
76
- private ConcurrentBag < int > _ringPositions = new ConcurrentBag < int > ( ) ;
77
- private bool _blockRingSpawn ;
75
+ private List < int > _ringPositions = new List < int > ( ) ;
76
+ private int _blockRingSpawnCount ;
78
77
79
78
private Random _rng = new Random ( ) ;
80
79
@@ -91,7 +90,7 @@ protected override List<string> GetVisibleElements()
91
90
92
91
elements . Add ( GetTailsElement ( ) ) ;
93
92
94
- foreach ( var ringPos in _ringPositions )
93
+ foreach ( var ringPos in ThreadSafeRingList ( ) )
95
94
elements . Add ( "ring-" + ringPos ) ;
96
95
97
96
return elements ;
@@ -116,14 +115,15 @@ public override void InitializeGameState()
116
115
_ringsMissed = 0 ;
117
116
_level = 0 ;
118
117
119
- _ringPositions = new ConcurrentBag < int > ( ) ;
118
+ _ringPositions = new List < int > ( ) ;
120
119
121
120
_customUpdateSpeed = 900 ;
122
121
QueueSound ( new LCDGameSound ( "../common/game_start.ogg" ) ) ;
123
122
124
- // TODO wait for sound to end before spawning rings (w/animation?)
125
- _blockRingSpawn = true ;
126
- //_isInputBlocked = true;
123
+ // Wait for sound to end before spawning rings
124
+ // 2x custom loop is about the correct speed.
125
+ _blockRingSpawnCount = 2 ;
126
+ _isInputBlocked = true ;
127
127
}
128
128
129
129
public override void HandleInputs ( List < LCDGameInput > pressedInputs )
@@ -146,15 +146,14 @@ public override void HandleInputs(List<LCDGameInput> pressedInputs)
146
146
protected override void UpdateCore ( )
147
147
{
148
148
// Collect rings if tails is in front
149
- foreach ( var ringPos in _ringPositions )
149
+ foreach ( var ringPos in ThreadSafeRingList ( ) )
150
150
{
151
151
var digit = ringPos % 10 ;
152
152
153
153
if ( digit == _tailsPosition && ringPos > 40 )
154
154
{
155
155
QueueSound ( new LCDGameSound ( "../common/hit.ogg" ) ) ;
156
- var takeout = ringPos ;
157
- _ringPositions . TryTake ( out takeout ) ;
156
+ _ringPositions . Remove ( ringPos ) ;
158
157
_ringsCollected ++ ;
159
158
}
160
159
}
@@ -163,7 +162,7 @@ protected override void UpdateCore()
163
162
164
163
public override void CustomUpdate ( )
165
164
{
166
- if ( _ringsCollected = = 30 )
165
+ if ( _ringsCollected > = 30 )
167
166
{
168
167
QueueSound ( new LCDGameSound ( "../common/level_up.ogg" ) ) ;
169
168
_ringsMissed = 0 ;
@@ -179,68 +178,80 @@ public override void CustomUpdate()
179
178
return ;
180
179
}
181
180
182
- if ( _blockRingSpawn )
183
- _blockRingSpawn = false ;
184
- else
181
+ if ( _blockRingSpawnCount > 0 )
185
182
{
183
+ _blockRingSpawnCount -- ;
184
+ _isInputBlocked = false ;
185
+ }
186
+ else
187
+ {
186
188
// Move rings forward
187
- var movedRings = _ringPositions . Select ( x => x += 10 ) . ToList ( ) ;
188
- _ringPositions . Clear ( ) ;
189
- foreach ( var i in movedRings )
190
- _ringPositions . Add ( i ) ;
189
+ _ringPositions = ThreadSafeRingList ( ) . Select ( x => x += 10 ) . ToList ( ) ;
191
190
192
- foreach ( var ringPos in _ringPositions )
191
+ foreach ( var ringPos in ThreadSafeRingList ( ) )
193
192
{
194
193
if ( ringPos > 50 )
195
194
{
196
195
QueueSound ( new LCDGameSound ( "../common/miss.ogg" ) ) ;
197
- var takeout = ringPos ;
198
- _ringPositions . TryTake ( out takeout ) ;
196
+ _ringPositions . Remove ( ringPos ) ;
199
197
_ringsMissed ++ ;
200
198
201
199
// Pause ring spawn/advance if there was a miss
202
- _blockRingSpawn = true ;
200
+ _blockRingSpawnCount = 1 ;
203
201
204
202
var verticalPos = ringPos % 10 ;
205
203
206
204
// Show miss indicators depending on which rings were missed
207
205
if ( verticalPos == 1 )
208
- BlinkElement ( MISS_CENTER , 2 ) ;
206
+ BlinkElement ( MISS_CENTER , 1 ) ;
209
207
else if ( verticalPos == 2 )
210
208
{
211
- BlinkElement ( MISS_CENTER , 2 ) ;
212
- BlinkElement ( MISS_BOTTOM , 2 ) ;
209
+ BlinkElement ( MISS_CENTER , 1 ) ;
210
+ BlinkElement ( MISS_BOTTOM , 1 ) ;
213
211
214
212
}
215
213
else if ( verticalPos == 3 )
216
- BlinkElement ( MISS_BOTTOM , 2 ) ;
214
+ BlinkElement ( MISS_BOTTOM , 1 ) ;
217
215
}
218
216
}
219
217
220
218
if ( _ringsMissed == 10 )
219
+ {
221
220
GameOver ( ) ;
222
-
223
- // Spawn new row of rings
224
- var firstRing = _rng . Next ( 11 , 14 ) ;
225
- _ringPositions . Add ( firstRing ) ;
226
-
227
- // 50% chance to add a second ring
228
- if ( _rng . Next ( 0 , 2 ) == 0 )
221
+ return ;
222
+ }
223
+
224
+ // If rings were missed, cancel the previous forward move
225
+ if ( _blockRingSpawnCount > 0 )
226
+ _ringPositions = ThreadSafeRingList ( ) . Select ( x => x -= 10 ) . ToList ( ) ;
227
+ else
229
228
{
230
- var secondRing = firstRing ;
231
-
232
- do { secondRing = _rng . Next ( 11 , 14 ) ; } while ( secondRing == firstRing ) ;
229
+ // Spawn new row of rings
230
+ var firstRing = _rng . Next ( 11 , 14 ) ;
233
231
_ringPositions . Add ( firstRing ) ;
232
+
233
+ // 50% chance to add a second ring
234
+ if ( _rng . Next ( 0 , 2 ) == 0 )
235
+ {
236
+ var secondRing = firstRing ;
237
+
238
+ do { secondRing = _rng . Next ( 11 , 14 ) ; } while ( secondRing == firstRing ) ;
239
+ _ringPositions . Add ( secondRing ) ;
240
+ }
234
241
}
235
242
}
236
243
}
237
244
238
245
private void GameOver ( )
239
246
{
247
+ _tailsPosition = - 1 ;
248
+ _level = 0 ;
249
+ _ringPositions . Clear ( ) ;
250
+
240
251
QueueSound ( new LCDGameSound ( "../common/game_over.ogg" ) ) ;
241
252
242
- var gameOverFrame1 = new List < string > { TAILS_CENTER , RING_31 , RING_32 , RING_33 } ;
243
- var gameOverFrame2 = new List < string > { TAILS_CENTER } ;
253
+ var gameOverFrame1 = new List < string > { RING_11 , RING_12 , RING_13 , RING_21 , RING_22 , RING_23 , RING_31 , RING_32 , RING_33 , RING_41 , RING_42 , RING_43 } ;
254
+ var gameOverFrame2 = new List < string > ( ) ;
244
255
245
256
// slow 4x blink
246
257
var gameOverAnimation = new List < List < string > > { gameOverFrame1 , gameOverFrame1 , gameOverFrame1 , gameOverFrame1 , gameOverFrame2 , gameOverFrame2 , gameOverFrame2 , gameOverFrame2 ,
@@ -249,22 +260,39 @@ private void GameOver()
249
260
gameOverFrame1 , gameOverFrame1 , gameOverFrame1 , gameOverFrame1 , gameOverFrame2 , gameOverFrame2 , gameOverFrame2 , gameOverFrame2 ,
250
261
gameOverFrame1 , gameOverFrame1 , gameOverFrame1 , gameOverFrame1 , gameOverFrame2 , gameOverFrame2 , gameOverFrame2 , gameOverFrame2 } ;
251
262
PlayAnimation ( gameOverAnimation ) ;
252
- _tailsPosition = - 1 ;
253
263
Stop ( ) ;
254
264
}
255
265
256
266
private void Victory ( )
257
267
{
268
+ _tailsPosition = - 1 ;
269
+ _level = 0 ;
270
+ _ringPositions . Clear ( ) ;
271
+
258
272
QueueSound ( new LCDGameSound ( "../common/game_win.ogg" ) ) ;
259
273
260
- var victoryFrame1 = GetAllGameElements ( ) ;
261
- var victoryFrame2 = new List < string > { } ;
262
-
263
- // slow 4x sequence
264
- var victoryAnimation = new List < List < string > > { victoryFrame1 , victoryFrame1 , victoryFrame1 , victoryFrame1 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 } ;
274
+ // 3x levels + 10x all
275
+ var victoryFrame1 = new List < string > { LEVEL_1 , LEVEL_2 , LEVEL_3 } ;
276
+ var victoryFrame2 = new List < string > ( ) ;
277
+ var victoryFrame3 = GetAllGameElements ( ) ;
278
+
279
+ var victoryAnimation = new List < List < string > > { victoryFrame1 , victoryFrame1 , victoryFrame1 , victoryFrame1 , victoryFrame1 , victoryFrame1 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 ,
280
+ victoryFrame1 , victoryFrame1 , victoryFrame1 , victoryFrame1 , victoryFrame1 , victoryFrame1 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 ,
281
+ victoryFrame1 , victoryFrame1 , victoryFrame1 , victoryFrame1 , victoryFrame1 , victoryFrame1 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 ,
282
+ victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 ,
283
+ victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 ,
284
+ victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 ,
285
+ victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 ,
286
+ victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 ,
287
+ victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 ,
288
+ victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 ,
289
+ victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 ,
290
+ victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 ,
291
+ victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame3 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 , victoryFrame2 } ;
265
292
PlayAnimation ( victoryAnimation ) ;
266
- _tailsPosition = - 1 ;
267
293
Stop ( ) ;
268
294
}
295
+
296
+ private List < int > ThreadSafeRingList ( ) => new List < int > ( _ringPositions ) ;
269
297
}
270
298
}
0 commit comments