moved BIM/UIM to World, and added World.CreateActor

This commit is contained in:
Bob
2010-01-17 12:50:16 +13:00
parent 79a5966af7
commit e792c9ce17
20 changed files with 55 additions and 52 deletions

View File

@@ -40,8 +40,6 @@ namespace OpenRa
viewport.GoToStartLocation();
}
}
public static BuildingInfluenceMap BuildingInfluence;
public static UnitInfluenceMap UnitInfluence;
public static bool skipMakeAnims = true;
@@ -74,9 +72,6 @@ namespace OpenRa
palette = new HardwarePalette(renderer, world.Map);
var worldActor = new Actor("World", new int2(int.MaxValue, int.MaxValue), null);
Game.world.Add(worldActor);
for (int i = 0; i < 8; i++)
{
var race = players.ContainsKey(i) ? players[i].Race : Race.Allies;
@@ -92,12 +87,9 @@ namespace OpenRa
minimap = new Minimap(renderer);
BuildingInfluence = new BuildingInfluenceMap();
UnitInfluence = new UnitInfluenceMap();
skipMakeAnims = true;
foreach (var treeReference in Game.world.Map.Trees)
world.Add(new Actor(treeReference.Image, new int2(treeReference.Location), null));
world.CreateActor(treeReference.Image, new int2(treeReference.Location), null);
LoadMapActors(Rules.AllRules);
skipMakeAnims = false;
@@ -154,8 +146,8 @@ namespace OpenRa
//num=owner,type,health,location,facing,...
var parts = s.Value.Split( ',' );
var loc = int.Parse(parts[3]);
world.Add(new Actor(parts[1].ToLowerInvariant(), new int2(loc % 128, loc / 128),
players.Values.FirstOrDefault(p => p.InternalName == parts[0]) ?? players[0]));
world.CreateActor(parts[1].ToLowerInvariant(), new int2(loc % 128, loc / 128),
players.Values.FirstOrDefault(p => p.InternalName == parts[0]) ?? players[0]);
}
}
@@ -209,7 +201,7 @@ namespace OpenRa
}
world.Tick();
UnitInfluence.Tick();
Game.world.UnitInfluence.Tick();
foreach (var player in players.Values)
player.Tick();
}
@@ -248,8 +240,8 @@ namespace OpenRa
public static bool IsCellBuildable(int2 a, UnitMovementType umt, Actor toIgnore)
{
if (BuildingInfluence.GetBuildingAt(a) != null) return false;
if (UnitInfluence.GetUnitsAt(a).Any(b => b != toIgnore)) return false;
if (Game.world.BuildingInfluence.GetBuildingAt(a) != null) return false;
if (Game.world.UnitInfluence.GetUnitsAt(a).Any(b => b != toIgnore)) return false;
return Game.world.Map.IsInMap(a.X, a.Y) &&
TerrainCosts.Cost(umt,
@@ -350,7 +342,7 @@ namespace OpenRa
{
heuristic = loc =>
{
var b = Game.BuildingInfluence.GetBuildingAt(loc);
var b = Game.world.BuildingInfluence.GetBuildingAt(loc);
if (b != null && b.Owner == p && b.Info.Traits.Get<BuildingInfo>().BaseNormal) return 0;
if ((loc - position).Length > maxDistance)
return float.PositiveInfinity; /* not quite right */
@@ -416,7 +408,7 @@ namespace OpenRa
// todo: spawn more than one unit, in most cases!
var sp = ChooseSpawnPoint(available, taken);
world.Add(new Actor("mcv", sp, players[client.Index]));
world.CreateActor("mcv", sp, players[client.Index]);
}
Game.viewport.GoToStartLocation();

View File

@@ -91,7 +91,7 @@ namespace OpenRa.Graphics
for (var y = 0; y < 128; y++)
for (var x = 0; x < 128; x++)
{
var b = Game.BuildingInfluence.GetBuildingAt(new int2(x, y));
var b = Game.world.BuildingInfluence.GetBuildingAt(new int2(x, y));
if (b != null)
*(c + (y * bitmapData.Stride >> 2) + x) =
(b.Owner != null ? playerColors[(int)b.Owner.Palette] : terrainTypeColors[4]).ToArgb();

View File

@@ -22,7 +22,7 @@ namespace OpenRa.Orders
if( producing == null || producing.Item != order.TargetString || producing.RemainingTime != 0 )
return;
Game.world.Add( new Actor( order.TargetString, order.TargetLocation - Footprint.AdjustForBuildingSize( unit.Traits.Get<BuildingInfo>() ), order.Player ) );
Game.world.CreateActor( order.TargetString, order.TargetLocation - Footprint.AdjustForBuildingSize( unit.Traits.Get<BuildingInfo>() ), order.Player );
if (order.Player == Game.LocalPlayer)
{
Sound.Play("placbldg.aud");

View File

@@ -28,7 +28,7 @@ namespace OpenRa
public static bool CanSpreadInto(int i, int j)
{
if (Game.BuildingInfluence.GetBuildingAt(new int2(i, j)) != null)
if (Game.world.BuildingInfluence.GetBuildingAt(new int2(i, j)) != null)
return false;
return TerrainCosts.Cost(UnitMovementType.Wheel,

View File

@@ -54,7 +54,7 @@ namespace OpenRa
return q =>
p != q &&
((p - q).LengthSquared < dist * dist) &&
(Game.UnitInfluence.GetUnitsAt(q).Any());
(Game.world.UnitInfluence.GetUnitsAt(q).Any());
}
public List<int2> FindPath( PathSearch search )

View File

@@ -56,15 +56,15 @@ namespace OpenRa
{
if (passableCost[(int)umt][newHere.X, newHere.Y] == float.PositiveInfinity)
continue;
if (!Game.BuildingInfluence.CanMoveHere(newHere) &&
Game.BuildingInfluence.GetBuildingAt(newHere) != ignoreBuilding)
if (!Game.world.BuildingInfluence.CanMoveHere(newHere) &&
Game.world.BuildingInfluence.GetBuildingAt(newHere) != ignoreBuilding)
continue;
if (Game.world.Map.IsOverlaySolid(newHere))
continue;
}
// Replicate real-ra behavior of not being able to enter a cell if there is a mixture of crushable and uncrushable units
if (checkForBlocked && (Game.UnitInfluence.GetUnitsAt(newHere).Any(a => !Game.IsActorPathableToCrush(a, umt))))
if (checkForBlocked && (Game.world.UnitInfluence.GetUnitsAt(newHere).Any(a => !Game.IsActorPathableToCrush(a, umt))))
continue;
if (customBlock != null && customBlock(newHere))

View File

@@ -32,7 +32,7 @@ namespace OpenRa
public Player( int index, Session.Client client )
{
Shroud = new Shroud(this);
Game.world.Add(this.PlayerActor = new Actor("Player", new int2(int.MaxValue, int.MaxValue), this));
this.PlayerActor = Game.world.CreateActor("Player", new int2(int.MaxValue, int.MaxValue), this);
this.Index = index;
this.InternalName = "Multi{0}".F(index);

View File

@@ -14,12 +14,11 @@ namespace OpenRa.Traits
Game.world.AddFrameEndTask(
w =>
{ /* create the free harvester! */
var harvester = new Actor("harv", self.Location + new int2(1, 2), self.Owner);
var harvester = w.CreateActor("harv", self.Location + new int2(1, 2), self.Owner);
var unit = harvester.traits.Get<Unit>();
var mobile = harvester.traits.Get<Mobile>();
unit.Facing = 64;
harvester.QueueActivity(new Harvest());
w.Add(harvester);
});
}
}

View File

@@ -17,7 +17,7 @@ namespace OpenRa.Traits.Activities
Sound.Play("placbldg.aud");
Sound.Play("build5.aud");
}
Game.world.Add( new Actor( "fact", self.Location - new int2( 1, 1 ), self.Owner ) );
Game.world.CreateActor( "fact", self.Location - new int2( 1, 1 ), self.Owner );
} );
return this;
}

View File

@@ -57,13 +57,13 @@ namespace OpenRa.Traits.Activities
bool CanEnterCell( int2 c, Actor self )
{
if (!Game.BuildingInfluence.CanMoveHere(c)
&& Game.BuildingInfluence.GetBuildingAt(c) != ignoreBuilding)
if (!Game.world.BuildingInfluence.CanMoveHere(c)
&& Game.world.BuildingInfluence.GetBuildingAt(c) != ignoreBuilding)
return false;
// Cannot enter a cell if any unit inside is uncrushable
// This will need to be updated for multiple-infantry-in-a-cell
return (!Game.UnitInfluence.GetUnitsAt(c).Any(a => a != self && !Game.IsActorCrushableByActor(a, self)));
return (!Game.world.UnitInfluence.GetUnitsAt(c).Any(a => a != self && !Game.IsActorCrushableByActor(a, self)));
}
public IActivity Tick( Actor self )
@@ -144,10 +144,10 @@ namespace OpenRa.Traits.Activities
return null;
}
Game.UnitInfluence.Remove( self, mobile );
Game.world.UnitInfluence.Remove( self, mobile );
var newPath = getPath(self, mobile).TakeWhile(a => a != self.Location).ToList();
Game.UnitInfluence.Add( self, mobile );
Game.world.UnitInfluence.Add( self, mobile );
if (newPath.Count != 0)
path = newPath;

