Improve the Soviet attack routines for Allies 01

This commit is contained in:
Scott_NZ
2012-09-29 02:44:53 +12:00
parent 0cd258f24f
commit fcc0bcf438
2 changed files with 48 additions and 12 deletions

View File

@@ -14,6 +14,8 @@ using System.Drawing;
using System.Linq;
using OpenRA.FileFormats;
using OpenRA.Mods.RA.Activities;
using OpenRA.Mods.RA.Air;
using OpenRA.Mods.RA.Move;
using OpenRA.Network;
using OpenRA.Scripting;
using OpenRA.Traits;
@@ -134,15 +136,19 @@ namespace OpenRA.Mods.RA.Missions
}
if (objectives[ExtractEinsteinID].Status == ObjectiveStatus.InProgress)
{
if (world.FrameNumber % 25 == 0)
{
SendAttackWave();
}
if (world.FrameNumber >= currentAttackWaveFrameNumber + 600)
{
Sound.Play("enmyapp1.aud");
SendAttackWave(AttackWave);
SpawnAttackWave(AttackWave);
currentAttackWave++;
currentAttackWaveFrameNumber = world.FrameNumber;
if (currentAttackWave >= EinsteinChinookAttackWave)
{
SendAttackWave(LastAttackWaveAddition);
SpawnAttackWave(LastAttackWaveAddition);
}
if (currentAttackWave == EinsteinChinookAttackWave)
{
@@ -188,22 +194,47 @@ namespace OpenRA.Mods.RA.Missions
world.CreateActor(SignalFlareName, new TypeDictionary { new OwnerInit(allies), new LocationInit(extractionLZ.Location) });
}
void SendAttackWave(IEnumerable<string> wave)
void SpawnAttackWave(IEnumerable<string> wave)
{
foreach (var unit in wave)
{
var spawnActor = world.SharedRandom.Next(2) == 0 ? attackEntryPoint1 : attackEntryPoint2;
var actor = world.CreateActor(unit, new TypeDictionary { new OwnerInit(soviets), new LocationInit(spawnActor.Location) });
}
}
void SendAttackWave()
{
foreach (var unit in world.Actors.Where(
a => a != world.WorldActor
&& a.IsInWorld
&& a.Owner == soviets
&& !a.IsDead()
&& a.IsIdle
&& a.HasTrait<Mobile>()
&& a.HasTrait<AttackBase>()))
{
Activity innerActivity;
if (einstein != null && einstein.IsInWorld)
if (einstein != null)
{
innerActivity = new Attack(Target.FromActor(einstein), 3);
if (einstein.IsInWorld)
{
innerActivity = new Attack(Target.FromActor(einstein), 3);
}
else
{
var container = world.UnitContaining(einstein);
if (container != null && !container.HasTrait<Aircraft>() && container.HasTrait<Mobile>())
{
innerActivity = new Attack(Target.FromActor(container), 3);
}
else
{
innerActivity = new Move.Move(extractionLZ.Location, 3);
}
}
unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, innerActivity));
}
else
{
innerActivity = new Move.Move(extractionLZ.Location, 3);
}
actor.QueueActivity(new AttackMove.AttackMoveActivity(actor, innerActivity));
}
}

View File

@@ -24,13 +24,13 @@ namespace OpenRA.Mods.RA.Missions
public static IEnumerable<Actor> FindAliveCombatantActorsInCircle(this World world, PPos location, int range)
{
return world.FindUnitsInCircle(location, Game.CellSize * range)
.Where(a => a.IsInWorld && a != world.WorldActor && !a.Destroyed && !a.Owner.NonCombatant);
.Where(a => a.IsInWorld && a != world.WorldActor && !a.IsDead() && !a.Owner.NonCombatant);
}
public static IEnumerable<Actor> FindAliveNonCombatantActorsInCircle(this World world, PPos location, int range)
{
return world.FindUnitsInCircle(location, Game.CellSize * range)
.Where(a => a.IsInWorld && a != world.WorldActor && !a.Destroyed && a.Owner.NonCombatant);
.Where(a => a.IsInWorld && a != world.WorldActor && !a.IsDead() && a.Owner.NonCombatant);
}
public static Actor ExtractUnitWithChinook(World world, Player owner, Actor unit, CPos entry, CPos lz, CPos exit)
@@ -90,5 +90,10 @@ namespace OpenRA.Mods.RA.Missions
.Where(a => a.Actor.Owner == player && a.Trait.Info.Type == category)
.Select(a => a.Trait);
}
public static Actor UnitContaining(this World world, Actor actor)
{
return world.Actors.FirstOrDefault(a => a.HasTrait<Cargo>() && a.Trait<Cargo>().Passengers.Contains(actor));
}
}
}