added some more signals for attack hit, enemy and player controllers turn done, commander enemy death, better enemy movement and turn changing, implemented an rng, added functions to grid and gridmarkers to allow for easier searching of markers, more logic for if a tower commander has actions
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+8
-12
@@ -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<PackedScene>("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>();
|
||||
_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()
|
||||
|
||||
@@ -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)]);
|
||||
}
|
||||
}
|
||||
|
||||
+54
-12
@@ -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<PackedScene>("res://Enemy.tscn");
|
||||
public List<Enemy> _enemies = new();
|
||||
public void AddEnemy()
|
||||
public PlayerController _playerController;
|
||||
|
||||
public void AddEnemies(int ENEMY_COUNT = 1)
|
||||
{
|
||||
Enemy newEnemy = _enemyScene.Instantiate<Enemy>();
|
||||
// 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<Enemy>();
|
||||
newEnemy.Death += RemoveEnemy;
|
||||
List<GridMarker> lastRow = _grid._gridMarkers.Last();
|
||||
List<GridMarker> unoccupiedMarkers = [.. lastRow.Where(m => m._occupant == null).Cast<GridMarker>()];
|
||||
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<Enemy> 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
using Godot;
|
||||
using System;
|
||||
|
||||
public partial class Globals : Node
|
||||
{
|
||||
public static Random _rng = new();
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
uid://cy46unus8gy50
|
||||
@@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,4 +5,6 @@ public partial class GridMarker : Marker2D
|
||||
{
|
||||
public Vector2 _address;
|
||||
public Node _occupant;
|
||||
|
||||
// public GridMarker Get
|
||||
}
|
||||
|
||||
@@ -17,6 +17,9 @@ public partial class Main : Node
|
||||
_playerController = GetNode<PlayerController>("PlayerController");
|
||||
_enemyController = GetNode<EnemyController>("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();
|
||||
}
|
||||
}
|
||||
|
||||
+13
-1
@@ -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<PackedScene>("res://Commander.tscn");
|
||||
public List<Tower> _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<Tower>("Tower1");
|
||||
@@ -29,13 +39,15 @@ public partial class PlayerController : TurnController
|
||||
}
|
||||
|
||||
Commander newCommander = _commanderScene.Instantiate<Commander>();
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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(){
|
||||
|
||||
@@ -9,6 +9,5 @@ public partial class TurnController : Node2D
|
||||
|
||||
public virtual void StartTurn()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
Reference in New Issue
Block a user