diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 851919c65d..5bc6034f5c 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -9,6 +9,7 @@ #endregion using System; +using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; @@ -186,7 +187,7 @@ namespace OpenRA public static void IssueOrder( Order o ) { orderManager.IssueOrder( o ); } /* avoid exposing the OM to mod code */ - public static event Action AfterGameStart = () => {}; + public static event Action AfterGameStart = _ => {}; public static event Action BeforeGameStart = () => {}; internal static void StartGame(string map) { @@ -200,7 +201,7 @@ namespace OpenRA orderManager.StartGame(); viewport.RefreshPalette(); - AfterGameStart(); + AfterGameStart( world ); } public static void DispatchMouseInput(MouseInputEvent ev, MouseEventArgs e, Modifiers modifierKeys) @@ -291,7 +292,7 @@ namespace OpenRA JoinLocal(); StartGame(modData.Manifest.ShellmapUid); - Game.BeforeGameStart += () => Widget.OpenWindow("INGAME_ROOT"); + Game.AfterGameStart += world => Widget.OpenWindow("INGAME_ROOT", new Dictionary{{"world", world}}); Game.ConnectionStateChanged += () => { @@ -318,7 +319,7 @@ namespace OpenRA } }; - modData.WidgetLoader.LoadWidget( Widget.RootWidget, "PERF_BG" ); + modData.WidgetLoader.LoadWidget( new Dictionary(), Widget.RootWidget, "PERF_BG" ); Widget.OpenWindow("MAINMENU_BG"); ResetTimer(); diff --git a/OpenRA.Game/Widgets/Delegates/DeveloperModeDelegate.cs b/OpenRA.Game/Widgets/Delegates/DeveloperModeDelegate.cs index 9642659022..c2a03fdf38 100644 --- a/OpenRA.Game/Widgets/Delegates/DeveloperModeDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/DeveloperModeDelegate.cs @@ -23,14 +23,15 @@ using OpenRA; using OpenRA.Traits; using OpenRA.Widgets; - namespace OpenRA.Widgets.Delegates { - public class DeveloperModeDelegate : IWidgetDelegate { - public DeveloperModeDelegate () - { + readonly World world; + [ObjectCreator.UseCtor] + public DeveloperModeDelegate( [ObjectCreator.Param("world")] World world ) + { + this.world = world; var devmodeBG = Widget.RootWidget.GetWidget("INGAME_ROOT").GetWidget("DEVELOPERMODE_BG"); var devModeButton = Widget.RootWidget.GetWidget("INGAME_DEVELOPERMODE_BUTTON"); @@ -41,10 +42,10 @@ namespace OpenRA.Widgets.Delegates }; devmodeBG.GetWidget("CHECKBOX_SHROUD").Checked = - () => Game.world.LocalPlayer.PlayerActor.Trait().DisableShroud; + () => world.LocalPlayer.PlayerActor.Trait().DisableShroud; devmodeBG.GetWidget("CHECKBOX_SHROUD").OnMouseDown = mi => { - Game.IssueOrder(new Order("DevShroud", Game.world.LocalPlayer.PlayerActor)); + Game.IssueOrder(new Order("DevShroud", world.LocalPlayer.PlayerActor)); return true; }; @@ -52,51 +53,51 @@ namespace OpenRA.Widgets.Delegates () => Game.Settings.Debug.ShowCollisions; devmodeBG.GetWidget("CHECKBOX_UNITDEBUG").OnMouseDown = mi => { - Game.IssueOrder(new Order("DevUnitDebug", Game.world.LocalPlayer.PlayerActor)); + Game.IssueOrder(new Order("DevUnitDebug", world.LocalPlayer.PlayerActor)); return true; }; devmodeBG.GetWidget("CHECKBOX_PATHDEBUG").Checked = - () => Game.world.LocalPlayer.PlayerActor.Trait().PathDebug; + () => world.LocalPlayer.PlayerActor.Trait().PathDebug; devmodeBG.GetWidget("CHECKBOX_PATHDEBUG").OnMouseDown = mi => { - Game.IssueOrder(new Order("DevPathDebug", Game.world.LocalPlayer.PlayerActor)); + Game.IssueOrder(new Order("DevPathDebug", world.LocalPlayer.PlayerActor)); return true; }; devmodeBG.GetWidget("GIVE_CASH").OnMouseUp = mi => { - Game.IssueOrder(new Order("DevGiveCash", Game.world.LocalPlayer.PlayerActor)); + Game.IssueOrder(new Order("DevGiveCash", world.LocalPlayer.PlayerActor)); return true; }; devmodeBG.GetWidget("INSTANT_BUILD").Checked = - () => Game.world.LocalPlayer.PlayerActor.Trait().FastBuild; + () => world.LocalPlayer.PlayerActor.Trait().FastBuild; devmodeBG.GetWidget("INSTANT_BUILD").OnMouseDown = mi => { - Game.IssueOrder(new Order("DevFastBuild", Game.world.LocalPlayer.PlayerActor)); + Game.IssueOrder(new Order("DevFastBuild", world.LocalPlayer.PlayerActor)); return true; }; devmodeBG.GetWidget("INSTANT_CHARGE").Checked = - () => Game.world.LocalPlayer.PlayerActor.Trait().FastCharge; + () => world.LocalPlayer.PlayerActor.Trait().FastCharge; devmodeBG.GetWidget("INSTANT_CHARGE").OnMouseDown = mi => { - Game.IssueOrder(new Order("DevFastCharge", Game.world.LocalPlayer.PlayerActor)); + Game.IssueOrder(new Order("DevFastCharge", world.LocalPlayer.PlayerActor)); return true; }; devmodeBG.GetWidget("ENABLE_TECH").Checked = - () => Game.world.LocalPlayer.PlayerActor.Trait().AllTech; + () => world.LocalPlayer.PlayerActor.Trait().AllTech; devmodeBG.GetWidget("ENABLE_TECH").OnMouseDown = mi => { - Game.IssueOrder(new Order("DevEnableTech", Game.world.LocalPlayer.PlayerActor)); + Game.IssueOrder(new Order("DevEnableTech", world.LocalPlayer.PlayerActor)); return true; }; devmodeBG.GetWidget("GIVE_EXPLORATION").OnMouseUp = mi => { - Game.IssueOrder(new Order("DevGiveExploration", Game.world.LocalPlayer.PlayerActor)); + Game.IssueOrder(new Order("DevGiveExploration", world.LocalPlayer.PlayerActor)); return true; }; diff --git a/OpenRA.Game/Widgets/Delegates/DiplomacyDelegate.cs b/OpenRA.Game/Widgets/Delegates/DiplomacyDelegate.cs index 2787b614d4..be37272216 100644 --- a/OpenRA.Game/Widgets/Delegates/DiplomacyDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/DiplomacyDelegate.cs @@ -21,8 +21,11 @@ namespace OpenRA.Widgets.Delegates static List controls = new List(); int validPlayers = 0; - public DiplomacyDelegate() + readonly World world; + [ObjectCreator.UseCtor] + public DiplomacyDelegate( [ObjectCreator.Param("world")] World world ) { + this.world = world; var root = Widget.RootWidget.GetWidget("INGAME_ROOT"); var diplomacyBG = root.GetWidget("DIPLOMACY_BG"); var diplomacy = root.GetWidget("INGAME_DIPLOMACY_BUTTON"); @@ -34,7 +37,7 @@ namespace OpenRA.Widgets.Delegates return true; }; - Game.AfterGameStart += () => validPlayers = Game.world.players.Values.Where(a => a != Game.world.LocalPlayer && !a.NonCombatant).Count(); + Game.AfterGameStart += _ => validPlayers = world.players.Values.Where(a => a != world.LocalPlayer && !a.NonCombatant).Count(); diplomacy.IsVisible = () => (validPlayers > 0); } @@ -71,7 +74,7 @@ namespace OpenRA.Widgets.Delegates y += 35; - foreach (var p in Game.world.players.Values.Where(a => a != Game.world.LocalPlayer && !a.NonCombatant)) + foreach (var p in world.players.Values.Where(a => a != world.LocalPlayer && !a.NonCombatant)) { var pp = p; var label = new LabelWidget @@ -94,7 +97,7 @@ namespace OpenRA.Widgets.Delegates Align = LabelWidget.TextAlign.Left, Bold = false, - GetText = () => pp.Stances[ Game.world.LocalPlayer ].ToString(), + GetText = () => pp.Stances[ world.LocalPlayer ].ToString(), }; bg.AddChild(theirStance); @@ -104,7 +107,7 @@ namespace OpenRA.Widgets.Delegates { Bounds = new Rectangle( margin + 2 * labelWidth + 20, y, labelWidth, 25), Id = "DIPLOMACY_PLAYER_LABEL_MY_{0}".F(p.Index), - Text = Game.world.LocalPlayer.Stances[ pp ].ToString(), + Text = world.LocalPlayer.Stances[ pp ].ToString(), }; myStance.OnMouseUp = mi => { CycleStance(pp, myStance); return true; }; @@ -135,7 +138,7 @@ namespace OpenRA.Widgets.Delegates var nextStance = GetNextStance((Stance)Enum.Parse(typeof(Stance), bw.Text)); - Game.IssueOrder(new Order("SetStance", Game.world.LocalPlayer.PlayerActor, + Game.IssueOrder(new Order("SetStance", world.LocalPlayer.PlayerActor, new int2(p.Index, (int)nextStance))); bw.Text = nextStance.ToString(); diff --git a/OpenRA.Game/Widgets/Widget.cs b/OpenRA.Game/Widgets/Widget.cs index d5344f9e43..3e0d9921cf 100644 --- a/OpenRA.Game/Widgets/Widget.cs +++ b/OpenRA.Game/Widgets/Widget.cs @@ -124,12 +124,13 @@ namespace OpenRA.Widgets height); } - public void PostInit() + public void PostInit( Dictionary args ) { if( Delegate != null ) { - var createDict = new Dictionary { { "widget", this } }; - Game.modData.ObjectCreator.CreateObject( Delegate, createDict ); + args[ "widget" ] = this; + Game.modData.ObjectCreator.CreateObject( Delegate, args ); + args.Remove( "widget" ); } } @@ -320,9 +321,14 @@ namespace OpenRA.Widgets rootWidget.Children.Add( WindowList.Peek() ); } - public static Widget OpenWindow(string id) + public static Widget OpenWindow( string id ) { - var window = Game.modData.WidgetLoader.LoadWidget( rootWidget, id ); + return OpenWindow( id, new Dictionary() ); + } + + public static Widget OpenWindow(string id, Dictionary args ) + { + var window = Game.modData.WidgetLoader.LoadWidget( args, rootWidget, id ); if( WindowList.Count > 0 ) rootWidget.Children.Remove( WindowList.Peek() ); WindowList.Push( window ); diff --git a/OpenRA.Game/Widgets/WidgetLoader.cs b/OpenRA.Game/Widgets/WidgetLoader.cs index 82a85d18dd..6982f1e0ae 100644 --- a/OpenRA.Game/Widgets/WidgetLoader.cs +++ b/OpenRA.Game/Widgets/WidgetLoader.cs @@ -33,14 +33,14 @@ namespace OpenRA widgets.Add( w.Key.Substring( w.Key.IndexOf( '@' ) + 1 ), w ); } - public Widget LoadWidget( Widget parent, string w ) + public Widget LoadWidget( Dictionary args, Widget parent, string w ) { - return LoadWidget( parent, widgets[ w ] ); + return LoadWidget( args, parent, widgets[ w ] ); } - public Widget LoadWidget( Widget parent, MiniYamlNode node) + public Widget LoadWidget( Dictionary args, Widget parent, MiniYamlNode node) { - var widget = NewWidget(node.Key); + var widget = NewWidget(node.Key, args); parent.AddChild( widget ); foreach (var child in node.Value.Nodes) @@ -52,16 +52,16 @@ namespace OpenRA foreach (var child in node.Value.Nodes) if (child.Key == "Children") foreach (var c in child.Value.Nodes) - LoadWidget( widget, c); + LoadWidget( args, widget, c); - widget.PostInit(); + widget.PostInit( args ); return widget; } - Widget NewWidget(string widgetType) + Widget NewWidget(string widgetType, Dictionary args) { widgetType = widgetType.Split('@')[0]; - return Game.CreateObject(widgetType + "Widget"); + return Game.modData.ObjectCreator.CreateObject(widgetType + "Widget", args); } } } \ No newline at end of file diff --git a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs index f39213a89d..c999c93c97 100644 --- a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs +++ b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs @@ -19,7 +19,12 @@ namespace OpenRA.Widgets { class WorldInteractionControllerWidget : Widget { - public WorldInteractionControllerWidget() : base() {} + readonly World world; + [ObjectCreator.UseCtor] + public WorldInteractionControllerWidget( [ObjectCreator.Param( "world" )] World world ) + { + this.world = world; + } public override void DrawInner( World world ) { @@ -43,7 +48,6 @@ namespace OpenRA.Widgets public override bool HandleInputInner(MouseInput mi) { var xy = Game.viewport.ViewToWorld(mi); - var world = Game.world; if (mi.Button == MouseButton.Left && mi.Event == MouseInputEvent.Down) { dragStart = dragEnd = xy; @@ -106,7 +110,6 @@ namespace OpenRA.Widgets public override string GetCursor(int2 pos) { - var world = Game.world; return Sync.CheckSyncUnchanged( world, () => { if (!world.GameHasStarted) @@ -129,7 +132,7 @@ namespace OpenRA.Widgets { if (e.KeyName.Length == 1 && char.IsDigit(e.KeyName[0])) { - Game.world.Selection.DoControlGroup(Game.world, e.KeyName[0] - '0', e.Modifiers); + world.Selection.DoControlGroup(world, e.KeyName[0] - '0', e.Modifiers); return true; } @@ -144,7 +147,6 @@ namespace OpenRA.Widgets public void GotoNextBase() { - var world = Game.world; var bases = world.Queries.OwnedBy[world.LocalPlayer].WithTrait().ToArray(); if (!bases.Any()) return; diff --git a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs index 923377122e..5ce2f7e143 100755 --- a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs +++ b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs @@ -47,7 +47,12 @@ namespace OpenRA.Mods.RA.Widgets public readonly string BuildPaletteClose = "bleep13.aud"; public readonly string TabClick = "ramenu1.aud"; - public BuildPaletteWidget() : base() { } + readonly World world; + [ObjectCreator.UseCtor] + public BuildPaletteWidget( [ObjectCreator.Param("world")] World world ) + { + this.world = world; + } public override void Initialize() { @@ -148,7 +153,7 @@ namespace OpenRA.Mods.RA.Widgets return true; } - return DoBuildingHotkey(Char.ToLowerInvariant(e.KeyChar), Game.world); + return DoBuildingHotkey(Char.ToLowerInvariant(e.KeyChar), world); } public override bool HandleInputInner(MouseInput mi) diff --git a/OpenRA.Mods.RA/Widgets/Delegates/IngameChromeDelegate.cs b/OpenRA.Mods.RA/Widgets/Delegates/IngameChromeDelegate.cs index fbc4913705..70b3d9cc2d 100755 --- a/OpenRA.Mods.RA/Widgets/Delegates/IngameChromeDelegate.cs +++ b/OpenRA.Mods.RA/Widgets/Delegates/IngameChromeDelegate.cs @@ -15,8 +15,11 @@ namespace OpenRA.Mods.RA.Widgets.Delegates { public class IngameChromeDelegate : IWidgetDelegate { - public IngameChromeDelegate() - { + readonly World world; + [ObjectCreator.UseCtor] + public IngameChromeDelegate( [ObjectCreator.Param("world")] World world ) + { + this.world = world; var r = Widget.RootWidget; var gameRoot = r.GetWidget("INGAME_ROOT"); var optionsBG = gameRoot.GetWidget("INGAME_OPTIONS_BG"); @@ -50,7 +53,7 @@ namespace OpenRA.Mods.RA.Widgets.Delegates optionsBG.GetWidget("SURRENDER").OnMouseUp = mi => { - Game.IssueOrder(new Order("Surrender", Game.world.LocalPlayer.PlayerActor)); + Game.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor)); return true; }; @@ -66,12 +69,12 @@ namespace OpenRA.Mods.RA.Widgets.Delegates var postgameText = postgameBG.GetWidget("TEXT"); postgameBG.IsVisible = () => { - return Game.world.LocalPlayer != null && Game.world.LocalPlayer.WinState != WinState.Undefined; + return world.LocalPlayer != null && world.LocalPlayer.WinState != WinState.Undefined; }; postgameText.GetText = () => { - var state = Game.world.LocalPlayer.WinState; + var state = world.LocalPlayer.WinState; return (state == WinState.Undefined)? "" : ((state == WinState.Lost)? "YOU ARE DEFEATED" : "YOU ARE VICTORIOUS"); }; diff --git a/OpenRA.Mods.RA/Widgets/Delegates/OrderButtonsChromeDelegate.cs b/OpenRA.Mods.RA/Widgets/Delegates/OrderButtonsChromeDelegate.cs index 19a46682bf..43cfa58ae8 100644 --- a/OpenRA.Mods.RA/Widgets/Delegates/OrderButtonsChromeDelegate.cs +++ b/OpenRA.Mods.RA/Widgets/Delegates/OrderButtonsChromeDelegate.cs @@ -8,15 +8,19 @@ */ #endregion +using OpenRA; using OpenRA.Mods.RA.Orders; using OpenRA.Widgets; namespace OpenRA.Mods.RA.Widgets.Delegates { public class OrderButtonsChromeDelegate : IWidgetDelegate - { - public OrderButtonsChromeDelegate() - { + { + readonly World world; + [ObjectCreator.UseCtor] + public OrderButtonsChromeDelegate( [ObjectCreator.Param("world")] World world ) + { + this.world = world; var r = Widget.RootWidget; var gameRoot = r.GetWidget("INGAME_ROOT"); @@ -25,23 +29,23 @@ namespace OpenRA.Mods.RA.Widgets.Delegates var sell = moneybin.GetWidget("SELL"); if (sell != null) { - sell.Pressed = () => Game.world.OrderGenerator is SellOrderGenerator; - sell.OnMouseDown = mi => { Game.world.ToggleInputMode(); return true; }; + sell.Pressed = () => world.OrderGenerator is SellOrderGenerator; + sell.OnMouseDown = mi => { world.ToggleInputMode(); return true; }; } var powerdown = moneybin.GetWidget("POWER_DOWN"); if (powerdown != null) { - powerdown.Pressed = () => Game.world.OrderGenerator is PowerDownOrderGenerator; - powerdown.OnMouseDown = mi => { Game.world.ToggleInputMode(); return true; }; + powerdown.Pressed = () => world.OrderGenerator is PowerDownOrderGenerator; + powerdown.OnMouseDown = mi => { world.ToggleInputMode(); return true; }; } var repair = moneybin.GetWidget("REPAIR"); if (repair != null) { - repair.Enabled = () => { return RepairOrderGenerator.PlayerIsAllowedToRepair( Game.world ); }; - repair.Pressed = () => Game.world.OrderGenerator is RepairOrderGenerator; - repair.OnMouseDown = mi => { Game.world.ToggleInputMode(); return true; }; + repair.Enabled = () => { return RepairOrderGenerator.PlayerIsAllowedToRepair( world ); }; + repair.Pressed = () => world.OrderGenerator is RepairOrderGenerator; + repair.OnMouseDown = mi => { world.ToggleInputMode(); return true; }; repair.GetLongDesc = () => { return repair.Enabled() ? repair.LongDesc : repair.LongDesc + "\n\nRequires: Construction Yard"; }; } } diff --git a/OpenRA.Mods.RA/Widgets/RadarBinWidget.cs b/OpenRA.Mods.RA/Widgets/RadarBinWidget.cs index 117fce0df6..452c40db3b 100755 --- a/OpenRA.Mods.RA/Widgets/RadarBinWidget.cs +++ b/OpenRA.Mods.RA/Widgets/RadarBinWidget.cs @@ -75,7 +75,7 @@ namespace OpenRA.Mods.RA.Widgets Modifiers = Game.GetModifierKeys() }; - var cursor = Game.world.OrderGenerator.GetCursor( world, loc, mi ); + var cursor = world.OrderGenerator.GetCursor( world, loc, mi ); if (cursor == null) return "default";