using Godot; using System; using System.Collections.Generic; using System.Linq; public partial class Tchotchke : StaticBody2D { public bool _hovered = false, _held = false; public List _actions = new(); public Node _target; public override void _Ready() { MouseEntered += OnMouseEntered; MouseExited += OnMouseExited; } public override void _Process(double DELTA_) { if (_held) { GlobalPosition = GetGlobalMousePosition(); if (Input.IsActionJustReleased("left_click")) { Transform2D newTransform = GlobalTransform; newTransform.Origin = Position; GlobalTransform = newTransform; Drop(); } } else { if (_hovered) { if (Input.IsActionJustPressed("left_click")) { Hold(); } if (Input.IsActionJustPressed("scroll_up")) { Rotation -= 1.0f * (float)(Math.PI) / 180.0f; } if (Input.IsActionJustPressed("scroll_down")) { Rotation += 1.0f * (float)(Math.PI) / 180.0f; } } } } public void Drop() { if (_held) { _held = false; } } public void FireActions(Trigger.On TRIGGER, Node TARGET = null) { List triggeredActions = _actions.Where(e => e._triggers.IndexOf(TRIGGER) > -1).ToList(); for (int i = 0; i < triggeredActions.Count; i++) { triggeredActions[i].Target(TARGET); triggeredActions[i].Fire(); } List expiredActions = _actions.Where(e => e._triggers.IndexOf(TRIGGER) > -1).ToList(); _actions.Except(expiredActions); } public void Hold() { if (_held) { return; } _held = true; } // PRIVATE METHODS private void OnMouseEntered() { _hovered = true; } private void OnMouseExited() { _hovered = false; } }