diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj
index 657430e706..0ecffd43f7 100644
--- a/OpenRa.Game/OpenRa.Game.csproj
+++ b/OpenRa.Game/OpenRa.Game.csproj
@@ -47,6 +47,7 @@
+
diff --git a/OpenRa.Game/Rules.cs b/OpenRa.Game/Rules.cs
new file mode 100644
index 0000000000..80fecb4adc
--- /dev/null
+++ b/OpenRa.Game/Rules.cs
@@ -0,0 +1,79 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using OpenRa.FileFormats;
+
+namespace OpenRa.Game
+{
+ static class Rules
+ {
+ static readonly Dictionary unitInfos = new Dictionary();
+
+ static Rules()
+ {
+ IniFile rulesIni = new IniFile( FileSystem.Open( "rules.ini" ) );
+ using( Stream s = FileSystem.Open( "units.txt" ) )
+ {
+ StreamReader reader = new StreamReader( s );
+
+ while( true )
+ {
+ string unit = reader.ReadLine();
+ if( unit == null )
+ break;
+ unit = unit.Substring( 0, unit.IndexOf( ',' ) );
+ IniSection section = rulesIni.GetSection( unit.ToUpperInvariant() );
+ if( section == null )
+ {
+ Log.Write( "rules.ini doesnt contain entry for unit \"{0}\"", unit );
+ continue;
+ }
+ unitInfos.Add( unit, new UnitInfo( section ) );
+ }
+ }
+ }
+
+ public static UnitInfo UnitInfo( string name )
+ {
+ return unitInfos[ name.ToUpperInvariant() ];
+ }
+ }
+
+ class UnitInfo
+ {
+ public readonly int Speed;
+
+ public UnitInfo( IniSection ini )
+ {
+ Speed = int.Parse( ini.GetValue( "Speed", "0" ) );
+ }
+ }
+
+ //Unit Missions:
+ //{
+ // Sleep - no-op
+ // Harmless - no-op, and also not considered a threat
+ // Sticky
+ // Attack
+ // Move
+ // QMove
+ // Retreat
+ // Guard
+ // Enter
+ // Capture
+ // Harvest
+ // Area Guard
+ // [Return]
+ // Stop
+ // [Ambush]
+ // Hunt
+ // Unload
+ // Sabotage
+ // Construction
+ // Selling
+ // Repair
+ // Rescue
+ // Missile
+ //}
+}
diff --git a/OpenRa.Game/Unit.cs b/OpenRa.Game/Unit.cs
index 9571dd74bb..c88bce2450 100644
--- a/OpenRa.Game/Unit.cs
+++ b/OpenRa.Game/Unit.cs
@@ -17,6 +17,7 @@ namespace OpenRa.Game
protected TickFunc nextOrder = null;
protected readonly float2 renderOffset;
+ protected readonly UnitInfo unitInfo;
public Unit( string name, int2 cell, Player owner, float2 renderOffset, Game game )
: base( game )
@@ -24,6 +25,7 @@ namespace OpenRa.Game
fromCell = toCell = cell;
this.renderOffset = renderOffset;
this.owner = owner;
+ this.unitInfo = Rules.UnitInfo( name );
animation = new Animation( name );
animation.PlayFetchIndex( "idle", delegate { return facing; } );
@@ -53,8 +55,6 @@ namespace OpenRa.Game
return highest;
}
- const int Speed = 6;
-
public override void Tick( Game game, int t )
{
animation.Tick( t );
@@ -78,7 +78,7 @@ namespace OpenRa.Game
if( Turn( GetFacing( toCell - fromCell ) ) )
return;
- moveFraction += t * Speed;
+ moveFraction += t * unitInfo.Speed;
if( moveFraction < moveFractionTotal )
return;
diff --git a/todo.todo b/todo.todo
index 14a685f1e9..fff0fd0ae6 100644
--- a/todo.todo
+++ b/todo.todo
@@ -10,9 +10,11 @@ OpenRA
[ ] Rules.ini
[ ] Unit turn rate as specified in rules.ini
+ [ ] Load unit/building infos
[ ] Ore
[ ] Better harvester logic - seek out more ore when harvesting, until full
+ [ ] Render it :D
[ ] Weapons
@@ -52,9 +54,9 @@ OpenRA
Use FileSystem.Create() to automatically place output files on sensible mounts.
[ ] Ditch special unit classes, use templates extracted from rules.ini instead.
- Push the special-case logic into code that can be named.
+ [ ] Push the special-case logic into code that can be named.
- [ ] Remove all remaining `../../../` bullshit from the code. We should be able to set our datapaths
+ [x] Remove all remaining `../../../` bullshit from the code. We should be able to set our datapaths
externally, then `just go`. The FileSystem class is there to facilitate this.
[ ] Get rid of all the damned static classes! Makes it REALLY HARD to reuse code,