Improve the Soviet attacks more

This commit is contained in:
Scott_NZ
2012-11-04 16:20:46 +13:00
parent 9238de6a47
commit fd734c8553

View File

@@ -160,7 +160,7 @@ namespace OpenRA.Mods.RA.Missions
res.TakeCash(res.Cash);
}
void AirStrafe(string actor)
void AirStrafe(string withActor)
{
var spawnPoint = world.ChooseRandomEdgeCell();
var aircraft = world.Actors.Where(
@@ -168,11 +168,11 @@ namespace OpenRA.Mods.RA.Missions
&& a.Owner == soviets && a.IsIdle && a.IsInWorld);
if (aircraft.Count() < 4)
{
var a = world.CreateActor(actor, new TypeDictionary
var a = world.CreateActor(withActor, new TypeDictionary
{
new LocationInit(spawnPoint),
new OwnerInit(soviets),
new AltitudeInit(Rules.Info[actor].Traits.Get<PlaneInfo>().CruiseAltitude)
new AltitudeInit(Rules.Info[withActor].Traits.Get<PlaneInfo>().CruiseAltitude)
});
aircraft = aircraft.Concat(new[] { a });
}
@@ -182,19 +182,19 @@ namespace OpenRA.Mods.RA.Missions
}
}
void AirStrafe(Actor aircraft)
void AirStrafe(Actor self)
{
var enemies = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && (u.Owner == allies1 || u.Owner == allies2) && ((u.HasTrait<Building>() && !u.HasTrait<Wall>()) || u.HasTrait<Mobile>()));
var targetEnemy = enemies.OrderBy(u => (aircraft.CenterLocation - u.CenterLocation).LengthSquared).FirstOrDefault();
if (targetEnemy != null && aircraft.Trait<LimitedAmmo>().HasAmmo())
var targetEnemy = enemies.OrderBy(u => (self.CenterLocation - u.CenterLocation).LengthSquared).FirstOrDefault();
if (targetEnemy != null && self.Trait<LimitedAmmo>().HasAmmo())
{
aircraft.QueueActivity(new FlyAttack(Target.FromActor(targetEnemy)));
aircraft.QueueActivity(new CallFunc(() => AirStrafe(aircraft)));
self.QueueActivity(new FlyAttack(Target.FromActor(targetEnemy)));
self.QueueActivity(new CallFunc(() => AirStrafe(self)));
}
else
{
aircraft.QueueActivity(new FlyOffMap());
aircraft.QueueActivity(new RemoveSelf());
self.QueueActivity(new FlyOffMap());
self.QueueActivity(new RemoveSelf());
}
}
@@ -221,6 +221,17 @@ namespace OpenRA.Mods.RA.Missions
unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Move.Move(rallyPoint, 3)));
}
void AttackNearestAlliedActor(Actor self)
{
var enemies = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && (u.Owner == allies1 || u.Owner == allies2)
&& ((u.HasTrait<Building>() && !u.HasTrait<Wall>()) || u.HasTrait<Mobile>()));
var targetEnemy = enemies.OrderBy(u => (self.CenterLocation - u.CenterLocation).LengthSquared).FirstOrDefault();
if (targetEnemy != null)
{
self.QueueActivity(new AttackMove.AttackMoveActivity(self, new Attack(Target.FromActor(targetEnemy), 3)));
}
}
void ManageSovietUnits()
{
foreach (var rallyPoint in sovietRallyPoints)
@@ -231,16 +242,17 @@ namespace OpenRA.Mods.RA.Missions
{
foreach (var unit in units)
{
var enemies = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && (u.Owner == allies1 || u.Owner == allies2)
&& ((u.HasTrait<Building>() && !u.HasTrait<Wall>()) || u.HasTrait<Mobile>()));
var targetEnemy = enemies.OrderBy(u => (unit.CenterLocation - u.CenterLocation).LengthSquared).FirstOrDefault();
if (targetEnemy != null)
{
unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Attack(Target.FromActor(targetEnemy), 3)));
}
AttackNearestAlliedActor(unit);
}
}
}
var scatteredUnits = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && u.HasTrait<Mobile>() && u.IsIdle && u.Owner == soviets)
.Except(world.WorldActor.Trait<SpawnMapActors>().Actors.Values)
.Except(sovietRallyPoints.SelectMany(rp => world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(rp), 10)));
foreach (var unit in scatteredUnits)
{
AttackNearestAlliedActor(unit);
}
}
void SpawnAlliedUnits()