Merge commit 'bob/worlds'

This commit is contained in:
Chris Forbes
2010-01-22 07:59:56 +13:00
101 changed files with 523 additions and 495 deletions

View File

@@ -14,7 +14,10 @@ namespace OpenRa
[Sync]
public readonly TypeDictionary traits = new TypeDictionary();
public readonly ActorInfo Info;
public readonly World World;
public readonly uint ActorID;
[Sync]
public int2 Location;
[Sync]
@@ -25,6 +28,7 @@ namespace OpenRa
public Actor( World world, string name, int2 location, Player owner )
{
World = world;
ActorID = world.NextAID();
Location = location;
CenterLocation = Traits.Util.CenterOfCell(Location);
@@ -82,14 +86,14 @@ namespace OpenRa
public Order Order( int2 xy, MouseInput mi )
{
if (Owner != Game.world.LocalPlayer)
if (Owner != World.LocalPlayer)
return null;
if (!Game.world.Map.IsInMap(xy.X, xy.Y))
if (!World.Map.IsInMap(xy.X, xy.Y))
return null;
var loc = mi.Location + Game.viewport.Location;
var underCursor = Game.world.FindUnits(loc, loc).FirstOrDefault();
var underCursor = World.FindUnits(loc, loc).FirstOrDefault();
if (underCursor != null && !underCursor.traits.Contains<Selectable>())
underCursor = null;
@@ -147,7 +151,7 @@ namespace OpenRa
attacker.Owner.Kills++;
if (RemoveOnDeath)
Game.world.AddFrameEndTask(w => w.Remove(this));
World.AddFrameEndTask(w => w.Remove(this));
}
var maxHP = this.GetMaxHP();

View File

@@ -144,14 +144,14 @@ namespace OpenRa
TickRadarAnimation();
}
public void Draw()
public void Draw( World world )
{
DrawDownloadBar();
chromeCollection = (Game.world.LocalPlayer.Race == Race.Allies) ? "chrome-allies" : "chrome-soviet";
radarCollection = (Game.world.LocalPlayer.Race == Race.Allies) ? "radar-allies" : "radar-soviet";
paletteCollection = (Game.world.LocalPlayer.Race == Race.Allies) ? "palette-allies" : "palette-soviet";
digitCollection = (Game.world.LocalPlayer.Race == Race.Allies) ? "digits-allies" : "digits-soviet";
chromeCollection = (world.LocalPlayer.Race == Race.Allies) ? "chrome-allies" : "chrome-soviet";
radarCollection = (world.LocalPlayer.Race == Race.Allies) ? "radar-allies" : "radar-soviet";
paletteCollection = (world.LocalPlayer.Race == Race.Allies) ? "palette-allies" : "palette-soviet";
digitCollection = (world.LocalPlayer.Race == Race.Allies) ? "digits-allies" : "digits-soviet";
buttons.Clear();
@@ -164,18 +164,18 @@ namespace OpenRa
new int2(140, 15), Color.White);
if (Game.Settings.PerfGraph)
PerfHistory.Render(renderer, Game.world.WorldRenderer.lineRenderer);
PerfHistory.Render(renderer, world.WorldRenderer.lineRenderer);
DrawRadar();
DrawPower();
DrawRadar( world );
DrawPower( world );
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, chromeCollection, "moneybin"), new float2(Game.viewport.Width - 320, 0), PaletteType.Chrome);
DrawMoney();
DrawMoney( world );
rgbaRenderer.Flush();
DrawButtons();
DrawButtons( world );
int paletteHeight = DrawBuildPalette(currentTab);
DrawSupportPowers();
DrawBuildTabs(paletteHeight);
int paletteHeight = DrawBuildPalette(world, currentTab);
DrawSupportPowers( world );
DrawBuildTabs(world, paletteHeight);
DrawChat();
DrawOptionsMenu();
}
@@ -222,7 +222,7 @@ namespace OpenRa
AddButton(r, _ => { });
}
public void DrawLobby()
public void DrawLobby( World world )
{
DrawDownloadBar();
@@ -238,8 +238,8 @@ namespace OpenRa
DrawDialogBackground(new Rectangle(r.Right - 330, r.Top + 40, 310, r.Bottom - 273 - r.Top - 40),
panelSprites, false);
Game.world.Minimap.Update();
Game.world.Minimap.Draw(new Rectangle(r.Right - 325, r.Top + 45, 300, 277), true);
world.Minimap.Update();
world.Minimap.Draw(new Rectangle(r.Right - 325, r.Top + 45, 300, 277), true);
renderer.DrawText2("Name", new int2(r.Left + 30, r.Top + 50), Color.White);
renderer.DrawText2("Color", new int2(r.Left + 230, r.Top + 50), Color.White);
@@ -303,9 +303,9 @@ namespace OpenRa
}
}
void DrawRadar()
void DrawRadar( World world )
{
var hasNewRadar = Game.world.Actors.Any(a => a.Owner == Game.world.LocalPlayer
var hasNewRadar = world.Actors.Any(a => a.Owner == world.LocalPlayer
&& a.traits.Contains<ProvidesRadar>()
&& a.traits.Get<ProvidesRadar>().IsActive(a));
@@ -328,36 +328,36 @@ namespace OpenRa
if (radarAnimationFrame >= radarSlideAnimationLength)
{
RectangleF mapRect = new RectangleF(radarOrigin.X + 9, radarOrigin.Y+(192-radarMinimapHeight)/2, 192, radarMinimapHeight);
Game.world.Minimap.Draw(mapRect, false);
world.Minimap.Draw(mapRect, false);
}
}
void AddButton(RectangleF r, Action<bool> b) { buttons.Add(Pair.New(r, b)); }
void DrawBuildTabs(int paletteHeight)
void DrawBuildTabs( World world, int paletteHeight)
{
const int tabWidth = 24;
const int tabHeight = 40;
var x = paletteOrigin.X - tabWidth;
var y = paletteOrigin.Y + 9;
if (currentTab == null || !Rules.TechTree.BuildableItems(Game.world.LocalPlayer, currentTab).Any())
ChooseAvailableTab();
if (currentTab == null || !Rules.TechTree.BuildableItems(world.LocalPlayer, currentTab).Any())
ChooseAvailableTab( world );
var queue = Game.world.LocalPlayer.PlayerActor.traits.Get<Traits.ProductionQueue>();
var queue = world.LocalPlayer.PlayerActor.traits.Get<Traits.ProductionQueue>();
foreach (var q in tabImageNames)
{
var groupName = q.Key;
if (!Rules.TechTree.BuildableItems(Game.world.LocalPlayer, groupName).Any())
if (!Rules.TechTree.BuildableItems(world.LocalPlayer, groupName).Any())
{
CheckDeadTab(groupName);
CheckDeadTab( world, groupName );
continue;
}
string[] tabKeys = { "normal", "ready", "selected" };
var producing = queue.CurrentItem(groupName);
var index = q.Key == currentTab ? 2 : (producing != null && producing.Done) ? 1 : 0;
var race = (Game.world.LocalPlayer.Race == Race.Allies) ? "allies" : "soviet";
var race = (world.LocalPlayer.Race == Race.Allies) ? "allies" : "soviet";
rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer,"tabs-"+tabKeys[index], race+"-"+q.Key), new float2(x, y), PaletteType.Chrome);
buttons.Add(Pair.New(new RectangleF(x, y, tabWidth, tabHeight),
@@ -378,22 +378,22 @@ namespace OpenRa
paletteAnimating = true;
}
void CheckDeadTab( string groupName )
void CheckDeadTab( World world, string groupName )
{
var queue = Game.world.LocalPlayer.PlayerActor.traits.Get<Traits.ProductionQueue>();
var queue = world.LocalPlayer.PlayerActor.traits.Get<Traits.ProductionQueue>();
foreach( var item in queue.AllItems( groupName ) )
Game.controller.AddOrder(Order.CancelProduction(Game.world.LocalPlayer, item.Item));
Game.controller.AddOrder(Order.CancelProduction(world.LocalPlayer, item.Item));
}
void ChooseAvailableTab()
void ChooseAvailableTab( World world )
{
currentTab = tabImageNames.Select(q => q.Key).FirstOrDefault(
t => Rules.TechTree.BuildableItems(Game.world.LocalPlayer, t).Any());
t => Rules.TechTree.BuildableItems(world.LocalPlayer, t).Any());
}
void DrawMoney()
void DrawMoney( World world )
{
var moneyDigits = Game.world.LocalPlayer.DisplayCash.ToString();
var moneyDigits = world.LocalPlayer.DisplayCash.ToString();
var x = Game.viewport.Width - 65;
foreach (var d in moneyDigits.Reverse())
{
@@ -405,10 +405,10 @@ namespace OpenRa
float? lastPowerProvidedPos;
float? lastPowerDrainedPos;
void DrawPower()
void DrawPower( World world )
{
// Nothing to draw
if (Game.world.LocalPlayer.PowerProvided == 0 && Game.world.LocalPlayer.PowerDrained == 0)
if (world.LocalPlayer.PowerProvided == 0 && world.LocalPlayer.PowerDrained == 0)
return;
// Draw bar horizontally
@@ -416,18 +416,18 @@ namespace OpenRa
var barEnd = barStart + new float2(powerSize.Width, 0);
float powerScaleBy = 100;
var maxPower = Math.Max(Game.world.LocalPlayer.PowerProvided, Game.world.LocalPlayer.PowerDrained);
var maxPower = Math.Max(world.LocalPlayer.PowerProvided, world.LocalPlayer.PowerDrained);
while (maxPower >= powerScaleBy) powerScaleBy *= 2;
// Current power supply
var powerLevelTemp = barStart.X + (barEnd.X - barStart.X) * (Game.world.LocalPlayer.PowerProvided / powerScaleBy);
var powerLevelTemp = barStart.X + (barEnd.X - barStart.X) * (world.LocalPlayer.PowerProvided / powerScaleBy);
lastPowerProvidedPos = float2.Lerp(lastPowerProvidedPos.GetValueOrDefault(powerLevelTemp), powerLevelTemp, .3f);
float2 powerLevel = new float2(lastPowerProvidedPos.Value, barStart.Y);
var color = Color.LimeGreen;
if (Game.world.LocalPlayer.GetPowerState() == PowerState.Low)
if (world.LocalPlayer.GetPowerState() == PowerState.Low)
color = Color.Orange;
if (Game.world.LocalPlayer.GetPowerState() == PowerState.Critical)
if (world.LocalPlayer.GetPowerState() == PowerState.Critical)
color = Color.Red;
var colorDark = Graphics.Util.Lerp(0.25f, color, Color.Black);
@@ -448,7 +448,7 @@ namespace OpenRa
// Power usage indicator
var indicator = ChromeProvider.GetImage(renderer, radarCollection, "power-indicator");
var powerDrainedTemp = barStart.X + (barEnd.X - barStart.X) * (Game.world.LocalPlayer.PowerDrained / powerScaleBy);
var powerDrainedTemp = barStart.X + (barEnd.X - barStart.X) * (world.LocalPlayer.PowerDrained / powerScaleBy);
lastPowerDrainedPos = float2.Lerp(lastPowerDrainedPos.GetValueOrDefault(powerDrainedTemp), powerDrainedTemp, .3f);
float2 powerDrainLevel = new float2(lastPowerDrainedPos.Value-indicator.size.X/2, barStart.Y-1);
@@ -456,14 +456,14 @@ namespace OpenRa
rgbaRenderer.Flush();
}
void DrawButtons()
void DrawButtons( World world )
{
int2 buttonOrigin = new int2(Game.viewport.Width - 320, 2);
// Repair
Rectangle repairRect = new Rectangle(buttonOrigin.X, buttonOrigin.Y, repairButton.Image.bounds.Width, repairButton.Image.bounds.Height);
var repairDrawPos = new float2(repairRect.Location);
var hasFact = Game.world.Actors.Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains<ConstructionYard>());
var hasFact = world.Actors.Any(a => a.Owner == world.LocalPlayer && a.traits.Contains<ConstructionYard>());
if (Game.Settings.RepairRequiresConyard && !hasFact)
repairButton.ReplaceAnim("disabled");
@@ -630,7 +630,7 @@ namespace OpenRa
// Return an int telling us the y coordinate at the bottom of the palette
int DrawBuildPalette(string queueName)
int DrawBuildPalette( World world, string queueName )
{
// Hack
int columns = paletteColumns;
@@ -641,14 +641,14 @@ namespace OpenRa
var x = 0;
var y = 0;
var buildableItems = Rules.TechTree.BuildableItems(Game.world.LocalPlayer, queueName).ToArray();
var buildableItems = Rules.TechTree.BuildableItems(world.LocalPlayer, queueName).ToArray();
var allBuildables = Rules.TechTree.AllBuildables(Game.world.LocalPlayer, queueName)
var allBuildables = Rules.TechTree.AllBuildables(world.LocalPlayer, queueName)
.Where(a => a.Traits.Contains<BuildableInfo>())
.Where(a => a.Traits.Get<BuildableInfo>().Owner.Contains(Game.world.LocalPlayer.Race))
.Where(a => a.Traits.Get<BuildableInfo>().Owner.Contains(world.LocalPlayer.Race))
.OrderBy(a => a.Traits.Get<BuildableInfo>().TechLevel);
var queue = Game.world.LocalPlayer.PlayerActor.traits.Get<Traits.ProductionQueue>();
var queue = world.LocalPlayer.PlayerActor.traits.Get<Traits.ProductionQueue>();
var overlayBits = new List<Pair<Sprite, float2>>();
@@ -722,7 +722,7 @@ namespace OpenRa
var closureItemName = item.Name;
AddButton(rect, buildableItems.Contains(item.Name)
? isLmb => HandleBuildPalette(closureItemName, isLmb)
? isLmb => HandleBuildPalette(world, closureItemName, isLmb)
: (Action<bool>)(_ => Sound.Play("briefing.aud")));
if (++x == columns) { x = 0; y++; }
@@ -751,21 +751,21 @@ namespace OpenRa
rgbaRenderer.Flush();
if (tooltipItem != null)
DrawProductionTooltip(tooltipItem, new float2(Game.viewport.Width, origin.Y + y * 48 + 9).ToInt2()/*tooltipPos*/);
DrawProductionTooltip(world, tooltipItem, new float2(Game.viewport.Width, origin.Y + y * 48 + 9).ToInt2()/*tooltipPos*/);
return y*48+9;
}
void StartProduction( string item )
void StartProduction( World world, string item )
{
var unit = Rules.Info[item];
Sound.Play(unit.Traits.Contains<BuildingInfo>() ? "abldgin1.aud" : "train1.aud");
Game.controller.AddOrder(Order.StartProduction(Game.world.LocalPlayer, item));
Game.controller.AddOrder(Order.StartProduction(world.LocalPlayer, item));
}
void HandleBuildPalette(string item, bool isLmb)
void HandleBuildPalette( World world, string item, bool isLmb )
{
var player = Game.world.LocalPlayer;
var player = world.LocalPlayer;
var unit = Rules.Info[item];
var queue = player.PlayerActor.traits.Get<Traits.ProductionQueue>();
var producing = queue.AllItems(unit.Category).FirstOrDefault( a => a.Item == item );
@@ -790,7 +790,7 @@ namespace OpenRa
}
}
StartProduction(item);
StartProduction(world, item);
}
else
{
@@ -812,7 +812,7 @@ namespace OpenRa
}
int2 lastMousePos;
public bool HandleInput(MouseInput mi)
public bool HandleInput(World world, MouseInput mi)
{
if (mi.Event == MouseInputEvent.Move)
lastMousePos = mi.Location;
@@ -844,7 +844,7 @@ namespace OpenRa
renderer.DrawText2(text, pos - new int2(renderer.MeasureText2(text).X/2, 0), c);
}
void DrawProductionTooltip(string unit, int2 pos)
void DrawProductionTooltip(World world, string unit, int2 pos)
{
var tooltipSprite = ChromeProvider.GetImage(renderer, chromeCollection, "tooltip-bg");
var p = pos.ToFloat2() - new float2(tooltipSprite.size.X, 0);
@@ -857,18 +857,18 @@ namespace OpenRa
renderer.DrawText2(buildable.Description, p.ToInt2() + new int2(5,5), Color.White);
DrawRightAligned( "${0}".F(buildable.Cost), pos + new int2(-5,5),
Game.world.LocalPlayer.Cash + Game.world.LocalPlayer.Ore >= buildable.Cost ? Color.White : Color.Red);
world.LocalPlayer.Cash + world.LocalPlayer.Ore >= buildable.Cost ? Color.White : Color.Red);
var bi = info.Traits.GetOrDefault<BuildingInfo>();
if (bi != null)
DrawRightAligned("ϟ{0}".F(bi.Power), pos + new int2(-5, 20),
Game.world.LocalPlayer.PowerProvided - Game.world.LocalPlayer.PowerDrained + bi.Power >= 0
world.LocalPlayer.PowerProvided - world.LocalPlayer.PowerDrained + bi.Power >= 0
? Color.White : Color.Red);
var buildings = Rules.TechTree.GatherBuildings( Game.world.LocalPlayer );
var buildings = Rules.TechTree.GatherBuildings( world.LocalPlayer );
p += new int2(5, 5);
p += new int2(0, 15);
if (!Rules.TechTree.CanBuild(info, Game.world.LocalPlayer, buildings))
if (!Rules.TechTree.CanBuild(info, world.LocalPlayer, buildings))
{
var prereqs = buildable.Prerequisites
.Select( a => Description( a ) );
@@ -891,9 +891,9 @@ namespace OpenRa
return Rules.Info[ a.ToLowerInvariant() ].Traits.Get<BuildableInfo>().Description;
}
void DrawSupportPowers()
void DrawSupportPowers( World world )
{
var numPowers = Game.world.LocalPlayer.SupportPowers.Values
var numPowers = world.LocalPlayer.SupportPowers.Values
.Where(a => a.IsAvailable).Count();
if (numPowers == 0) return;
@@ -910,7 +910,7 @@ namespace OpenRa
string tooltipItem = null;
int2 tooltipPos = int2.Zero;
foreach (var sp in Game.world.LocalPlayer.SupportPowers)
foreach (var sp in world.LocalPlayer.SupportPowers)
{
var image = spsprites[sp.Key];
if (sp.Value.IsAvailable)
@@ -949,7 +949,7 @@ namespace OpenRa
shpRenderer.Flush();
if (tooltipItem != null)
DrawSupportPowerTooltip(tooltipItem, tooltipPos);
DrawSupportPowerTooltip(world, tooltipItem, tooltipPos);
}
Action<bool> HandleSupportPower(SupportPower sp)
@@ -965,7 +965,7 @@ namespace OpenRa
return "{0:D2}:{1:D2}".F(minutes, seconds % 60);
}
void DrawSupportPowerTooltip(string sp, int2 pos)
void DrawSupportPowerTooltip(World world, string sp, int2 pos)
{
var tooltipSprite = ChromeProvider.GetImage(renderer, chromeCollection, "tooltip-bg");
rgbaRenderer.DrawSprite(tooltipSprite, pos, PaletteType.Chrome);
@@ -977,7 +977,7 @@ namespace OpenRa
renderer.DrawText2(info.Description, pos, Color.White);
var timer = "Charge Time: {0}".F(FormatTime(Game.world.LocalPlayer.SupportPowers[sp].RemainingTime));
var timer = "Charge Time: {0}".F(FormatTime(world.LocalPlayer.SupportPowers[sp].RemainingTime));
DrawRightAligned(timer, pos + new int2((int)tooltipSprite.size.X - 10, 0), Color.White);
if (info.LongDesc != null)

View File

@@ -13,25 +13,27 @@ namespace OpenRa
public static void DoImpact(int2 loc, int2 visualLoc,
WeaponInfo weapon, ProjectileInfo projectile, WarheadInfo warhead, Actor firedBy)
{
var world = firedBy.World;
var targetTile = ((1f / Game.CellSize) * loc.ToFloat2()).ToInt2();
var isWater = Game.world.IsWater(targetTile);
var hitWater = Game.world.IsCellBuildable(targetTile, UnitMovementType.Float);
var isWater = world.IsWater(targetTile);
var hitWater = world.IsCellBuildable(targetTile, UnitMovementType.Float);
if (warhead.Explosion != 0)
Game.world.AddFrameEndTask(
w => w.Add(new Explosion(visualLoc, warhead.Explosion, hitWater)));
world.AddFrameEndTask(
w => w.Add(new Explosion(w, visualLoc, warhead.Explosion, hitWater)));
var impactSound = warhead.ImpactSound;
if (hitWater && warhead.WaterImpactSound != null)
impactSound = warhead.WaterImpactSound;
if (impactSound != null) Sound.Play(impactSound + ".aud");
if (!isWater) Smudge.AddSmudge(targetTile, warhead);
if (warhead.Ore) Game.world.Map.DestroyOre(targetTile.X, targetTile.Y);
if (!isWater) world.Map.AddSmudge(targetTile, warhead);
if (warhead.Ore) world.Map.DestroyOre(targetTile.X, targetTile.Y);
var maxSpread = GetMaximumSpread(weapon, warhead);
var hitActors = Game.world.FindUnitsInCircle(loc, maxSpread);
var hitActors = world.FindUnitsInCircle(loc, maxSpread);
foreach (var victim in hitActors)
victim.InflictDamage(firedBy, (int)GetDamageToInflict(victim, loc, weapon, warhead), warhead);

View File

@@ -43,15 +43,15 @@ namespace OpenRa
List<Order> recentOrders = new List<Order>();
void ApplyOrders(float2 xy, MouseInput mi)
void ApplyOrders(World world, float2 xy, MouseInput mi)
{
if (orderGenerator == null) return;
var orders = orderGenerator.Order(xy.ToInt2(), mi).ToArray();
var orders = orderGenerator.Order(world, xy.ToInt2(), mi).ToArray();
recentOrders.AddRange( orders );
var voicedActor = orders.Select(o => o.Subject)
.FirstOrDefault(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains<Unit>());
.FirstOrDefault(a => a.Owner == world.LocalPlayer && a.traits.Contains<Unit>());
var isMove = orders.Any(o => o.OrderString == "Move");
var isAttack = orders.Any( o => o.OrderString == "Attack" );
@@ -61,7 +61,7 @@ namespace OpenRa
Sound.PlayVoice(isAttack ? "Attack" : "Move", voicedActor);
if (isMove)
Game.world.Add(new Effects.MoveFlash(Game.CellSize * xy));
world.Add(new Effects.MoveFlash(world, Game.CellSize * xy));
}
}
@@ -76,7 +76,7 @@ namespace OpenRa
}
float2 dragStart, dragEnd;
public bool HandleInput(MouseInput mi)
public bool HandleInput(World world, MouseInput mi)
{
var xy = Game.viewport.ViewToWorld(mi);
@@ -84,7 +84,7 @@ namespace OpenRa
{
if (!(orderGenerator is PlaceBuildingOrderGenerator))
dragStart = dragEnd = xy;
ApplyOrders(xy, mi);
ApplyOrders(world, xy, mi);
}
if (mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Move)
@@ -94,8 +94,8 @@ namespace OpenRa
{
if (orderGenerator is UnitOrderGenerator)
{
var newSelection = Game.world.SelectActorsInBox(Game.CellSize * dragStart, Game.CellSize * xy);
CombineSelection(newSelection, mi.Modifiers.HasModifier(Modifiers.Shift), dragStart == xy);
var newSelection = world.SelectActorsInBox(Game.CellSize * dragStart, Game.CellSize * xy);
CombineSelection(world, newSelection, mi.Modifiers.HasModifier(Modifiers.Shift), dragStart == xy);
}
dragStart = dragEnd = xy;
@@ -105,12 +105,12 @@ namespace OpenRa
dragStart = dragEnd = xy;
if (mi.Button == MouseButton.Right && mi.Event == MouseInputEvent.Down)
ApplyOrders(xy, mi);
ApplyOrders(world, xy, mi);
return true;
}
void CombineSelection(IEnumerable<Actor> newSelection, bool isCombine, bool isClick)
void CombineSelection(World world, IEnumerable<Actor> newSelection, bool isCombine, bool isClick)
{
var oldSelection = (orderGenerator is UnitOrderGenerator)
? (orderGenerator as UnitOrderGenerator).selection : new Actor[] { }.AsEnumerable();
@@ -127,7 +127,7 @@ namespace OpenRa
var voicedUnit = ((UnitOrderGenerator)orderGenerator).selection
.Where(a => a.traits.Contains<Unit>()
&& a.Owner == Game.world.LocalPlayer)
&& a.Owner == world.LocalPlayer)
.FirstOrDefault();
Sound.PlayVoice("Select", voicedUnit);
@@ -144,9 +144,9 @@ namespace OpenRa
public float2 MousePosition { get { return dragEnd; } }
public Cursor ChooseCursor()
public Cursor ChooseCursor( World world )
{
int sync = Game.world.SyncHash();
int sync = world.SyncHash();
try
{
@@ -157,18 +157,18 @@ namespace OpenRa
Modifiers = GetModifierKeys(),
};
return orderGenerator.GetCursor( MousePosition.ToInt2(), mi );
return orderGenerator.GetCursor( world, MousePosition.ToInt2(), mi );
}
finally
{
if( sync != Game.world.SyncHash() )
if( sync != world.SyncHash() )
throw new InvalidOperationException( "Desync in Controller.ChooseCursor" );
}
}
Cache<int, List<Actor>> controlGroups = new Cache<int, List<Actor>>(_ => new List<Actor>());
public void DoControlGroup(int group, Modifiers mods)
public void DoControlGroup(World world, int group, Modifiers mods)
{
var uog = orderGenerator as UnitOrderGenerator;
if (uog == null) return;
@@ -193,7 +193,7 @@ namespace OpenRa
return;
}
CombineSelection(controlGroups[group], mods.HasModifier(Modifiers.Shift), false);
CombineSelection(world, controlGroups[group], mods.HasModifier(Modifiers.Shift), false);
}
public int? GetControlGroupForActor(Actor a)

