178 lines
4.7 KiB
C#
Executable File
178 lines
4.7 KiB
C#
Executable File
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.IO;
|
|
using OpenRa.FileFormats;
|
|
using OpenRa.Game.Graphics;
|
|
using IjwFramework.Types;
|
|
|
|
namespace OpenRa.Game.GameRules
|
|
{
|
|
public class UnitInfo
|
|
{
|
|
static Func<string, IniSection, BaseInfo> BindInfoCtor<T>()
|
|
where T : BaseInfo
|
|
{
|
|
var ctor = typeof(T).GetConstructor(new[] { typeof(string), typeof(IniSection) });
|
|
return (s, i) => (BaseInfo)ctor.Invoke(new object [] { s,i });
|
|
}
|
|
|
|
readonly Dictionary<string, BaseInfo> unitInfos = new Dictionary<string, BaseInfo>();
|
|
|
|
public UnitInfo( IniFile rules )
|
|
{
|
|
var srcs = new []
|
|
{
|
|
Pair.New( "buildings.txt", BindInfoCtor<BuildingInfo>() ),
|
|
Pair.New( "infantry.txt", BindInfoCtor<InfantryInfo>() ),
|
|
Pair.New( "vehicles.txt", BindInfoCtor<VehicleInfo>() ),
|
|
};
|
|
|
|
foreach( var src in srcs )
|
|
foreach (var s in Util.ReadAllLines(FileSystem.Open(src.First)))
|
|
{
|
|
var unitName = s.Split(',')[0];
|
|
unitInfos.Add(unitName.ToLowerInvariant(),
|
|
src.Second(unitName, rules.GetSection(unitName)));
|
|
}
|
|
}
|
|
|
|
public BaseInfo Get( string unitName )
|
|
{
|
|
return unitInfos[ unitName.ToLowerInvariant() ];
|
|
}
|
|
|
|
public enum ArmorType
|
|
{
|
|
none = 0,
|
|
wood = 1,
|
|
light = 2,
|
|
heavy = 3,
|
|
concrete = 4,
|
|
}
|
|
|
|
public class BaseInfo
|
|
{
|
|
public readonly string Name;
|
|
|
|
public readonly int Ammo = -1;
|
|
public readonly ArmorType Armor = ArmorType.none;
|
|
public readonly bool DoubleOwned = false;
|
|
public readonly bool Cloakable = false;
|
|
public readonly int Cost = 0;
|
|
public readonly bool Crewed = false;
|
|
public readonly bool Explodes = false;
|
|
public readonly int GuardRange = -1; // -1 = use weapon's range
|
|
public readonly string Image = null; // sprite-set to use when rendering
|
|
public readonly bool Invisible = false;
|
|
public readonly string Owner = "allies,soviet"; // TODO: make this an enum
|
|
public readonly int Points = 0;
|
|
public readonly string Prerequisite = "";
|
|
public readonly string Primary = null;
|
|
public readonly string Secondary = null;
|
|
public readonly int ROT = 0;
|
|
public readonly int Reload = 0;
|
|
public readonly bool SelfHealing = false;
|
|
public readonly bool Sensors = false; // no idea what this does
|
|
public readonly int Sight = 1;
|
|
public readonly int Strength = 1;
|
|
public readonly int TechLevel = -1;
|
|
|
|
public BaseInfo( string name, IniSection ini )
|
|
{
|
|
Name = name.ToLowerInvariant();
|
|
|
|
FieldLoader.Load( this, ini );
|
|
}
|
|
}
|
|
|
|
public class MobileInfo : BaseInfo
|
|
{
|
|
public readonly int Passengers = 0;
|
|
public readonly int Speed = 0;
|
|
|
|
public MobileInfo( string name, IniSection ini )
|
|
: base( name, ini )
|
|
{
|
|
}
|
|
}
|
|
|
|
public class InfantryInfo : MobileInfo
|
|
{
|
|
|
|
public readonly bool C4 = false;
|
|
public readonly bool FraidyCat = false;
|
|
public readonly bool Infiltrate = false;
|
|
public readonly bool IsCanine = false;
|
|
|
|
public InfantryInfo( string name, IniSection ini )
|
|
: base( name, ini )
|
|
{
|
|
}
|
|
}
|
|
|
|
public class VehicleInfo : MobileInfo
|
|
{
|
|
public readonly bool Crushable = false;
|
|
public readonly bool Tracked = false;
|
|
public readonly bool NoMovingFire = false;
|
|
|
|
public VehicleInfo( string name, IniSection ini )
|
|
: base( name, ini )
|
|
{
|
|
}
|
|
}
|
|
|
|
public class BuildingInfo : BaseInfo
|
|
{
|
|
public readonly bool BaseNormal = true;
|
|
public readonly int Adjacent = 1;
|
|
public readonly bool Bib = false;
|
|
public readonly bool Capturable = false;
|
|
public readonly int Power = 0;
|
|
public readonly bool Powered = false;
|
|
public readonly bool Repairable = true;
|
|
public readonly int Storage = 0;
|
|
public readonly bool Unsellable = false;
|
|
public readonly bool WaterBound = false;
|
|
|
|
public BuildingInfo( string name, IniSection ini )
|
|
: base( name, ini )
|
|
{
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Example: HARV
|
|
* Unit (can move, etc)
|
|
* PlayerOwned
|
|
* Selectable
|
|
* CanHarvest
|
|
*
|
|
* Example: PROC (refinery)
|
|
* Building (can't move)
|
|
* AcceptsOre (harvester returns here)
|
|
*
|
|
* Example: 3TNK (soviet heavy tank)
|
|
* Unit
|
|
* Turret (can aim in different direction to movement)
|
|
*
|
|
* Example: GUN (allied base defense turret)
|
|
* Building
|
|
* Turret
|
|
*
|
|
* some traits can be determined by fields in rules.ini
|
|
* and some can't :
|
|
* Gap-generator's ability
|
|
* Nuke, chrone, curtain, (super-weapons)
|
|
* Aircraft-landable
|
|
* Selectable (bomber/spyplane can't be selected, for example)
|
|
* AppearsFriendly (spy)
|
|
* IsInfantry (can be build in TENT/BARR, 5-in-a-square)
|
|
* IsVehicle
|
|
* Squashable (sandbags, infantry)
|
|
* Special rendering for war factory
|
|
*/
|
|
}
|
|
}
|