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,