From 3aacbed784a0c3f15b907ae4513ccb4960719fa5 Mon Sep 17 00:00:00 2001 From: ntr Date: Tue, 15 Aug 2023 18:42:40 +1000 Subject: [PATCH] boost bar and cds --- Assets/Src/PowerUnit.cs | 28 ++++++---- Assets/Src/ShipControls.cs | 2 - Assets/Src/UI/BoostBar.cs | 96 ++++++++++++++++++++++++++++++++++ Assets/Src/UI/BoostBar.cs.meta | 11 ++++ Assets/Src/UI/Controls.uxml | 5 +- Assets/Src/UI/ControlsUI.cs | 12 +++-- TODO.md | 5 +- 7 files changed, 141 insertions(+), 18 deletions(-) create mode 100644 Assets/Src/UI/BoostBar.cs create mode 100644 Assets/Src/UI/BoostBar.cs.meta diff --git a/Assets/Src/PowerUnit.cs b/Assets/Src/PowerUnit.cs index ac9e554..5d541f2 100644 --- a/Assets/Src/PowerUnit.cs +++ b/Assets/Src/PowerUnit.cs @@ -46,11 +46,12 @@ public class PowerUnit { List<(Output output, double expiresAt)> boostActive = new(); static double boostFullChargeSeconds = 10f; static double boostDurationSeconds = 2f; - double boostMax = 2f * boostDurationSeconds; - double boostAvailable = 0f; // in seconds + double boostMax = 2f * boostDurationSeconds; + double boostProgress = 0f; + double boostAvailable = 0f; - public string BoostAvailable => $"{boostAvailable / 2f:0.0}"; - // public string BoostAvailable => $"{((boostAvailable / boostMax) * 100f):0}"; + public double BoostProgress => boostProgress / boostMax; + public int BoostCharges => (int)(boostMax / boostDurationSeconds); public float Acceleration => acceleration + boostActive.Count(b => b.output == Output.Acceleration) * baseOutput; @@ -69,18 +70,21 @@ public class PowerUnit { strafing = initialStrafing; boostActive = new(); - boostAvailable = 0f; + boostProgress = 0f; - shieldMax = initialShieldMax ; + shieldMax = initialShieldMax; shieldCurrent = initialShieldMax; } public void Deploy(Output output) { - if (boostAvailable < boostDurationSeconds * (boostActive.Count + 1)) return; + if (boostAvailable < boostDurationSeconds) return; boostActive.Add((output, Time.timeAsDouble + boostDurationSeconds)); + boostAvailable -= boostDurationSeconds; } public void Tick() { + if (boostProgress <= 0f) boostActive.Clear(); + // remove expired boosts boostActive = boostActive.Where(b => b.expiresAt > Time.timeAsDouble).ToList(); @@ -91,8 +95,14 @@ public class PowerUnit { int count => count * Time.fixedDeltaTime * -1f, }; - double next = Math.Min(boostAvailable + delta, boostMax); - boostAvailable = Math.Max(0f, next); + // boost available gets dragged up by the clock + // when the delta is positive + // which can only happen when there are no active boosts + // check it vvvv + // Debug.Log($"Progress={boostProgress} actualAvailability={boostAvailable}"); + double next = Math.Min(boostProgress + delta, boostMax); + boostProgress = Math.Max(0f, next); + if (delta > 0f) boostAvailable = boostProgress; shieldMax = initialShieldMax + boostActive.Count(b => b.output == Output.Shield) * 1000f; shieldCurrent = Math.Min(shieldCurrent + ShieldRegen, shieldMax); diff --git a/Assets/Src/ShipControls.cs b/Assets/Src/ShipControls.cs index f82a7f8..9b77272 100755 --- a/Assets/Src/ShipControls.cs +++ b/Assets/Src/ShipControls.cs @@ -27,8 +27,6 @@ public class ShipControls : MonoBehaviour { float clampAngle = 90.0f; public PowerUnit powerUnit = new(); - int boostDurationSeconds = 2; - int boostCooldownSeconds = 5; void Start() { Cursor.lockState = CursorLockMode.Locked; diff --git a/Assets/Src/UI/BoostBar.cs b/Assets/Src/UI/BoostBar.cs new file mode 100644 index 0000000..95a771d --- /dev/null +++ b/Assets/Src/UI/BoostBar.cs @@ -0,0 +1,96 @@ +using System; + +using Unity.Collections; +using UnityEngine; +using UnityEngine.UIElements; + +namespace BoostComponents { + public class BoostBar : VisualElement { + // Need this uxml traits and factory for it to show up in editor + public new class UxmlTraits : VisualElement.UxmlTraits { + UxmlDoubleAttributeDescription m_ProgressAttribute = new UxmlDoubleAttributeDescription() { + name = "progress" + }; + + UxmlIntAttributeDescription m_ChargesAttribute = new UxmlIntAttributeDescription() { + name = "charges" + }; + + public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc) { + base.Init(ve, bag, cc); + (ve as BoostBar).progress = m_ProgressAttribute.GetValueFromBag(bag, cc); + (ve as BoostBar).charges = m_ChargesAttribute.GetValueFromBag(bag, cc); + } + } + + public new class UxmlFactory : UxmlFactory { } + + public static readonly string ussClassName = "boostBar"; + public static readonly string ussLabelClassName = "boostBar"; + + double m_Progress = 0f; + int m_Charges = 2; + + Color strokeColor = Color.white; + + public double progress { + get => m_Progress; + set { + m_Progress = value; + MarkDirtyRepaint(); + } + } + + public int charges { + get => m_Charges; + set { + m_Charges = value; + MarkDirtyRepaint(); + } + } + + public BoostBar() { + AddToClassList(ussClassName); + RegisterCallback(evt => CustomStylesResolved(evt)); + generateVisualContent += GenerateVisualContent; + } + + static void CustomStylesResolved(CustomStyleResolvedEvent evt) { + BoostBar element = (BoostBar)evt.currentTarget; + element.UpdateCustomStyles(); + } + + void UpdateCustomStyles() { + MarkDirtyRepaint(); + } + + void GenerateVisualContent(MeshGenerationContext context) { + float width = contentRect.width; + float height = contentRect.height; + + double length = width * m_Progress; + + Vector2 left = new Vector2(0f, height / 2); + Vector2 end = new Vector2((float)length, height / 2); + + var painter = context.painter2D; + painter.lineWidth = 4.0f; + painter.lineCap = LineCap.Butt; + painter.strokeColor = strokeColor; + + painter.BeginPath(); + painter.MoveTo(left); + painter.LineTo(end); + painter.Stroke(); + + float chevGap = width / charges; + + for (int i = 0; i < charges + 1; i++) { + painter.BeginPath(); + painter.MoveTo(new Vector2(i * chevGap, height)); + painter.LineTo(new Vector2(i * chevGap, 0f)); + painter.Stroke(); + } + } + } +} diff --git a/Assets/Src/UI/BoostBar.cs.meta b/Assets/Src/UI/BoostBar.cs.meta new file mode 100644 index 0000000..1874c86 --- /dev/null +++ b/Assets/Src/UI/BoostBar.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4bc4f30c8e6df2a739c0909bbb9e1c7d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Src/UI/Controls.uxml b/Assets/Src/UI/Controls.uxml index bf1b04a..6a4de04 100644 --- a/Assets/Src/UI/Controls.uxml +++ b/Assets/Src/UI/Controls.uxml @@ -11,9 +11,8 @@ - - - + + diff --git a/Assets/Src/UI/ControlsUI.cs b/Assets/Src/UI/ControlsUI.cs index ae81994..ebc62e4 100644 --- a/Assets/Src/UI/ControlsUI.cs +++ b/Assets/Src/UI/ControlsUI.cs @@ -5,6 +5,8 @@ using System.Linq; using UnityEngine; using UnityEngine.UIElements; +using BoostComponents; + public class ControlsUI : MonoBehaviour { [SerializeField] ShipControls ship; @@ -12,12 +14,13 @@ public class ControlsUI : MonoBehaviour { UIDocument uiDocument; Label speed; Label shields; - Label boosts; Label puAccel; Label puDecel; Label puStrafe; Label puShield; + BoostBar boostBar; + void OnEnable() { Init(); } @@ -28,11 +31,12 @@ public class ControlsUI : MonoBehaviour { shields = uiDocument.rootVisualElement.Q