Browse Source

Add game over level

Ivan Barsukov 1 year ago
parent
commit
40afb1f5c4

+ 66 - 0
src/levels/level_game_over/game_over_entity.c

@@ -0,0 +1,66 @@
+#include "game_over_entity.h"
+
+#include "../../game.h"
+
+static void
+game_over_update(Entity* self, GameManager* manager, void* _entity_context)
+{
+    UNUSED(self);
+    UNUSED(_entity_context);
+
+    GameContext* game_context = game_manager_game_context_get(manager);
+
+    InputState input = game_manager_input_get(manager);
+    if (input.pressed & GameKeyOk || input.pressed & GameKeyBack) {
+        game_manager_next_level_set(manager, game_context->levels.menu);
+    }
+}
+
+static void
+game_over_render(Entity* self,
+                 GameManager* manager,
+                 Canvas* canvas,
+                 void* _entity_context)
+{
+    UNUSED(self);
+    UNUSED(manager);
+
+    GameOverEntityContext* entity_context = _entity_context;
+
+    furi_check(entity_context->logo_sprite);
+
+    const uint32_t screen_height = 64;
+    const uint32_t screen_width = 128;
+    const uint32_t text_height = 7;
+    uint32_t x =
+      screen_width / 2.0 - sprite_get_width(entity_context->logo_sprite) / 2.0;
+    uint32_t y = (screen_height - text_height) / 2.0 -
+                 sprite_get_height(entity_context->logo_sprite) / 2.0;
+
+    canvas_draw_sprite(canvas, entity_context->logo_sprite, x, y);
+
+    char score_str[12] = {};
+    snprintf(score_str, sizeof(score_str), "SCORE: %ld", entity_context->score);
+
+    char best_score_str[10] = {};
+    snprintf(best_score_str,
+             sizeof(best_score_str),
+             "BEST: %ld",
+             entity_context->max_score);
+
+    canvas_set_color(canvas, ColorBlack);
+    canvas_set_font(canvas, FontSecondary);
+    canvas_draw_str_aligned(canvas, 0, 64, AlignLeft, AlignBottom, score_str);
+    canvas_draw_str_aligned(
+      canvas, 128, 64, AlignRight, AlignBottom, best_score_str);
+}
+
+const EntityDescription game_over_description = {
+    .start = NULL,
+    .stop = NULL,
+    .update = game_over_update,
+    .render = game_over_render,
+    .collision = NULL,
+    .event = NULL,
+    .context_size = sizeof(GameOverEntityContext),
+};

+ 14 - 0
src/levels/level_game_over/game_over_entity.h

@@ -0,0 +1,14 @@
+#pragma once
+
+#include "../../engine/entity.h"
+
+typedef struct Sprite Sprite;
+
+typedef struct
+{
+    Sprite* logo_sprite;
+    uint32_t score;
+    uint32_t max_score;
+} GameOverEntityContext;
+
+extern const EntityDescription game_over_description;

+ 60 - 0
src/levels/level_game_over/level_game_over.c

@@ -0,0 +1,60 @@
+#include "level_game_over.h"
+
+#include <stddef.h>
+
+#include <furi.h>
+
+#include "../../game.h"
+#include "../../game_settings.h"
+
+#include "game_over_entity.h"
+
+typedef struct
+{
+    Entity* entitiy;
+} GameOverLevelContext;
+
+static void
+level_game_over_alloc(Level* level, GameManager* manager, void* context)
+{
+    GameOverLevelContext* game_over_context = context;
+
+    game_over_context->entitiy =
+      level_add_entity(level, &game_over_description);
+    GameOverEntityContext* entity_context =
+      entity_context_get(game_over_context->entitiy);
+    entity_context->logo_sprite =
+      game_manager_sprite_load(manager, "game_over.fxbm");
+
+    entity_context->score = 0;
+    entity_context->max_score = 0;
+}
+
+static void
+level_game_over_start(Level* level, GameManager* manager, void* _level_context)
+{
+    UNUSED(level);
+
+    GameOverLevelContext* level_context = _level_context;
+    GameOverEntityContext* entity_context =
+      entity_context_get(level_context->entitiy);
+
+    GameContext* game_context = game_manager_game_context_get(manager);
+    if (game_context->score > game_context->best_score) {
+        game_context->best_score = game_context->score;
+        game_save_settings(game_context);
+    }
+
+    entity_context->score = game_context->score;
+    entity_context->max_score = game_context->best_score;
+
+    FURI_LOG_D(GAME_NAME, "Game over level started");
+}
+
+const LevelBehaviour level_game_over = {
+    .alloc = level_game_over_alloc,
+    .free = NULL,
+    .start = level_game_over_start,
+    .stop = NULL,
+    .context_size = sizeof(GameOverLevelContext),
+};

+ 5 - 0
src/levels/level_game_over/level_game_over.h

@@ -0,0 +1,5 @@
+#pragma once
+
+#include "../../engine/level.h"
+
+extern const LevelBehaviour level_game_over;