Slip- und Beschuldigungslogik überarbeitet
All checks were successful
Build / build (push) Successful in 2m19s
All checks were successful
Build / build (push) Successful in 2m19s
Slips werden jetzt 30 Sekunden vorgehalten und anschließend automatisch abgeschlossen; direkte Spieler-Beschuldigungen, Win-Status, SignalR-Events, MAUI-UI, EF-Mapping/Migrationen sowie Tests wurden an die neue Spiellogik angepasst.
This commit is contained in:
@@ -10,6 +10,8 @@ public class GameStateDto
|
||||
public int HostUserId { get; set; }
|
||||
public int CurrentRound { get; set; }
|
||||
public int RoundTimeRemaining { get; set; }
|
||||
public int? WinnerPlayerId { get; set; }
|
||||
public string? WinnerUsername { get; set; }
|
||||
}
|
||||
|
||||
public class PlayerInfoDto
|
||||
@@ -29,12 +31,55 @@ public class PlayerHandDto
|
||||
public List<PlayerCardDto> Cards { get; set; } = [];
|
||||
}
|
||||
|
||||
public class PlayerCardDto
|
||||
public class PlayerCardDto : System.ComponentModel.INotifyPropertyChanged
|
||||
{
|
||||
private bool _isUsed;
|
||||
private DateTime? _slippedAt;
|
||||
private int _slippedHoldSecondsRemaining;
|
||||
|
||||
public event System.ComponentModel.PropertyChangedEventHandler? PropertyChanged;
|
||||
|
||||
public int CardId { get; set; }
|
||||
public int PhraseId { get; set; }
|
||||
public string Text { get; set; } = string.Empty;
|
||||
public bool IsUsed { get; set; }
|
||||
|
||||
public bool IsUsed
|
||||
{
|
||||
get => _isUsed;
|
||||
set { _isUsed = value; NotifyStateChanged(); }
|
||||
}
|
||||
|
||||
public DateTime? SlippedAt
|
||||
{
|
||||
get => _slippedAt;
|
||||
set { _slippedAt = value; NotifyStateChanged(); }
|
||||
}
|
||||
|
||||
public int SlippedHoldSecondsRemaining
|
||||
{
|
||||
get => _slippedHoldSecondsRemaining;
|
||||
set
|
||||
{
|
||||
_slippedHoldSecondsRemaining = value;
|
||||
Raise(nameof(SlippedHoldSecondsRemaining));
|
||||
Raise(nameof(SlipButtonText));
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsPendingSlip => SlippedAt.HasValue && !IsUsed;
|
||||
public bool CanSlip => !IsPendingSlip && !IsUsed;
|
||||
public string SlipButtonText => IsPendingSlip ? $"Vorgehalten ({SlippedHoldSecondsRemaining}s)" : "Slip";
|
||||
|
||||
private void NotifyStateChanged()
|
||||
{
|
||||
Raise(nameof(IsUsed));
|
||||
Raise(nameof(SlippedAt));
|
||||
Raise(nameof(IsPendingSlip));
|
||||
Raise(nameof(CanSlip));
|
||||
Raise(nameof(SlipButtonText));
|
||||
}
|
||||
|
||||
private void Raise(string name) => PropertyChanged?.Invoke(this, new(name));
|
||||
}
|
||||
|
||||
public class SlipChallengeDto
|
||||
@@ -43,7 +88,8 @@ public class SlipChallengeDto
|
||||
public int ChallengingPlayerId { get; set; }
|
||||
public string ChallengingPlayerName { get; set; } = string.Empty;
|
||||
public int TargetPlayerId { get; set; }
|
||||
public int TargetCardId { get; set; }
|
||||
public string TargetPlayerName { get; set; } = string.Empty;
|
||||
public int? TargetCardId { get; set; }
|
||||
public string Status { get; set; } = string.Empty;
|
||||
public DateTime CreatedAt { get; set; }
|
||||
}
|
||||
|
||||
@@ -19,9 +19,11 @@ public class Game
|
||||
public DateTime? EndedAt { get; set; }
|
||||
public int MaxPlayers { get; set; } = 8;
|
||||
public int RoundDurationSeconds { get; set; } = 45;
|
||||
public int? WinnerPlayerId { get; set; }
|
||||
|
||||
// Navigation
|
||||
public User Host { get; set; } = null!;
|
||||
public Player? WinnerPlayer { get; set; }
|
||||
public ICollection<Player> Players { get; set; } = [];
|
||||
public ICollection<GameRound> Rounds { get; set; } = [];
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ public class PlayerCard
|
||||
public int PhraseId { get; set; }
|
||||
public int GameRoundId { get; set; }
|
||||
public bool IsUsed { get; set; } = false;
|
||||
public DateTime? SlippedAt { get; set; }
|
||||
public DateTime AssignedAt { get; set; } = DateTime.UtcNow;
|
||||
|
||||
// Navigation
|
||||
|
||||
@@ -3,8 +3,8 @@ namespace SlipItIn.Shared.Models;
|
||||
public enum ChallengeStatus
|
||||
{
|
||||
Pending, // Beschuldigung eingegangen, wartet auf Bestätigung/Ablehnung
|
||||
Approved, // Beschuldigung war berechtigt → Phrase bleibt beim Beschuldiger
|
||||
Rejected // Beschuldigung falsch → Beschuldiger erhält die Phrase
|
||||
Approved, // Beschuldigung war berechtigt -> Beschuldigter muss Karte ablegen und 2 neue ziehen
|
||||
Rejected // Beschuldigung angefochten -> Beschuldigung zurückgenommen
|
||||
}
|
||||
|
||||
public class SlipChallenge
|
||||
@@ -13,7 +13,7 @@ public class SlipChallenge
|
||||
public int GameRoundId { get; set; }
|
||||
public int ChallengingPlayerId { get; set; } // Wer beschuldigt
|
||||
public int TargetPlayerId { get; set; } // Wer beschuldigt wird
|
||||
public int TargetCardId { get; set; } // Welche Phrase wird als falsch behauptet
|
||||
public int? TargetCardId { get; set; } // Optional: Angefochtene Karte falls bekannt/zugeordnet
|
||||
public ChallengeStatus Status { get; set; } = ChallengeStatus.Pending;
|
||||
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
||||
public DateTime? ResolvedAt { get; set; }
|
||||
@@ -22,5 +22,5 @@ public class SlipChallenge
|
||||
public GameRound GameRound { get; set; } = null!;
|
||||
public Player ChallengingPlayer { get; set; } = null!; // Der Beschuldiger
|
||||
public Player TargetPlayer { get; set; } = null!; // Der Beschuldigte
|
||||
public PlayerCard TargetCard { get; set; } = null!; // Die angefochtene Phrase
|
||||
public PlayerCard? TargetCard { get; set; } // Die angefochtene Phrase (optional)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user