Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions Content.Client/_VXS14/Mortar/BallisticCalculatorEui.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
using Content.Client.Eui;
using Content.Shared.Eui;
using Content.Shared._VXS14.Mortar;
using JetBrains.Annotations;

namespace Content.Client._VXS14.Mortar;

[UsedImplicitly]
public sealed class BallisticCalculatorEui : BaseEui
{
private readonly BallisticCalculatorWindow _window;

public BallisticCalculatorEui()
{
_window = new BallisticCalculatorWindow();
_window.SetEui(this);
_window.OnClose += SendClosedMessage;
}

public override void Opened()
{
base.Opened();
_window.OpenCentered();
}

public override void Closed()
{
base.Closed();
_window.OnClose -= SendClosedMessage;
_window.Close();
}

public override void HandleMessage(EuiMessageBase msg)
{
base.HandleMessage(msg);

switch (msg)
{
case MortarBallisticCalculatorEuiMsg.Snapshot snapshot:
_window.UpdateSnapshot(snapshot);
break;
case MortarBallisticCalculatorEuiMsg.Result result:
_window.UpdateResult(result);
break;
case MortarBallisticCalculatorEuiMsg.Error error:
_window.ShowError(error.Message);
break;
}
}

public void SendCalculate(float mortarX, float mortarY, float deviationX, float deviationY)
{
SendMessage(new MortarBallisticCalculatorEuiMsg.CalculateRequest(mortarX, mortarY, deviationX, deviationY));
}

private void SendClosedMessage()
{
SendMessage(new CloseEuiMessage());
}
}
37 changes: 37 additions & 0 deletions Content.Client/_VXS14/Mortar/BallisticCalculatorWindow.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<controls:BallisticCalculatorWindow
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client._VXS14.Mortar">
<BoxContainer Orientation="Vertical" SeparationOverride="4">
<Label Text="Mortar Ballistic Calculator"/>

<BoxContainer Orientation="Horizontal" SeparationOverride="4">
<Label Text="Mortar X:"/>
<SpinBox Name="MortarX" Value="0"/>
</BoxContainer>

<BoxContainer Orientation="Horizontal" SeparationOverride="4">
<Label Text="Mortar Y:"/>
<SpinBox Name="MortarY" Value="0"/>
</BoxContainer>

<BoxContainer Orientation="Horizontal" SeparationOverride="4">
<Label Text="Deviation X:"/>
<SpinBox Name="DeviationX" Value="0"/>
</BoxContainer>

<BoxContainer Orientation="Horizontal" SeparationOverride="4">
<Label Text="Deviation Y:"/>
<SpinBox Name="DeviationY" Value="0"/>
</BoxContainer>

<Label Name="ObserverLabel" Text="Observer: X=0.0, Y=0.0"/>
<Label Name="TargetLabel" Text="Target: -"/>

<Button Name="CalculateButton" Text="Calculate"/>

<Label Name="DistanceLabel" Text="Distance: -"/>
<Label Name="FlightTimeLabel" Text="Flight time: -"/>
<Label Name="DeviationLabel" Text="Expected deviation: -"/>
<Label Name="ErrorLabel" Text=""/>
</BoxContainer>
</controls:BallisticCalculatorWindow>
64 changes: 64 additions & 0 deletions Content.Client/_VXS14/Mortar/BallisticCalculatorWindow.xaml.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
using Content.Shared._VXS14.Mortar;
using JetBrains.Annotations;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using static Robust.Client.UserInterface.Controls.BaseButton;

namespace Content.Client._VXS14.Mortar;

