]> git.lizzy.rs Git - nothing.git/commitdiff
(#396) Implement regions_player_enter
authorrexim <reximkut@gmail.com>
Sun, 4 Nov 2018 17:30:24 +0000 (00:30 +0700)
committerrexim <reximkut@gmail.com>
Sun, 4 Nov 2018 17:30:24 +0000 (00:30 +0700)
src/game/level/regions.c

index 7a7e5bea0bf87dbf8fd1f3b8a35eeec4a0f32828..22ab0426631e0214156f6d9819afb9db5b319751 100644 (file)
 #include "system/line_stream.h"
 #include "system/lt.h"
 
+enum RegionState {
+    RS_PLAYER_INSIDE = 0,
+    RS_PLAYER_OUTSIDE
+};
+
 struct Regions
 {
     Lt *lt;
     size_t count;
     Rect *rects;
     Script **scripts;
+    enum RegionState *states;
 };
 
 Regions *create_regions_from_line_stream(LineStream *line_stream)
@@ -65,6 +71,15 @@ Regions *create_regions_from_line_stream(LineStream *line_stream)
         RETURN_LT(lt, NULL);
     }
 
+    regions->states = PUSH_LT(
+        lt,
+        malloc(sizeof(bool) * regions->count),
+        free);
+    if (regions->states == NULL) {
+        throw_error(ERROR_TYPE_LIBC);
+        RETURN_LT(lt, NULL);
+    }
+
     printf("Amount of regions: %lu\n", regions->count);
 
     for (size_t i = 0; i < regions->count; ++i) {
@@ -86,6 +101,8 @@ Regions *create_regions_from_line_stream(LineStream *line_stream)
         if (regions->scripts[i] == NULL) {
             RETURN_LT(lt, NULL);
         }
+
+        regions->states[i] = RS_PLAYER_OUTSIDE;
     }
 
     /* TODO(#456): create_regions_from_line_stream doesn't check if the scripts contain proper callbacks */
@@ -103,7 +120,13 @@ void regions_player_enter(Regions *regions, Player *player)
 {
     assert(regions);
     assert(player);
-    /* TODO(#396): regions_player_enter is not implemented */
+
+    for (size_t i = 0; i < regions->count; ++i) {
+        if (regions->states[i] == RS_PLAYER_OUTSIDE &&
+            player_overlaps_rect(player, regions->rects[i])) {
+            script_eval(regions->scripts[i], "(on-enter)");
+        }
+    }
 }
 
 void regions_player_leave(Regions *regions, Player *player)