diff --git a/OpenRA.Editor/LegacyMapImporter.cs b/OpenRA.Editor/LegacyMapImporter.cs index 778366a6ef..b64290e9a9 100644 --- a/OpenRA.Editor/LegacyMapImporter.cs +++ b/OpenRA.Editor/LegacyMapImporter.cs @@ -475,9 +475,6 @@ namespace OpenRA.Editor Console.WriteLine(s.Key); switch (s.Key) { - case "Credits": - pr.InitialCash = int.Parse(s.Value); - break; case "Allies": pr.Allies = s.Value.Split(',').Intersect(players).Except(neutral).ToArray(); pr.Enemies = s.Value.Split(',').SymmetricDifference(players).Except(neutral).ToArray(); diff --git a/OpenRA.FileFormats/FieldLoader.cs b/OpenRA.FileFormats/FieldLoader.cs index d48ac4ed94..6698a60d89 100755 --- a/OpenRA.FileFormats/FieldLoader.cs +++ b/OpenRA.FileFormats/FieldLoader.cs @@ -276,6 +276,13 @@ namespace OpenRA.FileFormats return fieldType.GetConstructor(argTypes).Invoke(argValues); } + else if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + var innerType = fieldType.GetGenericArguments().First(); + var innerValue = GetValue("Nullable", innerType, x); + return fieldType.GetConstructor(new []{ innerType }).Invoke(new []{ innerValue }); + } + UnknownFieldAction("[Type] {0}".F(x), fieldType); return null; } diff --git a/OpenRA.FileFormats/Map/PlayerReference.cs b/OpenRA.FileFormats/Map/PlayerReference.cs index d773161ba8..93a72589ab 100644 --- a/OpenRA.FileFormats/Map/PlayerReference.cs +++ b/OpenRA.FileFormats/Map/PlayerReference.cs @@ -39,7 +39,6 @@ namespace OpenRA.FileFormats public bool LockTeam = false; public int Team = 0; - public int InitialCash = 0; public string[] Allies = {}; public string[] Enemies = {}; diff --git a/OpenRA.Game/Map.cs b/OpenRA.Game/Map.cs index f792d41884..cd7e369c89 100644 --- a/OpenRA.Game/Map.cs +++ b/OpenRA.Game/Map.cs @@ -16,10 +16,42 @@ using System.Linq; using System.Security.Cryptography; using System.Text; using OpenRA.FileFormats; +using OpenRA.Network; using OpenRA.Traits; namespace OpenRA { + public class MapOptions + { + public bool? Cheats; + public bool? Crates; + public bool? Fog; + public bool? Shroud; + public bool? AllyBuildRadius; + public bool? FragileAlliances; + public int? StartingCash; + public bool ConfigurableStartingUnits = true; + public string[] Difficulties = { }; + + public void UpdateServerSettings(Session.Global settings) + { + if (Cheats.HasValue) + settings.AllowCheats = Cheats.Value; + if (Crates.HasValue) + settings.Crates = Crates.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) + settings.StartingCash = StartingCash.Value; + if (FragileAlliances.HasValue) + settings.FragileAlliances = FragileAlliances.Value; + } + } + public class Map { [FieldLoader.Ignore] IFolder container; @@ -37,9 +69,20 @@ namespace OpenRA public string Description; public string Author; public string Tileset; - public string[] Difficulties; public bool AllowStartUnitConfig = true; + [FieldLoader.LoadUsing("LoadOptions")] + public MapOptions Options; + + static object LoadOptions(MiniYaml y) + { + var options = new MapOptions(); + if (y.NodesDict.ContainsKey("Options")) + FieldLoader.Load(options, y.NodesDict["Options"]); + + return options; + } + [FieldLoader.Ignore] public Lazy> Actors; public int PlayerCount { get { return Players.Count(p => p.Value.Playable); } } @@ -177,7 +220,7 @@ namespace OpenRA "Description", "Author", "Tileset", - "Difficulties", + "Options", "MapSize", "Bounds", "UseAsShellmap", diff --git a/OpenRA.Game/Network/Session.cs b/OpenRA.Game/Network/Session.cs index 32c9df85a2..2dc549a270 100644 --- a/OpenRA.Game/Network/Session.cs +++ b/OpenRA.Game/Network/Session.cs @@ -94,6 +94,8 @@ namespace OpenRA.Network public bool Crates = true; public bool Shroud = true; public bool Fog = true; + public bool AllyBuildRadius = true; + public int StartingCash = 5000; public string StartingUnitsClass = "none"; public bool AllowVersionMismatch; } diff --git a/OpenRA.Game/Traits/Player/PlayerResources.cs b/OpenRA.Game/Traits/Player/PlayerResources.cs index 77fdbc4857..9a71313ab2 100644 --- a/OpenRA.Game/Traits/Player/PlayerResources.cs +++ b/OpenRA.Game/Traits/Player/PlayerResources.cs @@ -16,8 +16,8 @@ namespace OpenRA.Traits { public class PlayerResourcesInfo : ITraitInfo { - public readonly int InitialCash = 10000; - public readonly int InitialOre = 0; + public readonly int[] SelectableCash = { 2500, 5000, 10000, 20000 }; + public readonly int DefaultCash = 5000; public readonly int AdviceInterval = 250; public object Create(ActorInitializer init) { return new PlayerResources(init.self, this); } @@ -34,8 +34,7 @@ namespace OpenRA.Traits { Owner = self.Owner; - Cash = info.InitialCash; - Ore = info.InitialOre; + Cash = self.World.LobbyInfo.GlobalSettings.StartingCash; AdviceInterval = info.AdviceInterval; } diff --git a/OpenRA.Mods.RA/Buildings/BaseProvider.cs b/OpenRA.Mods.RA/Buildings/BaseProvider.cs index 880a3b0089..e0f6fdc284 100755 --- a/OpenRA.Mods.RA/Buildings/BaseProvider.cs +++ b/OpenRA.Mods.RA/Buildings/BaseProvider.cs @@ -56,11 +56,17 @@ namespace OpenRA.Mods.RA.Buildings return devMode.FastBuild || progress == 0; } + bool ValidRenderPlayer() + { + var allyBuildRadius = self.World.LobbyInfo.GlobalSettings.AllyBuildRadius; + return self.Owner == self.World.RenderPlayer || (allyBuildRadius && self.Owner.IsAlliedWith(self.World.RenderPlayer)); + } + // Range circle public void RenderAfterWorld(WorldRenderer wr) { // Visible to player and allies - if (!self.Owner.IsAlliedWith(self.World.RenderPlayer)) + if (!ValidRenderPlayer()) return; wr.DrawRangeCircleWithContrast( @@ -73,7 +79,7 @@ namespace OpenRA.Mods.RA.Buildings public float GetValue() { // Visible to player and allies - if (!self.Owner.IsAlliedWith(self.World.RenderPlayer)) + if (!ValidRenderPlayer()) return 0f; // Ready or delay disabled diff --git a/OpenRA.Mods.RA/Buildings/Building.cs b/OpenRA.Mods.RA/Buildings/Building.cs index ef99c3eb38..be027171d7 100755 --- a/OpenRA.Mods.RA/Buildings/Building.cs +++ b/OpenRA.Mods.RA/Buildings/Building.cs @@ -43,7 +43,8 @@ namespace OpenRA.Mods.RA.Buildings var center = topLeft.CenterPosition + FootprintUtils.CenterOffset(this); foreach (var bp in world.ActorsWithTrait()) { - if (bp.Actor.Owner.Stances[p] != Stance.Ally || !bp.Trait.Ready()) + var validOwner = bp.Actor.Owner == p || (world.LobbyInfo.GlobalSettings.AllyBuildRadius && bp.Actor.Owner.Stances[p] == Stance.Ally); + if (!validOwner || !bp.Trait.Ready()) continue; // Range is counted from the center of the actor, not from each cell. @@ -72,14 +73,21 @@ namespace OpenRA.Mods.RA.Buildings var nearnessCandidates = new List(); var bi = world.WorldActor.Trait(); + var allyBuildRadius = world.LobbyInfo.GlobalSettings.AllyBuildRadius; for (var y = scanStart.Y; y < scanEnd.Y; y++) + { for (var x = scanStart.X; x < scanEnd.X; x++) { - var at = bi.GetBuildingAt(new CPos(x, y)); - if (at != null && at.Owner.Stances[p] == Stance.Ally && at.HasTrait()) - nearnessCandidates.Add(new CPos(x, y)); + var pos = new CPos(x, y); + var at = bi.GetBuildingAt(pos); + if (at == null || !at.HasTrait()) + continue; + + if (at.Owner == p || (allyBuildRadius && at.Owner.Stances[p] == Stance.Ally)) + nearnessCandidates.Add(pos); } + } var buildingTiles = FootprintUtils.Tiles(buildingName, this, topLeft).ToList(); return nearnessCandidates diff --git a/OpenRA.Mods.RA/ServerTraits/LobbyCommands.cs b/OpenRA.Mods.RA/ServerTraits/LobbyCommands.cs index 9d500e0cc5..a2d627d602 100644 --- a/OpenRA.Mods.RA/ServerTraits/LobbyCommands.cs +++ b/OpenRA.Mods.RA/ServerTraits/LobbyCommands.cs @@ -309,6 +309,12 @@ namespace OpenRA.Mods.RA.Server return true; } + if (server.Map.Options.FragileAlliances.HasValue) + { + server.SendOrderTo(conn, "Message", "Map has disabled alliance configuration"); + return true; + } + bool.TryParse(s, out server.lobbyInfo.GlobalSettings.FragileAlliances); server.SyncLobbyInfo(); return true; @@ -322,6 +328,12 @@ namespace OpenRA.Mods.RA.Server return true; } + if (server.Map.Options.Cheats.HasValue) + { + server.SendOrderTo(conn, "Message", "Map has disabled cheat configuration"); + return true; + } + bool.TryParse(s, out server.lobbyInfo.GlobalSettings.AllowCheats); server.SyncLobbyInfo(); return true; @@ -335,6 +347,12 @@ namespace OpenRA.Mods.RA.Server return true; } + if (server.Map.Options.Shroud.HasValue) + { + server.SendOrderTo(conn, "Message", "Map has disabled shroud configuration"); + return true; + } + bool.TryParse(s, out server.lobbyInfo.GlobalSettings.Shroud); server.SyncLobbyInfo(); return true; @@ -348,6 +366,13 @@ namespace OpenRA.Mods.RA.Server return true; } + if (server.Map.Options.Fog.HasValue) + { + server.SendOrderTo(conn, "Message", "Map has disabled fog configuration"); + return true; + } + + bool.TryParse(s, out server.lobbyInfo.GlobalSettings.Fog); server.SyncLobbyInfo(); return true; @@ -402,10 +427,35 @@ namespace OpenRA.Mods.RA.Server return true; } + if (server.Map.Options.Crates.HasValue) + { + server.SendOrderTo(conn, "Message", "Map has disabled crate configuration"); + return true; + } + bool.TryParse(s, out server.lobbyInfo.GlobalSettings.Crates); server.SyncLobbyInfo(); return true; }}, + { "allybuildradius", + s => + { + if (!client.IsAdmin) + { + server.SendOrderTo(conn, "Message", "Only the host can set that option"); + return true; + } + + if (server.Map.Options.AllyBuildRadius.HasValue) + { + server.SendOrderTo(conn, "Message", "Map has disabled ally build radius configuration"); + return true; + } + + bool.TryParse(s, out server.lobbyInfo.GlobalSettings.AllyBuildRadius); + server.SyncLobbyInfo(); + return true; + }}, { "difficulty", s => { @@ -414,10 +464,11 @@ namespace OpenRA.Mods.RA.Server server.SendOrderTo(conn, "Message", "Only the host can set that option"); return true; } - if ((server.Map.Difficulties == null && s != null) || (server.Map.Difficulties != null && !server.Map.Difficulties.Contains(s))) + + if (s != null && !server.Map.Options.Difficulties.Contains(s)) { server.SendOrderTo(conn, "Message", "Unsupported difficulty selected: {0}".F(s)); - server.SendOrderTo(conn, "Message", "Supported difficulties: {0}".F(server.Map.Difficulties.JoinWith(","))); + server.SendOrderTo(conn, "Message", "Supported difficulties: {0}".F(server.Map.Options.Difficulties.JoinWith(","))); return true; } @@ -434,7 +485,7 @@ namespace OpenRA.Mods.RA.Server return true; } - if (!server.Map.AllowStartUnitConfig) + if (!server.Map.Options.ConfigurableStartingUnits) { server.SendOrderTo(conn, "Message", "Map has disabled start unit configuration"); return true; @@ -444,6 +495,25 @@ namespace OpenRA.Mods.RA.Server server.SyncLobbyInfo(); return true; }}, + { "startingcash", + s => + { + if (!client.IsAdmin) + { + server.SendOrderTo(conn, "Message", "Only the host can set that option"); + return true; + } + + if (server.Map.Options.StartingCash.HasValue) + { + server.SendOrderTo(conn, "Message", "Map has disabled cash configuration"); + return true; + } + + server.lobbyInfo.GlobalSettings.StartingCash = int.Parse(s); + server.SyncLobbyInfo(); + return true; + }}, { "kick", s => { @@ -636,16 +706,20 @@ namespace OpenRA.Mods.RA.Server .Select(p => MakeSlotFromPlayerReference(p.Value)) .Where(s => s != null) .ToDictionary(s => s.PlayerReference, s => s); + + server.Map.Options.UpdateServerSettings(server.lobbyInfo.GlobalSettings); } static void SetDefaultDifficulty(S server) { - if (server.Map.Difficulties != null && server.Map.Difficulties.Any()) + if (!server.Map.Options.Difficulties.Any()) { - if (!server.Map.Difficulties.Contains(server.lobbyInfo.GlobalSettings.Difficulty)) - server.lobbyInfo.GlobalSettings.Difficulty = server.Map.Difficulties.First(); + server.lobbyInfo.GlobalSettings.Difficulty = null; + return; } - else server.lobbyInfo.GlobalSettings.Difficulty = null; + + if (!server.Map.Options.Difficulties.Contains(server.lobbyInfo.GlobalSettings.Difficulty)) + server.lobbyInfo.GlobalSettings.Difficulty = server.Map.Options.Difficulties.First(); } } } diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs index fb2e025eac..5b182bafb7 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs @@ -272,7 +272,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic if (allowCheats != null) { allowCheats.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.AllowCheats; - allowCheats.IsDisabled = configurationDisabled; + allowCheats.IsDisabled = () => Map.Options.Cheats.HasValue || configurationDisabled(); allowCheats.OnClick = () => orderManager.IssueOrder(Order.Command( "allowcheats {0}".F(!orderManager.LobbyInfo.GlobalSettings.AllowCheats))); } @@ -281,16 +281,25 @@ namespace OpenRA.Mods.RA.Widgets.Logic if (crates != null) { crates.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.Crates; - crates.IsDisabled = configurationDisabled; + crates.IsDisabled = () => Map.Options.Crates.HasValue || configurationDisabled(); crates.OnClick = () => orderManager.IssueOrder(Order.Command( "crates {0}".F(!orderManager.LobbyInfo.GlobalSettings.Crates))); } + var allybuildradius = optionsBin.GetOrNull("ALLYBUILDRADIUS_CHECKBOX"); + if (allybuildradius != null) + { + allybuildradius.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.AllyBuildRadius; + allybuildradius.IsDisabled = () => Map.Options.AllyBuildRadius.HasValue || configurationDisabled(); + allybuildradius.OnClick = () => orderManager.IssueOrder(Order.Command( + "allybuildradius {0}".F(!orderManager.LobbyInfo.GlobalSettings.AllyBuildRadius))); + } + var fragileAlliance = optionsBin.GetOrNull("FRAGILEALLIANCES_CHECKBOX"); if (fragileAlliance != null) { fragileAlliance.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.FragileAlliances; - fragileAlliance.IsDisabled = configurationDisabled; + fragileAlliance.IsDisabled = () => Map.Options.FragileAlliances.HasValue || configurationDisabled(); fragileAlliance.OnClick = () => orderManager.IssueOrder(Order.Command( "fragilealliance {0}".F(!orderManager.LobbyInfo.GlobalSettings.FragileAlliances))); }; @@ -298,12 +307,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic var difficulty = optionsBin.GetOrNull("DIFFICULTY_DROPDOWNBUTTON"); if (difficulty != null) { - difficulty.IsVisible = () => Map != null && Map.Difficulties != null && Map.Difficulties.Any(); + difficulty.IsVisible = () => Map.Options.Difficulties.Any(); difficulty.IsDisabled = configurationDisabled; difficulty.GetText = () => orderManager.LobbyInfo.GlobalSettings.Difficulty; difficulty.OnMouseDown = _ => { - var options = Map.Difficulties.Select(d => new DropDownOption + var options = Map.Options.Difficulties.Select(d => new DropDownOption { Title = d, IsSelected = () => orderManager.LobbyInfo.GlobalSettings.Difficulty == d, @@ -335,9 +344,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic var classes = Rules.Info["world"].Traits.WithInterface() .Select(a => a.Class).Distinct(); - startingUnits.IsDisabled = configurationDisabled; - startingUnits.IsVisible = () => Map.AllowStartUnitConfig; - startingUnits.GetText = () => className(orderManager.LobbyInfo.GlobalSettings.StartingUnitsClass); + startingUnits.IsDisabled = () => !Map.Options.ConfigurableStartingUnits || configurationDisabled(); + startingUnits.GetText = () => !Map.Options.ConfigurableStartingUnits ? "Not Available" : className(orderManager.LobbyInfo.GlobalSettings.StartingUnitsClass); startingUnits.OnMouseDown = _ => { var options = classes.Select(c => new DropDownOption @@ -360,11 +368,36 @@ namespace OpenRA.Mods.RA.Widgets.Logic optionsBin.Get("STARTINGUNITS_DESC").IsVisible = startingUnits.IsVisible; } + var startingCash = optionsBin.GetOrNull("STARTINGCASH_DROPDOWNBUTTON"); + if (startingCash != null) + { + startingCash.IsDisabled = () => Map.Options.StartingCash.HasValue || configurationDisabled(); + startingCash.GetText = () => Map.Options.StartingCash.HasValue ? "Not Available" : "${0}".F(orderManager.LobbyInfo.GlobalSettings.StartingCash); + startingCash.OnMouseDown = _ => + { + var options = Rules.Info["player"].Traits.Get().SelectableCash.Select(c => new DropDownOption + { + Title = "${0}".F(c), + IsSelected = () => orderManager.LobbyInfo.GlobalSettings.StartingCash == c, + OnClick = () => orderManager.IssueOrder(Order.Command("startingcash {0}".F(c))) + }); + + Func setupItem = (option, template) => + { + var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick); + item.Get("LABEL").GetText = () => option.Title; + return item; + }; + + startingCash.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", options.Count() * 30, options, setupItem); + }; + } + var enableShroud = optionsBin.GetOrNull("SHROUD_CHECKBOX"); if (enableShroud != null) { enableShroud.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.Shroud; - enableShroud.IsDisabled = configurationDisabled; + enableShroud.IsDisabled = () => Map.Options.Shroud.HasValue || configurationDisabled(); enableShroud.OnClick = () => orderManager.IssueOrder(Order.Command( "shroud {0}".F(!orderManager.LobbyInfo.GlobalSettings.Shroud))); }; @@ -373,7 +406,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic if (enableFog != null) { enableFog.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.Fog; - enableFog.IsDisabled = configurationDisabled; + enableFog.IsDisabled = () => Map.Options.Fog.HasValue || configurationDisabled(); enableFog.OnClick = () => orderManager.IssueOrder(Order.Command( "fog {0}".F(!orderManager.LobbyInfo.GlobalSettings.Fog))); }; @@ -473,6 +506,11 @@ namespace OpenRA.Mods.RA.Widgets.Logic else throw new InvalidOperationException("Server's new map doesn't exist on your system and Downloading turned off"); Map = new Map(Game.modData.AvailableMaps[MapUid].Path); + + // Restore default starting cash if the last map set it to something invalid + var pri = Rules.Info["player"].Traits.Get(); + if (!Map.Options.StartingCash.HasValue && !pri.SelectableCash.Contains(orderManager.LobbyInfo.GlobalSettings.StartingCash)) + orderManager.IssueOrder(Order.Command("startingcash {0}".F(pri.DefaultCash))); } void UpdatePlayerList() diff --git a/mods/cnc/chrome/dialogs.yaml b/mods/cnc/chrome/dialogs.yaml index a0ebdc245a..5d6986f66a 100644 --- a/mods/cnc/chrome/dialogs.yaml +++ b/mods/cnc/chrome/dialogs.yaml @@ -206,57 +206,80 @@ Background@LOBBY_OPTIONS_BIN: Children: Label@TITLE: X:0 - Y:40 + Y:30 Width:PARENT_RIGHT Height:25 Font:Bold Align:Center Text: Map Options - Checkbox@ALLOWCHEATS_CHECKBOX: - X:80 - Y:75 - Width:230 - Height:20 - Text:Cheats / Debug Menu - Checkbox@CRATES_CHECKBOX: - X:80 - Y:110 - Width:230 - Height:20 - Text:Crates - Checkbox@SHROUD_CHECKBOX: - X:310 - Y:75 - Width:230 - Height:20 - Text:Shroud - Checkbox@FOG_CHECKBOX: - X:310 - Y:110 - Width:230 - Height:20 - Text:Fog of War - Label@STARTINGUNITS_DESC: - X:135 - Y:142 - Width:120 - Height:25 - Text:Starting Units: - DropDownButton@STARTINGUNITS_DROPDOWNBUTTON: - X:230 - Y:142 - Width:140 - Height:25 - Font:Bold - Label@DIFFICULTY_DESC: - X:125 - Y:177 - Width:120 - Height:25 - Text:Mission Difficulty: - DropDownButton@DIFFICULTY_DROPDOWNBUTTON: - X:230 - Y:177 - Width:100 - Height:25 - Font:Bold + Container: + X:30 + Y:65 + Width: PARENT_RIGHT-60 + Height: PARENT_BOTTOM-75 + Children: + Checkbox@SHROUD_CHECKBOX: + Width:230 + Height:20 + Text:Shroud + Checkbox@FOG_CHECKBOX: + Y:35 + Width:230 + Height:20 + Text:Fog of War + Checkbox@CRATES_CHECKBOX: + X:160 + Width:230 + Height:20 + Text:Crates Appear + Checkbox@ALLYBUILDRADIUS_CHECKBOX: + X:160 + Y:35 + Width:230 + Height:20 + Text:Build off Ally ConYards + Checkbox@ALLOWCHEATS_CHECKBOX: + X:325 + Width:230 + Height:20 + Text:Debug Menu + Label@STARTINGCASH_DESC: + X:10 + Y:72 + Width:70 + Height:25 + Text:Starting Cash: + Align:Right + DropDownButton@STARTINGCASH_DROPDOWNBUTTON: + X:85 + Y:72 + Width:120 + Height:25 + Font:Bold + Text:$5000 + Label@STARTINGUNITS_DESC: + X:PARENT_RIGHT - WIDTH - 135 + Y:72 + Width:120 + Height:25 + Text:Starting Units: + Align:Right + DropDownButton@STARTINGUNITS_DROPDOWNBUTTON: + X:PARENT_RIGHT - WIDTH + 10 + Y:72 + Width:140 + Height:25 + Font:Bold + Label@DIFFICULTY_DESC: + X:PARENT_RIGHT - WIDTH - 135 + Y:107 + Width:120 + Height:25 + Text:Mission Difficulty: + Align:Right + DropDownButton@DIFFICULTY_DROPDOWNBUTTON: + X:PARENT_RIGHT - WIDTH + 10 + Y:107 + Width:140 + Height:25 + Font:Bold \ No newline at end of file diff --git a/mods/cnc/maps/gdi01/map.yaml b/mods/cnc/maps/gdi01/map.yaml index 8a0cd32357..adedb36355 100644 --- a/mods/cnc/maps/gdi01/map.yaml +++ b/mods/cnc/maps/gdi01/map.yaml @@ -20,7 +20,14 @@ UseAsShellmap: False Type: Campaign -AllowStartUnitConfig: False +Options: + Crates: false + Fog: false + Shroud: true + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 500 + ConfigurableStartingUnits: false Players: PlayerReference@BadGuy: @@ -41,7 +48,6 @@ Players: LockSpawn: True Spawn: 0 AllowBots: False - InitialCash: 20 Allies: GoodGuy Enemies: BadGuy,Creeps Required: True diff --git a/mods/cnc/maps/nod01/map.yaml b/mods/cnc/maps/nod01/map.yaml index 9c0e8c69ac..74ab1bc400 100644 --- a/mods/cnc/maps/nod01/map.yaml +++ b/mods/cnc/maps/nod01/map.yaml @@ -20,7 +20,14 @@ UseAsShellmap: False Type: Campaign -AllowStartUnitConfig: False +Options: + Crates: false + Fog: false + Shroud: true + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 0 + ConfigurableStartingUnits: false Players: PlayerReference@Neutral: diff --git a/mods/cnc/maps/the-hot-box.oramap b/mods/cnc/maps/the-hot-box.oramap deleted file mode 100644 index 8039ef8356..0000000000 Binary files a/mods/cnc/maps/the-hot-box.oramap and /dev/null differ diff --git a/mods/cnc/maps/the-hot-box/map.bin b/mods/cnc/maps/the-hot-box/map.bin new file mode 100755 index 0000000000..b34b6f4f1b Binary files /dev/null and b/mods/cnc/maps/the-hot-box/map.bin differ diff --git a/mods/cnc/maps/the-hot-box/map.yaml b/mods/cnc/maps/the-hot-box/map.yaml new file mode 100755 index 0000000000..ba7f89d08e --- /dev/null +++ b/mods/cnc/maps/the-hot-box/map.yaml @@ -0,0 +1,247 @@ +Selectable: True + +MapFormat: 5 + +Title: The Hot Box + +Description: Drop Zone for CnC + +Author: Dan9550 + +Tileset: DESERT + +MapSize: 64,64 + +Bounds: 16,16,36,36 + +UseAsShellmap: False + +Type: Drop Zone + +Options: + Fog: false + Shroud: false + Crates: true + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 5000 + ConfigurableStartingUnits: false + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Race: gdi + PlayerReference@Multi0: + Name: Multi0 + Playable: True + LockRace: True + Race: nod + Enemies: Multi9,Multi1,Multi2,Multi3,Multi4,Multi5,Multi6,Multi7,Multi8 + PlayerReference@Multi1: + Name: Multi1 + Playable: True + LockRace: True + Race: nod + Enemies: Multi0,Multi2,Multi3,Multi4,Multi5,Multi6,Multi7,Multi8,Multi9 + PlayerReference@Multi2: + Name: Multi2 + Playable: True + LockRace: True + Race: nod + Enemies: Multi0,Multi1,Multi3,Multi4,Multi5,Multi6,Multi7,Multi8,Multi9 + PlayerReference@Multi3: + Name: Multi3 + Playable: True + LockRace: True + Race: nod + Enemies: Multi0,Multi1,Multi2,Multi4,Multi5,Multi6,Multi7,Multi8,Multi9 + PlayerReference@Multi4: + Name: Multi4 + Playable: True + LockRace: True + Race: nod + Enemies: Multi0,Multi1,Multi2,Multi3,Multi5,Multi6,Multi7,Multi8,Multi9 + PlayerReference@Multi5: + Name: Multi5 + Playable: True + LockRace: True + Race: nod + Enemies: Multi0,Multi1,Multi2,Multi3,Multi4,Multi6,Multi7,Multi8,Multi9 + PlayerReference@Multi6: + Name: Multi6 + Playable: True + LockRace: True + Race: nod + Enemies: Multi0,Multi1,Multi2,Multi3,Multi4,Multi5,Multi7,Multi8,Multi9 + PlayerReference@Multi7: + Name: Multi7 + Playable: True + LockRace: True + Race: nod + Enemies: Multi0,Multi1,Multi2,Multi3,Multi4,Multi5,Multi6,Multi8,Multi9 + PlayerReference@Multi8: + Name: Multi8 + Playable: True + LockRace: True + Race: nod + Enemies: Multi0,Multi1,Multi2,Multi3,Multi4,Multi5,Multi6,Multi7,Multi9 + PlayerReference@Multi9: + Name: Multi9 + Playable: True + LockRace: True + Race: nod + Enemies: Multi0,Multi1,Multi2,Multi3,Multi4,Multi5,Multi6,Multi7,Multi8 + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Race: gdi + Enemies: Multi0,Multi1,Multi2,Multi3,Multi4,Multi5,Multi6,Multi7,Multi8,Multi9 + +Actors: + Actor0: apc + Location: 40,17 + Owner: Multi0 + Actor1: apc + Location: 42,17 + Owner: Multi1 + Actor2: apc + Location: 40,19 + Owner: Multi2 + Actor3: apc + Location: 46,21 + Owner: Multi3 + Actor4: apc + Location: 48,21 + Owner: Multi4 + Actor5: apc + Location: 50,19 + Owner: Multi5 + Actor6: apc + Location: 50,21 + Owner: Multi6 + Actor7: apc + Location: 50,17 + Owner: Multi7 + Actor8: apc + Location: 39,21 + Owner: Multi8 + Actor9: apc + Location: 47,17 + Owner: Multi9 + Actor10: tc02 + Location: 22,43 + Owner: Neutral + Actor11: v20 + Location: 44,38 + Owner: Neutral + Actor12: v34 + Location: 28,38 + Owner: Neutral + Actor13: v35 + Location: 29,39 + Owner: Neutral + Actor14: v36 + Location: 38,35 + Owner: Neutral + Actor15: v23 + Location: 46,39 + Owner: Neutral + Actor16: v27 + Location: 22,28 + Owner: Neutral + Actor17: t02 + Location: 26,26 + Owner: Neutral + Actor18: t07 + Location: 26,27 + Owner: Neutral + Actor19: tc04 + Location: 25,16 + Owner: Neutral + Actor20: tc03 + Location: 26,17 + Owner: Neutral + Actor21: mpspawn + Location: 40,18 + Owner: Neutral + Actor22: mpspawn + Location: 42,18 + Owner: Neutral + Actor23: mpspawn + Location: 40,20 + Owner: Neutral + Actor24: mpspawn + Location: 39,22 + Owner: Neutral + Actor25: mpspawn + Location: 47,18 + Owner: Neutral + Actor26: mpspawn + Location: 50,18 + Owner: Neutral + Actor27: mpspawn + Location: 50,20 + Owner: Neutral + Actor28: mpspawn + Location: 50,22 + Owner: Neutral + Actor29: mpspawn + Location: 48,22 + Owner: Neutral + Actor30: mpspawn + Location: 46,22 + Owner: Neutral + +Smudges: + +Rules: + World: + CrateSpawner: + Maximum: 4 + SpawnInterval: 5 + -SpawnMPUnits: + -MPStartLocations: + CRATE: + -HealUnitsCrateAction: + -LevelUpCrateAction: + -GiveMcvCrateAction: + -RevealMapCrateAction: + -HideMapCrateAction: + -CloakCrateAction: + -ExplodeCrateAction@nuke: + -ExplodeCrateAction@boom: + -ExplodeCrateAction@fire: + -SupportPowerCrateAction@parabombs: + -GiveCashCrateAction: + GiveUnitCrateAction@stnk: + SelectionShares: 4 + Unit: stnk + GiveUnitCrateAction@bike: + SelectionShares: 6 + Unit: bike + GiveUnitCrateAction@htnk: + SelectionShares: 1 + Unit: htnk + GiveUnitCrateAction@e5: + SelectionShares: 1 + Unit: e5 + GiveUnitCrateAction@e1: + SelectionShares: 1 + Unit: e1 + APC: + Health: + HP: 1000 + RevealsShroud: + Range: 40 + MustBeDestroyed: + -AttackMove: + +Sequences: + +Weapons: + +Voices: + +Notifications: diff --git a/mods/cnc/rules/system.yaml b/mods/cnc/rules/system.yaml index 01ba2734af..f3a5eabfbb 100644 --- a/mods/cnc/rules/system.yaml +++ b/mods/cnc/rules/system.yaml @@ -6,7 +6,6 @@ Player: PowerManager: AllyRepair: PlayerResources: - InitialCash: 5000 ActorGroupProxy: DeveloperMode: HackyAI@Default: diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index 2341f94806..2f9c28583f 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -39,7 +39,6 @@ Player: AdviceInterval: 650 AllyRepair: PlayerResources: - InitialCash: 5000 AdviceInterval: 650 ActorGroupProxy: DeveloperMode: diff --git a/mods/ra/chrome/lobby-dialogs.yaml b/mods/ra/chrome/lobby-dialogs.yaml index f26378c3b4..633f4d6c5b 100644 --- a/mods/ra/chrome/lobby-dialogs.yaml +++ b/mods/ra/chrome/lobby-dialogs.yaml @@ -59,63 +59,85 @@ Background@LOBBY_OPTIONS_BIN: Children: Label@TITLE: X:0 - Y:40 + Y:30 Width:PARENT_RIGHT Height:25 Font:Bold Align:Center Text: Map Options - Checkbox@ALLOWCHEATS_CHECKBOX: - X:80 - Y:75 - Width:230 - Height:20 - Text:Cheats / Debug Menu - Checkbox@FRAGILEALLIANCES_CHECKBOX: - X:80 - Y:110 - Width:220 - Height:20 - Text:Allow Team Changes - Checkbox@CRATES_CHECKBOX: - X:80 - Y:145 - Width:230 - Height:20 - Text:Crates - Checkbox@SHROUD_CHECKBOX: - X:310 - Y:75 - Width:230 - Height:20 - Text:Shroud - Checkbox@FOG_CHECKBOX: - X:310 - Y:110 - Width:230 - Height:20 - Text:Fog of War - Label@STARTINGUNITS_DESC: - X:215 - Y:142 - Width:120 - Height:25 - Text:Starting Units: - DropDownButton@STARTINGUNITS_DROPDOWNBUTTON: - X:310 - Y:142 - Width:140 - Height:25 - Font:Bold - Label@DIFFICULTY_DESC: - X:195 - Y:177 - Width:120 - Height:25 - Text:Mission Difficulty: - DropDownButton@DIFFICULTY_DROPDOWNBUTTON: - X:310 - Y:177 - Width:100 - Height:25 - Font:Bold + Container: + X:30 + Y:70 + Width: PARENT_RIGHT-60 + Height: PARENT_BOTTOM-75 + Children: + Checkbox@SHROUD_CHECKBOX: + Width:230 + Height:20 + Text:Shroud + Checkbox@FOG_CHECKBOX: + Y:40 + Width:230 + Height:20 + Text:Fog of War + Checkbox@CRATES_CHECKBOX: + X:155 + Width:230 + Height:20 + Text:Crates Appear + Checkbox@ALLYBUILDRADIUS_CHECKBOX: + X:155 + Y:40 + Width:230 + Height:20 + Text:Build off Ally ConYards + Checkbox@ALLOWCHEATS_CHECKBOX: + X:350 + Width:230 + Height:20 + Text:Debug Menu + Checkbox@FRAGILEALLIANCES_CHECKBOX: + X:350 + Y:40 + Width:220 + Height:20 + Text:Team Changes + Label@STARTINGCASH_DESC: + Y:87 + Width:80 + Height:25 + Text:Starting Cash: + Align:Right + DropDownButton@STARTINGCASH_DROPDOWNBUTTON: + X:85 + Y:87 + Width:130 + Height:25 + Font:Bold + Text:$5000 + Label@STARTINGUNITS_DESC: + X:PARENT_RIGHT - WIDTH - 145 + Y:87 + Width:120 + Height:25 + Text:Starting Units: + Align:Right + DropDownButton@STARTINGUNITS_DROPDOWNBUTTON: + X:PARENT_RIGHT - WIDTH + Y:87 + Width:140 + Height:25 + Font:Bold + Label@DIFFICULTY_DESC: + X:PARENT_RIGHT - WIDTH - 145 + Y:122 + Width:120 + Height:25 + Text:Mission Difficulty: + Align:Right + DropDownButton@DIFFICULTY_DROPDOWNBUTTON: + X:PARENT_RIGHT - WIDTH + Y:122 + Width:140 + Height:25 + Font:Bold diff --git a/mods/ra/maps/Fort-Lonestar/map.yaml b/mods/ra/maps/Fort-Lonestar/map.yaml index ae6717ca6c..b275fc36ad 100644 --- a/mods/ra/maps/Fort-Lonestar/map.yaml +++ b/mods/ra/maps/Fort-Lonestar/map.yaml @@ -18,6 +18,14 @@ UseAsShellmap: False Type: Minigame +Options: + Fog: true + Shroud: true + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 50 + ConfigurableStartingUnits: false + Players: PlayerReference@Neutral: Name: Neutral @@ -505,8 +513,6 @@ Rules: Unit: e7 SelectionShares: 10 Player: - PlayerResources: - InitialCash: 50 ClassicProductionQueue@Infantry: Type: Infantry BuildSpeed: 1 diff --git a/mods/ra/maps/Survival01/map.yaml b/mods/ra/maps/Survival01/map.yaml index 94d5de6714..180ee6ab4d 100644 --- a/mods/ra/maps/Survival01/map.yaml +++ b/mods/ra/maps/Survival01/map.yaml @@ -10,15 +10,23 @@ Author: Nuke'm Bro. Tileset: TEMPERAT -Difficulties: Easy,Normal,Hard - MapSize: 96,64 Bounds: 4,4,88,56 UseAsShellmap: False -Type: Campaign +Type: Minigame + +Options: + Crates: false + Fog: true + Shroud: true + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 5000 + ConfigurableStartingUnits: false + Difficulties: Easy,Normal,Hard Players: PlayerReference@Neutral: diff --git a/mods/ra/maps/Survival02/map.yaml b/mods/ra/maps/Survival02/map.yaml index 8a0364911d..d0fb73e7c5 100644 --- a/mods/ra/maps/Survival02/map.yaml +++ b/mods/ra/maps/Survival02/map.yaml @@ -16,7 +16,16 @@ Bounds: 2,2,76,76 UseAsShellmap: False -Type: Campaign +Type: Minigame + +Options: + Crates: false + Fog: true + Shroud: true + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 5000 + ConfigurableStartingUnits: false Players: PlayerReference@Neutral: diff --git a/mods/ra/maps/allies-01/map.yaml b/mods/ra/maps/allies-01/map.yaml index 090e4c3216..79487adef2 100644 --- a/mods/ra/maps/allies-01/map.yaml +++ b/mods/ra/maps/allies-01/map.yaml @@ -20,7 +20,15 @@ UseAsShellmap: False Type: Campaign -Difficulties: Easy, Normal +Options: + Crates: false + Fog: true + Shroud: true + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 5000 + ConfigurableStartingUnits: false + Difficulties: Easy, Normal Players: PlayerReference@Neutral: diff --git a/mods/ra/maps/allies-02/map.yaml b/mods/ra/maps/allies-02/map.yaml index d6bfc8b1c5..81d07f6ad3 100644 --- a/mods/ra/maps/allies-02/map.yaml +++ b/mods/ra/maps/allies-02/map.yaml @@ -20,6 +20,15 @@ UseAsShellmap: False Type: Campaign +Options: + Crates: false + Fog: true + Shroud: true + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 5000 + ConfigurableStartingUnits: false + Players: PlayerReference@Neutral: Name: Neutral diff --git a/mods/ra/maps/allies-03/map.yaml b/mods/ra/maps/allies-03/map.yaml index ba17a52b0f..9e1d00f64e 100644 --- a/mods/ra/maps/allies-03/map.yaml +++ b/mods/ra/maps/allies-03/map.yaml @@ -20,7 +20,15 @@ UseAsShellmap: False Type: Campaign -Difficulties: Easy, Normal, Hard +Options: + Crates: false + Fog: true + Shroud: true + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 5000 + ConfigurableStartingUnits: false + Difficulties: Easy, Normal, Hard Players: PlayerReference@Neutral: diff --git a/mods/ra/maps/allies-04/map.yaml b/mods/ra/maps/allies-04/map.yaml index 203621ca06..a546d64ef4 100644 --- a/mods/ra/maps/allies-04/map.yaml +++ b/mods/ra/maps/allies-04/map.yaml @@ -12,7 +12,15 @@ Author: Scott_NZ Tileset: TEMPERAT -Difficulties: Easy,Normal,Hard +Options: + Crates: false + Fog: true + Shroud: true + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 5000 + ConfigurableStartingUnits: false + Difficulties: Easy,Normal,Hard MapSize: 128,128 diff --git a/mods/ra/maps/bomber-john/map.yaml b/mods/ra/maps/bomber-john/map.yaml index fdf8001184..2addf941f1 100644 --- a/mods/ra/maps/bomber-john/map.yaml +++ b/mods/ra/maps/bomber-john/map.yaml @@ -18,6 +18,15 @@ UseAsShellmap: False Type: Minigame +Options: + Crates: false + Fog: true + Shroud: true + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 60 + ConfigurableStartingUnits: false + Players: PlayerReference@Neutral: Name: Neutral @@ -798,8 +807,6 @@ Rules: Player: ClassicProductionQueue@Building: BuildSpeed: 0.4 - PlayerResources: - InitialCash: 60 MNLYR: Inherits: ^Tank diff --git a/mods/ra/maps/drop-zone-battle-of-tikiaki/map.yaml b/mods/ra/maps/drop-zone-battle-of-tikiaki/map.yaml index 2e06646c14..535d060df6 100644 --- a/mods/ra/maps/drop-zone-battle-of-tikiaki/map.yaml +++ b/mods/ra/maps/drop-zone-battle-of-tikiaki/map.yaml @@ -16,7 +16,16 @@ Bounds: 16,16,32,32 UseAsShellmap: False -Type: Minigame +Type: Drop Zone + +Options: + Crates: true + Fog: false + Shroud: false + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 5000 + ConfigurableStartingUnits: false Players: PlayerReference@Neutral: diff --git a/mods/ra/maps/drop-zone-w/map.yaml b/mods/ra/maps/drop-zone-w/map.yaml index 0aee39dc1d..ee3ee14413 100644 --- a/mods/ra/maps/drop-zone-w/map.yaml +++ b/mods/ra/maps/drop-zone-w/map.yaml @@ -16,7 +16,16 @@ Bounds: 16,16,32,32 UseAsShellmap: False -Type: Minigame +Type: Drop Zone + +Options: + Crates: true + Fog: false + Shroud: false + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 5000 + ConfigurableStartingUnits: false Players: PlayerReference@Neutral: diff --git a/mods/ra/maps/drop-zone/map.yaml b/mods/ra/maps/drop-zone/map.yaml index aaac395510..3d8e08d55c 100644 --- a/mods/ra/maps/drop-zone/map.yaml +++ b/mods/ra/maps/drop-zone/map.yaml @@ -16,7 +16,16 @@ Bounds: 16,16,32,32 UseAsShellmap: False -Type: Minigame +Type: Drop Zone + +Options: + Crates: true + Fog: false + Shroud: false + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 5000 + ConfigurableStartingUnits: false Players: PlayerReference@Neutral: diff --git a/mods/ra/maps/monster-tank-madness/map.yaml b/mods/ra/maps/monster-tank-madness/map.yaml index 8cdf0571be..6d6d2c7b31 100644 --- a/mods/ra/maps/monster-tank-madness/map.yaml +++ b/mods/ra/maps/monster-tank-madness/map.yaml @@ -20,6 +20,15 @@ UseAsShellmap: False Type: Campaign +Options: + Crates: false + Fog: true + Shroud: true + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 5000 + ConfigurableStartingUnits: false + Players: PlayerReference@Greece: Name: Greece diff --git a/mods/ra/maps/soviet-01-classic/map.yaml b/mods/ra/maps/soviet-01-classic/map.yaml index 2eafc08291..fe3075116d 100644 --- a/mods/ra/maps/soviet-01-classic/map.yaml +++ b/mods/ra/maps/soviet-01-classic/map.yaml @@ -20,6 +20,15 @@ UseAsShellmap: False Type: Campaign +Options: + Crates: false + Fog: true + Shroud: true + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 0 + ConfigurableStartingUnits: false + Players: PlayerReference@GoodGuy: Name: GoodGuy @@ -841,8 +850,6 @@ Smudges: Rules: Player: -ConquestVictoryConditions: - PlayerResources: - InitialCash: 0 World: -CrateDrop: -SpawnMPUnits: diff --git a/mods/ra/maps/training-camp/map.yaml b/mods/ra/maps/training-camp/map.yaml index 58e2436397..8473183434 100644 --- a/mods/ra/maps/training-camp/map.yaml +++ b/mods/ra/maps/training-camp/map.yaml @@ -18,6 +18,15 @@ UseAsShellmap: False Type: Minigame +Options: + Crates: false + Fog: true + Shroud: true + AllyBuildRadius: false + FragileAlliances: false + StartingCash: 100 + ConfigurableStartingUnits: false + Players: PlayerReference@Neutral: Name: Neutral @@ -800,8 +809,6 @@ Rules: -SpawnMPUnits: -MPStartLocations: Player: - PlayerResources: - InitialCash: 100 ClassicProductionQueue@Infantry: Type: Infantry BuildSpeed: 1 diff --git a/mods/ra/rules/system.yaml b/mods/ra/rules/system.yaml index 6be1a8d901..ad40e94225 100644 --- a/mods/ra/rules/system.yaml +++ b/mods/ra/rules/system.yaml @@ -38,7 +38,6 @@ Player: PowerManager: AllyRepair: PlayerResources: - InitialCash: 5000 ActorGroupProxy: DeveloperMode: HackyAI@EasyAI: diff --git a/mods/ts/rules/system.yaml b/mods/ts/rules/system.yaml index 9900500350..cc8d895f22 100644 --- a/mods/ts/rules/system.yaml +++ b/mods/ts/rules/system.yaml @@ -30,7 +30,6 @@ Player: PowerManager: AllyRepair: PlayerResources: - InitialCash: 5000 ActorGroupProxy: DeveloperMode: PlayerColorPalette: