move Game.world onto OrderManager. use call IssueOrder on world and/or on orderManager, not on Game

This commit is contained in:
Bob
2010-10-12 17:19:09 +13:00
parent 34fc207a6c
commit 20276291ce
19 changed files with 116 additions and 121 deletions

View File

@@ -31,7 +31,6 @@ namespace OpenRA
public static int CellSize { get { return modData.Manifest.TileSize; } } public static int CellSize { get { return modData.Manifest.TileSize; } }
public static ModData modData; public static ModData modData;
private static World world;
private static WorldRenderer worldRenderer; private static WorldRenderer worldRenderer;
public static Viewport viewport; public static Viewport viewport;
@@ -44,15 +43,6 @@ namespace OpenRA
public static Renderer Renderer; public static Renderer Renderer;
public static bool HasInputFocus = false; public static bool HasInputFocus = false;
static void LoadMap(string uid)
{
var map = modData.PrepareMap(uid);
viewport = new Viewport(new float2(Renderer.Resolution), map.TopLeft, map.BottomRight, Renderer);
world = new World(modData.Manifest, map, orderManager);
worldRenderer = new WorldRenderer(world);
}
public static void MoveViewport(int2 loc) public static void MoveViewport(int2 loc)
{ {
viewport.Center(loc); viewport.Center(loc);
@@ -93,14 +83,14 @@ namespace OpenRA
} }
internal static int RenderFrame = 0; internal static int RenderFrame = 0;
internal static int LocalTick = 0; internal static int LocalTick { get { return orderManager.LocalFrameNumber; } }
const int NetTickScale = 3; // 120ms net tick for 40ms local tick const int NetTickScale = 3; // 120ms net tick for 40ms local tick
internal static event Action<OrderManager> ConnectionStateChanged = _ => { }; internal static event Action<OrderManager> ConnectionStateChanged = _ => { };
static ConnectionState lastConnectionState = ConnectionState.PreConnecting; static ConnectionState lastConnectionState = ConnectionState.PreConnecting;
public static int LocalClientId { get { return orderManager.Connection.LocalClientId; } } public static int LocalClientId { get { return orderManager.Connection.LocalClientId; } }
static void Tick( World world, OrderManager orderManager, Viewport viewPort ) static void Tick( OrderManager orderManager, Viewport viewPort )
{ {
if (orderManager.Connection.ConnectionState != lastConnectionState) if (orderManager.Connection.ConnectionState != lastConnectionState)
{ {
@@ -116,20 +106,21 @@ namespace OpenRA
{ {
lastTime += Settings.Game.Timestep; lastTime += Settings.Game.Timestep;
Widget.DoTick(); Widget.DoTick();
if( world.GameHasStarted && world.LocalPlayer != null ) var world = orderManager.world;
if( orderManager.GameStarted && world.LocalPlayer != null )
++Viewport.TicksSinceLastMove; ++Viewport.TicksSinceLastMove;
Sound.Tick(); Sound.Tick();
Sync.CheckSyncUnchanged( world, () => { orderManager.TickImmediate( world ); } ); Sync.CheckSyncUnchanged( world, () => { orderManager.TickImmediate(); } );
var isNetTick = LocalTick % NetTickScale == 0; var isNetTick = LocalTick % NetTickScale == 0;
if (!isNetTick || orderManager.IsReadyForNextFrame) if (!isNetTick || orderManager.IsReadyForNextFrame)
{ {
++LocalTick; ++orderManager.LocalFrameNumber;
Log.Write("debug", "--Tick: {0} ({1})", LocalTick, isNetTick ? "net" : "local"); Log.Write("debug", "--Tick: {0} ({1})", LocalTick, isNetTick ? "net" : "local");
if (isNetTick) orderManager.Tick(world); if (isNetTick) orderManager.Tick();
world.OrderGenerator.Tick(world); world.OrderGenerator.Tick(world);
world.Selection.Tick(world); world.Selection.Tick(world);
@@ -139,7 +130,7 @@ namespace OpenRA
PerfHistory.Tick(); PerfHistory.Tick();
} }
else else
if (orderManager.FrameNumber == 0) if (orderManager.NetFrameNumber == 0)
lastTime = Environment.TickCount; lastTime = Environment.TickCount;
} }
} }
@@ -147,7 +138,7 @@ namespace OpenRA
using (new PerfSample("render")) using (new PerfSample("render"))
{ {
++RenderFrame; ++RenderFrame;
viewport.DrawRegions(worldRenderer, world); viewport.DrawRegions(worldRenderer);
Sound.SetListenerPosition(viewport.Location + .5f * new float2(viewport.Width, viewport.Height)); Sound.SetListenerPosition(viewport.Location + .5f * new float2(viewport.Width, viewport.Height));
} }
@@ -166,31 +157,30 @@ namespace OpenRA
LobbyInfoChanged(); LobbyInfoChanged();
} }
public static void IssueOrder( Order o ) { orderManager.IssueOrder( o ); } /* avoid exposing the OM to mod code */
public static event Action<World> AfterGameStart = _ => {}; public static event Action<World> AfterGameStart = _ => {};
public static event Action BeforeGameStart = () => {}; public static event Action BeforeGameStart = () => {};
internal static void StartGame(string map) internal static void StartGame(string mapUID)
{ {
world = null;
BeforeGameStart(); BeforeGameStart();
LoadMap(map);
var map = modData.PrepareMap(mapUID);
viewport = new Viewport(new float2(Renderer.Resolution), map.TopLeft, map.BottomRight, Renderer);
orderManager.world = new World(modData.Manifest, map, orderManager);
worldRenderer = new WorldRenderer(orderManager.world);
if (orderManager.GameStarted) return; if (orderManager.GameStarted) return;
Widget.SelectedWidget = null; Widget.SelectedWidget = null;
LocalTick = 0; orderManager.LocalFrameNumber = 0;
orderManager.StartGame(); orderManager.StartGame();
worldRenderer.RefreshPalette(); worldRenderer.RefreshPalette();
AfterGameStart( world ); AfterGameStart( orderManager.world );
} }
public static void DispatchMouseInput(MouseInputEvent ev, MouseEventArgs e, Modifiers modifierKeys) public static void DispatchMouseInput(MouseInputEvent ev, MouseEventArgs e, Modifiers modifierKeys)
{ {
var world = Game.world; Sync.CheckSyncUnchanged( orderManager.world, () =>
if (world == null) return;
Sync.CheckSyncUnchanged( world, () =>
{ {
var mi = new MouseInput var mi = new MouseInput
{ {
@@ -210,10 +200,7 @@ namespace OpenRA
public static void HandleKeyEvent(KeyInput e) public static void HandleKeyEvent(KeyInput e)
{ {
var world = Game.world; Sync.CheckSyncUnchanged( orderManager.world, () =>
if( world == null ) return;
Sync.CheckSyncUnchanged( world, () =>
{ {
Widget.HandleKeyPress( e ); Widget.HandleKeyPress( e );
} ); } );
@@ -269,7 +256,7 @@ namespace OpenRA
JoinLocal(); JoinLocal();
StartGame(modData.Manifest.ShellmapUid); StartGame(modData.Manifest.ShellmapUid);
Game.AfterGameStart += world => Widget.OpenWindow("INGAME_ROOT", new Dictionary<string,object>{{"world", world}}); Game.AfterGameStart += world => Widget.OpenWindow("INGAME_ROOT", new Dictionary<string,object>{{"world", world},{"orderManager",orderManager}});
Game.ConnectionStateChanged += orderManager => Game.ConnectionStateChanged += orderManager =>
{ {
@@ -309,7 +296,7 @@ namespace OpenRA
{ {
while (!quit) while (!quit)
{ {
Tick( world, orderManager, viewport ); Tick( orderManager, viewport );
Application.DoEvents(); Application.DoEvents();
} }
} }

View File

@@ -95,7 +95,7 @@ namespace OpenRA.Graphics
this.scrollPosition = Game.CellSize* mapStart; this.scrollPosition = Game.CellSize* mapStart;
} }
public void DrawRegions( WorldRenderer wr, World world ) public void DrawRegions( WorldRenderer wr )
{ {
renderer.BeginFrame(scrollPosition); renderer.BeginFrame(scrollPosition);
wr.Draw(); wr.Draw();

View File

@@ -18,19 +18,21 @@ namespace OpenRA.Network
{ {
class OrderManager : IDisposable class OrderManager : IDisposable
{ {
readonly SyncReport syncReport = new SyncReport(); readonly SyncReport syncReport;
readonly FrameData frameData = new FrameData(); readonly FrameData frameData = new FrameData();
public Session LobbyInfo = new Session( Game.Settings.Game.Mods ); public Session LobbyInfo = new Session( Game.Settings.Game.Mods );
public Session.Client LocalClient { get { return LobbyInfo.ClientWithIndex( Connection.LocalClientId ); } } public Session.Client LocalClient { get { return LobbyInfo.ClientWithIndex( Connection.LocalClientId ); } }
public World world;
public readonly string Host; public readonly string Host;
public readonly int Port; public readonly int Port;
public int FrameNumber { get; private set; } public int NetFrameNumber { get; private set; }
public int LocalFrameNumber;
public int FramesAhead = 0; public int FramesAhead = 0;
public bool GameStarted { get { return FrameNumber != 0; } } public bool GameStarted { get { return NetFrameNumber != 0; } }
public IConnection Connection { get; private set; } public IConnection Connection { get; private set; }
public readonly int SyncHeaderSize = 9; public readonly int SyncHeaderSize = 9;
@@ -41,8 +43,8 @@ namespace OpenRA.Network
{ {
if (GameStarted) return; if (GameStarted) return;
FrameNumber = 1; NetFrameNumber = 1;
for( int i = FrameNumber ; i <= FramesAhead ; i++ ) for( int i = NetFrameNumber ; i <= FramesAhead ; i++ )
Connection.Send( new List<Order>().Serialize( i ) ); Connection.Send( new List<Order>().Serialize( i ) );
} }
@@ -51,6 +53,7 @@ namespace OpenRA.Network
this.Host = host; this.Host = host;
this.Port = port; this.Port = port;
Connection = conn; Connection = conn;
syncReport = new SyncReport( this );
} }
public void IssueOrders( Order[] orders ) public void IssueOrders( Order[] orders )
@@ -64,7 +67,7 @@ namespace OpenRA.Network
localOrders.Add( order ); localOrders.Add( order );
} }
public void TickImmediate( World world ) public void TickImmediate()
{ {
var immediateOrders = localOrders.Where( o => o.IsImmediate ).ToList(); var immediateOrders = localOrders.Where( o => o.IsImmediate ).ToList();
if( immediateOrders.Count != 0 ) if( immediateOrders.Count != 0 )
@@ -80,7 +83,7 @@ namespace OpenRA.Network
if( packet.Length == 5 && packet[ 4 ] == 0xBF ) if( packet.Length == 5 && packet[ 4 ] == 0xBF )
frameData.ClientQuit( clientId, frame ); frameData.ClientQuit( clientId, frame );
else if( packet.Length >= 5 && packet[ 4 ] == 0x65 ) else if( packet.Length >= 5 && packet[ 4 ] == 0x65 )
CheckSync( world, packet ); CheckSync( packet );
else if( frame == 0 ) else if( frame == 0 )
immediatePackets.Add( Pair.New( clientId, packet ) ); immediatePackets.Add( Pair.New( clientId, packet ) );
else else
@@ -94,7 +97,7 @@ namespace OpenRA.Network
Dictionary<int, byte[]> syncForFrame = new Dictionary<int, byte[]>(); Dictionary<int, byte[]> syncForFrame = new Dictionary<int, byte[]>();
void CheckSync(World world, byte[] packet) void CheckSync(byte[] packet)
{ {
var frame = BitConverter.ToInt32(packet, 0); var frame = BitConverter.ToInt32(packet, 0);
byte[] existingSync; byte[] existingSync;
@@ -116,7 +119,7 @@ namespace OpenRA.Network
if (i < SyncHeaderSize) if (i < SyncHeaderSize)
OutOfSync(frame, "Tick"); OutOfSync(frame, "Tick");
else else
OutOfSync(world, frame, (i - SyncHeaderSize) / 4); OutOfSync(frame, (i - SyncHeaderSize) / 4);
} }
} }
} }
@@ -125,7 +128,7 @@ namespace OpenRA.Network
syncForFrame.Add(frame, packet); syncForFrame.Add(frame, packet);
} }
void OutOfSync( World world, int frame, int index) void OutOfSync(int frame, int index)
{ {
var order = frameData.OrdersForFrame( world, frame ).ElementAt(index); var order = frameData.OrdersForFrame( world, frame ).ElementAt(index);
throw new InvalidOperationException("Out of sync in frame {0}.\n {1}".F(frame, order.Order.ToString())); throw new InvalidOperationException("Out of sync in frame {0}.\n {1}".F(frame, order.Order.ToString()));
@@ -143,34 +146,34 @@ namespace OpenRA.Network
public bool IsReadyForNextFrame public bool IsReadyForNextFrame
{ {
get { return FrameNumber >= 1 && frameData.IsReadyForFrame( FrameNumber ); } get { return NetFrameNumber >= 1 && frameData.IsReadyForFrame( NetFrameNumber ); }
} }
public void Tick( World world ) public void Tick()
{ {
if( !IsReadyForNextFrame ) if( !IsReadyForNextFrame )
throw new InvalidOperationException(); throw new InvalidOperationException();
Connection.Send( localOrders.Serialize( FrameNumber + FramesAhead ) ); Connection.Send( localOrders.Serialize( NetFrameNumber + FramesAhead ) );
localOrders.Clear(); localOrders.Clear();
var sync = new List<int>(); var sync = new List<int>();
sync.Add( world.SyncHash() ); sync.Add( world.SyncHash() );
foreach( var order in frameData.OrdersForFrame( world, FrameNumber) ) foreach( var order in frameData.OrdersForFrame( world, NetFrameNumber) )
{ {
UnitOrders.ProcessOrder( this, world, order.Client, order.Order ); UnitOrders.ProcessOrder( this, world, order.Client, order.Order );
sync.Add( world.SyncHash() ); sync.Add( world.SyncHash() );
} }
var ss = sync.SerializeSync( FrameNumber ); var ss = sync.SerializeSync( NetFrameNumber );
Connection.Send( ss ); Connection.Send( ss );
syncReport.UpdateSyncReport( world ); syncReport.UpdateSyncReport();
CheckSync( world, ss ); CheckSync( ss );
++FrameNumber; ++NetFrameNumber;
} }
bool disposed; bool disposed;

View File

@@ -42,9 +42,6 @@ namespace OpenRA.Network
var packetLen = reader.ReadInt32(); var packetLen = reader.ReadInt32();
var packet = reader.ReadBytes( packetLen ); var packet = reader.ReadBytes( packetLen );
packetFn( client, packet ); packetFn( client, packet );
if( !Game.orderManager.GameStarted )
return;
} }
replayStream = null; replayStream = null;
} }

View File

@@ -9,31 +9,33 @@ namespace OpenRA.Network
{ {
class SyncReport class SyncReport
{ {
readonly OrderManager orderManager;
const int numSyncReports = 5; const int numSyncReports = 5;
Report[] syncReports = new Report[numSyncReports]; Report[] syncReports = new Report[numSyncReports];
int curIndex = 0; int curIndex = 0;
public SyncReport() public SyncReport( OrderManager orderManager )
{ {
this.orderManager = orderManager;
for (var i = 0; i < numSyncReports; i++) for (var i = 0; i < numSyncReports; i++)
syncReports[i] = new SyncReport.Report(); syncReports[i] = new SyncReport.Report();
} }
internal void UpdateSyncReport( World world ) internal void UpdateSyncReport()
{ {
if (!Game.Settings.Debug.RecordSyncReports) if (!Game.Settings.Debug.RecordSyncReports)
return; return;
GenerateSyncReport(world, syncReports[curIndex]); GenerateSyncReport(syncReports[curIndex]);
curIndex = ++curIndex % numSyncReports; curIndex = ++curIndex % numSyncReports;
} }
void GenerateSyncReport(World world, Report report) void GenerateSyncReport(Report report)
{ {
report.Frame = Game.orderManager.FrameNumber; report.Frame = orderManager.NetFrameNumber;
report.SyncedRandom = world.SharedRandom.Last; report.SyncedRandom = orderManager.world.SharedRandom.Last;
report.Traits.Clear(); report.Traits.Clear();
foreach (var a in world.Queries.WithTraitMultiple<object>()) foreach (var a in orderManager.world.Queries.WithTraitMultiple<object>())
{ {
var sync = Sync.CalculateSyncHash(a.Trait); var sync = Sync.CalculateSyncHash(a.Trait);
if (sync != 0) if (sync != 0)

View File

@@ -52,10 +52,9 @@ namespace OpenRA.Network
if (client != null) if (client != null)
{ {
var player = world.FindPlayerByClientId(clientId); var player = world.FindPlayerByClientId(clientId);
var display = (world.GameHasStarted) ? var display = player != null
player != null && (world.LocalPlayer != null && player.Stances[world.LocalPlayer] == Stance.Ally && (world.LocalPlayer != null && player.Stances[world.LocalPlayer] == Stance.Ally
|| player.WinState == WinState.Lost) : || player.WinState == WinState.Lost);
client == orderManager.LocalClient || (client.Team == orderManager.LocalClient.Team && client.Team != 0);
if (display) if (display)
{ {

View File

@@ -139,6 +139,7 @@ namespace OpenRA
public static T CheckSyncUnchanged<T>( World world, Func<T> fn ) public static T CheckSyncUnchanged<T>( World world, Func<T> fn )
{ {
if( world == null ) return fn();
int sync = world.SyncHash(); int sync = world.SyncHash();
bool prevInUnsyncedCode = inUnsyncedCode; bool prevInUnsyncedCode = inUnsyncedCode;
inUnsyncedCode = true; inUnsyncedCode = true;

View File

@@ -10,6 +10,7 @@
using System.Drawing; using System.Drawing;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Network;
namespace OpenRA.Widgets namespace OpenRA.Widgets
{ {
@@ -25,6 +26,13 @@ namespace OpenRA.Widgets
bool composing = false; bool composing = false;
bool teamChat = false; bool teamChat = false;
readonly OrderManager orderManager;
[ObjectCreator.UseCtor]
internal ChatEntryWidget( [ObjectCreator.Param] OrderManager orderManager )
{
this.orderManager = orderManager;
}
public override void DrawInner( WorldRenderer wr ) public override void DrawInner( WorldRenderer wr )
{ {
if (composing) if (composing)
@@ -61,7 +69,7 @@ namespace OpenRA.Widgets
composing = false; composing = false;
if (content != "") if (content != "")
Game.IssueOrder(teamChat orderManager.IssueOrder(teamChat
? Order.TeamChat(content) ? Order.TeamChat(content)
: Order.Chat(content)); : Order.Chat(content));
content = ""; content = "";

View File

@@ -45,7 +45,7 @@ namespace OpenRA.Widgets.Delegates
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().DisableShroud; () => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().DisableShroud;
devmodeBG.GetWidget<CheckboxWidget>("CHECKBOX_SHROUD").OnMouseDown = mi => devmodeBG.GetWidget<CheckboxWidget>("CHECKBOX_SHROUD").OnMouseDown = mi =>
{ {
Game.IssueOrder(new Order("DevShroud", world.LocalPlayer.PlayerActor)); world.IssueOrder(new Order("DevShroud", world.LocalPlayer.PlayerActor));
return true; return true;
}; };
@@ -53,7 +53,7 @@ namespace OpenRA.Widgets.Delegates
() => Game.Settings.Debug.ShowCollisions; () => Game.Settings.Debug.ShowCollisions;
devmodeBG.GetWidget("CHECKBOX_UNITDEBUG").OnMouseDown = mi => devmodeBG.GetWidget("CHECKBOX_UNITDEBUG").OnMouseDown = mi =>
{ {
Game.IssueOrder(new Order("DevUnitDebug", world.LocalPlayer.PlayerActor)); world.IssueOrder(new Order("DevUnitDebug", world.LocalPlayer.PlayerActor));
return true; return true;
}; };
@@ -61,13 +61,13 @@ namespace OpenRA.Widgets.Delegates
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug; () => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug;
devmodeBG.GetWidget("CHECKBOX_PATHDEBUG").OnMouseDown = mi => devmodeBG.GetWidget("CHECKBOX_PATHDEBUG").OnMouseDown = mi =>
{ {
Game.IssueOrder(new Order("DevPathDebug", world.LocalPlayer.PlayerActor)); world.IssueOrder(new Order("DevPathDebug", world.LocalPlayer.PlayerActor));
return true; return true;
}; };
devmodeBG.GetWidget<ButtonWidget>("GIVE_CASH").OnMouseUp = mi => devmodeBG.GetWidget<ButtonWidget>("GIVE_CASH").OnMouseUp = mi =>
{ {
Game.IssueOrder(new Order("DevGiveCash", world.LocalPlayer.PlayerActor)); world.IssueOrder(new Order("DevGiveCash", world.LocalPlayer.PlayerActor));
return true; return true;
}; };
@@ -75,7 +75,7 @@ namespace OpenRA.Widgets.Delegates
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().FastBuild; () => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().FastBuild;
devmodeBG.GetWidget<CheckboxWidget>("INSTANT_BUILD").OnMouseDown = mi => devmodeBG.GetWidget<CheckboxWidget>("INSTANT_BUILD").OnMouseDown = mi =>
{ {
Game.IssueOrder(new Order("DevFastBuild", world.LocalPlayer.PlayerActor)); world.IssueOrder(new Order("DevFastBuild", world.LocalPlayer.PlayerActor));
return true; return true;
}; };
@@ -83,7 +83,7 @@ namespace OpenRA.Widgets.Delegates
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().FastCharge; () => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().FastCharge;
devmodeBG.GetWidget<CheckboxWidget>("INSTANT_CHARGE").OnMouseDown = mi => devmodeBG.GetWidget<CheckboxWidget>("INSTANT_CHARGE").OnMouseDown = mi =>
{ {
Game.IssueOrder(new Order("DevFastCharge", world.LocalPlayer.PlayerActor)); world.IssueOrder(new Order("DevFastCharge", world.LocalPlayer.PlayerActor));
return true; return true;
}; };
@@ -91,13 +91,13 @@ namespace OpenRA.Widgets.Delegates
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().AllTech; () => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().AllTech;
devmodeBG.GetWidget<CheckboxWidget>("ENABLE_TECH").OnMouseDown = mi => devmodeBG.GetWidget<CheckboxWidget>("ENABLE_TECH").OnMouseDown = mi =>
{ {
Game.IssueOrder(new Order("DevEnableTech", world.LocalPlayer.PlayerActor)); world.IssueOrder(new Order("DevEnableTech", world.LocalPlayer.PlayerActor));
return true; return true;
}; };
devmodeBG.GetWidget<ButtonWidget>("GIVE_EXPLORATION").OnMouseUp = mi => devmodeBG.GetWidget<ButtonWidget>("GIVE_EXPLORATION").OnMouseUp = mi =>
{ {
Game.IssueOrder(new Order("DevGiveExploration", world.LocalPlayer.PlayerActor)); world.IssueOrder(new Order("DevGiveExploration", world.LocalPlayer.PlayerActor));
return true; return true;
}; };

View File

@@ -138,7 +138,7 @@ namespace OpenRA.Widgets.Delegates
var nextStance = GetNextStance((Stance)Enum.Parse(typeof(Stance), bw.Text)); var nextStance = GetNextStance((Stance)Enum.Parse(typeof(Stance), bw.Text));
Game.IssueOrder(new Order("SetStance", world.LocalPlayer.PlayerActor, world.IssueOrder(new Order("SetStance", world.LocalPlayer.PlayerActor,
new int2(p.Index, (int)nextStance))); new int2(p.Index, (int)nextStance)));
bw.Text = nextStance.ToString(); bw.Text = nextStance.ToString();

View File

@@ -52,7 +52,7 @@ namespace OpenRA.Widgets.Delegates
if (orderManager.LocalClient.State == Session.ClientState.Ready) return; if (orderManager.LocalClient.State == Session.ClientState.Ready) return;
var owned = orderManager.LobbyInfo.Clients.Any(c => c.SpawnPoint == sp); var owned = orderManager.LobbyInfo.Clients.Any(c => c.SpawnPoint == sp);
if (sp == 0 || !owned) if (sp == 0 || !owned)
Game.IssueOrder(Order.Command("spawn {0}".F(sp))); orderManager.IssueOrder(Order.Command("spawn {0}".F(sp)));
}; };
mapPreview.SpawnColors = () => mapPreview.SpawnColors = () =>
@@ -95,7 +95,7 @@ namespace OpenRA.Widgets.Delegates
lockTeamsCheckbox.OnMouseDown = mi => lockTeamsCheckbox.OnMouseDown = mi =>
{ {
if (Game.IsHost) if (Game.IsHost)
Game.IssueOrder(Order.Command( orderManager.IssueOrder(Order.Command(
"lockteams {0}".F(!orderManager.LobbyInfo.GlobalSettings.LockTeams))); "lockteams {0}".F(!orderManager.LobbyInfo.GlobalSettings.LockTeams)));
return true; return true;
}; };
@@ -106,7 +106,7 @@ namespace OpenRA.Widgets.Delegates
mapButton.Visible = false; mapButton.Visible = false;
disconnectButton.Visible = false; disconnectButton.Visible = false;
lockTeamsCheckbox.Visible = false; lockTeamsCheckbox.Visible = false;
Game.IssueOrder(Order.Command("startgame")); orderManager.IssueOrder(Order.Command("startgame"));
return true; return true;
}; };
startGameButton.IsVisible = () => Game.IsHost; startGameButton.IsVisible = () => Game.IsHost;
@@ -126,7 +126,7 @@ namespace OpenRA.Widgets.Delegates
return true; return true;
var order = (teamChat) ? Order.TeamChat(chatTextField.Text) : Order.Chat(chatTextField.Text); var order = (teamChat) ? Order.TeamChat(chatTextField.Text) : Order.Chat(chatTextField.Text);
Game.IssueOrder(order); orderManager.IssueOrder(order);
chatTextField.Text = ""; chatTextField.Text = "";
return true; return true;
}; };
@@ -166,7 +166,7 @@ namespace OpenRA.Widgets.Delegates
Game.Settings.Player.Color1 = c1; Game.Settings.Player.Color1 = c1;
Game.Settings.Player.Color2 = c2; Game.Settings.Player.Color2 = c2;
Game.Settings.Save(); Game.Settings.Save();
Game.IssueOrder(Order.Command("color {0},{1},{2},{3},{4},{5}".F(c1.R,c1.G,c1.B,c2.R,c2.G,c2.B))); orderManager.IssueOrder(Order.Command("color {0},{1},{2},{3},{4},{5}".F(c1.R,c1.G,c1.B,c2.R,c2.G,c2.B)));
} }
void UpdateColorPreview(float hf, float sf, float lf, float r) void UpdateColorPreview(float hf, float sf, float lf, float r)
@@ -190,13 +190,13 @@ namespace OpenRA.Widgets.Delegates
hasJoined = true; hasJoined = true;
if (orderManager.LocalClient.Name != Game.Settings.Player.Name) if (orderManager.LocalClient.Name != Game.Settings.Player.Name)
Game.IssueOrder(Order.Command("name " + Game.Settings.Player.Name)); orderManager.IssueOrder(Order.Command("name " + Game.Settings.Player.Name));
var c1 = Game.Settings.Player.Color1; var c1 = Game.Settings.Player.Color1;
var c2 = Game.Settings.Player.Color2; var c2 = Game.Settings.Player.Color2;
if (orderManager.LocalClient.Color1 != c1 || orderManager.LocalClient.Color2 != c2) if (orderManager.LocalClient.Color1 != c1 || orderManager.LocalClient.Color2 != c2)
Game.IssueOrder(Order.Command("color {0},{1},{2},{3},{4},{5}".F(c1.R,c1.G,c1.B,c2.R,c2.G,c2.B))); orderManager.IssueOrder(Order.Command("color {0},{1},{2},{3},{4},{5}".F(c1.R,c1.G,c1.B,c2.R,c2.G,c2.B)));
} }
void ResetConnectionState( OrderManager orderManager ) void ResetConnectionState( OrderManager orderManager )
@@ -235,14 +235,14 @@ namespace OpenRA.Widgets.Delegates
if (s.Closed) if (s.Closed)
{ {
s.Bot = null; s.Bot = null;
Game.IssueOrder(Order.Command("slot_open " + s.Index)); orderManager.IssueOrder(Order.Command("slot_open " + s.Index));
} }
else else
{ {
if (s.Bot == null) if (s.Bot == null)
Game.IssueOrder(Order.Command("slot_bot {0} HackyAI".F(s.Index))); orderManager.IssueOrder(Order.Command("slot_bot {0} HackyAI".F(s.Index)));
else else
Game.IssueOrder(Order.Command("slot_close " + s.Index)); orderManager.IssueOrder(Order.Command("slot_close " + s.Index));
} }
return true; return true;
}; };
@@ -257,7 +257,7 @@ namespace OpenRA.Widgets.Delegates
var join = template.GetWidget<ButtonWidget>("JOIN"); var join = template.GetWidget<ButtonWidget>("JOIN");
if (join != null) if (join != null)
{ {
join.OnMouseUp = _ => { Game.IssueOrder(Order.Command("slot " + s.Index)); return true; }; join.OnMouseUp = _ => { orderManager.IssueOrder(Order.Command("slot " + s.Index)); return true; };
join.IsVisible = () => !s.Closed && s.Bot == null; join.IsVisible = () => !s.Closed && s.Bot == null;
} }
} }
@@ -276,7 +276,7 @@ namespace OpenRA.Widgets.Delegates
if (name.Text == c.Name) if (name.Text == c.Name)
return true; return true;
Game.IssueOrder(Order.Command("name " + name.Text)); orderManager.IssueOrder(Order.Command("name " + name.Text));
Game.Settings.Player.Name = name.Text; Game.Settings.Player.Name = name.Text;
Game.Settings.Save(); Game.Settings.Save();
return true; return true;
@@ -372,14 +372,14 @@ namespace OpenRA.Widgets.Delegates
if (nextCountry == null) if (nextCountry == null)
nextCountry = countries.First(); nextCountry = countries.First();
Game.IssueOrder(Order.Command("race " + nextCountry)); orderManager.IssueOrder(Order.Command("race " + nextCountry));
return true; return true;
} }
bool CycleReady(MouseInput mi) bool CycleReady(MouseInput mi)
{ {
Game.IssueOrder(Order.Command("ready")); orderManager.IssueOrder(Order.Command("ready"));
return true; return true;
} }
@@ -388,7 +388,7 @@ namespace OpenRA.Widgets.Delegates
var d = (mi.Button == MouseButton.Left) ? +1 : Map.PlayerCount; var d = (mi.Button == MouseButton.Left) ? +1 : Map.PlayerCount;
var newIndex = (orderManager.LocalClient.Team + d) % (Map.PlayerCount + 1); var newIndex = (orderManager.LocalClient.Team + d) % (Map.PlayerCount + 1);
Game.IssueOrder( orderManager.IssueOrder(
Order.Command("team " + newIndex)); Order.Command("team " + newIndex));
return true; return true;
} }

View File

@@ -11,6 +11,7 @@
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
using OpenRA.FileFormats; using OpenRA.FileFormats;
using OpenRA.Network;
namespace OpenRA.Widgets.Delegates namespace OpenRA.Widgets.Delegates
{ {
@@ -19,7 +20,7 @@ namespace OpenRA.Widgets.Delegates
MapStub Map = null; MapStub Map = null;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public MapChooserDelegate( [ObjectCreator.Param( "widget" )] Widget bg ) internal MapChooserDelegate( [ObjectCreator.Param( "widget" )] Widget bg, [ObjectCreator.Param] OrderManager orderManager )
{ {
bg.SpecialOneArg = (map) => RefreshMapList(map); bg.SpecialOneArg = (map) => RefreshMapList(map);
var ml = bg.GetWidget<ListBoxWidget>("MAP_LIST"); var ml = bg.GetWidget<ListBoxWidget>("MAP_LIST");
@@ -32,7 +33,7 @@ namespace OpenRA.Widgets.Delegates
bg.GetWidget("BUTTON_OK").OnMouseUp = mi => bg.GetWidget("BUTTON_OK").OnMouseUp = mi =>
{ {
Game.IssueOrder(Order.Command("map " + Map.Uid)); orderManager.IssueOrder(Order.Command("map " + Map.Uid));
Widget.CloseWindow(); Widget.CloseWindow();
return true; return true;
}; };

View File

@@ -24,7 +24,7 @@ namespace OpenRA.Widgets.Delegates
var perfText = perfRoot.GetWidget<LabelWidget>("TEXT"); var perfText = perfRoot.GetWidget<LabelWidget>("TEXT");
perfText.GetText = () => "Render {0} ({5}={2:F1} ms)\nTick {4} ({3:F1} ms)".F( perfText.GetText = () => "Render {0} ({5}={2:F1} ms)\nTick {4} ({3:F1} ms)".F(
Game.RenderFrame, Game.RenderFrame,
Game.orderManager.FrameNumber, Game.orderManager.NetFrameNumber,
PerfHistory.items["render"].LastValue, PerfHistory.items["render"].LastValue,
PerfHistory.items["tick_time"].LastValue, PerfHistory.items["tick_time"].LastValue,
Game.LocalTick, Game.LocalTick,

View File

@@ -90,8 +90,8 @@ namespace OpenRA.Widgets
{ {
if (world.OrderGenerator == null) return; if (world.OrderGenerator == null) return;
var orders = world.OrderGenerator.Order(world, xy.ToInt2(), mi).ToArray(); var orders = world.OrderGenerator.Order(world, xy.ToInt2(), mi).ToArray();
Game.orderManager.IssueOrders( orders ); orders.Do( o => world.IssueOrder( o ) );
// Find an actor with a phrase to say // Find an actor with a phrase to say
var done = false; var done = false;
@@ -113,9 +113,6 @@ namespace OpenRA.Widgets
{ {
return Sync.CheckSyncUnchanged( world, () => return Sync.CheckSyncUnchanged( world, () =>
{ {
if (!world.GameHasStarted)
return "default";
var mi = new MouseInput var mi = new MouseInput
{ {
Location = pos, Location = pos,

View File

@@ -38,8 +38,6 @@ namespace OpenRA
public void AddPlayer(Player p) { players[p.Index] = p; } public void AddPlayer(Player p) { players[p.Index] = p; }
public bool GameHasStarted { get { return Game.orderManager.GameStarted; } }
int localPlayerIndex; int localPlayerIndex;
public Player LocalPlayer public Player LocalPlayer
{ {
@@ -57,6 +55,8 @@ namespace OpenRA
public readonly Map Map; public readonly Map Map;
public readonly TileSet TileSet; public readonly TileSet TileSet;
public void IssueOrder( Order o ) { orderManager.IssueOrder( o ); } /* avoid exposing the OM to mod code */
IOrderGenerator orderGenerator_; IOrderGenerator orderGenerator_;
public IOrderGenerator OrderGenerator public IOrderGenerator OrderGenerator
{ {

View File

@@ -299,7 +299,7 @@ namespace OpenRA.Mods.RA
int2 newRallyPoint = ChooseRallyLocationNear(a.Location); int2 newRallyPoint = ChooseRallyLocationNear(a.Location);
newRallyPoint.X += 4; newRallyPoint.X += 4;
newRallyPoint.Y += 4; newRallyPoint.Y += 4;
Game.IssueOrder(new Order("SetRallyPoint", a, newRallyPoint)); world.IssueOrder(new Order("SetRallyPoint", a, newRallyPoint));
} }
} }
@@ -332,7 +332,7 @@ namespace OpenRA.Mods.RA
range = Math.Max(range, loopCount / 2); range = Math.Max(range, loopCount / 2);
if (loopCount > 10) return false; if (loopCount > 10) return false;
} while (!a.Trait<IMove>().CanEnterCell(xy) && xy != a.Location); } while (!a.Trait<IMove>().CanEnterCell(xy) && xy != a.Location);
Game.IssueOrder(new Order("Move", a, xy)); world.IssueOrder(new Order("Move", a, xy));
return true; return true;
} }
@@ -345,7 +345,7 @@ namespace OpenRA.Mods.RA
if (mcv != null) if (mcv != null)
{ {
baseCenter = mcv.Location; baseCenter = mcv.Location;
Game.IssueOrder(new Order("DeployTransform", mcv)); world.IssueOrder(new Order("DeployTransform", mcv));
} }
else else
Game.Debug("AI: Can't find the MCV."); Game.Debug("AI: Can't find the MCV.");
@@ -380,7 +380,7 @@ namespace OpenRA.Mods.RA
if (found == true) if (found == true)
{ {
Game.IssueOrder(Order.StartProduction(queue.self, unit.Name, 1)); world.IssueOrder(Order.StartProduction(queue.self, unit.Name, 1));
} }
} }
} }
@@ -411,7 +411,7 @@ namespace OpenRA.Mods.RA
{ {
Game.Debug("AI: Starting production of {0}".F(item.Name)); Game.Debug("AI: Starting production of {0}".F(item.Name));
bstate = BuildState.WaitForProduction; bstate = BuildState.WaitForProduction;
Game.IssueOrder(Order.StartProduction(queue.self, item.Name, 1)); world.IssueOrder(Order.StartProduction(queue.self, item.Name, 1));
} }
} }
break; break;
@@ -420,7 +420,7 @@ namespace OpenRA.Mods.RA
if (currentBuilding == null) return; /* let it happen.. */ if (currentBuilding == null) return; /* let it happen.. */
else if (currentBuilding.Paused) else if (currentBuilding.Paused)
Game.IssueOrder(Order.PauseProduction(queue.self, currentBuilding.Item, false)); world.IssueOrder(Order.PauseProduction(queue.self, currentBuilding.Item, false));
else if (currentBuilding.Done) else if (currentBuilding.Done)
{ {
bstate = BuildState.WaitForFeedback; bstate = BuildState.WaitForFeedback;
@@ -431,11 +431,11 @@ namespace OpenRA.Mods.RA
if (location == null) if (location == null)
{ {
Game.Debug("AI: Nowhere to place {0}".F(currentBuilding.Item)); Game.Debug("AI: Nowhere to place {0}".F(currentBuilding.Item));
Game.IssueOrder(Order.CancelProduction(queue.self, currentBuilding.Item, 1)); world.IssueOrder(Order.CancelProduction(queue.self, currentBuilding.Item, 1));
} }
else else
{ {
Game.IssueOrder(new Order("PlaceBuilding", p.PlayerActor, location.Value, currentBuilding.Item)); world.IssueOrder(new Order("PlaceBuilding", p.PlayerActor, location.Value, currentBuilding.Item));
} }
} }
break; break;
@@ -473,7 +473,7 @@ namespace OpenRA.Mods.RA
{ {
Game.Debug("AI: Starting production of {0}".F(item.Name)); Game.Debug("AI: Starting production of {0}".F(item.Name));
dstate = BuildState.WaitForProduction; dstate = BuildState.WaitForProduction;
Game.IssueOrder(Order.StartProduction(queue.self, item.Name, 1)); world.IssueOrder(Order.StartProduction(queue.self, item.Name, 1));
} }
} }
break; break;
@@ -482,7 +482,7 @@ namespace OpenRA.Mods.RA
if (currentBuilding == null) return; /* let it happen.. */ if (currentBuilding == null) return; /* let it happen.. */
else if (currentBuilding.Paused) else if (currentBuilding.Paused)
Game.IssueOrder(Order.PauseProduction(queue.self, currentBuilding.Item, false)); world.IssueOrder(Order.PauseProduction(queue.self, currentBuilding.Item, false));
else if (currentBuilding.Done) else if (currentBuilding.Done)
{ {
dstate = BuildState.WaitForFeedback; dstate = BuildState.WaitForFeedback;
@@ -493,11 +493,11 @@ namespace OpenRA.Mods.RA
if (location == null) if (location == null)
{ {
Game.Debug("AI: Nowhere to place {0}".F(currentBuilding.Item)); Game.Debug("AI: Nowhere to place {0}".F(currentBuilding.Item));
Game.IssueOrder(Order.CancelProduction(queue.self, currentBuilding.Item, 1)); world.IssueOrder(Order.CancelProduction(queue.self, currentBuilding.Item, 1));
} }
else else
{ {
Game.IssueOrder(new Order("PlaceBuilding", p.PlayerActor, location.Value, currentBuilding.Item)); world.IssueOrder(new Order("PlaceBuilding", p.PlayerActor, location.Value, currentBuilding.Item));
} }
} }
break; break;

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA
protected override void OnActivate() protected override void OnActivate()
{ {
Game.IssueOrder(new Order("SonarPulse", Owner.PlayerActor)); Self.World.IssueOrder(new Order("SonarPulse", Owner.PlayerActor));
} }
public void ResolveOrder(Actor self, Order order) public void ResolveOrder(Actor self, Order order)

View File

@@ -347,7 +347,7 @@ namespace OpenRA.Mods.RA.Widgets
if (producing.Paused) if (producing.Paused)
{ {
Game.IssueOrder(Order.PauseProduction(CurrentQueue.self, item, false)); world.IssueOrder(Order.PauseProduction(CurrentQueue.self, item, false));
return; return;
} }
} }
@@ -368,12 +368,12 @@ namespace OpenRA.Mods.RA.Widgets
{ {
numberToCancel = -1; //cancel all numberToCancel = -1; //cancel all
} }
Game.IssueOrder(Order.CancelProduction(CurrentQueue.self, item, numberToCancel)); world.IssueOrder(Order.CancelProduction(CurrentQueue.self, item, numberToCancel));
} }
else else
{ {
Sound.Play(eva.OnHoldAudio); Sound.Play(eva.OnHoldAudio);
Game.IssueOrder(Order.PauseProduction(CurrentQueue.self, item, true)); world.IssueOrder(Order.PauseProduction(CurrentQueue.self, item, true));
} }
} }
} }
@@ -386,7 +386,7 @@ namespace OpenRA.Mods.RA.Widgets
Sound.Play(unit.Traits.Contains<BuildingInfo>() ? eva.BuildingSelectAudio : eva.UnitSelectAudio); Sound.Play(unit.Traits.Contains<BuildingInfo>() ? eva.BuildingSelectAudio : eva.UnitSelectAudio);
Game.IssueOrder(Order.StartProduction(CurrentQueue.self, item, world.IssueOrder(Order.StartProduction(CurrentQueue.self, item,
Game.GetModifierKeys().HasModifier(Modifiers.Shift) ? 5 : 1)); Game.GetModifierKeys().HasModifier(Modifiers.Shift) ? 5 : 1));
} }

View File

@@ -53,7 +53,7 @@ namespace OpenRA.Mods.RA.Widgets.Delegates
optionsBG.GetWidget("SURRENDER").OnMouseUp = mi => optionsBG.GetWidget("SURRENDER").OnMouseUp = mi =>
{ {
Game.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor)); world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor));
return true; return true;
}; };