#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)
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) {
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 */
{
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)