diff --git a/snake/snake.c b/snake/snake.c index 1dc052e..a0eb449 100644 --- a/snake/snake.c +++ b/snake/snake.c @@ -69,6 +69,7 @@ typedef enum { } waiting_reason_t; struct Snake { + bool i_require_redraw; bool is_space_pressed; bool is_shift_pressed; game_screen_t game_screen; @@ -108,6 +109,7 @@ struct Snake { } snake = {1}; void init_snake() { + snake.i_require_redraw = false; snake.is_space_pressed = false; snake.is_shift_pressed = false; snake.game_screen = game_screen_pause; @@ -554,6 +556,7 @@ void draw_frame() { void handle_gaming_keycode(uint8_t keycode) { if (keycode == KEYCODE_ESCAPE) { snake.game_screen = game_screen_pause; + snake.i_require_redraw = true; } if (!snake.is_dying) { if (is_keycode_for_press_left(keycode) && @@ -574,6 +577,9 @@ void handle_gaming_keycode(uint8_t keycode) { /* return 1 if we are quitting */ int handle_incoming_keycode_after_halt(uint8_t keycode) { + /* All keypresses force a redraw */ + snake.i_require_redraw = true; + if (keycode == KEYCODE_SPACE) { snake.is_space_pressed = true; } else if (keycode == (KEYCODE_SPACE | 0x80)) { @@ -655,6 +661,8 @@ void handle_time_difference(uint32_t time_diff) { } if (snake.waiting_time > target_required_time) { snake.waiting_time -= target_required_time; + snake.i_require_redraw = true; + if (snake.waiting_reason == waiting_reason_step) { ivec2 tile_pos_ahead = world_walk_direction( snake.snake_head, snake.new_snake_direction); @@ -690,7 +698,10 @@ void handle_time_difference(uint32_t time_diff) { construct_snake_tile( get_opposite_direction(snake.cur_snake_direction), snake.new_snake_direction)); - snake.cur_snake_direction = snake.new_snake_direction; + if (!snake.is_dying) { + // Don't think about it + snake.cur_snake_direction = snake.new_snake_direction; + } /* Steps 3... */ if (is_tile_pupa(get_tile(snake.snake_tail))) { @@ -769,8 +780,10 @@ void handle_time_difference(uint32_t time_diff) { void after_awake_action(uint32_t time_diff) { handle_time_difference(time_diff); snake.animation_speed_boost = 0; - draw_frame(); - syscall(SYS_swap_frame, (uintptr_t)frame); + if (snake.i_require_redraw) { + draw_frame(); + syscall(SYS_swap_frame, (uintptr_t)frame); + } } int main(void) {