diff --git a/OpenRA.Game/Traits/World/UnitInfluence.cs b/OpenRA.Game/ActorMap.cs
similarity index 92%
rename from OpenRA.Game/Traits/World/UnitInfluence.cs
rename to OpenRA.Game/ActorMap.cs
index 532428add7..a0c3337217 100644
--- a/OpenRA.Game/Traits/World/UnitInfluence.cs
+++ b/OpenRA.Game/ActorMap.cs
@@ -13,15 +13,21 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using OpenRA.FileFormats;
+using OpenRA.Traits;
-namespace OpenRA.Traits
+namespace OpenRA
{
- public class UnitInfluenceInfo : ITraitInfo
- {
- public object Create( ActorInitializer init ) { return new UnitInfluence( init.world ); }
- }
-
- public class UnitInfluence
+ public enum SubCell
+ {
+ FullCell,
+ TopLeft,
+ TopRight,
+ Center,
+ BottomLeft,
+ BottomRight
+ }
+
+ public class ActorMap
{
class InfluenceNode
{
@@ -33,7 +39,7 @@ namespace OpenRA.Traits
InfluenceNode[,] influence;
Map map;
- public UnitInfluence( World world )
+ public ActorMap( World world )
{
map = world.Map;
influence = new InfluenceNode[world.Map.MapSize.X, world.Map.MapSize.Y];
diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj
index be7011fb21..1e169379b2 100755
--- a/OpenRA.Game/OpenRA.Game.csproj
+++ b/OpenRA.Game/OpenRA.Game.csproj
@@ -136,7 +136,6 @@
-
@@ -185,6 +184,7 @@
+
diff --git a/OpenRA.Game/Orders/UnitOrderGenerator.cs b/OpenRA.Game/Orders/UnitOrderGenerator.cs
index df0c1bfe04..04c8dd9c00 100644
--- a/OpenRA.Game/Orders/UnitOrderGenerator.cs
+++ b/OpenRA.Game/Orders/UnitOrderGenerator.cs
@@ -84,13 +84,12 @@ namespace OpenRA.Orders
if( mi.Button == MouseButton.Right )
{
- var uim = self.World.WorldActor.Trait();
foreach( var o in self.TraitsImplementing()
.SelectMany( trait => trait.Orders
.Select( x => new { Trait = trait, Order = x } ) )
.OrderByDescending( x => x.Order.OrderPriority ) )
{
- var actorsAt = uim.GetUnitsAt( xy ).ToList();
+ var actorsAt = self.World.ActorMap.GetUnitsAt( xy ).ToList();
string cursor = null;
if( underCursor != null )
diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs
index 3864faaf05..bbaf192825 100755
--- a/OpenRA.Game/Traits/TraitsInterfaces.cs
+++ b/OpenRA.Game/Traits/TraitsInterfaces.cs
@@ -85,16 +85,6 @@ namespace OpenRA.Traits
public interface IRadarColorModifier { Color RadarColorOverride(Actor self); }
public interface IHasLocation { int2 PxPosition { get; } }
- public enum SubCell
- {
- FullCell,
- TopLeft,
- TopRight,
- Center,
- BottomLeft,
- BottomRight
- }
-
public interface IOccupySpace : IHasLocation
{
int2 TopLeft { get; }
diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs
index 8de5aff5d6..9c004f7251 100644
--- a/OpenRA.Game/Traits/World/ResourceLayer.cs
+++ b/OpenRA.Game/Traits/World/ResourceLayer.cs
@@ -15,7 +15,7 @@ using OpenRA.Graphics;
namespace OpenRA.Traits
{
- public class ResourceLayerInfo : TraitInfo, Requires { }
+ public class ResourceLayerInfo : TraitInfo { }
public class ResourceLayer: IRenderOverlay, IWorldLoaded
{
@@ -84,7 +84,7 @@ namespace OpenRA.Traits
{
if (!world.Map.IsInMap(a.X, a.Y)) return false;
if (!rt.info.AllowedTerrainTypes.Contains(world.GetTerrainInfo(a).Type)) return false;
- if (!rt.info.AllowUnderActors && world.WorldActor.Trait().AnyUnitsAt(a)) return false;
+ if (!rt.info.AllowUnderActors && world.ActorMap.AnyUnitsAt(a)) return false;
return true;
}
diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs
index 2c42faee26..82f3f27c10 100644
--- a/OpenRA.Game/World.cs
+++ b/OpenRA.Game/World.cs
@@ -55,7 +55,8 @@ namespace OpenRA
public readonly Actor WorldActor;
public readonly Map Map;
public readonly TileSet TileSet;
-
+ public readonly ActorMap ActorMap;
+
public void IssueOrder( Order o ) { orderManager.IssueOrder( o ); } /* avoid exposing the OM to mod code */
IOrderGenerator orderGenerator_;
@@ -100,7 +101,8 @@ namespace OpenRA
WorldActor = CreateActor( "World", new TypeDictionary() );
LocalShroud = WorldActor.Trait();
-
+ ActorMap = new ActorMap(this);
+
// Add players
foreach (var cmp in WorldActor.TraitsImplementing())
cmp.CreatePlayers(this);
diff --git a/OpenRA.Mods.RA/Activities/LayMines.cs b/OpenRA.Mods.RA/Activities/LayMines.cs
index 9f45a1722c..9d4bba7315 100644
--- a/OpenRA.Mods.RA/Activities/LayMines.cs
+++ b/OpenRA.Mods.RA/Activities/LayMines.cs
@@ -70,7 +70,7 @@ namespace OpenRA.Mods.RA.Activities
bool ShouldLayMine(Actor self, int2 p)
{
// if there is no unit (other than me) here, we want to place a mine here
- return !self.World.WorldActor.Trait()
+ return !self.World.ActorMap
.GetUnitsAt(p).Any(a => a != self);
}
diff --git a/OpenRA.Mods.RA/Activities/UnloadCargo.cs b/OpenRA.Mods.RA/Activities/UnloadCargo.cs
index 01faedb26b..c32e5f70ad 100644
--- a/OpenRA.Mods.RA/Activities/UnloadCargo.cs
+++ b/OpenRA.Mods.RA/Activities/UnloadCargo.cs
@@ -22,7 +22,7 @@ namespace OpenRA.Mods.RA.Activities
int2? ChooseExitTile(Actor self, Actor cargo)
{
// is anyone still hogging this tile?
- if (self.World.WorldActor.Trait().GetUnitsAt(self.Location).Count() > 1)
+ if (self.World.ActorMap.GetUnitsAt(self.Location).Count() > 1)
return null;
var mobile = cargo.Trait();
diff --git a/OpenRA.Mods.RA/Air/Aircraft.cs b/OpenRA.Mods.RA/Air/Aircraft.cs
index b3b055ae99..be2a734b3d 100755
--- a/OpenRA.Mods.RA/Air/Aircraft.cs
+++ b/OpenRA.Mods.RA/Air/Aircraft.cs
@@ -170,7 +170,7 @@ namespace OpenRA.Mods.RA.Air
if (!self.World.Map.IsInMap(cell))
return false;
- if (self.World.WorldActor.Trait().AnyUnitsAt(cell))
+ if (self.World.ActorMap.AnyUnitsAt(cell))
return false;
var type = self.World.GetTerrainType(cell);
diff --git a/OpenRA.Mods.RA/Bridge.cs b/OpenRA.Mods.RA/Bridge.cs
index 3aff7dbfb1..8cd5f6a62a 100644
--- a/OpenRA.Mods.RA/Bridge.cs
+++ b/OpenRA.Mods.RA/Bridge.cs
@@ -144,10 +144,8 @@ namespace OpenRA.Mods.RA
void KillUnitsOnBridge()
{
- var uim = self.World.WorldActor.Trait();
-
foreach (var c in TileSprites[currentTemplate].Keys)
- foreach (var a in uim.GetUnitsAt(c))
+ foreach (var a in self.World.ActorMap.GetUnitsAt(c))
if (a.HasTrait() && !a.Trait().CanEnterCell(c))
a.Kill(self);
}
diff --git a/OpenRA.Mods.RA/Buildings/Util.cs b/OpenRA.Mods.RA/Buildings/Util.cs
index f98c6f3d1d..4ec4863c7c 100755
--- a/OpenRA.Mods.RA/Buildings/Util.cs
+++ b/OpenRA.Mods.RA/Buildings/Util.cs
@@ -24,7 +24,7 @@ namespace OpenRA.Mods.RA.Buildings
public static bool IsCellBuildable(this World world, int2 a, bool waterBound, Actor toIgnore)
{
if (world.WorldActor.Trait().GetBuildingAt(a) != null) return false;
- if (world.WorldActor.Trait().GetUnitsAt(a).Any(b => b != toIgnore)) return false;
+ if (world.ActorMap.GetUnitsAt(a).Any(b => b != toIgnore)) return false;
if (waterBound)
return world.Map.IsInMap(a.X,a.Y) && world.GetTerrainInfo(a).IsWater;
diff --git a/OpenRA.Mods.RA/Crate.cs b/OpenRA.Mods.RA/Crate.cs
index 770e50afcb..ac4404930a 100644
--- a/OpenRA.Mods.RA/Crate.cs
+++ b/OpenRA.Mods.RA/Crate.cs
@@ -100,17 +100,15 @@ namespace OpenRA.Mods.RA
return false;
if (self.World.WorldActor.Trait().GetBuildingAt(cell) != null) return false;
- if (self.World.WorldActor.Trait().GetUnitsAt(cell).Any()) return false;
+ if (self.World.ActorMap.GetUnitsAt(cell).Any()) return false;
return true;
}
public void SetPosition(Actor self, int2 cell)
{
- var uim = self.World.WorldActor.Trait();
-
if( self.IsInWorld )
- uim.Remove(self, this);
+ self.World.ActorMap.Remove(self, this);
Location = cell;
PxPosition = Util.CenterOfCell(cell);
@@ -121,7 +119,7 @@ namespace OpenRA.Mods.RA
rs.anim.PlayRepeating(seq);
if( self.IsInWorld )
- uim.Add(self, this);
+ self.World.ActorMap.Add(self, this);
}
public IEnumerable CrushClasses { get { yield return "crate"; } }
diff --git a/OpenRA.Mods.RA/CrateDrop.cs b/OpenRA.Mods.RA/CrateDrop.cs
index e68142456e..2b4f492732 100644
--- a/OpenRA.Mods.RA/CrateDrop.cs
+++ b/OpenRA.Mods.RA/CrateDrop.cs
@@ -66,7 +66,7 @@ namespace OpenRA.Mods.RA
// Don't drop on any actors
if (self.World.WorldActor.Trait().GetBuildingAt(p) != null) continue;
- if (self.World.WorldActor.Trait().GetUnitsAt(p).Any()) continue;
+ if (self.World.ActorMap.GetUnitsAt(p).Any()) continue;
return p;
}
diff --git a/OpenRA.Mods.RA/CrateSpawner.cs b/OpenRA.Mods.RA/CrateSpawner.cs
index 8c8df81a8f..6e935897c9 100644
--- a/OpenRA.Mods.RA/CrateSpawner.cs
+++ b/OpenRA.Mods.RA/CrateSpawner.cs
@@ -64,7 +64,7 @@ namespace OpenRA.Mods.RA
// Don't spawn on any actors
if (self.World.WorldActor.Trait().GetBuildingAt(p) != null) continue;
- if (self.World.WorldActor.Trait().GetUnitsAt(p).Any()) continue;
+ if (self.World.ActorMap.GetUnitsAt(p).Any()) continue;
self.World.AddFrameEndTask(
w => crates.Add(w.CreateActor("crate", new TypeDictionary
diff --git a/OpenRA.Mods.RA/Effects/Bullet.cs b/OpenRA.Mods.RA/Effects/Bullet.cs
index 4b8d550bbe..b9d8ba4110 100755
--- a/OpenRA.Mods.RA/Effects/Bullet.cs
+++ b/OpenRA.Mods.RA/Effects/Bullet.cs
@@ -133,7 +133,7 @@ namespace OpenRA.Mods.RA.Effects
var pos = float2.Lerp(Args.src, Args.dest, at);
var cell = Traits.Util.CellContaining(pos);
- if (world.WorldActor.Trait().GetUnitsAt(cell).Any(
+ if (world.ActorMap.GetUnitsAt(cell).Any(
a => a.HasTrait()))
{
Args.dest = pos.ToInt2();
diff --git a/OpenRA.Mods.RA/Effects/Missile.cs b/OpenRA.Mods.RA/Effects/Missile.cs
index 1e14ab5af4..9f6784e5bb 100755
--- a/OpenRA.Mods.RA/Effects/Missile.cs
+++ b/OpenRA.Mods.RA/Effects/Missile.cs
@@ -135,7 +135,7 @@ namespace OpenRA.Mods.RA.Effects
if (!Info.High) // check for hitting a wall
{
var cell = Traits.Util.CellContaining(PxPosition);
- if (world.WorldActor.Trait().GetUnitsAt(cell).Any(
+ if (world.ActorMap.GetUnitsAt(cell).Any(
a => a.HasTrait()))
Explode(world);
}
diff --git a/OpenRA.Mods.RA/Move/Mobile.cs b/OpenRA.Mods.RA/Move/Mobile.cs
index a8c923fe3d..47cab7ed25 100755
--- a/OpenRA.Mods.RA/Move/Mobile.cs
+++ b/OpenRA.Mods.RA/Move/Mobile.cs
@@ -83,15 +83,15 @@ namespace OpenRA.Mods.RA.Move
{SubCell.FullCell, new int2(0,0)},
};
- public bool CanEnterCell(World world, UnitInfluence uim, int2 cell, Actor ignoreActor, bool checkTransientActors)
+ public bool CanEnterCell(World world, int2 cell, Actor ignoreActor, bool checkTransientActors)
{
if (MovementCostForCell(world, cell) == int.MaxValue)
return false;
- if (SharesCell && uim.HasFreeSubCell(cell))
+ if (SharesCell && world.ActorMap.HasFreeSubCell(cell))
return true;
- var blockingActors = uim.GetUnitsAt(cell).Where(x => x != ignoreActor).ToList();
+ var blockingActors = world.ActorMap.GetUnitsAt(cell).Where(x => x != ignoreActor).ToList();
if (checkTransientActors && blockingActors.Count > 0)
{
// Non-sharable unit can enter a cell with shareable units only if it can crush all of them
@@ -105,12 +105,6 @@ namespace OpenRA.Mods.RA.Move
return true;
}
-
- public bool CanEnterCell(World world, int2 cell, Actor ignoreActor, bool checkTransientActors)
- {
- var uim = world.WorldActor.Trait();
- return CanEnterCell(world, uim, cell, ignoreActor, checkTransientActors);
- }
}
public class Mobile : IIssueOrder, IResolveOrder, IOrderVoice, IOccupySpace, IMove, IFacing, INudge, ISync
@@ -163,8 +157,6 @@ namespace OpenRA.Mods.RA.Move
AddInfluence();
}
- UnitInfluence uim;
-
const int avgTicksBeforePathing = 5;
const int spreadTicksBeforePathing = 5;
internal int ticksBeforePathing = 0;
@@ -174,7 +166,6 @@ namespace OpenRA.Mods.RA.Move
this.self = init.self;
this.Info = info;
- uim = self.World.WorldActor.Trait();
__toSubCell = __fromSubCell = info.SharesCell ? SubCell.Center : SubCell.FullCell;
if (init.Contains())
{
@@ -321,7 +312,7 @@ namespace OpenRA.Mods.RA.Move
return new[]{ __fromSubCell, SubCell.TopLeft, SubCell.TopRight, SubCell.Center,
SubCell.BottomLeft, SubCell.BottomRight}.First(b =>
{
- var blockingActors = uim.GetUnitsAt(a,b).Where(c => c != ignoreActor);
+ var blockingActors = self.World.ActorMap.GetUnitsAt(a,b).Where(c => c != ignoreActor);
if (blockingActors.Count() > 0)
{
// Non-sharable unit can enter a cell with shareable units only if it can crush all of them
@@ -343,13 +334,12 @@ namespace OpenRA.Mods.RA.Move
public bool CanEnterCell(int2 cell, Actor ignoreActor, bool checkTransientActors)
{
- var uim = self.World.WorldActor.Trait();
- return Info.CanEnterCell(self.World, uim, cell, ignoreActor, checkTransientActors);
+ return Info.CanEnterCell(self.World, cell, ignoreActor, checkTransientActors);
}
public void FinishedMoving(Actor self)
{
- var crushable = uim.GetUnitsAt(toCell).Where(a => a != self && a.HasTrait());
+ var crushable = self.World.ActorMap.GetUnitsAt(toCell).Where(a => a != self && a.HasTrait());
foreach (var a in crushable)
{
var crushActions = a.TraitsImplementing().Where(b => b.CrushClasses.Intersect(Info.Crushes).Any());
@@ -374,13 +364,13 @@ namespace OpenRA.Mods.RA.Move
public void AddInfluence()
{
if (self.IsInWorld)
- uim.Add(self, this);
+ self.World.ActorMap.Add(self, this);
}
public void RemoveInfluence()
{
if (self.IsInWorld)
- uim.Remove(self, this);
+ self.World.ActorMap.Remove(self, this);
}
public void OnNudge(Actor self, Actor nudger)
diff --git a/OpenRA.Mods.RA/Move/Move.cs b/OpenRA.Mods.RA/Move/Move.cs
index f423bf0e56..c1bfd31f34 100755
--- a/OpenRA.Mods.RA/Move/Move.cs
+++ b/OpenRA.Mods.RA/Move/Move.cs
@@ -162,7 +162,7 @@ namespace OpenRA.Mods.RA.Move
void NudgeBlocker(Actor self, int2 nextCell)
{
- var blocker = self.World.WorldActor.Trait().GetUnitsAt(nextCell).FirstOrDefault();
+ var blocker = self.World.ActorMap.GetUnitsAt(nextCell).FirstOrDefault();
if (blocker == null) return;
Log.Write("debug", "NudgeBlocker #{0} nudges #{1} at {2} from {3}",
diff --git a/OpenRA.Mods.RA/Move/PathSearch.cs b/OpenRA.Mods.RA/Move/PathSearch.cs
index 23cb1ec4ab..da1d3201f9 100755
--- a/OpenRA.Mods.RA/Move/PathSearch.cs
+++ b/OpenRA.Mods.RA/Move/PathSearch.cs
@@ -27,12 +27,10 @@ namespace OpenRA.Mods.RA.Move
public bool inReverse;
MobileInfo mobileInfo;
- UnitInfluence uim;
public PathSearch(World world, MobileInfo mobileInfo)
{
this.world = world;
- uim = world.WorldActor.Trait();
cellInfo = InitCellInfo();
this.mobileInfo = mobileInfo;
queue = new PriorityQueue();
@@ -105,7 +103,7 @@ namespace OpenRA.Mods.RA.Move
if (costHere == int.MaxValue)
continue;
- if (!mobileInfo.CanEnterCell(world, uim, newHere, ignoreBuilding, checkForBlocked))
+ if (!mobileInfo.CanEnterCell(world, newHere, ignoreBuilding, checkForBlocked))
continue;
if (customBlock != null && customBlock(newHere))
diff --git a/OpenRA.Mods.RA/Production.cs b/OpenRA.Mods.RA/Production.cs
index d70772c8bb..9671a2af86 100755
--- a/OpenRA.Mods.RA/Production.cs
+++ b/OpenRA.Mods.RA/Production.cs
@@ -121,11 +121,10 @@ namespace OpenRA.Mods.RA
static bool CanUseExit(Actor self, ActorInfo producee, ExitInfo s)
{
- var uim = self.World.WorldActor.Trait();
var mobileInfo = producee.Traits.GetOrDefault();
return mobileInfo == null ||
- mobileInfo.CanEnterCell(self.World, uim, self.Location + s.ExitCell, self, true);
+ mobileInfo.CanEnterCell(self.World, self.Location + s.ExitCell, self, true);
}
}
}
diff --git a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs
index 815ae36ff9..c479ea0a5d 100755
--- a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs
+++ b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs
@@ -66,8 +66,8 @@ namespace OpenRA.Mods.RA.Render
public override void Tick(Actor self)
{
base.Tick(self);
- if (isOpen && !self.World.WorldActor.Trait()
- .GetUnitsAt(openExit).Any( a => a != self ))
+ if (isOpen && !self.World.ActorMap.GetUnitsAt(openExit)
+ .Any( a => a != self ))
{
isOpen = false;
roof.PlayBackwardsThen(NormalizeSequence(self, "build-top"), () => roof.Play(NormalizeSequence(self, "idle-top")));
diff --git a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs
index dc1ba292b1..f8fe418539 100755
--- a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs
+++ b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs
@@ -62,11 +62,10 @@ namespace OpenRA.Mods.RA
public IEnumerable UnitsInRange(int2 xy)
{
int range = (Info as ChronoshiftPowerInfo).Range;
- var uim = self.World.WorldActor.Trait();
var tiles = self.World.FindTilesInCircle(xy, range);
var units = new List();
foreach (var t in tiles)
- units.AddRange(uim.GetUnitsAt(t));
+ units.AddRange(self.World.ActorMap.GetUnitsAt(t));
return units.Distinct().Where(a => a.HasTrait());
}
diff --git a/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs b/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs
index 674fe2d16d..77521f2937 100755
--- a/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs
+++ b/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs
@@ -48,11 +48,10 @@ namespace OpenRA.Mods.RA
public IEnumerable UnitsInRange(int2 xy)
{
int range = (Info as IronCurtainPowerInfo).Range;
- var uim = self.World.WorldActor.Trait();
var tiles = self.World.FindTilesInCircle(xy, range);
var units = new List();
foreach (var t in tiles)
- units.AddRange(uim.GetUnitsAt(t));
+ units.AddRange(self.World.ActorMap.GetUnitsAt(t));
return units.Distinct().Where(a => a.HasTrait());
}
diff --git a/mods/cnc/rules/system.yaml b/mods/cnc/rules/system.yaml
index 4279a35d4a..d093180c4d 100644
--- a/mods/cnc/rules/system.yaml
+++ b/mods/cnc/rules/system.yaml
@@ -53,7 +53,6 @@ World:
NukePaletteEffect:
CncWaterPaletteRotation:
BuildingInfluence:
- UnitInfluence:
BridgeLayer:
Bridges: bridge1, bridge2, bridge3, bridge4
PaletteFromCurrentTileset@terrain:
diff --git a/mods/ra/rules/system.yaml b/mods/ra/rules/system.yaml
index 824797a5b3..3fa4487d43 100644
--- a/mods/ra/rules/system.yaml
+++ b/mods/ra/rules/system.yaml
@@ -107,7 +107,6 @@ World:
NukePaletteEffect:
LightPaletteRotator:
BuildingInfluence:
- UnitInfluence:
ChooseBuildTabOnSelect:
BridgeLayer:
Bridges: bridge1, bridge2, br1, br2, br3