moved Game.players, LocalPlayer, localPlayerIndex to World. Setting LocalPlayer via settings is broken.

This commit is contained in:
Bob
2010-01-21 12:19:25 +13:00
parent b037250054
commit d07b782044
36 changed files with 120 additions and 123 deletions

View File

@@ -82,7 +82,7 @@ namespace OpenRa
public Order Order( int2 xy, MouseInput mi ) public Order Order( int2 xy, MouseInput mi )
{ {
if (Owner != Game.LocalPlayer) if (Owner != Game.world.LocalPlayer)
return null; return null;
if (!Game.world.Map.IsInMap(xy.X, xy.Y)) if (!Game.world.Map.IsInMap(xy.X, xy.Y))

View File

@@ -16,8 +16,8 @@ namespace OpenRa
{ {
if (isChatting && typing.Length > 0) if (isChatting && typing.Length > 0)
{ {
Game.controller.AddOrder(Order.Chat(Game.LocalPlayer, typing)); Game.controller.AddOrder(Order.Chat(Game.world.LocalPlayer, typing));
AddLine(Game.LocalPlayer, typing); AddLine(Game.world.LocalPlayer, typing);
} }
typing = ""; typing = "";

View File

@@ -148,10 +148,10 @@ namespace OpenRa
{ {
DrawDownloadBar(); DrawDownloadBar();
chromeCollection = (Game.LocalPlayer.Race == Race.Allies) ? "chrome-allies" : "chrome-soviet"; chromeCollection = (Game.world.LocalPlayer.Race == Race.Allies) ? "chrome-allies" : "chrome-soviet";
radarCollection = (Game.LocalPlayer.Race == Race.Allies) ? "radar-allies" : "radar-soviet"; radarCollection = (Game.world.LocalPlayer.Race == Race.Allies) ? "radar-allies" : "radar-soviet";
paletteCollection = (Game.LocalPlayer.Race == Race.Allies) ? "palette-allies" : "palette-soviet"; paletteCollection = (Game.world.LocalPlayer.Race == Race.Allies) ? "palette-allies" : "palette-soviet";
digitCollection = (Game.LocalPlayer.Race == Race.Allies) ? "digits-allies" : "digits-soviet"; digitCollection = (Game.world.LocalPlayer.Race == Race.Allies) ? "digits-allies" : "digits-soviet";
buttons.Clear(); buttons.Clear();
@@ -305,7 +305,7 @@ namespace OpenRa
void DrawRadar() 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<ProvidesRadar>() && a.traits.Contains<ProvidesRadar>()
&& a.traits.Get<ProvidesRadar>().IsActive(a)); && a.traits.Get<ProvidesRadar>().IsActive(a));
@@ -341,15 +341,15 @@ namespace OpenRa
var x = paletteOrigin.X - tabWidth; var x = paletteOrigin.X - tabWidth;
var y = paletteOrigin.Y + 9; 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(); ChooseAvailableTab();
var queue = Game.LocalPlayer.PlayerActor.traits.Get<Traits.ProductionQueue>(); var queue = Game.world.LocalPlayer.PlayerActor.traits.Get<Traits.ProductionQueue>();
foreach (var q in tabImageNames) foreach (var q in tabImageNames)
{ {
var groupName = q.Key; var groupName = q.Key;
if (!Rules.TechTree.BuildableItems(Game.LocalPlayer, groupName).Any()) if (!Rules.TechTree.BuildableItems(Game.world.LocalPlayer, groupName).Any())
{ {
CheckDeadTab(groupName); CheckDeadTab(groupName);
continue; continue;
@@ -357,7 +357,7 @@ namespace OpenRa
string[] tabKeys = { "normal", "ready", "selected" }; string[] tabKeys = { "normal", "ready", "selected" };
var producing = queue.CurrentItem(groupName); var producing = queue.CurrentItem(groupName);
var index = q.Key == currentTab ? 2 : (producing != null && producing.Done) ? 1 : 0; 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); 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), buttons.Add(Pair.New(new RectangleF(x, y, tabWidth, tabHeight),
@@ -380,20 +380,20 @@ namespace OpenRa
void CheckDeadTab( string groupName ) void CheckDeadTab( string groupName )
{ {
var queue = Game.LocalPlayer.PlayerActor.traits.Get<Traits.ProductionQueue>(); var queue = Game.world.LocalPlayer.PlayerActor.traits.Get<Traits.ProductionQueue>();
foreach( var item in queue.AllItems( groupName ) ) 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() void ChooseAvailableTab()
{ {
currentTab = tabImageNames.Select(q => q.Key).FirstOrDefault( 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() void DrawMoney()
{ {
var moneyDigits = Game.LocalPlayer.DisplayCash.ToString(); var moneyDigits = Game.world.LocalPlayer.DisplayCash.ToString();
var x = Game.viewport.Width - 65; var x = Game.viewport.Width - 65;
foreach (var d in moneyDigits.Reverse()) foreach (var d in moneyDigits.Reverse())
{ {
@@ -408,7 +408,7 @@ namespace OpenRa
void DrawPower() void DrawPower()
{ {
// Nothing to draw // Nothing to draw
if (Game.LocalPlayer.PowerProvided == 0 && Game.LocalPlayer.PowerDrained == 0) if (Game.world.LocalPlayer.PowerProvided == 0 && Game.world.LocalPlayer.PowerDrained == 0)
return; return;
// Draw bar horizontally // Draw bar horizontally
@@ -416,18 +416,18 @@ namespace OpenRa
var barEnd = barStart + new float2(powerSize.Width, 0); var barEnd = barStart + new float2(powerSize.Width, 0);
float powerScaleBy = 100; 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; while (maxPower >= powerScaleBy) powerScaleBy *= 2;
// Current power supply // 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); lastPowerProvidedPos = float2.Lerp(lastPowerProvidedPos.GetValueOrDefault(powerLevelTemp), powerLevelTemp, .3f);
float2 powerLevel = new float2(lastPowerProvidedPos.Value, barStart.Y); float2 powerLevel = new float2(lastPowerProvidedPos.Value, barStart.Y);
var color = Color.LimeGreen; var color = Color.LimeGreen;
if (Game.LocalPlayer.GetPowerState() == PowerState.Low) if (Game.world.LocalPlayer.GetPowerState() == PowerState.Low)
color = Color.Orange; color = Color.Orange;
if (Game.LocalPlayer.GetPowerState() == PowerState.Critical) if (Game.world.LocalPlayer.GetPowerState() == PowerState.Critical)
color = Color.Red; color = Color.Red;
var colorDark = Graphics.Util.Lerp(0.25f, color, Color.Black); var colorDark = Graphics.Util.Lerp(0.25f, color, Color.Black);
@@ -448,7 +448,7 @@ namespace OpenRa
// Power usage indicator // Power usage indicator
var indicator = ChromeProvider.GetImage(renderer, radarCollection, "power-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); lastPowerDrainedPos = float2.Lerp(lastPowerDrainedPos.GetValueOrDefault(powerDrainedTemp), powerDrainedTemp, .3f);
float2 powerDrainLevel = new float2(lastPowerDrainedPos.Value-indicator.size.X/2, barStart.Y-1); 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); Rectangle repairRect = new Rectangle(buttonOrigin.X, buttonOrigin.Y, repairButton.Image.bounds.Width, repairButton.Image.bounds.Height);
var repairDrawPos = new float2(repairRect.Location); var repairDrawPos = new float2(repairRect.Location);
var hasFact = Game.world.Actors.Any(a => a.Owner == Game.LocalPlayer && a.traits.Contains<ConstructionYard>()); var hasFact = Game.world.Actors.Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains<ConstructionYard>());
if (Game.Settings.RepairRequiresConyard && !hasFact) if (Game.Settings.RepairRequiresConyard && !hasFact)
repairButton.ReplaceAnim("disabled"); repairButton.ReplaceAnim("disabled");
@@ -641,14 +641,14 @@ namespace OpenRa
var x = 0; var x = 0;
var y = 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<BuildableInfo>()) .Where(a => a.Traits.Contains<BuildableInfo>())
.Where(a => a.Traits.Get<BuildableInfo>().Owner.Contains(Game.LocalPlayer.Race)) .Where(a => a.Traits.Get<BuildableInfo>().Owner.Contains(Game.world.LocalPlayer.Race))
.OrderBy(a => a.Traits.Get<BuildableInfo>().TechLevel); .OrderBy(a => a.Traits.Get<BuildableInfo>().TechLevel);
var queue = Game.LocalPlayer.PlayerActor.traits.Get<Traits.ProductionQueue>(); var queue = Game.world.LocalPlayer.PlayerActor.traits.Get<Traits.ProductionQueue>();
var overlayBits = new List<Pair<Sprite, float2>>(); var overlayBits = new List<Pair<Sprite, float2>>();
@@ -760,12 +760,12 @@ namespace OpenRa
{ {
var unit = Rules.Info[item]; var unit = Rules.Info[item];
Sound.Play(unit.Traits.Contains<BuildingInfo>() ? "abldgin1.aud" : "train1.aud"); Sound.Play(unit.Traits.Contains<BuildingInfo>() ? "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) void HandleBuildPalette(string item, bool isLmb)
{ {
var player = Game.LocalPlayer; var player = Game.world.LocalPlayer;
var unit = Rules.Info[item]; var unit = Rules.Info[item];
var queue = player.PlayerActor.traits.Get<Traits.ProductionQueue>(); var queue = player.PlayerActor.traits.Get<Traits.ProductionQueue>();
var producing = queue.AllItems(unit.Category).FirstOrDefault( a => a.Item == item ); 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); renderer.DrawText2(buildable.Description, p.ToInt2() + new int2(5,5), Color.White);
DrawRightAligned( "${0}".F(buildable.Cost), pos + new int2(-5,5), 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<BuildingInfo>(); var bi = info.Traits.GetOrDefault<BuildingInfo>();
if (bi != null) if (bi != null)
DrawRightAligned("ϟ{0}".F(bi.Power), pos + new int2(-5, 20), 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); ? 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(5, 5);
p += new int2(0, 15); 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 var prereqs = buildable.Prerequisites
.Select( a => Description( a ) ); .Select( a => Description( a ) );
@@ -893,7 +893,7 @@ namespace OpenRa
void DrawSupportPowers() void DrawSupportPowers()
{ {
var numPowers = Game.LocalPlayer.SupportPowers.Values var numPowers = Game.world.LocalPlayer.SupportPowers.Values
.Where(a => a.IsAvailable).Count(); .Where(a => a.IsAvailable).Count();
if (numPowers == 0) return; if (numPowers == 0) return;
@@ -910,7 +910,7 @@ namespace OpenRa
string tooltipItem = null; string tooltipItem = null;
int2 tooltipPos = int2.Zero; int2 tooltipPos = int2.Zero;
foreach (var sp in Game.LocalPlayer.SupportPowers) foreach (var sp in Game.world.LocalPlayer.SupportPowers)
{ {
var image = spsprites[sp.Key]; var image = spsprites[sp.Key];
if (sp.Value.IsAvailable) if (sp.Value.IsAvailable)
@@ -977,7 +977,7 @@ namespace OpenRa
renderer.DrawText2(info.Description, pos, Color.White); 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); DrawRightAligned(timer, pos + new int2((int)tooltipSprite.size.X - 10, 0), Color.White);
if (info.LongDesc != null) if (info.LongDesc != null)

View File

@@ -51,7 +51,7 @@ namespace OpenRa
recentOrders.AddRange( orders ); recentOrders.AddRange( orders );
var voicedActor = orders.Select(o => o.Subject) var voicedActor = orders.Select(o => o.Subject)
.FirstOrDefault(a => a.Owner == Game.LocalPlayer && a.traits.Contains<Unit>()); .FirstOrDefault(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains<Unit>());
var isMove = orders.Any(o => o.OrderString == "Move"); var isMove = orders.Any(o => o.OrderString == "Move");
var isAttack = orders.Any( o => o.OrderString == "Attack" ); var isAttack = orders.Any( o => o.OrderString == "Attack" );
@@ -127,7 +127,7 @@ namespace OpenRa
var voicedUnit = ((UnitOrderGenerator)orderGenerator).selection var voicedUnit = ((UnitOrderGenerator)orderGenerator).selection
.Where(a => a.traits.Contains<Unit>() .Where(a => a.traits.Contains<Unit>()
&& a.Owner == Game.LocalPlayer) && a.Owner == Game.world.LocalPlayer)
.FirstOrDefault(); .FirstOrDefault();
Sound.PlayVoice("Select", voicedUnit); Sound.PlayVoice("Select", voicedUnit);

View File

@@ -24,20 +24,6 @@ namespace OpenRa
internal static OrderManager orderManager; internal static OrderManager orderManager;
static int localPlayerIndex;
public static Dictionary<int, Player> players = new Dictionary<int, Player>();
public static Player LocalPlayer
{
get { return players[localPlayerIndex]; }
set
{
localPlayerIndex = value.Index;
viewport.GoToStartLocation();
}
}
public static bool skipMakeAnims = true; public static bool skipMakeAnims = true;
internal static Renderer renderer; internal static Renderer renderer;
@@ -73,13 +59,6 @@ namespace OpenRa
palette = new HardwarePalette(renderer, world.Map); 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); SequenceProvider.Initialize(manifest.Sequences);
viewport = new Viewport(clientSize, Game.world.Map.Offset, Game.world.Map.Offset + Game.world.Map.Size, renderer); 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) foreach (var treeReference in Game.world.Map.Trees)
world.CreateActor(treeReference.Image, new int2(treeReference.Location), null); world.CreateActor(treeReference.Image, new int2(treeReference.Location), null);
LoadMapActors(Rules.AllRules); world.LoadMapActors(Rules.AllRules);
skipMakeAnims = false; skipMakeAnims = false;
chrome = new Chrome(renderer); chrome = new Chrome(renderer);
@@ -95,7 +74,7 @@ namespace OpenRa
internal static void Initialize(string mapName, Renderer renderer, int2 clientSize, int localPlayer, Controller controller) internal static void Initialize(string mapName, Renderer renderer, int2 clientSize, int localPlayer, Controller controller)
{ {
localPlayerIndex = localPlayer; //localPlayerIndex = localPlayer;
Game.renderer = renderer; Game.renderer = renderer;
Game.clientSize = clientSize; 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; static int lastTime = Environment.TickCount;
public static void ResetTimer() public static void ResetTimer()
@@ -173,8 +136,6 @@ namespace OpenRa
controller.orderGenerator.Tick(); controller.orderGenerator.Tick();
world.Tick(); world.Tick();
foreach (var player in players.Values)
player.Tick();
} }
else else
if (orderManager.FrameNumber == 0) if (orderManager.FrameNumber == 0)
@@ -229,7 +190,7 @@ namespace OpenRa
FieldLoader.Load(client, y.Value); FieldLoader.Load(client, y.Value);
session.Clients.Add(client); session.Clients.Add(client);
players[index].SyncFromLobby(client); world.players[index].SyncFromLobby(client);
} }
LobbyInfo = session; LobbyInfo = session;
@@ -260,7 +221,7 @@ namespace OpenRa
// todo: spawn more than one unit, in most cases! // todo: spawn more than one unit, in most cases!
var sp = ChooseSpawnPoint(available, taken); var sp = ChooseSpawnPoint(available, taken);
world.CreateActor("mcv", sp, players[client.Index]); world.CreateActor("mcv", sp, world.players[client.Index]);
} }
Game.viewport.GoToStartLocation(); Game.viewport.GoToStartLocation();

View File

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

View File

@@ -129,7 +129,7 @@ namespace OpenRa.Graphics
public void GoToStartLocation() public void GoToStartLocation()
{ {
Center(Game.world.Actors.Where(a => a.Owner == Game.LocalPlayer && a.traits.Contains<Selectable>())); Center(Game.world.Actors.Where(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains<Selectable>()));
} }
} }
} }

View File

@@ -82,7 +82,7 @@ namespace OpenRa.Graphics
if (Game.controller.orderGenerator != null) if (Game.controller.orderGenerator != null)
Game.controller.orderGenerator.Render(); Game.controller.orderGenerator.Render();
Game.LocalPlayer.Shroud.Draw(spriteRenderer); Game.world.LocalPlayer.Shroud.Draw(spriteRenderer);
lineRenderer.Flush(); lineRenderer.Flush();
spriteRenderer.Flush(); spriteRenderer.Flush();
@@ -131,7 +131,7 @@ namespace OpenRa.Graphics
DrawControlGroup(selectedUnit, xy); DrawControlGroup(selectedUnit, xy);
// Only display pips and tags to the owner // Only display pips and tags to the owner
if (selectedUnit.Owner == Game.LocalPlayer) if (selectedUnit.Owner == Game.world.LocalPlayer)
{ {
DrawPips(selectedUnit, xY); DrawPips(selectedUnit, xY);
DrawTags(selectedUnit, new float2(.5f * (bounds.Left + bounds.Right ), xy.Y)); DrawTags(selectedUnit, new float2(.5f * (bounds.Left + bounds.Right ), xy.Y));

View File

@@ -144,12 +144,12 @@ namespace OpenRa
if (e.KeyCode == Keys.F8 && !Game.orderManager.GameStarted) if (e.KeyCode == Keys.F8 && !Game.orderManager.GameStarted)
{ {
Game.controller.AddOrder( 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 */ /* temporary hack: DO NOT LEAVE IN */
if (e.KeyCode == Keys.F2) 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) if (e.KeyCode == Keys.F3)
Game.controller.orderGenerator = new SellOrderGenerator(); Game.controller.orderGenerator = new SellOrderGenerator();
if (e.KeyCode == Keys.F4) if (e.KeyCode == Keys.F4)

View File

@@ -37,7 +37,7 @@ namespace OpenRa.Orders
public Cursor GetCursor(int2 xy, MouseInput mi) public Cursor GetCursor(int2 xy, MouseInput mi)
{ {
if (!Game.LocalPlayer.Shroud.IsExplored(xy)) if (!Game.world.LocalPlayer.Shroud.IsExplored(xy))
return Cursor.MoveBlocked; return Cursor.MoveBlocked;
var movement = self.traits.GetOrDefault<IMovement>(); var movement = self.traits.GetOrDefault<IMovement>();

View File

@@ -29,7 +29,7 @@ namespace OpenRa.Orders
{ {
var loc = mi.Location + Game.viewport.Location; var loc = mi.Location + Game.viewport.Location;
var underCursor = Game.world.FindUnits(loc, loc) var underCursor = Game.world.FindUnits(loc, loc)
.Where(a => a.Owner == Game.LocalPlayer .Where(a => a.Owner == Game.world.LocalPlayer
&& a.traits.Contains<Chronoshiftable>() && a.traits.Contains<Chronoshiftable>()
&& a.traits.Contains<Selectable>()).FirstOrDefault(); && a.traits.Contains<Selectable>()).FirstOrDefault();
@@ -41,7 +41,7 @@ namespace OpenRa.Orders
public void Tick() public void Tick()
{ {
var hasChronosphere = Game.world.Actors var hasChronosphere = Game.world.Actors
.Any(a => a.Owner == Game.LocalPlayer && a.traits.Contains<Chronosphere>()); .Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains<Chronosphere>());
if (!hasChronosphere) if (!hasChronosphere)
Game.controller.CancelInputMode(); Game.controller.CancelInputMode();

View File

@@ -29,7 +29,7 @@ namespace OpenRa.Orders
{ {
var loc = mi.Location + Game.viewport.Location; var loc = mi.Location + Game.viewport.Location;
var underCursor = Game.world.FindUnits(loc, loc) var underCursor = Game.world.FindUnits(loc, loc)
.Where(a => a.Owner == Game.LocalPlayer .Where(a => a.Owner == Game.world.LocalPlayer
&& a.traits.Contains<IronCurtainable>() && a.traits.Contains<IronCurtainable>()
&& a.traits.Contains<Selectable>()).FirstOrDefault(); && a.traits.Contains<Selectable>()).FirstOrDefault();
@@ -41,7 +41,7 @@ namespace OpenRa.Orders
public void Tick() public void Tick()
{ {
var hasStructure = Game.world.Actors var hasStructure = Game.world.Actors
.Any(a => a.Owner == Game.LocalPlayer && a.traits.Contains<IronCurtain>()); .Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains<IronCurtain>());
if (!hasStructure) if (!hasStructure)
Game.controller.CancelInputMode(); Game.controller.CancelInputMode();

View File

@@ -66,7 +66,7 @@ namespace OpenRa
static Player LookupPlayer(uint index) static Player LookupPlayer(uint index)
{ {
return Game.players return Game.world.players
.Where(x => x.Value.Index == index) .Where(x => x.Value.Index == index)
.First().Value; .First().Value;
} }

View File

@@ -23,7 +23,7 @@ namespace OpenRa.Orders
{ {
var loc = mi.Location + Game.viewport.Location; var loc = mi.Location + Game.viewport.Location;
var underCursor = Game.world.FindUnits(loc, loc) var underCursor = Game.world.FindUnits(loc, loc)
.Where(a => a.Owner == Game.LocalPlayer .Where(a => a.Owner == Game.world.LocalPlayer
&& a.traits.Contains<Building>() && a.traits.Contains<Building>()
&& a.traits.Contains<Selectable>()).FirstOrDefault(); && a.traits.Contains<Selectable>()).FirstOrDefault();

View File

@@ -23,7 +23,7 @@ namespace OpenRa.Orders
{ {
var loc = mi.Location + Game.viewport.Location; var loc = mi.Location + Game.viewport.Location;
var underCursor = Game.world.FindUnits(loc, loc) var underCursor = Game.world.FindUnits(loc, loc)
.Where(a => a.Owner == Game.LocalPlayer .Where(a => a.Owner == Game.world.LocalPlayer
&& a.traits.Contains<Building>() && a.traits.Contains<Building>()
&& a.traits.Contains<Selectable>()).FirstOrDefault(); && a.traits.Contains<Selectable>()).FirstOrDefault();
@@ -40,7 +40,7 @@ namespace OpenRa.Orders
return; return;
var hasFact = Game.world.Actors var hasFact = Game.world.Actors
.Any(a => a.Owner == Game.LocalPlayer && a.traits.Contains<ConstructionYard>()); .Any(a => a.Owner == Game.world.LocalPlayer && a.traits.Contains<ConstructionYard>());
if (!hasFact) if (!hasFact)
Game.controller.CancelInputMode(); Game.controller.CancelInputMode();

View File

@@ -23,7 +23,7 @@ namespace OpenRa.Orders
{ {
var loc = mi.Location + Game.viewport.Location; var loc = mi.Location + Game.viewport.Location;
var underCursor = Game.world.FindUnits(loc, loc) var underCursor = Game.world.FindUnits(loc, loc)
.Where(a => a.Owner == Game.LocalPlayer .Where(a => a.Owner == Game.world.LocalPlayer
&& a.traits.Contains<Building>() && a.traits.Contains<Building>()
&& a.traits.Contains<Selectable>()).FirstOrDefault(); && a.traits.Contains<Selectable>()).FirstOrDefault();

View File

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

View File

@@ -68,7 +68,7 @@ namespace OpenRa
Game.chat.AddLine(Color.White, "Debug", "Requesting package: {0}".F(currentPackage)); Game.chat.AddLine(Color.White, "Debug", "Requesting package: {0}".F(currentPackage));
Game.controller.AddOrder( 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; Fraction = 0f;
} }

View File

@@ -29,10 +29,10 @@ namespace OpenRa
public Shroud Shroud; public Shroud Shroud;
public Dictionary<string, SupportPower> SupportPowers; public Dictionary<string, SupportPower> SupportPowers;
public Player( int index, Session.Client client ) public Player( World world, int index, Session.Client client )
{ {
Shroud = new Shroud(this); 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.Index = index;
this.InternalName = "Multi{0}".F(index); this.InternalName = "Multi{0}".F(index);
@@ -91,7 +91,7 @@ namespace OpenRa
void GiveAdvice(string advice) void GiveAdvice(string advice)
{ {
if (this != Game.LocalPlayer) return; if (this != Game.world.LocalPlayer) return;
// todo: store the condition or something. // todo: store the condition or something.
// repeat after Rules.General.SpeakDelay, as long as the condition holds. // repeat after Rules.General.SpeakDelay, as long as the condition holds.
Sound.Play(advice); Sound.Play(advice);
@@ -135,7 +135,7 @@ namespace OpenRa
foreach (var sp in SupportPowers.Values) foreach (var sp in SupportPowers.Values)
sp.Tick(); sp.Tick();
if (this == Game.LocalPlayer) if (this == Game.world.LocalPlayer)
{ {
var totalMoney = Cash + Ore; var totalMoney = Cash + Ore;

View File

@@ -12,7 +12,7 @@ namespace OpenRa.Traits.Activities
{ {
self.Health = 0; self.Health = 0;
Game.world.Remove( self ); Game.world.Remove( self );
if (self.Owner == Game.LocalPlayer) if (self.Owner == Game.world.LocalPlayer)
{ {
Sound.Play("placbldg.aud"); Sound.Play("placbldg.aud");
Sound.Play("build5.aud"); Sound.Play("build5.aud");

View File

@@ -205,7 +205,7 @@ namespace OpenRa.Traits
self.CancelActivity(); self.CancelActivity();
QueueAttack(self, order); QueueAttack(self, order);
if (self.Owner == Game.LocalPlayer) if (self.Owner == Game.world.LocalPlayer)
Game.world.AddFrameEndTask(w => w.Add(new FlashTarget(order.TargetActor))); Game.world.AddFrameEndTask(w => w.Add(new FlashTarget(order.TargetActor)));
} }
else else

View File

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

View File

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

View File

@@ -23,7 +23,7 @@ namespace OpenRa.Traits
return; return;
Game.world.CreateActor( order.TargetString, order.TargetLocation, order.Player ); 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("placbldg.aud");
Sound.Play("build5.aud"); Sound.Play("build5.aud");

View File

@@ -53,7 +53,7 @@ namespace OpenRa.Traits
_ => _ =>
{ {
var isBuilding = unit.Traits.Contains<BuildingInfo>(); var isBuilding = unit.Traits.Contains<BuildingInfo>();
if( !hasPlayedSound && order.Player == Game.LocalPlayer ) if( !hasPlayedSound && order.Player == Game.world.LocalPlayer )
{ {
Sound.Play( isBuilding ? "conscmp1.aud" : "unitrdy1.aud" ); Sound.Play( isBuilding ? "conscmp1.aud" : "unitrdy1.aud" );
hasPlayedSound = true; hasPlayedSound = true;

View File

@@ -28,7 +28,7 @@ namespace OpenRa.Traits
public IEnumerable<Renderable> Render(Actor self) public IEnumerable<Renderable> Render(Actor self)
{ {
var uog = Game.controller.orderGenerator as UnitOrderGenerator; 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, yield return Util.Centered(self,
anim.Image, Util.CenterOfCell(rallyPoint)); anim.Image, Util.CenterOfCell(rallyPoint));
} }

View File

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

View File

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

View File

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

View File

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

View File

@@ -47,7 +47,7 @@ namespace OpenRa
{ {
var position = Game.controller.MousePosition.ToInt2(); var position = Game.controller.MousePosition.ToInt2();
var topLeft = position - Footprint.AdjustForBuildingSize( bi ); 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 ) ) foreach( var t in Footprint.Tiles( name, bi, topLeft ) )
spriteRenderer.DrawSprite( ( isCloseEnough && Game.world.IsCellBuildable( t, bi.WaterBound spriteRenderer.DrawSprite( ( isCloseEnough && Game.world.IsCellBuildable( t, bi.WaterBound

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using OpenRa.Effects; using OpenRa.Effects;
using OpenRa.Support; using OpenRa.Support;
using OpenRa.FileFormats; using OpenRa.FileFormats;
@@ -14,6 +15,19 @@ namespace OpenRa
List<IEffect> effects = new List<IEffect>(); List<IEffect> effects = new List<IEffect>();
List<Action<World>> frameEndActions = new List<Action<World>>(); List<Action<World>> frameEndActions = new List<Action<World>>();
public readonly Dictionary<int, Player> players = new Dictionary<int, Player>();
int localPlayerIndex;
public Player LocalPlayer
{
get { return players[localPlayerIndex]; }
set
{
localPlayerIndex = value.Index;
Game.viewport.GoToStartLocation();
}
}
public readonly BuildingInfluenceMap BuildingInfluence; public readonly BuildingInfluenceMap BuildingInfluence;
public readonly UnitInfluenceMap UnitInfluence; public readonly UnitInfluenceMap UnitInfluence;
@@ -46,6 +60,9 @@ namespace OpenRa
CreateActor("World", new int2(int.MaxValue, int.MaxValue), null); 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); Bridges.MakeBridges(this);
PathFinder = new PathFinder(this); PathFinder = new PathFinder(this);
@@ -104,6 +121,8 @@ namespace OpenRa
UnitInfluence.Tick(); UnitInfluence.Tick();
Minimap.Update(); Minimap.Update();
foreach (var player in players.Values)
player.Tick();
} }
public IEnumerable<Actor> Actors { get { return actors; } } public IEnumerable<Actor> Actors { get { return actors; } }

View File

@@ -4,6 +4,7 @@ using System.Linq;
using OpenRa.Traits; using OpenRa.Traits;
using System.Drawing; using System.Drawing;
using OpenRa.GameRules; using OpenRa.GameRules;
using OpenRa.FileFormats;
namespace OpenRa namespace OpenRa
{ {
@@ -92,7 +93,7 @@ namespace OpenRa
{ {
return world.FindUnits(a, b) return world.FindUnits(a, b)
.Where( x => x.traits.Contains<Selectable>() ) .Where( x => x.traits.Contains<Selectable>() )
.GroupBy(x => (x.Owner == Game.LocalPlayer) ? x.Info.Traits.Get<SelectableInfo>().Priority : 0) .GroupBy(x => (x.Owner == Game.world.LocalPlayer) ? x.Info.Traits.Get<SelectableInfo>().Priority : 0)
.OrderByDescending(g => g.Key) .OrderByDescending(g => g.Key)
.Select( g => g.AsEnumerable() ) .Select( g => g.AsEnumerable() )
.DefaultIfEmpty( new Actor[] {} ) .DefaultIfEmpty( new Actor[] {} )
@@ -150,5 +151,21 @@ namespace OpenRa
return xy; 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]);
}
}
} }
} }

View File

@@ -32,7 +32,7 @@ namespace OpenRa.Mods.Aftermath.Orders
public Cursor GetCursor(int2 xy, MouseInput mi) public Cursor GetCursor(int2 xy, MouseInput mi)
{ {
if (!Game.LocalPlayer.Shroud.IsExplored(xy)) if (!Game.world.LocalPlayer.Shroud.IsExplored(xy))
return Cursor.MoveBlocked; return Cursor.MoveBlocked;
var movement = self.traits.GetOrDefault<IMovement>(); var movement = self.traits.GetOrDefault<IMovement>();

View File

@@ -42,7 +42,7 @@ namespace OpenRa.Mods.RA
public bool IsPathableCrush(UnitMovementType umt, Player player) public bool IsPathableCrush(UnitMovementType umt, Player player)
{ {
return !self.Info.Traits.Get<MineInfo>().AvoidFriendly || (player != Game.LocalPlayer); return !self.Info.Traits.Get<MineInfo>().AvoidFriendly || (player != Game.world.LocalPlayer);
} }
public bool IsCrushableBy(UnitMovementType umt, Player player) public bool IsCrushableBy(UnitMovementType umt, Player player)

View File

@@ -21,15 +21,15 @@ namespace OpenRa.Mods.RA
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r) public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
{ {
if (self.Owner == Game.LocalPlayer) if (self.Owner == Game.world.LocalPlayer)
return r; 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) 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); base.Tick(self);
} }
} }