using System; using System.Collections.Generic; using System.Linq; using IjwFramework.Types; using OpenRa.FileFormats; using OpenRa.GameRules; namespace OpenRa { public static class Rules { public static IniFile AllRules; public static Dictionary> Categories = new Dictionary>(); public static InfoLoader WeaponInfo; public static InfoLoader WarheadInfo; public static InfoLoader ProjectileInfo; public static InfoLoader VoiceInfo; public static GeneralInfo General; public static TechTree TechTree; public static Dictionary Info; public static void LoadRules(string map, Manifest m) { var legacyRules = m.LegacyRules.Reverse().ToList(); legacyRules.Insert(0, map); AllRules = new IniFile(legacyRules.Select(a => FileSystem.Open(a)).ToArray()); General = new GeneralInfo(); FieldLoader.Load(General, AllRules.GetSection("General")); LoadCategories( "Weapon", "Warhead", "Projectile", "Voice"); WeaponInfo = new InfoLoader( Pair.New>("Weapon", _ => new WeaponInfo())); WarheadInfo = new InfoLoader( Pair.New>("Warhead", _ => new WarheadInfo())); ProjectileInfo = new InfoLoader( Pair.New>("Projectile", _ => new ProjectileInfo())); VoiceInfo = new InfoLoader( Pair.New>("Voice", _ => new VoiceInfo())); var yamlRules = m.Rules.Reverse().Select(a => MiniYaml.FromFile(a)).Aggregate(MiniYaml.Merge); ActorInfo.LoadModAssemblies(m); Info = new Dictionary(); foreach( var kv in yamlRules ) Info.Add(kv.Key.ToLowerInvariant(), new ActorInfo(kv.Key.ToLowerInvariant(), kv.Value, yamlRules)); TechTree = new TechTree(); } static void LoadCategories(params string[] types) { foreach (var t in types) Categories[t] = AllRules.GetSection(t + "Types").Select(x => x.Key.ToLowerInvariant()).ToList(); } } }