using System; using Content.Shared.Disposal; using Content.Shared.Disposal.Components; using Robust.Client.AutoGenerated; using Robust.Client.Graphics; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; using Robust.Shared.IoC; using Robust.Shared.Maths; using Robust.Shared.Timing; using static Content.Shared.Disposal.Components.SharedDisposalUnitComponent; namespace Content.Client.Disposal.UI { /// /// Client-side UI used to control a /// [GenerateTypedNameReferences] public partial class DisposalUnitWindow : SS14Window { public Button Engage => EngageProtected; public Button Eject => EjectProtected; public Button Power => PowerProtected; public DisposalUnitWindow() { IoCManager.InjectDependencies(this); RobustXamlLoader.Load(this); } private void UpdatePressureBar(float pressure) { PressureBar.Value = pressure; var normalized = pressure / PressureBar.MaxValue; const float leftHue = 0.0f; // Red const float middleHue = 0.066f; // Orange const float rightHue = 0.33f; // Green const float saturation = 1.0f; // Uniform saturation const float value = 0.8f; // Uniform value / brightness const float alpha = 1.0f; // Uniform alpha // These should add up to 1.0 or your transition won't be smooth const float leftSideSize = 0.5f; // Fraction of _chargeBar lerped from leftHue to middleHue const float rightSideSize = 0.5f; // Fraction of _chargeBar lerped from middleHue to rightHue float finalHue; if (normalized <= leftSideSize) { normalized /= leftSideSize; // Adjust range to 0.0 to 1.0 finalHue = MathHelper.Lerp(leftHue, middleHue, normalized); } else { normalized = (normalized - leftSideSize) / rightSideSize; // Adjust range to 0.0 to 1.0. finalHue = MathHelper.Lerp(middleHue, rightHue, normalized); } // Check if null first to avoid repeatedly creating this. PressureBar.ForegroundStyleBoxOverride ??= new StyleBoxFlat(); var foregroundStyleBoxOverride = (StyleBoxFlat) PressureBar.ForegroundStyleBoxOverride; foregroundStyleBoxOverride.BackgroundColor = Color.FromHsv(new Vector4(finalHue, saturation, value, alpha)); } /// /// Update the interface state for the disposals window. /// /// true if we should stop updating every frame. public bool UpdateState(DisposalUnitBoundUserInterfaceState state) { var currentTime = IoCManager.Resolve().CurTime; var fullTime = state.FullPressureTime; var pressure = (float) Math.Min(1.0f, 1.0f - (fullTime.TotalSeconds - currentTime.TotalSeconds) * SharedDisposalUnitSystem.PressurePerSecond); Title = state.UnitName; UnitState.Text = state.UnitState; UpdatePressureBar(pressure); Power.Pressed = state.Powered; Engage.Pressed = state.Engaged; return !state.Powered || pressure >= 1.0f; } } }