Tidy campaign stuff

This commit is contained in:
Scott_NZ
2013-01-21 20:05:08 +13:00
parent 32830da3c2
commit 12e1a531fe
8 changed files with 186 additions and 255 deletions

View File

@@ -9,13 +9,11 @@
#endregion
using System.Collections.Generic;
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;
@@ -90,31 +88,16 @@ namespace OpenRA.Mods.RA.Missions
public void Tick(Actor self)
{
if (allies.WinState != WinState.Undefined)
{
return;
}
if (allies.WinState != WinState.Undefined) return;
if (world.FrameNumber % 1000 == 0)
{
Sound.Play(Taunts[world.SharedRandom.Next(Taunts.Length)]);
}
if (objectives[FindEinsteinID].Status == ObjectiveStatus.InProgress)
{
if (AlliesControlLab())
{
SpawnSignalFlare();
Sound.Play("flaren1.aud");
SpawnEinsteinAtLab();
SendShips();
objectives[FindEinsteinID].Status = ObjectiveStatus.Completed;
objectives[ExtractEinsteinID].Status = ObjectiveStatus.InProgress;
if (difficulty == "Easy")
{
ExtractEinsteinAtLZ();
}
OnObjectivesUpdated(true);
currentAttackWaveFrameNumber = world.FrameNumber;
}
LabSecured();
if (lab.Destroyed)
{
objectives[FindEinsteinID].Status = ObjectiveStatus.Failed;
@@ -126,21 +109,19 @@ namespace OpenRA.Mods.RA.Missions
{
if (difficulty != "Easy")
{
SendAttackWave();
ManageSovietUnits();
if (world.FrameNumber >= currentAttackWaveFrameNumber + 600)
{
Sound.Play("enmyapp1.aud");
SpawnAttackWave(AttackWave);
SpawnSovietUnits(AttackWave);
currentAttackWave++;
currentAttackWaveFrameNumber = world.FrameNumber;
if (currentAttackWave >= EinsteinChinookAttackWave)
{
SpawnAttackWave(LastAttackWaveAddition);
}
SpawnSovietUnits(LastAttackWaveAddition);
if (currentAttackWave == EinsteinChinookAttackWave)
{
ExtractEinsteinAtLZ();
}
}
}
if (einsteinChinook != null)
@@ -159,24 +140,38 @@ namespace OpenRA.Mods.RA.Missions
}
}
}
if (tanya != null && tanya.Destroyed)
{
MissionFailed("Tanya was killed.");
}
else if (einstein != null && einstein.Destroyed)
{
MissionFailed("Einstein was killed.");
}
ManageSovietOre();
}
void LabSecured()
{
SpawnSignalFlare();
Sound.Play("flaren1.aud");
SpawnEinsteinAtLab();
SendShips();
objectives[FindEinsteinID].Status = ObjectiveStatus.Completed;
objectives[ExtractEinsteinID].Status = ObjectiveStatus.InProgress;
if (difficulty == "Easy")
ExtractEinsteinAtLZ();
OnObjectivesUpdated(true);
currentAttackWaveFrameNumber = world.FrameNumber;
}
void ManageSovietOre()
{
var res = soviets.PlayerActor.Trait<PlayerResources>();
if (res.Ore > res.OreCapacity * 0.8)
{
res.TakeOre(res.OreCapacity / 10);
}
}
void SpawnSignalFlare()
@@ -184,7 +179,7 @@ namespace OpenRA.Mods.RA.Missions
world.CreateActor(SignalFlareName, new TypeDictionary { new OwnerInit(allies), new LocationInit(extractionLZ.Location) });
}
void SpawnAttackWave(IEnumerable<string> wave)
void SpawnSovietUnits(IEnumerable<string> wave)
{
foreach (var unit in wave)
{
@@ -193,7 +188,7 @@ namespace OpenRA.Mods.RA.Missions
}
}
void SendAttackWave()
void ManageSovietUnits()
{
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>()))
@@ -202,20 +197,17 @@ namespace OpenRA.Mods.RA.Missions
if (einstein != null)
{
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));
}
@@ -225,10 +217,12 @@ namespace OpenRA.Mods.RA.Missions
void SendPatrol()
{
for (int i = 0; i < Patrol.Length; i++)
{
var actor = world.CreateActor(Patrol[i], new TypeDictionary { new OwnerInit(soviets), new LocationInit(insertionLZ.Location + new CVec(-1 + i, 10 + i * 2)) });
actor.QueueActivity(new Move.Move(insertionLZ.Location));
}
world.CreateActor(Patrol[i], new TypeDictionary
{
new OwnerInit(soviets),
new LocationInit(insertionLZ.Location + new CVec(-1 + i, 10 + i * 2))
})
.QueueActivity(new Move.Move(insertionLZ.Location));
}
bool AlliesControlLab()
@@ -245,11 +239,12 @@ namespace OpenRA.Mods.RA.Missions
void SendShips()
{
for (int i = 0; i < Ships.Length; i++)
{
var actor = world.CreateActor(Ships[i],
new TypeDictionary { new OwnerInit(allies), new LocationInit(shipSpawnPoint.Location + new CVec(i * 2, 0)) });
actor.QueueActivity(new Move.Move(shipMovePoint.Location + new CVec(i * 4, 0)));
}
world.CreateActor(Ships[i], new TypeDictionary
{
new OwnerInit(allies),
new LocationInit(shipSpawnPoint.Location + new CVec(i * 2, 0))
})
.QueueActivity(new Move.Move(shipMovePoint.Location + new CVec(i * 4, 0)));
}
void ExtractEinsteinAtLZ()
@@ -282,9 +277,7 @@ namespace OpenRA.Mods.RA.Missions
void SetAlliedUnitsToDefensiveStance()
{
foreach (var actor in world.Actors.Where(a => a.IsInWorld && a.Owner == allies && !a.IsDead() && a.HasTrait<AutoTarget>()))
{
actor.Trait<AutoTarget>().stance = UnitStance.Defend;
}
}
public void WorldLoaded(World w)
@@ -317,17 +310,14 @@ namespace OpenRA.Mods.RA.Missions
Game.MoveViewport(insertionLZ.Location.ToFloat2());
if (MissionUtils.IsSingleClient(world))
{
Media.PlayFMVFullscreen(w, "ally1.vqa", () =>
{
Media.PlayFMVFullscreen(w, "landing.vqa", () =>
{
InsertTanyaAtLZ();
SendPatrol();
MissionUtils.PlayMissionMusic();
});
});
}
})
);
else
{
InsertTanyaAtLZ();

View File

@@ -9,7 +9,6 @@
#endregion
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using OpenRA.FileFormats;
using OpenRA.Mods.RA.Activities;
@@ -17,7 +16,6 @@ using OpenRA.Mods.RA.Air;
using OpenRA.Mods.RA.Buildings;
using OpenRA.Mods.RA.Effects;
using OpenRA.Mods.RA.Move;
using OpenRA.Network;
using OpenRA.Traits;
using OpenRA.Widgets;
@@ -144,9 +142,7 @@ namespace OpenRA.Mods.RA.Missions
{
MissionUtils.CoopMissionFailed(world, text, allies1, allies2);
if (reinforcementsTimer != null)
{
reinforcementsTimerWidget.Visible = false;
}
}
void MissionAccomplished(string text)
@@ -156,20 +152,19 @@ namespace OpenRA.Mods.RA.Missions
public void Tick(Actor self)
{
if (allies1.WinState != WinState.Undefined)
{
return;
}
if (allies1.WinState != WinState.Undefined) return;
if (world.FrameNumber % 50 == 1 && chinookHusk.IsInWorld)
{
world.Add(new Smoke(world, chinookHusk.CenterLocation, "smoke_m"));
}
if (world.FrameNumber == 1)
{
InitializeSovietFactories();
StartReinforcementsTimer();
}
reinforcementsTimer.Tick();
if (world.FrameNumber == ParatroopersTicks)
{
MissionUtils.Paradrop(world, soviets, Badger1Passengers, badgerEntryPoint1.Location, badgerDropPoint1.Location);
@@ -181,36 +176,35 @@ namespace OpenRA.Mods.RA.Missions
MissionUtils.Parabomb(world, soviets, badgerEntryPoint2.Location, parabombPoint1.Location);
MissionUtils.Parabomb(world, soviets, badgerEntryPoint2.Location + new CVec(0, 3), parabombPoint2.Location);
}
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)
.Where(a => a.Owner != soviets && a.HasTrait<IMove>() && a != tanya && a != einstein && a != engineer);
if (alliedUnitsNearYakPoint.Any())
{
YakStrafe(alliedUnitsNearYakPoint);
}
}
}
if (currentReinforcement > -1 && currentReinforcement < Reinforcements.Length && world.FrameNumber % 25 == 0)
{
SpawnAlliedUnit(Reinforcements[currentReinforcement++]);
}
if (world.FrameNumber % 25 == 0)
{
BuildSovietUnits();
ManageSovietUnits();
}
UpdateDeaths();
if (objectives[FindEinsteinID].Status == ObjectiveStatus.InProgress)
{
if (AlliesNearTown())
@@ -249,22 +243,21 @@ namespace OpenRA.Mods.RA.Missions
{
objectives[ExtractEinsteinID].Status = ObjectiveStatus.Completed;
objectives[MaintainPresenceID].Status = ObjectiveStatus.Completed;
if (objectives[FewDeathsID].Status == ObjectiveStatus.InProgress)
{
objectives[FewDeathsID].Status = ObjectiveStatus.Completed;
}
OnObjectivesUpdated(true);
MissionAccomplished("Einstein was rescued.");
}
}
if (tanya.Destroyed)
{
MissionFailed("Tanya was killed.");
}
else if (einstein.Destroyed)
{
MissionFailed("Einstein was killed.");
}
world.AddFrameEndTask(w =>
{
if (!world.FindAliveCombatantActorsInCircle(allies2BasePoint.CenterLocation, 20)
@@ -301,10 +294,10 @@ namespace OpenRA.Mods.RA.Missions
new AltitudeInit(Rules.Info[YakName].Traits.Get<PlaneInfo>().CruiseAltitude)
});
}
if (yak.Trait<LimitedAmmo>().HasAmmo())
{
yak.QueueActivity(new FlyAttack(Target.FromActor(candidates.Random(world.SharedRandom))));
}
else
{
yak.QueueActivity(new FlyOffMap());
@@ -315,9 +308,8 @@ namespace OpenRA.Mods.RA.Missions
void BuildSovietUnits()
{
if (!sovietBarracks.Destroyed)
{
BuildSovietUnit(InfantryQueueName, SovietInfantry.Random(world.SharedRandom));
}
if (!sovietWarFactory.Destroyed)
{
var vehicles = world.FrameNumber >= SovietVehiclesUpgradeTicks ? SovietVehicles2 : SovietVehicles1;
@@ -327,7 +319,9 @@ namespace OpenRA.Mods.RA.Missions
void ManageSovietUnits()
{
var idleSovietUnitsAtRP = world.FindAliveCombatantActorsInCircle(sovietRallyPoint.CenterLocation, 3).Where(a => a.Owner == soviets && a.IsIdle && a.HasTrait<IMove>());
var idleSovietUnitsAtRP = world.FindAliveCombatantActorsInCircle(sovietRallyPoint.CenterLocation, 3)
.Where(a => a.Owner == soviets && a.IsIdle && a.HasTrait<IMove>());
if (idleSovietUnitsAtRP.Count() >= SovietGroupSize)
{
var firstUnit = idleSovietUnitsAtRP.FirstOrDefault();
@@ -335,23 +329,23 @@ namespace OpenRA.Mods.RA.Missions
{
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)));
}
}
}
}
var idleSovietUnits = world.FindAliveCombatantActorsInCircle(allies2BasePoint.CenterLocation, 20).Where(a => a.Owner == soviets && a.IsIdle && a.HasTrait<IMove>());
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)));
}
}
}
@@ -378,10 +372,8 @@ namespace OpenRA.Mods.RA.Missions
void BuildSovietUnit(string category, string unit)
{
var queue = MissionUtils.FindQueues(world, soviets, category).FirstOrDefault(q => q.CurrentItem() == null);
if (queue == null)
{
return;
}
if (queue == null) return;
queue.ResolveOrder(queue.self, Order.StartProduction(queue.self, unit, 1));
}
@@ -407,22 +399,20 @@ namespace OpenRA.Mods.RA.Missions
void SpawnAlliedUnit(string unit)
{
var u = world.CreateActor(unit, new TypeDictionary
world.CreateActor(unit, new TypeDictionary
{
new LocationInit(reinforcementsEntryPoint.Location),
new FacingInit(0),
new OwnerInit(allies2)
});
u.QueueActivity(new Move.Move(allies2BasePoint.Location));
})
.QueueActivity(new Move.Move(allies2BasePoint.Location));
}
void RushSovietUnits()
{
var closestAlliedBuildings = ClosestAlliedBuildings(badgerDropPoint1, 40);
if (!closestAlliedBuildings.Any())
{
return;
}
if (!closestAlliedBuildings.Any()) return;
foreach (var tank in Tanks)
{
var unit = world.CreateActor(tank, new TypeDictionary
@@ -431,19 +421,15 @@ namespace OpenRA.Mods.RA.Missions
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;
}
if (closestAlliedBuilding == null) return;
var apc = world.CreateActor(ApcName, new TypeDictionary { new OwnerInit(soviets), new LocationInit(flamersEntryPoint.Location) });
foreach (var flamer in Flamers)
{
@@ -474,9 +460,7 @@ namespace OpenRA.Mods.RA.Missions
void TransferTownUnitsToAllies()
{
foreach (var unit in world.FindAliveNonCombatantActorsInCircle(townPoint.CenterLocation, AlliedTownTransferRange).Where(a => a.HasTrait<IMove>()))
{
unit.ChangeOwner(allies1);
}
}
void SovietsAttackTown()
@@ -485,10 +469,9 @@ namespace OpenRA.Mods.RA.Missions
.Union(world.FindAliveCombatantActorsInCircle(sovietTownAttackPoint2.CenterLocation, SovietTownAttackGroupRange))
.Union(world.FindAliveCombatantActorsInCircle(townPoint.CenterLocation, AlliedTownTransferRange))
.Where(a => a.HasTrait<IMove>() && a.Owner == soviets);
foreach (var unit in sovietAttackUnits)
{
unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Move.Move(townPoint.Location, SovietTownMoveNearEnough)));
}
}
public void WorldLoaded(World w)
@@ -544,13 +527,10 @@ namespace OpenRA.Mods.RA.Missions
shroud.Explore(w, sam4.Location, 2);
if (w.LocalPlayer == null || w.LocalPlayer == allies1)
{
Game.MoveViewport(chinookHusk.Location.ToFloat2());
}
else
{
Game.MoveViewport(allies2BasePoint.Location.ToFloat2());
}
MissionUtils.PlayMissionMusic();
}
@@ -560,9 +540,8 @@ namespace OpenRA.Mods.RA.Missions
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),

