Allies 04: Make Soviets sell buildings when they are low on health. Have the bridge be destroyed by a Soviet tank
This commit is contained in:
@@ -87,6 +87,11 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
int nextCivilianMove = 1;
|
||||
|
||||
Actor bridgeTank;
|
||||
Actor bridgeAttackPoint;
|
||||
Actor bridge;
|
||||
bool attackingBridge;
|
||||
|
||||
void MissionFailed(string text)
|
||||
{
|
||||
if (allies1.WinState != WinState.Undefined)
|
||||
@@ -123,7 +128,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
{
|
||||
InsertSpies();
|
||||
}
|
||||
if (world.FrameNumber == 600)
|
||||
if (world.FrameNumber == 25 * 25)
|
||||
{
|
||||
SendHind(hind1EntryPoint, hind1Points, hind1ExitPoint);
|
||||
}
|
||||
@@ -146,6 +151,19 @@ namespace OpenRA.Mods.RA.Missions
|
||||
{
|
||||
destroyBaseTimer.Tick();
|
||||
}
|
||||
if (world.FrameNumber == frameInfiltrated + 1500 * 12 && !bridgeTank.IsDead() && bridgeTank.IsInWorld && !bridge.IsDead())
|
||||
{
|
||||
bridgeTank.QueueActivity(new Attack(Target.FromPos(bridge.CenterLocation), 4));
|
||||
attackingBridge = true;
|
||||
}
|
||||
if (bridge.IsDead() && attackingBridge)
|
||||
{
|
||||
if (!bridgeTank.IsDead())
|
||||
{
|
||||
bridgeTank.CancelActivity();
|
||||
}
|
||||
attackingBridge = false;
|
||||
}
|
||||
}
|
||||
foreach (var patrol in patrols)
|
||||
{
|
||||
@@ -235,8 +253,8 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
void OnLabInfiltrated(Actor spy)
|
||||
{
|
||||
if (spy == allies1Spy) { allies1SpyInfiltratedLab = true; }
|
||||
else if (spy == allies2Spy) { allies2SpyInfiltratedLab = true; }
|
||||
if (spy == allies1Spy) allies1SpyInfiltratedLab = true;
|
||||
else if (spy == allies2Spy) allies2SpyInfiltratedLab = true;
|
||||
if (allies1SpyInfiltratedLab && (allies2SpyInfiltratedLab || allies2Spy == null))
|
||||
{
|
||||
objectives[InfiltrateID].Status = ObjectiveStatus.Completed;
|
||||
@@ -345,16 +363,9 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
void SetupSubStances()
|
||||
{
|
||||
if (!Game.IsHost)
|
||||
{
|
||||
return;
|
||||
}
|
||||
foreach (var actor in world.Actors.Where(a => a.IsInWorld && a.Owner == soviets && !a.IsDead() && a.HasTrait<TargetableSubmarine>()))
|
||||
{
|
||||
world.IssueOrder(new Order("SetUnitStance", actor, false)
|
||||
{
|
||||
TargetLocation = new CPos((int)UnitStance.Defend, 0)
|
||||
});
|
||||
actor.Trait<AutoTarget>().stance = UnitStance.Defend;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -373,6 +384,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
}
|
||||
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");
|
||||
|
||||
destroyBaseTicks = difficulty == "Hard" ? 1500 * 20 : difficulty == "Normal" ? 1500 * 25 : 1500 * 30;
|
||||
|
||||
@@ -435,9 +447,17 @@ namespace OpenRA.Mods.RA.Missions
|
||||
new Patrol(world, new[] { "e1", "dog.patrol", "dog.patrol" }, soviets, patrolPoints4, 0),
|
||||
new Patrol(world, new[] { "e1", "dog.patrol", "dog.patrol" }, soviets, patrolPoints5, 0),
|
||||
};
|
||||
objectives[InfiltrateID].Text = Infiltrate.F(allies1 != allies2 ? "spies" : "spy");
|
||||
|
||||
bridgeTank = actors["BridgeTank"];
|
||||
bridgeAttackPoint = actors["BridgeAttackPoint"];
|
||||
bridge = world.Actors
|
||||
.Where(a => a.HasTrait<Bridge>() && !a.IsDead())
|
||||
.OrderBy(a => (a.Location - bridgeAttackPoint.Location).LengthSquared)
|
||||
.FirstOrDefault();
|
||||
|
||||
OnObjectivesUpdated(false);
|
||||
SetupSubStances();
|
||||
|
||||
var res = allies1.PlayerActor.Trait<PlayerResources>();
|
||||
res.TakeOre(res.Ore);
|
||||
res.TakeCash(res.Cash);
|
||||
@@ -447,6 +467,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
res.TakeOre(res.Ore);
|
||||
res.TakeCash(res.Cash);
|
||||
}
|
||||
|
||||
Game.MoveViewport(lstEntryPoint.Location.ToFloat2());
|
||||
MissionUtils.PlayMissionMusic();
|
||||
}
|
||||
@@ -529,29 +550,31 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
class Allies04TrivialBuilding { }
|
||||
|
||||
class Allies04TryRepairBuildingInfo : ITraitInfo
|
||||
class Allies04MaintainBuildingInfo : ITraitInfo
|
||||
{
|
||||
public readonly string Player = null;
|
||||
|
||||
public object Create(ActorInitializer init) { return new Allies04TryRepairBuilding(this); }
|
||||
public object Create(ActorInitializer init) { return new Allies04MaintainBuilding(this); }
|
||||
}
|
||||
|
||||
class Allies04TryRepairBuilding : INotifyDamageStateChanged
|
||||
class Allies04MaintainBuilding : INotifyDamageStateChanged
|
||||
{
|
||||
Allies04TryRepairBuildingInfo info;
|
||||
Allies04MaintainBuildingInfo info;
|
||||
|
||||
public Allies04TryRepairBuilding(Allies04TryRepairBuildingInfo info)
|
||||
public Allies04MaintainBuilding(Allies04MaintainBuildingInfo info)
|
||||
{
|
||||
this.info = info;
|
||||
}
|
||||
|
||||
public void DamageStateChanged(Actor self, AttackInfo e)
|
||||
{
|
||||
if (self.HasTrait<RepairableBuilding>() && self.Owner.InternalName == info.Player && Game.IsHost
|
||||
&& e.DamageState > DamageState.Undamaged && e.PreviousDamageState == DamageState.Undamaged)
|
||||
{
|
||||
self.World.IssueOrder(new Order("RepairBuilding", self.Owner.PlayerActor, false) { TargetActor = self });
|
||||
}
|
||||
if (self.Owner.InternalName != info.Player) return;
|
||||
|
||||
if (self.HasTrait<Sellable>() && e.DamageState == DamageState.Critical && e.PreviousDamageState < DamageState.Critical)
|
||||
self.Trait<Sellable>().Sell(self);
|
||||
|
||||
else if (self.HasTrait<RepairableBuilding>() && e.DamageState > DamageState.Undamaged && e.PreviousDamageState == DamageState.Undamaged)
|
||||
self.Trait<RepairableBuilding>().RepairBuilding(self, self.Owner);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,8 +15,8 @@ using OpenRA.FileFormats;
|
||||
using OpenRA.Mods.RA.Activities;
|
||||
using OpenRA.Mods.RA.Air;
|
||||
using OpenRA.Mods.RA.Buildings;
|
||||
using OpenRA.Traits;
|
||||
using OpenRA.Network;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA.Missions
|
||||
{
|
||||
|
||||
@@ -25,20 +25,23 @@ namespace OpenRA.Mods.RA
|
||||
public void ResolveOrder(Actor self, Order order)
|
||||
{
|
||||
if (order.OrderString == "Sell")
|
||||
{
|
||||
if (!self.Trait<Building>().Lock())
|
||||
return;
|
||||
Sell(self);
|
||||
}
|
||||
|
||||
foreach( var ns in self.TraitsImplementing<INotifySold>() )
|
||||
ns.Selling( self );
|
||||
public void Sell(Actor self)
|
||||
{
|
||||
if (!self.Trait<Building>().Lock())
|
||||
return;
|
||||
|
||||
self.CancelActivity();
|
||||
foreach (var ns in self.TraitsImplementing<INotifySold>())
|
||||
ns.Selling(self);
|
||||
|
||||
var rb = self.TraitOrDefault<RenderBuilding>();
|
||||
if (rb != null && self.Info.Traits.Get<RenderBuildingInfo>().HasMakeAnimation)
|
||||
self.QueueActivity(new MakeAnimation(self, true, () => rb.PlayCustomAnim(self, "make")));
|
||||
self.QueueActivity(new Sell());
|
||||
}
|
||||
self.CancelActivity();
|
||||
|
||||
var rb = self.TraitOrDefault<RenderBuilding>();
|
||||
if (rb != null && self.Info.Traits.Get<RenderBuildingInfo>().HasMakeAnimation)
|
||||
self.QueueActivity(new MakeAnimation(self, true, () => rb.PlayCustomAnim(self, "make")));
|
||||
self.QueueActivity(new Sell());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -180,7 +180,7 @@ Actors:
|
||||
Location: 93,70
|
||||
Owner: Soviets
|
||||
Lab: miss
|
||||
Location: 34,28
|
||||
Location: 34,30
|
||||
Owner: Soviets
|
||||
Actor45: brik
|
||||
Location: 39,34
|
||||
@@ -203,11 +203,11 @@ Actors:
|
||||
Actor36: brik
|
||||
Location: 39,29
|
||||
Owner: Soviets
|
||||
Actor46: brik
|
||||
Location: 32,26
|
||||
Actor494: e4
|
||||
Location: 98,38
|
||||
Owner: Soviets
|
||||
Actor55: brik
|
||||
Location: 32,27
|
||||
Actor495: e4
|
||||
Location: 48,34
|
||||
Owner: Soviets
|
||||
Actor58: brik
|
||||
Location: 32,28
|
||||
@@ -215,8 +215,8 @@ Actors:
|
||||
Actor35: brik
|
||||
Location: 39,28
|
||||
Owner: Soviets
|
||||
Actor32: brik
|
||||
Location: 38,27
|
||||
Actor110: e1
|
||||
Location: 33,28
|
||||
Owner: Soviets
|
||||
Actor60: apwr
|
||||
Location: 44,46
|
||||
@@ -236,11 +236,11 @@ Actors:
|
||||
Actor100: brik
|
||||
Location: 32,33
|
||||
Owner: Soviets
|
||||
Actor23: brik
|
||||
Location: 36,26
|
||||
Actor263: 3tnk
|
||||
Location: 37,35
|
||||
Owner: Soviets
|
||||
Actor24: brik
|
||||
Location: 37,26
|
||||
Actor138: e2
|
||||
Location: 39,37
|
||||
Owner: Soviets
|
||||
Actor99: brik
|
||||
Location: 32,32
|
||||
@@ -254,8 +254,8 @@ Actors:
|
||||
Actor14: brik
|
||||
Location: 32,35
|
||||
Owner: Soviets
|
||||
Actor29: brik
|
||||
Location: 37,27
|
||||
Actor55: brik
|
||||
Location: 32,26
|
||||
Owner: Soviets
|
||||
Actor40: apwr
|
||||
Location: 44,43
|
||||
@@ -272,8 +272,8 @@ Actors:
|
||||
Actor102: ftur
|
||||
Location: 46,39
|
||||
Owner: Soviets
|
||||
Actor110: brik
|
||||
Location: 39,36
|
||||
Actor4: brik
|
||||
Location: 38,34
|
||||
Owner: Soviets
|
||||
Actor121: e1
|
||||
Location: 100,21
|
||||
@@ -288,8 +288,8 @@ Actors:
|
||||
Actor62: apwr
|
||||
Location: 46,52
|
||||
Owner: Soviets
|
||||
Actor4: brik
|
||||
Location: 39,38
|
||||
Actor29: brik
|
||||
Location: 35,26
|
||||
Owner: Soviets
|
||||
Actor87: tsla
|
||||
Location: 31,61
|
||||
@@ -359,20 +359,20 @@ Actors:
|
||||
Actor74: ftur
|
||||
Location: 31,36
|
||||
Owner: Soviets
|
||||
Actor17: brik
|
||||
Location: 38,38
|
||||
Actor32: brik
|
||||
Location: 34,26
|
||||
Owner: Soviets
|
||||
Actor104: tsla
|
||||
Location: 28,80
|
||||
Owner: Soviets
|
||||
Actor7: brik
|
||||
Location: 33,26
|
||||
Actor493: e4
|
||||
Location: 102,24
|
||||
Owner: Soviets
|
||||
Actor12: brik
|
||||
Location: 35,26
|
||||
Actor274: e3
|
||||
Location: 34,41
|
||||
Owner: Soviets
|
||||
Actor11: brik
|
||||
Location: 34,26
|
||||
Actor452: e4
|
||||
Location: 34,32
|
||||
Owner: Soviets
|
||||
Actor112: fenc
|
||||
Location: 96,39
|
||||
@@ -395,11 +395,11 @@ Actors:
|
||||
Actor108: stek
|
||||
Location: 38,55
|
||||
Owner: Soviets
|
||||
Actor109: brik
|
||||
Location: 39,37
|
||||
Actor7: brik
|
||||
Location: 38,35
|
||||
Owner: Soviets
|
||||
Actor19: brik
|
||||
Location: 38,37
|
||||
Actor46: brik
|
||||
Location: 33,26
|
||||
Owner: Soviets
|
||||
Actor6: brik
|
||||
Location: 39,35
|
||||
@@ -476,8 +476,8 @@ Actors:
|
||||
HijackFactory: weap
|
||||
Location: 98,32
|
||||
Owner: Soviets
|
||||
Actor138: sam
|
||||
Location: 33,27
|
||||
Actor12: sam
|
||||
Location: 34,27
|
||||
Owner: Soviets
|
||||
Actor143: e1
|
||||
Location: 61,98
|
||||
@@ -724,9 +724,12 @@ Actors:
|
||||
Actor221: 4tnk
|
||||
Location: 39,46
|
||||
Owner: Soviets
|
||||
Actor228: e1
|
||||
Actor228: brik
|
||||
Location: 102,34
|
||||
Owner: Soviets
|
||||
Actor514: brik
|
||||
Location: 103,34
|
||||
Owner: Soviets
|
||||
Actor227: e1
|
||||
Location: 98,28
|
||||
Owner: Soviets
|
||||
@@ -760,6 +763,7 @@ Actors:
|
||||
Actor229: v2rl
|
||||
Location: 96,19
|
||||
Owner: Soviets
|
||||
Facing: 64
|
||||
Actor137: e1
|
||||
Location: 66,34
|
||||
Owner: Soviets
|
||||
@@ -838,8 +842,8 @@ Actors:
|
||||
Actor262: e1
|
||||
Location: 37,31
|
||||
Owner: Soviets
|
||||
Actor274: truk
|
||||
Location: 36,31
|
||||
Actor17: brik
|
||||
Location: 37,28
|
||||
Owner: Soviets
|
||||
Actor264: v2rl
|
||||
Location: 50,36
|
||||
@@ -869,9 +873,6 @@ Actors:
|
||||
Actor122: fenc
|
||||
Location: 107,39
|
||||
Owner: Soviets
|
||||
Actor263: bio
|
||||
Location: 34,31
|
||||
Owner: Soviets
|
||||
Actor152: ftur
|
||||
Location: 107,40
|
||||
Owner: Soviets
|
||||
@@ -1502,8 +1503,8 @@ Actors:
|
||||
Actor453: brl3
|
||||
Location: 38,31
|
||||
Owner: Soviets
|
||||
Actor452: brl3
|
||||
Location: 38,36
|
||||
Actor11: truk
|
||||
Location: 36,32
|
||||
Owner: Soviets
|
||||
Actor455: silo
|
||||
Location: 82,67
|
||||
@@ -1656,6 +1657,78 @@ Actors:
|
||||
Actor492: e1
|
||||
Location: 35,35
|
||||
Owner: Soviets
|
||||
BridgeTank: 3tnk
|
||||
Location: 76,20
|
||||
Owner: Soviets
|
||||
BridgeAttackPoint: waypoint
|
||||
Location: 74,25
|
||||
Owner: Neutral
|
||||
Actor19: brik
|
||||
Location: 37,27
|
||||
Owner: Soviets
|
||||
Actor23: brik
|
||||
Location: 37,26
|
||||
Owner: Soviets
|
||||
Actor24: brik
|
||||
Location: 36,26
|
||||
Owner: Soviets
|
||||
Actor109: brik
|
||||
Location: 32,27
|
||||
Owner: Soviets
|
||||
Actor496: e4
|
||||
Location: 57,38
|
||||
Owner: Soviets
|
||||
Actor497: e4
|
||||
Location: 38,60
|
||||
Owner: Soviets
|
||||
Actor498: apc
|
||||
Location: 78,99
|
||||
Owner: Soviets
|
||||
Actor499: 3tnk
|
||||
Location: 106,23
|
||||
Owner: Soviets
|
||||
Actor500: sbag
|
||||
Location: 44,30
|
||||
Owner: Soviets
|
||||
Actor501: sbag
|
||||
Location: 44,31
|
||||
Owner: Soviets
|
||||
Actor502: sbag
|
||||
Location: 44,32
|
||||
Owner: Soviets
|
||||
Actor503: sbag
|
||||
Location: 44,33
|
||||
Owner: Soviets
|
||||
Actor504: sbag
|
||||
Location: 43,30
|
||||
Owner: Soviets
|
||||
Actor505: e1
|
||||
Location: 43,32
|
||||
Owner: Soviets
|
||||
Actor506: e3
|
||||
Location: 43,31
|
||||
Owner: Soviets
|
||||
Actor507: brik
|
||||
Location: 104,36
|
||||
Owner: Soviets
|
||||
Actor508: brik
|
||||
Location: 104,35
|
||||
Owner: Soviets
|
||||
Actor509: brik
|
||||
Location: 104,34
|
||||
Owner: Soviets
|
||||
Actor510: brik
|
||||
Location: 102,35
|
||||
Owner: Soviets
|
||||
Actor511: brik
|
||||
Location: 102,36
|
||||
Owner: Soviets
|
||||
Actor512: brik
|
||||
Location: 103,36
|
||||
Owner: Soviets
|
||||
Actor513: e1
|
||||
Location: 110,34
|
||||
Owner: Soviets
|
||||
|
||||
Smudges:
|
||||
|
||||
@@ -1670,7 +1743,7 @@ Rules:
|
||||
MissionObjectivesPanel:
|
||||
ObjectivesPanel: MISSION_OBJECTIVES
|
||||
^Building:
|
||||
Allies04TryRepairBuilding:
|
||||
Allies04MaintainBuilding:
|
||||
Player: Soviets
|
||||
MISS:
|
||||
AutoTargetIgnore:
|
||||
|
||||
Reference in New Issue
Block a user