diff --git a/code/foundation/src/debug/debug_replay.c b/code/foundation/src/debug/debug_replay.c index cfd79a8..1141d32 100644 --- a/code/foundation/src/debug/debug_replay.c +++ b/code/foundation/src/debug/debug_replay.c @@ -6,15 +6,12 @@ typedef enum { RPKIND_KEY, - + // NOTE(zaklaus): Special actions RPKIND_SPAWN_CAR, RPKIND_PLACE_ICE_RINK, RPKIND_PLACE_ERASE_CHANGES, RPKIND_SPAWN_CIRCLING_DRIVER, - RPKIND_SPAWN_ICEMAKER_ITEM, - RPKIND_SPAWN_CHEST, - RPKIND_SPAWN_BELT, } replay_kind; typedef struct { @@ -45,17 +42,17 @@ static char replaybuf[sizeof(replay_record)*UINT16_MAX + 32]; void debug_replay_store(void) { ZPL_ASSERT(replay_filename[0]); if (!records) return; - + cw_pack_context pc = {0}; cw_pack_context_init(&pc, replaybuf, sizeof(replaybuf), 0); cw_pack_unsigned(&pc, REPLAY_MAGIC); cw_pack_unsigned(&pc, REPLAY_VERSION); cw_pack_array_size(&pc, (uint32_t)zpl_array_count(records)); - + for (int i = 0; i < zpl_array_count(records); i++) { cw_pack_bin(&pc, &records[i], sizeof(replay_record)); } - + zpl_file f = {0}; zpl_file_create(&f, replay_filename); zpl_file_write(&f, replaybuf, pc.current - pc.start); @@ -64,44 +61,44 @@ void debug_replay_store(void) { void debug_replay_load(void) { ZPL_ASSERT(replay_filename[0]); - + zpl_file f = {0}; zpl_file_error err = zpl_file_open(&f, replay_filename); ZPL_ASSERT(err == ZPL_FILE_ERROR_NONE); - + size_t file_size = zpl_file_size(&f); zpl_file_read(&f, replaybuf, file_size); zpl_file_close(&f); - + cw_unpack_context uc = {0}; cw_unpack_context_init(&uc, replaybuf, (uint32_t)file_size, 0); - + cw_unpack_next(&uc); ZPL_ASSERT(uc.item.type == CWP_ITEM_POSITIVE_INTEGER && uc.item.as.u64 == REPLAY_MAGIC); - + cw_unpack_next(&uc); ZPL_ASSERT(uc.item.type == CWP_ITEM_POSITIVE_INTEGER); - + uint64_t version = uc.item.as.u64; - + ZPL_ASSERT(version >= 2); - + cw_unpack_next(&uc); ZPL_ASSERT(uc.item.type == CWP_ITEM_ARRAY); size_t items = uc.item.as.array.size; - + zpl_array_init_reserve(records, zpl_heap(), sizeof(replay_record)*items); - + for (size_t i = 0; i < items; i++) { cw_unpack_next(&uc); ZPL_ASSERT(uc.item.type == CWP_ITEM_BIN); replay_record rec = {0}; - + switch (version) { case 2:{ debug_replay_load_record_v2(&rec, uc.item.as.bin.start); }break; - + default:{ zpl_memcopy(&rec, uc.item.as.bin.start, sizeof(replay_record)); }break; @@ -112,10 +109,10 @@ void debug_replay_load(void) { void debug_replay_start(void) { is_recording = true; - + if (records) zpl_array_free(records); zpl_array_init_reserve(records, zpl_heap(), UINT16_MAX); - + last_record_time = get_cached_time(); SetTargetFPS(60); } @@ -130,17 +127,17 @@ void debug_replay_clear(void) { void debug_replay_cleanup_ents(void) { SetTargetFPS(0); if (!mime) return; - + entity_despawn(mime); mime = 0; - + is_playing = false; camera_set_follow(plr); - + for (int i = 0; i < zpl_array_count(temp_actors); i++) { entity_despawn(temp_actors[i]); } - + zpl_array_free(temp_actors); } @@ -157,17 +154,17 @@ void debug_replay_run(void) { record_pos = 0; playback_time = get_cached_time(); zpl_array_init(temp_actors, zpl_heap()); - + plr = camera_get().ent_id; Position const *p1 = ecs_get(world_ecs(), plr, Position); - + mime = entity_spawn(EKIND_MACRO_BOT); Position *pos = ecs_get_mut(world_ecs(), mime, Position); *pos = *p1; - + ecs_set(world_ecs(), mime, Input, {0}); ecs_set(world_ecs(), mime, Inventory, {0}); - + camera_set_follow(mime); SetTargetFPS(60); } @@ -182,10 +179,10 @@ void ActSpawnBelt(void); void debug_replay_update(void) { if (!is_playing) return; if (playback_time >= get_cached_time()) return; - + replay_record *r = &records[record_pos]; playback_time = get_cached_time() + r->delay; - + switch (r->kind) { case RPKIND_KEY: { Input *i = ecs_get_mut(world_ecs(), mime, Input); @@ -209,11 +206,11 @@ void debug_replay_update(void) { }break; case RPKIND_SPAWN_CAR: { ecs_entity_t e = vehicle_spawn(EVEH_CAR); - + Position const *origin = ecs_get(world_ecs(), mime, Position); Position *dest = ecs_get_mut(world_ecs(), e, Position); *dest = *origin; - + zpl_array_append(temp_actors, e); }break; case RPKIND_PLACE_ICE_RINK: { @@ -225,22 +222,13 @@ void debug_replay_update(void) { case RPKIND_PLACE_ERASE_CHANGES:{ ActEraseWorldChanges(); }break; - case RPKIND_SPAWN_ICEMAKER_ITEM:{ - ActSpawnCoal(); - }break; - case RPKIND_SPAWN_CHEST:{ - ActSpawnChest(); - }break; - case RPKIND_SPAWN_BELT:{ - ActSpawnBelt(); - }break; default: { ZPL_PANIC("unreachable"); }break; } - + record_pos += 1; - + // NOTE(zaklaus): remove our dummy art exhibist if (mime && record_pos == zpl_array_count(records)) { debug_replay_cleanup_ents(); @@ -250,13 +238,13 @@ void debug_replay_update(void) { void debug_replay_record_keystate(pkt_send_keystate state) { if (!is_recording) return; double record_time = get_cached_time(); - + replay_record rec = { .kind = RPKIND_KEY, .pkt = state, .delay = (record_time - last_record_time), }; - + zpl_array_append(records, rec); last_record_time = get_cached_time(); } @@ -265,12 +253,12 @@ void debug_replay_special_action(replay_kind kind) { ZPL_ASSERT(kind != RPKIND_KEY); if (!is_recording || is_playing) return; double record_time = get_cached_time(); - + replay_record rec = { .kind = kind, .delay = (record_time - last_record_time), }; - + zpl_array_append(records, rec); last_record_time = get_cached_time(); } diff --git a/code/foundation/src/debug/debug_ui_actions.c b/code/foundation/src/debug/debug_ui_actions.c index 54e937a..c27433d 100644 --- a/code/foundation/src/debug/debug_ui_actions.c +++ b/code/foundation/src/debug/debug_ui_actions.c @@ -21,92 +21,6 @@ ActSpawnCar(void) { debug_replay_special_action(RPKIND_SPAWN_CAR); } -void -ActSpawnCoal(void) { - ecs_entity_t e = item_spawn(ASSET_COAL, 32); - ecs_entity_t plr = camera_get().ent_id; - - Position const* origin = ecs_get(world_ecs(), plr, Position); - Position * dest = ecs_get_mut(world_ecs(), e, Position); - *dest = *origin; - entity_set_position(e, dest->x, dest->y); - - debug_replay_special_action(RPKIND_SPAWN_ICEMAKER_ITEM); -} - -void -ActSpawnChest(void) { - ecs_entity_t e = item_spawn(ASSET_CHEST, 32); - ecs_entity_t plr = camera_get().ent_id; - - Position const* origin = ecs_get(world_ecs(), plr, Position); - Position * dest = ecs_get_mut(world_ecs(), e, Position); - *dest = *origin; - entity_set_position(e, dest->x, dest->y); - - debug_replay_special_action(RPKIND_SPAWN_CHEST); -} - -void -ActSpawnBelt(void) { - ecs_entity_t e = item_spawn(ASSET_BELT, 32); - ecs_entity_t plr = camera_get().ent_id; - - Position const* origin = ecs_get(world_ecs(), plr, Position); - Position * dest = ecs_get_mut(world_ecs(), e, Position); - *dest = *origin; - entity_set_position(e, dest->x, dest->y); - - debug_replay_special_action(RPKIND_SPAWN_BELT); -} - -void -ActSpawnDurabilityTest(void) { - ecs_entity_t e = item_spawn(ASSET_COAL, 1); - ecs_entity_t plr = camera_get().ent_id; - - Position const* origin = ecs_get(world_ecs(), plr, Position); - Position * dest = ecs_get_mut(world_ecs(), e, Position); - *dest = *origin; - entity_set_position(e, dest->x, dest->y); - - Item *it = ecs_get_mut(world_ecs(), e, Item); - it->durability = (float)(rand() % 100) / 100.0f; -} - -void -ActSpawnFurnace(void) { - ecs_entity_t e = item_spawn(ASSET_FURNACE, 32); - ecs_entity_t plr = camera_get().ent_id; - - Position const* origin = ecs_get(world_ecs(), plr, Position); - Position * dest = ecs_get_mut(world_ecs(), e, Position); - *dest = *origin; - entity_set_position(e, dest->x, dest->y); -} - -void -ActSpawnTallTest(void) { - ecs_entity_t e = item_spawn(ASSET_TEST_TALL, 32); - ecs_entity_t plr = camera_get().ent_id; - - Position const* origin = ecs_get(world_ecs(), plr, Position); - Position * dest = ecs_get_mut(world_ecs(), e, Position); - *dest = *origin; - entity_set_position(e, dest->x, dest->y); -} - -void -ActSpawnDemoHouseItem(void) { - ecs_entity_t e = item_spawn(ASSET_BLUEPRINT, 1); - ecs_entity_t plr = camera_get().ent_id; - - Position const* origin = ecs_get(world_ecs(), plr, Position); - Position * dest = ecs_get_mut(world_ecs(), e, Position); - *dest = *origin; - entity_set_position(e, dest->x, dest->y); -} - void ActSpawnItemPrev(void) { while (true) { diff --git a/code/foundation/src/gen/texgen_fallback.c b/code/foundation/src/gen/texgen_fallback.c index e0c7e99..09c3cdd 100644 --- a/code/foundation/src/gen/texgen_fallback.c +++ b/code/foundation/src/gen/texgen_fallback.c @@ -17,6 +17,11 @@ Texture2D texgen_build_anim_fallback(asset_id id, int64_t counter) { } Texture2D texgen_build_sprite_fallback(asset_id id) { + + if (id > ASSET_BLUEPRINT_BEGIN && id < ASSET_BLUEPRINT_END) { + return LoadTexEco("blueprint"); + } + switch (id) { case ASSET_BLANK: return GenColorEco(WHITE); break; case ASSET_BUILDMODE_HIGHLIGHT: return GenColorEco(WHITE); break; @@ -24,7 +29,6 @@ Texture2D texgen_build_sprite_fallback(asset_id id) { // NOTE(zaklaus): items case ASSET_COAL: return LoadTexEco("coal"); - case ASSET_BLUEPRINT: return LoadTexEco("blueprint"); // NOTE(zaklaus): blocks case ASSET_FENCE: return LoadTexEco("fence"); diff --git a/code/foundation/src/lists/assets_ids.h b/code/foundation/src/lists/assets_ids.h index c0aad36..fe2ed83 100644 --- a/code/foundation/src/lists/assets_ids.h +++ b/code/foundation/src/lists/assets_ids.h @@ -11,7 +11,10 @@ X(ASSET_THING)\ X(ASSET_CHEST)\ X(ASSET_FURNACE)\ + X(ASSET_BLUEPRINT_BEGIN)\ X(ASSET_BLUEPRINT)\ + X(ASSET_BLUEPRINT_DEMO_HOUSE)\ + X(ASSET_BLUEPRINT_END)\ X(ASSET_FENCE)\ X(ASSET_DEV)\ X(ASSET_GROUND)\ @@ -38,7 +41,7 @@ typedef enum { #define X(id) id, _ASSETS #undef X - MAX_ASSETS = 1024, + MAX_ASSETS, } asset_id; extern const char *asset_names[]; diff --git a/code/foundation/src/lists/assets_list.c b/code/foundation/src/lists/assets_list.c index 56bf4d9..3f0d3ff 100644 --- a/code/foundation/src/lists/assets_list.c +++ b/code/foundation/src/lists/assets_list.c @@ -19,6 +19,7 @@ static asset assets[] = { ASSET_TEX(ASSET_CHEST), ASSET_TEX(ASSET_FURNACE), ASSET_TEX(ASSET_BLUEPRINT), + ASSET_TEX(ASSET_BLUEPRINT_DEMO_HOUSE), // NOTE(zaklaus): blocks ASSET_TEX(ASSET_FENCE), diff --git a/code/foundation/src/lists/items_list.c b/code/foundation/src/lists/items_list.c index 0dd0c3a..b864ef6 100644 --- a/code/foundation/src/lists/items_list.c +++ b/code/foundation/src/lists/items_list.c @@ -11,7 +11,7 @@ static item_desc items[] = { ITEM_SELF(ASSET_TEST_TALL, 64), // ITEM_BLUEPRINT(ASSET_BLUEPRINT, 1, 4, 4, "]]]]]CF] ]]]]]"), - ITEM_BLUEPRINT(ASSET_BLUEPRINT, 1, 4, 4, PROT({ ASSET_WOOD,ASSET_WOOD,ASSET_WOOD,ASSET_WOOD, + ITEM_BLUEPRINT_PROXY(ASSET_BLUEPRINT_DEMO_HOUSE, ASSET_BLUEPRINT, 1, 4, 4, PROT({ ASSET_WOOD,ASSET_WOOD,ASSET_WOOD,ASSET_WOOD, ASSET_WOOD,ASSET_FURNACE,ASSET_CHEST,ASSET_WOOD, ASSET_FENCE,ASSET_EMPTY,ASSET_EMPTY,ASSET_WOOD, ASSET_WALL,ASSET_EMPTY,ASSET_EMPTY,ASSET_WOOD})), diff --git a/code/foundation/src/lists/items_list_helpers.h b/code/foundation/src/lists/items_list_helpers.h index 40719ce..03577dc 100644 --- a/code/foundation/src/lists/items_list_helpers.h +++ b/code/foundation/src/lists/items_list_helpers.h @@ -39,6 +39,23 @@ __VA_ARGS__\ __VA_ARGS__\ } +#define ITEM_BLUEPRINT_PROXY(asset, place_asset, qty, w_, h_, plan_, ...)\ +{\ +.kind = asset,\ +.usage = UKIND_PLACE_ITEM_DATA,\ +.attachment = UDATA_NONE,\ +.max_quantity = qty,\ +.blueprint = {\ +.w = w_,\ +.h = h_,\ +.plan = (const asset_id[])plan_\ +},\ +.place_item = {\ +.id = place_asset\ +},\ +__VA_ARGS__\ +} + #define ITEM_INGREDIENT(asset, qty, _producer, _product, _additional, ...)\ {\ .kind = asset,\ diff --git a/code/foundation/src/models/assets.c b/code/foundation/src/models/assets.c index 75d4f71..aeff721 100644 --- a/code/foundation/src/models/assets.c +++ b/code/foundation/src/models/assets.c @@ -7,12 +7,12 @@ typedef struct { asset_id id; asset_kind kind; - + union { Texture2D tex; Sound snd; }; - + // NOTE(zaklaus): metadata } asset; @@ -28,20 +28,20 @@ static double assets_frame_next_draw = 0.0; int32_t assets_setup(void) { for (uint32_t i=0; ikind) { case AKIND_TEXTURE: { b->tex = texgen_build_sprite(b->id); }break; - + case AKIND_ANIM: { b->tex = texgen_build_anim(b->id, 0); }break; - + case AKIND_SOUND: { // TODO(zaklaus): soundgen }break; - + default: break; } } @@ -53,21 +53,21 @@ int32_t assets_frame(void) { if (assets_frame_next_draw < get_cached_time()) { for (uint32_t i=0; ikind) { case AKIND_ANIM: { UnloadTexture(b->tex); b->tex = texgen_build_anim(b->id, assets_frame_counter); }break; - + default: break; } } - + assets_frame_next_draw = get_cached_time() + ASSET_FRAME_RENDER_MS; assets_frame_counter += ASSET_FRAME_SKIP; } - + return 0; } @@ -78,11 +78,11 @@ void assets_destroy(void) { case AKIND_TEXTURE: { UnloadTexture(assets[i].tex); }break; - + case AKIND_SOUND: { // TODO(zaklaus): soundgen }break; - + default: break; } } @@ -93,7 +93,7 @@ uint16_t assets_find(asset_id id) { if (assets[i].id == id) return i; } - + ZPL_PANIC("Unknown asset id: %d\n", id); return ASSET_INVALID; } diff --git a/code/foundation/src/models/assets.h b/code/foundation/src/models/assets.h index 63aba06..75629c1 100644 --- a/code/foundation/src/models/assets.h +++ b/code/foundation/src/models/assets.h @@ -20,6 +20,7 @@ uint16_t assets_find(asset_id id); asset_kind assets_get_kind(uint16_t id); void *assets_get_snd(uint16_t id); void *assets_get_tex(uint16_t id); +uint16_t assets_resolve_proxy(uint16_t id); // NOTE(zaklaus): client only #define ASSET_SRC_RECT() ((Rectangle){0, 0, 64, 64})