aboutsummaryrefslogtreecommitdiff
path: root/game.c
diff options
context:
space:
mode:
authorquou <quou@disroot.org>2023-05-06 09:02:04 +1000
committerquou <quou@disroot.org>2023-05-06 09:02:04 +1000
commit2ab411c4b8855d11d48454a93262e8eae3ba7fc7 (patch)
treee608ebd0bea71570be0a3619f9848f975669e5ef /game.c
parentfb104368dd33b66e0575dcc0327cbae7046a4e1e (diff)
Menus, game over, dying, etc.
Diffstat (limited to 'game.c')
-rw-r--r--game.c200
1 files changed, 200 insertions, 0 deletions
diff --git a/game.c b/game.c
new file mode 100644
index 0000000..73d062b
--- /dev/null
+++ b/game.c
@@ -0,0 +1,200 @@
+#include "asset.h"
+#include "enemy.h"
+#include "game.h"
+#include "platform.h"
+#include "sprite.h"
+#include "systems.h"
+
+static void menu_new(Menu* menu) {
+ Game* game;
+
+ game = menu->ptr;
+ game_change_state(game, game_state_game);
+}
+
+static void menu_restart(Menu* menu) {
+ Game* game;
+
+ game = menu->ptr;
+ game_change_state(game, game_state_game);
+}
+
+static void menu_main_menu(Menu* menu) {
+ Game* game;
+
+ game = menu->ptr;
+ game_change_state(game, game_state_menu);
+}
+
+static void menu_quit(Menu* menu) {
+ (void)menu;
+ platform_quit();
+}
+
+static void menu_credits(Menu* menu) {
+ Game* game;
+
+ game = menu->ptr;
+ game_change_state(game, game_state_credits);
+}
+
+static void menu_init(Game* game) {
+ const BM_Font* font;
+
+ font = get_default_font();
+
+ init_menu(&game->menu, game);
+ menu_add(&game->menu, "New", menu_new, font);
+ menu_add(&game->menu, "Continue", 0, font);
+ menu_add(&game->menu, "Credits", menu_credits, font);
+ menu_add(&game->menu, "Quit", menu_quit, font);
+}
+
+static void menu_update(Game* game) {
+ const Sprite* msg;
+ const Bitmap* bmp;
+ int h, y;
+
+ update_menu(&game->menu);
+
+ h = game->menu.h;
+ y = game->menu.y;
+
+ msg = get_sprite(sprite_author);
+ bmp = get_bitmap(msg->bitmap);
+ render_bitmap(
+ bmp,
+ renderer_w / 2 - msg->rect.w / 2,
+ renderer_h - 26,
+ &msg->rect
+ );
+
+ msg = get_sprite(sprite_free);
+ bmp = get_bitmap(msg->bitmap);
+ render_bitmap(
+ bmp,
+ renderer_w / 2 - msg->rect.w / 2,
+ renderer_h - 15,
+ &msg->rect
+ );
+
+ render_menu(&game->menu, get_default_font());
+}
+
+static void menu_deinit(Game* game) {
+
+}
+
+static void gameplay_init(Game* game) {
+ init_world(&game->world);
+
+ init_player(&game->world.player, &game->world);
+
+ new_skull(&game->world, 0, 0);
+}
+
+static void gameplay_update(Game* game) {
+ update_player(&game->world.player, &game->world);
+ enemy_system(&game->world);
+ bullet_system(&game->world);
+ collision_system(&game->world);
+ animation_system(&game->world);
+ sprite_system(&game->world);
+}
+
+static void gameplay_deinit(Game* game) {
+
+}
+
+static void credits_init(Game* game) {
+
+}
+
+static void credits_update(Game* game) {
+
+}
+
+static void credits_deinit(Game* game) {
+
+}
+
+static void dead_init(Game* game) {
+ const BM_Font* font = get_default_font();
+ init_menu(&game->menu, game);
+ menu_add(&game->menu, "Restart", menu_restart, font);
+ menu_add(&game->menu, "Main Menu", menu_main_menu, font);
+}
+
+static void dead_update(Game* game) {
+ const BM_Font* font;
+
+ font = get_default_font();
+
+ update_menu(&game->menu);
+
+ sprite_system(&game->world);
+
+ rfont_text(
+ font,
+ renderer_w / 2 - 40,
+ game->menu.y - 15,
+ "You died"
+ );
+ render_menu(&game->menu, get_default_font());
+}
+
+static void dead_deinit(Game* game) {
+
+}
+
+static const Game_State_Fns game_state_fns[] = {
+ /* game_state_menu */
+ {
+ menu_init,
+ menu_update,
+ menu_deinit
+ },
+ /* game_state_game */
+ {
+ gameplay_init,
+ gameplay_update,
+ gameplay_deinit
+ },
+ /* game_state_credits */
+ {
+ credits_init,
+ credits_update,
+ credits_deinit
+ },
+ /* game_state_dead */
+ {
+ dead_init,
+ dead_update,
+ dead_deinit
+ }
+};
+
+static const Game_State_Fns* get_state_fns(Game_State state) {
+ return &game_state_fns[state];
+}
+
+void game_init(Game* game, Game_State state) {
+ game->state = state;
+ game->fns = get_state_fns(state);
+ game->fns->state_init(game);
+}
+
+void game_update(Game* game) {
+ game->fns->state_update(game);
+}
+
+void game_deinit(Game* game) {
+ game->fns->state_deinit(game);
+}
+
+void game_change_state(Game* game, Game_State state) {
+ game->fns->state_deinit(game);
+ game->state = state;
+ game->fns = get_state_fns(state);
+ game->fns->state_init(game);
+}