Port map difficulty to new options backend.

This commit is contained in:
Paul Chote
2016-06-12 20:31:55 +01:00
parent 1d1b97cb6a
commit 8ce4ab0bd1
31 changed files with 263 additions and 111 deletions

View File

@@ -192,7 +192,6 @@ namespace OpenRA.Network
public int OrderLatency = 3; // net tick frames (x 120 = ms) public int OrderLatency = 3; // net tick frames (x 120 = ms)
public int RandomSeed = 0; public int RandomSeed = 0;
public bool AllowSpectators = true; public bool AllowSpectators = true;
public string Difficulty;
public string GameSpeedType = "default"; public string GameSpeedType = "default";
public bool AllowVersionMismatch; public bool AllowVersionMismatch;
public string GameUid; public string GameUid;

View File

@@ -105,7 +105,18 @@ namespace OpenRA.Mods.Common.Scripting
public bool IsSinglePlayer { get { return Context.World.LobbyInfo.IsSinglePlayer; } } public bool IsSinglePlayer { get { return Context.World.LobbyInfo.IsSinglePlayer; } }
[Desc("Returns the difficulty selected by the player before starting the mission.")] [Desc("Returns the difficulty selected by the player before starting the mission.")]
public string Difficulty { get { return Context.World.LobbyInfo.GlobalSettings.Difficulty; } } public string Difficulty
{
get
{
Game.Debug("Map script is using deprecated Map.Difficulty API. This should be changed to Map.LobbyOption(\"difficulty\").");
Log.Write("lua", "Map script is using deprecated Map.Difficulty API. This should be changed to Map.LobbyOption(\"difficulty\").");
var option = Context.World.WorldActor.TraitsImplementing<ScriptLobbyDropdown>()
.FirstOrDefault(sld => sld.Info.ID == "difficulty");
return option != null ? option.Info.Values[option.Value] : null;
}
}
[Desc("Returns the value of a `ScriptLobbyDropdown` selected in the game lobby.")] [Desc("Returns the value of a `ScriptLobbyDropdown` selected in the game lobby.")]
public LuaValue LobbyOption(string id) public LuaValue LobbyOption(string id)

View File

