X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fgame.c;h=9b35f27e8006413a821533f40f810836785d0394;hb=11365c9026fd2a19faddabf26b99bd7aa5c950e3;hp=41b1f44ae03f6aaf2c86f3636f3240447cc535d9;hpb=8246bb5efe4e89dbe59d3a553c9684ca24defdf7;p=nothing.git diff --git a/src/game.c b/src/game.c index 41b1f44a..9b35f27e 100644 --- a/src/game.c +++ b/src/game.c @@ -1,13 +1,15 @@ -#include -#include #include +#include +#include +#include -#include "./player.h" -#include "./platforms.h" -#include "./game.h" -#include "./error.h" -#include "./level.h" -#include "./lt.h" +#include "game.h" +#include "game/debug_tree.h" +#include "game/edit_field.h" +#include "game/level.h" +#include "game/sound_samples.h" +#include "system/error.h" +#include "system/lt.h" typedef enum game_state_t { GAME_STATE_RUNNING = 0, @@ -23,9 +25,19 @@ typedef struct game_t { game_state_t state; level_t *level; char *level_file_path; + sound_samples_t *sound_samples; + camera_t *camera; + sprite_font_t *font; + debug_tree_t *debug_tree; + /* TODO: remove edit_field from game when edit_field_t functionality is fully implemented */ + edit_field_t *edit_field; + SDL_Renderer *renderer; } game_t; -game_t *create_game(const char *level_file_path) +game_t *create_game(const char *level_file_path, + const char *sound_sample_files[], + size_t sound_sample_files_count, + SDL_Renderer *renderer) { assert(level_file_path); @@ -39,6 +51,9 @@ game_t *create_game(const char *level_file_path) throw_error(ERROR_TYPE_LIBC); RETURN_LT(lt, NULL); } + game->lt = lt; + + game->renderer = renderer; game->level = PUSH_LT( lt, @@ -53,11 +68,51 @@ game_t *create_game(const char *level_file_path) throw_error(ERROR_TYPE_LIBC); RETURN_LT(lt, NULL); } - strcpy(game->level_file_path, level_file_path); + game->font = PUSH_LT( + lt, + create_sprite_font_from_file("fonts/charmap-oldschool.bmp", renderer), + destroy_sprite_font); + if (game->font == NULL) { + RETURN_LT(lt, NULL); + } + + game->debug_tree = PUSH_LT( + lt, + create_debug_tree(game->font), + destroy_debug_tree); + if (game->debug_tree == NULL) { + RETURN_LT(lt, NULL); + } + + game->edit_field = PUSH_LT( + lt, + create_edit_field( + game->font, + vec(5.0f, 5.0f), + color(1.0f, 1.0f, 1.0f, 1.0f)), + destroy_edit_field); + if (game->edit_field == NULL) { + RETURN_LT(lt, NULL); + } + + game->camera = PUSH_LT(lt, create_camera(renderer, game->font), destroy_camera); + if (game->camera == NULL) { + RETURN_LT(lt, NULL); + } + + game->sound_samples = PUSH_LT( + lt, + create_sound_samples( + sound_sample_files, + sound_sample_files_count), + destroy_sound_samples); + if (game->sound_samples == NULL) { + RETURN_LT(lt, NULL); + } + game->state = GAME_STATE_RUNNING; - game->lt = lt; return game; } @@ -68,45 +123,51 @@ void destroy_game(game_t *game) RETURN_LT0(game->lt); } -int game_render(const game_t *game, SDL_Renderer *renderer) +int game_render(const game_t *game) { assert(game); - assert(renderer); if (game->state == GAME_STATE_QUIT) { return 0; } - if (SDL_SetRenderDrawColor(renderer, 157, 144, 96, 255) < 0) { - throw_error(ERROR_TYPE_SDL2); + if (level_render(game->level, game->camera) < 0) { return -1; } - if (SDL_RenderClear(renderer) < 0) { - throw_error(ERROR_TYPE_SDL2); + if (debug_tree_render(game->debug_tree, game->renderer) < 0) { return -1; } - if (level_render(game->level, renderer) < 0) { + if (edit_field_render(game->edit_field, game->renderer, vec(100.0f, 100.0f)) < 0) { return -1; } - SDL_RenderPresent(renderer); - return 0; } -int game_update(game_t *game, Uint32 delta_time) +int game_sound(game_t *game) +{ + return level_sound(game->level, game->sound_samples); +} + +int game_update(game_t *game, float delta_time) { assert(game); - assert(delta_time > 0); + assert(delta_time > 0.0f); if (game->state == GAME_STATE_QUIT) { return 0; } if (game->state == GAME_STATE_RUNNING) { - return level_update(game->level, delta_time); + if (level_update(game->level, delta_time) < 0) { + return -1; + } + + if (level_enter_camera_event(game->level, game->camera) < 0) { + return -1; + } } return 0; @@ -127,10 +188,13 @@ static int game_event_pause(game_t *game, const SDL_Event *event) switch (event->key.keysym.sym) { case SDLK_p: game->state = GAME_STATE_RUNNING; - level_toggle_pause_mode(game->level); + camera_toggle_blackwhite_mode(game->camera); + sound_samples_toggle_pause(game->sound_samples); break; case SDLK_l: + camera_toggle_debug_mode(game->camera); level_toggle_debug_mode(game->level); + debug_tree_toggle_enabled(game->debug_tree); break; } break; @@ -144,6 +208,10 @@ static int game_event_running(game_t *game, const SDL_Event *event) assert(game); assert(event); + if (edit_field_handle_event(game->edit_field, event) < 0) { + return -1; + } + switch (event->type) { case SDL_QUIT: game->state = GAME_STATE_QUIT; @@ -157,13 +225,17 @@ static int game_event_running(game_t *game, const SDL_Event *event) game->level = RESET_LT( game->lt, game->level, - create_level_from_file(game->level_file_path)); + create_level_from_file( + game->level_file_path)); if (game->level == NULL) { print_current_error_msg("Could not reload the level"); game->state = GAME_STATE_QUIT; return -1; } + + camera_disable_debug_mode(game->camera); + break; case SDLK_q: @@ -177,11 +249,14 @@ static int game_event_running(game_t *game, const SDL_Event *event) case SDLK_p: game->state = GAME_STATE_PAUSE; - level_toggle_pause_mode(game->level); + camera_toggle_blackwhite_mode(game->camera); + sound_samples_toggle_pause(game->sound_samples); break; case SDLK_l: + camera_toggle_debug_mode(game->camera); level_toggle_debug_mode(game->level); + debug_tree_toggle_enabled(game->debug_tree); break; } break;