Allow maps to override options. Closes #3646.

Also set sensible defaults for most of the maps and mini games.
This commit is contained in:
Paul Chote
2013-08-17 10:54:54 +12:00
parent ca90b2e6f1
commit d76a8c2950
22 changed files with 437 additions and 28 deletions

View File

@@ -16,10 +16,36 @@ 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? FragileAlliances;
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 (FragileAlliances.HasValue)
settings.FragileAlliances = FragileAlliances.Value;
}
}
public class Map
{
[FieldLoader.Ignore] IFolder container;
@@ -37,9 +63,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<Dictionary<string, ActorReference>> Actors;
public int PlayerCount { get { return Players.Count(p => p.Value.Playable); } }
@@ -177,7 +214,7 @@ namespace OpenRA
"Description",
"Author",
"Tileset",
"Difficulties",
"Options",
"MapSize",
"Bounds",
"UseAsShellmap",

View File

@@ -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,6 +427,12 @@ 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;
@@ -414,10 +445,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 ((server.Map.Options.Difficulties == null && s != null) || (server.Map.Options.Difficulties != 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 +466,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;
@@ -636,14 +668,16 @@ 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 != null && server.Map.Options.Difficulties.Any())
{
if (!server.Map.Difficulties.Contains(server.lobbyInfo.GlobalSettings.Difficulty))
server.lobbyInfo.GlobalSettings.Difficulty = server.Map.Difficulties.First();
if (!server.Map.Options.Difficulties.Contains(server.lobbyInfo.GlobalSettings.Difficulty))
server.lobbyInfo.GlobalSettings.Difficulty = server.Map.Options.Difficulties.First();
}
else server.lobbyInfo.GlobalSettings.Difficulty = null;
}

View File

@@ -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,7 +281,7 @@ 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)));
}
@@ -290,7 +290,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
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 +298,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic
var difficulty = optionsBin.GetOrNull<DropDownButtonWidget>("DIFFICULTY_DROPDOWNBUTTON");
if (difficulty != null)
{
difficulty.IsVisible = () => Map != null && Map.Difficulties != null && Map.Difficulties.Any();
difficulty.IsVisible = () => Map.Options.Difficulties != null && 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,
@@ -336,7 +336,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
.Select(a => a.Class).Distinct();
startingUnits.IsDisabled = configurationDisabled;
startingUnits.IsVisible = () => Map.AllowStartUnitConfig;
startingUnits.IsVisible = () => Map.Options.ConfigurableStartingUnits;
startingUnits.GetText = () => className(orderManager.LobbyInfo.GlobalSettings.StartingUnitsClass);
startingUnits.OnMouseDown = _ =>
{
@@ -364,7 +364,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
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 +373,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)));
};

View File

@@ -20,7 +20,12 @@ UseAsShellmap: False
Type: Campaign
AllowStartUnitConfig: False
Options:
Crates: false
Fog: false
Shroud: true
FragileAlliances: false
ConfigurableStartingUnits: false
Players:
PlayerReference@BadGuy:

View File

@@ -20,7 +20,12 @@ UseAsShellmap: False
Type: Campaign
AllowStartUnitConfig: False
Options:
Crates: false
Fog: false
Shroud: true
FragileAlliances: false
ConfigurableStartingUnits: false
Players:
PlayerReference@Neutral:

Binary file not shown.

BIN
mods/cnc/maps/the-hot-box/map.bin Executable file

Binary file not shown.

View File

@@ -0,0 +1,245 @@
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
FragileAlliances: false
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:

View File

@@ -18,6 +18,12 @@ UseAsShellmap: False
Type: Minigame
Options:
Fog: true
Shroud: true
FragileAlliances: false
ConfigurableStartingUnits: false
Players:
PlayerReference@Neutral:
Name: Neutral

View File

@@ -10,15 +10,20 @@ 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:
Fog: true
Shroud: true
FragileAlliances: false
ConfigurableStartingUnits: false
Difficulties: Easy,Normal,Hard
Players:
PlayerReference@Neutral:

View File

@@ -16,7 +16,13 @@ Bounds: 2,2,76,76
UseAsShellmap: False
Type: Campaign
Type: Minigame
Options:
Fog: true
Shroud: true
FragileAlliances: false
ConfigurableStartingUnits: false
Players:
PlayerReference@Neutral:

View File

@@ -20,7 +20,12 @@ UseAsShellmap: False
Type: Campaign
Difficulties: Easy, Normal
Options:
Fog: true
Shroud: true
FragileAlliances: false
ConfigurableStartingUnits: false
Difficulties: Easy, Normal
Players:
PlayerReference@Neutral:

View File

@@ -20,6 +20,12 @@ UseAsShellmap: False
Type: Campaign
Options:
Fog: true
Shroud: true
FragileAlliances: false
ConfigurableStartingUnits: false
Players:
PlayerReference@Neutral:
Name: Neutral

View File

@@ -20,7 +20,12 @@ UseAsShellmap: False
Type: Campaign
Difficulties: Easy, Normal, Hard
Options:
Fog: true
Shroud: true
FragileAlliances: false
ConfigurableStartingUnits: false
Difficulties: Easy, Normal, Hard
Players:
PlayerReference@Neutral:

View File

@@ -12,7 +12,12 @@ Author: Scott_NZ
Tileset: TEMPERAT
Difficulties: Easy,Normal,Hard
Options:
Fog: true
Shroud: true
FragileAlliances: false
ConfigurableStartingUnits: false
Difficulties: Easy,Normal,Hard
MapSize: 128,128

View File

@@ -18,6 +18,12 @@ UseAsShellmap: False
Type: Minigame
Options:
Fog: true
Shroud: true
FragileAlliances: false
ConfigurableStartingUnits: false
Players:
PlayerReference@Neutral:
Name: Neutral

View File

@@ -16,7 +16,14 @@ Bounds: 16,16,32,32
UseAsShellmap: False
Type: Minigame
Type: Drop Zone
Options:
Fog: false
Shroud: false
Crates: true
FragileAlliances: false
ConfigurableStartingUnits: false
Players:
PlayerReference@Neutral:

View File

@@ -16,7 +16,14 @@ Bounds: 16,16,32,32
UseAsShellmap: False
Type: Minigame
Type: Drop Zone
Options:
Fog: false
Shroud: false
Crates: true
FragileAlliances: false
ConfigurableStartingUnits: false
Players:
PlayerReference@Neutral:

View File

@@ -16,7 +16,14 @@ Bounds: 16,16,32,32
UseAsShellmap: False
Type: Minigame
Type: Drop Zone
Options:
Fog: false
Shroud: false
Crates: true
FragileAlliances: false
ConfigurableStartingUnits: false
Players:
PlayerReference@Neutral:

View File

@@ -20,6 +20,12 @@ UseAsShellmap: False
Type: Campaign
Options:
Fog: true
Shroud: true
FragileAlliances: false
ConfigurableStartingUnits: false
Players:
PlayerReference@Greece:
Name: Greece

View File

@@ -20,6 +20,12 @@ UseAsShellmap: False
Type: Campaign
Options:
Fog: true
Shroud: true
FragileAlliances: false
ConfigurableStartingUnits: false
Players:
PlayerReference@GoodGuy:
Name: GoodGuy

View File

@@ -18,6 +18,12 @@ UseAsShellmap: False
Type: Minigame
Options:
Fog: true
Shroud: true
FragileAlliances: false
ConfigurableStartingUnits: false
Players:
PlayerReference@Neutral:
Name: Neutral