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 PlayerController _playerController; public void AddEnemies(int ENEMY_COUNT = 1) { 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; } }