Initial commit: Theriapolis baseline at port/godot branch point
Captures the pre-Godot-port state of the codebase. This is the rollback anchor for the Godot port (M0 of theriapolis-rpg-implementation-plan-godot-port.md). All Phase 0 through Phase 6.5 work is included; Phase 7 is in flight. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
namespace Theriapolis.Core.World;
|
||||
|
||||
public enum FactionId : byte
|
||||
{
|
||||
CovenantEnforcers = 0,
|
||||
Inheritors = 1,
|
||||
ThornCouncil = 2,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Per-tile influence map for the three primary factions.
|
||||
/// Influence[factionIndex, x, y] ∈ [0, 1].
|
||||
/// </summary>
|
||||
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));
|
||||
}
|
||||
|
||||
/// <summary>Returns the index of the faction with highest influence at this tile, or -1 if all zero.</summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user