@@ -506,39 +506,6 @@ namespace OpenRA.Mods.Common.Server
return true; return true;
} }
}, },
{ "difficulty",
s =>
{
if (server.LobbyInfo.GlobalSettings.Difficulty == s)
return true;
if (!client.IsAdmin)
{
server.SendOrderTo(conn, "Message", "Only the host can set that option.");
return true;
}
var mapOptions = server.Map.Rules.Actors["world"].TraitInfo<MapOptionsInfo>();
if (mapOptions.DifficultyLocked || !mapOptions.Difficulties.Any())
{
server.SendOrderTo(conn, "Message", "Map has disabled difficulty configuration.");
return true;
}
if (s != null && !mapOptions.Difficulties.Contains(s))
{
server.SendOrderTo(conn, "Message", "Invalid difficulty selected: {0}".F(s));
server.SendOrderTo(conn, "Message", "Supported values: {0}".F(mapOptions.Difficulties.JoinWith(", ")));
return true;
}
server.LobbyInfo.GlobalSettings.Difficulty = s;
server.SyncLobbyGlobalSettings();
server.SendMessage("{0} changed difficulty to {1}.".F(client.Name, s));
return true;
}
},
{ "gamespeed", { "gamespeed",
s => s =>
{ {

View File

@@ -30,15 +30,6 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Prevent the tech level from being changed in the lobby.")] [Desc("Prevent the tech level from being changed in the lobby.")]
public readonly bool TechLevelLocked = false; public readonly bool TechLevelLocked = false;
[Desc("Difficulty levels supported by the map.")]
public readonly string[] Difficulties = { };
[Desc("Default difficulty level.")]
public readonly string Difficulty = null;
[Desc("Prevent the difficulty from being changed in the lobby.")]
public readonly bool DifficultyLocked = false;
IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules) IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules)
{ {
yield return new LobbyBooleanOption("shortgame", "Short Game", ShortGameEnabled, ShortGameLocked); yield return new LobbyBooleanOption("shortgame", "Short Game", ShortGameEnabled, ShortGameLocked);

View File

@@ -94,6 +94,8 @@ namespace OpenRA.Mods.Common.UtilityCommands
internal static void UpgradeActorRules(int engineVersion, ref List<MiniYamlNode> nodes, MiniYamlNode parent, int depth) internal static void UpgradeActorRules(int engineVersion, ref List<MiniYamlNode> nodes, MiniYamlNode parent, int depth)
{ {
var addNodes = new List<MiniYamlNode>();
foreach (var node in nodes) foreach (var node in nodes)
{ {
if (engineVersion < 20160515) if (engineVersion < 20160515)
@@ -146,8 +148,48 @@ namespace OpenRA.Mods.Common.UtilityCommands
} }
} }
// Map difficulty configuration was split to a generic trait
if (engineVersion < 20160614 && node.Key.StartsWith("MapOptions"))
{
var difficultiesNode = node.Value.Nodes.FirstOrDefault(n => n.Key == "Difficulties");
if (difficultiesNode != null)
{
var difficulties = FieldLoader.GetValue<string[]>("Difficulties", difficultiesNode.Value.Value)
.ToDictionary(d => d.Replace(" ", "").ToLowerInvariant(), d => d);
node.Value.Nodes.Remove(difficultiesNode);
var childNodes = new List<MiniYamlNode>()
{
new MiniYamlNode("ID", "difficulty"),
new MiniYamlNode("Label", "Difficulty"),
new MiniYamlNode("Values", new MiniYaml("", difficulties.Select(kv => new MiniYamlNode(kv.Key, kv.Value)).ToList()))
};
var difficultyNode = node.Value.Nodes.FirstOrDefault(n => n.Key == "Difficulty");
if (difficultyNode != null)
{
childNodes.Add(new MiniYamlNode("Default", difficultyNode.Value.Value.Replace(" ", "").ToLowerInvariant()));
node.Value.Nodes.Remove(difficultyNode);
}
else
childNodes.Add(new MiniYamlNode("Default", difficulties.Keys.First()));
var lockedNode = node.Value.Nodes.FirstOrDefault(n => n.Key == "DifficultyLocked");
if (lockedNode != null)
{
childNodes.Add(new MiniYamlNode("Locked", lockedNode.Value.Value));
node.Value.Nodes.Remove(lockedNode);
}
addNodes.Add(new MiniYamlNode("ScriptLobbyDropdown@difficulty", new MiniYaml("", childNodes)));
}
}
UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1); UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
} }
foreach (var a in addNodes)
nodes.Add(a);
} }
internal static void UpgradeWeaponRules(int engineVersion, ref List<MiniYamlNode> nodes, MiniYamlNode parent, int depth) internal static void UpgradeWeaponRules(int engineVersion, ref List<MiniYamlNode> nodes, MiniYamlNode parent, int depth)

View File

