65 lines
1.4 KiB
C#
65 lines
1.4 KiB
C#
namespace GaulishVillage;
|
|
public abstract class Trainable : Entity
|
|
{
|
|
public bool IsReturning = false;
|
|
|
|
public Trainable(Board board) : base(board) {}
|
|
|
|
public override void Act()
|
|
{
|
|
if (IsReturning)
|
|
ReturnToTownHall();
|
|
else
|
|
AttackEnemies();
|
|
}
|
|
|
|
protected void AttackEnemies()
|
|
{
|
|
Enemy closest = null;
|
|
int minDist = int.MaxValue;
|
|
|
|
foreach (var e in Board.Entities)
|
|
{
|
|
if (e is Enemy enemy)
|
|
{
|
|
int dist = Utils.ManhattanDistance(X, Y, enemy.X, enemy.Y);
|
|
if (dist < minDist)
|
|
{
|
|
minDist = dist;
|
|
closest = enemy;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (closest != null)
|
|
{
|
|
if (X < closest.X) X++;
|
|
else if (X > closest.X) X--;
|
|
else if (Y < closest.Y) Y++;
|
|
else if (Y > closest.Y) Y--;
|
|
|
|
if (X == closest.X && Y == closest.Y)
|
|
{
|
|
Board.Entities.Remove(closest);
|
|
IsReturning = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
IsReturning = true;
|
|
}
|
|
}
|
|
|
|
protected void ReturnToTownHall()
|
|
{
|
|
var th = Board.TownHall;
|
|
|
|
if (X < th.X) X++;
|
|
else if (X > th.X) X--;
|
|
else if (Y < th.Y) Y++;
|
|
else if (Y > th.Y) Y--;
|
|
|
|
if (X == th.X && Y == th.Y)
|
|
IsReturning = false;
|
|
}
|
|
} |