diff --git a/OpenRA.Game/Map/Map.cs b/OpenRA.Game/Map/Map.cs index b4060660db..c411299fe2 100644 --- a/OpenRA.Game/Map/Map.cs +++ b/OpenRA.Game/Map/Map.cs @@ -59,8 +59,6 @@ namespace OpenRA public class MapOptions { public bool? Creeps; - public bool? Fog; - public bool? Shroud; public bool? AllyBuildRadius; public int? StartingCash; public string TechLevel; @@ -72,10 +70,6 @@ namespace OpenRA { if (Creeps.HasValue) settings.Creeps = Creeps.Value; - if (Fog.HasValue) - settings.Fog = Fog.Value; - if (Shroud.HasValue) - settings.Shroud = Shroud.Value; if (AllyBuildRadius.HasValue) settings.AllyBuildRadius = AllyBuildRadius.Value; if (StartingCash.HasValue) diff --git a/OpenRA.Game/Traits/World/Shroud.cs b/OpenRA.Game/Traits/World/Shroud.cs index 206f295cbf..7fbbc62c0c 100644 --- a/OpenRA.Game/Traits/World/Shroud.cs +++ b/OpenRA.Game/Traits/World/Shroud.cs @@ -18,6 +18,18 @@ namespace OpenRA.Traits [Desc("Required for shroud and fog visibility checks. Add this to the player actor.")] public class ShroudInfo : ITraitInfo { + [Desc("Default value of the fog checkbox in the lobby.")] + public bool FogEnabled = true; + + [Desc("Prevent the fog enabled state from being changed in the lobby.")] + public bool FogLocked = false; + + [Desc("Default value of the explore map checkbox in the lobby.")] + public bool ExploredMapEnabled = false; + + [Desc("Prevent the explore map enabled state from being changed in the lobby.")] + public bool ExploredMapLocked = false; + public object Create(ActorInitializer init) { return new Shroud(init.Self); } } diff --git a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs index a1cd48ac2e..2604fbef5f 100644 --- a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs +++ b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs @@ -432,7 +432,8 @@ namespace OpenRA.Mods.Common.Server return true; } - if (server.Map.Options.Shroud.HasValue) + var shroud = server.Map.Rules.Actors["player"].TraitInfo(); + if (shroud.ExploredMapLocked) { server.SendOrderTo(conn, "Message", "Map has disabled shroud configuration."); return true; @@ -455,7 +456,8 @@ namespace OpenRA.Mods.Common.Server return true; } - if (server.Map.Options.Fog.HasValue) + var shroud = server.Map.Rules.Actors["player"].TraitInfo(); + if (shroud.FogLocked) { server.SendOrderTo(conn, "Message", "Map has disabled fog configuration."); return true; @@ -1019,6 +1021,11 @@ namespace OpenRA.Mods.Common.Server var crateSpawner = server.Map.Rules.Actors["world"].TraitInfoOrDefault(); gs.Crates = crateSpawner != null && crateSpawner.Enabled; + + var shroud = server.Map.Rules.Actors["player"].TraitInfo(); + gs.Fog = shroud.FogEnabled; + gs.Shroud = !shroud.ExploredMapEnabled; + server.Map.Options.UpdateServerSettings(server.LobbyInfo.GlobalSettings); } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs index fc44d10250..6537f4956f 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs @@ -562,8 +562,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic var exploredMap = optionsBin.GetOrNull("EXPLORED_MAP_CHECKBOX"); if (exploredMap != null) { + var exploredMapLocked = new CachedTransform( + map => map.Rules.Actors["player"].TraitInfo().ExploredMapLocked); + exploredMap.IsChecked = () => !orderManager.LobbyInfo.GlobalSettings.Shroud; - exploredMap.IsDisabled = () => configurationDisabled() || Map.Options.Shroud.HasValue; + exploredMap.IsDisabled = () => configurationDisabled() || exploredMapLocked.Update(Map); exploredMap.OnClick = () => orderManager.IssueOrder(Order.Command( "shroud {0}".F(!orderManager.LobbyInfo.GlobalSettings.Shroud))); } @@ -571,8 +574,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic var enableFog = optionsBin.GetOrNull("FOG_CHECKBOX"); if (enableFog != null) { + var fogLocked = new CachedTransform( + map => map.Rules.Actors["player"].TraitInfo().FogLocked); + enableFog.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.Fog; - enableFog.IsDisabled = () => configurationDisabled() || Map.Options.Fog.HasValue; + enableFog.IsDisabled = () => configurationDisabled() || fogLocked.Update(Map); enableFog.OnClick = () => orderManager.IssueOrder(Order.Command( "fog {0}".F(!orderManager.LobbyInfo.GlobalSettings.Fog))); } diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 0637ae230e..561f08d87b 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -165,8 +165,6 @@ ServerTraits: LobbyDefaults: StartingUnitsClass: light FragileAlliances: false - Shroud: true - Fog: true TechLevel: Unrestricted ChromeMetrics: diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index facd112935..34b11311b2 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -158,8 +158,6 @@ ServerTraits: LobbyDefaults: StartingUnitsClass: none FragileAlliances: false - Shroud: true - Fog: true TechLevel: Unrestricted ChromeMetrics: diff --git a/mods/ra/mod.yaml b/mods/ra/mod.yaml index 78eb72da55..774ee85cc9 100644 --- a/mods/ra/mod.yaml +++ b/mods/ra/mod.yaml @@ -168,8 +168,6 @@ ServerTraits: LobbyDefaults: StartingUnitsClass: none FragileAlliances: false - Shroud: true - Fog: true TechLevel: Unrestricted ChromeMetrics: diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index f502654808..99b0818321 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -217,8 +217,6 @@ ServerTraits: LobbyDefaults: StartingUnitsClass: none FragileAlliances: false - Shroud: true - Fog: true ChromeMetrics: common|metrics.yaml