View File

@@ -56,13 +56,13 @@ namespace OpenRa.Effects
int TotalTime() { return (Dest - Src).Length * BaseBulletSpeed / Weapon.Speed; }
public void Tick()
public void Tick( World world )
{
t += 40;
if (t > TotalTime()) /* remove finished bullets */
{
Game.world.AddFrameEndTask(w => w.Remove(this));
world.AddFrameEndTask(w => w.Remove(this));
Combat.DoImpact(Dest, VisualDest - new int2( 0, DestAltitude ),
Weapon, Projectile, Warhead, FiredBy);
}

View File

@@ -15,13 +15,13 @@ namespace OpenRa.Effects
{
anim = new Animation(fromActor.traits.GetOrDefault<RenderSimple>().GetImage(fromActor));
anim.PlayThen("die{0}".F(death + 1),
() => Game.world.AddFrameEndTask(w => w.Remove(this)));
() => fromActor.World.AddFrameEndTask(w => w.Remove(this)));
pos = fromActor.CenterLocation;
owner = fromActor.Owner;
}
public void Tick() { anim.Tick(); }
public void Tick( World world ) { anim.Tick(); }
public IEnumerable<Renderable> Render()
{

View File

@@ -15,10 +15,10 @@ namespace OpenRa.Effects
this.delay = delay;
}
public void Tick()
public void Tick( World world )
{
if (--delay <= 0)
Game.world.AddFrameEndTask(w => { w.Remove(this); a(); });
world.AddFrameEndTask(w => { w.Remove(this); a(); });
}
public IEnumerable<Renderable> Render() { yield break; }

View File

@@ -9,16 +9,16 @@ namespace OpenRa.Effects
Animation anim;
int2 pos;
public Explosion(int2 pixelPos, int style, bool isWater)
public Explosion( World world, int2 pixelPos, int style, bool isWater)
{
this.pos = pixelPos;
var variantSuffix = isWater ? "w" : "";
anim = new Animation("explosion");
anim.PlayThen(style.ToString() + variantSuffix,
() => Game.world.AddFrameEndTask(w => w.Remove(this)));
() => world.AddFrameEndTask(w => w.Remove(this)));
}
public void Tick() { anim.Tick(); }
public void Tick( World world ) { anim.Tick(); }
public IEnumerable<Renderable> Render()
{

View File

@@ -15,14 +15,14 @@ namespace OpenRa.Effects
public FlashTarget(Actor target)
{
this.target = target;
foreach (var e in Game.world.Effects.OfType<FlashTarget>().Where(a => a.target == target).ToArray())
Game.world.Remove(e);
foreach (var e in target.World.Effects.OfType<FlashTarget>().Where(a => a.target == target).ToArray())
target.World.Remove(e);
}
public void Tick()
public void Tick( World world )
{
if (--remainingTicks == 0)
Game.world.AddFrameEndTask(w => w.Remove(this));
world.AddFrameEndTask(w => w.Remove(this));
}
public IEnumerable<Renderable> Render()

View File

@@ -16,13 +16,13 @@ namespace OpenRa.Effects
anim.PlayRepeating("idle");
}
public void Tick()
public void Tick( World world )
{
anim.Tick();
offset.Y -= heightPerTick;
if (offset.Y < 0)
Game.world.AddFrameEndTask(w => w.Remove(this));
world.AddFrameEndTask(w => w.Remove(this));
}
public IEnumerable<Renderable> Render()

View File

@@ -6,7 +6,7 @@ namespace OpenRa.Effects
{
public interface IEffect
{
void Tick();
void Tick( World world );
IEnumerable<Renderable> Render();
}
}

View File

@@ -15,10 +15,10 @@ namespace OpenRa.Effects
this.b = a.traits.Get<IronCurtainable>();
}
public void Tick()
public void Tick( World world )
{
if (a.IsDead || b.GetDamageModifier() > 0)
Game.world.AddFrameEndTask(w => w.Remove(this));
world.AddFrameEndTask(w => w.Remove(this));
}
public IEnumerable<Renderable> Render()

