using Godot; using System; using System.Collections.Generic; using System.Linq; public partial class Actor : Node { public bool _available, _hovered, _selected; public CollisionShape2D _startArea; public List _cues = new(); public Cue _selectedCue = null; public List _balls = new(); public List _ballBag = new(); public Ball _hoveredBall = null; public Ball _selectedBall = null; public Ball _heldBall = null; public Sprite2D _tempBallSprite = new(); public static Actor Create(string SCENENAME) { PackedScene scene = ResourceLoader.Load("res://Gameplay/" + SCENENAME + ".tscn"); Actor newActor = scene.Instantiate(); return newActor; } public override void _Ready() { Ball newBall = Ball.Create("ball", 0); _balls.Add(newBall); newBall = Ball.Create("ball", 1); _balls.Add(newBall); Cue newCue = Cue.Create("cue"); AddChild(newCue); _cues.Add(newCue); for (int i = 0; i < _cues.Count; i++) { _cues[i].Shoot += OnCueShoot; } _ballBag = new(_balls); } public override void _Process(double DELTA_) { if (_ballBag.Count > 0) { if (_heldBall == null) { _heldBall = _ballBag[0]; } else if (Input.IsActionJustPressed("scroll_up")) { _heldBall = _ballBag[(_ballBag.IndexOf(_heldBall) + 1) % _ballBag.Count]; } else if (Input.IsActionJustPressed("scroll_down")) { _heldBall = _ballBag[(_ballBag.IndexOf(_heldBall) - 1) < 0 ? ^1 : (_ballBag.IndexOf(_heldBall) - 1)]; } Vector2 mousePosition = GetViewport().GetMousePosition(); if (_tempBallSprite.Texture == null) { if (GetChildren().All(n => n != _tempBallSprite)) { AddChild(_tempBallSprite); } _tempBallSprite.Texture = _heldBall.GetNode("Image").Texture; } if (_startArea == null) { _startArea = Globals.Instance._currentBattle.GetNode("Table").GetNode("PlayerStartArea").GetNode("CollisionShape2D"); } _tempBallSprite.Position = new Vector2(Math.Min(Math.Max(mousePosition.X, _startArea.GlobalPosition.X - ((RectangleShape2D)(_startArea.Shape)).Size.X / 2), _startArea.GlobalPosition.X + ((RectangleShape2D)(_startArea.Shape)).Size.X / 2), Math.Min(Math.Max(mousePosition.Y, _startArea.GlobalPosition.Y - ((RectangleShape2D)(_startArea.Shape)).Size.Y / 2), _startArea.GlobalPosition.Y + ((RectangleShape2D)(_startArea.Shape)).Size.Y / 2)); if (Input.IsActionJustReleased("left_click")) { _heldBall.Place(_tempBallSprite.Position); AddChild(_heldBall); int ballIndex = _ballBag.IndexOf(_heldBall); _ballBag.Remove(_heldBall); _tempBallSprite.Texture = null; if (_ballBag.Count > 0) { _heldBall = _ballBag[ballIndex - (ballIndex > _ballBag.Count ? 1 : 0)]; } } } else { if (_balls.Any(b => b._hovered)) { _hoveredBall = _balls.Single(b => b._hovered); } else { _hoveredBall = null; } if (_selectedCue == null && _cues.Count > 0) { _selectedCue = _cues[0]; } if ((_selectedBall == null || _selectedBall != _hoveredBall) && (_hoveredBall?._available ?? false)) { if (Input.IsActionJustReleased("left_click")) { _selectedBall = _hoveredBall; _selectedBall._selected = true; _selectedCue.Don(_selectedBall); } } else if (Input.IsActionJustReleased("right_click")) { _selectedBall._selected = false; _selectedBall = null; _selectedCue.Doff(); } else if (_hoveredBall == null) { if (Input.IsActionJustReleased("left_click") && _selectedBall != null && _selectedCue._power == 0) { _selectedBall._selected = false; _selectedBall = null; _selectedCue.Doff(); } } } } //public void ResetCueBall() //{ //_cueBall = Ball.Create("ball", 0, _startPosition); //_cueBall.SetName("CueBall"); //AddChild(_cueBall); //Texture2D image = GD.Load("res://art/cue_ball.png"); //_cueBall.GetNode("Image").Texture = image; //_cueBall._placed = true; //_balls = GetTree().GetNodesInGroup("balls").Select(b => (Ball)b).ToList(); //} private void OnCueShoot(Vector2 IMPULSE) { if (_selectedBall != null && _selectedBall._placed) { _selectedBall.ApplyCentralImpulse(IMPULSE); _selectedBall._selected = false; _selectedBall = null; _selectedCue.Doff(); } } }