1 #include "system/stacktrace.h"
4 #include "ebisp/interpreter.h"
5 #include "ebisp/parser.h"
6 #include "ebisp/scope.h"
10 #include "system/str.h"
11 #include "system/line_stream.h"
12 #include "system/log.h"
13 #include "system/lt.h"
14 #include "system/nth_alloc.h"
15 #include "game/level/level_editor/rect_layer.h"
17 #define ID_MAX_SIZE 36
20 RS_PLAYER_OUTSIDE = 0,
31 enum RegionState *states;
34 Regions *create_regions_from_line_stream(LineStream *line_stream)
36 trace_assert(line_stream);
40 Regions *regions = PUSH_LT(
42 nth_calloc(1, sizeof(Regions)),
44 if (regions == NULL) {
50 line_stream_next(line_stream),
52 ®ions->count) < 0) {
53 log_fail("Could not read amount of script regions\n");
57 regions->ids = PUSH_LT(
59 nth_calloc(regions->count * ID_MAX_SIZE, sizeof(char)),
61 if (regions->ids == NULL) {
65 regions->rects = PUSH_LT(
67 nth_calloc(1, sizeof(Rect) * regions->count),
69 if (regions->rects == NULL) {
73 regions->colors = PUSH_LT(
75 nth_calloc(1, sizeof(Color) * regions->count),
77 if (regions->colors == NULL) {
81 regions->states = PUSH_LT(
83 nth_calloc(1, sizeof(enum RegionState) * regions->count),
85 if (regions->states == NULL) {
89 log_info("Amount of regions: %lu\n", regions->count);
93 for (size_t i = 0; i < regions->count; ++i) {
95 line_stream_next(line_stream),
96 "%" STRINGIFY(ID_MAX_SIZE) "s%f%f%f%f%6s",
97 regions->ids + ID_MAX_SIZE * i,
100 ®ions->rects[i].w,
101 ®ions->rects[i].h,
103 log_fail("Could not read size and color of %dth region\n");
107 regions->colors[i] = hexstr(color);
108 regions->states[i] = RS_PLAYER_OUTSIDE;
115 Regions *create_regions_from_rect_layer(const RectLayer *rect_layer)
117 trace_assert(rect_layer);
119 Lt *lt = create_lt();
121 Regions *regions = PUSH_LT(
123 nth_calloc(1, sizeof(Regions)),
125 if (regions == NULL) {
130 regions->count = rect_layer_count(rect_layer);
132 regions->ids = PUSH_LT(
134 nth_calloc(regions->count * ID_MAX_SIZE, sizeof(char)),
136 if (regions->ids == NULL) {
140 rect_layer_ids(rect_layer),
141 regions->count * ID_MAX_SIZE * sizeof(char));
144 regions->rects = PUSH_LT(
146 nth_calloc(1, sizeof(Rect) * regions->count),
148 if (regions->rects == NULL) {
151 memcpy(regions->rects,
152 rect_layer_rects(rect_layer),
153 regions->count * sizeof(Rect));
156 regions->colors = PUSH_LT(
158 nth_calloc(1, sizeof(Color) * regions->count),
160 if (regions->colors == NULL) {
163 memcpy(regions->colors,
164 rect_layer_colors(rect_layer),
165 regions->count * sizeof(Color));
167 regions->states = PUSH_LT(
169 nth_calloc(1, sizeof(enum RegionState) * regions->count),
171 if (regions->states == NULL) {
178 void destroy_regions(Regions *regions)
180 trace_assert(regions);
181 RETURN_LT0(regions->lt);
184 void regions_player_enter(Regions *regions, Player *player, Script *supa_script)
186 trace_assert(regions);
187 trace_assert(player);
189 for (size_t i = 0; i < regions->count; ++i) {
190 if (regions->states[i] == RS_PLAYER_OUTSIDE &&
191 player_overlaps_rect(player, regions->rects[i])) {
192 regions->states[i] = RS_PLAYER_INSIDE;
194 Gc *gc = script_gc(supa_script);
195 if (script_has_scope_value(supa_script, "on-region-enter")) {
200 regions->ids + i * ID_MAX_SIZE));
206 void regions_player_leave(Regions *regions, Player *player, Script *supa_script)
208 trace_assert(regions);
209 trace_assert(player);
210 trace_assert(supa_script);
212 for (size_t i = 0; i < regions->count; ++i) {
213 if (regions->states[i] == RS_PLAYER_INSIDE &&
214 !player_overlaps_rect(player, regions->rects[i])) {
215 regions->states[i] = RS_PLAYER_OUTSIDE;
216 Gc *gc = script_gc(supa_script);
217 if (script_has_scope_value(supa_script, "on-region-leave")) {
222 regions->ids + i * ID_MAX_SIZE));
228 int regions_render(Regions *regions, Camera *camera)
230 trace_assert(regions);
231 trace_assert(camera);
233 for (size_t i = 0; i < regions->count; ++i) {
234 if (camera_render_debug_rect(
237 regions->colors[i]) < 0) {