diff --git a/OpenRa.Game/Actor.cs b/OpenRa.Game/Actor.cs index b4c66de043..a715ebe391 100755 --- a/OpenRa.Game/Actor.cs +++ b/OpenRa.Game/Actor.cs @@ -82,7 +82,7 @@ namespace OpenRa public Order Order( int2 xy, MouseInput mi ) { - if (Owner != Game.LocalPlayer) + if (Owner != Game.world.LocalPlayer) return null; if (!Game.world.Map.IsInMap(xy.X, xy.Y)) diff --git a/OpenRa.Game/Chat.cs b/OpenRa.Game/Chat.cs index 1f66c33e46..ec4e4f45f4 100644 --- a/OpenRa.Game/Chat.cs +++ b/OpenRa.Game/Chat.cs @@ -16,8 +16,8 @@ namespace OpenRa { if (isChatting && typing.Length > 0) { - Game.controller.AddOrder(Order.Chat(Game.LocalPlayer, typing)); - AddLine(Game.LocalPlayer, typing); + Game.controller.AddOrder(Order.Chat(Game.world.LocalPlayer, typing)); + AddLine(Game.world.LocalPlayer, typing); } typing = ""; diff --git a/OpenRa.Game/Chrome.cs b/OpenRa.Game/Chrome.cs index 5fff31f78f..4eadafea70 100644 --- a/OpenRa.Game/Chrome.cs +++ b/OpenRa.Game/Chrome.cs @@ -148,10 +148,10 @@ namespace OpenRa { DrawDownloadBar(); - chromeCollection = (Game.LocalPlayer.Race == Race.Allies) ? "chrome-allies" : "chrome-soviet"; - radarCollection = (Game.LocalPlayer.Race == Race.Allies) ? "radar-allies" : "radar-soviet"; - paletteCollection = (Game.LocalPlayer.Race == Race.Allies) ? "palette-allies" : "palette-soviet"; - digitCollection = (Game.LocalPlayer.Race == Race.Allies) ? "digits-allies" : "digits-soviet"; + 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"; buttons.Clear(); @@ -305,7 +305,7 @@ namespace OpenRa void DrawRadar() { - var hasNewRadar = Game.world.Actors.Any(a => a.Owner == Game.LocalPlayer + var hasNewRadar = Game.world.Actors.Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains() && a.traits.Get().IsActive(a)); @@ -341,15 +341,15 @@ namespace OpenRa var x = paletteOrigin.X - tabWidth; var y = paletteOrigin.Y + 9; - if (currentTab == null || !Rules.TechTree.BuildableItems(Game.LocalPlayer, currentTab).Any()) + if (currentTab == null || !Rules.TechTree.BuildableItems(Game.world.LocalPlayer, currentTab).Any()) ChooseAvailableTab(); - var queue = Game.LocalPlayer.PlayerActor.traits.Get(); + var queue = Game.world.LocalPlayer.PlayerActor.traits.Get(); foreach (var q in tabImageNames) { var groupName = q.Key; - if (!Rules.TechTree.BuildableItems(Game.LocalPlayer, groupName).Any()) + if (!Rules.TechTree.BuildableItems(Game.world.LocalPlayer, groupName).Any()) { CheckDeadTab(groupName); continue; @@ -357,7 +357,7 @@ namespace OpenRa 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.LocalPlayer.Race == Race.Allies) ? "allies" : "soviet"; + var race = (Game.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), @@ -380,20 +380,20 @@ namespace OpenRa void CheckDeadTab( string groupName ) { - var queue = Game.LocalPlayer.PlayerActor.traits.Get(); + var queue = Game.world.LocalPlayer.PlayerActor.traits.Get(); foreach( var item in queue.AllItems( groupName ) ) - Game.controller.AddOrder(Order.CancelProduction(Game.LocalPlayer, item.Item)); + Game.controller.AddOrder(Order.CancelProduction(Game.world.LocalPlayer, item.Item)); } void ChooseAvailableTab() { currentTab = tabImageNames.Select(q => q.Key).FirstOrDefault( - t => Rules.TechTree.BuildableItems(Game.LocalPlayer, t).Any()); + t => Rules.TechTree.BuildableItems(Game.world.LocalPlayer, t).Any()); } void DrawMoney() { - var moneyDigits = Game.LocalPlayer.DisplayCash.ToString(); + var moneyDigits = Game.world.LocalPlayer.DisplayCash.ToString(); var x = Game.viewport.Width - 65; foreach (var d in moneyDigits.Reverse()) { @@ -408,7 +408,7 @@ namespace OpenRa void DrawPower() { // Nothing to draw - if (Game.LocalPlayer.PowerProvided == 0 && Game.LocalPlayer.PowerDrained == 0) + if (Game.world.LocalPlayer.PowerProvided == 0 && Game.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.LocalPlayer.PowerProvided, Game.LocalPlayer.PowerDrained); + var maxPower = Math.Max(Game.world.LocalPlayer.PowerProvided, Game.world.LocalPlayer.PowerDrained); while (maxPower >= powerScaleBy) powerScaleBy *= 2; // Current power supply - var powerLevelTemp = barStart.X + (barEnd.X - barStart.X) * (Game.LocalPlayer.PowerProvided / powerScaleBy); + var powerLevelTemp = barStart.X + (barEnd.X - barStart.X) * (Game.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.LocalPlayer.GetPowerState() == PowerState.Low) + if (Game.world.LocalPlayer.GetPowerState() == PowerState.Low) color = Color.Orange; - if (Game.LocalPlayer.GetPowerState() == PowerState.Critical) + if (Game.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.LocalPlayer.PowerDrained / powerScaleBy); + var powerDrainedTemp = barStart.X + (barEnd.X - barStart.X) * (Game.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); @@ -463,7 +463,7 @@ namespace OpenRa 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.LocalPlayer && a.traits.Contains()); + var hasFact = Game.world.Actors.Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains()); if (Game.Settings.RepairRequiresConyard && !hasFact) repairButton.ReplaceAnim("disabled"); @@ -641,14 +641,14 @@ namespace OpenRa var x = 0; var y = 0; - var buildableItems = Rules.TechTree.BuildableItems(Game.LocalPlayer, queueName).ToArray(); + var buildableItems = Rules.TechTree.BuildableItems(Game.world.LocalPlayer, queueName).ToArray(); - var allBuildables = Rules.TechTree.AllBuildables(Game.LocalPlayer, queueName) + var allBuildables = Rules.TechTree.AllBuildables(Game.world.LocalPlayer, queueName) .Where(a => a.Traits.Contains()) - .Where(a => a.Traits.Get().Owner.Contains(Game.LocalPlayer.Race)) + .Where(a => a.Traits.Get().Owner.Contains(Game.world.LocalPlayer.Race)) .OrderBy(a => a.Traits.Get().TechLevel); - var queue = Game.LocalPlayer.PlayerActor.traits.Get(); + var queue = Game.world.LocalPlayer.PlayerActor.traits.Get(); var overlayBits = new List>(); @@ -760,12 +760,12 @@ namespace OpenRa { var unit = Rules.Info[item]; Sound.Play(unit.Traits.Contains() ? "abldgin1.aud" : "train1.aud"); - Game.controller.AddOrder(Order.StartProduction(Game.LocalPlayer, item)); + Game.controller.AddOrder(Order.StartProduction(Game.world.LocalPlayer, item)); } void HandleBuildPalette(string item, bool isLmb) { - var player = Game.LocalPlayer; + var player = Game.world.LocalPlayer; var unit = Rules.Info[item]; var queue = player.PlayerActor.traits.Get(); var producing = queue.AllItems(unit.Category).FirstOrDefault( a => a.Item == item ); @@ -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.LocalPlayer.Cash + Game.LocalPlayer.Ore >= buildable.Cost ? Color.White : Color.Red); + Game.world.LocalPlayer.Cash + Game.world.LocalPlayer.Ore >= buildable.Cost ? Color.White : Color.Red); var bi = info.Traits.GetOrDefault(); if (bi != null) DrawRightAligned("ϟ{0}".F(bi.Power), pos + new int2(-5, 20), - Game.LocalPlayer.PowerProvided - Game.LocalPlayer.PowerDrained + bi.Power >= 0 + Game.world.LocalPlayer.PowerProvided - Game.world.LocalPlayer.PowerDrained + bi.Power >= 0 ? Color.White : Color.Red); - var buildings = Rules.TechTree.GatherBuildings( Game.LocalPlayer ); + var buildings = Rules.TechTree.GatherBuildings( Game.world.LocalPlayer ); p += new int2(5, 5); p += new int2(0, 15); - if (!Rules.TechTree.CanBuild(info, Game.LocalPlayer, buildings)) + if (!Rules.TechTree.CanBuild(info, Game.world.LocalPlayer, buildings)) { var prereqs = buildable.Prerequisites .Select( a => Description( a ) ); @@ -893,7 +893,7 @@ namespace OpenRa void DrawSupportPowers() { - var numPowers = Game.LocalPlayer.SupportPowers.Values + var numPowers = Game.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.LocalPlayer.SupportPowers) + foreach (var sp in Game.world.LocalPlayer.SupportPowers) { var image = spsprites[sp.Key]; if (sp.Value.IsAvailable) @@ -977,7 +977,7 @@ namespace OpenRa renderer.DrawText2(info.Description, pos, Color.White); - var timer = "Charge Time: {0}".F(FormatTime(Game.LocalPlayer.SupportPowers[sp].RemainingTime)); + var timer = "Charge Time: {0}".F(FormatTime(Game.world.LocalPlayer.SupportPowers[sp].RemainingTime)); DrawRightAligned(timer, pos + new int2((int)tooltipSprite.size.X - 10, 0), Color.White); if (info.LongDesc != null) diff --git a/OpenRa.Game/Controller.cs b/OpenRa.Game/Controller.cs index eb17ecb269..9053b2eafd 100644 --- a/OpenRa.Game/Controller.cs +++ b/OpenRa.Game/Controller.cs @@ -51,7 +51,7 @@ namespace OpenRa recentOrders.AddRange( orders ); var voicedActor = orders.Select(o => o.Subject) - .FirstOrDefault(a => a.Owner == Game.LocalPlayer && a.traits.Contains()); + .FirstOrDefault(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains()); var isMove = orders.Any(o => o.OrderString == "Move"); var isAttack = orders.Any( o => o.OrderString == "Attack" ); @@ -127,7 +127,7 @@ namespace OpenRa var voicedUnit = ((UnitOrderGenerator)orderGenerator).selection .Where(a => a.traits.Contains() - && a.Owner == Game.LocalPlayer) + && a.Owner == Game.world.LocalPlayer) .FirstOrDefault(); Sound.PlayVoice("Select", voicedUnit); diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index 0c91913c13..14a1e96041 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -24,20 +24,6 @@ namespace OpenRa internal static OrderManager orderManager; - static int localPlayerIndex; - - public static Dictionary players = new Dictionary(); - - public static Player LocalPlayer - { - get { return players[localPlayerIndex]; } - set - { - localPlayerIndex = value.Index; - viewport.GoToStartLocation(); - } - } - public static bool skipMakeAnims = true; internal static Renderer renderer; @@ -73,13 +59,6 @@ namespace OpenRa palette = new HardwarePalette(renderer, world.Map); - for (int i = 0; i < 8; i++) - { - var race = players.ContainsKey(i) ? players[i].Race : Race.Allies; - var name = players.ContainsKey(i) ? players[i].PlayerName : "Player {0}".F(i+1); - players[i] = new Player(i, LobbyInfo.Clients.FirstOrDefault(a => a.Index == i)); - } - SequenceProvider.Initialize(manifest.Sequences); viewport = new Viewport(clientSize, Game.world.Map.Offset, Game.world.Map.Offset + Game.world.Map.Size, renderer); @@ -87,7 +66,7 @@ namespace OpenRa foreach (var treeReference in Game.world.Map.Trees) world.CreateActor(treeReference.Image, new int2(treeReference.Location), null); - LoadMapActors(Rules.AllRules); + world.LoadMapActors(Rules.AllRules); skipMakeAnims = false; chrome = new Chrome(renderer); @@ -95,7 +74,7 @@ namespace OpenRa internal static void Initialize(string mapName, Renderer renderer, int2 clientSize, int localPlayer, Controller controller) { - localPlayerIndex = localPlayer; + //localPlayerIndex = localPlayer; Game.renderer = renderer; Game.clientSize = clientSize; @@ -120,22 +99,6 @@ namespace OpenRa } } - static void LoadMapActors(IniFile mapfile) - { - var toLoad = - mapfile.GetSection("STRUCTURES", true) - .Concat(mapfile.GetSection("UNITS", true)); - - foreach (var s in toLoad) - { - //num=owner,type,health,location,facing,... - var parts = s.Value.Split( ',' ); - var loc = int.Parse(parts[3]); - world.CreateActor(parts[1].ToLowerInvariant(), new int2(loc % 128, loc / 128), - players.Values.FirstOrDefault(p => p.InternalName == parts[0]) ?? players[0]); - } - } - static int lastTime = Environment.TickCount; public static void ResetTimer() @@ -173,8 +136,6 @@ namespace OpenRa controller.orderGenerator.Tick(); world.Tick(); - foreach (var player in players.Values) - player.Tick(); } else if (orderManager.FrameNumber == 0) @@ -229,7 +190,7 @@ namespace OpenRa FieldLoader.Load(client, y.Value); session.Clients.Add(client); - players[index].SyncFromLobby(client); + world.players[index].SyncFromLobby(client); } LobbyInfo = session; @@ -260,7 +221,7 @@ namespace OpenRa // todo: spawn more than one unit, in most cases! var sp = ChooseSpawnPoint(available, taken); - world.CreateActor("mcv", sp, players[client.Index]); + world.CreateActor("mcv", sp, world.players[client.Index]); } Game.viewport.GoToStartLocation(); diff --git a/OpenRa.Game/Graphics/Minimap.cs b/OpenRa.Game/Graphics/Minimap.cs index d1232f8573..254a6f9fec 100644 --- a/OpenRa.Game/Graphics/Minimap.cs +++ b/OpenRa.Game/Graphics/Minimap.cs @@ -81,7 +81,7 @@ namespace OpenRa.Graphics mapOnlySheet.Texture.SetData(oreLayer); - if (!world.Actors.Any(a => a.Owner == Game.LocalPlayer && a.traits.Contains())) + if (!world.Actors.Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains())) 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.LocalPlayer.Shroud.DisplayOnRadar(x, y)) + if (!Game.world.LocalPlayer.Shroud.DisplayOnRadar(x, y)) *(c + (y * bitmapData.Stride >> 2) + x) = shroudColor.ToArgb(); } } diff --git a/OpenRa.Game/Graphics/Viewport.cs b/OpenRa.Game/Graphics/Viewport.cs index e855eee52b..9d923cddaf 100644 --- a/OpenRa.Game/Graphics/Viewport.cs +++ b/OpenRa.Game/Graphics/Viewport.cs @@ -129,7 +129,7 @@ namespace OpenRa.Graphics public void GoToStartLocation() { - Center(Game.world.Actors.Where(a => a.Owner == Game.LocalPlayer && a.traits.Contains())); + Center(Game.world.Actors.Where(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains())); } } } diff --git a/OpenRa.Game/Graphics/WorldRenderer.cs b/OpenRa.Game/Graphics/WorldRenderer.cs index b4d227041f..5683a72832 100644 --- a/OpenRa.Game/Graphics/WorldRenderer.cs +++ b/OpenRa.Game/Graphics/WorldRenderer.cs @@ -82,7 +82,7 @@ namespace OpenRa.Graphics if (Game.controller.orderGenerator != null) Game.controller.orderGenerator.Render(); - Game.LocalPlayer.Shroud.Draw(spriteRenderer); + Game.world.LocalPlayer.Shroud.Draw(spriteRenderer); lineRenderer.Flush(); spriteRenderer.Flush(); @@ -131,7 +131,7 @@ namespace OpenRa.Graphics DrawControlGroup(selectedUnit, xy); // Only display pips and tags to the owner - if (selectedUnit.Owner == Game.LocalPlayer) + if (selectedUnit.Owner == Game.world.LocalPlayer) { DrawPips(selectedUnit, xY); DrawTags(selectedUnit, new float2(.5f * (bounds.Left + bounds.Right ), xy.Y)); diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index a8c4f02239..ab8652ddea 100755 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -144,12 +144,12 @@ namespace OpenRa if (e.KeyCode == Keys.F8 && !Game.orderManager.GameStarted) { Game.controller.AddOrder( - new Order( "ToggleReady", Game.LocalPlayer.PlayerActor, null, int2.Zero, "") { IsImmediate = true }); + new Order( "ToggleReady", Game.world.LocalPlayer.PlayerActor, null, int2.Zero, "") { IsImmediate = true }); } /* temporary hack: DO NOT LEAVE IN */ if (e.KeyCode == Keys.F2) - Game.LocalPlayer = Game.players[(Game.LocalPlayer.Index + 1) % 4]; + 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) diff --git a/OpenRa.Game/Orders/ChronoshiftDestinationOrderGenerator.cs b/OpenRa.Game/Orders/ChronoshiftDestinationOrderGenerator.cs index 1e2eeb11e8..95f6c95cb5 100644 --- a/OpenRa.Game/Orders/ChronoshiftDestinationOrderGenerator.cs +++ b/OpenRa.Game/Orders/ChronoshiftDestinationOrderGenerator.cs @@ -37,7 +37,7 @@ namespace OpenRa.Orders public Cursor GetCursor(int2 xy, MouseInput mi) { - if (!Game.LocalPlayer.Shroud.IsExplored(xy)) + if (!Game.world.LocalPlayer.Shroud.IsExplored(xy)) return Cursor.MoveBlocked; var movement = self.traits.GetOrDefault(); diff --git a/OpenRa.Game/Orders/ChronosphereSelectOrderGenerator.cs b/OpenRa.Game/Orders/ChronosphereSelectOrderGenerator.cs index d83271fb9a..7e9d39b5ae 100644 --- a/OpenRa.Game/Orders/ChronosphereSelectOrderGenerator.cs +++ b/OpenRa.Game/Orders/ChronosphereSelectOrderGenerator.cs @@ -29,7 +29,7 @@ namespace OpenRa.Orders { var loc = mi.Location + Game.viewport.Location; var underCursor = Game.world.FindUnits(loc, loc) - .Where(a => a.Owner == Game.LocalPlayer + .Where(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains() && a.traits.Contains()).FirstOrDefault(); @@ -41,7 +41,7 @@ namespace OpenRa.Orders public void Tick() { var hasChronosphere = Game.world.Actors - .Any(a => a.Owner == Game.LocalPlayer && a.traits.Contains()); + .Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains()); if (!hasChronosphere) Game.controller.CancelInputMode(); diff --git a/OpenRa.Game/Orders/IronCurtainOrderGenerator.cs b/OpenRa.Game/Orders/IronCurtainOrderGenerator.cs index 8d46ad6c84..6c5e747b8e 100644 --- a/OpenRa.Game/Orders/IronCurtainOrderGenerator.cs +++ b/OpenRa.Game/Orders/IronCurtainOrderGenerator.cs @@ -29,7 +29,7 @@ namespace OpenRa.Orders { var loc = mi.Location + Game.viewport.Location; var underCursor = Game.world.FindUnits(loc, loc) - .Where(a => a.Owner == Game.LocalPlayer + .Where(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains() && a.traits.Contains()).FirstOrDefault(); @@ -41,7 +41,7 @@ namespace OpenRa.Orders public void Tick() { var hasStructure = Game.world.Actors - .Any(a => a.Owner == Game.LocalPlayer && a.traits.Contains()); + .Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains()); if (!hasStructure) Game.controller.CancelInputMode(); diff --git a/OpenRa.Game/Orders/Order.cs b/OpenRa.Game/Orders/Order.cs index d8d0b33027..37daf1d52b 100644 --- a/OpenRa.Game/Orders/Order.cs +++ b/OpenRa.Game/Orders/Order.cs @@ -66,7 +66,7 @@ namespace OpenRa static Player LookupPlayer(uint index) { - return Game.players + return Game.world.players .Where(x => x.Value.Index == index) .First().Value; } diff --git a/OpenRa.Game/Orders/PowerDownOrderGenerator.cs b/OpenRa.Game/Orders/PowerDownOrderGenerator.cs index 5debd3ebdd..9ed1da8b51 100644 --- a/OpenRa.Game/Orders/PowerDownOrderGenerator.cs +++ b/OpenRa.Game/Orders/PowerDownOrderGenerator.cs @@ -23,7 +23,7 @@ namespace OpenRa.Orders { var loc = mi.Location + Game.viewport.Location; var underCursor = Game.world.FindUnits(loc, loc) - .Where(a => a.Owner == Game.LocalPlayer + .Where(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains() && a.traits.Contains()).FirstOrDefault(); diff --git a/OpenRa.Game/Orders/RepairOrderGenerator.cs b/OpenRa.Game/Orders/RepairOrderGenerator.cs index 834803c4ef..a46eb568ff 100644 --- a/OpenRa.Game/Orders/RepairOrderGenerator.cs +++ b/OpenRa.Game/Orders/RepairOrderGenerator.cs @@ -23,7 +23,7 @@ namespace OpenRa.Orders { var loc = mi.Location + Game.viewport.Location; var underCursor = Game.world.FindUnits(loc, loc) - .Where(a => a.Owner == Game.LocalPlayer + .Where(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains() && a.traits.Contains()).FirstOrDefault(); @@ -40,7 +40,7 @@ namespace OpenRa.Orders return; var hasFact = Game.world.Actors - .Any(a => a.Owner == Game.LocalPlayer && a.traits.Contains()); + .Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains()); if (!hasFact) Game.controller.CancelInputMode(); diff --git a/OpenRa.Game/Orders/SellOrderGenerator.cs b/OpenRa.Game/Orders/SellOrderGenerator.cs index 7ddf9a3039..05aef8547d 100644 --- a/OpenRa.Game/Orders/SellOrderGenerator.cs +++ b/OpenRa.Game/Orders/SellOrderGenerator.cs @@ -23,7 +23,7 @@ namespace OpenRa.Orders { var loc = mi.Location + Game.viewport.Location; var underCursor = Game.world.FindUnits(loc, loc) - .Where(a => a.Owner == Game.LocalPlayer + .Where(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains() && a.traits.Contains()).FirstOrDefault(); diff --git a/OpenRa.Game/Orders/UnitOrders.cs b/OpenRa.Game/Orders/UnitOrders.cs index 3ce0f21b7a..c5c9986928 100644 --- a/OpenRa.Game/Orders/UnitOrders.cs +++ b/OpenRa.Game/Orders/UnitOrders.cs @@ -19,7 +19,7 @@ namespace OpenRa.Orders } case "AssignPlayer": { - Game.LocalPlayer = order.Player; + Game.world.LocalPlayer = order.Player; Game.chat.AddLine(order.Player, "is now YOU."); break; } diff --git a/OpenRa.Game/PackageDownloader.cs b/OpenRa.Game/PackageDownloader.cs index 74001b2fc0..7370c786da 100644 --- a/OpenRa.Game/PackageDownloader.cs +++ b/OpenRa.Game/PackageDownloader.cs @@ -68,7 +68,7 @@ namespace OpenRa Game.chat.AddLine(Color.White, "Debug", "Requesting package: {0}".F(currentPackage)); Game.controller.AddOrder( - new Order("RequestFile", Game.LocalPlayer.PlayerActor, null, int2.Zero, currentPackage) { IsImmediate = true }); + new Order("RequestFile", Game.world.LocalPlayer.PlayerActor, null, int2.Zero, currentPackage) { IsImmediate = true }); Fraction = 0f; } diff --git a/OpenRa.Game/Player.cs b/OpenRa.Game/Player.cs index ed04322981..492260011d 100644 --- a/OpenRa.Game/Player.cs +++ b/OpenRa.Game/Player.cs @@ -29,10 +29,10 @@ namespace OpenRa public Shroud Shroud; public Dictionary SupportPowers; - public Player( int index, Session.Client client ) + public Player( World world, int index, Session.Client client ) { Shroud = new Shroud(this); - this.PlayerActor = Game.world.CreateActor("Player", new int2(int.MaxValue, int.MaxValue), this); + this.PlayerActor = world.CreateActor("Player", new int2(int.MaxValue, int.MaxValue), this); this.Index = index; this.InternalName = "Multi{0}".F(index); @@ -91,7 +91,7 @@ namespace OpenRa void GiveAdvice(string advice) { - if (this != Game.LocalPlayer) return; + if (this != Game.world.LocalPlayer) return; // todo: store the condition or something. // repeat after Rules.General.SpeakDelay, as long as the condition holds. Sound.Play(advice); @@ -135,7 +135,7 @@ namespace OpenRa foreach (var sp in SupportPowers.Values) sp.Tick(); - if (this == Game.LocalPlayer) + if (this == Game.world.LocalPlayer) { var totalMoney = Cash + Ore; diff --git a/OpenRa.Game/Traits/Activities/DeployMcv.cs b/OpenRa.Game/Traits/Activities/DeployMcv.cs index c08de8a759..be7bd22ee5 100755 --- a/OpenRa.Game/Traits/Activities/DeployMcv.cs +++ b/OpenRa.Game/Traits/Activities/DeployMcv.cs @@ -12,7 +12,7 @@ namespace OpenRa.Traits.Activities { self.Health = 0; Game.world.Remove( self ); - if (self.Owner == Game.LocalPlayer) + if (self.Owner == Game.world.LocalPlayer) { Sound.Play("placbldg.aud"); Sound.Play("build5.aud"); diff --git a/OpenRa.Game/Traits/AttackBase.cs b/OpenRa.Game/Traits/AttackBase.cs index d43434412c..58d95cdbce 100644 --- a/OpenRa.Game/Traits/AttackBase.cs +++ b/OpenRa.Game/Traits/AttackBase.cs @@ -205,7 +205,7 @@ namespace OpenRa.Traits self.CancelActivity(); QueueAttack(self, order); - if (self.Owner == Game.LocalPlayer) + if (self.Owner == Game.world.LocalPlayer) Game.world.AddFrameEndTask(w => w.Add(new FlashTarget(order.TargetActor))); } else diff --git a/OpenRa.Game/Traits/Cloak.cs b/OpenRa.Game/Traits/Cloak.cs index be64914098..7af40d6f5b 100644 --- a/OpenRa.Game/Traits/Cloak.cs +++ b/OpenRa.Game/Traits/Cloak.cs @@ -30,7 +30,7 @@ namespace OpenRa.Traits if (remainingUncloakTime > 0) return rs; - if (self.Owner == Game.LocalPlayer) + if (self.Owner == Game.world.LocalPlayer) return rs.Select(a => a.WithPalette(PaletteType.Shadow)); else return new Renderable[] { }; diff --git a/OpenRa.Game/Traits/InvisibleToOthers.cs b/OpenRa.Game/Traits/InvisibleToOthers.cs index 7548c9a0c9..c42e12b3de 100644 --- a/OpenRa.Game/Traits/InvisibleToOthers.cs +++ b/OpenRa.Game/Traits/InvisibleToOthers.cs @@ -8,7 +8,7 @@ namespace OpenRa.Traits { public IEnumerable ModifyRender(Actor self, IEnumerable r) { - return Game.LocalPlayer == self.Owner + return Game.world.LocalPlayer == self.Owner ? r : new Renderable[] { }; } } diff --git a/OpenRa.Game/Traits/PlaceBuilding.cs b/OpenRa.Game/Traits/PlaceBuilding.cs index 114302dfde..64ff2ccac6 100755 --- a/OpenRa.Game/Traits/PlaceBuilding.cs +++ b/OpenRa.Game/Traits/PlaceBuilding.cs @@ -23,7 +23,7 @@ namespace OpenRa.Traits return; Game.world.CreateActor( order.TargetString, order.TargetLocation, order.Player ); - if (order.Player == Game.LocalPlayer) + if (order.Player == Game.world.LocalPlayer) { Sound.Play("placbldg.aud"); Sound.Play("build5.aud"); diff --git a/OpenRa.Game/Traits/ProductionQueue.cs b/OpenRa.Game/Traits/ProductionQueue.cs index bab9f9e0db..01585f6a2d 100755 --- a/OpenRa.Game/Traits/ProductionQueue.cs +++ b/OpenRa.Game/Traits/ProductionQueue.cs @@ -53,7 +53,7 @@ namespace OpenRa.Traits _ => { var isBuilding = unit.Traits.Contains(); - if( !hasPlayedSound && order.Player == Game.LocalPlayer ) + if( !hasPlayedSound && order.Player == Game.world.LocalPlayer ) { Sound.Play( isBuilding ? "conscmp1.aud" : "unitrdy1.aud" ); hasPlayedSound = true; diff --git a/OpenRa.Game/Traits/RallyPoint.cs b/OpenRa.Game/Traits/RallyPoint.cs index dc4187566d..e53b225122 100644 --- a/OpenRa.Game/Traits/RallyPoint.cs +++ b/OpenRa.Game/Traits/RallyPoint.cs @@ -28,7 +28,7 @@ namespace OpenRa.Traits public IEnumerable Render(Actor self) { var uog = Game.controller.orderGenerator as UnitOrderGenerator; - if (uog != null && self.Owner == Game.LocalPlayer && uog.selection.Contains(self)) + if (uog != null && self.Owner == Game.world.LocalPlayer && uog.selection.Contains(self)) yield return Util.Centered(self, anim.Image, Util.CenterOfCell(rallyPoint)); } diff --git a/OpenRa.Game/Traits/SquishByTank.cs b/OpenRa.Game/Traits/SquishByTank.cs index 990053b0f0..46584a8901 100644 --- a/OpenRa.Game/Traits/SquishByTank.cs +++ b/OpenRa.Game/Traits/SquishByTank.cs @@ -30,7 +30,7 @@ namespace OpenRa.Traits public bool IsCrushableBy(UnitMovementType umt, Player player) { - if (player == Game.LocalPlayer) return false; + if (player == Game.world.LocalPlayer) return false; switch (umt) { case UnitMovementType.Track: return true; diff --git a/OpenRa.Game/Traits/StoresOre.cs b/OpenRa.Game/Traits/StoresOre.cs index cdc54e538f..fd9233cbcf 100644 --- a/OpenRa.Game/Traits/StoresOre.cs +++ b/OpenRa.Game/Traits/StoresOre.cs @@ -18,7 +18,7 @@ namespace OpenRa.Traits self.Owner.TakeCash(toSteal); thief.Owner.GiveCash(toSteal); - if (Game.LocalPlayer == thief.Owner) + if (Game.world.LocalPlayer == thief.Owner) Sound.Play("credit1.aud"); } @@ -27,7 +27,7 @@ namespace OpenRa.Traits var numPips = self.Info.Traits.Get().Pips; return Graphics.Util.MakeArray( numPips, - i => (Game.LocalPlayer.GetSiloFullness() > i * 1.0f / numPips) + i => (Game.world.LocalPlayer.GetSiloFullness() > i * 1.0f / numPips) ? PipType.Yellow : PipType.Transparent ); } } diff --git a/OpenRa.Game/Traits/Submarine.cs b/OpenRa.Game/Traits/Submarine.cs index 81af54a7dc..cd157a46ff 100644 --- a/OpenRa.Game/Traits/Submarine.cs +++ b/OpenRa.Game/Traits/Submarine.cs @@ -33,7 +33,7 @@ namespace OpenRa.Traits if (remainingSurfaceTime > 0) return rs; - if (self.Owner == Game.LocalPlayer) + if (self.Owner == Game.world.LocalPlayer) return rs.Select(a => a.WithPalette(PaletteType.Shadow)); else return new Renderable[] { }; diff --git a/OpenRa.Game/Traits/Unit.cs b/OpenRa.Game/Traits/Unit.cs index 5a03e24695..a1b9875803 100755 --- a/OpenRa.Game/Traits/Unit.cs +++ b/OpenRa.Game/Traits/Unit.cs @@ -23,7 +23,7 @@ namespace OpenRa.Traits public void Damaged(Actor self, AttackInfo e) { if (e.DamageState == DamageState.Dead) - if (self.Owner == Game.LocalPlayer) + if (self.Owner == Game.world.LocalPlayer) Sound.Play(self.Info.Traits.Get().WaterBound ? "navylst1.aud" : "unitlst1.aud"); } diff --git a/OpenRa.Game/UiOverlay.cs b/OpenRa.Game/UiOverlay.cs index 55a6dbb667..0af585ffc1 100644 --- a/OpenRa.Game/UiOverlay.cs +++ b/OpenRa.Game/UiOverlay.cs @@ -47,7 +47,7 @@ namespace OpenRa { var position = Game.controller.MousePosition.ToInt2(); var topLeft = position - Footprint.AdjustForBuildingSize( bi ); - var isCloseEnough = Game.world.IsCloseEnoughToBase(Game.LocalPlayer, name, bi, topLeft); + var isCloseEnough = Game.world.IsCloseEnoughToBase(Game.world.LocalPlayer, name, bi, topLeft); foreach( var t in Footprint.Tiles( name, bi, topLeft ) ) spriteRenderer.DrawSprite( ( isCloseEnough && Game.world.IsCellBuildable( t, bi.WaterBound diff --git a/OpenRa.Game/World.cs b/OpenRa.Game/World.cs index 721f8d5854..f970f2995f 100644 --- a/OpenRa.Game/World.cs +++ b/OpenRa.Game/World.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using OpenRa.Effects; using OpenRa.Support; using OpenRa.FileFormats; @@ -14,6 +15,19 @@ namespace OpenRa List effects = new List(); List> frameEndActions = new List>(); + public readonly Dictionary players = new Dictionary(); + + int localPlayerIndex; + public Player LocalPlayer + { + get { return players[localPlayerIndex]; } + set + { + localPlayerIndex = value.Index; + Game.viewport.GoToStartLocation(); + } + } + public readonly BuildingInfluenceMap BuildingInfluence; public readonly UnitInfluenceMap UnitInfluence; @@ -46,6 +60,9 @@ namespace OpenRa CreateActor("World", new int2(int.MaxValue, int.MaxValue), null); + for (int i = 0; i < 8; i++) + players[i] = new Player(this, i, Game.LobbyInfo.Clients.FirstOrDefault(a => a.Index == i)); + Bridges.MakeBridges(this); PathFinder = new PathFinder(this); @@ -104,6 +121,8 @@ namespace OpenRa UnitInfluence.Tick(); Minimap.Update(); + foreach (var player in players.Values) + player.Tick(); } public IEnumerable Actors { get { return actors; } } diff --git a/OpenRa.Game/WorldUtils.cs b/OpenRa.Game/WorldUtils.cs index 3453d74864..925db9fdca 100755 --- a/OpenRa.Game/WorldUtils.cs +++ b/OpenRa.Game/WorldUtils.cs @@ -4,6 +4,7 @@ using System.Linq; using OpenRa.Traits; using System.Drawing; using OpenRa.GameRules; +using OpenRa.FileFormats; namespace OpenRa { @@ -92,7 +93,7 @@ namespace OpenRa { return world.FindUnits(a, b) .Where( x => x.traits.Contains() ) - .GroupBy(x => (x.Owner == Game.LocalPlayer) ? x.Info.Traits.Get().Priority : 0) + .GroupBy(x => (x.Owner == Game.world.LocalPlayer) ? x.Info.Traits.Get().Priority : 0) .OrderByDescending(g => g.Key) .Select( g => g.AsEnumerable() ) .DefaultIfEmpty( new Actor[] {} ) @@ -150,5 +151,21 @@ namespace OpenRa return xy; } + + public static void LoadMapActors(this World world, IniFile mapfile) + { + var toLoad = + mapfile.GetSection("STRUCTURES", true) + .Concat(mapfile.GetSection("UNITS", true)); + + foreach (var s in toLoad) + { + //num=owner,type,health,location,facing,... + var parts = s.Value.Split( ',' ); + var loc = int.Parse(parts[3]); + world.CreateActor(parts[1].ToLowerInvariant(), new int2(loc % 128, loc / 128), + world.players.Values.FirstOrDefault(p => p.InternalName == parts[0]) ?? world.players[0]); + } + } } } diff --git a/OpenRa.Mods.Aftermath/Orders/SetChronoTankDestination.cs b/OpenRa.Mods.Aftermath/Orders/SetChronoTankDestination.cs index fb9b855f3d..efc999aef9 100644 --- a/OpenRa.Mods.Aftermath/Orders/SetChronoTankDestination.cs +++ b/OpenRa.Mods.Aftermath/Orders/SetChronoTankDestination.cs @@ -32,7 +32,7 @@ namespace OpenRa.Mods.Aftermath.Orders public Cursor GetCursor(int2 xy, MouseInput mi) { - if (!Game.LocalPlayer.Shroud.IsExplored(xy)) + if (!Game.world.LocalPlayer.Shroud.IsExplored(xy)) return Cursor.MoveBlocked; var movement = self.traits.GetOrDefault(); diff --git a/OpenRa.Mods.RA/Mine.cs b/OpenRa.Mods.RA/Mine.cs index 87d6e49d3f..03883b9209 100644 --- a/OpenRa.Mods.RA/Mine.cs +++ b/OpenRa.Mods.RA/Mine.cs @@ -42,7 +42,7 @@ namespace OpenRa.Mods.RA public bool IsPathableCrush(UnitMovementType umt, Player player) { - return !self.Info.Traits.Get().AvoidFriendly || (player != Game.LocalPlayer); + return !self.Info.Traits.Get().AvoidFriendly || (player != Game.world.LocalPlayer); } public bool IsCrushableBy(UnitMovementType umt, Player player) diff --git a/OpenRa.Mods.RA/RenderSpy.cs b/OpenRa.Mods.RA/RenderSpy.cs index 46178b326c..122ad6612a 100644 --- a/OpenRa.Mods.RA/RenderSpy.cs +++ b/OpenRa.Mods.RA/RenderSpy.cs @@ -21,15 +21,15 @@ namespace OpenRa.Mods.RA public IEnumerable ModifyRender(Actor self, IEnumerable r) { - if (self.Owner == Game.LocalPlayer) + if (self.Owner == Game.world.LocalPlayer) return r; - return r.Select(a => a.WithPalette(Game.LocalPlayer.Palette)); + return r.Select(a => a.WithPalette(Game.world.LocalPlayer.Palette)); } public override void Tick(Actor self) { - anim.ChangeImage(self.Owner == Game.LocalPlayer ? GetImage(self) : "e1"); + anim.ChangeImage(self.Owner == Game.world.LocalPlayer ? GetImage(self) : "e1"); base.Tick(self); } }