diff --git a/entities.c b/entities.c index e772527..5acb14c 100644 --- a/entities.c +++ b/entities.c @@ -11,12 +11,14 @@ #include "systems.h" VECTOR_SOURCE(su32_t, uint32_t) +VECTOR_SOURCE(vf32_t, float) HASHMAP_SOURCE(mu32u32_t, uint32_t, uint32_t, hashI) void ecs_init(entity_data* d, uint32_t n, ...){ d->entities = 0; d->size = 0; d->stack = su32_tInit(); + d->signals = vf32_tInit(); va_list v; va_start(v, n); uint32_t i, offset = 0; @@ -94,6 +96,7 @@ void ecs_clear(entity_data* d){ void ecs_deinit(entity_data* d){ su32_tFree(&d->stack); + vf32_tFree(&d->signals); free(d->masks); free(d->data); free(d->flags); @@ -254,3 +257,28 @@ uint32_t entity_furthest_n(entity_data* d, v2 pos, uint8_t exact, uint32_t n, ui void entity_add_flag(entity_data* d, uint32_t eid, uint32_t flag){ d->flags[eid] = bit_on(d->flags[eid], flag); } + +void entity_create_signal(entity_data* d, uint32_t signal){ + if (signal != d->signals.size) return; + vf32_tPushBack(&d->signals, 0); +} + +void entity_set_signal(entity_data* d, uint32_t signal, float value){ + if (signal >= d->signals.size) return; + d->signals.data[signal] = value; +} + +float entity_signal_check(entity_data* d, uint32_t signal){ + if (signal >= d->signals.size) return 0; + return d->signals.data[signal]; +} + +float entity_receive_signal(entity_data* d, uint32_t signal){ + if (signal >= d->signals.size) return 0; + float v = d->signals.data[signal]; + if (v!=0){ + d->signals.data[signal] = 0; + } + return v; +} + diff --git a/entities.h b/entities.h index f9846e7..248e1a9 100644 --- a/entities.h +++ b/entities.h @@ -8,6 +8,7 @@ #define COMPONENT_LIMIT 64 VECTOR(su32_t, uint32_t) +VECTOR(vf32_t, float) HASHMAP(mu32u32_t, uint32_t, uint32_t) struct v2; @@ -21,6 +22,7 @@ typedef struct entity_data{ void* data; uint32_t entities; su32_t stack; + vf32_t signals; uint64_t* masks; uint64_t* flags; uint16_t* layers; @@ -57,4 +59,9 @@ void entity_destroy(entity_data* d, uint32_t eid); uint8_t entity_exact_mask_logic(entity_data* d, uint32_t eid, uint8_t exact, uint64_t reference, uint64_t candidate); +void entity_create_signal(entity_data* d, uint32_t signal); +void entity_set_signal(entity_data* d, uint32_t signal, float value); +float entity_signal_check(entity_data* d, uint32_t signal); +float entity_receive_signal(entity_data* d, uint32_t signal); + #endif