Files
TheriapolisV3/Theriapolis.Core/Persistence/EncounterState.cs
T
Christopher Wiebe b451f83174 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>
2026-04-30 20:40:51 -07:00

58 lines
2.5 KiB
C#

namespace Theriapolis.Core.Persistence;
/// <summary>
/// Mid-encounter snapshot. Present in <see cref="SaveBody"/> only when the
/// player saved during combat. On load, the live PlayScreen re-creates a
/// <see cref="Rules.Combat.Encounter"/> with the same participants and
/// calls <c>ResumeRolls(RollCount)</c> so the dice stream continues from
/// the same sequence point — see Phase 5 plan §5.
/// </summary>
public sealed class EncounterState
{
public ulong EncounterId { get; set; }
public int RollCount { get; set; }
public int CurrentTurnIndex { get; set; }
public int RoundNumber { get; set; }
public int[] InitiativeOrder { get; set; } = System.Array.Empty<int>();
public CombatantSnapshot[] Combatants { get; set; } = System.Array.Empty<CombatantSnapshot>();
}
/// <summary>One combatant in the saved encounter.</summary>
public sealed class CombatantSnapshot
{
public int Id { get; set; }
/// <summary>Display name (used to verify the same combatant on resume).</summary>
public string Name { get; set; } = "";
/// <summary>True if this combatant is the player. False = NPC.</summary>
public bool IsPlayer { get; set; }
/// <summary>For NPC combatants: the chunk + spawn index that produced them, used to find the live <c>NpcActor</c> on resume.</summary>
public int? NpcChunkX { get; set; }
public int? NpcChunkY { get; set; }
public int? NpcSpawnIndex { get; set; }
/// <summary>For NPC combatants: the template id (used as fallback identity if chunk lookup fails).</summary>
public string NpcTemplateId { get; set; } = "";
public int CurrentHp { get; set; }
public float PositionX { get; set; }
public float PositionY { get; set; }
/// <summary>Active conditions as enum byte values.</summary>
public byte[] Conditions { get; set; } = System.Array.Empty<byte>();
}
/// <summary>
/// Per-chunk roster delta — which spawn indices have been killed (or
/// otherwise consumed). Layered on top of the chunk's deterministic spawn
/// list so reloading a chunk doesn't resurrect dead enemies.
/// </summary>
public sealed class NpcRosterState
{
public List<NpcChunkDelta> ChunkDeltas { get; set; } = new();
}
public sealed class NpcChunkDelta
{
public int ChunkX { get; set; }
public int ChunkY { get; set; }
/// <summary>Spawn-list indices in this chunk whose NPC has died.</summary>
public int[] KilledSpawnIndices { get; set; } = System.Array.Empty<int>();
}