From 30241ddcccb040b71ac0dc1b6ab1f9c77dfc7ce7 Mon Sep 17 00:00:00 2001 From: alzeih Date: Mon, 26 Jul 2010 14:58:23 +1200 Subject: [PATCH] Locate devmode code largely in the trait, reduce exploitability. --- OpenRA.Game/GameRules/UserSettings.cs | 5 +- OpenRA.Game/Graphics/WorldRenderer.cs | 8 +-- OpenRA.Game/Traits/Player/DeveloperMode.cs | 67 ++++++++++++++++--- OpenRA.Game/Traits/Player/PlayerResources.cs | 19 +----- OpenRA.Game/Traits/Player/ProductionQueue.cs | 2 +- OpenRA.Game/Traits/SupportPower.cs | 2 +- .../Delegates/DeveloperModeDelegate.cs | 56 ++++++---------- 7 files changed, 85 insertions(+), 74 deletions(-) diff --git a/OpenRA.Game/GameRules/UserSettings.cs b/OpenRA.Game/GameRules/UserSettings.cs index 9b628546d4..8b4faa193e 100644 --- a/OpenRA.Game/GameRules/UserSettings.cs +++ b/OpenRA.Game/GameRules/UserSettings.cs @@ -20,13 +20,12 @@ namespace OpenRA.GameRules public class UserSettings { // Debug settings - public bool UnitDebug = false; - public bool PathDebug = false; public bool PerfDebug = false; - public bool IndexDebug = false; public bool RecordSyncReports = true; public bool ShowGameTimer = true; public bool DeveloperMode = false; + public bool UnitDebug = false; + public bool IndexDebug = false; // Window settings public WindowMode WindowMode = WindowMode.PseudoFullscreen; diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index 7c3e809d93..db81886a9c 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -32,12 +32,12 @@ namespace OpenRA.Graphics uiOverlay = new UiOverlay(); palette = new HardwarePalette(world.Map); } - + public int GetPaletteIndex(string name) { return palette.GetPaletteIndex(name); } public Palette GetPalette(string name) { return palette.GetPalette(name); } public void AddPalette(string name, Palette pal) { palette.AddPalette(name, pal); } public void UpdatePalette(string name, Palette pal) { palette.UpdatePalette(name, pal); } - + class SpriteComparer : IComparer { public int Compare(Renderable x, Renderable y) @@ -172,8 +172,8 @@ namespace OpenRA.Graphics Game.Renderer.LineRenderer.DrawLine(xY, xY + new float2(0, -4), c, c); Game.Renderer.LineRenderer.DrawLine(XY, XY + new float2(-4, 0), c, c); Game.Renderer.LineRenderer.DrawLine(XY, XY + new float2(0, -4), c, c); - } - + } + public void DrawLocus(Color c, int2[] cells) { var dict = cells.ToDictionary(a => a, a => 0); diff --git a/OpenRA.Game/Traits/Player/DeveloperMode.cs b/OpenRA.Game/Traits/Player/DeveloperMode.cs index 385c036142..cc67fa994c 100644 --- a/OpenRA.Game/Traits/Player/DeveloperMode.cs +++ b/OpenRA.Game/Traits/Player/DeveloperMode.cs @@ -16,6 +16,8 @@ namespace OpenRA.Traits public int Cash = 20000; public bool FastBuild = false; public bool FastCharge = false; + public bool DisableShroud = false; + public bool PathDebug = false; public object Create (ActorInitializer init) { return new DeveloperMode(this); } } @@ -26,31 +28,76 @@ namespace OpenRA.Traits [Sync] public bool FastCharge; public bool FastBuild; + public bool DisableShroud; + public bool PathDebug; public DeveloperMode(DeveloperModeInfo info) { Info = info; FastBuild = Info.FastBuild; FastCharge = Info.FastCharge; + DisableShroud = Info.DisableShroud; + PathDebug = Info.PathDebug; } public void ResolveOrder (Actor self, Order order) { + if (!Game.LobbyInfo.GlobalSettings.AllowCheats) return; + switch(order.OrderString) { - case "DevModeFastCharge": - { - FastCharge ^= true; - break; - } - case "DevModeFastBuild": - { - FastBuild ^= true; - break; - } + case "DevFastCharge": + { + FastCharge ^= true; + IssueNotification(FastCharge); + break; + } + case "DevFastBuild": + { + FastBuild ^= true; + IssueNotification(FastBuild); + break; + } + case "DevGiveCash": + { + self.traits.Get().GiveCash(Info.Cash); + IssueNotification(true); + break; + } + case "DevShroud": + { + DisableShroud ^= true; + Game.world.LocalPlayer.Shroud.Disabled = DisableShroud; + IssueNotification(DisableShroud); + break; + } + case "DevPathDebug": + { + PathDebug ^= true; + IssueNotification(PathDebug); + break; + } + case "DevIndexDebug": + { + Game.Settings.IndexDebug ^= true; + IssueNotification(Game.Settings.IndexDebug); + break; + } + case "DevUnitDebug": + { + Game.Settings.UnitDebug ^= true; + IssueNotification(Game.Settings.UnitDebug); + break; + } } } + void IssueNotification(bool enabled) + { + if (enabled) + Game.IssueOrder(Order.Chat("I used a devmode option")); + } + } } diff --git a/OpenRA.Game/Traits/Player/PlayerResources.cs b/OpenRA.Game/Traits/Player/PlayerResources.cs index 49d0def360..36864475ca 100644 --- a/OpenRA.Game/Traits/Player/PlayerResources.cs +++ b/OpenRA.Game/Traits/Player/PlayerResources.cs @@ -22,7 +22,7 @@ namespace OpenRA.Traits public object Create(ActorInitializer init) { return new PlayerResources(init.self); } } - public class PlayerResources : ITick, IResolveOrder + public class PlayerResources : ITick { Player Owner; int AdviceInterval; @@ -186,23 +186,6 @@ namespace OpenRA.Traits { TickPower(); TickOre(self); - } - - public void ResolveOrder (Actor self, Order order) - { - switch (order.OrderString) - { - case "DevModeGiveCash": - { - if (!Game.LobbyInfo.GlobalSettings.AllowCheats) break; - self.World.AddFrameEndTask( w => - { - var amt = order.Subject.Info.Traits.Get().Cash; - GiveCash(amt); - }); - } - break; - } } } } diff --git a/OpenRA.Game/Traits/Player/ProductionQueue.cs b/OpenRA.Game/Traits/Player/ProductionQueue.cs index 301577538c..accd8bc017 100644 --- a/OpenRA.Game/Traits/Player/ProductionQueue.cs +++ b/OpenRA.Game/Traits/Player/ProductionQueue.cs @@ -101,7 +101,7 @@ namespace OpenRA.Traits if (unit == null || ! unit.Traits.Contains()) return 0; - if (self.traits.Get().FastBuild) return 0; + if (Game.LobbyInfo.GlobalSettings.AllowCheats && self.traits.Get().FastBuild) return 0; var ui = unit.Traits.Get(); var time = ui.Cost * self.Owner.PlayerActor.Info.Traits.Get().BuildSpeed /* todo: country-specific build speed bonus */ diff --git a/OpenRA.Game/Traits/SupportPower.cs b/OpenRA.Game/Traits/SupportPower.cs index 6345b5da29..2b543a2b3e 100644 --- a/OpenRA.Game/Traits/SupportPower.cs +++ b/OpenRA.Game/Traits/SupportPower.cs @@ -69,7 +69,7 @@ namespace OpenRA.Traits if (IsAvailable && (!Info.RequiresPower || IsPowered())) { - if (self.traits.Get().FastCharge) RemainingTime = 0; + if (Game.LobbyInfo.GlobalSettings.AllowCheats && self.traits.Get().FastCharge) RemainingTime = 0; if (RemainingTime > 0) --RemainingTime; if (!notifiedCharging) { diff --git a/OpenRA.Game/Widgets/Delegates/DeveloperModeDelegate.cs b/OpenRA.Game/Widgets/Delegates/DeveloperModeDelegate.cs index eab3b8be7b..bb5b7eada7 100644 --- a/OpenRA.Game/Widgets/Delegates/DeveloperModeDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/DeveloperModeDelegate.cs @@ -41,78 +41,60 @@ namespace OpenRA.Widgets.Delegates }; devmodeBG.GetWidget("SETTINGS_CHECKBOX_SHROUD").Checked = - () => Game.world.LocalPlayer.Shroud.Disabled; + () => Game.world.LocalPlayer.PlayerActor.traits.Get().DisableShroud; devmodeBG.GetWidget("SETTINGS_CHECKBOX_SHROUD").OnMouseDown = mi => { - if (!Game.LobbyInfo.GlobalSettings.AllowCheats) return true; - Game.world.LocalPlayer.Shroud.Disabled ^= true; - TriggerCheatingMessage(); + Game.IssueOrder(new Order("DevShroud", Game.world.LocalPlayer.PlayerActor)); return true; }; devmodeBG.GetWidget("SETTINGS_CHECKBOX_UNITDEBUG").Checked = - () => {return Game.Settings.UnitDebug;}; + () => Game.Settings.UnitDebug; devmodeBG.GetWidget("SETTINGS_CHECKBOX_UNITDEBUG").OnMouseDown = mi => { - if (!Game.LobbyInfo.GlobalSettings.AllowCheats) return true; - Game.Settings.UnitDebug ^= true; - TriggerCheatingMessage(); + Game.IssueOrder(new Order("DevUnitDebug", Game.world.LocalPlayer.PlayerActor)); return true; }; devmodeBG.GetWidget("SETTINGS_CHECKBOX_PATHDEBUG").Checked = - () => {return Game.Settings.PathDebug;}; + () => Game.world.LocalPlayer.PlayerActor.traits.Get().PathDebug; devmodeBG.GetWidget("SETTINGS_CHECKBOX_PATHDEBUG").OnMouseDown = mi => { - if (!Game.LobbyInfo.GlobalSettings.AllowCheats) return true; - Game.Settings.PathDebug ^= true; - TriggerCheatingMessage(); + Game.IssueOrder(new Order("DevPathDebug", Game.world.LocalPlayer.PlayerActor)); return true; }; devmodeBG.GetWidget("SETTINGS_CHECKBOX_INDEXDEBUG").Checked = - () => {return Game.Settings.IndexDebug;}; + () => Game.Settings.IndexDebug; devmodeBG.GetWidget("SETTINGS_CHECKBOX_INDEXDEBUG").OnMouseDown = mi => { - if (!Game.LobbyInfo.GlobalSettings.AllowCheats) return true; - Game.Settings.IndexDebug ^= true; - TriggerCheatingMessage(); + Game.IssueOrder(new Order("DevIndexDebug", Game.world.LocalPlayer.PlayerActor)); return true; }; devmodeBG.GetWidget("SETTINGS_GIVE_CASH").OnMouseUp = mi => { - Game.IssueOrder(new Order("DevModeGiveCash", Game.world.LocalPlayer.PlayerActor)); - TriggerCheatingMessage(); + Game.IssueOrder(new Order("DevGiveCash", Game.world.LocalPlayer.PlayerActor)); return true; }; - devmodeBG.GetWidget("SETTINGS_BUILD_SPEED").OnMouseDown = mi => - { - Game.IssueOrder(new Order("DevModeFastBuild", Game.world.LocalPlayer.PlayerActor)); - TriggerCheatingMessage(); - return true; - }; devmodeBG.GetWidget("SETTINGS_BUILD_SPEED").Checked = () => Game.world.LocalPlayer.PlayerActor.traits.Get().FastBuild; - - devmodeBG.GetWidget("SETTINGS_CHARGE_TIME").OnMouseDown = mi => + devmodeBG.GetWidget("SETTINGS_BUILD_SPEED").OnMouseDown = mi => { - TriggerCheatingMessage(); - Game.IssueOrder(new Order("DevModeFastCharge", Game.world.LocalPlayer.PlayerActor)); + Game.IssueOrder(new Order("DevFastBuild", Game.world.LocalPlayer.PlayerActor)); return true; - }; + }; + devmodeBG.GetWidget("SETTINGS_CHARGE_TIME").Checked = () => Game.world.LocalPlayer.PlayerActor.traits.Get().FastCharge; - + devmodeBG.GetWidget("SETTINGS_CHARGE_TIME").OnMouseDown = mi => + { + Game.IssueOrder(new Order("DevFastCharge", Game.world.LocalPlayer.PlayerActor)); + return true; + }; - devModeButton.IsVisible = () => { return Game.Settings.DeveloperMode; }; - } - - void TriggerCheatingMessage() - { - var order = Order.Chat("I used a developer mode option"); - Game.IssueOrder(order); + devModeButton.IsVisible = () => { return Game.LobbyInfo.GlobalSettings.AllowCheats; }; } } }