diff options
Diffstat (limited to 'game.c')
-rw-r--r-- | game.c | 200 |
1 files changed, 200 insertions, 0 deletions
@@ -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); +} |