X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fgame.c;h=9b35f27e8006413a821533f40f810836785d0394;hb=11365c9026fd2a19faddabf26b99bd7aa5c950e3;hp=ed30d609503d45e505f772509b3aa1a0fe655437;hpb=d684d67f8125ab6d7a7ab4d10c52823a382ee446;p=nothing.git diff --git a/src/game.c b/src/game.c index ed30d609..9b35f27e 100644 --- a/src/game.c +++ b/src/game.c @@ -1,15 +1,15 @@ -#include -#include #include #include +#include +#include -#include "./player.h" -#include "./platforms.h" -#include "./game.h" -#include "./error.h" -#include "./level.h" -#include "./sound_medium.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, @@ -25,11 +25,19 @@ 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, - const char *sounds_folder_path) + 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, @@ -57,19 +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->sound_medium = PUSH_LT( + 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_sound_medium_from_folder(sounds_folder_path), - destroy_sound_medium); - if (game->sound_medium == NULL) { + 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; } @@ -80,35 +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 (level_render(game->level, renderer) < 0) { + if (level_render(game->level, game->camera) < 0) { + return -1; + } + + if (debug_tree_render(game->debug_tree, game->renderer) < 0) { return -1; } - SDL_RenderPresent(renderer); + if (edit_field_render(game->edit_field, game->renderer, vec(100.0f, 100.0f)) < 0) { + return -1; + } 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; @@ -129,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; @@ -146,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; @@ -167,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: @@ -180,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;