finished reowrking grid maps, polished astar pathfinding, started work on aiming functions --todo: change launch speed to constant, change aim function to take into account the angle it would need to launch at to hit mouse position like in peggle, add raycasting

This commit is contained in:
2026-06-03 02:44:13 -04:00
parent 7b5cd9d5f6
commit c97b0e5cc2
24 changed files with 1108 additions and 1104 deletions
+47 -42
View File
@@ -16,13 +16,13 @@ public partial class EnemyController : TurnController
{
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)];
newEnemy._speed = Globals._rng.Next(2,4+1);
newEnemy.Modulate = new Color(newEnemy._speed == 2 ? "#FF0000" : newEnemy._speed == 3 ? "#00FF00" : "#0000FF");
newEnemy._enemyController = this;
WarpEnemy(newEnemy, randomMarker);
List<Vector2I> unoccupied = [.. _playArea._map._bottomRow.Where(c => _enemies.All(e => e._address != c))];
Vector2I randomCell = unoccupied[Globals._rng.Next(unoccupied.Count)];
WarpEnemy(newEnemy, randomCell);
_enemies.Add(newEnemy);
AddChild(newEnemy);
}
@@ -33,42 +33,45 @@ public partial class EnemyController : TurnController
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<Enemy> ENEMIES = null)
public void MoveEnemies()
{
ENEMIES ??= _enemies;
ENEMIES = [.. ENEMIES.OrderByDescending(e => e._gridMarker._address.Y).ThenByDescending(e => e._gridMarker._address.X)];
// Tween tween = CreateTween();
// tween.SetParallel();
Dictionary<Enemy, List<GridMarker>> enemyPaths = new();
ENEMIES[0].Pathfinding(_grid.GetMarkerByAddress(new Vector2I(ENEMIES[0]._gridMarker._address.X, ENEMIES[0]._gridMarker._address.Y - ENEMIES[0]._visibilityRange)));
// for (int i = 0; i < ENEMIES.Count; i++)
// {
// enemyPaths[ENEMIES[i]] = ENEMIES[i].Pathfinding(_grid.GetMarkerByAddress(new Vector2I(ENEMIES[i]._gridMarker._address.X, 0)));
// }
Tween tween = CreateTween();
tween.SetParallel();
Dictionary<Enemy, List<Vector2I>> enemyPaths = new();
for (int i = 0; i < _enemies.Count; i++)
{
Enemy enemy = _enemies[i];
List<Vector2I> path = _playArea._map.GetPath(enemy._address, new Vector2I(enemy._address.X, _playArea._map._minY));
enemyPaths[enemy] = path;
}
int maxSteps = enemyPaths.Select(p => p.Value.Count).Max();
// GD.Print(maxSteps);
// for (int i = 0; i < maxSteps; i++)
// {
// Dictionary<Enemy, List<GridMarker>> qualifyingPaths = (Dictionary<Enemy, List<GridMarker>>)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);
// }
// }
int maxSpeed = _enemies.Max(e => e._speed);
for (int i = 0; i < maxSpeed; i++)
{
for (int j = 0; j < enemyPaths.Count; j++)
{
Enemy enemy = enemyPaths.ElementAt(j).Key;
if (i >= enemy._speed)
{
continue;
}
List<Vector2I> path = enemyPaths.ElementAt(j).Value;
Vector2I cell = path[i];
enemy._address = cell;
if (j == 0)
{
tween.Chain();
}
else
{
tween.Parallel();
}
tween.TweenProperty(enemy, "global_position", _playArea._map.GetCellPositionFromAddress(enemy._address), .2f);
}
}
tween.TweenCallback(Callable.From(() => EmitSignal(SignalName.TurnDone)));
}
public void RemoveEnemy(Enemy ENEMY_TO_REMOVE)
@@ -79,13 +82,15 @@ public partial class EnemyController : TurnController
public override void StartTurn()
{
AddEnemies();
AddEnemies(1);
MoveEnemies();
}
public void WarpEnemy(Enemy ENEMY, GridMarker DESTINATION_MARKER)
public void WarpEnemy(Enemy ENEMY, Vector2I CELL)
{
ENEMY._gridMarker = DESTINATION_MARKER;
ENEMY.GlobalPosition = DESTINATION_MARKER.GlobalPosition;
ENEMY._address = CELL;
ENEMY.GlobalPosition = _playArea._map.GetCellPositionFromAddress(CELL);
}
}