Traits is now data-driven. Actor.cs is now SMALL. (win)

- FieldLoader can now handle arrays. This might be useful for Prerequisites, Owner fields.
This commit is contained in:
Bob
2009-10-20 18:17:08 +13:00
parent b31071303f
commit 80bcd23ba7
7 changed files with 108 additions and 129 deletions

View File

@@ -8,9 +8,14 @@ namespace OpenRa
{
Dictionary<Type, object> inner = new Dictionary<Type, object>();
public void Add( Type t, object val )
{
inner.Add( t, val );
}
public void Add<T>( T val )
{
inner.Add( typeof( T ), val );
Add( typeof( T ), val );
}
public void Remove<T>()

View File

@@ -26,105 +26,18 @@ namespace OpenRa.Game
CenterLocation = new float2( 12, 12 ) + Game.CellSize * (float2)Location;
Owner = owner;
switch( name )
if( unitInfo.Traits != null )
{
///// vehicles /////
case "mcv":
traits.Add( new Traits.Mobile( this ) );
traits.Add( new Traits.RenderUnit( this ) );
traits.Add( new Traits.McvDeploy( this ) );
break;
case "mnly":
case "apc":
case "v2rl":
case "arty":
traits.Add( new Traits.Mobile( this ) );
traits.Add( new Traits.RenderUnit( this ) );
break;
case "jeep":
case "1tnk":
case "2tnk":
case "3tnk":
case "4tnk":
traits.Add( new Traits.Mobile( this ) );
traits.Add( new Traits.Turreted( this ) );
traits.Add( new Traits.AttackTurreted( this ) );
traits.Add( new Traits.RenderUnitTurreted( this ) );
break;
case "mrj":
case "mgg":
// TODO: these aren't actually turreted; they just have spinning-things
traits.Add( new Traits.Mobile( this ) );
traits.Add( new Traits.Turreted( this ) );
traits.Add( new Traits.RenderUnitTurreted( this ) );
break;
case "harv":
traits.Add( new Traits.Mobile( this ) );
traits.Add( new Traits.RenderUnit( this ) );
break;
///// TODO: infantry /////
///// TODO: boats /////
///// TODO: planes /////
///// buildings /////
//TODO: SBAG, BRIK, FENC, etc
case "iron":
case "pdox":
case "mslo":
case "atek":
case "stek":
case "fact":
case "proc":
case "hpad":
case "afld":
case "dome":
case "powr":
case "apwr":
case "barr":
case "tent":
case "kenn":
case "fix":
case "spen":
case "syrd":
case "gap":
case "pbox":
case "hbox":
case "tsla":
case "ftur":
case "facf":
case "syrf":
case "spef":
case "domf":
traits.Add( new Traits.Building( this ) );
traits.Add( new Traits.RenderBuilding( this ) );
break;
case "weap":
case "weaf":
traits.Add( new Traits.Building( this ) );
traits.Add( new Traits.RenderWarFactory( this ) );
break;
case "gun":
case "agun":
case "sam":
traits.Add( new Traits.Building( this ) );
traits.Add( new Traits.Turreted( this ) );
traits.Add( new Traits.RenderBuildingTurreted( this ) );
break;
case "silo":
traits.Add(new Traits.Building(this));
traits.Add(new Traits.RenderBuildingOre(this));
break;
case "fcom":
traits.Add( new Traits.Building( this ) );
traits.Add( new Traits.RenderBuilding( this ) );
break;
default:
throw new NotImplementedException( "Actor traits for " + name );
foreach( var traitName in unitInfo.Traits )
{
var type = typeof( Traits.Mobile ).Assembly.GetType( typeof( Traits.Mobile ).Namespace + "." + traitName, true, false );
var ctor = type.GetConstructor( new Type[] { typeof( Actor ) } );
traits.Add( type, ctor.Invoke( new object[] { this } ) );
}
}
else
throw new InvalidOperationException( "No Actor traits for " + unitInfo.Name + "; add Traits= to units.ini for appropriate unit" );
}
public Actor( TreeReference tree, TreeCache treeRenderer, int2 mapOffset )
{

View File

@@ -13,26 +13,40 @@ namespace OpenRa.Game.GameRules
foreach( var x in ini )
{
var field = self.GetType().GetField( x.Key );
if( field.FieldType == typeof( int ) )
field.SetValue( self, int.Parse( x.Value ) );
else if( field.FieldType == typeof( float ) )
field.SetValue( self, float.Parse( x.Value ) );
else if( field.FieldType == typeof( string ) )
field.SetValue( self, x.Value.ToLowerInvariant() );
else if( field.FieldType.IsEnum )
field.SetValue( self, Enum.Parse( field.FieldType, x.Value ) );
else if( field.FieldType == typeof( bool ) )
field.SetValue( self, ParseYesNo( x.Value ) );
else
do { } while( false );
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
throw new InvalidOperationException( "FieldLoader: don't know how to load field of type " + fieldType.ToString() );
}
static bool ParseYesNo( string p )
{
p = p.ToLowerInvariant();

View File

@@ -19,7 +19,9 @@ namespace OpenRa.Game.GameRules
}
public readonly string Name;
public readonly string Description = "";
public readonly string[] Traits;
public readonly int Ammo = -1;
public readonly ArmorType Armor = ArmorType.none;

View File

@@ -2,7 +2,6 @@ using System;
using System.Collections.Generic;
using OpenRa.FileFormats;
using OpenRa.Game.GameRules;
using System.Diagnostics;
namespace OpenRa.TechTree
{

View File

@@ -3,4 +3,4 @@ FCOM
[FCOM]
Description=Forward Command Post
Traits=Building, RenderBuilding

View File

@@ -15,30 +15,43 @@ MNLY
[V2RL]
Description=V2 Rocket
Traits=Mobile, RenderUnit
[1TNK]
Description=Light Tank
Traits=Mobile, Turreted, AttackTurreted, RenderUnitTurreted
[2TNK]
Description=Medium Tank
Traits=Mobile, Turreted, AttackTurreted, RenderUnitTurreted
[3TNK]
Description=Heavy Tank
Traits=Mobile, Turreted, AttackTurreted, RenderUnitTurreted
[4TNK]
Description=Mammoth Tank
Traits=Mobile, Turreted, AttackTurreted, RenderUnitTurreted
[MRJ]
Description=Radar Jammer
Traits=Mobile, Turreted, RenderUnitTurreted ; temporary. It's not a turret, it's a spinney-thing
[MGG]
Description=Mobile Gap Generator
Traits=Mobile, Turreted, RenderUnitTurreted ; temporary. It's not a turret, it's a spinney-thing
[ARTY]
Description=Artillery
Traits=Mobile, RenderUnit
[HARV]
Description=Ore Truck
Traits=Mobile, RenderUnit
[MCV]
Description=Mobile Construction Vehicle
Traits=Mobile, McvDeploy, RenderUnit
[JEEP]
Description=Ranger
Traits=Mobile, Turreted, AttackTurreted, RenderUnitTurreted
[APC]
Description=Armored Personnel Carrier
Traits=Mobile, RenderUnit
[MNLY]
Description=Minelayer
Traits=Mobile, RenderUnit
@@ -120,9 +133,9 @@ BARR
TENT
KENN
FIX
SBAG
BRIK
FENC
; SBAG
; BRIK
; FENC
FACF
WEAF
SYRF
@@ -132,76 +145,109 @@ DOMF
[IRON]
Description=Iron Curtain
Traits=Building, RenderBuilding
[ATEK]
Description=Allied Tech Center
Traits=Building, RenderBuilding
[PDOX]
Description=Chronosphere
Traits=Building, RenderBuilding
[WEAP]
Description=War Factory
Traits=Building, RenderWarFactory
[SYRD]
Description=Shipyard
Traits=Building, RenderBuilding
[SPEN]
Description=Sub Pen
Traits=Building, RenderBuilding
[PBOX]
Description=Pillbox
Traits=Building, RenderBuilding
[HBOX]
Description=Camo Pillbox
Traits=Building, RenderBuilding
[TSLA]
Description=Tesla Coil
Traits=Building, RenderBuilding
[GUN]
Description=Turret
Traits=Building, Turreted, RenderBuildingTurreted
[AGUN]
Description=AA Gun
Traits=Building, Turreted, RenderBuildingTurreted
[FTUR]
Description=Flame Turret
Traits=Building, RenderBuilding
[FACT]
Description=Construction Yard
Traits=Building, RenderBuilding
[PROC]
Description=Ore Refinery
Traits=Building, RenderBuilding
[SILO]
Description=Silo
Traits=Building, RenderBuildingOre
[HPAD]
Description=Helipad
Traits=Building, RenderBuilding
[DOME]
Description=Radar Dome
Traits=Building, RenderBuilding
[GAP]
Description=Gap Generator
Traits=Building, RenderBuilding
[SAM]
Description=SAM Site
Traits=Building, Turreted, RenderBuildingTurreted
[MSLO]
Description=Missile Silo
Traits=Building, RenderBuilding
[AFLD]
Description=Airstrip
Traits=Building, RenderBuilding
[POWR]
Description=Power Plant
Traits=Building, RenderBuilding
[APWR]
Description=Advanced Power Plant
Traits=Building, RenderBuilding
[STEK]
Description=Soviet Tech Center
Traits=Building, RenderBuilding
[BARR]
Description=Soviet Barracks
Traits=Building, RenderBuilding
[TENT]
Description=Allied Barracks
Traits=Building, RenderBuilding
[KENN]
Description=Kennel
Traits=Building, RenderBuilding
[FIX]
Description=Service Depot
[SBAG]
Description=Sandbags
[BRIK]
Description=Concrete Wall
[FENC]
Description=Wire Fence
Traits=Building, RenderBuilding
[FACF]
Description=Fake Construction Yard
Traits=Building, RenderBuilding
[WEAF]
Description=Fake War Factory
Traits=Building, RenderWarFactory
[SYRF]
Description=Fake Shipyard
Traits=Building, RenderBuilding
[SPEF]
Description=Fake Sub Pen
Traits=Building, RenderBuilding
[DOMF]
Description=Fake Radar Dome
Traits=Building, RenderBuilding
;[SBAG]
;Description=Sandbags
;[BRIK]
;Description=Concrete Wall
;[FENC]
;Description=Wire Fence