diff --git a/OpenRA.Game/Manifest.cs b/OpenRA.Game/Manifest.cs index f23c0d6276..cf9f7a9e36 100644 --- a/OpenRA.Game/Manifest.cs +++ b/OpenRA.Game/Manifest.cs @@ -79,6 +79,7 @@ namespace OpenRA public readonly IReadOnlyDictionary Packages; public readonly IReadOnlyDictionary MapFolders; public readonly MiniYaml LoadScreen; + public readonly string DefaultOrderGenerator; public readonly string[] SoundFormats = Array.Empty(); public readonly string[] SpriteFormats = Array.Empty(); @@ -90,7 +91,7 @@ namespace OpenRA "Include", "Metadata", "Folders", "MapFolders", "Packages", "Rules", "Sequences", "ModelSequences", "Cursors", "Chrome", "Assemblies", "ChromeLayout", "Weapons", "Voices", "Notifications", "Music", "Translations", "TileSets", "ChromeMetrics", "Missions", "Hotkeys", - "ServerTraits", "LoadScreen", "SupportsMapsFrom", "SoundFormats", "SpriteFormats", "VideoFormats", + "ServerTraits", "LoadScreen", "DefaultOrderGenerator", "SupportsMapsFrom", "SoundFormats", "SpriteFormats", "VideoFormats", "RequiresMods", "PackageFormats" }; @@ -161,6 +162,9 @@ namespace OpenRA MapCompatibility = compat.ToArray(); + if (yaml.ContainsKey("DefaultOrderGenerator")) + DefaultOrderGenerator = yaml["DefaultOrderGenerator"].Value; + if (yaml.ContainsKey("PackageFormats")) PackageFormats = FieldLoader.GetValue("PackageFormats", yaml["PackageFormats"].Value); diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index e85bf20be5..8089b41b1c 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using OpenRA.Effects; using OpenRA.FileFormats; @@ -33,6 +34,7 @@ namespace OpenRA readonly List unpartitionedEffects = new List(); readonly List syncedEffects = new List(); readonly GameSettings gameSettings; + readonly ModData modData; readonly Queue> frameEndActions = new Queue>(); @@ -143,6 +145,8 @@ namespace OpenRA // Hide the OrderManager from mod code public void IssueOrder(Order o) { OrderManager.IssueOrder(o); } + readonly Type defaultOrderGeneratorType; + IOrderGenerator orderGenerator; public IOrderGenerator OrderGenerator { @@ -160,7 +164,7 @@ namespace OpenRA public readonly ISelection Selection; public readonly IControlGroups ControlGroups; - public void CancelInputMode() { OrderGenerator = new UnitOrderGenerator(); } + public void CancelInputMode() { OrderGenerator = (IOrderGenerator)modData.ObjectCreator.CreateBasic(defaultOrderGeneratorType); } public bool ToggleInputMode() where T : IOrderGenerator, new() { @@ -182,11 +186,20 @@ namespace OpenRA internal World(ModData modData, Map map, OrderManager orderManager, WorldType type) { + this.modData = modData; Type = type; OrderManager = orderManager; - orderGenerator = new UnitOrderGenerator(); Map = map; + if (string.IsNullOrEmpty(modData.Manifest.DefaultOrderGenerator)) + throw new InvalidDataException("mod.yaml must define a DefaultOrderGenerator"); + + defaultOrderGeneratorType = modData.ObjectCreator.FindType(modData.Manifest.DefaultOrderGenerator); + if (defaultOrderGeneratorType == null) + throw new InvalidDataException($"{modData.Manifest.DefaultOrderGenerator} is not a valid DefaultOrderGenerator"); + + orderGenerator = (IOrderGenerator)modData.ObjectCreator.CreateBasic(defaultOrderGeneratorType); + var gameSpeeds = modData.Manifest.Get(); var gameSpeedName = orderManager.LobbyInfo.GlobalSettings.OptionOrDefault("gamespeed", gameSpeeds.DefaultSpeed); GameSpeed = gameSpeeds.Speeds[gameSpeedName]; diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 09770b6235..464d6b450a 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -223,6 +223,8 @@ MapGrid: TileSize: 24,24 Type: Rectangular +DefaultOrderGenerator: UnitOrderGenerator + SupportsMapsFrom: cnc SoundFormats: Aud, Wav diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index dcaa353c51..523418f15f 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -204,6 +204,8 @@ Fonts: Missions: d2k|missions.yaml +DefaultOrderGenerator: UnitOrderGenerator + SupportsMapsFrom: d2k SoundFormats: Aud, Wav diff --git a/mods/ra/mod.yaml b/mods/ra/mod.yaml index 2ad42c0826..c8b9f400c7 100644 --- a/mods/ra/mod.yaml +++ b/mods/ra/mod.yaml @@ -226,6 +226,8 @@ MapGrid: TileSize: 24,24 Type: Rectangular +DefaultOrderGenerator: UnitOrderGenerator + SupportsMapsFrom: ra SoundFormats: Aud, Wav diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index 7eb95cb9e1..5e5f6fde4f 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -256,6 +256,8 @@ Fonts: Size: 32 Ascender: 24 +DefaultOrderGenerator: UnitOrderGenerator + SupportsMapsFrom: ts SoundFormats: Aud, Wav