View File

@@ -132,10 +132,8 @@ namespace OpenRA.Mods.RA.Missions
public void Tick(Actor self)
{
if (allies1.WinState != WinState.Undefined)
{
return;
}
if (allies1.WinState != WinState.Undefined) return;
if (world.FrameNumber == 1)
{
SpawnAlliedUnit(McvName);
@@ -149,22 +147,25 @@ namespace OpenRA.Mods.RA.Missions
attackAtFrame += attackAtFrameIncrement;
attackAtFrameIncrement = Math.Max(attackAtFrameIncrement - 5, minAttackAtFrame);
}
if (world.FrameNumber >= ReinforcementsTicks1 && currentReinforcement1 < Reinforcements1.Length)
if (world.FrameNumber == ReinforcementsTicks1 || world.FrameNumber == ReinforcementsTicks2)
Sound.Play("reinfor1.aud");
if (world.FrameNumber % 25 == 0)
{
if (world.FrameNumber == ReinforcementsTicks1) Sound.Play("reinfor1.aud");
if (world.FrameNumber % 25 == 0) SpawnAlliedUnit(Reinforcements1[currentReinforcement1++]);
}
if (world.FrameNumber >= ReinforcementsTicks2 && currentReinforcement2 < Reinforcements2.Length)
{
if (world.FrameNumber == ReinforcementsTicks2) Sound.Play("reinfor1.aud");
if (world.FrameNumber % 25 == 0) SpawnAlliedUnit(Reinforcements2[currentReinforcement2++]);
if (world.FrameNumber >= ReinforcementsTicks1 && currentReinforcement1 < Reinforcements1.Length)
SpawnAlliedUnit(Reinforcements1[currentReinforcement1++]);
if (world.FrameNumber >= ReinforcementsTicks2 && currentReinforcement2 < Reinforcements2.Length)
SpawnAlliedUnit(Reinforcements2[currentReinforcement2++]);
}
if (sovietParadrops > 0)
{
if (world.FrameNumber == sovietParadropTicks)
{
Sound.Play("sovfapp1.aud");
}
if (world.FrameNumber >= sovietParadropTicks && world.FrameNumber % ParadropIncrement == 0)
{
CPos lz;
@@ -182,20 +183,21 @@ namespace OpenRA.Mods.RA.Missions
}
}
if (world.FrameNumber % 25 == 0)
{
ManageSovietUnits();
}
if (objectives[AirbaseID].Status != ObjectiveStatus.Completed)
{
if (world.FrameNumber % 25 == 0)
{
BuildSovietAircraft();
}
ManageSovietAircraft();
}
EvacuateAlliedUnits(exit1TopLeft.CenterLocation, exit1BottomRight.CenterLocation, exit1ExitPoint.Location);
EvacuateAlliedUnits(exit2TopLeft.CenterLocation, exit2BottomRight.CenterLocation, exit2ExitPoint.Location);
CheckSovietAirbase();
if (!world.Actors.Any(a => (a.Owner == allies1 || a.Owner == allies2) && a.IsInWorld && !a.IsDead()
&& ((a.HasTrait<Building>() && !a.HasTrait<Wall>()) || a.HasTrait<BaseBuilding>())))
{
@@ -227,13 +229,11 @@ namespace OpenRA.Mods.RA.Missions
if (enemy != null)
{
if (!aircraft.IsIdle && aircraft.GetCurrentActivity().GetType() != typeof(FlyAttack))
{
aircraft.CancelActivity();
}
if (plane.Altitude == 0)
{
plane.UnReserve();
}
aircraft.QueueActivity(new FlyAttack(Target.FromActor(enemy)));
}
}
@@ -249,19 +249,15 @@ namespace OpenRA.Mods.RA.Missions
bool LandIsQueued(Actor actor)
{
for (var a = actor.GetCurrentActivity(); a != null; a = a.NextActivity)
{
if (a is ReturnToBase || a is Land) { return true; }
}
if (a is ReturnToBase || a is Land) return true;
return false;
}
void BuildSovietAircraft()
{
var queue = MissionUtils.FindQueues(world, soviets, "Plane").FirstOrDefault(q => q.CurrentItem() == null);
if (queue == null || SovietAircraft().Count() >= maxSovietYaks)
{
return;
}
if (queue == null || SovietAircraft().Count() >= maxSovietYaks) return;
queue.ResolveOrder(queue.self, Order.StartProduction(queue.self, YakName, 1));
}
@@ -284,16 +280,19 @@ namespace OpenRA.Mods.RA.Missions
var route = world.SharedRandom.Next(sovietEntryPoints.Length);
var spawnPoint = sovietEntryPoints[route];
var rallyPoint = sovietRallyPoints[route];
IEnumerable<string> units;
if (world.FrameNumber >= sovietUnits2Ticks)
{
units = SovietUnits2;
}
else
{
units = SovietUnits1;
}
var unit = world.CreateActor(units.Random(world.SharedRandom), new TypeDictionary { new LocationInit(spawnPoint), new OwnerInit(soviets) });
var unit = world.CreateActor(units.Random(world.SharedRandom),
new TypeDictionary
{
new LocationInit(spawnPoint),
new OwnerInit(soviets)
});
unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Move.Move(rallyPoint, 3)));
}
@@ -303,11 +302,10 @@ namespace OpenRA.Mods.RA.Missions
.Where(u => (u.Owner == allies1 || u.Owner == allies2)
&& ((u.HasTrait<Building>() && !u.HasTrait<Wall>()) || u.HasTrait<Mobile>()) && u.IsInWorld && !u.IsDead()
&& (!u.HasTrait<Spy>() || !u.Trait<Spy>().Disguised || (u.Trait<Spy>().Disguised && u.Trait<Spy>().disguisedAsPlayer != soviets)));
var enemy = FirstUnshroudedOrDefault(enemies.OrderBy(u => (self.CenterLocation - u.CenterLocation).LengthSquared), world, 10);
if (enemy != null)
{
self.QueueActivity(new AttackMove.AttackMoveActivity(self, new Attack(Target.FromActor(enemy), 3)));
}
}
void ManageSovietUnits()
@@ -319,27 +317,23 @@ namespace OpenRA.Mods.RA.Missions
if (units.Count() >= SovietGroupSize)
{
foreach (var unit in units)
{
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 SpawnAlliedUnit(string actor)
{
SpawnAndMove(actor, allies1, allies1EntryPoint.Location, allies1MovePoint.Location);
if (allies2 != allies1)
{
if (allies1 != allies2)
SpawnAndMove(actor, allies2, allies2EntryPoint.Location, allies2MovePoint.Location);
}
}
Actor SpawnAndMove(string actor, Player owner, CPos entry, CPos to)
@@ -369,22 +363,24 @@ namespace OpenRA.Mods.RA.Missions
{
var units = world.FindAliveCombatantActorsInBox(a, b)
.Where(u => u.HasTrait<Mobile>() && !u.HasTrait<Aircraft>() && (u.Owner == allies1 || u.Owner == allies2));
foreach (var unit in units)
{
unit.CancelActivity();
unit.ChangeOwner(allies);
unitsEvacuated++;
var createsShroud = unit.TraitOrDefault<CreatesShroud>();
if (createsShroud != null && objectives[GapGeneratorID].Status == ObjectiveStatus.InProgress)
{
objectives[GapGeneratorID].Status = ObjectiveStatus.Completed;
OnObjectivesUpdated(true);
}
var cargo = unit.TraitOrDefault<Cargo>();
if (cargo != null)
{
unitsEvacuated += cargo.Passengers.Count();
}
UpdateUnitsEvacuated();
unit.QueueActivity(new Move.Move(exit));
unit.QueueActivity(new RemoveSelf());
@@ -449,13 +445,10 @@ namespace OpenRA.Mods.RA.Missions
paradropBox = new Rectangle(topLeft.Location.X, topLeft.Location.Y, bottomRight.Location.X - topLeft.Location.X, bottomRight.Location.Y - topLeft.Location.Y);
if (w.LocalPlayer == null || w.LocalPlayer == allies1)
{
Game.MoveViewport(allies1EntryPoint.Location.ToFloat2());
}
else
{
Game.MoveViewport(allies2EntryPoint.Location.ToFloat2());
}
OnObjectivesUpdated(false);
MissionUtils.PlayMissionMusic();

View File

@@ -104,18 +104,14 @@ namespace OpenRA.Mods.RA.Missions
public void Tick(Actor self)
{
if (allies1.WinState != WinState.Undefined)
{
return;
}
if (allies1.WinState != WinState.Undefined) return;
if (world.FrameNumber == 1)
{
InsertSpies();
}
if (world.FrameNumber == 25 * 25)
{
SendHind(hind1EntryPoint, hind1Points, hind1ExitPoint);
}
if (frameInfiltrated != -1)
{
if (world.FrameNumber == frameInfiltrated + 100)
@@ -131,10 +127,10 @@ namespace OpenRA.Mods.RA.Missions
destroyBaseTimerWidget = new CountdownTimerWidget(destroyBaseTimer, "Secure lab in: {0}");
Ui.Root.AddChild(destroyBaseTimerWidget);
}
if (world.FrameNumber >= frameInfiltrated + 200)
{
destroyBaseTimer.Tick();
}
if (world.FrameNumber == frameInfiltrated + 1500 * 12 && !bridgeTank.IsDead() && bridgeTank.IsInWorld && !bridge.IsDead())
{
bridgeTank.QueueActivity(new Attack(Target.FromPos(bridge.CenterLocation), 4));
@@ -149,12 +145,14 @@ namespace OpenRA.Mods.RA.Missions
attackingBridge = false;
}
}
foreach (var patrol in patrols)
{
patrol.DoPatrol();
}
ManageSovietOre();
BaseGuardTick();
if (allies1Spy.IsDead() || (allies2Spy != null && allies2Spy.IsDead()))
{
objectives[InfiltrateID].Status = ObjectiveStatus.Failed;
@@ -162,9 +160,8 @@ namespace OpenRA.Mods.RA.Missions
MissionFailed("{0} spy was killed.".F(allies1 != allies2 ? "A" : "The"));
}
else if (lab.Destroyed)
{
MissionFailed("The Soviet research laboratory was destroyed.");
}
else if (!world.Actors.Any(a => (a.Owner == allies1 || a.Owner == allies2) && !a.IsDead()
&& (a.HasTrait<Building>() && !a.HasTrait<Wall>()) || a.HasTrait<BaseBuilding>()))
{
@@ -198,10 +195,7 @@ namespace OpenRA.Mods.RA.Missions
void OnDestroyBaseTimerExpired(CountdownTimer t)
{
if (SovietBaseDestroyed() && objectives[InfiltrateID].Status == ObjectiveStatus.Completed)
{
return;
}
if (SovietBaseDestroyed() && objectives[InfiltrateID].Status == ObjectiveStatus.Completed) return;
objectives[DestroyID].Status = ObjectiveStatus.Failed;
OnObjectivesUpdated(true);
MissionFailed("The Soviet research laboratory was not secured in time.");
@@ -211,34 +205,27 @@ namespace OpenRA.Mods.RA.Missions
{
var res = soviets.PlayerActor.Trait<PlayerResources>();
if (res.Ore > res.OreCapacity * 0.8)
{
res.TakeOre(res.OreCapacity / 10);
}
}
void BaseGuardTick()
{
if (baseGuardTicks <= 0 || baseGuard.IsDead() || !baseGuard.IsInWorld)
{
return;
}
if (baseGuardTicks <= 0 || baseGuard.IsDead() || !baseGuard.IsInWorld) return;
if (hijackTruck.Location == baseGuardTruckPos.Location)
{
if (--baseGuardTicks <= 0)
{
baseGuard.QueueActivity(new Move.Move(baseGuardMovePos.Location));
}
}
else
{
baseGuardTicks = 100;
}
}
void OnLabInfiltrated(Actor spy)
{
if (spy == allies1Spy) allies1SpyInfiltratedLab = true;
else if (spy == allies2Spy) allies2SpyInfiltratedLab = true;
if (allies1SpyInfiltratedLab && (allies2SpyInfiltratedLab || allies2Spy == null))
{
objectives[InfiltrateID].Status = ObjectiveStatus.Completed;
@@ -260,6 +247,7 @@ namespace OpenRA.Mods.RA.Missions
{
lst.Trait<Cargo>().Load(lst, world.CreateActor(false, "mcv", new TypeDictionary { new OwnerInit(allies2) }));
}
lst.QueueActivity(new Move.Move(reinforcementsUnloadPoint.Location));
lst.QueueActivity(new Wait(10));
lst.QueueActivity(new CallFunc(() =>
@@ -294,10 +282,8 @@ namespace OpenRA.Mods.RA.Missions
public void DoPatrol()
{
if (actors.Any(a => a.IsDead() || !a.IsIdle || !a.IsInWorld))
{
return;
}
if (actors.Any(a => a.IsDead() || !a.IsIdle || !a.IsInWorld)) return;
pointIndex = (pointIndex + 1) % points.Length;
foreach (var actor in actors.Where(a => !a.IsDead() && a.IsInWorld))
{
@@ -316,10 +302,10 @@ namespace OpenRA.Mods.RA.Missions
new FacingInit(Util.GetFacing(points.First().ToCPos() - start, 0)),
new AltitudeInit(Rules.Info["hind.autotarget"].Traits.Get<HelicopterInfo>().CruiseAltitude),
});
foreach (var point in points.Concat(new[] { Util.CenterOfCell(exit) }))
{
hind.QueueActivity(new AttackMove.AttackMoveActivity(hind, new HeliFly(point)));
}
hind.QueueActivity(new RemoveSelf());
}
@@ -330,6 +316,7 @@ namespace OpenRA.Mods.RA.Missions
new OwnerInit(allies1),
new LocationInit(lstEntryPoint.Location)
});
allies1Spy = world.CreateActor(false, "spy.strong", new TypeDictionary { new OwnerInit(allies1) });
lst.Trait<Cargo>().Load(lst, allies1Spy);
if (allies1 != allies2)
@@ -337,6 +324,7 @@ namespace OpenRA.Mods.RA.Missions
allies2Spy = world.CreateActor(false, "spy.strong", new TypeDictionary { new OwnerInit(allies2) });
lst.Trait<Cargo>().Load(lst, allies2Spy);
}
lst.QueueActivity(new Move.Move(lstUnloadPoint.Location));
lst.QueueActivity(new Wait(10));
lst.QueueActivity(new UnloadCargo(true));
@@ -348,9 +336,7 @@ namespace OpenRA.Mods.RA.Missions
void SetupSubStances()
{
foreach (var actor in world.Actors.Where(a => a.IsInWorld && a.Owner == soviets && !a.IsDead() && a.HasTrait<TargetableSubmarine>()))
{
actor.Trait<AutoTarget>().stance = UnitStance.Defend;
}
}
public void WorldLoaded(World w)
@@ -366,6 +352,7 @@ namespace OpenRA.Mods.RA.Missions
{
allies2 = allies1;
}
soviets = w.Players.Single(p => p.InternalName == "Soviets");
neutral = w.Players.Single(p => p.InternalName == "Neutral");
objectives[InfiltrateID].Text = Infiltrate.F(allies1 != allies2 ? "spies" : "spy");
@@ -423,6 +410,7 @@ namespace OpenRA.Mods.RA.Missions
hind1ExitPoint = actors["Hind1ExitPoint"].Location;
reinforcementsEntryPoint = actors["ReinforcementsEntryPoint"];
reinforcementsUnloadPoint = actors["ReinforcementsUnloadPoint"];
patrols = new[]
{
new Patrol(world, new[] { "e1", "e1", "e1", "e1", "e1" }, soviets, patrolPoints1, 0),
@@ -474,9 +462,8 @@ namespace OpenRA.Mods.RA.Missions
public void OnInfiltrate(Actor self, Actor spy)
{
if (self.Trait<Cargo>().IsEmpty(self))
{
self.ChangeOwner(spy.Owner);
}
self.Trait<Cargo>().Load(self, spy);
}
@@ -488,9 +475,7 @@ namespace OpenRA.Mods.RA.Missions
self.ChangeOwner(OldOwner);
}
else if (self.Owner == passenger.Owner)
{
self.ChangeOwner(self.Trait<Cargo>().Passengers.First().Owner);
}
}
}
@@ -534,25 +519,16 @@ namespace OpenRA.Mods.RA.Missions
class Allies04TrivialBuilding { }
class Allies04MaintainBuildingInfo : ITraitInfo
class Allies04MaintainBuildingInfo : TraitInfo<Allies04MaintainBuilding>
{
public readonly string Player = null;
public object Create(ActorInitializer init) { return new Allies04MaintainBuilding(this); }
}
class Allies04MaintainBuilding : INotifyDamageStateChanged
{
Allies04MaintainBuildingInfo info;
public Allies04MaintainBuilding(Allies04MaintainBuildingInfo info)
{
this.info = info;
}
public void DamageStateChanged(Actor self, AttackInfo e)
{
if (self.Owner.InternalName != info.Player) return;
if (self.Owner.InternalName != self.Info.Traits.Get<Allies04MaintainBuildingInfo>().Player) return;
if (self.HasTrait<Sellable>() && e.DamageState == DamageState.Critical && e.PreviousDamageState < DamageState.Critical)
self.Trait<Sellable>().Sell(self);

View File

@@ -14,7 +14,7 @@ namespace OpenRA.Mods.RA.Missions
{
public class CountdownTimer
{
public int TicksLeft { get; set; }
public int TicksLeft;
public event Action<CountdownTimer> OnExpired = t => { };
public event Action<CountdownTimer> OnOneMinuteRemaining = t => { };
@@ -47,22 +47,21 @@ namespace OpenRA.Mods.RA.Missions
public void Tick()
{
if (TicksLeft > 0)
if (TicksLeft <= 0) return;
TicksLeft--;
switch (TicksLeft)
{
TicksLeft--;
switch (TicksLeft)
{
case 1500 * 00: OnExpired(this); break;
case 1500 * 01: OnOneMinuteRemaining(this); break;
case 1500 * 02: OnTwoMinutesRemaining(this); break;
case 1500 * 03: OnThreeMinutesRemaining(this); break;
case 1500 * 04: OnFourMinutesRemaining(this); break;
case 1500 * 05: OnFiveMinutesRemaining(this); break;
case 1500 * 10: OnTenMinutesRemaining(this); break;
case 1500 * 20: OnTwentyMinutesRemaining(this); break;
case 1500 * 30: OnThirtyMinutesRemaining(this); break;
case 1500 * 40: OnFortyMinutesRemaining(this); break;
}
case 1500 * 00: OnExpired(this); break;
case 1500 * 01: OnOneMinuteRemaining(this); break;
case 1500 * 02: OnTwoMinutesRemaining(this); break;
case 1500 * 03: OnThreeMinutesRemaining(this); break;
case 1500 * 04: OnFourMinutesRemaining(this); break;
case 1500 * 05: OnFiveMinutesRemaining(this); break;
case 1500 * 10: OnTenMinutesRemaining(this); break;
case 1500 * 20: OnTwentyMinutesRemaining(this); break;
case 1500 * 30: OnThirtyMinutesRemaining(this); break;
case 1500 * 40: OnFortyMinutesRemaining(this); break;
}
}
}

View File

@@ -15,8 +15,8 @@ namespace OpenRA.Mods.RA.Missions
{
public class CountdownTimerWidget : Widget
{
public CountdownTimer Timer { get; set; }
public string Format { get; set; }
public CountdownTimer Timer;
public string Format;
public CountdownTimerWidget(CountdownTimer timer, string format)
{
@@ -26,10 +26,8 @@ namespace OpenRA.Mods.RA.Missions
public override void Draw()
{
if (!IsVisible())
{
return;
}
if (!IsVisible()) return;
var font = Game.Renderer.Fonts["Bold"];
var text = Format.F(WidgetUtils.FormatTime(Timer.TicksLeft));
var pos = new float2(Game.viewport.Width * 0.5f - font.Measure(text).X / 2, Game.viewport.Height * 0.1f);
@@ -39,19 +37,14 @@ namespace OpenRA.Mods.RA.Missions
public class InfoWidget : Widget
{
public string Text { get; set; }
public string Text;
public InfoWidget(string text)
{
Text = text;
}
public InfoWidget(string text) { Text = text; }
public override void Draw()
{
if (!IsVisible())
{
return;
}
if (!IsVisible()) return;
var font = Game.Renderer.Fonts["Bold"];
var pos = new float2(Game.viewport.Width * 0.5f - font.Measure(Text).X / 2, Game.viewport.Height * 0.1f);
font.DrawTextWithContrast(Text, pos, Color.White, Color.Black, 1);

View File

@@ -8,7 +8,6 @@
*/
#endregion
using System;
using System.Collections.Generic;
using OpenRA.Traits;
@@ -16,9 +15,9 @@ namespace OpenRA.Mods.RA.Missions
{
public class Objective
{
public ObjectiveType Type { get; set; }
public string Text { get; set; }
public ObjectiveStatus Status { get; set; }
public ObjectiveType Type;
public string Text;
public ObjectiveStatus Status;
public Objective(ObjectiveType type, string text, ObjectiveStatus status)
{

View File

@@ -111,7 +111,9 @@ namespace OpenRA.Mods.RA.Missions
new FacingInit(Util.GetFacing(airfield.Location - entry, 0)),
new AltitudeInit(Rules.Info["yak"].Traits.Get<PlaneInfo>().CruiseAltitude)
});
while (yak.Trait<LimitedAmmo>().TakeAmmo()) { }
yak.QueueActivity(new ReturnToBase(yak, airfield));
yak.QueueActivity(new ResupplyAircraft());
}