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 ModData modData;
private static World world;
private static WorldRenderer worldRenderer;
public static Viewport viewport;
@@ -44,15 +43,6 @@ namespace OpenRA
public static Renderer Renderer;
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)
{
viewport.Center(loc);
@@ -93,14 +83,14 @@ namespace OpenRA
}
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
internal static event Action<OrderManager> ConnectionStateChanged = _ => { };
static ConnectionState lastConnectionState = ConnectionState.PreConnecting;
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)
{
@@ -116,20 +106,21 @@ namespace OpenRA
{
lastTime += Settings.Game.Timestep;
Widget.DoTick();
if( world.GameHasStarted && world.LocalPlayer != null )
var world = orderManager.world;
if( orderManager.GameStarted && world.LocalPlayer != null )
++Viewport.TicksSinceLastMove;
Sound.Tick();
Sync.CheckSyncUnchanged( world, () => { orderManager.TickImmediate( world ); } );
Sync.CheckSyncUnchanged( world, () => { orderManager.TickImmediate(); } );
var isNetTick = LocalTick % NetTickScale == 0;
if (!isNetTick || orderManager.IsReadyForNextFrame)
{
++LocalTick;
++orderManager.LocalFrameNumber;
Log.Write("debug", "--Tick: {0} ({1})", LocalTick, isNetTick ? "net" : "local");
if (isNetTick) orderManager.Tick(world);
if (isNetTick) orderManager.Tick();
world.OrderGenerator.Tick(world);
world.Selection.Tick(world);
@@ -139,7 +130,7 @@ namespace OpenRA
PerfHistory.Tick();
}
else
if (orderManager.FrameNumber == 0)
if (orderManager.NetFrameNumber == 0)
lastTime = Environment.TickCount;
}
}
@@ -147,7 +138,7 @@ namespace OpenRA
using (new PerfSample("render"))
{
++RenderFrame;
viewport.DrawRegions(worldRenderer, world);
viewport.DrawRegions(worldRenderer);
Sound.SetListenerPosition(viewport.Location + .5f * new float2(viewport.Width, viewport.Height));
}
@@ -166,31 +157,30 @@ namespace OpenRA
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 BeforeGameStart = () => {};
internal static void StartGame(string map)
internal static void StartGame(string mapUID)
{
world = null;
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;
Widget.SelectedWidget = null;
LocalTick = 0;
orderManager.LocalFrameNumber = 0;
orderManager.StartGame();
worldRenderer.RefreshPalette();
AfterGameStart( world );
AfterGameStart( orderManager.world );
}
public static void DispatchMouseInput(MouseInputEvent ev, MouseEventArgs e, Modifiers modifierKeys)
{
var world = Game.world;
if (world == null) return;
Sync.CheckSyncUnchanged( world, () =>
Sync.CheckSyncUnchanged( orderManager.world, () =>
{
var mi = new MouseInput
{
@@ -210,10 +200,7 @@ namespace OpenRA
public static void HandleKeyEvent(KeyInput e)
{
var world = Game.world;
if( world == null ) return;
Sync.CheckSyncUnchanged( world, () =>
Sync.CheckSyncUnchanged( orderManager.world, () =>
{
Widget.HandleKeyPress( e );
} );
@@ -269,7 +256,7 @@ namespace OpenRA
JoinLocal();
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 =>
{
@@ -309,7 +296,7 @@ namespace OpenRA
{
while (!quit)
{
Tick( world, orderManager, viewport );
Tick( orderManager, viewport );
Application.DoEvents();
}
}

View File

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

View File

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

View File

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

View File

@@ -9,31 +9,33 @@ namespace OpenRA.Network
{
class SyncReport
{
readonly OrderManager orderManager;
const int numSyncReports = 5;
Report[] syncReports = new Report[numSyncReports];
int curIndex = 0;
public SyncReport()
public SyncReport( OrderManager orderManager )
{
this.orderManager = orderManager;
for (var i = 0; i < numSyncReports; i++)
syncReports[i] = new SyncReport.Report();
}
internal void UpdateSyncReport( World world )
internal void UpdateSyncReport()
{
if (!Game.Settings.Debug.RecordSyncReports)
return;
GenerateSyncReport(world, syncReports[curIndex]);
GenerateSyncReport(syncReports[curIndex]);
curIndex = ++curIndex % numSyncReports;
}
void GenerateSyncReport(World world, Report report)
void GenerateSyncReport(Report report)
{
report.Frame = Game.orderManager.FrameNumber;
report.SyncedRandom = world.SharedRandom.Last;
report.Frame = orderManager.NetFrameNumber;
report.SyncedRandom = orderManager.world.SharedRandom.Last;
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);
if (sync != 0)

View File

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

View File

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

View File

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

View File

@@ -45,7 +45,7 @@ namespace OpenRA.Widgets.Delegates
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().DisableShroud;
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;
};
@@ -53,7 +53,7 @@ namespace OpenRA.Widgets.Delegates
() => Game.Settings.Debug.ShowCollisions;
devmodeBG.GetWidget("CHECKBOX_UNITDEBUG").OnMouseDown = mi =>
{
Game.IssueOrder(new Order("DevUnitDebug", world.LocalPlayer.PlayerActor));
world.IssueOrder(new Order("DevUnitDebug", world.LocalPlayer.PlayerActor));
return true;
};
@@ -61,13 +61,13 @@ namespace OpenRA.Widgets.Delegates
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug;
devmodeBG.GetWidget("CHECKBOX_PATHDEBUG").OnMouseDown = mi =>
{
Game.IssueOrder(new Order("DevPathDebug", world.LocalPlayer.PlayerActor));
world.IssueOrder(new Order("DevPathDebug", world.LocalPlayer.PlayerActor));
return true;
};
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;
};
@@ -75,7 +75,7 @@ namespace OpenRA.Widgets.Delegates
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().FastBuild;
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;
};
@@ -83,7 +83,7 @@ namespace OpenRA.Widgets.Delegates
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().FastCharge;
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;
};
@@ -91,13 +91,13 @@ namespace OpenRA.Widgets.Delegates
() => world.LocalPlayer.PlayerActor.Trait<DeveloperMode>().AllTech;
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;
};
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;
};

View File

@@ -138,7 +138,7 @@ namespace OpenRA.Widgets.Delegates
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)));
bw.Text = nextStance.ToString();

View File

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

View File

@@ -11,6 +11,7 @@
using System.Drawing;
using System.Linq;
using OpenRA.FileFormats;
using OpenRA.Network;
namespace OpenRA.Widgets.Delegates
{
@@ -19,7 +20,7 @@ namespace OpenRA.Widgets.Delegates
MapStub Map = null;
[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);
var ml = bg.GetWidget<ListBoxWidget>("MAP_LIST");
@@ -32,7 +33,7 @@ namespace OpenRA.Widgets.Delegates
bg.GetWidget("BUTTON_OK").OnMouseUp = mi =>
{
Game.IssueOrder(Order.Command("map " + Map.Uid));
orderManager.IssueOrder(Order.Command("map " + Map.Uid));
Widget.CloseWindow();
return true;
};

View File

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

View File

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

View File

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

View File

@@ -299,7 +299,7 @@ namespace OpenRA.Mods.RA
int2 newRallyPoint = ChooseRallyLocationNear(a.Location);
newRallyPoint.X += 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);
if (loopCount > 10) return false;
} 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;
}
@@ -345,7 +345,7 @@ namespace OpenRA.Mods.RA
if (mcv != null)
{
baseCenter = mcv.Location;
Game.IssueOrder(new Order("DeployTransform", mcv));
world.IssueOrder(new Order("DeployTransform", mcv));
}
else
Game.Debug("AI: Can't find the MCV.");
@@ -380,7 +380,7 @@ namespace OpenRA.Mods.RA
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));
bstate = BuildState.WaitForProduction;
Game.IssueOrder(Order.StartProduction(queue.self, item.Name, 1));
world.IssueOrder(Order.StartProduction(queue.self, item.Name, 1));
}
}
break;
@@ -420,7 +420,7 @@ namespace OpenRA.Mods.RA
if (currentBuilding == null) return; /* let it happen.. */
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)
{
bstate = BuildState.WaitForFeedback;
@@ -431,11 +431,11 @@ namespace OpenRA.Mods.RA
if (location == null)
{
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
{
Game.IssueOrder(new Order("PlaceBuilding", p.PlayerActor, location.Value, currentBuilding.Item));
world.IssueOrder(new Order("PlaceBuilding", p.PlayerActor, location.Value, currentBuilding.Item));
}
}
break;
@@ -473,7 +473,7 @@ namespace OpenRA.Mods.RA
{
Game.Debug("AI: Starting production of {0}".F(item.Name));
dstate = BuildState.WaitForProduction;
Game.IssueOrder(Order.StartProduction(queue.self, item.Name, 1));
world.IssueOrder(Order.StartProduction(queue.self, item.Name, 1));
}
}
break;
@@ -482,7 +482,7 @@ namespace OpenRA.Mods.RA
if (currentBuilding == null) return; /* let it happen.. */
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)
{
dstate = BuildState.WaitForFeedback;
@@ -493,11 +493,11 @@ namespace OpenRA.Mods.RA
if (location == null)
{
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
{
Game.IssueOrder(new Order("PlaceBuilding", p.PlayerActor, location.Value, currentBuilding.Item));
world.IssueOrder(new Order("PlaceBuilding", p.PlayerActor, location.Value, currentBuilding.Item));
}
}
break;

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA
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)

View File

@@ -347,7 +347,7 @@ namespace OpenRA.Mods.RA.Widgets
if (producing.Paused)
{
Game.IssueOrder(Order.PauseProduction(CurrentQueue.self, item, false));
world.IssueOrder(Order.PauseProduction(CurrentQueue.self, item, false));
return;
}
}
@@ -368,12 +368,12 @@ namespace OpenRA.Mods.RA.Widgets
{
numberToCancel = -1; //cancel all
}
Game.IssueOrder(Order.CancelProduction(CurrentQueue.self, item, numberToCancel));
world.IssueOrder(Order.CancelProduction(CurrentQueue.self, item, numberToCancel));
}
else
{
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);
Game.IssueOrder(Order.StartProduction(CurrentQueue.self, item,
world.IssueOrder(Order.StartProduction(CurrentQueue.self, item,
Game.GetModifierKeys().HasModifier(Modifiers.Shift) ? 5 : 1));
}

View File

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