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)]; newEnemy._speed = Globals._rng.Next(2,4+1); newEnemy.Modulate = new Color(newEnemy._speed == 2 ? "#FF0000" : newEnemy._speed == 3 ? "#00FF00" : "#0000FF"); WarpEnemy(newEnemy, randomMarker); _enemies.Add(newEnemy); AddChild(newEnemy); } } public void Initiate() { AddEnemies(3); } // public void MoveEnemy(Enemy ENEMY) // { // ENEMY._gridMarker = _grid.GetMarkerFromOffset(ENEMY._gridMarker, ENEMY._speed); // Tween tween = CreateTween(); // tween.TweenProperty(ENEMY, "global_position", ENEMY._gridMarker.GlobalPosition, 1.0f); // } public void MoveEnemies(List ENEMIES = null) { ENEMIES ??= _enemies; ENEMIES = [.. ENEMIES.OrderByDescending(e => e._gridMarker._address.Y).ThenByDescending(e => e._gridMarker._address.X)]; Tween tween = CreateTween(); tween.SetParallel(); Dictionary> enemyPaths = new(); for (int i = 0; i < ENEMIES.Count; i++) { enemyPaths[ENEMIES[i]] = ENEMIES[i].Pathfinding(_grid._gridMarkers.ToList()); } int maxSteps = enemyPaths.Select(p => p.Value.Count).Max(); GD.Print(enemyPaths.Count, " ", maxSteps); for (int i = 0; i < maxSteps; i++) { Dictionary> qualifyingPaths = (Dictionary>)enemyPaths.Where(p => p.Value.Count <= maxSteps); for (int j = 0; j < qualifyingPaths.Count; j++) { Enemy enemy = qualifyingPaths.ElementAt(j).Key; GridMarker marker = qualifyingPaths.ElementAt(j).Value.ElementAt(i); if (j == 0) { tween.Chain(); } tween.TweenProperty(enemy, "global_position", enemy._gridMarker.GlobalPosition, 0.4f); } } } 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; } }