diff --git a/Attack.cs b/Attack.cs index 03927ba..d0e8b75 100644 --- a/Attack.cs +++ b/Attack.cs @@ -2,6 +2,9 @@ using Godot; public partial class Attack : RigidBody2D { + [Signal] + public delegate void HitEventHandler(Node NODE); + public bool _hovered = false; public int _damage = 1; public Vector2 _speed; @@ -23,10 +26,9 @@ public partial class Attack : RigidBody2D public void TakeAction(Node BODY) { - GD.Print("Body Entered"); + EmitSignal(SignalName.Hit, BODY); if (BODY is Enemy enemy) { - GD.Print("Body Entered is enemy"); enemy.TakeDamage(_damage, _commanderOwner); } } diff --git a/Commander.cs b/Commander.cs index e313bdc..69037aa 100644 --- a/Commander.cs +++ b/Commander.cs @@ -4,10 +4,13 @@ using System; public partial class Commander : Sprite2D { [Signal] - public delegate void TurnDoneEventHandler(); - public int _health = 10; + public delegate void DeathEventHandler(Commander THIS); + [Signal] + public delegate void ActionsUpEventHandler(); + public int _health = 10, _actionsMax = 1, _actions; public PackedScene _attackScene = GD.Load("res://Attack.tscn"); public Attack _attack; + public PlayerController _playerController; public override void _Process(double delta) { @@ -18,21 +21,15 @@ public partial class Commander : Sprite2D { _attack.QueueFree(); _attack = null; + EmitSignal(SignalName.ActionsUp); } } } - - public void StartTurn() - { - - } - public void LoadAttack() { if (_attack == null) { - GD.Print("Loading attack"); _attack = _attackScene.Instantiate(); _attack._commanderOwner = this; _attack.GravityScale = 0; @@ -45,15 +42,14 @@ public partial class Commander : Sprite2D _health -= DAMAGE; if (_health <= 0) { - GD.Print("GAME OVER"); - GetTree().Quit(); + EmitSignal(SignalName.Death, this); } } public void ShootCurrentAttack(Vector2 FORCE){ - GD.Print("Shooting attack"); _attack.Shoot(FORCE); + _actions--; } public void UnloadAttack() diff --git a/Enemy.cs b/Enemy.cs index f795e3b..30107f4 100644 --- a/Enemy.cs +++ b/Enemy.cs @@ -4,7 +4,7 @@ using System; public partial class Enemy : StaticBody2D { [Signal] - public delegate void TurnDoneEventHandler(); + public delegate void DeathEventHandler(Enemy THIS); public int _damage = 1, _health = 2; public Vector2 _speed = Vector2.Up, _range = Vector2.Up; public float _movement = 0; @@ -20,24 +20,19 @@ public partial class Enemy : StaticBody2D COMMANDER.TakeDamage(_damage, this); } - public void PlaceOrMove(GridMarker GRIDMARKER) + public void CounterAttack(Commander COMMANDER) { - _gridMarker = GRIDMARKER; - GlobalPosition = _gridMarker.GlobalPosition; + } public void TakeDamage(int DAMAGE, Commander ATTACKER) { + GD.Print(_health, _health - DAMAGE); _health -= DAMAGE; - GD.Print($"Taking {DAMAGE}, Health is now {_health}"); + CounterAttack(ATTACKER); if (_health <= 0) { - QueueFree(); + EmitSignal(SignalName.Death, this); } } - - public void TakeTurn() - { - // PlaceOrMove(_gridMarker._gridMarkers[(int)(_gridMarker._address.Y + _speed.Y)][(int)(_gridMarker._address.X + _speed.X)]); - } } diff --git a/EnemyController.cs b/EnemyController.cs index 657210e..38de617 100644 --- a/EnemyController.cs +++ b/EnemyController.cs @@ -1,28 +1,70 @@ using Godot; using System; using System.Collections.Generic; +using System.Linq; public partial class EnemyController : TurnController { public PackedScene _enemyScene = GD.Load("res://Enemy.tscn"); public List _enemies = new(); - public void AddEnemy() + public PlayerController _playerController; + + public void AddEnemies(int ENEMY_COUNT = 1) { - Enemy newEnemy = _enemyScene.Instantiate(); - // newEnemy.PlaceOrMove(_grid._gridMarkers.Last()[_rng.Next(_grid._gridMarkers.Last().Count)]); - // newEnemy._commander = _commander; - // newEnemy._grid = _grid; - _enemies.Add(newEnemy); - AddChild(newEnemy); - } - public override void StartTurn() - { - + for (int i = 0; i < ENEMY_COUNT; i++) + { + Enemy newEnemy = _enemyScene.Instantiate(); + newEnemy.Death += RemoveEnemy; + List lastRow = _grid._gridMarkers.Last(); + List unoccupiedMarkers = [.. lastRow.Where(m => m._occupant == null).Cast()]; + GridMarker randomMarker = unoccupiedMarkers[Globals._rng.Next(unoccupiedMarkers.Count)]; + WarpEnemy(newEnemy, randomMarker); + _enemies.Add(newEnemy); + AddChild(newEnemy); + } } public void Initiate() { - + AddEnemies(3); + } + + public void MoveEnemy(Enemy ENEMY) + { + ENEMY._gridMarker = _grid.GetMarkerByAddress((Vector2I)(ENEMY._gridMarker._address + ENEMY._speed)); + Tween tween = CreateTween(); + tween.TweenProperty(ENEMY, "global_position", ENEMY._gridMarker.GlobalPosition, 1.0f); + } + + public void MoveEnemies(List ENEMIES = null) + { + ENEMIES ??= _enemies; + Tween tween = CreateTween(); + tween.SetParallel(); + for (int i = 0; i < ENEMIES.Count; i++) + { + ENEMIES[i]._gridMarker = _grid.GetMarkerByAddress((Vector2I)(ENEMIES[i]._gridMarker._address + ENEMIES[i]._speed)); + tween.TweenProperty(ENEMIES[i], "global_position", ENEMIES[i]._gridMarker.GlobalPosition, 0.4f); + } + tween.TweenCallback(Callable.From(() => EmitSignal(SignalName.TurnDone))); + } + + public void RemoveEnemy(Enemy ENEMY_TO_REMOVE) + { + _enemies.Remove(ENEMY_TO_REMOVE); + ENEMY_TO_REMOVE.QueueFree(); + } + + public override void StartTurn() + { + AddEnemies(); + MoveEnemies(); + } + + public void WarpEnemy(Enemy ENEMY, GridMarker DESTINATION_MARKER) + { + ENEMY._gridMarker = DESTINATION_MARKER; + ENEMY.GlobalPosition = DESTINATION_MARKER.GlobalPosition; } } diff --git a/Globals.cs b/Globals.cs new file mode 100644 index 0000000..999a48f --- /dev/null +++ b/Globals.cs @@ -0,0 +1,7 @@ +using Godot; +using System; + +public partial class Globals : Node +{ + public static Random _rng = new(); +} diff --git a/Globals.cs.uid b/Globals.cs.uid new file mode 100644 index 0000000..0dc3fca --- /dev/null +++ b/Globals.cs.uid @@ -0,0 +1 @@ +uid://cy46unus8gy50 diff --git a/GridMap2D.cs b/GridMap2D.cs index 26f23d3..e93aaae 100644 --- a/GridMap2D.cs +++ b/GridMap2D.cs @@ -61,4 +61,14 @@ public partial class GridMap2D : Node2D _gridMarker.QueueFree(); } + + public GridMarker GetMarkerByAddress(Vector2I COORDINATES) + { + return _gridMarkers[COORDINATES.Y][COORDINATES.X]; + } + + public GridMarker GetGridMarkerRelativeToAnother(GridMarker GRID_MARKER, Vector2I STEP) + { + return _gridMarkers[(int)GRID_MARKER._address.Y + STEP.Y][(int)GRID_MARKER._address.X + STEP.X]; + } } diff --git a/GridMarker.cs b/GridMarker.cs index c0d015b..1c24048 100644 --- a/GridMarker.cs +++ b/GridMarker.cs @@ -5,4 +5,6 @@ public partial class GridMarker : Marker2D { public Vector2 _address; public Node _occupant; + + // public GridMarker Get } diff --git a/Main.cs b/Main.cs index 8db59e1..3fd677d 100644 --- a/Main.cs +++ b/Main.cs @@ -17,6 +17,9 @@ public partial class Main : Node _playerController = GetNode("PlayerController"); _enemyController = GetNode("EnemyController"); + _playerController._enemyController = _enemyController; + _enemyController._playerController = _playerController; + _playerController._grid = _grid; _enemyController._grid = _grid; @@ -39,12 +42,15 @@ public partial class Main : Node public void ChangeTurn() { + if (_turnController != _playerController) { + _turnController = _playerController; _playerController.StartTurn(); } else { + _turnController = _enemyController; _enemyController.StartTurn(); } } diff --git a/PlayerController.cs b/PlayerController.cs index a73c1e6..45c0e82 100644 --- a/PlayerController.cs +++ b/PlayerController.cs @@ -1,9 +1,11 @@ using Godot; using System; using System.Collections.Generic; +using System.Linq; public partial class PlayerController : TurnController { + public EnemyController _enemyController; public PackedScene _commanderScene = GD.Load("res://Commander.tscn"); public List _towers = new(); @@ -12,6 +14,14 @@ public partial class PlayerController : TurnController base._Ready(); } + public void CheckForTurnEnd() + { + if (_towers.Where(t => t._commander != null).ToList().All(t=>t._commander._actions == 0)) + { + EmitSignal(SignalName.TurnDone); + } + } + public void SetUpTowers(int TOWER_COUNT = 8) { Tower tower = GetNode("Tower1"); @@ -29,13 +39,15 @@ public partial class PlayerController : TurnController } Commander newCommander = _commanderScene.Instantiate(); + newCommander._playerController = this; + newCommander.ActionsUp += CheckForTurnEnd; _towers[3]._commander = newCommander; _towers[3].AddChild(newCommander); } public override void StartTurn() { - + _towers.Where(t=> t._commander != null).ToList().ForEach(t=>t._commander._actions = t._commander._actionsMax); } } diff --git a/Tower.cs b/Tower.cs index 2622b2b..fc69d8b 100644 --- a/Tower.cs +++ b/Tower.cs @@ -14,31 +14,31 @@ public partial class Tower : Sprite2D public override void _Process(double delta) { base._Process(delta); - - if (Input.IsActionJustPressed("leftClick")) + if (_commander?._actions > 0) { - if (_hovered) + if (Input.IsActionJustPressed("leftClick")) { - _aiming = true; - _commander.LoadAttack(); + if (_hovered) + { + _aiming = true; + _commander.LoadAttack(); + } + } + if (_aiming) + { + if (Input.IsActionJustReleased("rightClick")) + { + Vector2 offset = (GlobalPosition - GetGlobalMousePosition()) * 500; + _commander.ShootCurrentAttack(offset); + _aiming = false; + } + else if (Input.IsActionJustReleased("leftClick")) + { + _commander.UnloadAttack(); + _aiming = false; + } } } - if (_aiming) - { - if (Input.IsActionJustReleased("rightClick")) - { - Vector2 offset = (GlobalPosition - GetGlobalMousePosition()) * 500; - _commander.ShootCurrentAttack(offset); - _aiming = false; - } - else if (Input.IsActionJustReleased("leftClick")) - { - _commander.UnloadAttack(); - _aiming = false; - } - } - - } public void OnMouseEntered(){ diff --git a/TurnController.cs b/TurnController.cs index 3ccb424..21725a1 100644 --- a/TurnController.cs +++ b/TurnController.cs @@ -9,6 +9,5 @@ public partial class TurnController : Node2D public virtual void StartTurn() { - } } diff --git a/globals.tscn b/globals.tscn new file mode 100644 index 0000000..91958dd --- /dev/null +++ b/globals.tscn @@ -0,0 +1,6 @@ +[gd_scene format=3 uid="uid://day3m4u6q0ka1"] + +[ext_resource type="Script" uid="uid://cy46unus8gy50" path="res://Globals.cs" id="1_f6yec"] + +[node name="Globals" type="Node" unique_id=1288689574] +script = ExtResource("1_f6yec")