View File

@@ -47,7 +47,7 @@ namespace OpenRa.Effects
const int MissileCloseEnough = 7;
const float Scale = .2f;
public void Tick()
public void Tick( World world )
{
t += 40;
@@ -64,7 +64,7 @@ namespace OpenRa.Effects
var dist = Target.CenterLocation - Pos;
if (dist.LengthSquared < MissileCloseEnough * MissileCloseEnough || Target.IsDead)
{
Game.world.AddFrameEndTask(w => w.Remove(this));
world.AddFrameEndTask(w => w.Remove(this));
if (t > Projectile.Arm * 40) /* don't blow up in our launcher's face! */
Combat.DoImpact(Pos.ToInt2(), Pos.ToInt2(), Weapon, Projectile, Warhead, FiredBy);
@@ -78,7 +78,7 @@ namespace OpenRa.Effects
Pos += move;
if (Projectile.Animates)
Game.world.AddFrameEndTask(w => w.Add(new Smoke((Pos - 1.5f * move - new int2( 0, Altitude )).ToInt2())));
world.AddFrameEndTask(w => w.Add(new Smoke(w, (Pos - 1.5f * move - new int2( 0, Altitude )).ToInt2())));
// todo: running out of fuel
}

View File

@@ -12,15 +12,15 @@ namespace OpenRa.Effects
Animation anim = new Animation("moveflsh");
float2 pos;
public MoveFlash( float2 pos )
public MoveFlash( World world, float2 pos )
{
this.pos = pos;
anim.PlayThen( "idle",
() => Game.world.AddFrameEndTask(
() => world.AddFrameEndTask(
w => w.Remove( this ) ) );
}
public void Tick() { anim.Tick(); }
public void Tick( World world ) { anim.Tick(); }
public IEnumerable<Renderable> Render()
{

View File

@@ -20,10 +20,10 @@ namespace OpenRa.Effects
anim.PlayRepeating("disabled");
}
public void Tick()
public void Tick( World world )
{
if (removeNextFrame == true)
Game.world.AddFrameEndTask(w => w.Remove(this));
world.AddFrameEndTask(w => w.Remove(this));
// Fix off-by one frame bug with undisabling causing low-power
if (!b.Disabled || a.IsDead)

View File

@@ -12,10 +12,10 @@ namespace OpenRa.Effects
public RepairIndicator(Actor a) { this.a = a; anim.PlayRepeating("repair"); }
public void Tick()
public void Tick( World world )
{
if (--framesLeft == 0 || a.IsDead)
Game.world.AddFrameEndTask(w => w.Remove(this));
world.AddFrameEndTask(w => w.Remove(this));
}
public IEnumerable<Renderable> Render()

View File

@@ -15,16 +15,16 @@ namespace OpenRa.Effects
{
this.a = a;
doors.PlayThen("active",
() => Game.world.AddFrameEndTask(w => w.Remove(this)));
() => a.World.AddFrameEndTask(w => w.Remove(this)));
}
public void Tick()
public void Tick( World world )
{
doors.Tick();
if (++frame == 19)
{
Game.world.AddFrameEndTask(w => w.Add(new GpsSatellite(a.CenterLocation - .5f * doors.Image.size + doorOffset)));
world.AddFrameEndTask(w => w.Add(new GpsSatellite(a.CenterLocation - .5f * doors.Image.size + doorOffset)));
}
}

View File

@@ -9,14 +9,14 @@ namespace OpenRa.Effects
readonly int2 pos;
readonly Animation anim = new Animation("smokey");
public Smoke(int2 pos)
public Smoke(World world, int2 pos)
{
this.pos = pos;
anim.PlayThen("idle",
() => Game.world.AddFrameEndTask(w => w.Remove(this)));
() => world.AddFrameEndTask(w => w.Remove(this)));
}
public void Tick()
public void Tick( World world )
{
anim.Tick();
}

View File

@@ -20,10 +20,10 @@ namespace OpenRa.Effects
this.tesla = SequenceProvider.GetSequence( "litning", "bright" );
}
public void Tick()
public void Tick( World world )
{
if( timeUntilRemove <= 0 )
Game.world.AddFrameEndTask( w => w.Remove( this ) );
world.AddFrameEndTask( w => w.Remove( this ) );
--timeUntilRemove;
}

View File

@@ -9,6 +9,7 @@ using OpenRa.Graphics;
using OpenRa.Orders;
using OpenRa.Support;
using OpenRa.Traits;
using System.Windows.Forms;
namespace OpenRa
{
@@ -28,7 +29,6 @@ namespace OpenRa
internal static Renderer renderer;
static int2 clientSize;
static HardwarePalette palette;
static string mapName;
internal static Session LobbyInfo = new Session();
static bool changePending;
@@ -57,8 +57,6 @@ namespace OpenRa
a.Owner.Shroud.Explore(a);
};
palette = new HardwarePalette(renderer, world.Map);
SequenceProvider.Initialize(manifest.Sequences);
viewport = new Viewport(clientSize, Game.world.Map.Offset, Game.world.Map.Offset + Game.world.Map.Size, renderer);
@@ -127,13 +125,13 @@ namespace OpenRa
lastTime += Settings.Timestep;
chrome.Tick();
orderManager.TickImmediate();
orderManager.TickImmediate( world );
if (orderManager.IsReadyForNextFrame)
{
orderManager.Tick();
orderManager.Tick( world );
if (controller.orderGenerator != null)
controller.orderGenerator.Tick();
controller.orderGenerator.Tick( world );
world.Tick();
}
@@ -147,26 +145,14 @@ namespace OpenRa
using (new PerfSample("render"))
{
UpdatePalette(world.Actors.SelectMany(
a => a.traits.WithInterface<IPaletteModifier>()));
++RenderFrame;
viewport.DrawRegions();
viewport.DrawRegions( world );
}
PerfHistory.items["render"].Tick();
PerfHistory.items["batches"].Tick();
}
static void UpdatePalette(IEnumerable<IPaletteModifier> paletteMods)
{
var b = new Bitmap(palette.Bitmap);
foreach (var mod in paletteMods)
mod.AdjustPalette(b);
palette.Texture.SetData(b);
renderer.PaletteTexture = palette.Texture;
}
public static Random SharedRandom = new Random(0); /* for things that require sync */
public static Random CosmeticRandom = new Random(); /* for things that are just fluff */
@@ -224,7 +210,7 @@ namespace OpenRa
world.CreateActor("mcv", sp, world.players[client.Index]);
}
Game.viewport.GoToStartLocation();
Game.viewport.GoToStartLocation( Game.world.LocalPlayer );
orderManager.StartGame();
}
@@ -246,5 +232,62 @@ namespace OpenRa
taken.Add(sp);
return sp;
}
internal static void DispatchMouseInput(MouseInputEvent ev, MouseEventArgs e, Keys ModifierKeys)
{
int sync = Game.world.SyncHash();
Game.viewport.DispatchMouseInput( world,
new MouseInput
{
Button = (MouseButton)(int)e.Button,
Event = ev,
Location = new int2(e.Location),
Modifiers = (Modifiers)(int)ModifierKeys,
});
if( sync != Game.world.SyncHash() )
throw new InvalidOperationException( "Desync in DispatchMouseInput" );
}
internal static void HandleKeyDown( KeyEventArgs e )
{
int sync = Game.world.SyncHash();
/* hack hack hack */
if( e.KeyCode == Keys.F8 && !Game.orderManager.GameStarted )
{
Game.controller.AddOrder(
new Order( "ToggleReady", Game.world.LocalPlayer.PlayerActor, null, int2.Zero, "" ) { IsImmediate = true } );
}
/* temporary hack: DO NOT LEAVE IN */
if( e.KeyCode == Keys.F2 )
Game.world.LocalPlayer = Game.world.players[ ( Game.world.LocalPlayer.Index + 1 ) % 4 ];
if( e.KeyCode == Keys.F3 )
Game.controller.orderGenerator = new SellOrderGenerator();
if( e.KeyCode == Keys.F4 )
Game.controller.orderGenerator = new RepairOrderGenerator();
if( !Game.chat.isChatting )
if( e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9 )
Game.controller.DoControlGroup( world, (int)e.KeyCode - (int)Keys.D0, (Modifiers)(int)e.Modifiers );
if( sync != Game.world.SyncHash() )
throw new InvalidOperationException( "Desync in OnKeyDown" );
}
internal static void HandleKeyPress( KeyPressEventArgs e )
{
int sync = Game.world.SyncHash();
if( e.KeyChar == '\r' )
Game.chat.Toggle();
else if( Game.chat.isChatting )
Game.chat.TypeChar( e.KeyChar );
if( sync != Game.world.SyncHash() )
throw new InvalidOperationException( "Desync in OnKeyPress" );
}
}
}

View File

@@ -23,7 +23,7 @@ namespace OpenRa.GameRules
public Cache<string, List<Actor>> GatherBuildings( Player player )
{
var ret = new Cache<string, List<Actor>>( x => new List<Actor>() );
foreach( var b in Game.world.Actors.Where( x => x.Owner == player && x.Info.Traits.Contains<BuildingInfo>() ) )
foreach( var b in player.World.Actors.Where( x => x.Owner == player && x.Info.Traits.Contains<BuildingInfo>() ) )
{
ret[ b.Info.Name ].Add( b );
var buildable = b.Info.Traits.GetOrDefault<BuildableInfo>();

View File

@@ -1,5 +1,7 @@
using System.Collections.Generic;
using System.Drawing;
using OpenRa.FileFormats;
using OpenRa.Traits;
namespace OpenRa.Graphics
{
@@ -38,5 +40,15 @@ namespace OpenRa.Graphics
return allocated++;
}
public void Update(IEnumerable<IPaletteModifier> paletteMods)
{
var b = new Bitmap(Bitmap);
foreach (var mod in paletteMods)
mod.AdjustPalette(b);
Texture.SetData(b);
Game.renderer.PaletteTexture = Texture;
}
}
}

View File

@@ -81,7 +81,7 @@ namespace OpenRa.Graphics
mapOnlySheet.Texture.SetData(oreLayer);
if (!world.Actors.Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains<ProvidesRadar>()))
if (!world.Actors.Any(a => a.Owner == world.LocalPlayer && a.traits.Contains<ProvidesRadar>()))
return;
var bitmap = new Bitmap(oreLayer);
@@ -109,7 +109,7 @@ namespace OpenRa.Graphics
{
for (var y = 0; y < 128; y++)
for (var x = 0; x < 128; x++)
if (!Game.world.LocalPlayer.Shroud.DisplayOnRadar(x, y))
if (!world.LocalPlayer.Shroud.DisplayOnRadar(x, y))
*(c + (y * bitmapData.Stride >> 2) + x) = shroudColor.ToArgb();
}
}

View File

@@ -8,7 +8,7 @@ namespace OpenRa.Graphics
{
interface IHandleInput
{
bool HandleInput(MouseInput mi);
bool HandleInput(World world, MouseInput mi);
}
class Viewport
@@ -42,8 +42,11 @@ namespace OpenRa.Graphics
this.scrollPosition = Game.CellSize* mapStart;
}
public void DrawRegions()
public void DrawRegions( World world )
{
world.WorldRenderer.palette.Update(world.Actors.SelectMany(
a => a.traits.WithInterface<IPaletteModifier>()));
float2 r1 = new float2(2, -2) / screenSize;
float2 r2 = new float2(-1, 1);
@@ -51,8 +54,8 @@ namespace OpenRa.Graphics
if( Game.orderManager.GameStarted )
{
Game.world.WorldRenderer.Draw();
Game.chrome.Draw();
world.WorldRenderer.Draw();
Game.chrome.Draw( world );
if (Game.orderManager.IsNetplay &&
Game.orderManager.Sources.OfType<NetworkOrderSource>().First().State == ConnectionState.NotConnected)
@@ -74,15 +77,15 @@ namespace OpenRa.Graphics
Game.chrome.DrawDialog("Connection failed.");
break;
case ConnectionState.Connected:
Game.chrome.DrawLobby();
Game.chrome.DrawLobby( world );
break;
}
}
else
Game.chrome.DrawLobby();
Game.chrome.DrawLobby( world );
}
var c = Game.chrome.HitTest(mousePos) ? Cursor.Default : Game.controller.ChooseCursor();
var c = Game.chrome.HitTest(mousePos) ? Cursor.Default : Game.controller.ChooseCursor( world );
cursorRenderer.DrawSprite(c.GetSprite((int)cursorFrame), mousePos + Location - c.GetHotspot(), 0);
cursorRenderer.Flush();
@@ -95,18 +98,18 @@ namespace OpenRa.Graphics
}
IHandleInput dragRegion = null;
public void DispatchMouseInput(MouseInput mi)
public void DispatchMouseInput(World world, MouseInput mi)
{
if (mi.Event == MouseInputEvent.Move)
mousePos = mi.Location;
if (dragRegion != null) {
dragRegion.HandleInput( mi );
dragRegion.HandleInput( world, mi );
if (mi.Event == MouseInputEvent.Up) dragRegion = null;
return;
}
dragRegion = regions.FirstOrDefault(r => r.HandleInput(mi));
dragRegion = regions.FirstOrDefault(r => r.HandleInput(world, mi));
if (mi.Event != MouseInputEvent.Down)
dragRegion = null;
}
@@ -127,9 +130,9 @@ namespace OpenRa.Graphics
scrollPosition = (avgPos - .5f * new float2(Width, Height)).ToInt2();
}
public void GoToStartLocation()
public void GoToStartLocation( Player player )
{
Center(Game.world.Actors.Where(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains<Selectable>()));
Center(player.World.Actors.Where(a => a.Owner == player && a.traits.Contains<Selectable>()));
}
}
}

View File

