115 lines
3.3 KiB
C#
115 lines
3.3 KiB
C#
using Godot;
|
|
using MaxEffort.Code.Core;
|
|
using MaxEffort.Code.Data;
|
|
|
|
namespace MaxEffort.Code.Systems;
|
|
|
|
[GlobalClass]
|
|
public partial class HazardController : Node2D
|
|
{
|
|
[Export] private AnimatedSprite2D _animSprite;
|
|
[Export] private Area2D _clickArea;
|
|
[Export] private CollisionShape2D _clickShape; // Reference to resize it
|
|
[Export] private Label _nameLabel; // Can still use UI nodes inside Node2D
|
|
|
|
private HazardDef _data;
|
|
private float _timeActive = 0f;
|
|
private bool _isResolved = false;
|
|
private int _currentHealth = 1;
|
|
|
|
public void Initialize(HazardDef data)
|
|
{
|
|
_data = data;
|
|
_currentHealth = data.ClicksToResolve;
|
|
|
|
if (_animSprite != null && data.Animations != null)
|
|
{
|
|
_animSprite.SpriteFrames = data.Animations;
|
|
|
|
var texture = data.Animations.GetFrameTexture(data.IdleAnimName, 0);
|
|
if (texture != null && _clickShape != null)
|
|
{
|
|
var rect = new RectangleShape2D();
|
|
rect.Size = texture.GetSize();
|
|
_clickShape.Shape = rect;
|
|
}
|
|
|
|
_animSprite.Play(data.IdleAnimName);
|
|
}
|
|
|
|
if (_nameLabel != null) _nameLabel.Text = data.DisplayName;
|
|
|
|
if (_clickArea != null)
|
|
{
|
|
_clickArea.InputEvent += OnInputEvent;
|
|
}
|
|
|
|
Scale = Vector2.Zero;
|
|
var tween = CreateTween();
|
|
tween.SetTrans(Tween.TransitionType.Back).SetEase(Tween.EaseType.Out);
|
|
tween.TweenProperty(this, "scale", Vector2.One, 0.4f);
|
|
|
|
if (!string.IsNullOrEmpty(data.WalkAnimName))
|
|
{
|
|
_animSprite?.Play(data.WalkAnimName);
|
|
tween.TweenCallback(Callable.From(() => _animSprite?.Play(data.IdleAnimName)));
|
|
}
|
|
}
|
|
|
|
public override void _Process(double delta)
|
|
{
|
|
if (_isResolved) return;
|
|
_timeActive += (float)delta;
|
|
|
|
if (_timeActive >= _data.TimeToFail)
|
|
{
|
|
EventBus.PublishLiftCompleted(false);
|
|
QueueFree();
|
|
}
|
|
}
|
|
|
|
public override void _ExitTree()
|
|
{
|
|
if (_clickArea != null) _clickArea.InputEvent -= OnInputEvent;
|
|
}
|
|
|
|
private void OnInputEvent(Node viewport, InputEvent @event, long shapeIdx)
|
|
{
|
|
if (_isResolved) return;
|
|
|
|
if (@event is InputEventMouseButton mouseEvent && mouseEvent.Pressed && mouseEvent.ButtonIndex == MouseButton.Left)
|
|
{
|
|
TakeDamage();
|
|
}
|
|
}
|
|
|
|
private void TakeDamage()
|
|
{
|
|
_currentHealth--;
|
|
|
|
var tween = CreateTween();
|
|
tween.TweenProperty(this, "scale", new Vector2(1.2f, 0.8f), 0.05f);
|
|
tween.TweenProperty(this, "scale", Vector2.One, 0.05f);
|
|
|
|
if (_animSprite != null)
|
|
{
|
|
_animSprite.Modulate = Colors.Red;
|
|
tween.Parallel().TweenProperty(_animSprite, "modulate", Colors.White, 0.1f);
|
|
}
|
|
|
|
if (_currentHealth <= 0)
|
|
{
|
|
Resolve();
|
|
}
|
|
}
|
|
|
|
private void Resolve()
|
|
{
|
|
_isResolved = true;
|
|
EventBus.PublishHazardResolved(_data.Type);
|
|
|
|
var tween = CreateTween();
|
|
tween.TweenProperty(this, "scale", Vector2.Zero, 0.2f);
|
|
tween.TweenCallback(Callable.From(QueueFree));
|
|
}
|
|
} |