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 Map Map; public static TileSet TileSet; public static void LoadRules(string mapFileName, bool useAftermath) { if( useAftermath ) AllRules = new IniFile( FileSystem.Open( "session.ini" ), FileSystem.Open( mapFileName ), FileSystem.Open( "aftrmath.ini" ), FileSystem.Open( "rules.ini" ), FileSystem.Open( "aftermathUnits.ini" ), FileSystem.Open( "units.ini" ), FileSystem.Open( "campaignUnits.ini" ) ); else AllRules = new IniFile( FileSystem.Open("session.ini"), 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", "Defense", "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>("Defense", 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(); Map = new Map( AllRules ); FileSystem.Mount( new Package( Rules.Map.Theater + ".mix" ) ); TileSet = new TileSet( Map.TileSuffix ); } static void LoadCategories(params string[] types) { foreach (var t in types) Categories[t] = AllRules.GetSection(t + "Types").Select(x => x.Key.ToLowerInvariant()).ToList(); } } }