View File

@@ -14,9 +14,8 @@ namespace OpenRa.Traits.Activities
ns.Sold(self);
w.Remove(self);
var mcv = new Actor("mcv", self.Location + new int2(1, 1), self.Owner);
var mcv = w.CreateActor("mcv", self.Location + new int2(1, 1), self.Owner);
mcv.traits.Get<Unit>().Facing = 96;
w.Add(mcv);
}
public IActivity Tick(Actor self)

View File

@@ -13,7 +13,7 @@ namespace OpenRa.Traits.Activities
int2? ChooseExitTile(Actor self)
{
// is anyone still hogging this tile?
if (Game.UnitInfluence.GetUnitsAt(self.Location).Count() > 1)
if (Game.world.UnitInfluence.GetUnitsAt(self.Location).Count() > 1)
return null;
for (var i = -1; i < 2; i++)

View File

@@ -50,10 +50,10 @@ namespace OpenRa.Traits
public bool CanEnterCell(int2 a)
{
if (!Game.BuildingInfluence.CanMoveHere(a)) return false;
if (!Game.world.BuildingInfluence.CanMoveHere(a)) return false;
var crushable = true;
foreach (Actor actor in Game.UnitInfluence.GetUnitsAt(a))
foreach (Actor actor in Game.world.UnitInfluence.GetUnitsAt(a))
{
if (actor == self) continue;

View File

@@ -21,7 +21,7 @@ namespace OpenRa.Traits
public int2 fromCell
{
get { return __fromCell; }
set { Game.UnitInfluence.Remove(self, this); __fromCell = value; Game.UnitInfluence.Add(self, this); }
set { Game.world.UnitInfluence.Remove(self, this); __fromCell = value; Game.world.UnitInfluence.Add(self, this); }
}
public int2 toCell
{
@@ -30,11 +30,11 @@ namespace OpenRa.Traits
{
if (self.Location != value)
{
Game.UnitInfluence.Remove(self, this);
Game.world.UnitInfluence.Remove(self, this);
self.Location = value;
self.Owner.Shroud.Explore(self);
}
Game.UnitInfluence.Add(self, this);
Game.world.UnitInfluence.Add(self, this);
}
}
@@ -42,7 +42,7 @@ namespace OpenRa.Traits
{
this.self = self;
__fromCell = toCell;
Game.UnitInfluence.Add(self, this);
Game.world.UnitInfluence.Add(self, this);
}
public void TeleportTo(Actor self, int2 xy)
@@ -90,10 +90,10 @@ namespace OpenRa.Traits
public bool CanEnterCell(int2 a)
{
if (!Game.BuildingInfluence.CanMoveHere(a)) return false;
if (!Game.world.BuildingInfluence.CanMoveHere(a)) return false;
var crushable = true;
foreach (Actor actor in Game.UnitInfluence.GetUnitsAt(a))
foreach (Actor actor in Game.world.UnitInfluence.GetUnitsAt(a))
{
if (actor == self) continue;

View File

@@ -32,10 +32,10 @@ namespace OpenRa.Traits
public bool Produce( Actor self, ActorInfo producee )
{
var location = CreationLocation( self, producee );
if( location == null || Game.UnitInfluence.GetUnitsAt( location.Value ).Any() )
if( location == null || Game.world.UnitInfluence.GetUnitsAt( location.Value ).Any() )
return false;
var newUnit = new Actor( producee.Name, location.Value, self.Owner );
var newUnit = Game.world.CreateActor( producee.Name, location.Value, self.Owner );
newUnit.traits.Get<Unit>().Facing = CreationFacing( self, newUnit ); ;
var rp = self.traits.GetOrDefault<RallyPoint>();
@@ -51,8 +51,6 @@ namespace OpenRa.Traits
newUnit.CenterLocation = self.CenterLocation
+ new float2(pi.SpawnOffset[0], pi.SpawnOffset[1]);
Game.world.Add( newUnit );
foreach (var t in self.traits.WithInterface<INotifyProduction>())
t.UnitProduced(self, newUnit);

View File

@@ -47,7 +47,7 @@ namespace OpenRa.Traits
if (doneBuilding) roof.Tick();
var b = self.GetBounds(false);
if (isOpen && !Game.UnitInfluence.GetUnitsAt(((1/24f) * self.CenterLocation).ToInt2()).Any())
if (isOpen && !Game.world.UnitInfluence.GetUnitsAt(((1/24f) * self.CenterLocation).ToInt2()).Any())
{
isOpen = false;
roof.PlayBackwardsThen(GetPrefix(self) + "build-top", () => roof.Play(GetPrefix(self) + "idle-top"));

View File

@@ -39,7 +39,7 @@ namespace OpenRa
if (ShowUnitDebug)
for (var j = 0; j < 128; j++)
for (var i = 0; i < 128; i++)
if (Game.UnitInfluence.GetUnitsAt(new int2(i, j)).Any())
if (Game.world.UnitInfluence.GetUnitsAt(new int2(i, j)).Any())
spriteRenderer.DrawSprite(unitDebug, Game.CellSize * new float2(i, j), 0);
}

View File

@@ -12,6 +12,9 @@ namespace OpenRa
List<IEffect> effects = new List<IEffect>();
List<Action<World>> frameEndActions = new List<Action<World>>();
public readonly BuildingInfluenceMap BuildingInfluence;
public readonly UnitInfluenceMap UnitInfluence;
public readonly Map Map;
public readonly TileSet TileSet;
@@ -20,6 +23,18 @@ namespace OpenRa
Map = new Map( Rules.AllRules );
FileSystem.MountTemporary( new Package( Map.Theater + ".mix" ) );
TileSet = new TileSet( Map.TileSuffix );
BuildingInfluence = new BuildingInfluenceMap();
UnitInfluence = new UnitInfluenceMap();
CreateActor("World", new int2(int.MaxValue, int.MaxValue), null);
}
public Actor CreateActor( string name, int2 location, Player owner )
{
var a = new Actor( name, location, owner );
Add( a );
return a;
}
public void Add(Actor a)

View File

@@ -21,7 +21,7 @@ namespace OpenRa.Mods.RA
public Mine(Actor self)
{
this.self = self;
Game.UnitInfluence.Add(self, this);
Game.world.UnitInfluence.Add(self, this);
}
public void OnCrush(Actor crusher)

View File

@@ -17,7 +17,7 @@ namespace OpenRa.Mods.RA
return null;
// Ensure that the cell is empty except for the minelayer
if (Game.UnitInfluence.GetUnitsAt(xy).Any(a => a != self))
if (Game.world.UnitInfluence.GetUnitsAt(xy).Any(a => a != self))
return null;
if (mi.Button == MouseButton.Right && underCursor == self)
@@ -37,7 +37,7 @@ namespace OpenRa.Mods.RA
// todo: delay a bit? (req making deploy-mine an activity)
Game.world.AddFrameEndTask(
w => w.Add(new Actor(self.Info.Traits.Get<MinelayerInfo>().Mine, self.Location, self.Owner)));
w => w.CreateActor(self.Info.Traits.Get<MinelayerInfo>().Mine, self.Location, self.Owner));
}
}
}