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_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;
};

View File

@ -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

View File

@ -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

View File

@ -577,16 +577,15 @@ 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")))
case P_PrefabKind_Guy:
{
P_Ent *guy = P_PushTempEnt(frame_arena, &ents);
guy->key = msg->key;
@ -594,8 +593,9 @@ void S_TickForever(WaveLaneCtx *lane)
guy->is_guy = 1;
guy->has_weapon = 1;
guy->exists = 1;
}
else if (MatchString(name, Lit("dummy")))
} break;
case P_PrefabKind_Dummy:
{
P_Ent *dummy = P_EntFromKey(world_frame, msg->key);
if (P_IsEntNil(dummy))
@ -605,7 +605,7 @@ void S_TickForever(WaveLaneCtx *lane)
dummy->is_player = 1;
dummy->is_dummy = 1;
dummy->exists = 1;
P_SetEntString(dummy, Lit("Dummy"));
P_SetEntString(dummy, name);
}
P_Ent *guy = P_EntFromKey(world_frame, dummy->guy);
if (P_IsEntNil(guy))
@ -618,6 +618,7 @@ void S_TickForever(WaveLaneCtx *lane)
dummy->guy = guy->key;
}
guy->xf = msg->xf;
} break;
}
P_SpawnEntsFromList(world_frame, ents);
} break;

View File

@ -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))