KoogleApp/src/Koogle.Web/Components/Game/Shit/ShitSetup.razor

152 lines
5.2 KiB
Plaintext

@using Koogle.Application.Games
@using Koogle.Application.Games.Shit
@using Koogle.Application.Interfaces
@using Koogle.Domain.Enums
@using MudBlazor
@inject ITriggerService TriggerService
@implements IGameSetupControl
<MudPaper Class="pa-4">
<MudText Typo="Typo.h6" Class="mb-4">Scheiss-Spiel Einstellungen</MudText>
<MudStack Spacing="4">
<MudNumericField T="int"
@bind-Value="_options.ShitNumber"
Label="Scheiss-Zahl"
Variant="Variant.Outlined"
Min="1"
Max="9"
HelperText="Wer diese Zahl wirft, bekommt die gesammelten Punkte (1-9)" />
<MudNumericField T="int"
@bind-Value="_options.StartNumber"
Label="Start-Punkte"
Variant="Variant.Outlined"
Min="10"
Max="1000"
Step="10"
HelperText="Jeder Spieler startet mit dieser Punktzahl (10-1000)" />
<MudSelect T="ParticipantsMode"
@bind-Value="_options.ParticipantsMode"
Label="Spieler-Rotation"
Variant="Variant.Outlined"
HelperText="Automatisch: Spieler wechseln nach der Runde. Frei wählbar: Jeder kann werfen.">
<MudSelectItem Value="ParticipantsMode.GameLogic">Automatisch</MudSelectItem>
<MudSelectItem Value="ParticipantsMode.FreeToChoose">Frei wählbar</MudSelectItem>
</MudSelect>
</MudStack>
@if (!_hasExpensePointTrigger)
{
<MudAlert Severity="Severity.Warning" Class="mt-4">
<MudText Typo="Typo.body2">
<strong>Hinweis:</strong> Es ist kein "Strafpunkt"-Trigger konfiguriert.
Die Verlierer-Strafen werden nicht automatisch berechnet.
Gehe zu Stammdaten → Trigger, um einen ExpensePoint-Trigger einzurichten.
</MudText>
</MudAlert>
}
<MudDivider Class="my-4" />
<MudText Typo="Typo.body2" Color="Color.Secondary">
<strong>Spielregeln:</strong>
<ul style="margin: 8px 0 0 16px; padding: 0;">
<li>Jeder Spieler startet mit der Start-Punktzahl</li>
<li>Geworfene Kegel werden von deinen Punkten abgezogen</li>
<li>Du kannst weiterspielen oder zum nächsten Spieler übergeben</li>
<li>Wirfst du die Scheiss-Zahl oder in die Gosse, bekommst du alle gesammelten Punkte dazu</li>
<li>Wer zuerst 0 erreicht, gewinnt!</li>
<li>Die Verlierer zahlen Strafe basierend auf ihren Restpunkten</li>
</ul>
</MudText>
</MudPaper>
@code {
/// <summary>
/// Callback when setup options change.
/// </summary>
[Parameter]
public EventCallback<object> OnOptionsChanged { get; set; }
/// <summary>
/// Initial setup options.
/// </summary>
[Parameter]
public object? InitialOptions { get; set; }
private ShitSetupOptionsInternal _options = new();
private bool _hasExpensePointTrigger = true;
protected override async Task OnInitializedAsync()
{
if (InitialOptions is ShitGameSetup setup)
{
_options = new ShitSetupOptionsInternal
{
ShitNumber = setup.ShitNumber,
StartNumber = setup.StartNumber,
ParticipantsMode = setup.ParticipantsMode
};
}
// Check if ExpensePoint trigger is configured
_hasExpensePointTrigger = await TriggerService.HasExpensesForTriggerAsync(ExpenseTriggerType.ExpensePoint);
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
await NotifyOptionsChanged();
}
}
private async Task NotifyOptionsChanged()
{
var setup = new ShitGameSetup
{
ShitNumber = _options.ShitNumber,
StartNumber = _options.StartNumber,
ParticipantsMode = _options.ParticipantsMode
};
await OnOptionsChanged.InvokeAsync(setup);
}
/// <summary>
/// Gets the current setup.
/// </summary>
public ShitGameSetup GetSetup() => new()
{
ShitNumber = _options.ShitNumber,
StartNumber = _options.StartNumber,
ParticipantsMode = _options.ParticipantsMode
};
// Internal mutable class for two-way binding
private class ShitSetupOptionsInternal
{
public int ShitNumber { get; set; } = 5;
public int StartNumber { get; set; } = 50;
public ParticipantsMode ParticipantsMode { get; set; } = ParticipantsMode.GameLogic;
}
public IGameSetupModel GameSetupModel => CreateShitSetup();
private ShitGameSetup CreateShitSetup()
{
// Extract game-specific options if available
var shitNumber = 5;
var startNumber = 50;
return ShitGameSetup.Create(
throwMode: ThrowMode.Reposition,
throwsPerRound: int.MaxValue,
participantsMode: ParticipantsMode.GameLogic,
shitNumber: _options.ShitNumber,
startNumber: _options.StartNumber);
}
}