eco2d/code/game/src/entity_view.c

99 lines
3.1 KiB
C
Raw Normal View History

2021-05-05 09:25:05 +00:00
#include "entity_view.h"
2021-05-06 16:26:52 +00:00
#include "packet_utils.h"
2021-07-18 18:30:27 +00:00
#include "world/blocks.h"
2021-05-05 09:25:05 +00:00
ZPL_TABLE_DEFINE(entity_view_tbl, entity_view_tbl_, entity_view);
2021-05-06 16:26:52 +00:00
pkt_desc pkt_entity_view_desc[] = {
2021-05-06 18:24:01 +00:00
{ PKT_UINT(entity_view, kind) },
{ PKT_UINT(entity_view, flag) },
{ PKT_HALF(entity_view, x) },
{ PKT_HALF(entity_view, y) },
2021-08-09 13:59:50 +00:00
2021-08-09 14:33:46 +00:00
{ PKT_KEEP_IF(entity_view, blocks_used, 0, 2) }, // NOTE(zaklaus): skip velocity for chunks
{ PKT_HALF(entity_view, vx) },
{ PKT_HALF(entity_view, vy) },
2021-08-09 13:59:50 +00:00
2021-08-09 13:57:56 +00:00
{ PKT_SKIP_IF(entity_view, blocks_used, 0, 1) }, // NOTE(zaklaus): skip blocks for anything else
{ PKT_ARRAY(entity_view, blocks) },
2021-08-09 13:59:50 +00:00
2021-08-09 14:33:46 +00:00
{ PKT_KEEP_IF(entity_view, blocks_used, 0, 2) }, // NOTE(zaklaus): skip hp for chunks
2021-07-27 16:34:31 +00:00
{ PKT_HALF(entity_view, hp) },
{ PKT_HALF(entity_view, max_hp) },
2021-08-09 13:59:50 +00:00
2021-05-06 16:26:52 +00:00
{ PKT_END },
};
2021-05-06 18:24:01 +00:00
size_t entity_view_pack_struct(void *data, size_t len, entity_view view) {
2021-05-06 16:26:52 +00:00
cw_pack_context pc = {0};
2021-05-10 09:40:56 +00:00
cw_pack_context_init(&pc, data, (unsigned long)len, 0);
2021-05-06 16:26:52 +00:00
pkt_pack_struct(&pc, pkt_entity_view_desc, PKT_STRUCT_PTR(&view));
2021-05-06 18:24:01 +00:00
return pc.current - pc.start;
2021-05-06 16:26:52 +00:00
}
entity_view entity_view_unpack_struct(void *data, size_t len) {
cw_unpack_context uc = {0};
2021-05-10 09:40:56 +00:00
cw_unpack_context_init(&uc, data, (unsigned long)len, 0);
2021-05-06 16:26:52 +00:00
2021-05-06 18:24:01 +00:00
entity_view view = {0};
2021-05-06 16:26:52 +00:00
pkt_unpack_struct(&uc, pkt_entity_view_desc, PKT_STRUCT_PTR(&view));
2021-07-18 18:30:27 +00:00
#if 0
if (view.kind == EKIND_CHUNK) {
for (int i=0;i<256;i++){
zpl_printf("%d, ", view.blocks[i]);
}
zpl_exit(0);
}
#endif
2021-05-06 16:26:52 +00:00
return view;
}
2021-05-06 15:30:38 +00:00
void entity_view_init(entity_view_tbl *map) {
entity_view_tbl_init(map, zpl_heap());
2021-05-05 09:25:05 +00:00
}
2021-05-06 15:30:38 +00:00
void entity_view_free(entity_view_tbl *map) {
entity_view_tbl_destroy(map);
2021-05-05 09:25:05 +00:00
}
2021-05-06 15:30:38 +00:00
void entity_view_update_or_create(entity_view_tbl *map, uint64_t ent_id, entity_view data) {
entity_view_tbl_set(map, ent_id, data);
2021-05-05 09:25:05 +00:00
}
2021-05-06 15:30:38 +00:00
void entity_view_destroy(entity_view_tbl *map, uint64_t ent_id) {
2021-07-18 18:30:27 +00:00
entity_view_remove_chunk_texture(map, ent_id);
2021-05-06 15:30:38 +00:00
entity_view_tbl_remove(map, ent_id);
2021-05-05 09:25:05 +00:00
}
2021-05-06 15:30:38 +00:00
entity_view *entity_view_get(entity_view_tbl *map, uint64_t ent_id) {
return entity_view_tbl_get(map, ent_id);
2021-05-05 09:25:05 +00:00
}
2021-05-09 22:40:25 +00:00
void entity_view_map(entity_view_tbl *map, void (*map_proc)(uint64_t key, entity_view * value)) {
entity_view_tbl_map_mut(map, map_proc);
}
void entity_view_mark_for_removal(entity_view_tbl *map, uint64_t ent_id) {
entity_view *view = entity_view_tbl_get(map, ent_id);
view->tran_effect = ETRAN_FADEOUT;
view->tran_time = 1.0f;
}
void entity_view_mark_for_fadein(entity_view_tbl *map, uint64_t ent_id) {
entity_view *view = entity_view_tbl_get(map, ent_id);
view->tran_effect = ETRAN_FADEIN;
view->tran_time = 0.0f;
2021-05-05 09:25:05 +00:00
}
2021-07-18 18:30:27 +00:00
void entity_view_update_chunk_texture(entity_view_tbl *map, uint64_t ent_id, void *world_view) {
entity_view *view = entity_view_tbl_get(map, ent_id);
if (view->kind != EKIND_CHUNK) return;
blocks_build_chunk_tex(ent_id, view->blocks, sizeof(view->blocks), world_view);
}
void entity_view_remove_chunk_texture(entity_view_tbl *map, uint64_t ent_id) {
entity_view *view = entity_view_tbl_get(map, ent_id);
if (view->kind != EKIND_CHUNK) return;
blocks_remove_chunk_tex(view->tex);
}