shared prefabs list

This commit is contained in:
jacob 2026-02-05 17:32:09 -06:00
parent 4dbaa19024
commit 1c81be6a59
5 changed files with 90 additions and 40 deletions

View File

@ -307,7 +307,7 @@ Enum(P_MsgKind)
P_MsgKind_SaveWorld, P_MsgKind_SaveWorld,
P_MsgKind_ResetWorld, P_MsgKind_ResetWorld,
P_MsgKind_TileEdit, P_MsgKind_TileEdit,
P_MsgKind_EntEdit, P_MsgKind_Prefab,
P_MsgKind_Delete, P_MsgKind_Delete,
// Server -> Client // Server -> Client
@ -322,13 +322,14 @@ Struct(P_Msg)
b32 affect_dummies; b32 affect_dummies;
P_PrefabKind prefab;
P_Key key;
Xform xf;
P_TileKind tile_kind; P_TileKind tile_kind;
Rng2I32 tile_range; Rng2I32 tile_range;
u64 tiles_hash; u64 tiles_hash;
P_Key key;
Xform xf;
String data; String data;
}; };

View File

@ -25,3 +25,23 @@ i32 P_TileIdxFromTilePos(Vec2 p)
return result; return result;
} }
#endif #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

View File

@ -28,6 +28,24 @@ Enum(P_TileKind)
P_TileKind_COUNT 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 //~ Tile helpers
@ -36,3 +54,10 @@ i32 P_TileIdxFromTilePos(Vec2 p);
#if IsLanguageC #if IsLanguageC
String P_TileNameFromKind(P_TileKind kind); String P_TileNameFromKind(P_TileKind kind);
#endif #endif
////////////////////////////////////////////////////////////
//~ Prefab helpers
#if IsLanguageC
String P_PrefabNameFromKind(P_PrefabKind kind);
#endif

View File

@ -577,47 +577,48 @@ void S_TickForever(WaveLaneCtx *lane)
} }
} }
} break; } break;
//- Edit entity //- Prefab
case P_MsgKind_EntEdit: case P_MsgKind_Prefab:
{ {
String name = msg->data;
P_EntList ents = Zi; P_EntList ents = Zi;
// TODO: Enumerated prefabs String name = msg->data;
if (0) P_PrefabKind prefab = msg->prefab;
switch (prefab)
{ {
} case P_PrefabKind_Guy:
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))
{ {
dummy = P_PushTempEnt(frame_arena, &ents); P_Ent *guy = P_PushTempEnt(frame_arena, &ents);
dummy->key = msg->key; guy->key = msg->key;
dummy->is_player = 1; guy->xf = msg->xf;
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();
guy->is_guy = 1; guy->is_guy = 1;
guy->has_weapon = 1; guy->has_weapon = 1;
guy->exists = 1; guy->exists = 1;
dummy->guy = guy->key; } break;
}
guy->xf = msg->xf; 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); P_SpawnEntsFromList(world_frame, ents);
} break; } break;

View File

@ -4433,7 +4433,8 @@ void V_TickForever(WaveLaneCtx *lane)
} }
// Spawn player guy // 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->key = local_guy->key;
msg->xf.t = guy_pos; msg->xf.t = guy_pos;
} }
@ -4442,9 +4443,11 @@ void V_TickForever(WaveLaneCtx *lane)
case V_CmdKind_spawn_tp_dummy: case V_CmdKind_spawn_tp_dummy:
case V_CmdKind_spawn_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->key = P_RandKey();
msg->xf.t = frame->world_cursor; msg->xf.t = frame->world_cursor;
msg->data = Lit("Dummy");
if (kind == V_CmdKind_spawn_tp_dummy) if (kind == V_CmdKind_spawn_tp_dummy)
{ {
for (P_Ent *ent = P_FirstEnt(local_frame); !P_IsEntNil(ent); ent = P_NextEnt(ent)) for (P_Ent *ent = P_FirstEnt(local_frame); !P_IsEntNil(ent); ent = P_NextEnt(ent))