@@ -56,6 +56,10 @@ static snake_t sn_buf;
5656static const u8 sn_len = 10 ;
5757static const u8 sn_max = 62 ;
5858
59+ /* Whither or not we need to reset gems */
60+ static bool easy_mode ;
61+ static bool reset_gems = false;
62+
5963/* Set default options and hiscores (precalculated for speed) */
6064void g_setup (void ) {
6165
@@ -81,10 +85,13 @@ u32 g_start(void) {
8185 u8 gems_left ;
8286 bool reset_gems = true;
8387
88+ /* Initial Settings */
8489 level = 1 ;
8590 round = 1 ;
8691 lives = 3 ;
8792 score = 0 ;
93+ easy_mode = g_options [0 ];
94+ reset_gems = true;
8895
8996 /* Keep going until game over! */
9097 while (!game_over ) {
@@ -98,12 +105,13 @@ u32 g_start(void) {
98105 /* Load the appropriate level data */
99106 g_load_level (level , & gems_left , reset_gems );
100107 g_reset_snake (& sn , & sn_buf );
108+ if (easy_mode )
109+ reset_gems = false;
101110
102111 /* Draw the fixed elements of the HUD */
103112 g_display_HUD ();
104- g_redraw_gems (gems_left );
105113 v_draw_pf (pf , & pf_loc , & pf_sz );
106- v_draw_gems (gems , & pf_loc , & pf_sz );
114+ v_draw_gems (gems , & pf_loc );
107115 v_draw_snake (& sn , & pf_loc );
108116
109117 /*
@@ -121,7 +129,7 @@ u32 g_start(void) {
121129 g_clock_on = true;
122130
123131 /* Start the game */
124- lvl_complete = g_play_level (level , gems_left );
132+ lvl_complete = g_play_level (level , & gems_left );
125133 g_stop ();
126134 g_clock_on = false;
127135
@@ -150,11 +158,9 @@ u32 g_start(void) {
150158 game_over = true;
151159 } else {
152160 v_wipe_scr (true);
161+ cpct_removeInterruptHandler ();
153162 -- lives ;
154- if (!g_options [0 ])
155- reset_gems = true;
156- else
157- reset_gems = false;
163+ reset_gems = !easy_mode ;
158164 }
159165 }
160166 }
@@ -172,15 +178,14 @@ void g_stop(void) {
172178}
173179
174180/* Handle the Game Level Playing */
175- static bool g_play_level (const u8 level , const u8 gems_total ) {
181+ static bool g_play_level (const u8 level , u8 * gems_left ) {
176182
177183 volatile bool finished = false, success = false;
178184 volatile u16 count = 0 ;
179185 bool move_l = false, move_r = false;
180186 bool paused , moved ;
181187 u16 key_l , key_r ;
182188 u8 c_offset = g_options [1 ] ? 0 : 2 ;
183- u8 gems_left = gems_total ;
184189 dir_t dir = DIR_EAST ;
185190 const u8 diff_c = g_options [0 ] ? 5 : 2 ;
186191 const u8 diff_mod = g_options [0 ] ? 1 : 10 ;
@@ -249,16 +254,13 @@ static bool g_play_level(const u8 level, const u8 gems_total) {
249254 gems [gem_ate ].active = false;
250255 gems [gem_ate ].loc .x = 0 ;
251256 gems [gem_ate ].loc .y = 0 ;
252- -- gems_left ;
257+ -- * gems_left ;
253258 score += level * level * round * 10 * diff_mod ;
254259 g_redraw_score (score );
255- g_redraw_gems (gems_left );
256- DEBUG_NUM (gems_left , true);
257- DEBUG_RESET (true);
258260 }
259261
260262 /* If we have eaten all the Gems! */
261- if (gems_left == 0 ) {
263+ if (* gems_left == 0 ) {
262264
263265 success = true;
264266 break ;
@@ -377,14 +379,6 @@ static void g_redraw_score(const u32 score) {
377379 width = u_get_width (score );
378380 v_print_n (score , 16 + (20 - (width * 2 )), y , 1 );
379381}
380-
381- /* Display Remaining Gems */
382- static void g_redraw_gems (const u8 gems_left ) {
383-
384- u8 y = (hud_loc .y + 2 ) * LINE_PY ;
385- v_print (g_strings [58 ], 32 , y , 2 );
386- v_print_n (gems_left , 32 , y , 1 );
387- }
388382
389383/* Draw Remaining Lives */
390384static void g_display_lives (const u8 x , const u8 y ) {
@@ -448,7 +442,7 @@ static void g_interrupt(void) {
448442}
449443
450444/* Load data for current level */
451- static void g_load_level (const u8 level , u8 * gems_left , const bool reset ) {
445+ static void g_load_level (const u8 level , u8 * gems_left , const bool reset_gems ) {
452446
453447 pos_t * gem_source ;
454448
@@ -457,8 +451,8 @@ static void g_load_level(const u8 level, u8 *gems_left, const bool reset) {
457451 cpct_memcpy (& pf , g_game_pf [level - 1 ], sizeof (pf ));
458452
459453 /* Reload the Gems if necessary */
460- if (reset ) {
461- // TODO: in easy mode, stop resetting gems left after a loss of life
454+ if (reset_gems ) {
455+
462456 * gems_left = g_game_pf_count [level - 1 ];
463457 cpct_memset (& gems , 0x00 , sizeof (gem_t ));
464458 gem_source = g_game_gems [level - 1 ];
@@ -473,7 +467,8 @@ static void g_load_level(const u8 level, u8 *gems_left, const bool reset) {
473467 gems [i ].active = false;
474468 }
475469 }
476- }
470+ } else
471+ * gems_left = * gems_left ;
477472}
478473
479474/* Reset Game Snake to starting position and size */
0 commit comments