diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj
index b0970f43d1..331c6c1829 100644
--- a/OpenRA.Game/OpenRA.Game.csproj
+++ b/OpenRA.Game/OpenRA.Game.csproj
@@ -173,7 +173,6 @@
-
diff --git a/OpenRA.Mods.Cnc/IonCannonPower.cs b/OpenRA.Mods.Cnc/IonCannonPower.cs
index 3a96806c10..78be5acc6a 100644
--- a/OpenRA.Mods.Cnc/IonCannonPower.cs
+++ b/OpenRA.Mods.Cnc/IonCannonPower.cs
@@ -28,8 +28,10 @@ namespace OpenRA.Mods.Cnc
return new SelectGenericPowerTarget(order, manager, "ioncannon", MouseButton.Left);
}
- public override void Activate(Actor self, Order order)
+ public override void Activate(Actor self, Order order, SupportPowerManager manager)
{
+ base.Activate(self, order, manager);
+
self.World.AddFrameEndTask(w =>
{
Sound.Play(Info.LaunchSound, order.TargetLocation.CenterPosition);
diff --git a/OpenRA.Mods.RA/AttackBomber.cs b/OpenRA.Mods.RA/AttackBomber.cs
index 622b8840d0..f39df8820c 100644
--- a/OpenRA.Mods.RA/AttackBomber.cs
+++ b/OpenRA.Mods.RA/AttackBomber.cs
@@ -23,48 +23,34 @@ namespace OpenRA.Mods.RA
[Desc("Armament name")]
public readonly string Guns = "secondary";
public readonly int FacingTolerance = 2;
- public readonly WRange VisionRange = WRange.FromCells(10);
public override object Create(ActorInitializer init) { return new AttackBomber(init.self, this); }
}
- class AttackBomber : AttackBase, ISync, INotifyKilled
+ class AttackBomber : AttackBase, ISync, INotifyRemovedFromWorld
{
AttackBomberInfo info;
- Actor camera;
[Sync] Target target;
+ [Sync] bool inAttackRange;
+
+ public event Action OnRemovedFromWorld = self => { };
+ public event Action OnEnteredAttackRange = self => { };
+ public event Action OnExitedAttackRange = self => { };
public AttackBomber(Actor self, AttackBomberInfo info)
: base(self, info)
{
this.info = info;
- this.camera = null;
}
public override void Tick(Actor self)
{
base.Tick(self);
- var facing = self.TraitOrDefault();
var cp = self.CenterPosition;
var bombTarget = Target.FromPos(cp - new WVec(0, 0, cp.Z));
-
- // Provide vision
- if (this.camera == null &&
- target.IsInRange(self.CenterPosition, this.info.VisionRange))
- {
- this.camera = self.World.CreateActor("camera", new TypeDictionary
- {
- new LocationInit(target.CenterPosition.ToCPos()),
- new OwnerInit(self.Owner),
- });
- }
- else if (this.camera != null &&
- !target.IsInRange(self.CenterPosition, this.info.VisionRange))
- {
- self.World.Remove(this.camera);
- this.camera = null;
- }
+ var wasInAttackRange = inAttackRange;
+ inAttackRange = false;
// Bombs drop anywhere in range
foreach (var a in Armaments.Where(a => a.Info.Name == info.Bombs))
@@ -72,39 +58,43 @@ namespace OpenRA.Mods.RA
if (!target.IsInRange(self.CenterPosition, a.Weapon.Range))
continue;
- a.CheckFire(self, this, facing, bombTarget);
+ inAttackRange = true;
+ a.CheckFire(self, this, facing.Value, bombTarget);
}
// Guns only fire when approaching the target
- var facingToTarget = Util.GetFacing(target.CenterPosition - self.CenterPosition, facing.Facing);
- if (Math.Abs(facingToTarget - facing.Facing) % 256 > info.FacingTolerance)
- return;
-
- foreach (var a in Armaments.Where(a => a.Info.Name == info.Guns))
+ var f = facing.Value.Facing;
+ var facingToTarget = Util.GetFacing(target.CenterPosition - self.CenterPosition, f);
+ if (Math.Abs(facingToTarget - f) % 256 <= info.FacingTolerance)
{
- if (!target.IsInRange(self.CenterPosition, a.Weapon.Range))
- continue;
+ foreach (var a in Armaments.Where(a => a.Info.Name == info.Guns))
+ {
+ if (!target.IsInRange(self.CenterPosition, a.Weapon.Range))
+ continue;
- var t = Target.FromPos(cp - new WVec(0, a.Weapon.Range.Range / 2, cp.Z).Rotate(WRot.FromFacing(facing.Facing)));
- a.CheckFire(self, this, facing, t);
+ var t = Target.FromPos(cp - new WVec(0, a.Weapon.Range.Range / 2, cp.Z).Rotate(WRot.FromFacing(f)));
+ inAttackRange = true;
+ a.CheckFire(self, this, facing.Value, t);
+ }
}
+
+ if (inAttackRange && !wasInAttackRange)
+ OnEnteredAttackRange(self);
+
+ if (!inAttackRange && wasInAttackRange)
+ OnExitedAttackRange(self);
}
public void SetTarget(WPos pos) { target = Target.FromPos(pos); }
- public void Killed(Actor self, AttackInfo e)
+ public void RemovedFromWorld(Actor self)
{
- if (this.camera != null)
- {
- self.World.Remove(this.camera);
- this.camera = null;
- }
+ OnRemovedFromWorld(self);
}
public override Activity GetAttackActivity(Actor self, Target newTarget, bool allowMove)
{
- // TODO: Player controlled units want this too!
- throw new NotImplementedException("CarpetBomb requires a scripted target");
+ throw new NotImplementedException("AttackBomber requires a scripted target");
}
}
}
diff --git a/OpenRA.Mods.RA/Effects/GravityBomb.cs b/OpenRA.Mods.RA/Effects/GravityBomb.cs
index 1bf03491cc..2eecc4a053 100644
--- a/OpenRA.Mods.RA/Effects/GravityBomb.cs
+++ b/OpenRA.Mods.RA/Effects/GravityBomb.cs
@@ -63,6 +63,10 @@ namespace OpenRA.Mods.RA.Effects
public IEnumerable Render(WorldRenderer wr)
{
+ var cell = pos.ToCPos();
+ if (args.SourceActor.World.FogObscures(cell))
+ return SpriteRenderable.None;
+
return anim.Render(pos, wr.Palette("effect"));
}
}
diff --git a/OpenRA.Game/Traits/Waypoint.cs b/OpenRA.Mods.RA/Immobile.cs
similarity index 75%
rename from OpenRA.Game/Traits/Waypoint.cs
rename to OpenRA.Mods.RA/Immobile.cs
index a0cf83becd..424395b6c7 100644
--- a/OpenRA.Game/Traits/Waypoint.cs
+++ b/OpenRA.Mods.RA/Immobile.cs
@@ -1,6 +1,6 @@
#region Copyright & License Information
/*
- * Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
+ * Copyright 2007-2014 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
@@ -10,19 +10,20 @@
using System.Collections.Generic;
using OpenRA.FileFormats;
+using OpenRA.Traits;
-namespace OpenRA.Traits
+namespace OpenRA.Mods.RA
{
- class WaypointInfo : ITraitInfo, IOccupySpaceInfo
+ class ImmobileInfo : ITraitInfo, IOccupySpaceInfo
{
- public object Create( ActorInitializer init ) { return new Waypoint( init ); }
+ public object Create(ActorInitializer init) { return new Immobile(init); }
}
- class Waypoint : IOccupySpace, ISync, INotifyAddedToWorld, INotifyRemovedFromWorld
+ class Immobile : IOccupySpace, ISync, INotifyAddedToWorld, INotifyRemovedFromWorld
{
[Sync] readonly CPos location;
- public Waypoint(ActorInitializer init)
+ public Immobile(ActorInitializer init)
{
this.location = init.Get();
}
diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
index 4e19ed923b..8a83a0958c 100644
--- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
+++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
@@ -481,6 +481,7 @@
+
diff --git a/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs b/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs
index 35a484a28f..2bf7756d76 100755
--- a/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs
+++ b/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs
@@ -1,6 +1,6 @@
#region Copyright & License Information
/*
- * Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
+ * Copyright 2007-2014 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
@@ -9,6 +9,8 @@
#endregion
using System;
+using System.Collections.Generic;
+using System.Linq;
using OpenRA.FileFormats;
using OpenRA.Mods.RA.Activities;
using OpenRA.Mods.RA.Air;
@@ -27,8 +29,18 @@ namespace OpenRA.Mods.RA
public readonly WRange Cordon = new WRange(5120);
[ActorReference]
- public readonly string FlareType = null;
- public readonly int FlareTime = 3000; // 2 minutes
+ [Desc("Actor to spawn when the aircraft first enter the map")]
+ public readonly string FlareActor = null;
+
+ [Desc("Amount of time to keep the flare alive after the aircraft have finished attacking")]
+ public readonly int FlareRemoveDelay = 25;
+
+ [ActorReference]
+ [Desc("Actor to spawn when the aircraft start attacking")]
+ public readonly string CameraActor = null;
+
+ [Desc("Amount of time to keep the camera alive after the aircraft have finished attacking")]
+ public readonly int CameraRemoveDelay = 25;
public override object Create(ActorInitializer init) { return new AirstrikePower(init.self, this); }
}
@@ -38,10 +50,11 @@ namespace OpenRA.Mods.RA
public AirstrikePower(Actor self, AirstrikePowerInfo info)
: base(self, info) { }
- public override void Activate(Actor self, Order order)
+ public override void Activate(Actor self, Order order, SupportPowerManager manager)
{
- var info = Info as AirstrikePowerInfo;
+ base.Activate(self, order, manager);
+ var info = Info as AirstrikePowerInfo;
var attackFacing = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings);
var attackRotation = WRot.FromFacing(attackFacing);
var delta = new WVec(0, -1024, 0).Rotate(attackRotation);
@@ -51,24 +64,74 @@ namespace OpenRA.Mods.RA
var startEdge = target - (self.World.DistanceToMapEdge(target, -delta) + info.Cordon).Range * delta / 1024;
var finishEdge = target + (self.World.DistanceToMapEdge(target, delta) + info.Cordon).Range * delta / 1024;
+ Actor flare = null;
+ Actor camera = null;
+ Dictionary aircraftInRange = new Dictionary();
+
+ Action onEnterRange = a =>
+ {
+ // Spawn a camera and remove the beacon when the first plane enters the target area
+ if (info.CameraActor != null && !aircraftInRange.Any(kv => kv.Value))
+ {
+ self.World.AddFrameEndTask(w =>
+ {
+ camera = w.CreateActor(info.CameraActor, new TypeDictionary
+ {
+ new LocationInit(order.TargetLocation),
+ new OwnerInit(self.Owner),
+ });
+ });
+ }
+
+ if (beacon != null)
+ {
+ self.World.AddFrameEndTask(w =>
+ {
+ w.Remove(beacon);
+ beacon = null;
+ });
+ }
+
+ aircraftInRange[a] = true;
+ };
+
+ Action onExitRange = a =>
+ {
+ aircraftInRange[a] = false;
+
+ // Remove the camera and flare when the final plane leaves the target area
+ if (!aircraftInRange.Any(kv => kv.Value))
+ {
+ if (camera != null)
+ {
+ camera.QueueActivity(new Wait(info.CameraRemoveDelay));
+ camera.QueueActivity(new RemoveSelf());
+ }
+
+ if (flare != null)
+ {
+ flare.QueueActivity(new Wait(info.FlareRemoveDelay));
+ flare.QueueActivity(new RemoveSelf());
+ }
+
+ camera = flare = null;
+ }
+ };
+
self.World.AddFrameEndTask(w =>
{
- var notification = self.Owner.IsAlliedWith(self.World.RenderPlayer) ? Info.LaunchSound : Info.IncomingSound;
- Sound.Play(notification);
-
- Actor flare = null;
- if (info.FlareType != null)
+ if (info.FlareActor != null)
{
- flare = w.CreateActor(info.FlareType, new TypeDictionary
+ flare = w.CreateActor(info.FlareActor, new TypeDictionary
{
new LocationInit(order.TargetLocation),
new OwnerInit(self.Owner),
});
-
- flare.QueueActivity(new Wait(info.FlareTime));
- flare.QueueActivity(new RemoveSelf());
}
+ var notification = self.Owner.IsAlliedWith(self.World.RenderPlayer) ? Info.LaunchSound : Info.IncomingSound;
+ Sound.Play(notification);
+
for (var i = -info.SquadSize / 2; i <= info.SquadSize / 2; i++)
{
// Even-sized squads skip the lead plane
@@ -77,8 +140,8 @@ namespace OpenRA.Mods.RA
// Includes the 90 degree rotation between body and world coordinates
var so = info.SquadOffset;
- var spawnOffset = new WVec(i*so.Y, -Math.Abs(i)*so.X, 0).Rotate(attackRotation);
- var targetOffset = new WVec(i*so.Y, 0, 0).Rotate(attackRotation);
+ var spawnOffset = new WVec(i * so.Y, -Math.Abs(i) * so.X, 0).Rotate(attackRotation);
+ var targetOffset = new WVec(i * so.Y, 0, 0).Rotate(attackRotation);
var a = w.CreateActor(info.UnitType, new TypeDictionary
{
@@ -87,13 +150,15 @@ namespace OpenRA.Mods.RA
new FacingInit(attackFacing),
});
- a.Trait().SetTarget(target + targetOffset);
-
- if (flare != null)
- a.QueueActivity(new CallFunc(() => flare.Destroy()));
+ var attack = a.Trait();
+ attack.SetTarget(target + targetOffset);
+ attack.OnEnteredAttackRange += onEnterRange;
+ attack.OnExitedAttackRange += onExitRange;
+ attack.OnRemovedFromWorld += onExitRange;
a.QueueActivity(new Fly(a, Target.FromPos(finishEdge + spawnOffset)));
a.QueueActivity(new RemoveSelf());
+ aircraftInRange.Add(a, false);
}
});
}
diff --git a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs
index 23f3195317..58daddbfc1 100644
--- a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs
+++ b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs
@@ -34,8 +34,10 @@ namespace OpenRA.Mods.RA
return new SelectTarget(order, manager, this);
}
- public override void Activate(Actor self, Order order)
+ public override void Activate(Actor self, Order order, SupportPowerManager manager)
{
+ base.Activate(self, order, manager);
+
foreach (var target in UnitsInRange(order.ExtraLocation))
{
var cs = target.Trait();
diff --git a/OpenRA.Mods.RA/SupportPowers/GpsPower.cs b/OpenRA.Mods.RA/SupportPowers/GpsPower.cs
index 6f03183fdd..7eef20f56d 100755
--- a/OpenRA.Mods.RA/SupportPowers/GpsPower.cs
+++ b/OpenRA.Mods.RA/SupportPowers/GpsPower.cs
@@ -97,8 +97,10 @@ namespace OpenRA.Mods.RA
self.Owner.PlayerActor.Trait().Powers[key].Activate(new Order());
}
- public override void Activate(Actor self, Order order)
+ public override void Activate(Actor self, Order order, SupportPowerManager manager)
{
+ base.Activate(self, order, manager);
+
self.World.AddFrameEndTask(w =>
{
Sound.PlayToPlayer(self.Owner, Info.LaunchSound);
diff --git a/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs b/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs
index 31cdf45257..1d78b2eafc 100644
--- a/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs
+++ b/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs
@@ -34,8 +34,10 @@ namespace OpenRA.Mods.RA
return new SelectTarget(order, manager, this);
}
- public override void Activate(Actor self, Order order)
+ public override void Activate(Actor self, Order order, SupportPowerManager manager)
{
+ base.Activate(self, order, manager);
+
self.Trait().PlayCustomAnim(self, "active");
Sound.Play("ironcur9.aud", order.TargetLocation.CenterPosition);
diff --git a/OpenRA.Mods.RA/SupportPowers/NukePower.cs b/OpenRA.Mods.RA/SupportPowers/NukePower.cs
index 715e0d0835..d62da05d6d 100755
--- a/OpenRA.Mods.RA/SupportPowers/NukePower.cs
+++ b/OpenRA.Mods.RA/SupportPowers/NukePower.cs
@@ -38,8 +38,10 @@ namespace OpenRA.Mods.RA
return new SelectGenericPowerTarget(order, manager, "nuke", MouseButton.Left);
}
- public override void Activate(Actor self, Order order)
+ public override void Activate(Actor self, Order order, SupportPowerManager manager)
{
+ base.Activate(self, order, manager);
+
if (self.Owner.IsAlliedWith(self.World.RenderPlayer))
Sound.Play(Info.LaunchSound);
else
diff --git a/OpenRA.Mods.RA/SupportPowers/ParatroopersPower.cs b/OpenRA.Mods.RA/SupportPowers/ParatroopersPower.cs
index 85a764017d..8bf95cd3c1 100755
--- a/OpenRA.Mods.RA/SupportPowers/ParatroopersPower.cs
+++ b/OpenRA.Mods.RA/SupportPowers/ParatroopersPower.cs
@@ -33,8 +33,10 @@ namespace OpenRA.Mods.RA
{
public ParatroopersPower(Actor self, ParatroopersPowerInfo info) : base(self, info) { }
- public override void Activate(Actor self, Order order)
+ public override void Activate(Actor self, Order order, SupportPowerManager manager)
{
+ base.Activate(self, order, manager);
+
var items = (Info as ParatroopersPowerInfo).DropItems;
var startPos = self.World.ChooseRandomEdgeCell();
diff --git a/OpenRA.Mods.RA/SupportPowers/SonarPulsePower.cs b/OpenRA.Mods.RA/SupportPowers/SonarPulsePower.cs
index 3c65745a2a..621ff46278 100755
--- a/OpenRA.Mods.RA/SupportPowers/SonarPulsePower.cs
+++ b/OpenRA.Mods.RA/SupportPowers/SonarPulsePower.cs
@@ -18,8 +18,10 @@ namespace OpenRA.Mods.RA
public class SonarPulsePower : SupportPower
{
public SonarPulsePower(Actor self, SonarPulsePowerInfo info) : base(self, info) { }
- public override void Activate(Actor self, Order order)
+ public override void Activate(Actor self, Order order, SupportPowerManager manager)
{
+ base.Activate(self, order, manager);
+
// TODO: Reveal submarines
// Should this play for all players?
diff --git a/OpenRA.Mods.RA/SupportPowers/SpyPlanePower.cs b/OpenRA.Mods.RA/SupportPowers/SpyPlanePower.cs
index 722a504613..fde15507aa 100755
--- a/OpenRA.Mods.RA/SupportPowers/SpyPlanePower.cs
+++ b/OpenRA.Mods.RA/SupportPowers/SpyPlanePower.cs
@@ -25,8 +25,10 @@ namespace OpenRA.Mods.RA
{
public SpyPlanePower(Actor self, SpyPlanePowerInfo info) : base(self, info) { }
- public override void Activate(Actor self, Order order)
+ public override void Activate(Actor self, Order order, SupportPowerManager manager)
{
+ base.Activate(self, order, manager);
+
var enterCell = self.World.ChooseRandomEdgeCell();
var altitude = Rules.Info["u2"].Traits.Get().CruiseAltitude;
diff --git a/OpenRA.Mods.RA/SupportPowers/SupportPower.cs b/OpenRA.Mods.RA/SupportPowers/SupportPower.cs
index f55b13c043..6817ab41de 100755
--- a/OpenRA.Mods.RA/SupportPowers/SupportPower.cs
+++ b/OpenRA.Mods.RA/SupportPowers/SupportPower.cs
@@ -1,6 +1,6 @@
#region Copyright & License Information
/*
- * Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
+ * Copyright 2007-2014 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
@@ -8,6 +8,7 @@
*/
#endregion
+using OpenRA.Mods.RA.Effects;
using OpenRA.Traits;
namespace OpenRA.Mods.RA
@@ -45,6 +46,7 @@ namespace OpenRA.Mods.RA
{
public readonly Actor self;
public readonly SupportPowerInfo Info;
+ protected Beacon beacon;
public SupportPower(Actor self, SupportPowerInfo info)
{
@@ -62,7 +64,26 @@ namespace OpenRA.Mods.RA
Sound.PlayToPlayer(self.Owner, Info.EndChargeSound);
}
- public virtual void Activate(Actor self, Order order) { }
+ public virtual void Activate(Actor self, Order order, SupportPowerManager manager)
+ {
+ if (Info.DisplayBeacon)
+ {
+ beacon = new Beacon(
+ order.Player,
+ order.TargetLocation.CenterPosition,
+ Info.BeaconDuration,
+ Info.BeaconPalettePrefix);
+
+ self.World.Add(beacon);
+ }
+
+ if (Info.DisplayRadarPing && manager.RadarPings != null)
+ manager.RadarPings.Value.Add(
+ () => order.Player.IsAlliedWith(self.World.RenderPlayer),
+ order.TargetLocation.CenterPosition,
+ order.Player.Color.RGB,
+ Info.BeaconDuration);
+ }
public virtual IOrderGenerator OrderGenerator(string order, SupportPowerManager manager)
{
diff --git a/OpenRA.Mods.RA/SupportPowers/SupportPowerManager.cs b/OpenRA.Mods.RA/SupportPowers/SupportPowerManager.cs
index 9a09541944..7369dfc21e 100755
--- a/OpenRA.Mods.RA/SupportPowers/SupportPowerManager.cs
+++ b/OpenRA.Mods.RA/SupportPowers/SupportPowerManager.cs
@@ -188,24 +188,10 @@ namespace OpenRA.Mods.RA
var power = Instances.First(i => !InstanceDisabled(i));
// Note: order.Subject is the *player* actor
- power.Activate(power.self, order);
+ power.Activate(power.self, order, Manager);
RemainingTime = TotalTime;
notifiedCharging = notifiedReady = false;
- if (power.Info.DisplayBeacon)
- power.self.World.Add(new Beacon(
- order.Player,
- order.TargetLocation.CenterPosition,
- power.Info.BeaconDuration,
- power.Info.BeaconPalettePrefix));
-
- if (power.Info.DisplayRadarPing && Manager.RadarPings != null)
- Manager.RadarPings.Value.Add(
- () => order.Player.IsAlliedWith(power.self.World.RenderPlayer),
- order.TargetLocation.CenterPosition,
- order.Player.Color.RGB,
- power.Info.BeaconDuration);
-
if (Info.OneShot)
Disabled = true;
}
diff --git a/OpenRA.Utility/UpgradeRules.cs b/OpenRA.Utility/UpgradeRules.cs
index 0c8930ddd4..33154ffab3 100644
--- a/OpenRA.Utility/UpgradeRules.cs
+++ b/OpenRA.Utility/UpgradeRules.cs
@@ -143,6 +143,13 @@ namespace OpenRA.Utility
ConvertFloatToRange(ref node.Value.Value);
}
+ // Waypoint was renamed to Immobile
+ if (engineVersion < 20140312)
+ {
+ if (depth == 1 && node.Key == "Waypoint")
+ node.Key = "Immobile";
+ }
+
UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
}
}
diff --git a/mods/cnc/rules/structures.yaml b/mods/cnc/rules/structures.yaml
index d0f4c254e7..8961845dc1 100644
--- a/mods/cnc/rules/structures.yaml
+++ b/mods/cnc/rules/structures.yaml
@@ -385,6 +385,7 @@ HQ:
UnitType: a10
DisplayBeacon: True
DisplayRadarPing: True
+ CameraActor: camera
SupportPowerChargeBar:
FIX:
diff --git a/mods/cnc/rules/system-actors.yaml b/mods/cnc/rules/system-actors.yaml
index 467150a1bd..27a1412a54 100644
--- a/mods/cnc/rules/system-actors.yaml
+++ b/mods/cnc/rules/system-actors.yaml
@@ -31,17 +31,17 @@ CRATE:
BodyOrientation:
mpspawn:
- Waypoint:
+ Immobile:
RenderEditorOnly:
BodyOrientation:
waypoint:
- Waypoint:
+ Immobile:
RenderEditorOnly:
BodyOrientation:
CAMERA:
- Aircraft:
+ Immobile:
Health:
HP: 1000
RevealsShroud:
diff --git a/mods/d2k/rules/atreides.yaml b/mods/d2k/rules/atreides.yaml
index 6c98002bc2..c601c4d67d 100644
--- a/mods/d2k/rules/atreides.yaml
+++ b/mods/d2k/rules/atreides.yaml
@@ -59,7 +59,6 @@ PALACEA:
LongDesc: Ornithopter drops a load of parachuted\nbombs on your target
UnitType: orni.bomber
SelectTargetSound:
- FlareType:
CanPowerDown:
DisabledOverlay:
RequiresPower:
diff --git a/mods/d2k/rules/ordos.yaml b/mods/d2k/rules/ordos.yaml
index c414e0b203..53437f9f25 100644
--- a/mods/d2k/rules/ordos.yaml
+++ b/mods/d2k/rules/ordos.yaml
@@ -88,7 +88,6 @@ PALACEO:
LongDesc: Ornithopter drops a load of parachuted\nbombs on your target
UnitType: orni.bomber
SelectTargetSound:
- FlareType:
CanPowerDown:
DisabledOverlay:
RequiresPower:
diff --git a/mods/d2k/rules/system-actors.yaml b/mods/d2k/rules/system-actors.yaml
index c3d4be1122..4542a03daa 100644
--- a/mods/d2k/rules/system-actors.yaml
+++ b/mods/d2k/rules/system-actors.yaml
@@ -85,12 +85,12 @@ CRATE:
BodyOrientation:
mpspawn:
- Waypoint:
+ Immobile:
RenderEditorOnly:
BodyOrientation:
waypoint:
- Waypoint:
+ Immobile:
RenderEditorOnly:
BodyOrientation:
diff --git a/mods/ra/rules/system-actors.yaml b/mods/ra/rules/system-actors.yaml
index c3b93435aa..1fabf9381a 100644
--- a/mods/ra/rules/system-actors.yaml
+++ b/mods/ra/rules/system-actors.yaml
@@ -119,7 +119,7 @@ CRATE:
BodyOrientation:
CAMERA:
- Aircraft:
+ Immobile:
Health:
HP: 1000
RevealsShroud:
@@ -129,7 +129,7 @@ CAMERA:
BodyOrientation:
FLARE:
- Aircraft:
+ Immobile:
Health:
HP: 1000
RevealsShroud:
@@ -152,7 +152,7 @@ powerproxy.parabombs:
AllowMultiple: yes
UnitType: badr.bomber
SelectTargetSound: slcttgt1.aud
- FlareType: flare
+ FlareActor: flare
powerproxy.sonarpulse:
SonarPulsePower:
@@ -165,12 +165,12 @@ powerproxy.sonarpulse:
SelectTargetSound: slcttgt1.aud
mpspawn:
- Waypoint:
+ Immobile:
RenderEditorOnly:
BodyOrientation:
waypoint:
- Waypoint:
+ Immobile:
RenderEditorOnly:
BodyOrientation:
diff --git a/mods/ts/rules/system-actors.yaml b/mods/ts/rules/system-actors.yaml
index 3420574682..638c103e1a 100644
--- a/mods/ts/rules/system-actors.yaml
+++ b/mods/ts/rules/system-actors.yaml
@@ -1,10 +1,10 @@
mpspawn:
- Waypoint:
+ Immobile:
RenderEditorOnly:
BodyOrientation:
waypoint:
- Waypoint:
+ Immobile:
RenderEditorOnly:
BodyOrientation: