Files

73 lines
3.1 KiB
C#
Raw Permalink Normal View History

namespace Theriapolis.Core.World;
public enum NarrativeAnchor : byte
{
Millhaven, Thornfield, FortDustwall, TheTangles,
SanctumFidelis, Heartstone
}
public enum SettlementEconomy : byte
{
Farming, Mining, Manufacturing, Trade, Military, Fishing
}
public enum SettlementGovernance : byte
{
Council, Mayor, MilitaryCommandant, ClanElder, Corporate, Anarchic
}
public enum PoiType : byte
{
None, ImperiumRuin, AbandonedMine, CultDen, NaturalCave, OvergrownSettlement
}
/// <summary>
/// A placed settlement or point of interest on the world map.
/// Tier 14 are inhabited settlements; Tier 5 are PoIs (IsPoi == true).
/// </summary>
public sealed class Settlement
{
public int Id { get; init; }
public string Name { get; set; } = "";
public int Tier { get; init; }
public int TileX { get; init; }
public int TileY { get; init; }
/// <summary>World-pixel X (tile center).</summary>
public float WorldPixelX => TileX * C.WORLD_TILE_PIXELS + C.WORLD_TILE_PIXELS * 0.5f;
/// <summary>World-pixel Y (tile center).</summary>
public float WorldPixelY => TileY * C.WORLD_TILE_PIXELS + C.WORLD_TILE_PIXELS * 0.5f;
/// <summary>Narrative anchor this settlement fulfills, or null for non-anchors.</summary>
public NarrativeAnchor? Anchor { get; init; }
// ── Generated attributes (set by SettlementAttributesStage) ─────────────
public SettlementEconomy Economy { get; set; }
public SettlementGovernance Governance { get; set; }
public string[] CladeRatios { get; set; } = Array.Empty<string>();
public float WealthLevel { get; set; }
public int Population { get; set; }
public float HybridPct { get; set; }
public string ScentProfile { get; set; } = "";
// ── Derived after infrastructure gen ────────────────────────────────────
public bool HasRailStation { get; set; }
public bool IsOnRiver { get; set; }
// ── PoI-specific ─────────────────────────────────────────────────────────
public bool IsPoi { get; init; }
public PoiType PoiType { get; set; }
// ── Phase 6 M0 — building footprints ────────────────────────────────────
/// <summary>
/// Buildings stamped inside this settlement, derived deterministically
/// from the matched <see cref="Data.SettlementLayoutDef"/>. Populated
/// lazily by <see cref="Settlements.SettlementStamper"/> on first chunk
/// generation that touches this settlement; identical across reloads.
/// </summary>
public List<Settlements.BuildingFootprint> Buildings { get; } = new();
/// <summary>True once <see cref="Buildings"/> has been resolved.</summary>
public bool BuildingsResolved { get; set; }
}