]> git.lizzy.rs Git - nothing.git/commitdiff
(#1109) Introduce ACTION_TOGGLE_GOAL
authorrexim <reximkut@gmail.com>
Sat, 19 Oct 2019 19:40:44 +0000 (02:40 +0700)
committerrexim <reximkut@gmail.com>
Sat, 19 Oct 2019 19:40:44 +0000 (02:40 +0700)
assets/levels/level-01.txt
src/game/level.c
src/game/level/action.h
src/game/level/goals.c
src/game/level/goals.h
src/game/level/level_editor/rect_layer.c
src/game/level/player.c
src/game/level/player.h
src/game/level/regions.c
src/game/level/regions.h

index e6e3bda67fdb73a89f836e939eb6dad73978f1dc..2b6139d32a95aeb3cb5d737abf20be3073bad05e 100644 (file)
@@ -42,9 +42,9 @@ SPACE to Jump
 label_double_jump 950.930298 -279.062897 fffda5
 Double Jump
 4
-script_goal_1 659.885925 -301.853394 904.875000 333.048859 deaa87
+script_goal_1 659.885925 -301.853394 904.875000 333.048859 deaa87 2 goal1
 script_show_goal_2 1249.832397 -862.224976 323.924408 544.635071 deaa87
-script_hide_label_double_jump 1033.862549 -862.224976 215.969864 569.733276 d35f5f 1 label_double_jump
+script_hide_label_double_jump 1033.862549 -862.224976 215.969864 569.733276 d35f5f 1 label_double_jump 
 hide_wasd_script 260.383636 24.900909 125.925934 209.259262 a1e764 1 label_wasd 
 21
 ;; TODO(#1106): level 01 functionality that was provided by script doesn't work anymore
index 962ce99d7f481ccc4dc09d4c86e64be27ba2ea8c..aaeb6c5196e676dbdce00cecb77e57d824d1b709 100644 (file)
@@ -147,7 +147,8 @@ Level *create_level_from_level_editor(const LevelEditor *level_editor)
         lt,
         create_regions_from_rect_layer(
             level_editor->regions_layer,
-            level->labels),
+            level->labels,
+            level->goals),
         destroy_regions);
     if (level->regions == NULL) {
         RETURN_LT(lt, NULL);
@@ -242,7 +243,6 @@ int level_update(Level *level, float delta_time)
 
     rigid_bodies_collide(level->rigid_bodies, level->platforms);
 
-    player_hide_goals(level->player, level->goals);
     player_die_from_lava(level->player, level->lava);
     regions_player_enter(level->regions, level->player);
     regions_player_leave(level->regions, level->player);
index 27a274d06202a3b7b4a7b146f73cf5265fa1e31d..5166422279f40fd778755976de4753c55894c14f 100644 (file)
@@ -5,12 +5,13 @@
 
 typedef enum {
     ACTION_NONE = 0,
-    ACTION_HIDE_LABEL
+    ACTION_HIDE_LABEL,
+    ACTION_TOGGLE_GOAL,
 } ActionType;
 
 typedef struct {
     ActionType type;
-    char label_id[ENTITY_MAX_ID_SIZE];
+    char entity_id[ENTITY_MAX_ID_SIZE];
 } Action;
 
 #endif  // ACTION_H_
index e6dc6a7477d9f2defa52221539cf4030b0740dfe..d91bbf6814f4fb82d26af99f433f25b657590c46 100644 (file)
@@ -15,7 +15,6 @@
 #include "system/str.h"
 
 #define GOAL_RADIUS 10.0f
-#define GOAL_MAX_ID_SIZE 36
 
 static int goals_is_goal_hidden(const Goals *goals, size_t i);
 
@@ -33,7 +32,6 @@ struct Goals {
     Cue_state *cue_states;
     bool *visible;
     size_t count;
-    Rect player_hitbox;
     float angle;
 };
 
@@ -65,7 +63,7 @@ Goals *create_goals_from_line_stream(LineStream *line_stream)
         RETURN_LT(lt, NULL);
     }
     for (size_t i = 0; i < goals->count; ++i) {
-        goals->ids[i] = PUSH_LT(lt, nth_calloc(1, sizeof(char) * GOAL_MAX_ID_SIZE), free);
+        goals->ids[i] = PUSH_LT(lt, nth_calloc(1, sizeof(char) * ENTITY_MAX_ID_SIZE), free);
         if (goals->ids[i] == NULL) {
             RETURN_LT(lt, NULL);
         }
@@ -95,7 +93,7 @@ Goals *create_goals_from_line_stream(LineStream *line_stream)
     for (size_t i = 0; i < goals->count; ++i) {
         if (sscanf(
                 line_stream_next(line_stream),
-                "%" STRINGIFY(GOAL_MAX_ID_SIZE) "s%f%f%6s",
+                "%" STRINGIFY(ENTITY_MAX_ID_SIZE) "s%f%f%6s",
                 goals->ids[i],
                 &goals->positions[i].x,
                 &goals->positions[i].y,
@@ -135,7 +133,7 @@ Goals *create_goals_from_point_layer(const PointLayer *point_layer)
         RETURN_LT(lt, NULL);
     }
     for (size_t i = 0; i < goals->count; ++i) {
-        goals->ids[i] = PUSH_LT(lt, nth_calloc(1, sizeof(char) * GOAL_MAX_ID_SIZE), free);
+        goals->ids[i] = PUSH_LT(lt, nth_calloc(1, sizeof(char) * ENTITY_MAX_ID_SIZE), free);
         if (goals->ids[i] == NULL) {
             RETURN_LT(lt, NULL);
         }
@@ -244,13 +242,6 @@ void goals_update(Goals *goals,
     goals->angle = fmodf(goals->angle + 2.0f * delta_time, 2.0f * PI);
 }
 
-void goals_hide_from_player(Goals *goals,
-                            Rect player_hitbox)
-{
-    goals->player_hitbox = player_hitbox;
-
-}
-
 int goals_sound(Goals *goals,
                 Sound_samples *sound_samples)
 {
@@ -310,3 +301,26 @@ static int goals_is_goal_hidden(const Goals *goals, size_t i)
 {
     return !goals->visible[i];
 }
+
+void goals_hide(Goals *goals, char goal_id[ENTITY_MAX_ID_SIZE])
+{
+    trace_assert(goals);
+    trace_assert(goal_id);
+
+    for (size_t i = 0; i < goals->count; ++i) {
+        if (strncmp(goal_id, goals->ids[i], ENTITY_MAX_ID_SIZE) == 0) {
+            goals->visible[i] = false;
+        }
+    }
+}
+
+void goals_show(Goals *goals, char goal_id[ENTITY_MAX_ID_SIZE])
+{
+    trace_assert(goals);
+    trace_assert(goal_id);
+    for (size_t i = 0; i < goals->count; ++i) {
+        if (strncmp(goal_id, goals->ids[i], ENTITY_MAX_ID_SIZE) == 0) {
+            goals->visible[i] = true;
+        }
+    }
+}
index bcdb306f1bf0cd5822bfce21ba27d40a64fc1a67..203c643bd99610de154317a1d2d3a2077667a990 100644 (file)
@@ -6,6 +6,7 @@
 #include "game/camera.h"
 #include "game/level/player.h"
 #include "game/sound_samples.h"
+#include "config.h"
 
 typedef struct Goals Goals;
 typedef struct LineStream LineStream;
@@ -23,11 +24,12 @@ int goals_sound(Goals *goals,
                 Sound_samples *sound_samples);
 void goals_update(Goals *goals,
                   float delta_time);
-void goals_hide_from_player(Goals *goals,
-                            Rect player_hitbox);
 void goals_checkpoint(const Goals *goals,
                       Player *player);
 void goals_cue(Goals *goals,
                const Camera *camera);
 
+void goals_hide(Goals *goals, char goal_id[ENTITY_MAX_ID_SIZE]);
+void goals_show(Goals *goals, char goal_id[ENTITY_MAX_ID_SIZE]);
+
 #endif  // GOALS_H_
index 55f0dce3aab60a8551de82b0dec8e052c4b3f354..ae88eac696360736ab1dcfc3e2f773dfd3493c30 100644 (file)
@@ -723,13 +723,15 @@ RectLayer *create_rect_layer_from_line_stream(LineStream *line_stream, const cha
         if (sscanf(line, "%d%n", (int*)&action.type, &n) != EOF) {
             line += n;
             switch (action.type) {
+            case ACTION_NONE: break;
+
+            case ACTION_TOGGLE_GOAL:
             case ACTION_HIDE_LABEL: {
-                if (sscanf(line, "%"STRINGIFY(ENTITY_MAX_ID_SIZE)"s", action.label_id) == EOF) {
+                if (sscanf(line, "%"STRINGIFY(ENTITY_MAX_ID_SIZE)"s", action.entity_id) == EOF) {
                     log_fail("%s\n", strerror(errno));
                     RETURN_LT(layer->lt, NULL);
                 }
             } break;
-            default: {}
             }
         }
 
@@ -952,12 +954,14 @@ int rect_layer_dump_stream(const RectLayer *layer, FILE *filedump)
         color_hex_to_stream(colors[i], filedump);
 
         switch (actions[i].type) {
+        case ACTION_NONE: {} break;
+
+        case ACTION_TOGGLE_GOAL:
         case ACTION_HIDE_LABEL: {
             fprintf(filedump, " %d %.*s ",
                     (int)actions[i].type,
-                    ENTITY_MAX_ID_SIZE, actions[i].label_id);
+                    ENTITY_MAX_ID_SIZE, actions[i].entity_id);
         } break;
-        default: {}
         }
 
         fprintf(filedump, "\n");
index f4f23df8f1901a74f78ec211e4cead37cf0e5492..62d38b322d452a2a44d3f91d8cee1b3fa3035fec 100644 (file)
@@ -244,18 +244,6 @@ void player_focus_camera(Player *player,
             vec(0.0f, -player_hitbox.h * 0.5f)));
 }
 
-void player_hide_goals(const Player *player,
-                       Goals *goals)
-{
-    trace_assert(player);
-    trace_assert(goals);
-    goals_hide_from_player(
-        goals,
-        rigid_bodies_hitbox(
-            player->rigid_bodies,
-            player->alive_body_id));
-}
-
 void player_die_from_lava(Player *player,
                           const Lava *lava)
 {
index 8de51fb8bda2189d06f65f3a2e285a5e44fd68ce..c11e3f216dccdee07901b2f20ff01f7b574fc860 100644 (file)
@@ -40,8 +40,6 @@ void player_die(Player *player);
 
 void player_focus_camera(Player *player,
                          Camera *camera);
-void player_hide_goals(const Player *player,
-                       Goals *goal);
 void player_die_from_lava(Player *player,
                           const Lava *lava);
 
index c5df3eda46065e7e74d1b64173ab676e4a33bcdc..276c41f0c2fff90ea00f924a28905552b183fc5e 100644 (file)
@@ -10,6 +10,7 @@
 #include "system/nth_alloc.h"
 #include "game/level/level_editor/rect_layer.h"
 #include "game/level/labels.h"
+#include "game/level/goals.h"
 
 enum RegionState {
     RS_PLAYER_OUTSIDE = 0,
@@ -26,9 +27,12 @@ struct Regions {
     Action *actions;
 
     Labels *labels;
+    Goals *goals;
 };
 
-Regions *create_regions_from_rect_layer(const RectLayer *rect_layer, Labels *labels)
+Regions *create_regions_from_rect_layer(const RectLayer *rect_layer,
+                                        Labels *labels,
+                                        Goals *goals)
 {
     trace_assert(rect_layer);
     trace_assert(labels);
@@ -104,6 +108,7 @@ Regions *create_regions_from_rect_layer(const RectLayer *rect_layer, Labels *lab
 
 
     regions->labels = labels;
+    regions->goals = goals;
 
     return regions;
 }
@@ -124,8 +129,16 @@ void regions_player_enter(Regions *regions, Player *player)
             player_overlaps_rect(player, regions->rects[i])) {
             regions->states[i] = RS_PLAYER_INSIDE;
 
-            if (regions->actions[i].type == ACTION_HIDE_LABEL) {
-                labels_hide(regions->labels, regions->actions[i].label_id);
+            switch (regions->actions[i].type) {
+            case ACTION_HIDE_LABEL: {
+                labels_hide(regions->labels, regions->actions[i].entity_id);
+            } break;
+
+            case ACTION_TOGGLE_GOAL: {
+                goals_hide(regions->goals, regions->actions[i].entity_id);
+            } break;
+
+            default: {}
             }
         }
     }
@@ -140,6 +153,14 @@ void regions_player_leave(Regions *regions, Player *player)
         if (regions->states[i] == RS_PLAYER_INSIDE &&
             !player_overlaps_rect(player, regions->rects[i])) {
             regions->states[i] = RS_PLAYER_OUTSIDE;
+
+            switch (regions->actions[i].type) {
+            case ACTION_TOGGLE_GOAL: {
+                goals_show(regions->goals, regions->actions[i].entity_id);
+            } break;
+
+            default: {}
+            }
         }
     }
 }
index 424286e46f1c0e524b69f6def909ab42c6d2954c..793ad819d4b95067d27d9b97a11aadd0ce3add38 100644 (file)
@@ -10,8 +10,9 @@ typedef struct LineStream LineStream;
 typedef struct Level Level;
 typedef struct RectLayer RectLayer;
 typedef struct Labels Labels;
+typedef struct Goals Goals;
 
-Regions *create_regions_from_rect_layer(const RectLayer *rect_layer, Labels *labels);
+Regions *create_regions_from_rect_layer(const RectLayer *rect_layer, Labels *labels, Goals *goals);
 void destroy_regions(Regions *regions);
 
 int regions_render(Regions *regions, const Camera *camera);