[GenerateTypedNameReferences]
[UsedImplicitly]
public sealed partial class BallisticCalculatorWindow : DefaultWindow
{
private BallisticCalculatorEui? _eui;

public BallisticCalculatorWindow()
{
RobustXamlLoader.Load(this);

Title = "Mortar Ballistic Calculator";

MortarX.IsValid = value => value >= -10000f && value <= 10000f;
MortarY.IsValid = value => value >= -10000f && value <= 10000f;
DeviationX.IsValid = value => value >= -10000f && value <= 10000f;
DeviationY.IsValid = value => value >= -10000f && value <= 10000f;

CalculateButton.OnPressed += OnCalculatePressed;
}

public void SetEui(BallisticCalculatorEui eui)
{
_eui = eui;
}

public void UpdateSnapshot(MortarBallisticCalculatorEuiMsg.Snapshot snapshot)
{
ObserverLabel.Text = $"Observer: X={snapshot.ObserverX:0.0}, Y={snapshot.ObserverY:0.0}";
TargetLabel.Text = "Target: enter dX/dY and press Calculate";

if (string.IsNullOrEmpty(ErrorLabel.Text))
return;

ErrorLabel.Text = string.Empty;
}

public void UpdateResult(MortarBallisticCalculatorEuiMsg.Result result)
{
TargetLabel.Text = $"Target: X={result.TargetX:0.0}, Y={result.TargetY:0.0}";
DistanceLabel.Text = $"Distance: {result.MortarToTargetDistance:0.0} tiles";
FlightTimeLabel.Text = $"Flight time: {result.FlightTimeSeconds:0.00} s";
DeviationLabel.Text = $"Expected deviation: {result.ExpectedDeviation:0.00} tiles";
ErrorLabel.Text = string.Empty;
}

public void ShowError(string message)
{
ErrorLabel.Text = message;
}

private void OnCalculatePressed(ButtonEventArgs args)
{
_eui?.SendCalculate(MortarX.Value, MortarY.Value, DeviationX.Value, DeviationY.Value);
}
}
35 changes: 35 additions & 0 deletions Content.Client/_VXS14/Mortar/BasicCalculatorEui.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using Content.Client.Eui;
using Content.Shared.Eui;
using JetBrains.Annotations;

namespace Content.Client._VXS14.Mortar;

[UsedImplicitly]
public sealed class BasicCalculatorEui : BaseEui
{
private readonly BasicCalculatorWindow _window;

public BasicCalculatorEui()
{
_window = new BasicCalculatorWindow();
_window.OnClose += SendClosedMessage;
}

public override void Opened()
{
base.Opened();
_window.OpenCentered();
}

public override void Closed()
{
base.Closed();
_window.OnClose -= SendClosedMessage;
_window.Close();
}

private void SendClosedMessage()
{
SendMessage(new CloseEuiMessage());
}
}
47 changes: 47 additions & 0 deletions Content.Client/_VXS14/Mortar/BasicCalculatorWindow.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<controls:BasicCalculatorWindow
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client._VXS14.Mortar">
<BoxContainer Orientation="Vertical" SeparationOverride="4" MinSize="220 260">
<PanelContainer>
<BoxContainer Orientation="Vertical" Margin="6 4" SeparationOverride="2">
<Label Name="ExpressionLabel" HorizontalExpand="True" HorizontalAlignment="Right" Text=""/>
<Label Name="DisplayLabel" HorizontalExpand="True" HorizontalAlignment="Right" Text="0"/>
</BoxContainer>
</PanelContainer>

<BoxContainer Orientation="Horizontal" SeparationOverride="4">
<Button Name="BtnCe" Text="CE" HorizontalExpand="True"/>
<Button Name="BtnC" Text="C" HorizontalExpand="True"/>
<Button Name="BtnBack" Text="&lt;-" HorizontalExpand="True"/>
<Button Name="BtnDiv" Text="/" HorizontalExpand="True"/>
</BoxContainer>

<BoxContainer Orientation="Horizontal" SeparationOverride="4">
<Button Name="Btn7" Text="7" HorizontalExpand="True"/>
<Button Name="Btn8" Text="8" HorizontalExpand="True"/>
<Button Name="Btn9" Text="9" HorizontalExpand="True"/>
<Button Name="BtnMul" Text="*" HorizontalExpand="True"/>
</BoxContainer>

<BoxContainer Orientation="Horizontal" SeparationOverride="4">
<Button Name="Btn4" Text="4" HorizontalExpand="True"/>
<Button Name="Btn5" Text="5" HorizontalExpand="True"/>
<Button Name="Btn6" Text="6" HorizontalExpand="True"/>
<Button Name="BtnSub" Text="-" HorizontalExpand="True"/>
</BoxContainer>

<BoxContainer Orientation="Horizontal" SeparationOverride="4">
<Button Name="Btn1" Text="1" HorizontalExpand="True"/>
<Button Name="Btn2" Text="2" HorizontalExpand="True"/>
<Button Name="Btn3" Text="3" HorizontalExpand="True"/>
<Button Name="BtnAdd" Text="+" HorizontalExpand="True"/>
</BoxContainer>

<BoxContainer Orientation="Horizontal" SeparationOverride="4">
<Button Name="BtnSign" Text="+/-" HorizontalExpand="True"/>
<Button Name="Btn0" Text="0" HorizontalExpand="True"/>
<Button Name="BtnDot" Text="." HorizontalExpand="True"/>
<Button Name="BtnEq" Text="=" HorizontalExpand="True"/>
</BoxContainer>
</BoxContainer>
</controls:BasicCalculatorWindow>
Loading
Loading