GeoSus
This commit is contained in:
@@ -49,6 +49,11 @@ public enum PlayerRole { Crew, Impostor }
|
||||
public enum PlayerState { Alive, Dead }
|
||||
|
||||
[JsonConverter(typeof(StringEnumConverter))]
|
||||
// NOTE: `Voting` is reserved-but-unused on the wire as of 2026. The server
|
||||
// keeps the entire vote cycle inside `Meeting` and uses MeetingStartedPayload
|
||||
// timestamps (DiscussionEndTime / VotingEndTime) to distinguish sub-phases.
|
||||
// The enum value is preserved here for serialization compatibility with old
|
||||
// saves; new code should not assign it.
|
||||
public enum GamePhase { Lobby, Loading, Playing, Meeting, Voting, Ended }
|
||||
|
||||
[JsonConverter(typeof(StringEnumConverter))]
|
||||
@@ -184,6 +189,14 @@ public class CreateLobby : Message
|
||||
|
||||
[JsonProperty("taskCount")]
|
||||
public int TaskCount { get; set; } = 5;
|
||||
|
||||
/// <summary>
|
||||
/// P13b: optional per-lobby settings overrides supplied by the host.
|
||||
/// Any field left null falls through to the server's current default
|
||||
/// (snapshotted at lobby creation, immutable thereafter for this lobby).
|
||||
/// </summary>
|
||||
[JsonProperty("settings")]
|
||||
public GameSettingsOverrides? Settings { get; set; }
|
||||
}
|
||||
|
||||
public class CreateLobbyResponse : Message
|
||||
@@ -623,17 +636,26 @@ public class PlayerEjectedPayload
|
||||
public PlayerRole Role { get; set; }
|
||||
}
|
||||
|
||||
public class TaskStartedPayload
|
||||
{
|
||||
[JsonProperty("clientUuid")]
|
||||
public string ClientUuid { get; set; } = "";
|
||||
|
||||
[JsonProperty("taskId")]
|
||||
public string TaskId { get; set; } = "";
|
||||
}
|
||||
|
||||
public class TaskCompletedPayload
|
||||
{
|
||||
[JsonProperty("clientUuid")]
|
||||
public string ClientUuid { get; set; } = "";
|
||||
|
||||
|
||||
[JsonProperty("taskId")]
|
||||
public string TaskId { get; set; } = "";
|
||||
|
||||
|
||||
[JsonProperty("totalCompleted")]
|
||||
public int TotalCompleted { get; set; }
|
||||
|
||||
|
||||
[JsonProperty("totalTasks")]
|
||||
public int TotalTasks { get; set; }
|
||||
}
|
||||
@@ -713,10 +735,10 @@ public class RepairStartedPayload
|
||||
{
|
||||
[JsonProperty("sabotageId")]
|
||||
public string SabotageId { get; set; } = "";
|
||||
|
||||
|
||||
[JsonProperty("stationId")]
|
||||
public string StationId { get; set; } = "";
|
||||
|
||||
|
||||
[JsonProperty("playerId")]
|
||||
public string PlayerId { get; set; } = "";
|
||||
}
|
||||
@@ -725,10 +747,10 @@ public class RepairStoppedPayload
|
||||
{
|
||||
[JsonProperty("sabotageId")]
|
||||
public string SabotageId { get; set; } = "";
|
||||
|
||||
|
||||
[JsonProperty("stationId")]
|
||||
public string StationId { get; set; } = "";
|
||||
|
||||
|
||||
[JsonProperty("playerId")]
|
||||
public string PlayerId { get; set; } = "";
|
||||
}
|
||||
@@ -790,6 +812,162 @@ public class LobbyState
|
||||
/// <summary>True if map data has been loaded (or Overpass is disabled)</summary>
|
||||
[JsonProperty("mapDataReady")]
|
||||
public bool MapDataReady { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// P13b: full per-lobby settings snapshot. Clients use this for HUD
|
||||
/// (button visibility, countdown timings, etc.) instead of hardcoded
|
||||
/// values. Always populated for new server builds; old client builds
|
||||
/// can ignore the field.
|
||||
/// </summary>
|
||||
[JsonProperty("settings")]
|
||||
public GameSettings? Settings { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// P13b: per-lobby gameplay settings on the wire. Server populates this from
|
||||
/// its per-lobby snapshot so clients can drive HUD logic from authoritative
|
||||
/// values rather than hardcoded constants.
|
||||
/// </summary>
|
||||
public class GameSettings
|
||||
{
|
||||
// Round shape
|
||||
[JsonProperty("maxPlayers")]
|
||||
public int MaxPlayers { get; set; }
|
||||
|
||||
[JsonProperty("impostorCount")]
|
||||
public int ImpostorCount { get; set; }
|
||||
|
||||
[JsonProperty("taskCount")]
|
||||
public int TaskCount { get; set; }
|
||||
|
||||
[JsonProperty("tiePolicy")]
|
||||
public string TiePolicy { get; set; } = "NoEject";
|
||||
|
||||
// Distances (m)
|
||||
[JsonProperty("killDistanceM")]
|
||||
public double KillDistanceM { get; set; }
|
||||
|
||||
[JsonProperty("reportDistanceM")]
|
||||
public double ReportDistanceM { get; set; }
|
||||
|
||||
[JsonProperty("taskStartDistanceM")]
|
||||
public double TaskStartDistanceM { get; set; }
|
||||
|
||||
[JsonProperty("meetingArrivalRadiusM")]
|
||||
public double MeetingArrivalRadiusM { get; set; }
|
||||
|
||||
[JsonProperty("emergencyMeetingCallRadiusM")]
|
||||
public double EmergencyMeetingCallRadiusM { get; set; }
|
||||
|
||||
[JsonProperty("repairStationDistanceM")]
|
||||
public double RepairStationDistanceM { get; set; }
|
||||
|
||||
// Cooldowns / counts
|
||||
[JsonProperty("killCooldownMs")]
|
||||
public int KillCooldownMs { get; set; }
|
||||
|
||||
[JsonProperty("emergencyMeetingCooldownMs")]
|
||||
public int EmergencyMeetingCooldownMs { get; set; }
|
||||
|
||||
[JsonProperty("maxEmergencyMeetingsPerPlayer")]
|
||||
public int MaxEmergencyMeetingsPerPlayer { get; set; }
|
||||
|
||||
// Meeting phases (ms)
|
||||
[JsonProperty("arrivalBaseMs")]
|
||||
public int ArrivalBaseMs { get; set; }
|
||||
|
||||
[JsonProperty("allowedLateMs")]
|
||||
public int AllowedLateMs { get; set; }
|
||||
|
||||
[JsonProperty("discussionPhaseMs")]
|
||||
public int DiscussionPhaseMs { get; set; }
|
||||
|
||||
[JsonProperty("votingPhaseMs")]
|
||||
public int VotingPhaseMs { get; set; }
|
||||
|
||||
// Sabotage
|
||||
[JsonProperty("sabotageCooldownMs")]
|
||||
public int SabotageCooldownMs { get; set; }
|
||||
|
||||
[JsonProperty("commsBlackoutDurationMs")]
|
||||
public int CommsBlackoutDurationMs { get; set; }
|
||||
|
||||
[JsonProperty("criticalMeltdownDeadlineMs")]
|
||||
public int CriticalMeltdownDeadlineMs { get; set; }
|
||||
|
||||
[JsonProperty("repairStationHoldMs")]
|
||||
public int RepairStationHoldMs { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// P13b: host-supplied overrides at CreateLobby. Every field is nullable so
|
||||
/// the host can opt into changing only what they care about; null = use the
|
||||
/// server's current default at the moment of lobby creation.
|
||||
/// </summary>
|
||||
public class GameSettingsOverrides
|
||||
{
|
||||
[JsonProperty("maxPlayers")]
|
||||
public int? MaxPlayers { get; set; }
|
||||
|
||||
[JsonProperty("impostorCount")]
|
||||
public int? ImpostorCount { get; set; }
|
||||
|
||||
[JsonProperty("taskCount")]
|
||||
public int? TaskCount { get; set; }
|
||||
|
||||
[JsonProperty("tiePolicy")]
|
||||
public string? TiePolicy { get; set; }
|
||||
|
||||
[JsonProperty("killDistanceM")]
|
||||
public double? KillDistanceM { get; set; }
|
||||
|
||||
[JsonProperty("reportDistanceM")]
|
||||
public double? ReportDistanceM { get; set; }
|
||||
|
||||
[JsonProperty("taskStartDistanceM")]
|
||||
public double? TaskStartDistanceM { get; set; }
|
||||
|
||||
[JsonProperty("meetingArrivalRadiusM")]
|
||||
public double? MeetingArrivalRadiusM { get; set; }
|
||||
|
||||
[JsonProperty("emergencyMeetingCallRadiusM")]
|
||||
public double? EmergencyMeetingCallRadiusM { get; set; }
|
||||
|
||||
[JsonProperty("repairStationDistanceM")]
|
||||
public double? RepairStationDistanceM { get; set; }
|
||||
|
||||
[JsonProperty("killCooldownMs")]
|
||||
public int? KillCooldownMs { get; set; }
|
||||
|
||||
[JsonProperty("emergencyMeetingCooldownMs")]
|
||||
public int? EmergencyMeetingCooldownMs { get; set; }
|
||||
|
||||
[JsonProperty("maxEmergencyMeetingsPerPlayer")]
|
||||
public int? MaxEmergencyMeetingsPerPlayer { get; set; }
|
||||
|
||||
[JsonProperty("arrivalBaseMs")]
|
||||
public int? ArrivalBaseMs { get; set; }
|
||||
|
||||
[JsonProperty("allowedLateMs")]
|
||||
public int? AllowedLateMs { get; set; }
|
||||
|
||||
[JsonProperty("discussionPhaseMs")]
|
||||
public int? DiscussionPhaseMs { get; set; }
|
||||
|
||||
[JsonProperty("votingPhaseMs")]
|
||||
public int? VotingPhaseMs { get; set; }
|
||||
|
||||
[JsonProperty("sabotageCooldownMs")]
|
||||
public int? SabotageCooldownMs { get; set; }
|
||||
|
||||
[JsonProperty("commsBlackoutDurationMs")]
|
||||
public int? CommsBlackoutDurationMs { get; set; }
|
||||
|
||||
[JsonProperty("criticalMeltdownDeadlineMs")]
|
||||
public int? CriticalMeltdownDeadlineMs { get; set; }
|
||||
|
||||
[JsonProperty("repairStationHoldMs")]
|
||||
public int? RepairStationHoldMs { get; set; }
|
||||
}
|
||||
|
||||
// Map data classes for rendering - compact format from server
|
||||
|
||||
Reference in New Issue
Block a user