namespace Theriapolis.Core.World; public enum FactionId : byte { CovenantEnforcers = 0, Inheritors = 1, ThornCouncil = 2, } /// /// Per-tile influence map for the three primary factions. /// Influence[factionIndex, x, y] ∈ [0, 1]. /// public sealed class FactionInfluenceMap { public const int FactionCount = 3; // Flat array: [faction * W * H + y * W + x] private readonly float[] _data; private const int W = C.WORLD_WIDTH_TILES; private const int H = C.WORLD_HEIGHT_TILES; public FactionInfluenceMap() { _data = new float[FactionCount * W * H]; } public float Get(int faction, int x, int y) => _data[faction * W * H + y * W + x]; public void Set(int faction, int x, int y, float value) => _data[faction * W * H + y * W + x] = value; public void Add(int faction, int x, int y, float delta) { int idx = faction * W * H + y * W + x; _data[idx] = Math.Max(0f, Math.Min(1f, _data[idx] + delta)); } /// Returns the index of the faction with highest influence at this tile, or -1 if all zero. public int DominantFaction(int x, int y) { float best = 0f; int idx = -1; for (int f = 0; f < FactionCount; f++) { float v = Get(f, x, y); if (v > best) { best = v; idx = f; } } return idx; } }