From a11b9d1c52df1bfae2ee6614d4d794c940c767ac Mon Sep 17 00:00:00 2001 From: KikooDX Date: Thu, 6 May 2021 00:06:12 +0200 Subject: [PATCH] pause Take a break and sip your tea. --- CMakeLists.txt | 3 +++ include/pause.h | 14 ++++++++++++++ include/util.h | 1 + src/input/init.c | 3 ++- src/levelselection/update.c | 1 - src/main.c | 21 ++++++++++++++++++--- src/mainmenu/update.c | 1 - src/pause/draw.c | 15 +++++++++++++++ src/pause/init.c | 10 ++++++++++ src/pause/update.c | 16 ++++++++++++++++ src/player/update.c | 1 - src/titlescreen/update.c | 1 - src/util.c | 10 ++++++++++ 13 files changed, 89 insertions(+), 8 deletions(-) create mode 100644 include/pause.h create mode 100644 src/pause/draw.c create mode 100644 src/pause/init.c create mode 100644 src/pause/update.c diff --git a/CMakeLists.txt b/CMakeLists.txt index dbc6295..67ce111 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,6 +56,9 @@ set(SOURCES src/mainmenu/init.c src/mainmenu/update.c src/mainmenu/draw.c + src/pause/init.c + src/pause/update.c + src/pause/draw.c ) set(ASSETS diff --git a/include/pause.h b/include/pause.h new file mode 100644 index 0000000..8e0fed3 --- /dev/null +++ b/include/pause.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* Copyright (C) 2021 KikooDX */ +#pragma once + +#include "input.h" + +struct Pause { + int cursor; +}; + +struct Pause pause_init(void); +/* Return 1 if game state should change. */ +int pause_update(struct Pause *pause, struct Input input); +void pause_draw(struct Pause pause); diff --git a/include/util.h b/include/util.h index d7d4ae2..3646086 100644 --- a/include/util.h +++ b/include/util.h @@ -7,3 +7,4 @@ float square(float x); float isquare(float x); float abs(float x); int sign(float x); +void darken_vram(void); diff --git a/src/input/init.c b/src/input/init.c index 31dfe49..5f2d6d3 100644 --- a/src/input/init.c +++ b/src/input/init.c @@ -8,7 +8,8 @@ struct Input input_init(void) { struct Input input = { - .keycodes = {KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN, KEY_SHIFT}, + .keycodes = {KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN, KEY_SHIFT, + KEY_MENU}, }; int i = KEYS_COUNT; while (i-- > 0) diff --git a/src/levelselection/update.c b/src/levelselection/update.c index 208ee88..b737d1f 100644 --- a/src/levelselection/update.c +++ b/src/levelselection/update.c @@ -5,7 +5,6 @@ #include "input.h" #include "levelselection.h" #include "util.h" -#include /* Return 1 if game state should change. */ int diff --git a/src/main.c b/src/main.c index c21ff75..6c75ea3 100644 --- a/src/main.c +++ b/src/main.c @@ -8,6 +8,7 @@ #include "levelselection.h" #include "mainmenu.h" #include "particles.h" +#include "pause.h" #include "player.h" #include "titlescreen.h" #include "trail.h" @@ -53,6 +54,7 @@ main(void) int i; int timer; int player_return_code; + int draw_pause; int frameskip = 0; /* int level_pack_beaten; */ enum TransitionMode transition_previous_mode; @@ -64,6 +66,7 @@ main(void) struct TitleScreen titlescreen = titlescreen_init(); struct LevelSelection levelselection = levelselection_init(); struct MainMenu mainmenu = mainmenu_init(); + struct Pause pause = pause_init(); struct Transition transition = transition_init(0.0, ZX_BLACK, TransitionNone); particles_init(); @@ -189,7 +192,13 @@ main(void) } break; case GamePause: - game_state = Playing; + if (pause_update(&pause, input)) { + game_state = Playing; + /* pause draw takes is _very_ slow, + * reset frameskip to compensate */ + frameskip = 0; + has_ticked = 0; + } break; case PackDone: game_state = LevelSelection; @@ -200,6 +209,7 @@ main(void) } } /* draw */ + draw_pause = 0; dclear(ZX_BLACK); switch (game_state) { case TitleScreen: @@ -211,6 +221,9 @@ main(void) case LevelSelection: levelselection_draw(levelselection); break; + case GamePause: + draw_pause = 1; + /* fallthrough */ case Playing: level_draw(); trail_draw(); @@ -218,8 +231,10 @@ main(void) trail_draw(); player_draw(player); transition_draw(transition); - break; - case GamePause: + if (!draw_pause) + break; + /* GamePause */ + pause_draw(pause); break; case PackDone: break; diff --git a/src/mainmenu/update.c b/src/mainmenu/update.c index ae799da..8ef7b00 100644 --- a/src/mainmenu/update.c +++ b/src/mainmenu/update.c @@ -4,7 +4,6 @@ #include "filepaths.h" #include "input.h" #include "mainmenu.h" -#include /* Return 1 if game state should change. */ int diff --git a/src/pause/draw.c b/src/pause/draw.c new file mode 100644 index 0000000..0549868 --- /dev/null +++ b/src/pause/draw.c @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* Copyright (C) 2021 KikooDX */ + +#include "pause.h" +#include "util.h" +#include "zxcolors.h" +#include + +void +pause_draw(struct Pause pause) +{ + darken_vram(); + dprint_opt(DWIDTH / 2, DHEIGHT * 1 / 2, ZX_WHITE, ZX_BLACK, + DTEXT_CENTER, DTEXT_MIDDLE, "GAME PAUSED"); +} diff --git a/src/pause/init.c b/src/pause/init.c new file mode 100644 index 0000000..04aa499 --- /dev/null +++ b/src/pause/init.c @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* Copyright (C) 2021 KikooDX */ + +#include "pause.h" + +struct Pause +pause_init(void) +{ + return (struct Pause){.cursor = 0}; +} diff --git a/src/pause/update.c b/src/pause/update.c new file mode 100644 index 0000000..d24785e --- /dev/null +++ b/src/pause/update.c @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* Copyright (C) 2021 KikooDX */ + +#include "input.h" +#include "pause.h" + +/* Return 1 if game state should change. */ +int +pause_update(struct Pause *pause, struct Input input) +{ + if (input.keystates[K_START] == KS_PRESS) { + return 1; + } + + return 0; +} diff --git a/src/player/update.c b/src/player/update.c index 1103982..a07507a 100644 --- a/src/player/update.c +++ b/src/player/update.c @@ -8,7 +8,6 @@ #include "player.h" #include "tiles.h" #include "util.h" -#include static void player_move(struct Player *player, int x, int y); static void player_set_anim(struct Player *player, enum AnimState new_anim); diff --git a/src/titlescreen/update.c b/src/titlescreen/update.c index 22ece44..2434adf 100644 --- a/src/titlescreen/update.c +++ b/src/titlescreen/update.c @@ -3,7 +3,6 @@ #include "input.h" #include "titlescreen.h" -#include /* Return 1 if game state should change. */ int diff --git a/src/util.c b/src/util.c index 79864c6..59a5689 100644 --- a/src/util.c +++ b/src/util.c @@ -2,6 +2,7 @@ /* Copyright (C) 2021 KikooDX */ #include "util.h" +#include float square(float x) @@ -26,3 +27,12 @@ sign(float x) { return 1 * (x > 0) - 1 * (x < 0); } + +/* courtesy of Lephenixnoir */ +void +darken_vram(void) +{ + int i; + for (i = 0; i < DWIDTH * DHEIGHT; i++) + gint_vram[i] = (gint_vram[i] & 0xf7de) >> 1; +}