fix deathbox handling
This commit is contained in:
parent
f75b08d98d
commit
7795c3064f
|
|
@ -1,4 +1,7 @@
|
||||||
|
|
||||||
|
@DeathBoxGameLogicService: Nachdem ein Spieler ein Ei verdienst hat, muss der nächste zwangsweise wieder in die Vollen, also auf alle 9 Pins werden. Dafür muss er ein X bekommen, was aktuell nicht der Fall ist.
|
||||||
|
|
||||||
|
|
||||||
- neuer Tag -> optional Gäste und nicht alle Teilnehmer
|
- neuer Tag -> optional Gäste und nicht alle Teilnehmer
|
||||||
- Tag beendnden -> alle Teilnehmer hinzufügen, und strafen hinzufügen
|
- Tag beendnden -> alle Teilnehmer hinzufügen, und strafen hinzufügen
|
||||||
- offene Sachstrafen von einem Tag zum nächsten fortschreiben
|
- offene Sachstrafen von einem Tag zum nächsten fortschreiben
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,7 @@ public class DeathBoxGameLogicService : IGameLogicService
|
||||||
var playerStates = new Dictionary<Guid, DeathBoxPlayerState>(model.PlayerStates);
|
var playerStates = new Dictionary<Guid, DeathBoxPlayerState>(model.PlayerStates);
|
||||||
var eliminatedPlayers = new List<Guid>(model.EliminatedPlayers);
|
var eliminatedPlayers = new List<Guid>(model.EliminatedPlayers);
|
||||||
var triggers = new List<TriggerEvent>();
|
var triggers = new List<TriggerEvent>();
|
||||||
|
var assignX = false;
|
||||||
|
|
||||||
// Get current player state
|
// Get current player state
|
||||||
var currentState = playerStates[playerId];
|
var currentState = playerStates[playerId];
|
||||||
|
|
@ -83,8 +84,8 @@ public class DeathBoxGameLogicService : IGameLogicService
|
||||||
if (isNewRound)
|
if (isNewRound)
|
||||||
{
|
{
|
||||||
// Always collect X on new round
|
// Always collect X on new round
|
||||||
currentState.XCount++;
|
//currentState.XCount++;
|
||||||
lastThrow = lastThrow with { EarnedX = true };
|
//lastThrow = lastThrow with { EarnedX = true };
|
||||||
|
|
||||||
// Penalty for <3 pins on new round
|
// Penalty for <3 pins on new round
|
||||||
if (pinsKnocked < 3)
|
if (pinsKnocked < 3)
|
||||||
|
|
@ -135,10 +136,10 @@ public class DeathBoxGameLogicService : IGameLogicService
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. CLEARED processing (all remaining pins hit)
|
// 3. CLEARED processing (all remaining pins hit)
|
||||||
Guid? previousPlayerPenalizedId = null;
|
//Guid? previousPlayerPenalizedId = null;
|
||||||
bool previousPlayerEliminated = false;
|
bool previousPlayerEliminated = false;
|
||||||
|
|
||||||
if (afterThrow.IsCleared && !isNewRound)
|
if (afterThrow.IsCleared /*&& !isNewRound*/)
|
||||||
{
|
{
|
||||||
// Current player gets egg
|
// Current player gets egg
|
||||||
currentState.EggCount++;
|
currentState.EggCount++;
|
||||||
|
|
@ -156,6 +157,9 @@ public class DeathBoxGameLogicService : IGameLogicService
|
||||||
// Eggs expire if no marks to remove
|
// Eggs expire if no marks to remove
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// in case eggs have been earned, next player will get another X
|
||||||
|
assignX = true;
|
||||||
|
|
||||||
// Previous player gets mark (if exists and not eliminated)
|
// Previous player gets mark (if exists and not eliminated)
|
||||||
if (model.PreviousPlayerId.HasValue &&
|
if (model.PreviousPlayerId.HasValue &&
|
||||||
playerStates.TryGetValue(model.PreviousPlayerId.Value, out var prevState) &&
|
playerStates.TryGetValue(model.PreviousPlayerId.Value, out var prevState) &&
|
||||||
|
|
@ -167,7 +171,7 @@ public class DeathBoxGameLogicService : IGameLogicService
|
||||||
PreviousPlayerGotMark = true,
|
PreviousPlayerGotMark = true,
|
||||||
PreviousPlayerPenalizedId = model.PreviousPlayerId.Value
|
PreviousPlayerPenalizedId = model.PreviousPlayerId.Value
|
||||||
};
|
};
|
||||||
previousPlayerPenalizedId = model.PreviousPlayerId.Value;
|
//previousPlayerPenalizedId = model.PreviousPlayerId.Value;
|
||||||
|
|
||||||
// Check if previous player is eliminated
|
// Check if previous player is eliminated
|
||||||
if (prevState.Marks >= model.CoffinSize)
|
if (prevState.Marks >= model.CoffinSize)
|
||||||
|
|
@ -238,6 +242,36 @@ public class DeathBoxGameLogicService : IGameLogicService
|
||||||
if (currentIndex < 0) currentIndex = model.CurrentPlayerIndex;
|
if (currentIndex < 0) currentIndex = model.CurrentPlayerIndex;
|
||||||
|
|
||||||
int nextPlayerIndex = GetNextActivePlayerIndex(model.PlayerOrder, currentIndex, playerStates);
|
int nextPlayerIndex = GetNextActivePlayerIndex(model.PlayerOrder, currentIndex, playerStates);
|
||||||
|
var nextPlayerId = model.PlayerOrder[nextPlayerIndex];
|
||||||
|
if (assignX)
|
||||||
|
{
|
||||||
|
var nextState = playerStates[nextPlayerId];
|
||||||
|
nextState.XCount ++;
|
||||||
|
lastThrow = lastThrow with { EarnedX = true };
|
||||||
|
|
||||||
|
lastThrow = lastThrow with
|
||||||
|
{
|
||||||
|
EarnedX = true,
|
||||||
|
NextPlayerPenalizedId = nextPlayerId
|
||||||
|
};
|
||||||
|
|
||||||
|
// Check X conversion (3 X's -> 1 mark)
|
||||||
|
if (nextState.XCount >= 3)
|
||||||
|
{
|
||||||
|
lastThrow = lastThrow with
|
||||||
|
{
|
||||||
|
NextPlayerGotMark = true,
|
||||||
|
NextPlayerPenalizedId = nextPlayerId
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
nextState.XCount = 0;
|
||||||
|
nextState.Marks++;
|
||||||
|
lastThrow = lastThrow with { ConvertedXsToMark = true };
|
||||||
|
}
|
||||||
|
|
||||||
|
playerStates[nextPlayerId] = nextState;
|
||||||
|
}
|
||||||
|
|
||||||
// Update model
|
// Update model
|
||||||
model = model with
|
model = model with
|
||||||
|
|
|
||||||
|
|
@ -149,6 +149,16 @@ public record DeathBoxLastThrow
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool ConvertedEggsToRemoveMark { get; init; }
|
public bool ConvertedEggsToRemoveMark { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether the next player got a mark (cleared penalty).
|
||||||
|
/// </summary>
|
||||||
|
public bool NextPlayerGotMark { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ID of next player who got a mark (if any).
|
||||||
|
/// </summary>
|
||||||
|
public Guid? NextPlayerPenalizedId { get; init; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Whether the previous player got a mark (cleared penalty).
|
/// Whether the previous player got a mark (cleared penalty).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
|
|
@ -283,10 +283,6 @@
|
||||||
// Pin count
|
// Pin count
|
||||||
messages.Add($"{playerName}: {lt.PinsKnocked} Pin(s)");
|
messages.Add($"{playerName}: {lt.PinsKnocked} Pin(s)");
|
||||||
|
|
||||||
// X earned
|
|
||||||
if (lt.EarnedX)
|
|
||||||
messages.Add("X gesammelt");
|
|
||||||
|
|
||||||
// Penalty for <3 pins
|
// Penalty for <3 pins
|
||||||
if (lt.WasPenalty)
|
if (lt.WasPenalty)
|
||||||
messages.Add("Weniger als 3 Pins! +1 Strich");
|
messages.Add("Weniger als 3 Pins! +1 Strich");
|
||||||
|
|
@ -308,12 +304,26 @@
|
||||||
messages.Add($"{prevName} bekommt +1 Strich");
|
messages.Add($"{prevName} bekommt +1 Strich");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Conversions
|
// Conversions PreviousPlayer
|
||||||
if (lt.ConvertedXsToMark)
|
|
||||||
messages.Add("3 Xe → +1 Strich");
|
|
||||||
if (lt.ConvertedEggsToRemoveMark)
|
if (lt.ConvertedEggsToRemoveMark)
|
||||||
messages.Add("3 Eier → -1 Strich!");
|
messages.Add("3 Eier → -1 Strich!");
|
||||||
|
|
||||||
|
// X earned
|
||||||
|
if (lt.EarnedX && lt.NextPlayerPenalizedId.HasValue)
|
||||||
|
{
|
||||||
|
var nextName = GetPlayerName(lt.NextPlayerPenalizedId.Value);
|
||||||
|
messages.Add($"{nextName}: X gesammelt");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Conversions NextPlayer
|
||||||
|
if (lt.ConvertedXsToMark && lt.NextPlayerPenalizedId.HasValue)
|
||||||
|
{
|
||||||
|
var nextName = GetPlayerName(lt.NextPlayerPenalizedId.Value);
|
||||||
|
messages.Add($"{nextName} 3 Xe → +1 Strich");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Eliminations
|
// Eliminations
|
||||||
if (lt.PlayerEliminated)
|
if (lt.PlayerEliminated)
|
||||||
messages.Add($"{playerName} ist ausgeschieden!");
|
messages.Add($"{playerName} ist ausgeschieden!");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue