diff --git a/src/GoodWood.Application/Games/FoxHunt/FoxHuntGameLogicService.cs b/src/GoodWood.Application/Games/FoxHunt/FoxHuntGameLogicService.cs index 8380208..3316572 100644 --- a/src/GoodWood.Application/Games/FoxHunt/FoxHuntGameLogicService.cs +++ b/src/GoodWood.Application/Games/FoxHunt/FoxHuntGameLogicService.cs @@ -122,6 +122,21 @@ namespace GoodWood.Application.Games.FoxHunt var nextPlayerId = GetNextId(model, chooseNextFox); + + if (chooseNextFox) + { + gameEvents.Add(new FoxChangedEvent + { + FoxPlayerId = foxId, + FoxEscaped = playerStates[foxId].FoxEscaped, + NextFoxPlayerId = nextPlayerId, + Message = playerStates[foxId].FoxEscaped + ? "Fuchs entkommen! Nächster Fuchs ist dran." + : "Fuchs gefangen! Nächster Fuchs ist dran." + }); + } + + // Check GAME END var isGameOver = model.FoxCountLeft == 0; diff --git a/src/GoodWood.Application/Games/GameEvent.cs b/src/GoodWood.Application/Games/GameEvent.cs index 9c16de0..678072a 100644 --- a/src/GoodWood.Application/Games/GameEvent.cs +++ b/src/GoodWood.Application/Games/GameEvent.cs @@ -11,6 +11,7 @@ namespace GoodWood.Application.Games; [JsonDerivedType(typeof(PlayerWonEvent), "PlayerWon")] [JsonDerivedType(typeof(TeamWonEvent), "TeamWon")] [JsonDerivedType(typeof(GameEndedEvent), "GameEnded")] +[JsonDerivedType(typeof(FoxChangedEvent), "FoxChanged")] public abstract record GameEvent { /// @@ -77,6 +78,27 @@ public record TeamWonEvent : GameEvent public required IReadOnlyList PlayerIds { get; init; } } +/// +/// Event when the fox role changes (fox escaped or was caught). +/// +public record FoxChangedEvent : GameEvent +{ + /// + /// ID of the player who was fox. + /// + public required Guid FoxPlayerId { get; init; } + + /// + /// True if the fox escaped, false if caught by hunters. + /// + public bool FoxEscaped { get; init; } + + /// + /// ID of the next fox (null if game is over). + /// + public Guid? NextFoxPlayerId { get; init; } +} + /// /// Event when the game ends (covers any end scenario). /// diff --git a/src/GoodWood.Web/Components/Game/GameEventDialog.razor b/src/GoodWood.Web/Components/Game/GameEventDialog.razor index 45b4464..a0a97c3 100644 --- a/src/GoodWood.Web/Components/Game/GameEventDialog.razor +++ b/src/GoodWood.Web/Components/Game/GameEventDialog.razor @@ -34,6 +34,11 @@ Spiel beendet! @GameEndedMessage } + else if (!string.IsNullOrEmpty(FoxChangedMessage)) + { + + @FoxChangedMessage + } else if (EliminatedPlayers.Count > 0) { @@ -83,5 +88,8 @@ [Parameter] public string? GameEndedMessage { get; set; } + [Parameter] + public string? FoxChangedMessage { get; set; } + private void Close() => MudDialog.Close(DialogResult.Ok(true)); } diff --git a/src/GoodWood.Web/Components/Game/GameEventDialogHost.razor b/src/GoodWood.Web/Components/Game/GameEventDialogHost.razor index f310f99..bd1856a 100644 --- a/src/GoodWood.Web/Components/Game/GameEventDialogHost.razor +++ b/src/GoodWood.Web/Components/Game/GameEventDialogHost.razor @@ -50,6 +50,7 @@ string? winningTeamName = null; string? winningTeamMessage = null; string? gameEndedMessage = null; + string? foxChangedMessage = null; foreach (var evt in newEvents) { @@ -69,11 +70,14 @@ case GameEndedEvent ended when ended.WinnerId == null && string.IsNullOrEmpty(ended.WinningTeamName): gameEndedMessage = ended.Message ?? "Spiel beendet ohne Sieger"; break; + case FoxChangedEvent foxChanged: + foxChangedMessage = foxChanged.Message; + break; } } // Only show dialog if there's something to show - if (eliminatedPlayers.Count == 0 && winnerName == null && winningTeamName == null && gameEndedMessage == null) + if (eliminatedPlayers.Count == 0 && winnerName == null && winningTeamName == null && gameEndedMessage == null && foxChangedMessage == null) { _isShowingDialog = false; return; @@ -87,7 +91,8 @@ { x => x.WinnerMessage, winnerMessage }, { x => x.WinningTeamName, winningTeamName }, { x => x.WinningTeamMessage, winningTeamMessage }, - { x => x.GameEndedMessage, gameEndedMessage } + { x => x.GameEndedMessage, gameEndedMessage }, + { x => x.FoxChangedMessage, foxChangedMessage } }; var options = new DialogOptions @@ -101,7 +106,9 @@ var title = (action.IsGameOver && (winnerName != null || winningTeamName != null)) || gameEndedMessage != null ? "Spiel beendet!" - : "Spieler ausgeschieden!"; + : foxChangedMessage != null + ? "Fuchswechsel!" + : "Spieler ausgeschieden!"; await InvokeAsync(async () => {