Convert HackyAI to world coords.

This commit is contained in:
Paul Chote
2013-07-20 13:07:35 +12:00
parent 6201d7bfe2
commit c1a0836640

View File

@@ -168,7 +168,7 @@ namespace OpenRA.Mods.RA.AI
if (owner.IsEmpty) return false; if (owner.IsEmpty) return false;
var u = owner.units.Random(owner.random); var u = owner.units.Random(owner.random);
var units = owner.world.FindUnitsInCircle(u.CenterLocation, Game.CellSize * dangerRadius).ToList(); var units = owner.world.FindUnitsInCircle(u.CenterPosition, WRange.FromCells(dangerRadius)).ToList();
var ownBaseBuildingAround = units.Where(unit => unit.Owner == owner.bot.p && unit.HasTrait<Building>()).ToList(); var ownBaseBuildingAround = units.Where(unit => unit.Owner == owner.bot.p && unit.HasTrait<Building>()).ToList();
if (ownBaseBuildingAround.Count > 0) return false; if (ownBaseBuildingAround.Count > 0) return false;
@@ -301,7 +301,7 @@ namespace OpenRA.Mods.RA.AI
for (int j = 0; j < y; j += dangerRadius * 2) for (int j = 0; j < y; j += dangerRadius * 2)
{ {
CPos pos = new CPos(i, j); CPos pos = new CPos(i, j);
if (NearToPosSafely(owner, pos.ToPPos(), out detectedEnemyTarget)) if (NearToPosSafely(owner, pos.CenterPosition, out detectedEnemyTarget))
{ {
if (needTarget) if (needTarget)
{ {
@@ -316,16 +316,16 @@ namespace OpenRA.Mods.RA.AI
return null; return null;
} }
protected static bool NearToPosSafely(Squad owner, PPos loc) protected static bool NearToPosSafely(Squad owner, WPos loc)
{ {
Actor a; Actor a;
return NearToPosSafely(owner, loc, out a); return NearToPosSafely(owner, loc, out a);
} }
protected static bool NearToPosSafely(Squad owner, PPos loc, out Actor detectedEnemyTarget) protected static bool NearToPosSafely(Squad owner, WPos loc, out Actor detectedEnemyTarget)
{ {
detectedEnemyTarget = null; detectedEnemyTarget = null;
var unitsAroundPos = owner.world.FindUnitsInCircle(loc, Game.CellSize * dangerRadius) var unitsAroundPos = owner.world.FindUnitsInCircle(loc, WRange.FromCells(dangerRadius))
.Where(unit => owner.bot.p.Stances[unit.Owner] == Stance.Enemy).ToList(); .Where(unit => owner.bot.p.Stances[unit.Owner] == Stance.Enemy).ToList();
int missileUnitsCount = 0; int missileUnitsCount = 0;
@@ -412,7 +412,7 @@ namespace OpenRA.Mods.RA.AI
if (!owner.TargetIsValid) if (!owner.TargetIsValid)
{ {
var a = owner.units.Random(owner.random); var a = owner.units.Random(owner.random);
var closestEnemy = owner.bot.FindClosestEnemy(a.CenterLocation); var closestEnemy = owner.bot.FindClosestEnemy(a.CenterPosition);
if (closestEnemy != null) if (closestEnemy != null)
owner.Target = closestEnemy; owner.Target = closestEnemy;
else else
@@ -422,7 +422,7 @@ namespace OpenRA.Mods.RA.AI
} }
} }
if (!NearToPosSafely(owner, owner.Target.CenterLocation)) if (!NearToPosSafely(owner, owner.Target.CenterPosition))
{ {
owner.fsm.ChangeState(new AirFleeState(), true); owner.fsm.ChangeState(new AirFleeState(), true);
return; return;
@@ -504,12 +504,12 @@ namespace OpenRA.Mods.RA.AI
if (owner.IsEmpty) return; if (owner.IsEmpty) return;
if (!owner.TargetIsValid) if (!owner.TargetIsValid)
{ {
var t = owner.bot.FindClosestEnemy(owner.units.FirstOrDefault().CenterLocation); var t = owner.bot.FindClosestEnemy(owner.units.FirstOrDefault().CenterPosition);
if (t == null) return; if (t == null) return;
owner.Target = t; owner.Target = t;
} }
var enemyUnits = owner.world.FindUnitsInCircle(owner.Target.CenterLocation, Game.CellSize * 10) var enemyUnits = owner.world.FindUnitsInCircle(owner.Target.CenterPosition, WRange.FromCells(10))
.Where(unit => owner.bot.p.Stances[unit.Owner] == Stance.Enemy).ToList(); .Where(unit => owner.bot.p.Stances[unit.Owner] == Stance.Enemy).ToList();
if (enemyUnits.Any()) if (enemyUnits.Any())
@@ -541,7 +541,7 @@ namespace OpenRA.Mods.RA.AI
if (!owner.TargetIsValid) if (!owner.TargetIsValid)
{ {
var closestEnemy = owner.bot.FindClosestEnemy(owner.units.Random(owner.random).CenterLocation); var closestEnemy = owner.bot.FindClosestEnemy(owner.units.Random(owner.random).CenterPosition);
if (closestEnemy != null) if (closestEnemy != null)
owner.Target = closestEnemy; owner.Target = closestEnemy;
else else
@@ -551,10 +551,10 @@ namespace OpenRA.Mods.RA.AI
} }
} }
Actor leader = owner.units.ClosestTo(owner.Target.CenterLocation); Actor leader = owner.units.ClosestTo(owner.Target.CenterPosition);
if (leader == null) if (leader == null)
return; return;
var ownUnits = owner.world.FindUnitsInCircle(leader.CenterLocation, Game.CellSize * owner.units.Count/3) var ownUnits = owner.world.FindUnitsInCircle(leader.CenterPosition, WRange.FromCells(owner.units.Count) / 3)
.Where(a => a.Owner == owner.units.FirstOrDefault().Owner && owner.units.Contains(a)).ToList(); .Where(a => a.Owner == owner.units.FirstOrDefault().Owner && owner.units.Contains(a)).ToList();
if (ownUnits.Count < owner.units.Count) if (ownUnits.Count < owner.units.Count)
{ {
@@ -564,12 +564,12 @@ namespace OpenRA.Mods.RA.AI
} }
else else
{ {
var enemys = owner.world.FindUnitsInCircle(leader.CenterLocation, Game.CellSize * 12) var enemys = owner.world.FindUnitsInCircle(leader.CenterPosition, WRange.FromCells(12))
.Where(a1 => !a1.Destroyed && !a1.IsDead()).ToList(); .Where(a1 => !a1.Destroyed && !a1.IsDead()).ToList();
var enemynearby = enemys.Where(a1 => a1.HasTrait<ITargetable>() && leader.Owner.Stances[a1.Owner] == Stance.Enemy).ToList(); var enemynearby = enemys.Where(a1 => a1.HasTrait<ITargetable>() && leader.Owner.Stances[a1.Owner] == Stance.Enemy).ToList();
if (enemynearby.Any()) if (enemynearby.Any())
{ {
owner.Target = enemynearby.ClosestTo(leader.CenterLocation); owner.Target = enemynearby.ClosestTo(leader.CenterPosition);
owner.fsm.ChangeState(new GroundUnitsAttackState(), true); owner.fsm.ChangeState(new GroundUnitsAttackState(), true);
return; return;
} }
@@ -598,7 +598,7 @@ namespace OpenRA.Mods.RA.AI
if (!owner.TargetIsValid) if (!owner.TargetIsValid)
{ {
var closestEnemy = owner.bot.FindClosestEnemy(owner.units.Random(owner.random).CenterLocation); var closestEnemy = owner.bot.FindClosestEnemy(owner.units.Random(owner.random).CenterPosition);
if (closestEnemy != null) if (closestEnemy != null)
owner.Target = closestEnemy; owner.Target = closestEnemy;
else else
@@ -609,7 +609,7 @@ namespace OpenRA.Mods.RA.AI
} }
foreach (var a in owner.units) foreach (var a in owner.units)
if (!BusyAttack(a)) if (!BusyAttack(a))
owner.world.IssueOrder(new Order("Attack", a, false) { TargetActor = owner.bot.FindClosestEnemy(a.CenterLocation) }); owner.world.IssueOrder(new Order("Attack", a, false) { TargetActor = owner.bot.FindClosestEnemy(a.CenterPosition) });
if (MayBeFlee(owner)) if (MayBeFlee(owner))
{ {
@@ -652,7 +652,7 @@ namespace OpenRA.Mods.RA.AI
if (owner.IsEmpty) return; if (owner.IsEmpty) return;
if (!owner.TargetIsValid) if (!owner.TargetIsValid)
{ {
owner.Target = owner.bot.FindClosestEnemy(AverageUnitsPosition(owner.units).Value.ToPPos(), 8); owner.Target = owner.bot.FindClosestEnemy(AverageUnitsPosition(owner.units).Value.CenterPosition, WRange.FromCells(8));
if (owner.Target == null) if (owner.Target == null)
{ {
@@ -915,12 +915,12 @@ namespace OpenRA.Mods.RA.AI
var bi = Rules.Info[actorType].Traits.Get<BuildingInfo>(); var bi = Rules.Info[actorType].Traits.Get<BuildingInfo>();
if (bi == null) return null; if (bi == null) return null;
Func<PPos, CPos, CPos?> findPos = (PPos pos, CPos center) => Func<WPos, CPos, CPos?> findPos = (WPos pos, CPos center) =>
{ {
for (var k = MaxBaseDistance; k >= 0; k--) for (var k = MaxBaseDistance; k >= 0; k--)
{ {
var tlist = world.FindTilesInCircle(center, k) var tlist = world.FindTilesInCircle(center, k)
.OrderBy(a => (new PPos(a.ToPPos().X, a.ToPPos().Y) - pos).LengthSquared); .OrderBy(a => (a.CenterPosition - pos).LengthSquared);
foreach (var t in tlist) foreach (var t in tlist)
if (world.CanPlaceBuilding(actorType, bi, t, null)) if (world.CanPlaceBuilding(actorType, bi, t, null))
if (bi.IsCloseEnoughToBase(world, p, actorType, t)) if (bi.IsCloseEnoughToBase(world, p, actorType, t))
@@ -933,14 +933,14 @@ namespace OpenRA.Mods.RA.AI
switch(type) switch(type)
{ {
case BuildingType.Defense: case BuildingType.Defense:
Actor enemyBase = FindEnemyBuildingClosestToPos(baseCenter.ToPPos()); Actor enemyBase = FindEnemyBuildingClosestToPos(baseCenter.CenterPosition);
return enemyBase != null ? findPos(enemyBase.CenterLocation, defenseCenter) : null; return enemyBase != null ? findPos(enemyBase.CenterPosition, defenseCenter) : null;
case BuildingType.Refinery: case BuildingType.Refinery:
var tilesPos = world.FindTilesInCircle(baseCenter, MaxBaseDistance) var tilesPos = world.FindTilesInCircle(baseCenter, MaxBaseDistance)
.Where(a => resourceTypes.Contains(world.GetTerrainType(new CPos(a.X, a.Y)))) .Where(a => resourceTypes.Contains(world.GetTerrainType(new CPos(a.X, a.Y))))
.OrderBy(a => (new PPos(a.ToPPos().X, a.ToPPos().Y) - baseCenter.ToPPos()).LengthSquared); .OrderBy(a => (a.CenterPosition - baseCenter.CenterPosition).LengthSquared);
return tilesPos.Any() ? findPos(tilesPos.First().ToPPos(), baseCenter) : null; return tilesPos.Any() ? findPos(tilesPos.First().CenterPosition, baseCenter) : null;
case BuildingType.Building: case BuildingType.Building:
for (var k = 0; k < maxBaseDistance; k++) for (var k = 0; k < maxBaseDistance; k++)
@@ -1006,7 +1006,7 @@ namespace OpenRA.Mods.RA.AI
Actor target = null; Actor target = null;
if (targets.Any()) if (targets.Any())
target = targets.ClosestTo(baseCenter.ToPPos()); target = targets.ClosestTo(baseCenter.CenterPosition);
if (target == null) if (target == null)
{ {
@@ -1024,7 +1024,7 @@ namespace OpenRA.Mods.RA.AI
return target; return target;
} }
internal Actor FindClosestEnemy(PPos pos) internal Actor FindClosestEnemy(WPos pos)
{ {
var allEnemyUnits = world.Actors var allEnemyUnits = world.Actors
.Where(unit => p.Stances[unit.Owner] == Stance.Enemy && !unit.HasTrait<Husk>() && .Where(unit => p.Stances[unit.Owner] == Stance.Enemy && !unit.HasTrait<Husk>() &&
@@ -1035,9 +1035,9 @@ namespace OpenRA.Mods.RA.AI
return null; return null;
} }
internal Actor FindClosestEnemy(PPos pos, int radius) internal Actor FindClosestEnemy(WPos pos, WRange radius)
{ {
var enemyUnits = world.FindUnitsInCircle(pos, Game.CellSize * radius) var enemyUnits = world.FindUnitsInCircle(pos, radius)
.Where(unit => p.Stances[unit.Owner] == Stance.Enemy && .Where(unit => p.Stances[unit.Owner] == Stance.Enemy &&
!unit.HasTrait<Husk>() && unit.HasTrait<ITargetable>()).ToList(); !unit.HasTrait<Husk>() && unit.HasTrait<ITargetable>()).ToList();
@@ -1053,7 +1053,7 @@ namespace OpenRA.Mods.RA.AI
return bases != null ? bases : new List<Actor>(); return bases != null ? bases : new List<Actor>();
} }
Actor FindEnemyBuildingClosestToPos(PPos pos) Actor FindEnemyBuildingClosestToPos(WPos pos)
{ {
var closestBuilding = world.Actors.Where(a => p.Stances[a.Owner] == Stance.Enemy && a.HasTrait<IHasLocation>() var closestBuilding = world.Actors.Where(a => p.Stances[a.Owner] == Stance.Enemy && a.HasTrait<IHasLocation>()
&& !a.Destroyed && a.HasTrait<Building>()).ClosestTo(pos); && !a.Destroyed && a.HasTrait<Building>()).ClosestTo(pos);
@@ -1194,7 +1194,7 @@ namespace OpenRA.Mods.RA.AI
if (!allEnemyBaseBuilder.Any() || (ownUnits.Count < Info.SquadSize)) return; if (!allEnemyBaseBuilder.Any() || (ownUnits.Count < Info.SquadSize)) return;
foreach (var b in allEnemyBaseBuilder) foreach (var b in allEnemyBaseBuilder)
{ {
var enemys = world.FindUnitsInCircle(b.CenterLocation, Game.CellSize * 15) var enemys = world.FindUnitsInCircle(b.CenterPosition, WRange.FromCells(15))
.Where(unit => p.Stances[unit.Owner] == Stance.Enemy && unit.HasTrait<AttackBase>()).ToList(); .Where(unit => p.Stances[unit.Owner] == Stance.Enemy && unit.HasTrait<AttackBase>()).ToList();
rushFuzzy.CalculateFuzzy(ownUnits, enemys); rushFuzzy.CalculateFuzzy(ownUnits, enemys);
@@ -1223,7 +1223,7 @@ namespace OpenRA.Mods.RA.AI
protectSq.Target = attacker; protectSq.Target = attacker;
if (protectSq.IsEmpty) if (protectSq.IsEmpty)
{ {
var ownUnits = world.FindUnitsInCircle(baseCenter.ToPPos(), Game.CellSize * 15) var ownUnits = world.FindUnitsInCircle(baseCenter.CenterPosition, WRange.FromCells(15))
.Where(unit => unit.Owner == p && !unit.HasTrait<Building>() .Where(unit => unit.Owner == p && !unit.HasTrait<Building>()
&& unit.HasTrait<AttackBase>()).ToList(); && unit.HasTrait<AttackBase>()).ToList();
foreach (var a in ownUnits) foreach (var a in ownUnits)
@@ -1340,7 +1340,7 @@ namespace OpenRA.Mods.RA.AI
for (int j = 0; j < y; j += radiusOfPower * 2) for (int j = 0; j < y; j += radiusOfPower * 2)
{ {
CPos pos = new CPos(i, j); CPos pos = new CPos(i, j);
var targets = world.FindUnitsInCircle(pos.ToPPos(), Game.CellSize * radiusOfPower).ToList(); var targets = world.FindUnitsInCircle(pos.CenterPosition, WRange.FromCells(radiusOfPower)).ToList();
var enemys = targets.Where(unit => p.Stances[unit.Owner] == Stance.Enemy).ToList(); var enemys = targets.Where(unit => p.Stances[unit.Owner] == Stance.Enemy).ToList();
var ally = targets.Where(unit => p.Stances[unit.Owner] == Stance.Ally || unit.Owner == p).ToList(); var ally = targets.Where(unit => p.Stances[unit.Owner] == Stance.Ally || unit.Owner == p).ToList();