UI/UiPlayerHud.razor

A Razor UI component for the player's HUD. It renders a watermark, top-bar strings, build options for a selected object, a death notice, and a next-turn button, and it reads player UI state each update and sends a build or next-turn command to the GameManager.

Networking
@using System;
@using Forp.Game
@inherits PanelComponent

<root>
    <watermark>Forp Infdev @(DateTime.Now.ToShortDateString())</watermark>
    <static-bar>
        @foreach (string TopMenuString in UiInfo.GetTopBarStrings())
        {
            <div>@TopMenuString</div>
        }
    </static-bar>

    @if (UiInfo.AnythingSelected())
    {
        <build-unit-container>
            @foreach (var (BuildString, Index) in UiInfo.BuildObjects.Select((v, i) => (v, i)))
            {
                <build-unit>
                    <button onclick="@(() => OnUnitBuildClick(Index))">@BuildString</button>
                </build-unit>
            }
        </build-unit-container>
    }

    @if (GamePlayer.Local.IsDead())
    {
        <dead>YOU! ARE DEAD</dead>
    }

    <next-turn-button onclick="@OnNextTurnClick" style="background-color: @GetNextColour();">
        @(GetNextTurnString())
    </next-turn-button>
</root>

@code
{
    protected override int BuildHash()
    {
        return HashCode.Combine(Time.Now);
    }

    private FPlayerUiInfo UiInfo;

    protected override void OnUpdate()
    {
        base.OnUpdate();

        if (!GamePlayer.Local.IsValid())
        {
            return;
        }

        GamePlayer.Local.GetPlayerUiInfo(out UiInfo);
    }

    private string GetNextColour()
    {
        return GameManager.Instance.WaitingForLocal() ? "red" : "black";
    }

    private void OnNextTurnClick()
    {
        GameManager.Instance.NextTurn();
    }

    private string GetNextTurnString()
    {
        GameManager.Instance.GetWaitingConnections(out var Waiting, out var Total);
        return $"{Waiting}/{Total}";
    }

    private void OnUnitBuildClick(int Index)
    {
        var SelectedSplitStrings = UiInfo.BuildObjects[Index].Split(" ", 2);
        var BuildId = SelectedSplitStrings[0];
        var Cost = int.Parse(SelectedSplitStrings[1].TrimStart("\u00A3"));
        GameManager.Instance.Server_QueueHexObject(BuildId, UiInfo.SelectedHex, Cost);
    }
}