introduce entity spawndefs

isolation_bkp/dynres
Dominik Madarász 2022-08-13 08:43:15 +02:00
parent e84de812a0
commit 04e257ec61
8 changed files with 41 additions and 8 deletions

View File

@ -45,6 +45,20 @@ void entity_despawn(uint64_t ent_id) {
ecs_delete(world_ecs(), ent_id); ecs_delete(world_ecs(), ent_id);
} }
// NOTE(zaklaus): bring in entity spawnlist
#include "entity_spawnlist.c"
uint64_t entity_spawn_id(uint16_t id){
for (size_t i = 0; i < MAX_ENTITY_SPAWNDEFS; ++i){
if (entity_spawnlist[i].id == id){
ZPL_ASSERT(entity_spawnlist[i].proc);
return entity_spawnlist[i].proc();
}
}
return 0;
}
void entity_set_position(uint64_t ent_id, float x, float y) { void entity_set_position(uint64_t ent_id, float x, float y) {
Position *p = ecs_get_mut(world_ecs(), ent_id, Position); Position *p = ecs_get_mut(world_ecs(), ent_id, Position);
p->x = x; p->x = x;

View File

@ -8,6 +8,8 @@ void entity_batch_despawn(uint64_t *ids, size_t num_ids);
void entity_despawn(uint64_t ent_id); void entity_despawn(uint64_t ent_id);
void entity_set_position(uint64_t ent_id, float x, float y); void entity_set_position(uint64_t ent_id, float x, float y);
uint64_t entity_spawn_id(uint16_t id);
// NOTE(zaklaus): action-based entity stream throttling // NOTE(zaklaus): action-based entity stream throttling
void entity_wake(uint64_t ent_id); void entity_wake(uint64_t ent_id);
void entity_update_action_timers(); void entity_update_action_timers();

View File

@ -0,0 +1,11 @@
// NOTE(zaklaus): access to spawners
#include "storage.h"
struct {
asset_id id;
uint64_t (*proc)();
} entity_spawnlist[] = {
{ .id = ASSET_CHEST, .proc = storage_spawn }
};
#define MAX_ENTITY_SPAWNDEFS ((sizeof(entity_spawnlist))/(sizeof(entity_spawnlist[0])))

View File

@ -67,6 +67,11 @@ void buildmode_draw(void) {
qty = item->quantity; qty = item->quantity;
} }
world_block_lookup l = world_block_from_realpos((float)cam.x, (float)cam.y);
if (build_is_deletion_mode && !l.is_outer){
goto build_skip_placements;
}
if (build_is_in_draw_mode) { if (build_is_in_draw_mode) {
for (size_t i = 0; i < BUILD_MAX_PLACEMENTS; i++) { for (size_t i = 0; i < BUILD_MAX_PLACEMENTS; i++) {
item_placement *it = &build_placements[i]; item_placement *it = &build_placements[i];
@ -96,9 +101,11 @@ void buildmode_draw(void) {
} }
} }
if (!is_outside_range) if (!is_outside_range)
renderer_draw_single((float)cam.x, (float)cam.y, ASSET_BUILDMODE_HIGHLIGHT, ColorAlpha(build_is_deletion_mode ? RED : WHITE, 0.2f)); renderer_draw_single((float)cam.x, (float)cam.y, ASSET_BUILDMODE_HIGHLIGHT, ColorAlpha(build_is_deletion_mode ? RED : WHITE, 0.2f));
build_skip_placements:
build_num_placements = zpl_min(build_num_placements, qty); build_num_placements = zpl_min(build_num_placements, qty);
} }
} }

View File

@ -84,7 +84,7 @@ void item_use(ecs_world_t *ecs, ItemDrop *it, Position p, uint64_t udata) {
return; return;
} }
ecs_entity_t e = desc->place_item.spawn_proc(); ecs_entity_t e = entity_spawn_id(desc->place_item.id);
ZPL_ASSERT(world_entity_valid(e)); ZPL_ASSERT(world_entity_valid(e));
Position *pos = ecs_get_mut(ecs, e, Position); Position *pos = ecs_get_mut(ecs, e, Position);
pos->x = p.x; pos->x = p.x;

View File

@ -34,7 +34,7 @@ typedef struct {
} proxy; } proxy;
struct { struct {
uint64_t (*spawn_proc)(); asset_id id;
} place_item; } place_item;
}; };
} item_desc; } item_desc;

View File

@ -38,22 +38,19 @@
}\ }\
} }
#define ITEM_ENT(asset, qty, proc)\ #define ITEM_ENT(asset, qty, eid)\
{\ {\
.kind = asset,\ .kind = asset,\
.usage = UKIND_PLACE_ITEM,\ .usage = UKIND_PLACE_ITEM,\
.max_quantity = qty,\ .max_quantity = qty,\
.place_item = {\ .place_item = {\
.spawn_proc = proc\ .id = eid\
}\ }\
} }
#define ITEM_SELF(asset, qty) ITEM_BLOCK(asset, qty, asset) #define ITEM_SELF(asset, qty) ITEM_BLOCK(asset, qty, asset)
#define ITEM_SELF_DIR(asset, qty) ITEM_BLOCK_DIR(asset, qty, asset) #define ITEM_SELF_DIR(asset, qty) ITEM_BLOCK_DIR(asset, qty, asset)
// NOTE(zaklaus): access to spawners
#include "storage.h"
static item_desc items[] = { static item_desc items[] = {
{ {
.kind = 0, .kind = 0,
@ -70,5 +67,5 @@ static item_desc items[] = {
ITEM_PROXY(ASSET_BELT_UP, ASSET_BELT), ITEM_PROXY(ASSET_BELT_UP, ASSET_BELT),
ITEM_PROXY(ASSET_BELT_DOWN, ASSET_BELT), ITEM_PROXY(ASSET_BELT_DOWN, ASSET_BELT),
ITEM_ENT(ASSET_CHEST, 32, storage_spawn), ITEM_ENT(ASSET_CHEST, 32, ASSET_CHEST),
}; };

View File

@ -157,11 +157,13 @@ int32_t tracker_write_update(librg_world *w, librg_event *e) {
} }
// NOTE(zaklaus): action-based updates // NOTE(zaklaus): action-based updates
#if ECO2D_STREAM_ACTIONFILTER
{ {
if (view.kind != EKIND_CHUNK && !entity_can_stream(entity_id)) { if (view.kind != EKIND_CHUNK && !entity_can_stream(entity_id)) {
return LIBRG_WRITE_REJECT; return LIBRG_WRITE_REJECT;
} }
} }
#endif
return (int32_t)entity_view_pack_struct(buffer, actual_length, view); return (int32_t)entity_view_pack_struct(buffer, actual_length, view);
} }