using Godot; using System; using Gamesmiths.Forge.Core; using Gamesmiths.Forge.Cues; using Gamesmiths.Forge.Godot.Core; using Gamesmiths.Forge.Tags; using Movementtests.interfaces; using Movementtests.tools; [GlobalClass, Icon("res://assets/ui/IconGodotNode/control/icon_text_panel.png")] public partial class PlayerUi : Control, ICueHandler { private TextureRect _enemyTarget = null!; private Healthbar _healthbar = null!; private Healthbar _manabar = null!; public enum TargetState { NoTarget, TargetWouldNotKill, TargetWouldKill } public record TargetProperties(TargetState State, Vector2 Position); [Export] public Color WouldKillColor { get; set; } = new Color("009c8f"); [Export] public Color WouldNotKillColor { get; set; } = new Color("fc001c"); public override void _Ready() { _enemyTarget = GetNode("%EnemyTarget"); _healthbar = GetNode("%Healthbar"); _manabar = GetNode("%Manabar"); var tagsManager = ForgeManagers.Instance.TagsManager; var cuesManager = ForgeManagers.Instance.CuesManager; cuesManager.RegisterCue(Tag.RequestTag(tagsManager, "cues.resources.mana"), this); } public void Initialize(float initialHealth, float initialMana) { _healthbar.Initialize(initialHealth); _manabar.Initialize(initialMana); } public void SetEnemyTargetProperties(TargetProperties targetProperties) { var (state, position) = targetProperties; var visible = state != TargetState.NoTarget; var modulation = state switch { TargetState.TargetWouldNotKill => WouldNotKillColor, TargetState.TargetWouldKill => WouldKillColor, _ => WouldNotKillColor }; _enemyTarget.SetVisible(visible); _enemyTarget.SetPosition(position - _enemyTarget.Size / 2); _enemyTarget.SetModulate(modulation); } public void OnHealthChanged(IHealthable healthable, HealthChangedRecord healthChanged) { _healthbar.CurrentHealth = healthChanged.CurrentHealth; } public void OnManaChanged(float newValue) { _manabar.CurrentHealth = newValue; } public void OnExecute(IForgeEntity? target, CueParameters? parameters) { if (target == null || !parameters.HasValue || !IsInstanceValid(_manabar)) return; float magnitude = parameters.Value.Magnitude; _manabar.CurrentHealth += magnitude; } public void OnApply(IForgeEntity? target, CueParameters? parameters) { } public void OnRemove(IForgeEntity? target, bool interrupted) { } public void OnUpdate(IForgeEntity? target, CueParameters? parameters) { } }