Merge ModRuleset and MapRuleset into Ruleset
This commit is contained in:
@@ -19,7 +19,7 @@ namespace OpenRA.Editor
|
|||||||
{
|
{
|
||||||
static class Program
|
static class Program
|
||||||
{
|
{
|
||||||
public static MapRuleset Rules;
|
public static Ruleset Rules;
|
||||||
|
|
||||||
[STAThread]
|
[STAThread]
|
||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
|
|||||||
@@ -36,30 +36,12 @@ namespace OpenRA
|
|||||||
this.modData = modData;
|
this.modData = modData;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ModRuleset LoadModRules()
|
public Ruleset LoadDefaultRules()
|
||||||
{
|
|
||||||
var m = modData.Manifest;
|
|
||||||
|
|
||||||
Dictionary<string, MusicInfo> music;
|
|
||||||
Dictionary<string, string> movies;
|
|
||||||
Dictionary<string, TileSet> tileSets;
|
|
||||||
|
|
||||||
using (new PerfTimer("Music"))
|
|
||||||
music = LoadYamlRules(musicCache, m.Music, new List<MiniYamlNode>(), (k, _) => new MusicInfo(k.Key, k.Value));
|
|
||||||
using (new PerfTimer("Movies"))
|
|
||||||
movies = LoadYamlRules(movieCache, m.Movies, new List<MiniYamlNode>(), (k, v) => k.Value.Value);
|
|
||||||
using (new PerfTimer("TileSets"))
|
|
||||||
tileSets = LoadTileSets(tileSetCache, m.TileSets);
|
|
||||||
|
|
||||||
return new ModRuleset(music, movies, tileSets);
|
|
||||||
}
|
|
||||||
|
|
||||||
public MapRuleset LoadDefaultRules()
|
|
||||||
{
|
{
|
||||||
return LoadMapRules(new Map());
|
return LoadMapRules(new Map());
|
||||||
}
|
}
|
||||||
|
|
||||||
public MapRuleset LoadMapRules(Map map)
|
public Ruleset LoadMapRules(Map map)
|
||||||
{
|
{
|
||||||
var m = modData.Manifest;
|
var m = modData.Manifest;
|
||||||
|
|
||||||
@@ -67,6 +49,9 @@ namespace OpenRA
|
|||||||
Dictionary<string, WeaponInfo> weapons;
|
Dictionary<string, WeaponInfo> weapons;
|
||||||
Dictionary<string, SoundInfo> voices;
|
Dictionary<string, SoundInfo> voices;
|
||||||
Dictionary<string, SoundInfo> notifications;
|
Dictionary<string, SoundInfo> notifications;
|
||||||
|
Dictionary<string, MusicInfo> music;
|
||||||
|
Dictionary<string, string> movies;
|
||||||
|
Dictionary<string, TileSet> tileSets;
|
||||||
|
|
||||||
OnProgress();
|
OnProgress();
|
||||||
using (new PerfTimer("Actors"))
|
using (new PerfTimer("Actors"))
|
||||||
@@ -80,9 +65,18 @@ namespace OpenRA
|
|||||||
OnProgress();
|
OnProgress();
|
||||||
using (new PerfTimer("Notifications"))
|
using (new PerfTimer("Notifications"))
|
||||||
notifications = LoadYamlRules(notificationCache, m.Notifications, map.NotificationDefinitions, (k, _) => new SoundInfo(k.Value));
|
notifications = LoadYamlRules(notificationCache, m.Notifications, map.NotificationDefinitions, (k, _) => new SoundInfo(k.Value));
|
||||||
|
OnProgress();
|
||||||
|
using (new PerfTimer("Music"))
|
||||||
|
music = LoadYamlRules(musicCache, m.Music, new List<MiniYamlNode>(), (k, _) => new MusicInfo(k.Key, k.Value));
|
||||||
|
OnProgress();
|
||||||
|
using (new PerfTimer("Movies"))
|
||||||
|
movies = LoadYamlRules(movieCache, m.Movies, new List<MiniYamlNode>(), (k, v) => k.Value.Value);
|
||||||
|
OnProgress();
|
||||||
|
using (new PerfTimer("TileSets"))
|
||||||
|
tileSets = LoadTileSets(tileSetCache, m.TileSets);
|
||||||
|
|
||||||
OnProgress();
|
OnProgress();
|
||||||
return new MapRuleset(LoadModRules(), actors, weapons, voices, notifications);
|
return new Ruleset(actors, weapons, voices, notifications, music, movies, tileSets);
|
||||||
}
|
}
|
||||||
|
|
||||||
Dictionary<string, T> LoadYamlRules<T>(
|
Dictionary<string, T> LoadYamlRules<T>(
|
||||||
|
|||||||
@@ -111,8 +111,8 @@ namespace OpenRA
|
|||||||
[FieldLoader.Ignore] public Lazy<TileReference<byte, byte>[,]> MapResources;
|
[FieldLoader.Ignore] public Lazy<TileReference<byte, byte>[,]> MapResources;
|
||||||
[FieldLoader.Ignore] public string[,] CustomTerrain;
|
[FieldLoader.Ignore] public string[,] CustomTerrain;
|
||||||
|
|
||||||
[FieldLoader.Ignore] Lazy<MapRuleset> rules;
|
[FieldLoader.Ignore] Lazy<Ruleset> rules;
|
||||||
public MapRuleset Rules { get { return rules != null ? rules.Value : null; } }
|
public Ruleset Rules { get { return rules != null ? rules.Value : null; } }
|
||||||
public SequenceProvider SequenceProvider { get; private set; }
|
public SequenceProvider SequenceProvider { get; private set; }
|
||||||
|
|
||||||
public static Map FromTileset(TileSet tileset)
|
public static Map FromTileset(TileSet tileset)
|
||||||
@@ -249,7 +249,7 @@ namespace OpenRA
|
|||||||
SequenceProvider = new SequenceProvider(this);
|
SequenceProvider = new SequenceProvider(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MapRuleset PreloadRules()
|
public Ruleset PreloadRules()
|
||||||
{
|
{
|
||||||
return rules.Value;
|
return rules.Value;
|
||||||
}
|
}
|
||||||
@@ -508,7 +508,7 @@ namespace OpenRA
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void FixOpenAreas(MapRuleset rules)
|
public void FixOpenAreas(Ruleset rules)
|
||||||
{
|
{
|
||||||
var r = new Random();
|
var r = new Random();
|
||||||
var tileset = rules.TileSets[Tileset];
|
var tileset = rules.TileSets[Tileset];
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ namespace OpenRA
|
|||||||
// the next render cycle.
|
// the next render cycle.
|
||||||
// (d) Any partially written bytes from the next minimap is in an
|
// (d) Any partially written bytes from the next minimap is in an
|
||||||
// unallocated area, and will be committed in the next cycle.
|
// unallocated area, and will be committed in the next cycle.
|
||||||
var bitmap = p.CustomPreview ?? Minimap.RenderMapPreview(modData.ModRules.TileSets[p.Map.Tileset], p.Map, true);
|
var bitmap = p.CustomPreview ?? Minimap.RenderMapPreview(modData.DefaultRules.TileSets[p.Map.Tileset], p.Map, true);
|
||||||
p.Minimap = sheetBuilder.Add(bitmap);
|
p.Minimap = sheetBuilder.Add(bitmap);
|
||||||
|
|
||||||
lock (syncRoot)
|
lock (syncRoot)
|
||||||
|
|||||||
@@ -15,24 +15,29 @@ using OpenRA.GameRules;
|
|||||||
|
|
||||||
namespace OpenRA
|
namespace OpenRA
|
||||||
{
|
{
|
||||||
public class ModRuleset
|
public class Ruleset
|
||||||
{
|
{
|
||||||
|
public readonly IReadOnlyDictionary<string, ActorInfo> Actors;
|
||||||
|
public readonly IReadOnlyDictionary<string, WeaponInfo> Weapons;
|
||||||
|
public readonly IReadOnlyDictionary<string, SoundInfo> Voices;
|
||||||
|
public readonly IReadOnlyDictionary<string, SoundInfo> Notifications;
|
||||||
public readonly IReadOnlyDictionary<string, MusicInfo> Music;
|
public readonly IReadOnlyDictionary<string, MusicInfo> Music;
|
||||||
public readonly IReadOnlyDictionary<string, string> Movies;
|
public readonly IReadOnlyDictionary<string, string> Movies;
|
||||||
public readonly IReadOnlyDictionary<string, TileSet> TileSets;
|
public readonly IReadOnlyDictionary<string, TileSet> TileSets;
|
||||||
|
|
||||||
public ModRuleset(ModRuleset other)
|
public Ruleset(
|
||||||
{
|
IDictionary<string, ActorInfo> actors,
|
||||||
this.Music = other.Music;
|
IDictionary<string, WeaponInfo> weapons,
|
||||||
this.Movies = other.Movies;
|
IDictionary<string, SoundInfo> voices,
|
||||||
this.TileSets = other.TileSets;
|
IDictionary<string, SoundInfo> notifications,
|
||||||
}
|
|
||||||
|
|
||||||
public ModRuleset(
|
|
||||||
IDictionary<string, MusicInfo> music,
|
IDictionary<string, MusicInfo> music,
|
||||||
IDictionary<string, string> movies,
|
IDictionary<string, string> movies,
|
||||||
IDictionary<string, TileSet> tileSets)
|
IDictionary<string, TileSet> tileSets)
|
||||||
{
|
{
|
||||||
|
this.Actors = new ReadOnlyDictionary<string, ActorInfo>(actors);
|
||||||
|
this.Weapons = new ReadOnlyDictionary<string, WeaponInfo>(weapons);
|
||||||
|
this.Voices = new ReadOnlyDictionary<string, SoundInfo>(voices);
|
||||||
|
this.Notifications = new ReadOnlyDictionary<string, SoundInfo>(notifications);
|
||||||
this.Music = new ReadOnlyDictionary<string, MusicInfo>(music);
|
this.Music = new ReadOnlyDictionary<string, MusicInfo>(music);
|
||||||
this.Movies = new ReadOnlyDictionary<string, string>(movies);
|
this.Movies = new ReadOnlyDictionary<string, string>(movies);
|
||||||
this.TileSets = new ReadOnlyDictionary<string, TileSet>(tileSets);
|
this.TileSets = new ReadOnlyDictionary<string, TileSet>(tileSets);
|
||||||
@@ -40,26 +45,4 @@ namespace OpenRA
|
|||||||
|
|
||||||
public IEnumerable<KeyValuePair<string, MusicInfo>> InstalledMusic { get { return Music.Where(m => m.Value.Exists); } }
|
public IEnumerable<KeyValuePair<string, MusicInfo>> InstalledMusic { get { return Music.Where(m => m.Value.Exists); } }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MapRuleset : ModRuleset
|
|
||||||
{
|
|
||||||
public readonly IReadOnlyDictionary<string, ActorInfo> Actors;
|
|
||||||
public readonly IReadOnlyDictionary<string, WeaponInfo> Weapons;
|
|
||||||
public readonly IReadOnlyDictionary<string, SoundInfo> Voices;
|
|
||||||
public readonly IReadOnlyDictionary<string, SoundInfo> Notifications;
|
|
||||||
|
|
||||||
public MapRuleset(
|
|
||||||
ModRuleset modRuleset,
|
|
||||||
IDictionary<string, ActorInfo> actors,
|
|
||||||
IDictionary<string, WeaponInfo> weapons,
|
|
||||||
IDictionary<string, SoundInfo> voices,
|
|
||||||
IDictionary<string, SoundInfo> notifications)
|
|
||||||
: base(modRuleset)
|
|
||||||
{
|
|
||||||
this.Actors = new ReadOnlyDictionary<string, ActorInfo>(actors);
|
|
||||||
this.Weapons = new ReadOnlyDictionary<string, WeaponInfo>(weapons);
|
|
||||||
this.Voices = new ReadOnlyDictionary<string, SoundInfo>(voices);
|
|
||||||
this.Notifications = new ReadOnlyDictionary<string, SoundInfo>(notifications);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,10 +29,8 @@ namespace OpenRA
|
|||||||
public readonly RulesetCache RulesetCache;
|
public readonly RulesetCache RulesetCache;
|
||||||
public CursorProvider CursorProvider { get; private set; }
|
public CursorProvider CursorProvider { get; private set; }
|
||||||
|
|
||||||
Lazy<ModRuleset> modRules;
|
Lazy<Ruleset> defaultRules;
|
||||||
public ModRuleset ModRules { get { return modRules.Value; } }
|
public Ruleset DefaultRules { get { return defaultRules.Value; } }
|
||||||
Lazy<MapRuleset> defaultRules;
|
|
||||||
public MapRuleset DefaultRules { get { return defaultRules.Value; } }
|
|
||||||
|
|
||||||
public ModData(string mod)
|
public ModData(string mod)
|
||||||
{
|
{
|
||||||
@@ -51,7 +49,6 @@ namespace OpenRA
|
|||||||
foreach (var dir in Manifest.Folders)
|
foreach (var dir in Manifest.Folders)
|
||||||
GlobalFileSystem.Mount(dir);
|
GlobalFileSystem.Mount(dir);
|
||||||
|
|
||||||
modRules = Exts.Lazy(() => RulesetCache.LoadModRules());
|
|
||||||
defaultRules = Exts.Lazy(() => RulesetCache.LoadDefaultRules());
|
defaultRules = Exts.Lazy(() => RulesetCache.LoadDefaultRules());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -296,7 +296,7 @@ namespace OpenRA
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Returns true if played successfully
|
// Returns true if played successfully
|
||||||
public static bool PlayPredefined(MapRuleset ruleset, Player p, Actor voicedUnit, string type, string definition, string variant, bool relative, WPos pos, float volumeModifier, bool attenuateVolume)
|
public static bool PlayPredefined(Ruleset ruleset, Player p, Actor voicedUnit, string type, string definition, string variant, bool relative, WPos pos, float volumeModifier, bool attenuateVolume)
|
||||||
{
|
{
|
||||||
if (ruleset == null)
|
if (ruleset == null)
|
||||||
throw new ArgumentNullException("ruleset");
|
throw new ArgumentNullException("ruleset");
|
||||||
|
|||||||
@@ -55,10 +55,10 @@ namespace OpenRA.Widgets
|
|||||||
public Action OnDoubleClick = () => {};
|
public Action OnDoubleClick = () => {};
|
||||||
public Action<KeyInput> OnKeyPress = _ => {};
|
public Action<KeyInput> OnKeyPress = _ => {};
|
||||||
|
|
||||||
readonly MapRuleset rules;
|
readonly Ruleset rules;
|
||||||
|
|
||||||
[ObjectCreator.UseCtor]
|
[ObjectCreator.UseCtor]
|
||||||
public ButtonWidget(MapRuleset rules)
|
public ButtonWidget(Ruleset rules)
|
||||||
{
|
{
|
||||||
this.rules = rules;
|
this.rules = rules;
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ namespace OpenRA.Widgets
|
|||||||
public bool HasPressedState = ChromeMetrics.Get<bool>("CheckboxPressedState");
|
public bool HasPressedState = ChromeMetrics.Get<bool>("CheckboxPressedState");
|
||||||
|
|
||||||
[ObjectCreator.UseCtor]
|
[ObjectCreator.UseCtor]
|
||||||
public CheckboxWidget(MapRuleset rules)
|
public CheckboxWidget(Ruleset rules)
|
||||||
: base(rules)
|
: base(rules)
|
||||||
{
|
{
|
||||||
GetCheckType = () => CheckType;
|
GetCheckType = () => CheckType;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ namespace OpenRA.Widgets
|
|||||||
MaskWidget fullscreenMask;
|
MaskWidget fullscreenMask;
|
||||||
|
|
||||||
[ObjectCreator.UseCtor]
|
[ObjectCreator.UseCtor]
|
||||||
public DropDownButtonWidget(MapRuleset rules)
|
public DropDownButtonWidget(Ruleset rules)
|
||||||
: base(rules) { }
|
: base(rules) { }
|
||||||
|
|
||||||
protected DropDownButtonWidget(DropDownButtonWidget widget) : base(widget) { }
|
protected DropDownButtonWidget(DropDownButtonWidget widget) : base(widget) { }
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ namespace OpenRA.Widgets
|
|||||||
public string BaseName = "scrollitem";
|
public string BaseName = "scrollitem";
|
||||||
|
|
||||||
[ObjectCreator.UseCtor]
|
[ObjectCreator.UseCtor]
|
||||||
public ScrollItemWidget(MapRuleset rules)
|
public ScrollItemWidget(Ruleset rules)
|
||||||
: base(rules)
|
: base(rules)
|
||||||
{
|
{
|
||||||
IsVisible = () => false;
|
IsVisible = () => false;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
|||||||
public class CncInstallMusicLogic
|
public class CncInstallMusicLogic
|
||||||
{
|
{
|
||||||
[ObjectCreator.UseCtor]
|
[ObjectCreator.UseCtor]
|
||||||
public CncInstallMusicLogic(Widget widget, MapRuleset rules, Action onExit)
|
public CncInstallMusicLogic(Widget widget, Ruleset rules, Action onExit)
|
||||||
{
|
{
|
||||||
var installButton = widget.GetOrNull<ButtonWidget>("INSTALL_BUTTON");
|
var installButton = widget.GetOrNull<ButtonWidget>("INSTALL_BUTTON");
|
||||||
if (installButton != null)
|
if (installButton != null)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
|||||||
public class ProductionTooltipLogic
|
public class ProductionTooltipLogic
|
||||||
{
|
{
|
||||||
[ObjectCreator.UseCtor]
|
[ObjectCreator.UseCtor]
|
||||||
public ProductionTooltipLogic(Widget widget, MapRuleset rules, TooltipContainerWidget tooltipContainer, ProductionPaletteWidget palette)
|
public ProductionTooltipLogic(Widget widget, Ruleset rules, TooltipContainerWidget tooltipContainer, ProductionPaletteWidget palette)
|
||||||
{
|
{
|
||||||
var pm = palette.World.LocalPlayer.PlayerActor.Trait<PowerManager>();
|
var pm = palette.World.LocalPlayer.PlayerActor.Trait<PowerManager>();
|
||||||
var pr = palette.World.LocalPlayer.PlayerActor.Trait<PlayerResources>();
|
var pr = palette.World.LocalPlayer.PlayerActor.Trait<PlayerResources>();
|
||||||
@@ -92,7 +92,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static string ActorName(MapRuleset rules, string a)
|
static string ActorName(Ruleset rules, string a)
|
||||||
{
|
{
|
||||||
ActorInfo ai;
|
ActorInfo ai;
|
||||||
if (rules.Actors.TryGetValue(a.ToLowerInvariant(), out ai) && ai.Traits.Contains<TooltipInfo>())
|
if (rules.Actors.TryGetValue(a.ToLowerInvariant(), out ai) && ai.Traits.Contains<TooltipInfo>())
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ namespace OpenRA.Mods.Cnc.Widgets
|
|||||||
public readonly string ProductionGroup;
|
public readonly string ProductionGroup;
|
||||||
|
|
||||||
[ObjectCreator.UseCtor]
|
[ObjectCreator.UseCtor]
|
||||||
public ProductionTypeButtonWidget(MapRuleset rules)
|
public ProductionTypeButtonWidget(Ruleset rules)
|
||||||
: base(rules) { }
|
: base(rules) { }
|
||||||
|
|
||||||
protected ProductionTypeButtonWidget(ProductionTypeButtonWidget other)
|
protected ProductionTypeButtonWidget(ProductionTypeButtonWidget other)
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ namespace OpenRA.Mods.RA.Buildings
|
|||||||
{
|
{
|
||||||
public static class FootprintUtils
|
public static class FootprintUtils
|
||||||
{
|
{
|
||||||
public static IEnumerable<CPos> Tiles(MapRuleset rules, string name, BuildingInfo buildingInfo, CPos topLeft)
|
public static IEnumerable<CPos> Tiles(Ruleset rules, string name, BuildingInfo buildingInfo, CPos topLeft)
|
||||||
{
|
{
|
||||||
var dim = (CVec)buildingInfo.Dimensions;
|
var dim = (CVec)buildingInfo.Dimensions;
|
||||||
|
|
||||||
|
|||||||
@@ -337,7 +337,7 @@ namespace OpenRA.Mods.RA.Widgets
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static string Description(MapRuleset rules, string a)
|
static string Description(Ruleset rules, string a)
|
||||||
{
|
{
|
||||||
ActorInfo ai;
|
ActorInfo ai;
|
||||||
rules.Actors.TryGetValue(a.ToLowerInvariant(), out ai);
|
rules.Actors.TryGetValue(a.ToLowerInvariant(), out ai);
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ShowSlotDropDown(MapRuleset rules, DropDownButtonWidget dropdown, Session.Slot slot,
|
public static void ShowSlotDropDown(Ruleset rules, DropDownButtonWidget dropdown, Session.Slot slot,
|
||||||
Session.Client client, OrderManager orderManager)
|
Session.Client client, OrderManager orderManager)
|
||||||
{
|
{
|
||||||
var options = new Dictionary<string, IEnumerable<SlotDropDownOption>>() {{"Slot", new List<SlotDropDownOption>()
|
var options = new Dictionary<string, IEnumerable<SlotDropDownOption>>() {{"Slot", new List<SlotDropDownOption>()
|
||||||
@@ -280,7 +280,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
name.GetText = () => c.Name;
|
name.GetText = () => c.Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetupEditableSlotWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, MapRuleset rules)
|
public static void SetupEditableSlotWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, Ruleset rules)
|
||||||
{
|
{
|
||||||
var slot = parent.Get<DropDownButtonWidget>("SLOT_OPTIONS");
|
var slot = parent.Get<DropDownButtonWidget>("SLOT_OPTIONS");
|
||||||
slot.IsVisible = () => true;
|
slot.IsVisible = () => true;
|
||||||
|
|||||||
@@ -107,18 +107,18 @@ namespace OpenRA.Utility
|
|||||||
int mapSize;
|
int mapSize;
|
||||||
int actorCount = 0;
|
int actorCount = 0;
|
||||||
Map map = new Map();
|
Map map = new Map();
|
||||||
MapRuleset rules;
|
Ruleset rules;
|
||||||
List<string> players = new List<string>();
|
List<string> players = new List<string>();
|
||||||
Action<string> errorHandler;
|
Action<string> errorHandler;
|
||||||
|
|
||||||
LegacyMapImporter(string filename, MapRuleset rules, Action<string> errorHandler)
|
LegacyMapImporter(string filename, Ruleset rules, Action<string> errorHandler)
|
||||||
{
|
{
|
||||||
this.rules = rules;
|
this.rules = rules;
|
||||||
this.errorHandler = errorHandler;
|
this.errorHandler = errorHandler;
|
||||||
ConvertIniMap(filename);
|
ConvertIniMap(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Map Import(string filename, MapRuleset rules, Action<string> errorHandler)
|
public static Map Import(string filename, Ruleset rules, Action<string> errorHandler)
|
||||||
{
|
{
|
||||||
var converter = new LegacyMapImporter(filename, rules, errorHandler);
|
var converter = new LegacyMapImporter(filename, rules, errorHandler);
|
||||||
return converter.map;
|
return converter.map;
|
||||||
|
|||||||
Reference in New Issue
Block a user