Explorar o código

update game end message

jblanked hai 8 meses
pai
achega
cced586842
Modificáronse 3 ficheiros con 29 adicións e 11 borrados
  1. 18 6
      game/enemy.c
  2. 9 5
      game/game.c
  3. 2 0
      game/player.h

+ 18 - 6
game/enemy.c

@@ -303,6 +303,7 @@ static void enemy_collision(Entity *self, Entity *other, GameManager *manager, v
                         player_context->health = player_context->max_health;
                         player_context->health = player_context->max_health;
                         save_player_context(player_context);
                         save_player_context(player_context);
                         furi_delay_ms(100);
                         furi_delay_ms(100);
+                        game_context->end_reason = GAME_END_PVP_ENEMY_DEAD;
                         game_manager_game_stop(manager);
                         game_manager_game_stop(manager);
                         return;
                         return;
                     }
                     }
@@ -310,12 +311,16 @@ static void enemy_collision(Entity *self, Entity *other, GameManager *manager, v
                     // Reset enemy position and health
                     // Reset enemy position and health
                     enemy_context->health = 100; // this needs to be set to the enemy's max health
                     enemy_context->health = 100; // this needs to be set to the enemy's max health
 
 
-                    // remove from game context and set in safe zone
-                    game_context->enemies[enemy_context->index] = NULL;
-                    game_context->enemy_count--;
-                    entity_collider_remove(self);
-                    entity_pos_set(self, (Vector){-100, -100});
-                    return;
+                    // in PVE mode, enemies can respawn
+                    if (game_context->game_mode != GAME_MODE_PVE)
+                    {
+                        // remove from game context and set in safe zone
+                        game_context->enemies[enemy_context->index] = NULL;
+                        game_context->enemy_count--;
+                        entity_collider_remove(self);
+                        entity_pos_set(self, (Vector){-100, -100});
+                        return;
+                    }
                 }
                 }
                 else
                 else
                 {
                 {
@@ -359,6 +364,7 @@ static void enemy_collision(Entity *self, Entity *other, GameManager *manager, v
                     {
                     {
                         save_player_context(player_context);
                         save_player_context(player_context);
                         furi_delay_ms(100);
                         furi_delay_ms(100);
+                        game_context->end_reason = GAME_END_PVP_PLAYER_DEAD;
                         game_manager_game_stop(manager);
                         game_manager_game_stop(manager);
                         return;
                         return;
                     }
                     }
@@ -655,6 +661,12 @@ static void enemy_update(Entity *self, GameManager *manager, void *context)
     }
     }
     else
     else
     {
     {
+        // update enemy position for pve mode
+        if (game_context->game_mode == GAME_MODE_PVE)
+        {
+            enemy_pvp_position(manager, enemy_context, self);
+        }
+
         // Increment the elapsed_attack_timer for the enemy
         // Increment the elapsed_attack_timer for the enemy
         enemy_context->elapsed_attack_timer += delta_time;
         enemy_context->elapsed_attack_timer += delta_time;
 
 

+ 9 - 5
game/game.c

@@ -93,8 +93,6 @@ static void game_start(GameManager *game_manager, void *ctx)
         {
         {
             game_context->story_step = 0;
             game_context->story_step = 0;
         }
         }
-
-        // show tutorial only for now
         game_context->levels[0] = game_manager_add_level(game_manager, story_world());
         game_context->levels[0] = game_manager_add_level(game_manager, story_world());
         game_context->level_count = 1;
         game_context->level_count = 1;
         for (int i = 1; i < MAX_LEVELS; i++)
         for (int i = 1; i < MAX_LEVELS; i++)
@@ -122,7 +120,7 @@ static void game_start(GameManager *game_manager, void *ctx)
     game_context->imu_present = imu_present(game_context->imu);
     game_context->imu_present = imu_present(game_context->imu);
 
 
     // FlipperHTTP
     // FlipperHTTP
-    if (game_context->game_mode == GAME_MODE_PVP)
+    if (game_context->game_mode != GAME_MODE_STORY)
     {
     {
         // check if enough memory
         // check if enough memory
         if (!is_enough_heap(sizeof(FlipperHTTP), true))
         if (!is_enough_heap(sizeof(FlipperHTTP), true))
@@ -177,7 +175,7 @@ static void game_stop(void *ctx)
         level_clear(game_context->levels[game_context->current_level]);
         level_clear(game_context->levels[game_context->current_level]);
     }
     }
 
 
-    if (game_context->game_mode == GAME_MODE_PVP)
+    if (game_context->game_mode != GAME_MODE_STORY)
     {
     {
         if (game_context->fhttp)
         if (game_context->fhttp)
         {
         {
@@ -191,7 +189,7 @@ static void game_stop(void *ctx)
             game_context->ws_info = NULL;
             game_context->ws_info = NULL;
         }
         }
     }
     }
-    else if (game_context->game_mode == GAME_MODE_STORY)
+    else
     {
     {
         save_uint32("story_step", game_context->story_step);
         save_uint32("story_step", game_context->story_step);
     }
     }
@@ -214,6 +212,12 @@ static void game_stop(void *ctx)
         case GAME_END_PVP_REQUIREMENT:
         case GAME_END_PVP_REQUIREMENT:
             snprintf(message, sizeof(message), "You need to be level 10 to\nplay PvP.\n\nHit BACK to exit.");
             snprintf(message, sizeof(message), "You need to be level 10 to\nplay PvP.\n\nHit BACK to exit.");
             break;
             break;
+        case GAME_END_PVP_ENEMY_DEAD:
+            snprintf(message, sizeof(message), "You have defeated the enemy!\n\nHit BACK to exit.");
+            break;
+        case GAME_END_PVP_PLAYER_DEAD:
+            snprintf(message, sizeof(message), "You have been defeated!\n\nHit BACK to exit.");
+            break;
         };
         };
         easy_flipper_dialog("Game Over", message);
         easy_flipper_dialog("Game Over", message);
     }
     }

+ 2 - 0
game/player.h

@@ -92,6 +92,8 @@ typedef enum
     GAME_END_MEMORY = 0,              // ran out of memory
     GAME_END_MEMORY = 0,              // ran out of memory
     GAME_END_TUTORIAL_INCOMPLETE = 1, // tutorial incomplete
     GAME_END_TUTORIAL_INCOMPLETE = 1, // tutorial incomplete
     GAME_END_PVP_REQUIREMENT = 2,     // player level too low for pvp
     GAME_END_PVP_REQUIREMENT = 2,     // player level too low for pvp
+    GAME_END_PVP_ENEMY_DEAD = 3,      // enemy dead
+    GAME_END_PVP_PLAYER_DEAD = 4,     // player dead
 } GameEndReason;
 } GameEndReason;
 
 
 typedef struct
 typedef struct