66 lines
1.8 KiB
C#
Executable File
66 lines
1.8 KiB
C#
Executable File
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using OpenRa.FileFormats;
|
|
|
|
namespace OpenRa.Game.GameRules
|
|
{
|
|
static class FieldLoader
|
|
{
|
|
public static void Load( object self, IniSection ini )
|
|
{
|
|
foreach( var x in ini )
|
|
{
|
|
var field = self.GetType().GetField( x.Key );
|
|
field.SetValue( self, GetValue( field.FieldType, x.Value ) );
|
|
}
|
|
}
|
|
|
|
static object GetValue( Type fieldType, string x )
|
|
{
|
|
if( fieldType == typeof( int ) )
|
|
return int.Parse( x );
|
|
|
|
else if( fieldType == typeof( float ) )
|
|
return float.Parse( x );
|
|
|
|
else if( fieldType == typeof( string ) )
|
|
return x;//.ToLowerInvariant();
|
|
|
|
else if( fieldType.IsEnum )
|
|
return Enum.Parse( fieldType, x );
|
|
|
|
else if( fieldType == typeof( bool ) )
|
|
return ParseYesNo( x );
|
|
|
|
else if( fieldType.IsArray )
|
|
{
|
|
var parts = x.Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries );
|
|
|
|
var ret = Array.CreateInstance( fieldType.GetElementType(), parts.Length );
|
|
for( int i = 0 ; i < parts.Length ; i++ )
|
|
ret.SetValue( GetValue( fieldType.GetElementType(), parts[ i ].Trim() ), i );
|
|
return ret;
|
|
}
|
|
else if( fieldType == typeof( int2 ) )
|
|
{
|
|
var parts = x.Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries );
|
|
return new int2( int.Parse( parts[ 0 ] ), int.Parse( parts[ 1 ] ) );
|
|
}
|
|
else
|
|
throw new InvalidOperationException( "FieldLoader: don't know how to load field of type " + fieldType.ToString() );
|
|
}
|
|
|
|
static bool ParseYesNo( string p )
|
|
{
|
|
p = p.ToLowerInvariant();
|
|
if( p == "yes" ) return true;
|
|
if( p == "true" ) return true;
|
|
if( p == "no" ) return false;
|
|
if( p == "false" ) return false;
|
|
throw new InvalidOperationException();
|
|
}
|
|
}
|
|
}
|