@@ -7,22 +7,26 @@ namespace OpenRa.Graphics
{
public class WorldRenderer
{
readonly World world;
internal readonly TerrainRenderer terrainRenderer;
internal readonly SpriteRenderer spriteRenderer;
internal readonly LineRenderer lineRenderer;
internal readonly UiOverlay uiOverlay;
internal readonly Renderer renderer;
internal readonly HardwarePalette palette;
public static bool ShowUnitPaths = false;
internal WorldRenderer(World world, Renderer renderer)
{
terrainRenderer = new TerrainRenderer(world, renderer);
this.world = world;
this.renderer = renderer;
terrainRenderer = new TerrainRenderer(world, renderer);
spriteRenderer = new SpriteRenderer(renderer, true);
lineRenderer = new LineRenderer(renderer);
uiOverlay = new UiOverlay(spriteRenderer);
palette = new HardwarePalette(renderer, world.Map);
}
void DrawSpriteList(RectangleF rect,
@@ -64,25 +68,25 @@ namespace OpenRa.Graphics
new SizeF( Game.viewport.Width, Game.viewport.Height ));
/* todo: cull to screen again */
var renderables = Game.world.Actors.SelectMany(a => a.Render())
var renderables = world.Actors.SelectMany(a => a.Render())
.OrderBy(r => r, comparer);
foreach (var r in renderables)
spriteRenderer.DrawSprite(r.Sprite, r.Pos, r.Palette);
foreach (var e in Game.world.Effects)
foreach (var e in world.Effects)
DrawSpriteList(rect, e.Render());
uiOverlay.Draw();
uiOverlay.Draw( world );
spriteRenderer.Flush();
DrawBandBox();
if (Game.controller.orderGenerator != null)
Game.controller.orderGenerator.Render();
Game.controller.orderGenerator.Render( world );
Game.world.LocalPlayer.Shroud.Draw(spriteRenderer);
world.LocalPlayer.Shroud.Draw(spriteRenderer);
lineRenderer.Flush();
spriteRenderer.Flush();
@@ -102,7 +106,7 @@ namespace OpenRa.Graphics
lineRenderer.DrawLine(a + b + c, a + c, Color.White, Color.White);
lineRenderer.DrawLine(a, a + c, Color.White, Color.White);
foreach (var u in Game.world.SelectActorsInBox(selbox.Value.First, selbox.Value.Second))
foreach (var u in world.SelectActorsInBox(selbox.Value.First, selbox.Value.Second))
DrawSelectionBox(u, Color.Yellow, false);
}
@@ -131,7 +135,7 @@ namespace OpenRa.Graphics
DrawControlGroup(selectedUnit, xy);
// Only display pips and tags to the owner
if (selectedUnit.Owner == Game.world.LocalPlayer)
if (selectedUnit.Owner == world.LocalPlayer)
{
DrawPips(selectedUnit, xY);
DrawTags(selectedUnit, new float2(.5f * (bounds.Left + bounds.Right ), xy.Y));

View File

@@ -90,28 +90,11 @@ namespace OpenRa
int2 lastPos;
void DispatchMouseInput(MouseInputEvent ev, MouseEventArgs e)
{
int sync = Game.world.SyncHash();
Game.viewport.DispatchMouseInput(
new MouseInput
{
Button = (MouseButton)(int)e.Button,
Event = ev,
Location = new int2(e.Location),
Modifiers = (Modifiers)(int)ModifierKeys,
});
if( sync != Game.world.SyncHash() )
throw new InvalidOperationException( "Desync in DispatchMouseInput" );
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
lastPos = new int2(e.Location);
DispatchMouseInput(MouseInputEvent.Down, e);
Game.DispatchMouseInput(MouseInputEvent.Down, e, ModifierKeys);
}
protected override void OnMouseMove(MouseEventArgs e)
@@ -125,57 +108,27 @@ namespace OpenRa
lastPos = p;
}
DispatchMouseInput(MouseInputEvent.Move, e);
Game.DispatchMouseInput(MouseInputEvent.Move, e, ModifierKeys);
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
DispatchMouseInput(MouseInputEvent.Up, e);
Game.DispatchMouseInput(MouseInputEvent.Up, e, ModifierKeys);
}
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
int sync = Game.world.SyncHash();
/* hack hack hack */
if (e.KeyCode == Keys.F8 && !Game.orderManager.GameStarted)
{
Game.controller.AddOrder(
new Order( "ToggleReady", Game.world.LocalPlayer.PlayerActor, null, int2.Zero, "") { IsImmediate = true });
}
/* temporary hack: DO NOT LEAVE IN */
if (e.KeyCode == Keys.F2)
Game.world.LocalPlayer = Game.world.players[(Game.world.LocalPlayer.Index + 1) % 4];
if (e.KeyCode == Keys.F3)
Game.controller.orderGenerator = new SellOrderGenerator();
if (e.KeyCode == Keys.F4)
Game.controller.orderGenerator = new RepairOrderGenerator();
if (!Game.chat.isChatting)
if (e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9)
Game.controller.DoControlGroup( (int)e.KeyCode - (int)Keys.D0, (Modifiers)(int)e.Modifiers );
if( sync != Game.world.SyncHash() )
throw new InvalidOperationException( "Desync in OnKeyDown" );
Game.HandleKeyDown( e );
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
base.OnKeyPress(e);
int sync = Game.world.SyncHash();
if (e.KeyChar == '\r')
Game.chat.Toggle();
else if (Game.chat.isChatting)
Game.chat.TypeChar(e.KeyChar);
if( sync != Game.world.SyncHash() )
throw new InvalidOperationException( "Desync in OnKeyPress" );
Game.HandleKeyPress( e );
}
}

View File

@@ -18,7 +18,7 @@ namespace OpenRa.Orders
this.power = power;
}
public IEnumerable<Order> Order(int2 xy, MouseInput mi)
public IEnumerable<Order> Order(World world, int2 xy, MouseInput mi)
{
if (mi.Button == MouseButton.Left)
{
@@ -29,15 +29,15 @@ namespace OpenRa.Orders
power != null ? power.Name : null);
}
public void Tick() {}
public void Render()
public void Tick( World world ) {}
public void Render( World world )
{
Game.world.WorldRenderer.DrawSelectionBox(self, Color.White, true);
world.WorldRenderer.DrawSelectionBox(self, Color.White, true);
}
public Cursor GetCursor(int2 xy, MouseInput mi)
public Cursor GetCursor(World world, int2 xy, MouseInput mi)
{
if (!Game.world.LocalPlayer.Shroud.IsExplored(xy))
if (!world.LocalPlayer.Shroud.IsExplored(xy))
return Cursor.MoveBlocked;
var movement = self.traits.GetOrDefault<IMovement>();

View File

@@ -15,21 +15,21 @@ namespace OpenRa.Orders
this.power = power;
}
public IEnumerable<Order> Order(int2 xy, MouseInput mi)
public IEnumerable<Order> Order(World world, int2 xy, MouseInput mi)
{
if (mi.Button == MouseButton.Right)
Game.controller.CancelInputMode();
return OrderInner(xy, mi);
return OrderInner(world, xy, mi);
}
IEnumerable<Order> OrderInner(int2 xy, MouseInput mi)
IEnumerable<Order> OrderInner(World world, int2 xy, MouseInput mi)
{
if (mi.Button == MouseButton.Left)
{
var loc = mi.Location + Game.viewport.Location;
var underCursor = Game.world.FindUnits(loc, loc)
.Where(a => a.Owner == Game.world.LocalPlayer
var underCursor = world.FindUnits(loc, loc)
.Where(a => a.Owner == world.LocalPlayer
&& a.traits.Contains<Chronoshiftable>()
&& a.traits.Contains<Selectable>()).FirstOrDefault();
@@ -38,21 +38,21 @@ namespace OpenRa.Orders
}
}
public void Tick()
public void Tick( World world )
{
var hasChronosphere = Game.world.Actors
.Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains<Chronosphere>());
var hasChronosphere = world.Actors
.Any(a => a.Owner == world.LocalPlayer && a.traits.Contains<Chronosphere>());
if (!hasChronosphere)
Game.controller.CancelInputMode();
}
public void Render() { }
public void Render( World world ) { }
public Cursor GetCursor(int2 xy, MouseInput mi)
public Cursor GetCursor(World world, int2 xy, MouseInput mi)
{
mi.Button = MouseButton.Left;
return OrderInner(xy, mi).Any()
return OrderInner(world, xy, mi).Any()
? Cursor.ChronoshiftSelect : Cursor.MoveBlocked;
}
}

View File

@@ -4,9 +4,9 @@ namespace OpenRa
{
public interface IOrderGenerator
{
IEnumerable<Order> Order( int2 xy, MouseInput mi );
void Tick();
void Render();
Cursor GetCursor(int2 xy, MouseInput mi);
IEnumerable<Order> Order( World world, int2 xy, MouseInput mi );
void Tick( World world );
void Render( World world );
Cursor GetCursor( World world, int2 xy, MouseInput mi );
}
}

View File

@@ -15,21 +15,21 @@ namespace OpenRa.Orders
this.power = power;
}
public IEnumerable<Order> Order(int2 xy, MouseInput mi)
public IEnumerable<Order> Order(World world, int2 xy, MouseInput mi)
{
if (mi.Button == MouseButton.Right)
Game.controller.CancelInputMode();
return OrderInner(xy, mi);
return OrderInner(world, xy, mi);
}
IEnumerable<Order> OrderInner(int2 xy, MouseInput mi)
IEnumerable<Order> OrderInner(World world, int2 xy, MouseInput mi)
{
if (mi.Button == MouseButton.Left)
{
var loc = mi.Location + Game.viewport.Location;
var underCursor = Game.world.FindUnits(loc, loc)
.Where(a => a.Owner == Game.world.LocalPlayer
var underCursor = world.FindUnits(loc, loc)
.Where(a => a.Owner == world.LocalPlayer
&& a.traits.Contains<IronCurtainable>()
&& a.traits.Contains<Selectable>()).FirstOrDefault();
@@ -38,21 +38,21 @@ namespace OpenRa.Orders
}
}
public void Tick()
public void Tick( World world )
{
var hasStructure = Game.world.Actors
.Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains<IronCurtain>());
var hasStructure = world.Actors
.Any(a => a.Owner == world.LocalPlayer && a.traits.Contains<IronCurtain>());
if (!hasStructure)
Game.controller.CancelInputMode();
}
public void Render() { }
public void Render( World world ) { }
public Cursor GetCursor(int2 xy, MouseInput mi)
public Cursor GetCursor(World world, int2 xy, MouseInput mi)
{
mi.Button = MouseButton.Left;
return OrderInner(xy, mi).Any()
return OrderInner(world, xy, mi).Any()
? Cursor.Ability : Cursor.MoveBlocked;
}
}

View File

