diff --git a/Scenes/Main/MiracleButton.cs b/Scenes/Main/MiracleButton.cs index 2f9edad..e48cf5f 100644 --- a/Scenes/Main/MiracleButton.cs +++ b/Scenes/Main/MiracleButton.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; +using System.Linq; using Godot; using ParasiticGod.Scripts.Core; using ParasiticGod.Scripts.Singletons; @@ -27,11 +29,19 @@ public partial class MiracleButton : Button } Pressed += OnPressed; + + GameBus.Instance.StateChanged += UpdateAvailability; + UpdateAvailability(GameBus.Instance.CurrentState); } public override void _ExitTree() { Pressed -= OnPressed; + + if (GameBus.Instance != null) + { + GameBus.Instance.StateChanged -= UpdateAvailability; + } } private void OnPressed() @@ -43,23 +53,76 @@ public partial class MiracleButton : Button public void SetMiracle(MiracleDefinition miracle) { _miracle = miracle; - Text = BuildText(); - TooltipText = BuildTooltipText(); } public MiracleDefinition GetMiracle() { return _miracle; } + /// + /// Checks the miracle's requirements against the current game state + /// and updates the button's disabled status and tooltip. + /// + private void UpdateAvailability(GameState state) + { + if (_miracle == null) return; + + var missingRequirements = new List(); + + if (state.Get(Stat.Faith) < _miracle.FaithCost) + { + missingRequirements.Add($"Not enough Faith ({state.Get(Stat.Faith):F0} / {_miracle.FaithCost})"); + } + if (state.Get(Stat.Followers) < _miracle.FollowersRequired) + { + missingRequirements.Add($"Not enough Followers ({(long)state.Get(Stat.Followers)} / {_miracle.FollowersRequired})"); + } + if (state.Get(Stat.Production) < _miracle.ProductionRequired) + { + missingRequirements.Add($"Not enough Production ({state.Get(Stat.Production):F0} / {_miracle.ProductionRequired})"); + } + + if (missingRequirements.Any()) + { + Disabled = true; + TooltipText = string.Join("\n", missingRequirements); + } + else + { + Disabled = false; + TooltipText = BuildTooltipText(); + } + } + private string BuildText() { - return $"{_miracle.Name}\nCost: {_miracle.FaithCost} Faith"; + string costText; + if (_miracle.ProductionRequired > 0 && _miracle.FaithCost <= 0) + { + costText = $"Cost: {_miracle.ProductionRequired:F0} Prod"; + } + else + { + costText = $"Cost: {_miracle.FaithCost:F0} Faith"; + } + + return $"{_miracle.Name}\n{costText}"; } private string BuildTooltipText() { - var tooltip = $"Cost: {_miracle.FaithCost} Faith\nRequires: {_miracle.FollowersRequired} Followers\nEffects:\n"; + var tooltip = ""; + + if (_miracle.FaithCost > 0) + tooltip += $"Cost: {_miracle.FaithCost:F0} Faith\n"; + if (_miracle.ProductionRequired > 0) + tooltip += $"Cost: {_miracle.ProductionRequired:F0} Production\n"; + if (_miracle.FollowersRequired > 0) + tooltip += $"Requires: {_miracle.FollowersRequired} Followers\n"; + + tooltip += "\nEffects:\n"; + foreach (var effect in _miracle.Effects) { - if (effect.ToString() == string.Empty) continue; + if (string.IsNullOrEmpty(effect.ToString())) continue; tooltip += $"- {effect}\n"; } return tooltip.TrimEnd();