@@ -9,6 +9,7 @@ use std::collections::HashMap;
9
9
10
10
enum DrawEffect < ' a > {
11
11
None ,
12
+ Darker ,
12
13
Flash ( & ' a Vec < i8 > ) ,
13
14
}
14
15
@@ -152,6 +153,9 @@ impl Board {
152
153
draw ( [ 1.0 , 1.0 , 1.0 , 0.5 ] , outer) ;
153
154
}
154
155
}
156
+ DrawEffect :: Darker => {
157
+ draw ( [ 0.0 , 0.0 , 0.0 , 0.9 ] , outer) ;
158
+ }
155
159
}
156
160
}
157
161
}
@@ -175,6 +179,7 @@ impl Metrics {
175
179
enum State {
176
180
Flashing ( isize , Instant , Vec < i8 > ) ,
177
181
Falling ( Board ) ,
182
+ GameOver ,
178
183
}
179
184
180
185
struct Game {
@@ -213,8 +218,12 @@ impl Game {
213
218
self . state = State :: Falling ( self . possible_pieces [ idx] . clone ( ) ) ;
214
219
self . shift = ( 0 , 0 ) ;
215
220
216
- for _ in 0 .. rng. gen_range ( 0 , 4usize ) {
217
- self . rotate ( false )
221
+ if self . board . merged ( & self . falling_shifted ( ) ) . is_none ( ) {
222
+ self . state = State :: GameOver ;
223
+ } else {
224
+ for _ in 0 .. rng. gen_range ( 0 , 4usize ) {
225
+ self . rotate ( false )
226
+ }
218
227
}
219
228
}
220
229
@@ -229,6 +238,7 @@ impl Game {
229
238
} ;
230
239
( self . board . clone ( ) , draw_effect)
231
240
}
241
+ State :: GameOver => ( self . board . clone ( ) , DrawEffect :: Darker ) ,
232
242
State :: Falling ( _) => (
233
243
self . board . merged ( & self . falling_shifted ( ) ) . unwrap ( ) , DrawEffect :: None ) ,
234
244
} ;
@@ -242,6 +252,7 @@ impl Game {
242
252
State :: Falling ( state_falling) => {
243
253
state_falling. shifted ( self . shift )
244
254
}
255
+ State :: GameOver { .. } => panic ! ( ) ,
245
256
State :: Flashing { .. } => panic ! ( ) ,
246
257
}
247
258
}
@@ -272,6 +283,7 @@ impl Game {
272
283
self . new_falling ( )
273
284
}
274
285
}
286
+ State :: GameOver { } => { } ,
275
287
}
276
288
}
277
289
@@ -329,12 +341,20 @@ impl Game {
329
341
_ => return ,
330
342
}
331
343
}
344
+ State :: GameOver { } => {
345
+ match key {
346
+ Key :: Return => {
347
+ self . board . 0 . clear ( ) ;
348
+ self . new_falling ( ) ;
349
+ } ,
350
+ _ => return ,
351
+ }
352
+ } ,
332
353
}
333
354
}
334
355
335
356
fn rotate ( & mut self , counter : bool ) {
336
357
match & mut self . state {
337
- State :: Flashing { ..} => panic ! ( ) ,
338
358
State :: Falling ( state_falling) => {
339
359
let rotated = if counter {
340
360
state_falling. rotated ( )
@@ -361,6 +381,8 @@ impl Game {
361
381
}
362
382
}
363
383
}
384
+ State :: GameOver { ..} => panic ! ( ) ,
385
+ State :: Flashing { ..} => panic ! ( ) ,
364
386
}
365
387
}
366
388
}
0 commit comments