Allies 02 code maintenance. Add FreeActorInit so free harvesters with procs can be disabled etc

This commit is contained in:
Scott_NZ
2013-02-25 20:37:08 +13:00
parent 3bc9e7d2e4
commit e57de0ebce
6 changed files with 95 additions and 182 deletions

View File

@@ -57,6 +57,7 @@ namespace OpenRA.Mods.RA.Missions
Actor sam2;
Actor sam3;
Actor sam4;
Actor[] sams;
Actor tanya;
Actor einstein;
Actor engineer;
@@ -74,8 +75,6 @@ namespace OpenRA.Mods.RA.Missions
Actor parabombPoint1;
Actor parabombPoint2;
Actor sovietRallyPoint;
Actor flamersEntryPoint;
Actor tanksEntryPoint;
Actor townPoint;
Actor sovietTownAttackPoint1;
Actor sovietTownAttackPoint2;
@@ -103,7 +102,7 @@ namespace OpenRA.Mods.RA.Missions
static readonly string[] SovietVehicles1 = { "3tnk" };
static readonly string[] SovietVehicles2 = { "3tnk", "v2rl" };
const int SovietVehiclesUpgradeTicks = 1500 * 4;
const int SovietGroupSize = 20;
const int SovietGroupSize = 5;
const int ReinforcementsTicks = 1500 * 12;
static readonly string[] Reinforcements =
@@ -180,12 +179,6 @@ namespace OpenRA.Mods.RA.Missions
if (allies1 != allies2)
{
if (world.FrameNumber == TanksTicks)
RushSovietUnits();
if (world.FrameNumber == FlamersTicks)
RushSovietFlamers();
if (yak == null || (yak != null && !yak.IsDead() && (yak.GetCurrentActivity() is FlyCircle || yak.IsIdle)))
{
var alliedUnitsNearYakPoint = world.FindAliveCombatantActorsInCircle(yakAttackPoint.CenterLocation, 10)
@@ -218,22 +211,19 @@ namespace OpenRA.Mods.RA.Missions
}
if (objectives[DestroySamSitesID].Status == ObjectiveStatus.InProgress)
{
if ((sam1.Destroyed || sam1.Owner != soviets)
&& (sam2.Destroyed || sam2.Owner != soviets)
&& (sam3.Destroyed || sam3.Owner != soviets)
&& (sam4.Destroyed || sam4.Owner != soviets))
if (sams.All(s => s.IsDead() || s.Owner != soviets))
{
objectives[DestroySamSitesID].Status = ObjectiveStatus.Completed;
objectives[ExtractEinsteinID].Status = ObjectiveStatus.InProgress;
OnObjectivesUpdated(true);
SpawnSignalFlare();
world.CreateActor(SignalFlareName, new TypeDictionary { new OwnerInit(allies1), new LocationInit(extractionLZ.Location) });
Sound.Play("flaren1.aud");
ExtractEinsteinAtLZ();
}
}
if (objectives[ExtractEinsteinID].Status == ObjectiveStatus.InProgress && einsteinChinook != null)
{
if (einsteinChinook.Destroyed)
if (einsteinChinook.IsDead())
{
objectives[ExtractEinsteinID].Status = ObjectiveStatus.Failed;
objectives[MaintainPresenceID].Status = ObjectiveStatus.Failed;
@@ -253,22 +243,19 @@ namespace OpenRA.Mods.RA.Missions
}
}
if (tanya.Destroyed)
if (tanya.IsDead())
MissionFailed("Tanya was killed.");
else if (einstein.Destroyed)
else if (einstein.IsDead())
MissionFailed("Einstein was killed.");
world.AddFrameEndTask(w =>
else if (!world.Actors.Any(a => (a.Owner == allies || a.Owner == allies2) && !a.IsDead()
&& (a.HasTrait<Building>() && !a.HasTrait<Wall>()) || a.HasTrait<BaseBuilding>()))
{
if (!world.FindAliveCombatantActorsInCircle(allies2BasePoint.CenterLocation, 20)
.Any(a => a.HasTrait<Building>() && !a.HasTrait<Wall>() && (a.Owner == allies || a.Owner == allies2)))
{
objectives[MaintainPresenceID].Status = ObjectiveStatus.Failed;
OnObjectivesUpdated(true);
MissionFailed("The Allied reinforcements have been defeated.");
}
});
objectives[MaintainPresenceID].Status = ObjectiveStatus.Failed;
OnObjectivesUpdated(true);
MissionFailed("The Allied reinforcements have been defeated.");
}
}
void UpdateDeaths()
@@ -308,10 +295,10 @@ namespace OpenRA.Mods.RA.Missions
void BuildSovietUnits()
{
if (!sovietBarracks.Destroyed)
if (!sovietBarracks.IsDead())
BuildSovietUnit(InfantryQueueName, SovietInfantry.Random(world.SharedRandom));
if (!sovietWarFactory.Destroyed)
if (!sovietWarFactory.IsDead())
{
var vehicles = world.FrameNumber >= SovietVehiclesUpgradeTicks ? SovietVehicles2 : SovietVehicles1;
BuildSovietUnit(VehicleQueueName, vehicles.Random(world.SharedRandom));
@@ -320,44 +307,39 @@ namespace OpenRA.Mods.RA.Missions
void ManageSovietUnits()
{
var idleSovietUnitsAtRP = world.FindAliveCombatantActorsInCircle(sovietRallyPoint.CenterLocation, 3)
.Where(a => a.Owner == soviets && a.IsIdle && a.HasTrait<IMove>());
if (idleSovietUnitsAtRP.Count() >= SovietGroupSize)
var units = world.FindAliveCombatantActorsInCircle(sovietRallyPoint.CenterLocation, 10)
.Where(u => u.IsIdle && u.HasTrait<Mobile>() && u.HasTrait<AttackBase>() && u.Owner == soviets)
.Except(world.WorldActor.Trait<SpawnMapActors>().Actors.Values);
if (units.Count() >= SovietGroupSize)
{
var firstUnit = idleSovietUnitsAtRP.FirstOrDefault();
if (firstUnit != null)
foreach (var unit in units)
MissionUtils.AttackNearestLandActor(true, unit, allies2);
}
var scatteredUnits = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && u.IsIdle
&& u.HasTrait<Mobile>() && u.HasTrait<AttackBase>() && u.Owner == soviets)
.Except(world.WorldActor.Trait<SpawnMapActors>().Actors.Values)
.Except(units);
foreach (var unit in scatteredUnits)
MissionUtils.AttackNearestLandActor(true, unit, allies2);
}
void SetupAlliedBase()
{
foreach (var actor in world.Actors.Where(a => a.Owner == allies && a != allies.PlayerActor))
{
actor.ChangeOwner(allies2);
if (actor.Info.Name == "pbox")
{
var closestAlliedBuilding = ClosestAlliedBuilding(firstUnit, 40);
if (closestAlliedBuilding != null)
foreach (var unit in idleSovietUnitsAtRP)
{
unit.Trait<Mobile>().Nudge(unit, unit, true);
unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Attack(Target.FromActor(closestAlliedBuilding), 3)));
}
actor.AddTrait(new TransformedAction(s => s.Trait<Cargo>().Load(s, world.CreateActor(false, "e1", allies2, null, null))));
actor.QueueActivity(new Transform(actor, "hbox.e1") { SkipMakeAnims = true });
}
if (actor.Info.Name == "proc")
actor.QueueActivity(new Transform(actor, "proc") { SkipMakeAnims = true });
foreach (var c in actor.TraitsImplementing<INotifyCapture>())
c.OnCapture(actor, actor, allies, allies2);
}
var idleSovietUnits = world.FindAliveCombatantActorsInCircle(allies2BasePoint.CenterLocation, 20)
.Where(a => a.Owner == soviets && a.IsIdle && a.HasTrait<IMove>());
foreach (var unit in idleSovietUnits)
{
var closestAlliedBuilding = ClosestAlliedBuilding(unit, 40);
if (closestAlliedBuilding != null)
unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Attack(Target.FromActor(closestAlliedBuilding), 3)));
}
}
Actor ClosestAlliedBuilding(Actor actor, int range)
{
return MissionUtils.ClosestPlayerBuilding(world, allies2, actor.CenterLocation, range);
}
IEnumerable<Actor> ClosestAlliedBuildings(Actor actor, int range)
{
return MissionUtils.ClosestPlayerBuildings(world, allies2, actor.CenterLocation, range);
}
void InitializeSovietFactories()
@@ -365,7 +347,7 @@ namespace OpenRA.Mods.RA.Missions
var sbrp = sovietBarracks.Trait<RallyPoint>();
var swrp = sovietWarFactory.Trait<RallyPoint>();
sbrp.rallyPoint = swrp.rallyPoint = sovietRallyPoint.Location;
sbrp.nearEnough = swrp.nearEnough = 3;
sbrp.nearEnough = swrp.nearEnough = 6;
sovietBarracks.Trait<PrimaryBuilding>().SetPrimaryProducer(sovietBarracks, true);
sovietWarFactory.Trait<PrimaryBuilding>().SetPrimaryProducer(sovietWarFactory, true);
}
@@ -378,11 +360,6 @@ namespace OpenRA.Mods.RA.Missions
queue.ResolveOrder(queue.self, Order.StartProduction(queue.self, unit, 1));
}
void SpawnSignalFlare()
{
world.CreateActor(SignalFlareName, new TypeDictionary { new OwnerInit(allies1), new LocationInit(extractionLZ.Location) });
}
void StartReinforcementsTimer()
{
Sound.Play("timergo1.aud");
@@ -409,38 +386,6 @@ namespace OpenRA.Mods.RA.Missions
.QueueActivity(new Move.Move(allies2BasePoint.Location));
}
void RushSovietUnits()
{
var closestAlliedBuildings = ClosestAlliedBuildings(badgerDropPoint1, 40);
if (!closestAlliedBuildings.Any()) return;
foreach (var tank in Tanks)
{
var unit = world.CreateActor(tank, new TypeDictionary
{
new OwnerInit(soviets),
new LocationInit(tanksEntryPoint.Location)
});
foreach (var building in closestAlliedBuildings)
unit.QueueActivity(new Attack(Target.FromActor(building), 3));
}
}
void RushSovietFlamers()
{
var closestAlliedBuilding = ClosestAlliedBuilding(badgerDropPoint1, 40);
if (closestAlliedBuilding == null) return;
var apc = world.CreateActor(ApcName, new TypeDictionary { new OwnerInit(soviets), new LocationInit(flamersEntryPoint.Location) });
foreach (var flamer in Flamers)
{
var unit = world.CreateActor(false, flamer, new TypeDictionary { new OwnerInit(soviets) });
apc.Trait<Cargo>().Load(apc, unit);
}
apc.QueueActivity(new MoveAdjacentTo(Target.FromActor(closestAlliedBuilding)));
apc.QueueActivity(new UnloadCargo(true));
}
void ExtractEinsteinAtLZ()
{
einsteinChinook = MissionUtils.ExtractUnitWithChinook(
@@ -461,7 +406,7 @@ namespace OpenRA.Mods.RA.Missions
void TransferTownUnitsToAllies()
{
foreach (var unit in world.FindAliveNonCombatantActorsInCircle(townPoint.CenterLocation, AlliedTownTransferRange)
.Where(a => a.HasTrait<IMove>()))
.Where(a => a.HasTrait<Mobile>()))
unit.ChangeOwner(allies1);
}
@@ -492,11 +437,14 @@ namespace OpenRA.Mods.RA.Missions
allies = w.Players.Single(p => p.InternalName == "Allies");
soviets = w.Players.Single(p => p.InternalName == "Soviets");
soviets.PlayerActor.Trait<PlayerResources>().Cash = 1000;
var actors = w.WorldActor.Trait<SpawnMapActors>().Actors;
sam1 = actors["SAM1"];
sam2 = actors["SAM2"];
sam3 = actors["SAM3"];
sam4 = actors["SAM4"];
sams = new[] { sam1, sam2, sam3, sam4 };
tanya = actors["Tanya"];
einstein = actors["Einstein"];
engineer = actors["Engineer"];
@@ -515,17 +463,15 @@ namespace OpenRA.Mods.RA.Missions
sovietBarracks = actors["SovietBarracks"];
sovietWarFactory = actors["SovietWarFactory"];
sovietRallyPoint = actors["SovietRallyPoint"];
flamersEntryPoint = actors["FlamersEntryPoint"];
tanksEntryPoint = actors["TanksEntryPoint"];
townPoint = actors["TownPoint"];
sovietTownAttackPoint1 = actors["SovietTownAttackPoint1"];
sovietTownAttackPoint2 = actors["SovietTownAttackPoint2"];
yakEntryPoint = actors["YakEntryPoint"];
yakAttackPoint = actors["YakAttackPoint"];
SetupAlliedBase(actors);
SetupAlliedBase();
var shroud = w.WorldActor.Trait<Shroud>();
var shroud = allies1.Shroud;
shroud.Explore(w, sam1.Location, 2);
shroud.Explore(w, sam2.Location, 2);
shroud.Explore(w, sam3.Location, 2);
@@ -539,20 +485,5 @@ namespace OpenRA.Mods.RA.Missions
MissionUtils.PlayMissionMusic();
}
void SetupAlliedBase(Dictionary<string, Actor> actors)
{
world.AddFrameEndTask(w =>
{
foreach (var actor in actors.Where(a => a.Value.Owner == allies))
actor.Value.ChangeOwner(allies2);
world.CreateActor("proc", new TypeDictionary
{
new LocationInit(actors["Allies2ProcPoint"].Location),
new OwnerInit(allies2)
});
});
}
}
}