using Godot; using System; using System.Runtime; /// TODO create a few types of balls public partial class Ball : RigidBody2D { [Signal] public delegate void OnHoverEventHandler(Ball THIS, bool HOVERED); [Signal] public delegate void OnCollisionEventHandler(Ball THIS, Ball TARGET); [Signal] public delegate void OnLaunchEventHandler(Ball THIS); [Signal] public delegate void OnMovementEventHandler(Ball THIS, bool MOVING); public bool _active = false, _placed = false, _potted = false, _available = false, _hovered = false, _selected = false, _aimed = false, _launched = false, _moving = false, _isCue = false; public float _moveThreshold = 5.0f; public string _imagePath = null; public Vector2I _rackPosition = new Vector2I(0, 0); public Manager _owner = null; public override void _Process(double DELTA_) { if (LinearVelocity.Length() > 0 && LinearVelocity.Length() < _moveThreshold) { Sleeping = true; if (_moving) { ProcessOnStop(); _moving = false; EmitSignal(SignalName.OnMovement, this, false); if (_launched) { _launched = false; } } } else if (LinearVelocity.Length() >= _moveThreshold) { ProcessOnMovement(); if (!_moving) { _moving = true; EmitSignal(SignalName.OnMovement, this, true); } } } public void Launch() { ProcessOnLaunch(); } public void Pot() { Sleeping = true; _active = false; _placed = false; _potted = true; _moving = false; } public void SetSprite(string PATH) { _imagePath = PATH; GetNode("Image").Texture = GD.Load(PATH); } private void OnBodyEntered(Node2D TARGET) { if (TARGET is Ball) { Ball target = (Ball)TARGET; ProcessOnCollision(target); } } private void OnMouseEntered() { if (_active) { _hovered = true; EmitSignal(SignalName.OnHover, this, true); } } private void OnMouseExited() { if (_active) { _hovered = false; EmitSignal(SignalName.OnHover, this, false); } } //Processes // public virtual void ProcessOnAdd() // { // } // public virtual void ProcessOnBattleStart() // { // } // public virtual void ProcessOnBattleEnd() // { // } public virtual void ProcessOnCollision(Ball TARGET) { EmitSignal(SignalName.OnCollision, this, TARGET); } // public virtual void ProcessOnCreation() // { // } // public virtual void ProcessOnCritical() // { // } // public virtual void ProcessOnDeath() // { // } // public virtual void ProcessOnDefend() // { // } // public virtual void ProcessOnExpiration() // { // } public virtual void ProcessOnLaunch() { _launched = true; EmitSignal(SignalName.OnLaunch, this); } public virtual void ProcessOnMovement() { } // public virtual void ProcessOnRemove() // { // } // public virtual void ProcessOnSell() // { // } public virtual void ProcessOnStop() { } // public virtual void ProcessOnTurnEnd() // { // } // public virtual void ProcessOnTurnStart() // { // } }