diff --git a/Gameplay/Actions/Caffeinate.cs b/Gameplay/Actions/Caffeinate.cs index 23b6add..2b74a9f 100644 --- a/Gameplay/Actions/Caffeinate.cs +++ b/Gameplay/Actions/Caffeinate.cs @@ -17,7 +17,7 @@ public partial class Caffeinate : Action Worker target = (Worker)_target; if (!target.HasCondition(GetType().ToString())) { - target._conditions.Add(new Caffeinated(target)); + target._conditions.AddChild(new Caffeinated(target)); } } _target = null; diff --git a/Gameplay/Conditions/Caffeinated.cs b/Gameplay/Conditions/Caffeinated.cs index 10b1b7d..a1ea63e 100644 --- a/Gameplay/Conditions/Caffeinated.cs +++ b/Gameplay/Conditions/Caffeinated.cs @@ -11,26 +11,20 @@ public partial class Caffeinated : Condition _timer.WaitTime = _countdown; _timer.Autostart = true; AddChild(_timer); - // GetNode("Timer").Timeout += Fire; - if (OWNER is Worker) + _timer.Timeout += Fire; + if (_owner is Worker) { - ((Worker)OWNER)._staminaCanDrain = false; + ((Worker)_owner)._agility._effective += 3; } } public override void Fire() { _expired = true; - if (_target != null) + if (_owner is Worker) { - if (_target is Worker) - { - Worker target = (Worker)_target; - target._stamina -= 1; - target._staminaCanDrain = true; - target._conditions.Remove(this); - } - _target = null; + ((Worker)_owner)._agility._effective -= 3; + ((Worker)_owner)._conditions.RemoveChild(this); } } } diff --git a/Gameplay/Globals.cs b/Gameplay/Globals.cs index 6ddc03b..3800164 100644 --- a/Gameplay/Globals.cs +++ b/Gameplay/Globals.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; public partial class Globals : Node { public static Globals Instance; + public bool _battleRunning = false; public Viewport _viewport; public Vector2 _screenSize; public Vector2 _screenCenter; diff --git a/Gameplay/Main.cs b/Gameplay/Main.cs index 9e269af..d0e60a7 100644 --- a/Gameplay/Main.cs +++ b/Gameplay/Main.cs @@ -17,12 +17,16 @@ public partial class Main : Node _currentBattle.Start(); } - public override void _Process(double DELTA_) - { + public override void _Process(double DELTA_) + { if (Input.IsActionJustReleased("quit_game")) { GetTree().Quit(); } + if (Input.IsActionJustPressed("space")) + { + Globals.Instance._battleRunning = !Globals.Instance._battleRunning; + } } } diff --git a/Gameplay/Manager.cs b/Gameplay/Manager.cs index e17326c..a5dde84 100644 --- a/Gameplay/Manager.cs +++ b/Gameplay/Manager.cs @@ -4,19 +4,22 @@ using System.Collections.Generic; using System.Linq; /// TODO alter code to player vs computer to account for differing logic -public partial class Manager : Node +public partial class Manager : Node2D { public bool _dead, _ready; - public int _ballsMoving = 0, _health = 10, _healthMax; + public int _ballsMoving = 0, _health = 10, _healthMax, _speed = 5; public string _imagePath; public CollisionShape2D _startArea; public ManagerPanel _managerPanel = null; public Manager _opponent; public List _workers = new(); + public Worker _hoveredWorker, _selectedWorker, _heldWorker; + public Node _workerNode; public List _tchotckes = new(); public override void _Ready() { + _workerNode = GetNode("Workers"); _healthMax = _health; SetSprite("res://art/ness.png"); @@ -26,15 +29,27 @@ public partial class Manager : Node _managerPanel.SetManager(this); Worker newWorker = Globals.Instance._workerScene.Instantiate(); - newWorker.Position = Globals.Instance._screenCenter + new Vector2(0, 100); + newWorker.Position = Globals.Instance._screenCenter; newWorker._manager = this; - AddChild(newWorker); + _workerNode.AddChild(newWorker); _workers.Add(newWorker); newWorker = Globals.Instance._workerScene.Instantiate(); - newWorker.Position = Globals.Instance._screenCenter - new Vector2(0, 100); + newWorker.Position = Globals.Instance._screenCenter; newWorker._manager = this; - AddChild(newWorker); + _workerNode.AddChild(newWorker); + _workers.Add(newWorker); + + newWorker = Globals.Instance._workerScene.Instantiate(); + newWorker.Position = Globals.Instance._screenCenter; + newWorker._manager = this; + _workerNode.AddChild(newWorker); + _workers.Add(newWorker); + + newWorker = Globals.Instance._workerScene.Instantiate(); + newWorker.Position = Globals.Instance._screenCenter; + newWorker._manager = this; + _workerNode.AddChild(newWorker); _workers.Add(newWorker); // for (int i = 0; i < _workers.Count; i++) @@ -42,20 +57,45 @@ public partial class Manager : Node // _workers[i]._healthBar.Position = _managerPanel.GetNode("Team").GetNode("T"+(i+1)).GlobalPosition; // } - Tchotchke newTchotchke = ResourceLoader.Load("res://Gameplay/Tchotchkes/awfully_hot_coffee_pot.tscn").Instantiate(); - newTchotchke.Position = new Vector2(Globals.Instance._screenSize.X - 100, Globals.Instance._screenCenter.Y); - AddChild(newTchotchke); - _tchotckes.Add(newTchotchke); + // Tchotchke newTchotchke = ResourceLoader.Load("res://Gameplay/Tchotchkes/awfully_hot_coffee_pot.tscn").Instantiate(); + // newTchotchke.Position = new Vector2(Globals.Instance._screenSize.X - 100, Globals.Instance._screenCenter.Y); + // AddChild(newTchotchke); + // _tchotckes.Add(newTchotchke); } public override void _Process(double DELTA_) { - - if (_workers.All(w => w._placed && w._primed)) + if (Globals.Instance._battleRunning) { - for (int i = 0; i < _workers.Count; i++) + ChainMovement(); + } + else + { + MoveChain(); + } + } + + public void ChainMovement() + { + Vector2 mousePosition = GetGlobalMousePosition(); + // _workers[0].LookAt(mousePosition); + Vector2 mouseOffset = mousePosition - _workers[0].GlobalPosition; + if (mouseOffset.Length() > _workers[0]._size) + { + Vector2 mouseOffsetNormal = mouseOffset.Normalized(); + _workers[0].GlobalPosition += mouseOffsetNormal * _speed; + _workers[0]._distanceTraveled += _speed; + _workers[0]._moves.Insert(0, _workers[0].GlobalPosition); + + for (int i = 1; i < _workers.Count; i++) { - _workers[i].Launch(); + if (_workers[i - 1]._distanceTraveled > (_workers[i - 1]._size + _workers[i]._size) * 1.2f) + { + _workers[i]._distanceTraveled += _speed; + _workers[i].GlobalPosition = _workers[i - 1]._moves[^1]; + _workers[i]._moves.Insert(0, _workers[i - 1]._moves[^1]); + _workers[i - 1]._moves.RemoveAt(_workers[i - 1]._moves.Count - 1); + } } } } @@ -74,10 +114,71 @@ public partial class Manager : Node GetNode("Panel").SetValue(_health); } + public void MoveChain() + { + _hoveredWorker = _workers.SingleOrDefault(w => !w._selected && !w._held && w._hovered, null); + + if (_heldWorker != null) + { + _heldWorker.GlobalPosition = GetGlobalMousePosition(); + if (_hoveredWorker != null) + { + SwapPositions(_heldWorker, _hoveredWorker); + _hoveredWorker._hovered = false; + _hoveredWorker = null; + } + if (Input.IsActionJustReleased("left_click")) + { + _heldWorker.GlobalPosition = _heldWorker._chainPosition; + _heldWorker._held = false; + _heldWorker = null; + } + } + else + { + if (_selectedWorker != null) + { + if (Input.IsActionPressed("left_click") && (GetGlobalMousePosition() - _selectedWorker._chainPosition).Length() > 5) + { + + _heldWorker = _selectedWorker; + _heldWorker._held = true; + _heldWorker._selected = false; + _selectedWorker = null; + } + } + if (_hoveredWorker != null) + { + if (Input.IsActionJustPressed("left_click")) + { + _selectedWorker = _hoveredWorker; + _selectedWorker._selected = true; + _selectedWorker._hovered = false; + _hoveredWorker = null; + } + } + } + } + public void SetSprite(string PATH) { _imagePath = PATH; } + public void SwapPositions(Worker A, Worker B) + { + Vector2 positionA = A.Position, positionB = B.Position, chainPositionA = A._chainPosition, chainPositionB = B._chainPosition; + List movesA = new(A._moves), movesB = new(B._moves); + // A.Position = positionB; + B.Position = chainPositionA; + A._chainPosition = chainPositionB; + B._chainPosition = chainPositionA; + A._moves = movesB; + B._moves = movesA; + int indexA = _workers.IndexOf(A), indexB = _workers.IndexOf(B); + Worker C = A; + _workers[indexA] = B; + _workers[indexB] = C; + } } diff --git a/Gameplay/Worker.cs b/Gameplay/Worker.cs index 30dd4bf..8b136c9 100644 --- a/Gameplay/Worker.cs +++ b/Gameplay/Worker.cs @@ -5,22 +5,26 @@ using System.ComponentModel.DataAnnotations; using System.Diagnostics; using System.Linq; -public partial class Worker : RigidBody2D +public partial class Worker : CharacterBody2D { - public bool _dead = false, _hovered = false, _held = false, _placed = false, _selected = false, _primed = false, _moving = false, _staminaCanDrain = true; - public int _health, _healthMax; - public float _stamina, _staminaMax; + public bool _dead = false, _hovered = false, _held = false, _selected = false; + public int _size, _health, _healthMax; + public float _distanceTraveled, _stamina, _staminaMax; public Stat _aptitude = new(), _agility = new(), _ardor = new(), _accumen = new(), _awareness = new(), _appeal = new(); public float _rotationalForce = 0; - public Vector2 _force = Vector2.Zero; - public Node _collisionTarget; + public Vector2 _chainPosition = new Vector2(-1, -1); + public List _moves = new(); public Sprite2D _image; public ProgressBar _healthBar; public Manager _manager; - public List _actions = new(); - public List _conditions = new(); + public Node _actions; + public Node _conditions; public override void _Ready() { + _actions = GetNode("Actions"); + _conditions = GetNode("Conditions"); + _size = (int)(((CircleShape2D)GetNode("Bounds").Shape).Radius); + _aptitude._default = 5; _agility._default = 5; _ardor._default = 5; @@ -37,7 +41,7 @@ public partial class Worker : RigidBody2D _image = GetNode("Sprite2D"); - _actions.Add(new BasicAttack(this)); + _actions.AddChild(new BasicAttack(this)); // _healthBar = GetNode("HealthBar"); // _healthBar.MaxValue = _healthMax; @@ -46,118 +50,62 @@ public partial class Worker : RigidBody2D public override void _Process(double DELTA_) { - if (!_moving) + if (Globals.Instance._battleRunning) { - if (!_placed) - { - if (!_held) - { - if (_hovered) - { - if (Input.IsActionJustPressed("left_click")) - { - Hold(); - } - } - } - } - else - { - if (_selected) - { - Vector2 mousePosition = GetGlobalMousePosition(); - LookAt(mousePosition); - if (Input.IsActionJustReleased("left_click")) - { - _selected = false; - _force = (GlobalPosition - mousePosition) * 100; - _stamina = _agility._effective; - _primed = true; - } - } - else if (_hovered) - { - if (Input.IsActionJustPressed("left_click")) - { - _selected = true; - } - } - } + _chainPosition = GlobalPosition; } else { - // Vector2 towardCenter = (Globals.Instance._screenCenter - GlobalPosition).Normalized(); - // ApplyCentralForce(towardCenter * 100); - _image.Rotate(_stamina); - if (_staminaCanDrain) - { - _stamina -= 0.25f / 60; - } - if (_stamina <= 0f) - { - Stop(); - } + } } - public override void _PhysicsProcess(double DELTA_) - { - if (_held) - { - GlobalPosition = GetGlobalMousePosition(); - if (Input.IsActionJustReleased("left_click")) - { - Transform2D newTransform = GlobalTransform; - newTransform.Origin = Position; - GlobalTransform = newTransform; - Drop(); - } - } - } - - public void ChangeHealth(int CHANGE, Node CHANGEMAKER) - { - if (_health <= 0 && CHANGE < 0) - { - // knock the piece off the board and out for the round! - // process on knockout - } - _health += CHANGE; - _healthBar.Value = _health; - if (_health <= 0) - { - Sleeping = true; - _dead = true; - _health = 0; - FireActions(Trigger.On.Death, _manager); - } - } + // public void ChangeHealth(int CHANGE, Node CHANGEMAKER) + // { + // if (_health <= 0 && CHANGE < 0) + // { + // // knock the piece off the board and out for the round! + // // process on knockout + // } + // _health += CHANGE; + // _healthBar.Value = _health; + // if (_health <= 0) + // { + // Sleeping = true; + // _dead = true; + // _health = 0; + // FireActions(Trigger.On.Death, _manager); + // } + // } public void Drop() { if (_held) { _held = false; - _placed = true; - Freeze = false; } } public void FireActions(Trigger.On TRIGGER, Node TARGET = null) { - List triggeredActions = _actions.Where(e => e._triggers.Contains(TRIGGER)).ToList(); - for (int i = 0; i < triggeredActions.Count; i++) + List children = _actions.GetChildren().ToList(); + for (int i = 0; i < children.Count; i++) { - triggeredActions[i].Target(TARGET); - triggeredActions[i].Fire(); + if (children[i] is Action) + { + Action action = (Action)children[i]; + if (action._triggers.Contains(TRIGGER)) + { + action.Target(TARGET); + action.Fire(); + } + } } - List expiredActions = _actions.Where(e => e._triggers.Contains(TRIGGER)).ToList(); - _actions.Except(expiredActions); } public bool HasCondition(string CONDITION) { - List conditionNames = _conditions.Select(c => c.GetType().ToString()).ToList(); + List conditionNames = _conditions.GetChildren().Select(c => c.GetType().ToString()).ToList(); return conditionNames.Contains(CONDITION); } @@ -167,29 +115,9 @@ public partial class Worker : RigidBody2D { return; } - Freeze = true; _held = true; } - public void Launch() - { - GravityScale = 1.0f; - _moving = true; - ApplyCentralForce(_force); - _force = Vector2.Zero; - _primed = false; - FireActions(Trigger.On.Launch, _manager); - } - - public void Stop() - { - GravityScale = 0.0f; - Sleeping = true; - _moving = false; - _stamina = 0f; - FireActions(Trigger.On.Stop, _manager); - } - public void ResetStats() { _aptitude._effective = _aptitude._default; @@ -211,24 +139,22 @@ public partial class Worker : RigidBody2D _hovered = false; } - private void OnBodyEntered(Node NODE) - { - if (NODE is Worker) - { - _collisionTarget = NODE; - FireActions(Trigger.On.Collision, NODE); + // private void OnBodyEntered(Node NODE) + // { + // if (NODE is Worker) + // { + // FireActions(Trigger.On.Collision, NODE); - _rotationalForce *= 0.8f; - Vector2 rotatedForce = LinearVelocity.Rotated(((Worker)NODE)._rotationalForce); + // _rotationalForce *= 0.8f; + // Vector2 rotatedForce = LinearVelocity.Rotated(((Worker)NODE)._rotationalForce); - ApplyCentralForce(rotatedForce); - _collisionTarget = null; - } - else if (NODE is Tchotchke) - { - Tchotchke tchotchke = (Tchotchke)NODE; - tchotchke.FireActions(Trigger.On.Collision, this); - } - } + // ApplyCentralForce(rotatedForce); + // } + // else if (NODE is Tchotchke) + // { + // Tchotchke tchotchke = (Tchotchke)NODE; + // tchotchke.FireActions(Trigger.On.Collision, this); + // } + // } } diff --git a/Gameplay/action.tscn b/Gameplay/action.tscn index c334a5d..4ead980 100644 --- a/Gameplay/action.tscn +++ b/Gameplay/action.tscn @@ -1,3 +1,6 @@ -[gd_scene load_steps=0 format=3 uid="uid://becqya8l8feni"] +[gd_scene load_steps=2 format=3 uid="uid://dti20yu8jfujq"] -[node name="ProcessEffect" type="Node"] +[ext_resource type="Script" uid="uid://dtccp5uxgkjwm" path="res://Gameplay/Action.cs" id="1_lk435"] + +[node name="Action" type="Node"] +script = ExtResource("1_lk435") diff --git a/Gameplay/effect.tscn b/Gameplay/effect.tscn deleted file mode 100644 index 1fff1b6..0000000 --- a/Gameplay/effect.tscn +++ /dev/null @@ -1,3 +0,0 @@ -[gd_scene format=3 uid="uid://dti20yu8jfujq"] - -[node name="Action" type="Node"] diff --git a/Gameplay/manager.tscn b/Gameplay/manager.tscn index 11823e8..f65f62a 100644 --- a/Gameplay/manager.tscn +++ b/Gameplay/manager.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://b66ysicyh0m1s" path="res://Gameplay/Manager.cs" id="1_ivgep"] [ext_resource type="PackedScene" uid="uid://8kv00jc35dma" path="res://Gameplay/manager_panel.tscn" id="3_xooeg"] -[node name="Manager" type="Node"] +[node name="Manager" type="Node2D"] script = ExtResource("1_ivgep") [node name="Panel" parent="." instance=ExtResource("3_xooeg")] @@ -13,3 +13,5 @@ offset_right = 551.0 offset_bottom = 280.0 grow_horizontal = 1 grow_vertical = 1 + +[node name="Workers" type="Node" parent="."] diff --git a/Gameplay/worker.tscn b/Gameplay/worker.tscn index f6f39fa..9c28e77 100644 --- a/Gameplay/worker.tscn +++ b/Gameplay/worker.tscn @@ -1,53 +1,32 @@ -[gd_scene load_steps=5 format=3 uid="uid://37hjd4v3p42o"] +[gd_scene load_steps=4 format=3 uid="uid://37hjd4v3p42o"] [ext_resource type="Script" uid="uid://bk6qk4rjmsvtn" path="res://Gameplay/Worker.cs" id="1_e314i"] +[ext_resource type="Texture2D" uid="uid://dmispjd3fmmks" path="res://art/worker_test.png" id="2_m3kx1"] -[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_e314i"] -bounce = 3.0 +[sub_resource type="CircleShape2D" id="CircleShape2D_4poc8"] +radius = 25.0799 -[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_e314i"] -load_path = "res://.godot/imported/beyblade.png-cd6ee3474fe554271afbb31b55fadfb5.ctex" - -[sub_resource type="CircleShape2D" id="CircleShape2D_e314i"] -radius = 32.0 - -[node name="Worker" type="RigidBody2D"] +[node name="Worker" type="CharacterBody2D"] input_pickable = true -physics_material_override = SubResource("PhysicsMaterial_e314i") -gravity_scale = 0.0 -inertia = 1.0 -lock_rotation = true -continuous_cd = 2 -contact_monitor = true -max_contacts_reported = 1 -linear_damp = 0.25 script = ExtResource("1_e314i") [node name="HealthBar" type="ProgressBar" parent="."] +visible = false top_level = true offset_right = 150.0 offset_bottom = 27.0 step = 1.0 +[node name="Bounds" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_4poc8") + [node name="Sprite2D" type="Sprite2D" parent="."] -scale = Vector2(0.2, 0.2) -texture = SubResource("CompressedTexture2D_e314i") +scale = Vector2(0.5, 0.5) +texture = ExtResource("2_m3kx1") -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] -scale = Vector2(0.2, 0.2) -polygon = PackedVector2Array(8, -171, -17, -171, -17, -169.9, -26.2, -169, -29.5, -169, -62, -151.2, -84, -152.9, -84, -154.4, -102.4, -151, -104.7, -151, -150.8, -114, -153, -114, -174, -88, -175.3, -88, -180, -77.7, -180, 44.2, -178, 46.7, -178, 48.3, -163.5, 54.9, -155, 81.2, -155, 83.9, -135.8, 102, -134.9, 102, -114, 126.7, -114, 128.2, -97.5, 137, -96.1, 137, -92, 143.6, -92, 146, -82, 152.9, -82, 154.5, -34, 167.4, -34, 168.7, -18.1, 171, 31.2, 171, 49.4, 167, 52.7, 167, 68, 155, 68, 154.2, 110.5, 134, 112.7, 134, 137.7, 114, 139.7, 114, 142, 98.1, 142, 92.9, 156.9, 79, 158.4, 79, 171.4, 45, 173.1, 45, 172, 22.9, 172, 13.6, 180, 1.10001, 180, -65.5, 159, -106.6, 159, -108.7, 134, -140.7, 134, -142.3, 121.4, -148, 112.5, -148, 101.4, -142, 97.3, -142, 75, -151.3, 75, -152.5, 50.3, -159, 47.5, -159, 39, -164.1, 39, -165.8, 8, -169.8) +[node name="Actions" type="Node" parent="."] -[node name="Gravity" type="Area2D" parent="."] -gravity_space_override = 1 -gravity_point = true -gravity_point_unit_distance = 32.0 -gravity_point_center = Vector2(0, 0) -gravity_direction = Vector2(0, 0) -gravity = 5.0 +[node name="Conditions" type="Node" parent="."] -[node name="CollisionShape2D" type="CollisionShape2D" parent="Gravity"] -shape = SubResource("CircleShape2D_e314i") - -[connection signal="body_entered" from="." to="." method="OnBodyEntered"] [connection signal="mouse_entered" from="." to="." method="OnMouseEntered"] [connection signal="mouse_exited" from="." to="." method="OnMouseExited"] diff --git a/art/worker_test.png b/art/worker_test.png new file mode 100644 index 0000000..6b55be1 Binary files /dev/null and b/art/worker_test.png differ diff --git a/art/worker_test.png.import b/art/worker_test.png.import new file mode 100644 index 0000000..7ecefb3 --- /dev/null +++ b/art/worker_test.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dmispjd3fmmks" +path="res://.godot/imported/worker_test.png-8eeda9167e14e3ea47d2777edc77e1ba.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/worker_test.png" +dest_files=["res://.godot/imported/worker_test.png-8eeda9167e14e3ea47d2777edc77e1ba.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1