/ GUNRPG.ClientModels / MissionModels.cs
MissionModels.cs
 1  namespace GUNRPG.ClientModels;
 2  
 3  /// <summary>
 4  /// Combat session state returned from GET /sessions/{id}/state.
 5  /// Phase comes from SessionPhase.ToString(): "Created", "Planning", "Resolving", "Completed".
 6  /// </summary>
 7  public sealed class CombatSession
 8  {
 9      public Guid Id { get; init; }
10      public Guid OperatorId { get; init; }
11      public string Phase { get; init; } = string.Empty;
12      public long CurrentTimeMs { get; init; }
13      public PlayerState Player { get; init; } = new();
14      public PlayerState Enemy { get; init; } = new();
15      public PetState Pet { get; init; } = new();
16      public int EnemyLevel { get; init; }
17      public int TurnNumber { get; init; }
18      public List<BattleLogEntry> BattleLog { get; init; } = new();
19  
20      /// <summary>True when the server is waiting for player intents (SessionPhase.Planning).</summary>
21      public bool IsAwaitingIntents => Phase == "Planning";
22  
23      /// <summary>True when the combat session has fully resolved (SessionPhase.Completed).</summary>
24      public bool IsConcluded => Phase == "Completed";
25  
26      /// <summary>Victory is determined from state once the session has concluded.</summary>
27      public bool IsVictory => IsConcluded && Player.IsAlive && !Enemy.IsAlive;
28  }
29  
30  /// <summary>
31  /// Player or enemy state within a combat session.
32  /// </summary>
33  public sealed class PlayerState
34  {
35      public Guid Id { get; init; }
36      public string Name { get; init; } = string.Empty;
37      public float Health { get; init; }
38      public float MaxHealth { get; init; }
39      public float Stamina { get; init; }
40      public float Fatigue { get; init; }
41      public float SuppressionLevel { get; init; }
42      public bool IsSuppressed { get; init; }
43      public float DistanceToOpponent { get; init; }
44      public int CurrentAmmo { get; init; }
45      public int? MagazineSize { get; init; }
46      public string AimState { get; init; } = string.Empty;
47      public string MovementState { get; init; } = string.Empty;
48      public string CurrentMovement { get; init; } = string.Empty;
49      public string CurrentDirection { get; init; } = string.Empty;
50      public string CurrentCover { get; init; } = string.Empty;
51      public bool IsMoving { get; init; }
52      public bool IsAlive { get; init; }
53  }
54  
55  /// <summary>
56  /// Pet state, used both within combat sessions and operator state.
57  /// </summary>
58  public sealed class PetState
59  {
60      public float Health { get; init; }
61      public float Fatigue { get; init; }
62      public float Injury { get; init; }
63      public float Stress { get; init; }
64      public float Morale { get; init; }
65      public float Hunger { get; init; }
66      public float Hydration { get; init; }
67      public DateTimeOffset LastUpdated { get; init; }
68  }
69  
70  /// <summary>
71  /// A single battle log entry within a combat session.
72  /// </summary>
73  public sealed class BattleLogEntry
74  {
75      public string EventType { get; init; } = string.Empty;
76      public long TimeMs { get; init; }
77      public string Message { get; init; } = string.Empty;
78      public string? ActorName { get; init; }
79  }