@@ -64,14 +64,14 @@ namespace OpenRa
}
}
static Player LookupPlayer(uint index)
static Player LookupPlayer(World world, uint index)
{
return Game.world.players
return world.players
.Where(x => x.Value.Index == index)
.First().Value;
}
public static Order Deserialize(BinaryReader r)
public static Order Deserialize(World world, BinaryReader r)
{
switch (r.ReadByte())
{
@@ -87,7 +87,7 @@ namespace OpenRa
targetString = r.ReadString();
Actor subject, targetActor;
if( !TryGetActorFromUInt( subjectId, out subject ) || !TryGetActorFromUInt( targetActorId, out targetActor ) )
if( !TryGetActorFromUInt( world, subjectId, out subject ) || !TryGetActorFromUInt( world, targetActorId, out targetActor ) )
return null;
return new Order( order, subject, targetActor, targetLocation, targetString);
@@ -99,7 +99,7 @@ namespace OpenRa
var name = r.ReadString();
var data = r.ReadString();
return new Order( name, LookupPlayer( playerID ).PlayerActor, null, int2.Zero, data ) { IsImmediate = true };
return new Order( name, LookupPlayer( world, playerID ).PlayerActor, null, int2.Zero, data ) { IsImmediate = true };
}
default:
@@ -113,7 +113,7 @@ namespace OpenRa
return a.ActorID;
}
static bool TryGetActorFromUInt(uint aID, out Actor ret )
static bool TryGetActorFromUInt(World world, uint aID, out Actor ret )
{
if( aID == 0xFFFFFFFF )
{
@@ -122,7 +122,7 @@ namespace OpenRa
}
else
{
foreach( var a in Game.world.Actors.Where( x => x.ActorID == aID ) )
foreach( var a in world.Actors.Where( x => x.ActorID == aID ) )
{
ret = a;
return true;

View File

@@ -22,14 +22,14 @@ namespace OpenRa.Orders
ms.WriteTo(s);
}
public static List<Order> ToOrderList(this byte[] bytes)
public static List<Order> ToOrderList(this byte[] bytes, World world)
{
var ms = new MemoryStream(bytes);
var reader = new BinaryReader(ms);
var ret = new List<Order>();
while( ms.Position < ms.Length )
{
var o = Order.Deserialize( reader );
var o = Order.Deserialize( world, reader );
if( o != null )
ret.Add( o );
}

View File

@@ -54,11 +54,11 @@ namespace OpenRa.Orders
}
}
void ProcessOrders(int frame, bool save)
void ProcessOrders(World world, int frame, bool save)
{
var orders = sources
.SelectMany(s => s.OrdersForFrame(frame))
.SelectMany(x => x.ToOrderList())
.SelectMany(x => x.ToOrderList(world))
.OrderBy(o => o.Player.Index)
.ToList();
@@ -69,24 +69,24 @@ namespace OpenRa.Orders
savingReplay.WriteFrameData(orders, frame);
}
public void TickImmediate()
public void TickImmediate( World world )
{
var localOrders = Game.controller.GetRecentOrders(true);
if (localOrders.Count > 0)
foreach (var p in sources)
p.SendLocalOrders(0, localOrders);
ProcessOrders(0, false);
ProcessOrders(world, 0, false);
}
public void Tick()
public void Tick( World world )
{
var localOrders = Game.controller.GetRecentOrders(false);
foreach( var p in sources )
p.SendLocalOrders( frameNumber + FramesAhead, localOrders );
ProcessOrders(frameNumber, true);
ProcessOrders(world, frameNumber, true);
++frameNumber;

View File

@@ -16,21 +16,21 @@ namespace OpenRa.Orders
Building = name;
}
public IEnumerable<Order> Order(int2 xy, MouseInput mi)
public IEnumerable<Order> Order(World world, int2 xy, MouseInput mi)
{
if (mi.Button == MouseButton.Right)
Game.controller.CancelInputMode();
return InnerOrder(xy, mi);
return InnerOrder(world, xy, mi);
}
IEnumerable<Order> InnerOrder(int2 xy, MouseInput mi)
IEnumerable<Order> InnerOrder(World world, int2 xy, MouseInput mi)
{
if (mi.Button == MouseButton.Left)
{
var topLeft = xy - Footprint.AdjustForBuildingSize( BuildingInfo );
if (!Game.world.CanPlaceBuilding( Building, BuildingInfo, topLeft, null)
|| !Game.world.IsCloseEnoughToBase(Producer.Owner, Building, BuildingInfo, topLeft))
if (!world.CanPlaceBuilding( Building, BuildingInfo, topLeft, null)
|| !world.IsCloseEnoughToBase(Producer.Owner, Building, BuildingInfo, topLeft))
{
Sound.Play("nodeply1.aud");
yield break;
@@ -40,19 +40,19 @@ namespace OpenRa.Orders
}
}
public void Tick()
public void Tick( World world )
{
var producing = Producer.traits.Get<Traits.ProductionQueue>().CurrentItem( Rules.Info[ Building ].Category );
if (producing == null || producing.Item != Building || producing.RemainingTime != 0)
Game.controller.CancelInputMode();
}
public void Render()
public void Render( World world )
{
Game.world.WorldRenderer.uiOverlay.DrawBuildingGrid( Building, BuildingInfo );
world.WorldRenderer.uiOverlay.DrawBuildingGrid( world, Building, BuildingInfo );
}
public Cursor GetCursor(int2 xy, MouseInput mi)
public Cursor GetCursor(World world, int2 xy, MouseInput mi)
{
return Cursor.Default;
}

View File

@@ -9,21 +9,21 @@ namespace OpenRa.Orders
{
class PowerDownOrderGenerator : IOrderGenerator
{
public IEnumerable<Order> Order(int2 xy, MouseInput mi)
public IEnumerable<Order> Order(World world, int2 xy, MouseInput mi)
{
if (mi.Button == MouseButton.Right)
Game.controller.CancelInputMode();
return OrderInner(xy, mi);
return OrderInner(world, xy, mi);
}
IEnumerable<Order> OrderInner(int2 xy, MouseInput mi)
IEnumerable<Order> OrderInner(World world, int2 xy, MouseInput mi)
{
if (mi.Button == MouseButton.Left)
{
var loc = mi.Location + Game.viewport.Location;
var underCursor = Game.world.FindUnits(loc, loc)
.Where(a => a.Owner == Game.world.LocalPlayer
var underCursor = world.FindUnits(loc, loc)
.Where(a => a.Owner == world.LocalPlayer
&& a.traits.Contains<Building>()
&& a.traits.Contains<Selectable>()).FirstOrDefault();
@@ -32,13 +32,13 @@ namespace OpenRa.Orders
}
}
public void Tick() { }
public void Render() { }
public void Tick( World world ) { }
public void Render( World world ) { }
public Cursor GetCursor(int2 xy, MouseInput mi)
public Cursor GetCursor(World world, int2 xy, MouseInput mi)
{
mi.Button = MouseButton.Left;
return OrderInner(xy, mi).Any()
return OrderInner(world, xy, mi).Any()
? Cursor.PowerDown : Cursor.PowerDown;
}
}

View File

@@ -9,21 +9,21 @@ namespace OpenRa.Orders
{
class RepairOrderGenerator : IOrderGenerator
{
public IEnumerable<Order> Order(int2 xy, MouseInput mi)
public IEnumerable<Order> Order(World world, int2 xy, MouseInput mi)
{
if (mi.Button == MouseButton.Right)
Game.controller.CancelInputMode();
return OrderInner(xy, mi);
return OrderInner(world, xy, mi);
}
IEnumerable<Order> OrderInner(int2 xy, MouseInput mi)
IEnumerable<Order> OrderInner(World world, int2 xy, MouseInput mi)
{
if (mi.Button == MouseButton.Left)
{
var loc = mi.Location + Game.viewport.Location;
var underCursor = Game.world.FindUnits(loc, loc)
.Where(a => a.Owner == Game.world.LocalPlayer
var underCursor = world.FindUnits(loc, loc)
.Where(a => a.Owner == world.LocalPlayer
&& a.traits.Contains<Building>()
&& a.traits.Contains<Selectable>()).FirstOrDefault();
@@ -34,24 +34,24 @@ namespace OpenRa.Orders
}
}
public void Tick()
public void Tick( World world )
{
if (!Game.Settings.RepairRequiresConyard)
return;
var hasFact = Game.world.Actors
.Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains<ConstructionYard>());
var hasFact = world.Actors
.Any(a => a.Owner == world.LocalPlayer && a.traits.Contains<ConstructionYard>());
if (!hasFact)
Game.controller.CancelInputMode();
}
public void Render() {}
public void Render( World world ) {}
public Cursor GetCursor(int2 xy, MouseInput mi)
public Cursor GetCursor(World world, int2 xy, MouseInput mi)
{
mi.Button = MouseButton.Left;
return OrderInner(xy, mi).Any()
return OrderInner(world, xy, mi).Any()
? Cursor.Repair : Cursor.RepairBlocked;
}
}

View File

@@ -9,21 +9,21 @@ namespace OpenRa.Orders
{
class SellOrderGenerator : IOrderGenerator
{
public IEnumerable<Order> Order(int2 xy, MouseInput mi)
public IEnumerable<Order> Order(World world, int2 xy, MouseInput mi)
{
if (mi.Button == MouseButton.Right)
Game.controller.CancelInputMode();
return OrderInner(xy, mi);
return OrderInner(world, xy, mi);
}
IEnumerable<Order> OrderInner(int2 xy, MouseInput mi)
IEnumerable<Order> OrderInner(World world, int2 xy, MouseInput mi)
{
if (mi.Button == MouseButton.Left)
{
var loc = mi.Location + Game.viewport.Location;
var underCursor = Game.world.FindUnits(loc, loc)
.Where(a => a.Owner == Game.world.LocalPlayer
var underCursor = world.FindUnits(loc, loc)
.Where(a => a.Owner == world.LocalPlayer
&& a.traits.Contains<Building>()
&& a.traits.Contains<Selectable>()).FirstOrDefault();
@@ -34,13 +34,13 @@ namespace OpenRa.Orders
}
}
public void Tick() {}
public void Render() {}
public void Tick( World world ) {}
public void Render( World world ) {}
public Cursor GetCursor(int2 xy, MouseInput mi)
public Cursor GetCursor(World world, int2 xy, MouseInput mi)
{
mi.Button = MouseButton.Left;
return OrderInner(xy, mi).Any()
return OrderInner(world, xy, mi).Any()
? Cursor.Sell : Cursor.SellBlocked;
}
}

View File

@@ -15,7 +15,7 @@ namespace OpenRa.Orders
selection = selected.ToList();
}
public IEnumerable<Order> Order( int2 xy, MouseInput mi )
public IEnumerable<Order> Order( World world, int2 xy, MouseInput mi )
{
foreach( var unit in selection )
{
@@ -25,31 +25,31 @@ namespace OpenRa.Orders
}
}
public void Tick()
public void Tick( World world )
{
selection.RemoveAll(a => !a.IsInWorld);
}
public void Render()
public void Render( World world )
{
foreach( var a in selection )
Game.world.WorldRenderer.DrawSelectionBox( a, Color.White, true );
world.WorldRenderer.DrawSelectionBox( a, Color.White, true );
}
public Cursor GetCursor(int2 xy, MouseInput mi)
public Cursor GetCursor( World world, int2 xy, MouseInput mi )
{
return ChooseCursor(mi);
return ChooseCursor(world, mi);
}
Cursor ChooseCursor( MouseInput mi )
Cursor ChooseCursor( World world, MouseInput mi )
{
var p = Game.controller.MousePosition;
var c = Order(p.ToInt2(), mi)
var c = Order(world, p.ToInt2(), mi)
.Select(o => CursorForOrderString(o.OrderString, o.Subject, o.TargetLocation))
.FirstOrDefault(a => a != null);
return c ??
(Game.world.SelectActorsInBox(Game.CellSize * p,
(world.SelectActorsInBox(Game.CellSize * p,
Game.CellSize * p).Any()
? Cursor.Select : Cursor.Default);
}
@@ -69,7 +69,7 @@ namespace OpenRa.Orders
return Cursor.MoveBlocked;
case "DeployMcv":
var factBuildingInfo = Rules.Info["fact"].Traits.Get<BuildingInfo>();
if (Game.world.CanPlaceBuilding("fact", factBuildingInfo, a.Location - new int2(1, 1), a))
if (a.World.CanPlaceBuilding("fact", factBuildingInfo, a.Location - new int2(1, 1), a))
return Cursor.Deploy;
else
return Cursor.DeployBlocked;

View File

@@ -19,7 +19,7 @@ namespace OpenRa.Orders
}
case "AssignPlayer":
{
Game.world.LocalPlayer = order.Player;
order.Player.World.LocalPlayer = order.Player;
Game.chat.AddLine(order.Player, "is now YOU.");
break;
}

View File

@@ -10,10 +10,12 @@ namespace OpenRa
{
public class PathFinder
{
readonly World world;
float[][,] passableCost = new float[4][,];
public PathFinder( World world )
{
this.world = world;
for (var umt = UnitMovementType.Foot; umt <= UnitMovementType.Float; umt++)
passableCost[(int)umt] = new float[128, 128];
for( int x = 0 ; x < 128 ; x++ )
@@ -29,8 +31,8 @@ namespace OpenRa
using (new PerfSample("find_unit_path"))
{
var pb = FindBidiPath(
PathSearch.FromPoint(target, from, umt, false).WithCustomBlocker(AvoidUnitsNear(from, 4)),
PathSearch.FromPoint(from, target, umt, false).WithCustomBlocker(AvoidUnitsNear(from, 4)));
PathSearch.FromPoint(world, target, from, umt, false).WithCustomBlocker(AvoidUnitsNear(from, 4)),
PathSearch.FromPoint(world, from, target, umt, false).WithCustomBlocker(AvoidUnitsNear(from, 4)));
CheckSanePath2(pb, from, target);
return pb;
@@ -41,10 +43,10 @@ namespace OpenRa
{
using( new PerfSample( "find_unit_path_multiple_src" ) )
{
var tilesInRange = Game.world.FindTilesInCircle(target, range)
.Where( t => Game.world.IsCellBuildable( t, umt ) );
var tilesInRange = world.FindTilesInCircle(target, range)
.Where( t => world.IsCellBuildable( t, umt ) );
var path = FindPath( PathSearch.FromPoints( tilesInRange, src, umt, false ).WithCustomBlocker(AvoidUnitsNear(src, 4)));
var path = FindPath( PathSearch.FromPoints( world, tilesInRange, src, umt, false ).WithCustomBlocker(AvoidUnitsNear(src, 4)));
path.Reverse();
return path;
}
@@ -55,7 +57,7 @@ namespace OpenRa
return q =>
p != q &&
((p - q).LengthSquared < dist * dist) &&
(Game.world.UnitInfluence.GetUnitsAt(q).Any());
(world.UnitInfluence.GetUnitsAt(q).Any());
}
public List<int2> FindPath( PathSearch search )
@@ -64,7 +66,7 @@ namespace OpenRa
{
while (!search.queue.Empty)
{
var p = search.Expand( passableCost );
var p = search.Expand( world, passableCost );
PerfHistory.Increment("nodes_expanded", .01);
if (search.heuristic(p) == 0)
@@ -101,13 +103,13 @@ namespace OpenRa
while (!fromSrc.queue.Empty && !fromDest.queue.Empty)
{
/* make some progress on the first search */
var p = fromSrc.Expand( passableCost );
var p = fromSrc.Expand( world, passableCost );
if (fromDest.cellInfo[p.X, p.Y].Seen && fromDest.cellInfo[p.X, p.Y].MinCost < float.PositiveInfinity)
return MakeBidiPath(fromSrc, fromDest, p);
/* make some progress on the second search */
var q = fromDest.Expand( passableCost );
var q = fromDest.Expand( world, passableCost );
if (fromSrc.cellInfo[q.X, q.Y].Seen && fromSrc.cellInfo[q.X, q.Y].MinCost < float.PositiveInfinity)
return MakeBidiPath(fromSrc, fromDest, q);

View File

@@ -34,12 +34,12 @@ namespace OpenRa
return this;
}
public int2 Expand( float[][ , ] passableCost )
public int2 Expand( World world, float[][ , ] passableCost )
{
var p = queue.Pop();
cellInfo[ p.Location.X, p.Location.Y ].Seen = true;
var custom2 = Game.world.customTerrain[p.Location.X, p.Location.Y];
var custom2 = world.customTerrain[p.Location.X, p.Location.Y];
var thisCost = (custom2 != null)
? custom2.GetCost(p.Location, umt)
: passableCost[(int)umt][p.Location.X, p.Location.Y];
@@ -51,24 +51,24 @@ namespace OpenRa
{
int2 newHere = p.Location + d;
if (!Game.world.Map.IsInMap(newHere.X, newHere.Y)) continue;
if (!world.Map.IsInMap(newHere.X, newHere.Y)) continue;
if( cellInfo[ newHere.X, newHere.Y ].Seen )
continue;
var custom = Game.world.customTerrain[newHere.X, newHere.Y];
var custom = world.customTerrain[newHere.X, newHere.Y];
var costHere = (custom != null) ? custom.GetCost(newHere, umt) : passableCost[(int)umt][newHere.X, newHere.Y];
if (costHere == float.PositiveInfinity)
continue;
if (!Game.world.BuildingInfluence.CanMoveHere(newHere) &&
Game.world.BuildingInfluence.GetBuildingAt(newHere) != ignoreBuilding)
if (!world.BuildingInfluence.CanMoveHere(newHere) &&
world.BuildingInfluence.GetBuildingAt(newHere) != ignoreBuilding)
continue;
if (Game.world.Map.IsOverlaySolid(newHere))
if (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.world.UnitInfluence.GetUnitsAt(newHere).Any(a => !Game.world.IsActorPathableToCrush(a, umt))))
if (checkForBlocked && (world.UnitInfluence.GetUnitsAt(newHere).Any(a => !world.IsActorPathableToCrush(a, umt))))
continue;
if (customBlock != null && customBlock(newHere))
@@ -93,27 +93,27 @@ namespace OpenRa
return p.Location;
}
public void AddInitialCell( int2 location )
public void AddInitialCell( World world, int2 location )
{
if (!Game.world.Map.IsInMap(location.X, location.Y))
if (!world.Map.IsInMap(location.X, location.Y))
return;
cellInfo[ location.X, location.Y ] = new CellInfo( 0, location, false );
queue.Add( new PathDistance( heuristic( location ), location ) );
}
public static PathSearch FromPoint( int2 from, int2 target, UnitMovementType umt, bool checkForBlocked )
public static PathSearch FromPoint( World world, int2 from, int2 target, UnitMovementType umt, bool checkForBlocked )
{
var search = new PathSearch {
heuristic = DefaultEstimator( target ),
umt = umt,
checkForBlocked = checkForBlocked };
search.AddInitialCell( from );
search.AddInitialCell( world, from );
return search;
}
public static PathSearch FromPoints(IEnumerable<int2> froms, int2 target, UnitMovementType umt, bool checkForBlocked)
public static PathSearch FromPoints(World world, IEnumerable<int2> froms, int2 target, UnitMovementType umt, bool checkForBlocked)
{
var search = new PathSearch
{
@@ -123,7 +123,7 @@ namespace OpenRa
};
foreach (var sl in froms)
search.AddInitialCell(sl);
search.AddInitialCell(world, sl);
return search;
}

View File

@@ -26,6 +26,8 @@ namespace OpenRa
public int PowerProvided = 0;
public int PowerDrained = 0;
public World World { get { return PlayerActor.World; } }
public Shroud Shroud;
public Dictionary<string, SupportPower> SupportPowers;
@@ -52,7 +54,7 @@ namespace OpenRa
PowerProvided = 0;
PowerDrained = 0;
var myBuildings = Game.world.Actors
var myBuildings = World.Actors
.Where(a => a.Owner == this && a.traits.Contains<Building>());
foreach (var a in myBuildings)
@@ -83,7 +85,7 @@ namespace OpenRa
void UpdateOreCapacity()
{
OreCapacity = Game.world.Actors
OreCapacity = World.Actors
.Where(a => a.Owner == this && a.traits.Contains<StoresOre>())
.Select(a => a.Info.Traits.Get<StoresOreInfo>())
.Sum(b => b.Capacity);
@@ -91,7 +93,7 @@ namespace OpenRa
void GiveAdvice(string advice)
{
if (this != Game.world.LocalPlayer) return;
if (this != World.LocalPlayer) return;
// todo: store the condition or something.
// repeat after Rules.General.SpeakDelay, as long as the condition holds.
Sound.Play(advice);
@@ -130,12 +132,12 @@ namespace OpenRa
{
UpdatePower();
UpdateOreCapacity();
Shroud.Tick();
Shroud.Tick( World );
foreach (var sp in SupportPowers.Values)
sp.Tick();
if (this == Game.world.LocalPlayer)
if (this == World.LocalPlayer)
{
var totalMoney = Cash + Ore;

View File

@@ -29,11 +29,11 @@ namespace OpenRa
set { hasGPS = value; dirty = true;}
}
public void Tick()
public void Tick( World world )
{
// Clear active flags
gapActive = new bool[128, 128];
foreach (var a in Game.world.Actors.Where(a => a.traits.Contains<GeneratesGap>() && owner != a.Owner))
foreach (var a in world.Actors.Where(a => a.traits.Contains<GeneratesGap>() && owner != a.Owner))
{
foreach (var t in a.traits.Get<GeneratesGap>().GetShroudedTiles())
gapActive[t.X, t.Y] = true;
@@ -81,7 +81,7 @@ namespace OpenRa
public void Explore(Actor a)
{
foreach (var t in Game.world.FindTilesInCircle(
foreach (var t in a.World.FindTilesInCircle(
(1f / Game.CellSize * a.CenterLocation).ToInt2(),
a.Info.Traits.Get<OwnedActorInfo>().Sight))
{

View File

@@ -1,4 +1,5 @@
using OpenRa.GameRules;
using OpenRa.FileFormats;
namespace OpenRa
{
@@ -8,11 +9,11 @@ namespace OpenRa
const int firstCrater = 17;
const int framesPerCrater = 5;
public static void AddSmudge(bool isCrater, int x, int y)
public static void AddSmudge(this Map map, bool isCrater, int x, int y)
{
var smudge = Game.world.Map.MapTiles[x, y].smudge;
var smudge = map.MapTiles[x, y].smudge;
if (smudge == 0)
Game.world.Map.MapTiles[x, y].smudge = (byte) (isCrater
map.MapTiles[x, y].smudge = (byte) (isCrater
? (firstCrater + framesPerCrater * ChooseSmudge())
: (firstScorch + ChooseSmudge()));
@@ -21,21 +22,21 @@ namespace OpenRa
/* deepen the crater */
var amount = (smudge - firstCrater) % framesPerCrater;
if (amount < framesPerCrater - 1)
Game.world.Map.MapTiles[x, y].smudge++;
map.MapTiles[x, y].smudge++;
}
public static void AddSmudge(int2 targetTile, WarheadInfo warhead)
public static void AddSmudge(this Map map, int2 targetTile, WarheadInfo warhead)
{
switch (warhead.Explosion) /* todo: push the scorch/crater behavior into data */
{
case 4:
case 5:
Smudge.AddSmudge(true, targetTile.X, targetTile.Y);
map.AddSmudge(true, targetTile.X, targetTile.Y);
break;
case 3:
case 6:
Smudge.AddSmudge(false, targetTile.X, targetTile.Y);
map.AddSmudge(false, targetTile.X, targetTile.Y);
break;
}
}

View File

@@ -20,12 +20,12 @@ namespace OpenRa.SupportPowers
Sound.Play("chrono2.aud");
// Play chronosphere active anim
var chronosphere = Game.world.Actors.Where(a => a.Owner == p.Owner && a.traits.Contains<Chronosphere>()).FirstOrDefault();
var chronosphere = target.World.Actors.Where(a => a.Owner == p.Owner && a.traits.Contains<Chronosphere>()).FirstOrDefault();
if (chronosphere != null)
Game.controller.AddOrder(Order.PlayAnimation(chronosphere, "active"));
// Trigger screen desaturate effect
foreach (var a in Game.world.Actors.Where(a => a.traits.Contains<ChronoshiftPaletteEffect>()))
foreach (var a in target.World.Actors.Where(a => a.traits.Contains<ChronoshiftPaletteEffect>()))
a.traits.Get<ChronoshiftPaletteEffect>().DoChronoshift();
}
SupportPower p;

View File

@@ -12,13 +12,13 @@ namespace OpenRa.SupportPowers
public void IsChargingNotification(SupportPower p) { }
public void IsReadyNotification(SupportPower p)
{
var launchSite = Game.world.Actors
var launchSite = p.Owner.World.Actors
.FirstOrDefault(a => a.Owner == p.Owner && a.traits.Contains<GpsLaunchSite>());
if (launchSite == null)
return;
Game.world.AddFrameEndTask(w =>
p.Owner.World.AddFrameEndTask(w =>
{
w.Add(new SatelliteLaunch(launchSite));
w.Add(new DelayedAction(revealDelay, () => p.Owner.Shroud.HasGPS = true));

View File

@@ -25,7 +25,7 @@ namespace OpenRa.SupportPowers
Sound.Play("ironcur9.aud");
// Play active anim
var ironCurtain = Game.world.Actors
var ironCurtain = target.World.Actors
.Where(a => a.Owner == p.Owner && a.traits.Contains<IronCurtain>())
.FirstOrDefault();
if (ironCurtain != null)

View File

@@ -11,7 +11,7 @@ namespace OpenRa.Traits
{
public AcceptsOre(Actor self)
{
Game.world.AddFrameEndTask(
self.World.AddFrameEndTask(
w =>
{ /* create the free harvester! */
var harvester = w.CreateActor("harv", self.Location + new int2(1, 2), self.Owner);

View File

@@ -42,15 +42,15 @@ namespace OpenRa.Traits.Activities
umt = mobile.GetMovementType(),
checkForBlocked = false,
};
var refineries = Game.world.Actors.Where( x => x.traits.Contains<AcceptsOre>()
var refineries = self.World.Actors.Where( x => x.traits.Contains<AcceptsOre>()
&& x.Owner == self.Owner ).ToList();
if( refinery != null )
search.AddInitialCell( refinery.Location + refineryDeliverOffset );
search.AddInitialCell( self.World, refinery.Location + refineryDeliverOffset );
else
foreach( var r in refineries )
search.AddInitialCell( r.Location + refineryDeliverOffset );
search.AddInitialCell( self.World, r.Location + refineryDeliverOffset );
var path = Game.world.PathFinder.FindPath( search );
var path = self.World.PathFinder.FindPath( search );
path.Reverse();
if( path.Count != 0 )
{

View File

@@ -8,16 +8,16 @@ namespace OpenRa.Traits.Activities
public IActivity Tick( Actor self )
{
Game.world.AddFrameEndTask( _ =>
self.World.AddFrameEndTask( _ =>
{
self.Health = 0;
Game.world.Remove( self );
if (self.Owner == Game.world.LocalPlayer)
self.World.Remove( self );
if (self.Owner == self.World.LocalPlayer)
{
Sound.Play("placbldg.aud");
Sound.Play("build5.aud");
}
Game.world.CreateActor( "fact", self.Location - new int2( 1, 1 ), self.Owner );
self.World.CreateActor( "fact", self.Location - new int2( 1, 1 ), self.Owner );
} );
return this;
}

View File

@@ -26,7 +26,7 @@ namespace OpenRa.Traits.Activities
return NextActivity;
cargo.Load(transport, self);
Game.world.AddFrameEndTask(w => w.Remove(self));
self.World.AddFrameEndTask(w => w.Remove(self));
return this;
}

View File

@@ -36,8 +36,8 @@ namespace OpenRa.Traits.Activities
var renderUnit = self.traits.Get<RenderUnit>(); /* better have one of these! */
var isGem = false;
if (!Game.world.Map.ContainsResource(self.Location) ||
!Game.world.Map.Harvest(self.Location, out isGem))
if (!self.World.Map.ContainsResource(self.Location) ||
!self.World.Map.Harvest(self.Location, out isGem))
return false;
var harvestAnim = "harvest" + Util.QuantizeFacing(unit.Facing, 8);
@@ -58,12 +58,12 @@ namespace OpenRa.Traits.Activities
{
var search = new PathSearch
{
heuristic = loc => (Game.world.Map.ContainsResource(loc) ? 0 : 1),
heuristic = loc => (self.World.Map.ContainsResource(loc) ? 0 : 1),
umt = UnitMovementType.Wheel,
checkForBlocked = true
};
search.AddInitialCell(self.Location);
return Game.world.PathFinder.FindPath(search);
search.AddInitialCell(self.World, self.Location);
return self.World.PathFinder.FindPath(search);
}));
self.QueueActivity(new Harvest());
}

View File

@@ -16,7 +16,7 @@ namespace OpenRa.Traits.Activities
if (unit.Altitude == 0)
return NextActivity;
if (requireSpace && !Game.world.IsCellBuildable(self.Location, UnitMovementType.Foot))
if (requireSpace && !self.World.IsCellBuildable(self.Location, UnitMovementType.Foot))
return this; // fail to land if no space
--unit.Altitude;

View File

@@ -9,7 +9,7 @@ namespace OpenRa.Traits.Activities
static Actor ChooseHelipad(Actor self)
{
return Game.world.Actors.FirstOrDefault(
return self.World.Actors.FirstOrDefault(
a => a.Info.Name == "hpad" &&
a.Owner == self.Owner &&
!Reservable.IsReserved(a));

View File

@@ -20,7 +20,7 @@ namespace OpenRa.Traits.Activities
public Move( int2 destination, int nearEnough )
{
this.getPath = ( self, mobile ) => Game.world.PathFinder.FindUnitPath(
this.getPath = ( self, mobile ) => self.World.PathFinder.FindUnitPath(
self.Location, destination,
mobile.GetMovementType() );
this.destination = destination;
@@ -30,9 +30,9 @@ namespace OpenRa.Traits.Activities
public Move(int2 destination, Actor ignoreBuilding)
{
this.getPath = (self, mobile) =>
Game.world.PathFinder.FindPath(
PathSearch.FromPoint( self.Location, destination, mobile.GetMovementType(), false )
.WithCustomBlocker( Game.world.PathFinder.AvoidUnitsNear( self.Location, 4 )).WithIgnoredBuilding( ignoreBuilding ));
self.World.PathFinder.FindPath(
PathSearch.FromPoint( self.World, self.Location, destination, mobile.GetMovementType(), false )
.WithCustomBlocker( self.World.PathFinder.AvoidUnitsNear( self.Location, 4 )).WithIgnoredBuilding( ignoreBuilding ));
this.destination = destination;
this.nearEnough = 0;
@@ -41,7 +41,7 @@ namespace OpenRa.Traits.Activities
public Move( Actor target, int range )
{
this.getPath = ( self, mobile ) => Game.world.PathFinder.FindUnitPathToRange(
this.getPath = ( self, mobile ) => self.World.PathFinder.FindUnitPathToRange(
self.Location, target.Location,
mobile.GetMovementType(), range );
this.destination = null;
@@ -57,13 +57,13 @@ namespace OpenRa.Traits.Activities
bool CanEnterCell( int2 c, Actor self )
{
if (!Game.world.BuildingInfluence.CanMoveHere(c)
&& Game.world.BuildingInfluence.GetBuildingAt(c) != ignoreBuilding)
if (!self.World.BuildingInfluence.CanMoveHere(c)
&& self.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.world.UnitInfluence.GetUnitsAt(c).Any(a => a != self && !Game.world.IsActorCrushableByActor(a, self)));
return (!self.World.UnitInfluence.GetUnitsAt(c).Any(a => a != self && !self.World.IsActorCrushableByActor(a, self)));
}
public IActivity Tick( Actor self )
@@ -144,10 +144,10 @@ namespace OpenRa.Traits.Activities
return null;
}
Game.world.UnitInfluence.Remove( self, mobile );
self.World.UnitInfluence.Remove( self, mobile );
var newPath = getPath(self, mobile).TakeWhile(a => a != self.Location).ToList();
Game.world.UnitInfluence.Add( self, mobile );
self.World.UnitInfluence.Add( self, mobile );
if (newPath.Count != 0)
path = newPath;

View File

@@ -20,7 +20,7 @@ namespace OpenRa.Traits.Activities
{
if (!limitedAmmo.GiveAmmo()) return NextActivity;
var hostBuilding = Game.world.FindUnits(self.CenterLocation, self.CenterLocation)
var hostBuilding = self.World.FindUnits(self.CenterLocation, self.CenterLocation)
.FirstOrDefault(a => a.traits.Contains<RenderBuilding>());
if (hostBuilding != null)

View File

@@ -35,7 +35,7 @@ namespace OpenRa.Traits.Activities
if (self.Health == hp)
return NextActivity;
var hostBuilding = Game.world.FindUnits(self.CenterLocation, self.CenterLocation)
var hostBuilding = self.World.FindUnits(self.CenterLocation, self.CenterLocation)
.FirstOrDefault(a => a.traits.Contains<RenderBuilding>());
if (hostBuilding != null)

View File

@@ -18,7 +18,7 @@ namespace OpenRa.Traits.Activities
Actor ChooseAirfield(Actor self)
{
var airfield = Game.world.Actors
var airfield = self.World.Actors
.Where(a => a.Info.Name == "afld"
&& a.Owner == self.Owner
&& !Reservable.IsReserved(a))

View File

@@ -23,7 +23,7 @@ namespace OpenRa.Traits.Activities
self.Health = 0;
foreach (var ns in self.traits.WithInterface<INotifySold>())
ns.Sold(self);
Game.world.AddFrameEndTask( _ => Game.world.Remove( self ) );
self.World.AddFrameEndTask( _ => self.World.Remove( self ) );
// todo: give dudes
}

View File

@@ -24,7 +24,7 @@ namespace OpenRa.Traits.Activities
{
var rb = self.traits.Get<RenderBuilding>();
rb.PlayCustomAnimBackwards(self, "make",
() => Game.world.AddFrameEndTask(w => DoUndeploy(w,self)));
() => self.World.AddFrameEndTask(w => DoUndeploy(w,self)));
Sound.Play("cashturn.aud");
started = true;

View File

@@ -13,13 +13,13 @@ namespace OpenRa.Traits.Activities
int2? ChooseExitTile(Actor self)
{
// is anyone still hogging this tile?
if (Game.world.UnitInfluence.GetUnitsAt(self.Location).Count() > 1)
if (self.World.UnitInfluence.GetUnitsAt(self.Location).Count() > 1)
return null;
for (var i = -1; i < 2; i++)
for (var j = -1; j < 2; j++)
if ((i != 0 || j != 0) &&
Game.world.IsCellBuildable(self.Location + new int2(i, j),
self.World.IsCellBuildable(self.Location + new int2(i, j),
UnitMovementType.Foot))
return self.Location + new int2(i, j);
@@ -54,7 +54,7 @@ namespace OpenRa.Traits.Activities
var actor = cargo.Unload(self);
Game.world.AddFrameEndTask(w =>
self.World.AddFrameEndTask(w =>
{
w.Add(actor);
actor.traits.Get<Mobile>().TeleportTo(actor, self.Location);

View File

@@ -150,18 +150,18 @@ namespace OpenRa.Traits
var destAltitude = destUnit != null ? destUnit.Altitude : 0;
if( weapon.RenderAsTesla )
Game.world.Add( new TeslaZap( firePos, thisTarget.CenterLocation.ToInt2() ) );
self.World.Add( new TeslaZap( firePos, thisTarget.CenterLocation.ToInt2() ) );
if (Rules.ProjectileInfo[weapon.Projectile].ROT != 0)
{
var fireFacing = thisLocalOffset.ElementAtOrDefault(2) +
(self.traits.Contains<Turreted>() ? self.traits.Get<Turreted>().turretFacing : unit.Facing);
Game.world.Add(new Missile(weapon, self.Owner, self,
self.World.Add(new Missile(weapon, self.Owner, self,
firePos, thisTarget, srcAltitude, fireFacing));
}
else
Game.world.Add(new Bullet(weapon, self.Owner, self,
self.World.Add(new Bullet(weapon, self.Owner, self,
firePos, thisTarget.CenterLocation.ToInt2(), srcAltitude, destAltitude));
if (!string.IsNullOrEmpty(weapon.Report))
@@ -205,8 +205,8 @@ namespace OpenRa.Traits
self.CancelActivity();
QueueAttack(self, order);
if (self.Owner == Game.world.LocalPlayer)
Game.world.AddFrameEndTask(w => w.Add(new FlashTarget(order.TargetActor)));
if (self.Owner == self.World.LocalPlayer)
self.World.AddFrameEndTask(w => w.Add(new FlashTarget(order.TargetActor)));
}
else
target = null;

View File

@@ -43,7 +43,7 @@ namespace OpenRa.Traits
Actor ChooseTarget(Actor self, float range)
{
var inRange = Game.world.FindUnitsInCircle(self.CenterLocation, Game.CellSize * range);
var inRange = self.World.FindUnitsInCircle(self.CenterLocation, Game.CellSize * range);
return inRange
.Where(a => a.Owner == self.Owner && a != self) /* todo: one day deal with friendly players */

View File

@@ -27,7 +27,7 @@ namespace OpenRa.Traits
Actor ChooseTarget(Actor self, float range)
{
var inRange = Game.world.FindUnitsInCircle(self.CenterLocation, Game.CellSize * range);
var inRange = self.World.FindUnitsInCircle(self.CenterLocation, Game.CellSize * range);
return inRange
.Where(a => a.Owner != null && a.Owner != self.Owner) /* todo: one day deal with friendly players */

View File

@@ -97,7 +97,7 @@ namespace OpenRa.Traits
// If the disabled state has changed since the last frame
if (Disabled ^ wasDisabled
&& (wasDisabled = Disabled)) // Yes, I mean assignment
Game.world.AddFrameEndTask(w => w.Add(new PowerDownIndicator(self)));
self.World.AddFrameEndTask(w => w.Add(new PowerDownIndicator(self)));
if (!isRepairing) return;
@@ -113,7 +113,7 @@ namespace OpenRa.Traits
return;
}
Game.world.AddFrameEndTask(w => w.Add(new RepairIndicator(self)));
self.World.AddFrameEndTask(w => w.Add(new RepairIndicator(self)));
self.InflictDamage(self, -hpToRepair, Rules.WarheadInfo["Super"]);
if (self.Health == maxHP)
{

View File

@@ -30,7 +30,7 @@ namespace OpenRa.Traits
if (remainingUncloakTime > 0)
return rs;
if (self.Owner == Game.world.LocalPlayer)
if (self.Owner == self.World.LocalPlayer)
return rs.Select(a => a.WithPalette(PaletteType.Shadow));
else
return new Renderable[] { };

View File

@@ -27,7 +27,7 @@ namespace OpenRa.Traits
{
// force-move
if (!mi.Modifiers.HasModifier(Modifiers.Alt)) return null;
if (!Game.world.IsActorCrushableByActor(underCursor, self)) return null;
if (!self.World.IsActorCrushableByActor(underCursor, self)) return null;
}
return new Order("Move", self, null, xy, null);
@@ -50,14 +50,14 @@ namespace OpenRa.Traits
public bool CanEnterCell(int2 a)
{
if (!Game.world.BuildingInfluence.CanMoveHere(a)) return false;
if (!self.World.BuildingInfluence.CanMoveHere(a)) return false;
var crushable = true;
foreach (Actor actor in Game.world.UnitInfluence.GetUnitsAt(a))
foreach (Actor actor in self.World.UnitInfluence.GetUnitsAt(a))
{
if (actor == self) continue;
if (!Game.world.IsActorCrushableByActor(actor, self))
if (!self.World.IsActorCrushableByActor(actor, self))
{
crushable = false;
break;
@@ -66,9 +66,9 @@ namespace OpenRa.Traits
if (!crushable) return false;
return Game.world.Map.IsInMap(a.X, a.Y) &&
return self.World.Map.IsInMap(a.X, a.Y) &&
TerrainCosts.Cost(GetMovementType(),
Game.world.TileSet.GetWalkability(Game.world.Map.MapTiles[a.X, a.Y])) < double.PositiveInfinity;
self.World.TileSet.GetWalkability(self.World.Map.MapTiles[a.X, a.Y])) < double.PositiveInfinity;
}
}
}

View File

@@ -13,7 +13,7 @@ namespace OpenRa.Traits
var unit = self.traits.GetOrDefault<Unit>();
var altitude = unit != null ? unit.Altitude : 0;
Game.world.AddFrameEndTask(
self.World.AddFrameEndTask(
w => w.Add(new Bullet("UnitExplode", e.Attacker.Owner, e.Attacker,
self.CenterLocation.ToInt2(), self.CenterLocation.ToInt2(),
altitude, altitude)));

View File

@@ -28,7 +28,7 @@ namespace OpenRa.Traits
// Gap Generator building; powered down
return (self.traits.Contains<Building>() && self.traits.Get<Building>().Disabled)
? new int2[] {}
: Game.world.FindTilesInCircle(self.Location, range);
: self.World.FindTilesInCircle(self.Location, range);
}
}
}

View File

@@ -41,7 +41,7 @@ namespace OpenRa.Traits
&& underCursor.traits.Contains<AcceptsOre>() && !IsEmpty)
return new Order("Deliver", self, underCursor, int2.Zero, null);
if (underCursor == null && Game.world.Map.ContainsResource(xy))
if (underCursor == null && self.World.Map.ContainsResource(xy))
return new Order("Harvest", self, null, xy, null);
return null;

View File

@@ -8,7 +8,7 @@ namespace OpenRa.Traits
{
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
{
return Game.world.LocalPlayer == self.Owner
return self.World.LocalPlayer == self.Owner
? r : new Renderable[] { };
}
}

View File

@@ -29,7 +29,7 @@ namespace OpenRa.Traits
{
var power = self.Owner.SupportPowers[order.TargetString].Impl;
power.OnFireNotification(self, self.Location);
Game.world.AddFrameEndTask(w => w.Add(new InvulnEffect(self)));
self.World.AddFrameEndTask(w => w.Add(new InvulnEffect(self)));
RemainingTicks = (int)(Rules.General.IronCurtain * 60 * 25);
}
}

View File

@@ -25,7 +25,7 @@ namespace OpenRa.Traits
if( order.OrderString == "DeployMcv" )
{
var factBuildingInfo = Rules.Info[ "fact" ].Traits.Get<BuildingInfo>();
if( Game.world.CanPlaceBuilding( "fact", factBuildingInfo, self.Location - new int2( 1, 1 ), self ) )
if( self.World.CanPlaceBuilding( "fact", factBuildingInfo, self.Location - new int2( 1, 1 ), self ) )
{
self.CancelActivity();
self.QueueActivity( new Turn( 96 ) );

View File

@@ -21,7 +21,7 @@ namespace OpenRa.Traits
public int2 fromCell
{
get { return __fromCell; }
set { Game.world.UnitInfluence.Remove(self, this); __fromCell = value; Game.world.UnitInfluence.Add(self, this); }
set { self.World.UnitInfluence.Remove(self, this); __fromCell = value; self.World.UnitInfluence.Add(self, this); }
}
public int2 toCell
{
@@ -30,11 +30,11 @@ namespace OpenRa.Traits
{
if (self.Location != value)
{
Game.world.UnitInfluence.Remove(self, this);
self.World.UnitInfluence.Remove(self, this);
self.Location = value;
self.Owner.Shroud.Explore(self);
}
Game.world.UnitInfluence.Add(self, this);
self.World.UnitInfluence.Add(self, this);
}
}
@@ -42,7 +42,7 @@ namespace OpenRa.Traits
{
this.self = self;
__fromCell = toCell;
Game.world.UnitInfluence.Add(self, this);
self.World.UnitInfluence.Add(self, this);
}
public void TeleportTo(Actor self, int2 xy)
@@ -62,7 +62,7 @@ namespace OpenRa.Traits
{
// force-move
if (!mi.Modifiers.HasModifier(Modifiers.Alt)) return null;
if (!Game.world.IsActorCrushableByActor(underCursor, self)) return null;
if (!self.World.IsActorCrushableByActor(underCursor, self)) return null;
}
if (Util.GetEffectiveSpeed(self) == 0) return null; /* allow disabling move orders from modifiers */
@@ -93,14 +93,14 @@ namespace OpenRa.Traits
public bool CanEnterCell(int2 a)
{
if (!Game.world.BuildingInfluence.CanMoveHere(a)) return false;
if (!self.World.BuildingInfluence.CanMoveHere(a)) return false;
var crushable = true;
foreach (Actor actor in Game.world.UnitInfluence.GetUnitsAt(a))
foreach (Actor actor in self.World.UnitInfluence.GetUnitsAt(a))
{
if (actor == self) continue;
if (!Game.world.IsActorCrushableByActor(actor, self))
if (!self.World.IsActorCrushableByActor(actor, self))
{
crushable = false;
break;
@@ -109,9 +109,9 @@ namespace OpenRa.Traits
if (!crushable) return false;
return Game.world.Map.IsInMap(a.X, a.Y) &&
return self.World.Map.IsInMap(a.X, a.Y) &&
TerrainCosts.Cost(GetMovementType(),
Game.world.TileSet.GetWalkability(Game.world.Map.MapTiles[a.X, a.Y])) < double.PositiveInfinity;
self.World.TileSet.GetWalkability(self.World.Map.MapTiles[a.X, a.Y])) < double.PositiveInfinity;
}
public IEnumerable<int2> GetCurrentPath()

View File

@@ -14,7 +14,7 @@ namespace OpenRa.Traits
{
if( order.OrderString == "PlaceBuilding" )
{
Game.world.AddFrameEndTask( _ =>
self.World.AddFrameEndTask( _ =>
{
var queue = self.traits.Get<ProductionQueue>();
var unit = Rules.Info[ order.TargetString ];
@@ -22,8 +22,8 @@ namespace OpenRa.Traits
if( producing == null || producing.Item != order.TargetString || producing.RemainingTime != 0 )
return;
Game.world.CreateActor( order.TargetString, order.TargetLocation, order.Player );
if (order.Player == Game.world.LocalPlayer)
self.World.CreateActor( order.TargetString, order.TargetLocation, order.Player );
if (order.Player == self.World.LocalPlayer)
{
Sound.Play("placbldg.aud");
Sound.Play("build5.aud");

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.world.UnitInfluence.GetUnitsAt( location.Value ).Any() )
if( location == null || self.World.UnitInfluence.GetUnitsAt( location.Value ).Any() )
return false;
var newUnit = Game.world.CreateActor( producee.Name, location.Value, self.Owner );
var newUnit = self.World.CreateActor( producee.Name, location.Value, self.Owner );
newUnit.traits.Get<Unit>().Facing = CreationFacing( self, newUnit ); ;
var rp = self.traits.GetOrDefault<RallyPoint>();
@@ -86,7 +86,7 @@ namespace OpenRa.Traits
// Cancel existing primaries
foreach (var p in self.Info.Traits.Get<ProductionInfo>().Produces)
{
foreach (var b in Game.world.Actors.Where(x => x.traits.Contains<Production>()
foreach (var b in self.World.Actors.Where(x => x.traits.Contains<Production>()
&& x.Owner == self.Owner
&& x.traits.Get<Production>().IsPrimary == true
&& (x.Info.Traits.Get<ProductionInfo>().Produces.Contains(p))))

View File

@@ -49,11 +49,11 @@ namespace OpenRa.Traits
BeginProduction( unit.Category,
new ProductionItem( order.TargetString, (int)time, ui.Cost,
() => Game.world.AddFrameEndTask(
() => self.World.AddFrameEndTask(
_ =>
{
var isBuilding = unit.Traits.Contains<BuildingInfo>();
if( !hasPlayedSound && order.Player == Game.world.LocalPlayer )
if( !hasPlayedSound && order.Player == self.World.LocalPlayer )
{
Sound.Play( isBuilding ? "conscmp1.aud" : "unitrdy1.aud" );
hasPlayedSound = true;
@@ -131,7 +131,7 @@ namespace OpenRa.Traits
Actor producer = null;
// Prioritise primary structure in build order
var primaryProducers = Game.world.Actors
var primaryProducers = self.World.Actors
.Where(x => x.traits.Contains<Production>()
&& producerTypes.Contains(x.Info)
&& x.Owner == self.Owner
@@ -152,7 +152,7 @@ namespace OpenRa.Traits
// Pick the first available producer
if (producer == null)
{
producer = Game.world.Actors
producer = self.World.Actors
.Where( x => producerTypes.Contains( x.Info ) && x.Owner == self.Owner )
.FirstOrDefault();
}

View File

@@ -12,15 +12,15 @@ namespace OpenRa.Traits
{
public ProductionSurround(Actor self) : base(self) { }
static int2? FindAdjacentTile(Actor a, UnitMovementType umt)
static int2? FindAdjacentTile(Actor self, UnitMovementType umt)
{
var tiles = Footprint.Tiles(a, a.traits.Get<Traits.Building>());
var tiles = Footprint.Tiles(self, self.traits.Get<Traits.Building>());
var min = tiles.Aggregate(int2.Min) - new int2(1, 1);
var max = tiles.Aggregate(int2.Max) + new int2(1, 1);
for (var j = min.Y; j <= max.Y; j++)
for (var i = min.X; i <= max.X; i++)
if (Game.world.IsCellBuildable(new int2(i, j), umt))
if (self.World.IsCellBuildable(new int2(i, j), umt))
return new int2(i, j);
return null;

View File

@@ -28,7 +28,7 @@ namespace OpenRa.Traits
public IEnumerable<Renderable> Render(Actor self)
{
var uog = Game.controller.orderGenerator as UnitOrderGenerator;
if (uog != null && self.Owner == Game.world.LocalPlayer && uog.selection.Contains(self))
if (uog != null && self.Owner == self.World.LocalPlayer && uog.selection.Contains(self))
yield return Util.Centered(self,
anim.Image, Util.CenterOfCell(rallyPoint));
}

View File

@@ -19,7 +19,7 @@ namespace OpenRa.Traits
if( Game.skipMakeAnims )
Complete( self );
else
anim.PlayThen( "make", () => Game.world.AddFrameEndTask( _ => Complete( self ) ) );
anim.PlayThen( "make", () => self.World.AddFrameEndTask( _ => Complete( self ) ) );
DoBib(self, false);
}
@@ -45,11 +45,11 @@ namespace OpenRa.Traits
var p = self.Location + new int2(i % size, i / size + bibOffset);
if (isRemove)
{
if (Game.world.Map.MapTiles[p.X, p.Y].smudge == (byte)(i + startIndex))
Game.world.Map.MapTiles[ p.X, p.Y ].smudge = 0;
if (self.World.Map.MapTiles[p.X, p.Y].smudge == (byte)(i + startIndex))
self.World.Map.MapTiles[ p.X, p.Y ].smudge = 0;
}
else
Game.world.Map.MapTiles[p.X, p.Y].smudge = (byte)(i + startIndex);
self.World.Map.MapTiles[p.X, p.Y].smudge = (byte)(i + startIndex);
}
}
}
@@ -87,7 +87,7 @@ namespace OpenRa.Traits
break;
case DamageState.Dead:
DoBib(self, true);
Game.world.AddFrameEndTask(w => w.Add(new Explosion(self.CenterLocation.ToInt2(), 7, false)));
self.World.AddFrameEndTask(w => w.Add(new Explosion(w, self.CenterLocation.ToInt2(), 7, false)));
break;
}
}

View File

@@ -34,7 +34,7 @@ namespace OpenRa.Traits
public void Tick(Actor self)
{
var b = self.GetBounds(false);
if (isOpen && !Game.world.UnitInfluence.GetUnitsAt(((1/24f) * self.CenterLocation).ToInt2()).Any())
if (isOpen && !self.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

@@ -77,7 +77,7 @@ namespace OpenRa.Traits
if (e.DamageState == DamageState.Dead)
{
Sound.PlayVoice("Die", self);
Game.world.AddFrameEndTask(w => w.Add(new Corpse(self, e.Warhead.InfDeath)));
self.World.AddFrameEndTask(w => w.Add(new Corpse(self, e.Warhead.InfDeath)));
}
}
}

View File

@@ -22,8 +22,8 @@ namespace OpenRa.Traits
for (var j = -1; j < 2; j++)
for (var i = -1; i < 2; i++)
if (Game.SharedRandom.NextDouble() < info.Chance)
if (Game.world.OreCanSpreadInto(self.Location.X + i, self.Location.Y + j))
Game.world.Map.AddOre(self.Location.X + i, self.Location.Y + j);
if (self.World.OreCanSpreadInto(self.Location.X + i, self.Location.Y + j))
self.World.Map.AddOre(self.Location.X + i, self.Location.Y + j);
ticks = info.Interval;
}

View File

@@ -30,7 +30,7 @@ namespace OpenRa.Traits
public bool IsCrushableBy(UnitMovementType umt, Player player)
{
if (player == Game.world.LocalPlayer) return false;
if (player == self.World.LocalPlayer) return false;
switch (umt)
{
case UnitMovementType.Track: return true;

View File

@@ -18,7 +18,7 @@ namespace OpenRa.Traits
self.Owner.TakeCash(toSteal);
thief.Owner.GiveCash(toSteal);
if (Game.world.LocalPlayer == thief.Owner)
if (self.World.LocalPlayer == thief.Owner)
Sound.Play("credit1.aud");
}
@@ -27,7 +27,7 @@ namespace OpenRa.Traits
var numPips = self.Info.Traits.Get<StoresOreInfo>().Pips;
return Graphics.Util.MakeArray( numPips,
i => (Game.world.LocalPlayer.GetSiloFullness() > i * 1.0f / numPips)
i => (self.World.LocalPlayer.GetSiloFullness() > i * 1.0f / numPips)
? PipType.Yellow : PipType.Transparent );
}
}

View File

@@ -33,7 +33,7 @@ namespace OpenRa.Traits
if (remainingSurfaceTime > 0)
return rs;
if (self.Owner == Game.world.LocalPlayer)
if (self.Owner == self.World.LocalPlayer)
return rs.Select(a => a.WithPalette(PaletteType.Shadow));
else
return new Renderable[] { };

View File

@@ -23,7 +23,7 @@ namespace OpenRa.Traits
public void Damaged(Actor self, AttackInfo e)
{
if (e.DamageState == DamageState.Dead)
if (self.Owner == Game.world.LocalPlayer)
if (self.Owner == self.World.LocalPlayer)
Sound.Play(self.Info.Traits.Get<OwnedActorInfo>().WaterBound
? "navylst1.aud" : "unitlst1.aud");
}

View File

@@ -34,24 +34,24 @@ namespace OpenRa
return SheetBuilder.Add( data, new Size(Game.CellSize,Game.CellSize) );
}
public void Draw()
public void Draw( World world )
{
if (ShowUnitDebug)
for (var j = 0; j < 128; j++)
for (var i = 0; i < 128; i++)
if (Game.world.UnitInfluence.GetUnitsAt(new int2(i, j)).Any())
if (world.UnitInfluence.GetUnitsAt(new int2(i, j)).Any())
spriteRenderer.DrawSprite(unitDebug, Game.CellSize * new float2(i, j), 0);
}
public void DrawBuildingGrid( string name, BuildingInfo bi )
public void DrawBuildingGrid( World world, string name, BuildingInfo bi )
{
var position = Game.controller.MousePosition.ToInt2();
var topLeft = position - Footprint.AdjustForBuildingSize( bi );
var isCloseEnough = Game.world.IsCloseEnoughToBase(Game.world.LocalPlayer, name, bi, topLeft);
var isCloseEnough = world.IsCloseEnoughToBase(world.LocalPlayer, name, bi, topLeft);
foreach( var t in Footprint.Tiles( name, bi, topLeft ) )
spriteRenderer.DrawSprite( ( isCloseEnough && Game.world.IsCellBuildable( t, bi.WaterBound
? UnitMovementType.Float : UnitMovementType.Wheel ) && !Game.world.Map.ContainsResource( t ) )
spriteRenderer.DrawSprite( ( isCloseEnough && world.IsCellBuildable( t, bi.WaterBound
? UnitMovementType.Float : UnitMovementType.Wheel ) && !world.Map.ContainsResource( t ) )
? buildOk : buildBlocked, Game.CellSize * t, 0 );
spriteRenderer.Flush();

View File

@@ -8,11 +8,13 @@ namespace OpenRa
{
public class UnitInfluenceMap
{
readonly World world;
List<Actor>[,] influence = new List<Actor>[128, 128];
readonly int2 searchDistance = new int2(2,2);
public UnitInfluenceMap( World world )
{
this.world = world;
for (int i = 0; i < 128; i++)
for (int j = 0; j < 128; j++)
influence[ i, j ] = new List<Actor>();
@@ -25,7 +27,7 @@ namespace OpenRa
// Does this belong here? NO, but it's your mess.
// Get the crushable actors
foreach (var a in Game.world.Actors.Where(b => b.traits.Contains<ICrushable>()))
foreach (var a in world.Actors.Where(b => b.traits.Contains<ICrushable>()))
{
// Are there any units in the same cell that can crush this?
foreach( var ios in a.traits.WithInterface<IOccupySpace>() )
@@ -33,7 +35,7 @@ namespace OpenRa
{
// There should only be one (counterexample: An infantry and a tank try to pick up a crate at the same time.)
// If there is more than one, do action on the first crusher
var crusher = GetUnitsAt(cell).Where(b => a != b && Game.world.IsActorCrushableByActor(a, b)).FirstOrDefault();
var crusher = GetUnitsAt(cell).Where(b => a != b && world.IsActorCrushableByActor(a, b)).FirstOrDefault();
if (crusher != null)
{
Log.Write("{0} crushes {1}", crusher.Info.Name, a.Info.Name);
@@ -56,7 +58,7 @@ namespace OpenRa
if (!a.traits.Get<IOccupySpace>().OccupiedCells().Contains( new int2( x, y ) ) )
throw new InvalidOperationException( "UIM: Sanity check failed A" );
foreach( Actor a in Game.world.Actors )
foreach( Actor a in world.Actors )
foreach( var ios in a.traits.WithInterface<IOccupySpace>() )
foreach( var cell in ios.OccupiedCells() )
if (!influence[cell.X, cell.Y].Contains(a))

View File

@@ -24,7 +24,7 @@ namespace OpenRa
set
{
localPlayerIndex = value.Index;
Game.viewport.GoToStartLocation();
Game.viewport.GoToStartLocation( value );
}
}
@@ -110,7 +110,7 @@ namespace OpenRa
}
foreach (var a in actors) a.Tick();
foreach (var e in effects) e.Tick();
foreach (var e in effects) e.Tick( this );
Game.viewport.Tick();

View File

@@ -93,7 +93,7 @@ namespace OpenRa
{
return world.FindUnits(a, b)
.Where( x => x.traits.Contains<Selectable>() )
.GroupBy(x => (x.Owner == Game.world.LocalPlayer) ? x.Info.Traits.Get<SelectableInfo>().Priority : 0)
.GroupBy(x => (x.Owner == world.LocalPlayer) ? x.Info.Traits.Get<SelectableInfo>().Priority : 0)
.OrderByDescending(g => g.Key)
.Select( g => g.AsEnumerable() )
.DefaultIfEmpty( new Actor[] {} )

View File

@@ -55,7 +55,7 @@ namespace OpenRa.Mods.Aftermath
Sound.Play("chrotnk1.aud");
chargeTick = chargeLength;
foreach (var a in Game.world.Actors.Where(a => a.traits.Contains<ChronoshiftPaletteEffect>()))
foreach (var a in self.World.Actors.Where(a => a.traits.Contains<ChronoshiftPaletteEffect>()))
a.traits.Get<ChronoshiftPaletteEffect>().DoChronoshift();
}
}

View File

@@ -20,7 +20,7 @@ namespace OpenRa.Mods.Aftermath
{
// Override chronoshifting action to detonate vehicle
var movement = self.traits.GetOrDefault<IMovement>();
var chronosphere = Game.world.Actors.Where(a => a.Owner == order.Subject.Owner && a.traits.Contains<Chronosphere>()).FirstOrDefault();
var chronosphere = self.World.Actors.Where(a => a.Owner == order.Subject.Owner && a.traits.Contains<Chronosphere>()).FirstOrDefault();
if (order.OrderString == "Chronoshift" && movement.CanEnterCell(order.TargetLocation))
{
self.InflictDamage(chronosphere, self.Health, Rules.WarheadInfo["Super"]);
@@ -44,7 +44,7 @@ namespace OpenRa.Mods.Aftermath
var altitude = unit != null ? unit.Altitude : 0;
int2 detonateLocation = self.CenterLocation.ToInt2();
Game.world.AddFrameEndTask(
self.World.AddFrameEndTask(
w => w.Add(new Bullet(self.Info.Traits.Get<AttackBaseInfo>().PrimaryWeapon, detonatedBy.Owner, detonatedBy,
detonateLocation, detonateLocation, altitude, altitude)));
}

View File

@@ -13,7 +13,7 @@ namespace OpenRa.Mods.Aftermath.Orders
this.self = self;
}
public IEnumerable<Order> Order(int2 xy, MouseInput mi)
public IEnumerable<Order> Order(World world, int2 xy, MouseInput mi)
{
if (mi.Button == MouseButton.Left)
{
@@ -24,15 +24,15 @@ namespace OpenRa.Mods.Aftermath.Orders
yield return new Order("ChronoshiftSelf", self, null, xy, null);
}
public void Tick() { }
public void Render()
public void Tick( World world ) { }
public void Render( World world )
{
Game.world.WorldRenderer.DrawSelectionBox(self, Color.White, true);
world.WorldRenderer.DrawSelectionBox(self, Color.White, true);
}
public Cursor GetCursor(int2 xy, MouseInput mi)
public Cursor GetCursor(World world, int2 xy, MouseInput mi)
{
if (!Game.world.LocalPlayer.Shroud.IsExplored(xy))
if (!world.LocalPlayer.Shroud.IsExplored(xy))
return Cursor.MoveBlocked;
var movement = self.traits.GetOrDefault<IMovement>();

View File

@@ -37,7 +37,7 @@ namespace OpenRa.Mods.RA.Activities
}
// the engineer is sacrificed.
Game.world.AddFrameEndTask(w => w.Remove(self));
self.World.AddFrameEndTask(w => w.Remove(self));
return NextActivity;
}

View File

@@ -16,7 +16,7 @@ namespace OpenRa.Mods.RA.Activities
public IActivity Tick(Actor self)
{
if (target == null || target.IsDead) return NextActivity;
Game.world.AddFrameEndTask(w => w.Add(new DelayedAction(25*2,
self.World.AddFrameEndTask(w => w.Add(new DelayedAction(25*2,
() => target.InflictDamage(self, target.Health, Rules.WarheadInfo["DemolishWarhead"]))));
return NextActivity;
}

View File

@@ -17,7 +17,7 @@ namespace OpenRa.Mods.RA.Activities
foreach (var t in target.traits.WithInterface<IAcceptSpy>())
t.OnInfiltrate(target, self);
Game.world.AddFrameEndTask(w => w.Remove(self));
self.World.AddFrameEndTask(w => w.Remove(self));
return NextActivity;
}

View File

@@ -23,7 +23,7 @@ namespace OpenRa.Mods.RA.Activities
foreach (var t in target.traits.WithInterface<IAcceptThief>())
t.OnSteal(target, self);
Game.world.AddFrameEndTask(w => w.Remove(self));
self.World.AddFrameEndTask(w => w.Remove(self));
return NextActivity;
}

View File

@@ -21,7 +21,7 @@ namespace OpenRa.Mods.RA
public Mine(Actor self)
{
this.self = self;
Game.world.UnitInfluence.Add(self, this);
self.World.UnitInfluence.Add(self, this);
}
public void OnCrush(Actor crusher)
@@ -32,17 +32,17 @@ namespace OpenRa.Mods.RA
var info = self.Info.Traits.Get<MineInfo>();
var warhead = Rules.WarheadInfo[info.Warhead];
Game.world.AddFrameEndTask(_ =>
self.World.AddFrameEndTask(w =>
{
Game.world.Remove(self);
Game.world.Add(new Explosion(self.CenterLocation.ToInt2(), warhead.Explosion, false));
w.Remove(self);
w.Add(new Explosion(w, self.CenterLocation.ToInt2(), warhead.Explosion, false));
crusher.InflictDamage(crusher, info.Damage, warhead);
});
}
public bool IsPathableCrush(UnitMovementType umt, Player player)
{
return !self.Info.Traits.Get<MineInfo>().AvoidFriendly || (player != Game.world.LocalPlayer);
return !self.Info.Traits.Get<MineInfo>().AvoidFriendly || (player != self.World.LocalPlayer);
}
public bool IsCrushableBy(UnitMovementType umt, Player player)

View File

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

Some files were not shown because too many files have changed in this diff Show More