Files
MovementTests/scenes/player_controller/PlayerUi.cs
2026-05-02 11:19:56 +02:00

84 lines
2.3 KiB
C#

using Godot;
using System;
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Gamesmiths.Forge.Attributes;
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"), Meta(typeof(IAutoNode))]
public partial class PlayerUi : Control
{
public override void _Notification(int what) => this.Notify(what);
[Dependency]
public TagsManager TagsManager => this.DependOn<TagsManager>();
[Dependency]
public CuesManager CuesManager => this.DependOn<CuesManager>();
#region Utils
public enum TargetState
{
NoTarget,
TargetWouldNotKill,
TargetWouldKill
}
public record TargetProperties(TargetState State, Vector2 Position);
#endregion
#region Nodes
[Node] public required TextureRect EnemyTarget { get; set; }
[Node] public required ResourceBar Healthbar { get; set; }
[Node] public required ResourceBar Manabar { get; set; }
#endregion
#region Exports
[Export]
public Color WouldKillColor { get; set; } = new Color("009c8f");
[Export]
public Color WouldNotKillColor { get; set; } = new Color("fc001c");
#endregion
private EntityAttribute? _health;
private EntityAttribute? _mana;
public void Init(EntityAttribute health, EntityAttribute mana)
{
_health = health;
_mana = mana;
}
public void OnResolved()
{
if (_health == null || _mana == null) throw new Exception("Health and mana attributes are not set");
Healthbar.Init(_health);
Manabar.Init(_mana);
}
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);
}
}