using System; using System.Collections.Generic; using System.Linq; using OpenRa.FileFormats; using OpenRa.Game.GameRules; using IjwFramework.Types; namespace OpenRa.Game { static class Rules { public static IniFile AllRules; public static Dictionary> Categories = new Dictionary>(); public static Dictionary UnitCategory; public static InfoLoader UnitInfo; public static InfoLoader WeaponInfo; public static InfoLoader WarheadInfo; public static InfoLoader ProjectileInfo; public static GeneralInfo General; public static TechTree TechTree; public static void LoadRules( string mapFileName ) { AllRules = new IniFile( FileSystem.Open( mapFileName ), FileSystem.Open( "rules.ini" ), FileSystem.Open( "units.ini" ), FileSystem.Open( "campaignUnits.ini" ) ); General = new GeneralInfo(); FieldLoader.Load(General, AllRules.GetSection("General")); LoadCategories( "Building", "Infantry", "Vehicle", "Ship", "Plane" ); UnitCategory = Categories.SelectMany( x => x.Value.Select( y => new KeyValuePair( y, x.Key ) ) ).ToDictionary( x => x.Key, x => x.Value ); UnitInfo = new InfoLoader( Pair.New>( "Building", s => new UnitInfo.BuildingInfo(s)), Pair.New>( "Infantry", s => new UnitInfo.InfantryInfo(s)), Pair.New>( "Vehicle", s => new UnitInfo.VehicleInfo(s)), Pair.New>( "Ship", s => new UnitInfo.VehicleInfo(s)), Pair.New>( "Plane", s => new UnitInfo.VehicleInfo(s))); LoadCategories( "Weapon", "Warhead", "Projectile" ); WeaponInfo = new InfoLoader( Pair.New>("Weapon", _ => new WeaponInfo())); WarheadInfo = new InfoLoader( Pair.New>("Warhead", _ => new WarheadInfo())); ProjectileInfo = new InfoLoader( Pair.New>("Projectile", _ => new ProjectileInfo())); 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(); } } }