@@ -368,6 +368,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ "TECHLEVEL", "techlevel" }, { "TECHLEVEL", "techlevel" },
{ "STARTINGUNITS", "startingunits" }, { "STARTINGUNITS", "startingunits" },
{ "STARTINGCASH", "startingcash" }, { "STARTINGCASH", "startingcash" },
{ "DIFFICULTY", "difficulty" }
}; };
var allOptions = new CachedTransform<MapPreview, LobbyOption[]>( var allOptions = new CachedTransform<MapPreview, LobbyOption[]>(
@@ -423,35 +424,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
} }
} }
var difficulty = optionsBin.GetOrNull<DropDownButtonWidget>("DIFFICULTY_DROPDOWNBUTTON");
if (difficulty != null)
{
var mapOptions = new CachedTransform<MapPreview, MapOptionsInfo>(
map => map.Rules.Actors["world"].TraitInfo<MapOptionsInfo>());
difficulty.IsVisible = () => Map.RulesLoaded && mapOptions.Update(Map).Difficulties.Any();
difficulty.IsDisabled = () => configurationDisabled() || mapOptions.Update(Map).DifficultyLocked;
difficulty.GetText = () => orderManager.LobbyInfo.GlobalSettings.Difficulty;
difficulty.OnMouseDown = _ =>
{
var options = mapOptions.Update(Map).Difficulties.Select(d => new DropDownOption
{
Title = d,
IsSelected = () => orderManager.LobbyInfo.GlobalSettings.Difficulty == d,
OnClick = () => orderManager.IssueOrder(Order.Command("difficulty {0}".F(d)))
});
Func<DropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
{
var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick);
item.Get<LabelWidget>("LABEL").GetText = () => option.Title;
return item;
};
difficulty.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", options.Count() * 30, options, setupItem);
};
optionsBin.Get<LabelWidget>("DIFFICULTY_DESC").IsVisible = difficulty.IsVisible;
}
var gameSpeed = optionsBin.GetOrNull<DropDownButtonWidget>("GAMESPEED_DROPDOWNBUTTON"); var gameSpeed = optionsBin.GetOrNull<DropDownButtonWidget>("GAMESPEED_DROPDOWNBUTTON");
if (gameSpeed != null) if (gameSpeed != null)
{ {

View File

@@ -196,7 +196,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
// Cache the rules on a background thread to avoid jank // Cache the rules on a background thread to avoid jank
var difficultyDisabled = true; var difficultyDisabled = true;
var difficulties = new string[0]; var difficulties = new Dictionary<string, string>();
var briefingVideo = ""; var briefingVideo = "";
var briefingVideoVisible = false; var briefingVideoVisible = false;
@@ -206,11 +206,15 @@ namespace OpenRA.Mods.Common.Widgets.Logic
new Thread(() => new Thread(() =>
{ {
var mapOptions = preview.Rules.Actors["world"].TraitInfo<MapOptionsInfo>(); var mapDifficulty = preview.Rules.Actors["world"].TraitInfos<ScriptLobbyDropdownInfo>()
.FirstOrDefault(sld => sld.ID == "difficulty");
difficulty = mapOptions.Difficulty ?? mapOptions.Difficulties.FirstOrDefault(); if (mapDifficulty != null)
difficulties = mapOptions.Difficulties; {
difficultyDisabled = mapOptions.DifficultyLocked || mapOptions.Difficulties.Length <= 1; difficulty = mapDifficulty.Default;
difficulties = mapDifficulty.Values;
difficultyDisabled = mapDifficulty.Locked;
}
var missionData = preview.Rules.Actors["world"].TraitInfoOrDefault<MissionDataInfo>(); var missionData = preview.Rules.Actors["world"].TraitInfoOrDefault<MissionDataInfo>();
if (missionData != null) if (missionData != null)
@@ -245,15 +249,16 @@ namespace OpenRA.Mods.Common.Widgets.Logic
if (difficultyButton != null) if (difficultyButton != null)
{ {
var difficultyName = new CachedTransform<string, string>(id => id == null || !difficulties.ContainsKey(id) ? "Normal" : difficulties[id]);
difficultyButton.IsDisabled = () => difficultyDisabled; difficultyButton.IsDisabled = () => difficultyDisabled;
difficultyButton.GetText = () => difficulty ?? "Normal"; difficultyButton.GetText = () => difficultyName.Update(difficulty);
difficultyButton.OnMouseDown = _ => difficultyButton.OnMouseDown = _ =>
{ {
var options = difficulties.Select(d => new DropDownOption var options = difficulties.Select(kv => new DropDownOption
{ {
Title = d, Title = kv.Value,
IsSelected = () => difficulty == d, IsSelected = () => difficulty == kv.Key,
OnClick = () => difficulty = d OnClick = () => difficulty = kv.Key
}); });
Func<DropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) => Func<DropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
@@ -361,7 +366,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var orders = new[] { var orders = new[] {
Order.Command("gamespeed {0}".F(gameSpeed)), Order.Command("gamespeed {0}".F(gameSpeed)),
Order.Command("difficulty {0}".F(difficulty)), Order.Command("option difficulty {0}".F(difficulty)),
Order.Command("state {0}".F(Session.ClientState.Ready)) Order.Command("state {0}".F(Session.ClientState.Ready))
}; };

View File

@@ -8,9 +8,15 @@ World:
BriefingVideo: generic.vqa BriefingVideo: generic.vqa
StartVideo: dino.vqa StartVideo: dino.vqa
MapOptions: MapOptions:
Difficulties: Easy, Normal
ShortGameLocked: True ShortGameLocked: True
ShortGameEnabled: False ShortGameEnabled: False
ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
Default: easy
Player: Player:
EnemyWatcher: EnemyWatcher:

View File

@@ -11,7 +11,6 @@ World:
WinVideo: nodlose.vqa WinVideo: nodlose.vqa
LossVideo: gdilose.vqa LossVideo: gdilose.vqa
MapOptions: MapOptions:
Difficulties: Easy, Normal, Hard
ShortGameLocked: True ShortGameLocked: True
ShortGameEnabled: False ShortGameEnabled: False
SmudgeLayer@SCORCH: SmudgeLayer@SCORCH:
@@ -27,6 +26,14 @@ World:
41,54: cr1,0 41,54: cr1,0
13,52: cr1,0 13,52: cr1,0
11,51: cr1,0 11,51: cr1,0
ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
Player: Player:
EnemyWatcher: EnemyWatcher:

View File

@@ -31,9 +31,16 @@ World:
WinVideo: sabotage.vqa WinVideo: sabotage.vqa
LossVideo: gdilose.vqa LossVideo: gdilose.vqa
MapOptions: MapOptions:
Difficulties: Easy, Normal, Hard
ShortGameLocked: True ShortGameLocked: True
ShortGameEnabled: True ShortGameEnabled: True
ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
Player: Player:
PlayerResources: PlayerResources:

View File

@@ -9,7 +9,6 @@ World:
LossVideo: banner.vqa LossVideo: banner.vqa
BriefingVideo: nod9.vqa BriefingVideo: nod9.vqa
MapOptions: MapOptions:
Difficulties: Easy, Normal, Hard
SmudgeLayer@SCORCH: SmudgeLayer@SCORCH:
InitialSmudges: InitialSmudges:
20,55: sc2,0 20,55: sc2,0
@@ -29,6 +28,14 @@ World:
8,55: cr1,0 8,55: cr1,0
8,54: cr1,0 8,54: cr1,0
7,54: cr1,0 7,54: cr1,0
ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
Player: Player:
PlayerResources: PlayerResources:

View File

@@ -10,7 +10,14 @@ World:
BriefingVideo: A_BR01_E.VQA BriefingVideo: A_BR01_E.VQA
MapOptions: MapOptions:
TechLevel: Low TechLevel: Low
Difficulties: Easy, Normal, Hard ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
construction_yard: construction_yard:
Production: Production:

View File

@@ -10,7 +10,14 @@ World:
BriefingVideo: A_BR01_E.VQA BriefingVideo: A_BR01_E.VQA
MapOptions: MapOptions:
TechLevel: Low TechLevel: Low
Difficulties: Easy, Normal, Hard ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
construction_yard: construction_yard:
Production: Production:

View File

@@ -10,7 +10,14 @@ World:
BriefingVideo: A_BR02_E.VQA BriefingVideo: A_BR02_E.VQA
MapOptions: MapOptions:
TechLevel: Low TechLevel: Low
Difficulties: Easy, Normal, Hard ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
carryall.reinforce: carryall.reinforce:
Cargo: Cargo:

View File

@@ -10,7 +10,14 @@ World:
BriefingVideo: A_BR02_E.VQA BriefingVideo: A_BR02_E.VQA
MapOptions: MapOptions:
TechLevel: Low TechLevel: Low
Difficulties: Easy, Normal, Hard ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
carryall.reinforce: carryall.reinforce:
Cargo: Cargo:

View File

@@ -10,7 +10,14 @@ World:
BriefingVideo: A_BR03_E.VQA BriefingVideo: A_BR03_E.VQA
MapOptions: MapOptions:
TechLevel: Low TechLevel: Low
Difficulties: Easy, Normal, Hard ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
carryall.reinforce: carryall.reinforce:
Cargo: Cargo:

View File

@@ -12,11 +12,18 @@ World:
WinVideo: montpass.vqa WinVideo: montpass.vqa
LossVideo: frozen.vqa LossVideo: frozen.vqa
MapOptions: MapOptions:
Difficulties: Easy, Normal, Hard, Real tough guy
SmudgeLayer@CRATER: SmudgeLayer@CRATER:
InitialSmudges: InitialSmudges:
60,79: cr1,0 60,79: cr1,0
ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
realtoughguy: Real tough guy
Default: easy
HARV: HARV:
Buildable: Buildable:

View File

@@ -7,7 +7,13 @@ World:
WinVideo: toofar.vqa WinVideo: toofar.vqa
LossVideo: sovtstar.vqa LossVideo: sovtstar.vqa
MapOptions: MapOptions:
Difficulties: Easy, Normal ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
Default: easy
^Building: ^Building:
Capturable: Capturable:

View File

@@ -7,7 +7,13 @@ World:
WinVideo: toofar.vqa WinVideo: toofar.vqa
LossVideo: sovtstar.vqa LossVideo: sovtstar.vqa
MapOptions: MapOptions:
Difficulties: Easy, Normal ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
Default: easy
^Building: ^Building:
Capturable: Capturable:

View File

@@ -9,7 +9,15 @@ World:
LossVideo: grvestne.vqa LossVideo: grvestne.vqa
MapOptions: MapOptions:
TechLevel: Medium TechLevel: Medium
Difficulties: Easy, Normal, Hard, Real tough guy ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
realtoughguy: Real tough guy
Default: easy
Camera.Truk: Camera.Truk:
AlwaysVisible: AlwaysVisible:

View File

@@ -13,8 +13,13 @@ World:
Scripts: evacuation.lua Scripts: evacuation.lua
MapOptions: MapOptions:
TechLevelLocked: True TechLevelLocked: True
Difficulties: Easy, Normal ScriptLobbyDropdown@difficulty:
Difficulty: Normal ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
Default: normal
^Tanks: ^Tanks:
Demolishable: Demolishable:
@@ -214,4 +219,3 @@ powerproxy.paras2:
AlwaysVisible: AlwaysVisible:
ParatroopersPower: ParatroopersPower:
DropItems: E1,E1,E1,E2,E2 DropItems: E1,E1,E1,E2,E2

View File

@@ -38,9 +38,19 @@ World:
MapOptions: MapOptions:
TechLevelLocked: True TechLevelLocked: True
TechLevel: Unrestricted TechLevel: Unrestricted
Difficulties: Hard (4P), Normal (3P), Easy (2P), Very Easy (1P), Real tough guy, Endless mode
ShortGameLocked: True ShortGameLocked: True
ShortGameEnabled: False ShortGameEnabled: False
ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
hard(4p): Hard (4P)
normal(3p): Normal (3P)
easy(2p): Easy (2P)
veryeasy(1p): Very Easy (1P)
realtoughguy: Real tough guy
endlessmode: Endless mode
Default: hard(4p)
FORTCRATE: FORTCRATE:
Inherits: ^Crate Inherits: ^Crate

View File

@@ -8,7 +8,13 @@ World:
MissionData: MissionData:
Briefing: The Soviet Air Force is flying air raids against a civilian village.\n\nWe have to do everything in our power to stop them!\n\nYour job is to establish a base on the mainland ASAP. We can prevent the village's destruction by capturing the enemy's Air Force Headquarters building. The enemy base is heavily guarded, though. You will not have enough time to build a force big enough to overpower the Soviet defences. You will have to find a way to sneak in!\n\nGood luck, Commander!\n Briefing: The Soviet Air Force is flying air raids against a civilian village.\n\nWe have to do everything in our power to stop them!\n\nYour job is to establish a base on the mainland ASAP. We can prevent the village's destruction by capturing the enemy's Air Force Headquarters building. The enemy base is heavily guarded, though. You will not have enough time to build a force big enough to overpower the Soviet defences. You will have to find a way to sneak in!\n\nGood luck, Commander!\n
MapOptions: MapOptions:
Difficulties: Medium, Hard ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
medium: Medium
hard: Hard
Default: medium
CAMERA: CAMERA:
RevealsShroud: RevealsShroud:

View File

@@ -8,7 +8,14 @@ World:
WinVideo: execute.vqa WinVideo: execute.vqa
LossVideo: take_off.vqa LossVideo: take_off.vqa
MapOptions: MapOptions:
Difficulties: Easy, Normal, Hard ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
^TechBuilding: ^TechBuilding:
AutoTargetIgnore: AutoTargetIgnore:

View File

@@ -13,7 +13,14 @@ World:
LossVideo: allymorf.vqa LossVideo: allymorf.vqa
MapOptions: MapOptions:
TechLevel: Medium TechLevel: Medium
Difficulties: Easy, Normal, Hard ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
AFLD: AFLD:
ParatroopersPower@paratroopers: ParatroopersPower@paratroopers:

View File

@@ -13,7 +13,14 @@ World:
LossVideo: allymorf.vqa LossVideo: allymorf.vqa
MapOptions: MapOptions:
TechLevel: Medium TechLevel: Medium
Difficulties: Easy, Normal, Hard ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
AFLD: AFLD:
ParatroopersPower@paratroopers: ParatroopersPower@paratroopers:

View File

@@ -13,7 +13,14 @@ World:
LossVideo: sovbatl.vqa LossVideo: sovbatl.vqa
MapOptions: MapOptions:
TechLevel: Medium TechLevel: Medium
Difficulties: Easy, Normal, Hard ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
AFLD: AFLD:
ParatroopersPower@paratroopers: ParatroopersPower@paratroopers:

View File

@@ -12,7 +12,14 @@ World:
WinVideo: sitduck.vqa WinVideo: sitduck.vqa
LossVideo: dpthchrg.vqa LossVideo: dpthchrg.vqa
MapOptions: MapOptions:
Difficulties: Easy, Normal, Hard ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
APWR: APWR:
Buildable: Buildable:

View File

@@ -12,7 +12,14 @@ World:
WinVideo: sitduck.vqa WinVideo: sitduck.vqa
LossVideo: dpthchrg.vqa LossVideo: dpthchrg.vqa
MapOptions: MapOptions:
Difficulties: Easy, Normal, Hard ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
APWR: APWR:
Buildable: Buildable:

View File

@@ -8,7 +8,14 @@ World:
WinVideo: averted.vqa WinVideo: averted.vqa
LossVideo: nukestok.vqa LossVideo: nukestok.vqa
MapOptions: MapOptions:
Difficulties: Easy, Normal, Hard ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
normal: Normal
hard: Hard
Default: easy
^Infantry: ^Infantry:
-GivesBounty: -GivesBounty:

View File

@@ -8,7 +8,14 @@ World:
MissionData: MissionData:
Briefing: LANDCOM 66 HQS.\nTOP SECRET.\nTO: FIELD COMMANDER A34\n\nTHE SOVIETS STARTED HEAVY ATTACKS AT OUR POSITION.\n SURVIVE AND HOLD THE BASE UNTIL OUR FRENCH ALLIES ARRIVE.\n\nCONFIRMATION CODE 5593.\n\nTRANSMISSION ENDS. Briefing: LANDCOM 66 HQS.\nTOP SECRET.\nTO: FIELD COMMANDER A34\n\nTHE SOVIETS STARTED HEAVY ATTACKS AT OUR POSITION.\n SURVIVE AND HOLD THE BASE UNTIL OUR FRENCH ALLIES ARRIVE.\n\nCONFIRMATION CODE 5593.\n\nTRANSMISSION ENDS.
MapOptions: MapOptions:
Difficulties: Easy, Medium, Hard ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
easy: Easy
medium: Medium
hard: Hard
Default: easy
powerproxy.paratroopers: powerproxy.paratroopers:
ParatroopersPower: ParatroopersPower: