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>(); 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 ) public void Add<T>( T val )
{ {
inner.Add( typeof( T ), val ); Add( typeof( T ), val );
} }
public void Remove<T>() public void Remove<T>()

View File

@@ -26,105 +26,18 @@ namespace OpenRa.Game
CenterLocation = new float2( 12, 12 ) + Game.CellSize * (float2)Location; CenterLocation = new float2( 12, 12 ) + Game.CellSize * (float2)Location;
Owner = owner; Owner = owner;
switch( name ) if( unitInfo.Traits != null )
{ {
///// vehicles ///// foreach( var traitName in unitInfo.Traits )
case "mcv": {
traits.Add( new Traits.Mobile( this ) ); var type = typeof( Traits.Mobile ).Assembly.GetType( typeof( Traits.Mobile ).Namespace + "." + traitName, true, false );
traits.Add( new Traits.RenderUnit( this ) ); var ctor = type.GetConstructor( new Type[] { typeof( Actor ) } );
traits.Add( new Traits.McvDeploy( this ) ); traits.Add( type, ctor.Invoke( new object[] { 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 );
} }
} }
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 ) public Actor( TreeReference tree, TreeCache treeRenderer, int2 mapOffset )
{ {

View File

@@ -13,26 +13,40 @@ namespace OpenRa.Game.GameRules
foreach( var x in ini ) foreach( var x in ini )
{ {
var field = self.GetType().GetField( x.Key ); var field = self.GetType().GetField( x.Key );
if( field.FieldType == typeof( int ) ) field.SetValue( self, GetValue( field.FieldType, x.Value ) );
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 );
} }
} }
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 ) static bool ParseYesNo( string p )
{ {
p = p.ToLowerInvariant(); p = p.ToLowerInvariant();

View File

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

View File

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

View File

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

View File

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