From bb54002fa30aaccbaef70068d47b961caa380fe3 Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Sun, 11 Feb 2024 16:46:43 +0100 Subject: [PATCH] Add game over screen --- CMakeLists.txt | 2 ++ game/building_factory.c | 1 + game/game_state.h | 6 ++++++ game/main.c | 10 ++++++++++ game/systems/s_ui.c | 33 ++++++++++++++++++++++++++++++++ game/systems/systems.h | 1 + game/wave.c | 33 ++++++++++++++++++++++++++++++++ game/wave.h | 42 +++++++++++++++++++++++++++++++++++++++++ 8 files changed, 128 insertions(+) create mode 100644 game/wave.c create mode 100644 game/wave.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2df8aa5..13d6c6b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,8 @@ add_executable(PixelDefense game/ui_widgets.c game/ui_widgets.h game/utils.h + game/wave.c + game/wave.h ) diff --git a/game/building_factory.c b/game/building_factory.c index 1413ba1..3085867 100644 --- a/game/building_factory.c +++ b/game/building_factory.c @@ -97,6 +97,7 @@ ecs_entity_t placeBuilding(Game *game, BuildingType type, }; switch (type) { case BUILDING_KEEP: + game->keepEntity = building; ecs_set(ECS, building, AddPopCapacity, {10}); ecs_set(ECS, building, Storage, { .stores[RES_WOOD] = true, diff --git a/game/game_state.h b/game/game_state.h index 0fdb156..31bc9ea 100644 --- a/game/game_state.h +++ b/game/game_state.h @@ -6,9 +6,11 @@ #include "constants.h" #include "sounds.h" +#include "wave.h" typedef enum GameScreen { SCREEN_GAME, + SCREEN_GAME_OVER, SCREEN_PAUSE_MENU, SCREEN_MAIN_MENU, SCREEN_SETTINGS, @@ -74,6 +76,10 @@ typedef struct Game { PlayerResources playerResources[PLAYER_COUNT]; Player player; + + WaveInfo waveInfo; + ecs_entity_t keepEntity; + BzStackAlloc stackAlloc; struct { BzBTNode *workerHarvest; diff --git a/game/main.c b/game/main.c index 6d710ff..98d5468 100644 --- a/game/main.c +++ b/game/main.c @@ -463,6 +463,11 @@ void update(float dt, void *userData) { switch (game->screen) { case SCREEN_GAME: updatePlayerInput(); + if (!ecs_is_alive(ECS, game->keepEntity)) { + setScreen(game, SCREEN_GAME_OVER); + } + break; + case SCREEN_GAME_OVER: break; case SCREEN_PAUSE_MENU: if (IsKeyReleased(input->mapping.backBtn)) { @@ -634,6 +639,11 @@ void render(float dt, void *userData) { renderGame(game, dt); drawGameUI(game, dt); break; + case SCREEN_GAME_OVER: + renderGame(game, dt); + drawOverScreen(shadow); + drawGameOverUI(game, dt); + break; case SCREEN_PAUSE_MENU: renderGame(game, dt); drawOverScreen(shadow); diff --git a/game/systems/s_ui.c b/game/systems/s_ui.c index cb37f83..1f63026 100644 --- a/game/systems/s_ui.c +++ b/game/systems/s_ui.c @@ -249,6 +249,39 @@ void drawGameUI(Game *game, f32 dt) { bzUIEnd(UI); } +void drawGameOverUI(Game *game, f32 dt) { + i32 width = GetScreenWidth(); + i32 height = GetScreenHeight(); + + bzUIBegin(UI, width, height); + bzUISetParentLayout(UI, (BzUILayout) { + .type = BZ_UI_LAYOUT_FLEX_BOX, + .flags = BZ_UI_FLEX_DIR_COLUMN + }); + + uiPushDivParentPercentage(1.0f, 0.4f); + bzUISetParentLayout(UI, (BzUILayout) { + .type = BZ_UI_LAYOUT_FLEX_BOX, + .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_JUSTIFY_CENTER | BZ_UI_FLEX_ALIGN_CENTER + }); + uiMainMenuLabel("Game Over!"); + bzUIPopParent(UI); + + uiPushDivParentPercentage(1.0f, 0.6f); + bzUISetParentLayout(UI, (BzUILayout) { + .type = BZ_UI_LAYOUT_FLEX_BOX, + .flags = BZ_UI_FLEX_DIR_COLUMN | BZ_UI_FLEX_ALIGN_CENTER + }); + uiBaseLabel("You survived 10 rounds.\n\n", game->font, 0.8f, WHITE); + if (uiMainMenuButton("Exit", true)) { + setScreen(game, SCREEN_MAIN_MENU); + unloadMap(game); + loadMap(game, "assets/maps/main_menu_01.tmj"); + } + bzUIPopParent(UI); + bzUIEnd(UI); +} + void drawPauseUI(Game *game, f32 dt) { i32 width = GetScreenWidth(); i32 height = GetScreenHeight(); diff --git a/game/systems/systems.h b/game/systems/systems.h index c49326a..445a2ef 100644 --- a/game/systems/systems.h +++ b/game/systems/systems.h @@ -241,6 +241,7 @@ void drawPlayerInputUI(); **********************************/ void drawGameUI(Game *game, f32 dt); +void drawGameOverUI(Game *game, f32 dt); void drawPauseUI(Game *game, f32 dt); void drawMainMenuUI(Game *game, f32 dt); void drawSettingsUI(Game *game, f32 dt); diff --git a/game/wave.c b/game/wave.c new file mode 100644 index 0000000..5b4fe41 --- /dev/null +++ b/game/wave.c @@ -0,0 +1,33 @@ +#include "wave.h" + +WaveInfo getWaveInfo(i32 idx) { + BZ_ASSERT(idx >= 0); + WaveData waveData; + if (idx >= NUM_WAVES) { + waveData = predefWaves[NUM_WAVES - 1]; + waveData.difficultyScale += (idx - NUM_WAVES) * 0.1f; + + } else { + waveData = predefWaves[idx]; + } + + WaveInfo info = { + .data = waveData, + .orcsToSend = waveData.numOrcs, + .goblinsToSend = waveData.numGoblins, + }; + + return info; +} + +void updateWave(WaveInfo *wave, f32 dt) { + wave->orcsElapsed += dt; + wave->golbinsElapsed += dt; + wave->elapsed += dt; + +} + +bool isWaveSendingOver(const WaveInfo *wave) { + return wave->orcsToSend == 0 && wave->goblinsToSend == 0; +} + diff --git a/game/wave.h b/game/wave.h new file mode 100644 index 0000000..045cff1 --- /dev/null +++ b/game/wave.h @@ -0,0 +1,42 @@ +#ifndef PIXELDEFENSE_WAVE_H +#define PIXELDEFENSE_WAVE_H + +#include + +typedef struct WaveData { + i32 numOrcs; // How many orcs to send + f32 orcSendRate; // How many orcs to send per second + i32 numGoblins; // How many goblins to send + f32 goblinSendRate; // How many goblins to send per second + f32 difficultyScale; // Scale for health and damage + f32 timeBeforeStart; // Time before start sending (seconds) +} WaveData; + +typedef struct WaveInfo { + i32 number; + WaveData data; + i32 orcsToSend; + f32 orcsElapsed; + i32 goblinsToSend; + f32 golbinsElapsed; + f32 elapsed; +} WaveInfo; + +#define NUM_WAVES 5 + +static WaveData predefWaves[NUM_WAVES] = { + { 10, 1.0f, 20, 2.0f, 0, 5 * 60 * 60 }, + { 20, 1.0f, 40, 2.0f, 0, 2 * 60 * 60 }, + { 25, 1.0f, 80, 2.2f, 0, 2 * 60 * 60 }, + { 50, 1.2f, 120, 3.0f, 0, 1.5 * 60 * 60 }, + { 100, 2.0f, 220, 4.0f, 0, 60 * 60 }, +}; + +WaveInfo getWaveInfo(i32 idx); + +void updateWave(WaveInfo *wave, f32 dt); + +bool isWaveSendingOver(const WaveInfo *wave); + + +#endif //PIXELDEFENSE_WAVE_H