diff --git a/OpenRa.Game/GameRules/UnitInfo.cs b/OpenRa.Game/GameRules/UnitInfo.cs index 610fc3d407..f4a2dfe8c2 100755 --- a/OpenRa.Game/GameRules/UnitInfo.cs +++ b/OpenRa.Game/GameRules/UnitInfo.cs @@ -20,25 +20,31 @@ namespace OpenRa.Game.GameRules throw new InvalidOperationException(); } + static Func BindInfoCtor() + where T : BaseInfo + { + var ctor = typeof(T).GetConstructor(new[] { typeof(string), typeof(IniSection) }); + return (s, i) => (BaseInfo)ctor.Invoke(new object [] { s,i }); + } + readonly Dictionary unitInfos = new Dictionary(); public UnitInfo( IniFile rules ) { - foreach( var s in Util.ReadAllLines( FileSystem.Open( "buildings.txt" ) ) ) + var srcs = new [] { - var unitName = s.Split( ',' )[ 0 ]; - unitInfos.Add( unitName.ToLowerInvariant(), new BuildingInfo( unitName, rules.GetSection( unitName ) ) ); - } - foreach( var s in Util.ReadAllLines( FileSystem.Open( "infantry.txt" ) ) ) - { - var unitName = s.Split( ',' )[ 0 ]; - unitInfos.Add( unitName.ToLowerInvariant(), new InfantryInfo( unitName, rules.GetSection( unitName ) ) ); - } - foreach( var s in Util.ReadAllLines( FileSystem.Open( "vehicles.txt" ) ) ) - { - var unitName = s.Split( ',' )[ 0 ]; - unitInfos.Add( unitName.ToLowerInvariant(), new VehicleInfo( unitName, rules.GetSection( unitName ) ) ); - } + Pair.New( "buildings.txt", BindInfoCtor() ), + Pair.New( "infantry.txt", BindInfoCtor() ), + Pair.New( "vehicles.txt", BindInfoCtor() ), + }; + + foreach( var src in srcs ) + foreach (var s in Util.ReadAllLines(FileSystem.Open(src.First))) + { + var unitName = s.Split(',')[0]; + unitInfos.Add(unitName.ToLowerInvariant(), + src.Second(unitName, rules.GetSection(unitName))); + } } public BaseInfo Get( string unitName )