X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fgame.c;h=9b35f27e8006413a821533f40f810836785d0394;hb=11365c9026fd2a19faddabf26b99bd7aa5c950e3;hp=2c3d595c51b415f5aa5451103baf57c0c5e2ad89;hpb=dc74da077bac12574476303bf43b712e8e9c2c27;p=nothing.git diff --git a/src/game.c b/src/game.c index 2c3d595c..9b35f27e 100644 --- a/src/game.c +++ b/src/game.c @@ -4,8 +4,10 @@ #include #include "game.h" +#include "game/debug_tree.h" +#include "game/edit_field.h" #include "game/level.h" -#include "game/sound_medium.h" +#include "game/sound_samples.h" #include "system/error.h" #include "system/lt.h" @@ -23,12 +25,18 @@ typedef struct game_t { game_state_t state; level_t *level; char *level_file_path; - sound_medium_t *sound_medium; + 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, - sound_medium_t *sound_medium, + const char *sound_sample_files[], + size_t sound_sample_files_count, SDL_Renderer *renderer) { assert(level_file_path); @@ -43,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, @@ -59,14 +70,49 @@ game_t *create_game(const char *level_file_path, } strcpy(game->level_file_path, level_file_path); - game->camera = PUSH_LT(lt, create_camera_from_renderer(renderer), destroy_camera); + 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->sound_medium = sound_medium; - game->lt = lt; return game; } @@ -77,10 +123,9 @@ 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; @@ -90,14 +135,20 @@ int game_render(const game_t *game, SDL_Renderer *renderer) return -1; } - SDL_RenderPresent(renderer); + if (debug_tree_render(game->debug_tree, game->renderer) < 0) { + return -1; + } + + if (edit_field_render(game->edit_field, game->renderer, vec(100.0f, 100.0f)) < 0) { + return -1; + } return 0; } int game_sound(game_t *game) { - return level_sound(game->level, game->sound_medium); + return level_sound(game->level, game->sound_samples); } int game_update(game_t *game, float delta_time) @@ -110,7 +161,13 @@ int game_update(game_t *game, float delta_time) } 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; @@ -132,10 +189,12 @@ static int game_event_pause(game_t *game, const SDL_Event *event) case SDLK_p: game->state = GAME_STATE_RUNNING; camera_toggle_blackwhite_mode(game->camera); - sound_medium_toggle_pause(game->sound_medium); + 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; @@ -149,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; @@ -170,6 +233,9 @@ static int game_event_running(game_t *game, const SDL_Event *event) game->state = GAME_STATE_QUIT; return -1; } + + camera_disable_debug_mode(game->camera); + break; case SDLK_q: @@ -184,11 +250,13 @@ static int game_event_running(game_t *game, const SDL_Event *event) case SDLK_p: game->state = GAME_STATE_PAUSE; camera_toggle_blackwhite_mode(game->camera); - sound_medium_toggle_pause(game->sound_medium); + 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;