using Godot; using System; using System.Collections.Generic; using System.Linq; public partial class Manager : Node { public bool _dead, _ready; public int _health, _healthMax; public Cue _cue; public Worker _lead; public List _team = new(); public Worker _hoveredWorker = null; public Worker _selectedWorker = null; public Worker _heldWorker = null; public ManagerPanel _managerPanel = null; public Panel _ballReturn = null; // public static Manager _Create() // { // PackedScene scene = ResourceLoader.Load("res://Gameplay/manager.tscn"); // Manager newManager = scene.Instantiate(); // Worker newWorker = Worker._Create(); // newWorker.GetNode("Ball").SetSprite("res://art/cue_ball.png"); // newWorker.GetNode("TempBall").SetSprite("res://art/cue_ball.png"); // newManager._lead = newWorker; // newManager._team.Add(newWorker); // newManager.AddChild(newWorker); // return newManager; // } public override void _Ready() { _managerPanel = GetNode("Panel"); _ballReturn = _managerPanel.GetNode("BallReturn"); _health = 10; _healthMax = _health; _managerPanel.SetSprite("res://art/ness.png"); _managerPanel.SetMax(_healthMax); _managerPanel.SetValue(_health); _cue = GetNode("Cue"); } public override void _Process(double DELTA_) { // Panel ballReturn = GetNode("Panel").GetNode("BallReturn"); // WORKER.ChangeBallPosition(new Vector2(ballReturn.GlobalPosition.X + ballReturn.Size.X / 2, ballReturn.GlobalPosition.Y + 50)); if (_team.Any(w => w._hovered)) { _hoveredWorker = _team.Single(w => w._hovered); } else { _hoveredWorker = null; } if (_ready) { if ((_selectedWorker == null || _selectedWorker != _hoveredWorker) && (_hoveredWorker?._available ?? false)) { if (Input.IsActionJustReleased("left_click")) { _selectedWorker = _hoveredWorker; _selectedWorker._selected = true; GD.Print(_selectedWorker._ball); _cue.Don(_selectedWorker._ball.Position); } } else if (Input.IsActionJustReleased("right_click")) { _selectedWorker._selected = false; _selectedWorker = null; _cue.Doff(); } else if (_hoveredWorker == null) { if (Input.IsActionJustReleased("left_click") && _selectedWorker != null && _cue._power == 0) { _selectedWorker._selected = false; _selectedWorker = null; _cue.Doff(); } } } else { if (_heldWorker == null) { if (Input.IsActionJustReleased("left_click")) { if (!_hoveredWorker._placed) { _heldWorker = _hoveredWorker; } } } else { Vector2 mousePosition = GetViewport().GetMousePosition(); _heldWorker._tempBall.Position = mousePosition; if (Input.IsActionJustReleased("left_click")) { _heldWorker.PlaceBall(mousePosition); _heldWorker = null; if (_team.Where(w => w._placed).ToList().Count >= _team.Count) { _ready = true; } } } } } public void ChangeHealth(int CHANGE) { _health += CHANGE; GD.Print("Health: " + _health); _health = Math.Min(_health, _healthMax); if (_health < 0) { _dead = true; _health = 0; } GetNode("Panel").SetValue(_health); } // public void ReturnWorker(Worker WORKER) // { // Panel ballReturn = GetNode("Panel").GetNode("BallReturn"); // int ballsInReturn = _team.Where(b => !b._placed).ToList().Count; // WORKER.GetNode("Ball").Position = ; // WORKER.GetNode("Ball").GetNode("Bounds").Disabled = true; // AddChild(WORKER); // } public void SetSprite(string PATH) { GetNode("Image").Texture = GD.Load(PATH); } public void Start() { for (int i = 0; i < _team.Count; i++) { _team[i]._tempBall.Position = new Vector2(_ballReturn.GlobalPosition.X + _ballReturn.Size.X / 2, _ballReturn.GlobalPosition.Y + 50 * (i + 1)); _team[i].TempBallShow(); } } private void OnCueShoot(Vector2 IMPULSE) { if (_selectedWorker != null && _selectedWorker._placed) { _selectedWorker.GetNode("Ball").ApplyCentralImpulse(IMPULSE); _selectedWorker._selected = false; _selectedWorker.Launch(); _selectedWorker = null; _cue.Doff(); } } }