diff --git a/src/pp/pp.h b/src/pp/pp.h index a01bbf67..9a01a344 100644 --- a/src/pp/pp.h +++ b/src/pp/pp.h @@ -307,7 +307,7 @@ Enum(P_MsgKind) P_MsgKind_SaveWorld, P_MsgKind_ResetWorld, P_MsgKind_TileEdit, - P_MsgKind_EntEdit, + P_MsgKind_Prefab, P_MsgKind_Delete, // Server -> Client @@ -322,13 +322,14 @@ Struct(P_Msg) b32 affect_dummies; + P_PrefabKind prefab; + P_Key key; + Xform xf; + P_TileKind tile_kind; Rng2I32 tile_range; u64 tiles_hash; - P_Key key; - Xform xf; - String data; }; diff --git a/src/pp/pp_shared.cg b/src/pp/pp_shared.cg index 243dfebb..c3c143dc 100644 --- a/src/pp/pp_shared.cg +++ b/src/pp/pp_shared.cg @@ -25,3 +25,23 @@ i32 P_TileIdxFromTilePos(Vec2 p) return result; } #endif + +//////////////////////////////////////////////////////////// +//~ Prefab helpers + +#if IsLanguageC + String P_PrefabNameFromKind(P_PrefabKind kind) + { + PERSIST Readonly String prefab_names[P_PrefabKind_COUNT] = { + #define X(name, ...) [P_PrefabKind_##name] = CompLit(#name), + P_PrefabsXList(X) + #undef X + }; + String result = Zi; + if (kind >= 0 && kind < countof(prefab_names)) + { + result = prefab_names[kind]; + } + return result; + } +#endif diff --git a/src/pp/pp_shared.cgh b/src/pp/pp_shared.cgh index aef37cb7..8d09f9a7 100644 --- a/src/pp/pp_shared.cgh +++ b/src/pp/pp_shared.cgh @@ -28,6 +28,24 @@ Enum(P_TileKind) P_TileKind_COUNT }; +//////////////////////////////////////////////////////////// +//~ Prefab types + +#define P_PrefabsXList(X) \ + X(Guy) \ + X(Dummy) \ + X(SpawnPoint) \ +/* --------------------- */ + +//- Prefab kinds enum +Enum(P_PrefabKind) +{ + #define X(name, ...) P_PrefabKind_##name, + P_PrefabsXList(X) + #undef X + P_PrefabKind_COUNT +}; + //////////////////////////////////////////////////////////// //~ Tile helpers @@ -36,3 +54,10 @@ i32 P_TileIdxFromTilePos(Vec2 p); #if IsLanguageC String P_TileNameFromKind(P_TileKind kind); #endif + +//////////////////////////////////////////////////////////// +//~ Prefab helpers + +#if IsLanguageC + String P_PrefabNameFromKind(P_PrefabKind kind); +#endif diff --git a/src/pp/pp_sim/pp_sim_core.c b/src/pp/pp_sim/pp_sim_core.c index 86f92370..780ef9b0 100644 --- a/src/pp/pp_sim/pp_sim_core.c +++ b/src/pp/pp_sim/pp_sim_core.c @@ -577,47 +577,48 @@ void S_TickForever(WaveLaneCtx *lane) } } } break; - //- Edit entity - case P_MsgKind_EntEdit: + //- Prefab + case P_MsgKind_Prefab: { - String name = msg->data; P_EntList ents = Zi; - // TODO: Enumerated prefabs - if (0) + String name = msg->data; + P_PrefabKind prefab = msg->prefab; + switch (prefab) { - } - else if (MatchString(name, Lit("guy"))) - { - P_Ent *guy = P_PushTempEnt(frame_arena, &ents); - guy->key = msg->key; - guy->xf = msg->xf; - guy->is_guy = 1; - guy->has_weapon = 1; - guy->exists = 1; - } - else if (MatchString(name, Lit("dummy"))) - { - P_Ent *dummy = P_EntFromKey(world_frame, msg->key); - if (P_IsEntNil(dummy)) + case P_PrefabKind_Guy: { - dummy = P_PushTempEnt(frame_arena, &ents); - dummy->key = msg->key; - dummy->is_player = 1; - dummy->is_dummy = 1; - dummy->exists = 1; - P_SetEntString(dummy, Lit("Dummy")); - } - P_Ent *guy = P_EntFromKey(world_frame, dummy->guy); - if (P_IsEntNil(guy)) - { - guy = P_PushTempEnt(frame_arena, &ents); - guy->key = P_RandKey(); + P_Ent *guy = P_PushTempEnt(frame_arena, &ents); + guy->key = msg->key; + guy->xf = msg->xf; guy->is_guy = 1; guy->has_weapon = 1; guy->exists = 1; - dummy->guy = guy->key; - } - guy->xf = msg->xf; + } break; + + case P_PrefabKind_Dummy: + { + P_Ent *dummy = P_EntFromKey(world_frame, msg->key); + if (P_IsEntNil(dummy)) + { + dummy = P_PushTempEnt(frame_arena, &ents); + dummy->key = msg->key; + dummy->is_player = 1; + dummy->is_dummy = 1; + dummy->exists = 1; + P_SetEntString(dummy, name); + } + P_Ent *guy = P_EntFromKey(world_frame, dummy->guy); + if (P_IsEntNil(guy)) + { + guy = P_PushTempEnt(frame_arena, &ents); + guy->key = P_RandKey(); + guy->is_guy = 1; + guy->has_weapon = 1; + guy->exists = 1; + dummy->guy = guy->key; + } + guy->xf = msg->xf; + } break; } P_SpawnEntsFromList(world_frame, ents); } break; diff --git a/src/pp/pp_vis/pp_vis_core.c b/src/pp/pp_vis/pp_vis_core.c index 9212e516..ee19026d 100644 --- a/src/pp/pp_vis/pp_vis_core.c +++ b/src/pp/pp_vis/pp_vis_core.c @@ -4433,7 +4433,8 @@ void V_TickForever(WaveLaneCtx *lane) } // Spawn player guy { - P_Msg *msg = P_PushMsg(P_MsgKind_EntEdit, Lit("guy")); + P_Msg *msg = P_PushMsg(P_MsgKind_Prefab, Zstr); + msg->prefab = P_PrefabKind_Guy; msg->key = local_guy->key; msg->xf.t = guy_pos; } @@ -4442,9 +4443,11 @@ void V_TickForever(WaveLaneCtx *lane) case V_CmdKind_spawn_tp_dummy: case V_CmdKind_spawn_dummy: { - P_Msg *msg = P_PushMsg(P_MsgKind_EntEdit, Lit("dummy")); + P_Msg *msg = P_PushMsg(P_MsgKind_Prefab, Zstr); + msg->prefab = P_PrefabKind_Dummy; msg->key = P_RandKey(); msg->xf.t = frame->world_cursor; + msg->data = Lit("Dummy"); if (kind == V_CmdKind_spawn_tp_dummy) { for (P_Ent *ent = P_FirstEnt(local_frame); !P_IsEntNil(ent); ent = P_NextEnt(ent))