using Unity.Entities;
using Unity.Mathematics;
namespace ProjectM.Simulation
{
///
/// Identifies which world REGION an entity belongs to. M6 splits the single server world into two
/// spatial regions at a large coordinate offset — the persistent home and
/// the procedurally-arranged — and uses per-connection GhostRelevancy
/// to replicate each region only to the connections whose player is currently in it. Server-side only
/// (NOT a [GhostField]; the server makes all relevancy decisions). Added to players on spawn and to
/// every region-scoped ghost the server spawns. Untagged ghosts are global (relevant to everyone).
///
public struct RegionTag : IComponentData
{
/// Region id (see ): 0 = base, 1 = expedition.
public byte Region;
}
/// Region ids for (a byte, not an enum, to keep server/Burst code trivial).
public static class RegionId
{
/// The persistent, shared home base.
public const byte Base = 0;
/// The procedural expedition field (offset far from the base on +X).
public const byte Expedition = 1;
}
///
/// Deterministic mapping of a region id to its world-space origin. The base region keeps the existing
/// home-base coordinates; the expedition region lives at a large +X offset so the two never overlap in
/// the single shared PhysicsWorld. Pure (no RNG/wall-clock) — server-authoritative teleports and field
/// spawners resolve region positions through here.
///
public static class RegionMath
{
/// World-space X offset of the expedition region from the base region.
public const float ExpeditionOffsetX = 1000f;
/// World-space origin of , given the base center (BaseGridMath.PlotCenter).
public static float3 RegionOrigin(byte region, float3 baseCenter)
{
return region == RegionId.Expedition
? baseCenter + new float3(ExpeditionOffsetX, 0f, 0f)
: baseCenter;
}
}
}