@@ -38,6 +38,12 @@ enum DeathCause {
38
38
Fuel ,
39
39
}
40
40
41
+ #[ derive( PartialEq , Eq ) ]
42
+ enum GameMode {
43
+ Normal ,
44
+ God ,
45
+ }
46
+
41
47
struct Location {
42
48
c : u16 ,
43
49
l : u16 ,
@@ -125,6 +131,7 @@ struct World {
125
131
gas : u16 ,
126
132
score : u16 ,
127
133
death_cause : DeathCause ,
134
+ game_mode : GameMode ,
128
135
}
129
136
130
137
impl World {
@@ -144,6 +151,7 @@ impl World {
144
151
score : 0 ,
145
152
gas : 1700 ,
146
153
death_cause : DeathCause :: None ,
154
+ game_mode : GameMode :: Normal ,
147
155
}
148
156
}
149
157
}
@@ -164,6 +172,10 @@ fn draw(mut sc: &Stdout, world: &mut World) -> std::io::Result<()> {
164
172
. queue ( MoveTo ( 2 , 3 ) ) ?
165
173
. queue ( Print ( format ! ( " Fuel: {} " , world. gas / 100 ) ) ) ?;
166
174
175
+ if world. game_mode == GameMode :: God {
176
+ draw_god_mode ( sc) ;
177
+ }
178
+
167
179
// draw fuel
168
180
for index in ( 0 ..world. fuel . len ( ) ) . rev ( ) {
169
181
match world. fuel [ index] . status {
@@ -418,11 +430,16 @@ fn pause_screen(mut sc: &Stdout , world: &World) {
418
430
let _ = sc. flush ( ) ;
419
431
}
420
432
433
+ fn draw_god_mode ( mut sc : & Stdout ) {
434
+ let msg: & str = " GOD MODE: ON " ;
435
+ let _ = sc. queue ( MoveTo ( 2 , 4 ) ) ;
436
+ let _ = sc. queue ( Print ( msg) ) ;
437
+ }
438
+
421
439
fn goodbye_screen ( mut sc : & Stdout , world : & World ) {
422
440
let goodbye_msg1: & str = " βββββββ βββββββ βββββββ βββββββ βββββββ ββββββ ββββ βββββββββββββββ\n \r ββββββββ ββββββββββββββββββββββββββ ββββββββ βββββββββββββ ββββββββββββββββ\n \r βββ βββββββ ββββββ ββββββ βββ βββ βββββββββββββββββββββββββββββ βββ\n \r βββ ββββββ ββββββ ββββββ βββ βββ ββββββββββββββββββββββββββββ βββ\n \r βββββββββββββββββββββββββββββββββββ ββββββββββββ ββββββ βββ ββββββββββββββ\n \r βββββββ βββββββ βββββββ βββββββ βββββββ βββ ββββββ ββββββββββββββ\n " ;
423
441
let goodbye_msg2: & str = "ββββββββββββ βββ ββββββ ββββ ββββββ βββββββββββ\n \r ββββββββββββ ββββββββββββββββ ββββββ ββββββββββββ\n \r βββ ββββββββββββββββββββββ ββββββββββ ββββββββ\n \r βββ βββββββββββββββββββββββββββββββββ ββββββββ\n \r βββ βββ ββββββ ββββββ βββββββββ ββββββββββββββ\n \r βββ βββ ββββββ ββββββ ββββββββ ββββββββββββββ\n " ;
424
442
let _ = sc. queue ( Clear ( crossterm:: terminal:: ClearType :: All ) ) ;
425
-
426
443
let _ = sc. queue ( MoveTo ( 0 , 2 ) ) ;
427
444
let _ = sc. queue ( Print ( goodbye_msg1) ) ;
428
445
let _ = sc. queue ( MoveTo ( 0 , 10 ) ) ;
@@ -507,6 +524,13 @@ fn handle_pressed_keys(world: &mut World) {
507
524
// I'm reading from keyboard into event
508
525
match event. code {
509
526
KeyCode :: Char ( 'q' ) => world. status = PlayerStatus :: Quit ,
527
+ KeyCode :: Char ( 'g' ) => {
528
+ if world. game_mode == GameMode :: Normal {
529
+ world. game_mode = GameMode :: God ;
530
+ } else if world. game_mode == GameMode :: God {
531
+ world. game_mode = GameMode :: Normal ;
532
+ }
533
+ }
510
534
KeyCode :: Char ( 'w' ) => {
511
535
if world. status == PlayerStatus :: Alive && world. player_location . l > 1 {
512
536
world. player_location . l -= 1
@@ -598,6 +622,12 @@ fn main() -> std::io::Result<()> {
598
622
handle_pressed_keys ( & mut world) ;
599
623
if world. status != PlayerStatus :: Paused {
600
624
physics ( & mut world) ;
625
+ match world. game_mode {
626
+ GameMode :: God => {
627
+ world. status = PlayerStatus :: Alive ;
628
+ }
629
+ GameMode :: Normal => { }
630
+ }
601
631
draw ( & sc, & mut world) ?;
602
632
} else {
603
633
pause_screen ( & sc, & world) ;
0 commit comments