Moved footprint info onto its building.

This commit is contained in:
Bob
2009-10-20 23:55:57 +13:00
parent 6c0ced3e9a
commit cfa56a791d
16 changed files with 607 additions and 385 deletions

View File

@@ -20,14 +20,14 @@ namespace OpenRa.Game
void AddInfluence(Actor a)
{
foreach (var t in Footprint.UnpathableTiles(a.unitInfo.Name, a.Location))
foreach (var t in Footprint.UnpathableTiles(a.unitInfo, a.Location))
if (IsValid(t))
influence[t.X, t.Y] = a;
}
void RemoveInfluence(Actor a)
{
foreach (var t in Footprint.UnpathableTiles(a.unitInfo.Name, a.Location))
foreach (var t in Footprint.UnpathableTiles(a.unitInfo, a.Location))
if (IsValid(t))
influence[t.X, t.Y] = null;
}

View File

@@ -39,10 +39,15 @@ namespace OpenRa.Game.GameRules
var parts = x.Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries );
var ret = Array.CreateInstance( fieldType.GetElementType(), parts.Length );
for (int i = 0; i < parts.Length; i++)
for( int i = 0 ; i < parts.Length ; i++ )
ret.SetValue( GetValue( fieldType.GetElementType(), parts[ i ].Trim() ), i );
return ret;
}
else if( fieldType == typeof( int2 ) )
{
var parts = x.Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries );
return new int2( int.Parse( parts[ 0 ] ), int.Parse( parts[ 1 ] ) );
}
else
throw new InvalidOperationException( "FieldLoader: don't know how to load field of type " + fieldType.ToString() );
}

View File

@@ -7,74 +7,57 @@ using OpenRa.Game.Graphics;
namespace OpenRa.Game.GameRules
{
class Footprint
static class Footprint
{
Dictionary<string, string[]> buildingFootprints;
public static IEnumerable<int2> Tiles( UnitInfo unitInfo, int2 position )
{
var buildingInfo = unitInfo as UnitInfo.BuildingInfo;
var dim = buildingInfo.Dimensions;
public string[] GetFootprint(string name)
var footprint = buildingInfo.Footprint.ToCharArray().Where( x => !char.IsWhiteSpace( x ) );
if( buildingInfo.Bib )
{
string[] val;
if (!buildingFootprints.TryGetValue(name, out val))
buildingFootprints.TryGetValue("*", out val);
return val;
dim.Y += 1;
footprint = footprint.Concat( new char[ dim.X ] );
}
foreach( var tile in TilesWhere( unitInfo.Name, dim, footprint.ToArray(), a => a != '_' ) )
yield return tile + position - AdjustForBuildingSize( buildingInfo );
}
public Footprint(Stream s)
public static IEnumerable<int2> UnpathableTiles( UnitInfo unitInfo, int2 position )
{
var lines = Util.ReadAllLines(s).Where(a => !a.StartsWith("#"));
var buildingInfo = unitInfo as UnitInfo.BuildingInfo;
Func<string,string[]> words =
b => b.Split( new[] { ' ', '\t' },
StringSplitOptions.RemoveEmptyEntries );
var buildings = lines
.Select(a => a.Split(':'))
.SelectMany(a => words(a[1])
.Select( b => new { Name=b, Pat=words(a[0]) } ));
buildingFootprints = buildings
.ToDictionary(a => a.Name, a => a.Pat);
var footprint = buildingInfo.Footprint.ToCharArray().Where( x => !char.IsWhiteSpace( x ) ).ToArray();
foreach( var tile in TilesWhere( unitInfo.Name, buildingInfo.Dimensions, footprint, a => a == 'x' ) )
yield return tile + position;
}
public static IEnumerable<int2> Tiles(string name, int2 position)
static IEnumerable<int2> TilesWhere( string name, int2 dim, char[] footprint, Func<char, bool> cond )
{
var footprint = Rules.Footprint.GetFootprint(name);
var j = 0;
int maxWidth = 0;
foreach (var row in footprint)
if (row.Length > maxWidth)
maxWidth = row.Length;
foreach (var row in footprint)
if( footprint.Length != dim.X * dim.Y )
throw new InvalidOperationException( "Invalid footprint for " + name );
int index = 0;
for( int y = 0 ; y < dim.Y ; y++ )
{
var i = 0;
foreach (var c in row)
for( int x = 0 ; x < dim.X ; x++ )
{
if (c != '_')
yield return position + new int2(i, j) - new int2(maxWidth / 2, footprint.Length / 2);
++i;
if( cond( footprint[ index ] ) )
yield return new int2( x, y );
++index;
}
++j;
}
}
public static IEnumerable<int2> UnpathableTiles( string name, int2 position )
public static int2 AdjustForBuildingSize( string name )
{
var footprint = Rules.Footprint.GetFootprint( name );
var j = 0;
return AdjustForBuildingSize( Rules.UnitInfo[ name ] as UnitInfo.BuildingInfo );
}
foreach( var row in footprint )
public static int2 AdjustForBuildingSize( UnitInfo.BuildingInfo unitInfo )
{
var i = 0;
foreach( var c in row )
{
if( c == 'x' )
yield return position + new int2( i, j );
++i;
}
++j;
}
var dim = unitInfo.Dimensions;
return new int2( dim.X / 2, ( dim.Y + 1 ) / 2 );
}
}
}

View File

@@ -14,7 +14,6 @@ namespace OpenRa.Game
public static InfoLoader<WeaponInfo> WeaponInfo;
public static InfoLoader<WarheadInfo> WarheadInfo;
public static InfoLoader<ProjectileInfo> ProjectileInfo;
public static Footprint Footprint;
public static void LoadRules( string mapFileName )
{
@@ -38,8 +37,6 @@ namespace OpenRa.Game
ProjectileInfo = new InfoLoader<ProjectileInfo>(
Pair.New<string, Func<string, ProjectileInfo>>("ProjectileTypes", _ => new ProjectileInfo()));
Footprint = new Footprint(FileSystem.Open("footprint.txt"));
}
}
}

View File

@@ -58,7 +58,6 @@ namespace OpenRa.Game.GameRules
public class InfantryInfo : MobileInfo
{
public readonly bool C4 = false;
public readonly bool FraidyCat = false;
public readonly bool Infiltrate = false;
@@ -78,6 +77,9 @@ namespace OpenRa.Game.GameRules
public class BuildingInfo : UnitInfo
{
public readonly int2 Dimensions = new int2( 1, 1 );
public readonly string Footprint = "x";
public readonly bool BaseNormal = true;
public readonly int Adjacent = 1;
public readonly bool Bib = false;

View File

@@ -24,13 +24,15 @@ namespace OpenRa.Game.Graphics
public void Scroll(float2 delta)
{
scrollPosition = (scrollPosition + delta).Constrain(float2.Zero, mapSize);
scrollPosition = ( scrollPosition + delta ).Constrain( float2.Zero, mapSize );
}
public Viewport(float2 size, float2 mapSize, Renderer renderer)
{
this.size = size;
this.mapSize = Game.CellSize * mapSize - size + new float2(128, 0);
if( this.mapSize.X < 0 ) this.mapSize.X = 0;
if( this.mapSize.Y < 0 ) this.mapSize.Y = 0;
this.renderer = renderer;
cursorRenderer = new SpriteRenderer(renderer, true);
}

View File

@@ -20,7 +20,7 @@ namespace OpenRa.Game
public IEnumerable<Order> Order(int2 xy)
{
// todo: check that space is free
if (Footprint.Tiles(Name, xy).Any(t => !Game.IsCellBuildable(t, UnitMovementType.Wheel)))
if (Footprint.Tiles(Rules.UnitInfo[Name], xy).Any(t => !Game.IsCellBuildable(t, UnitMovementType.Wheel)))
yield break;
yield return new PlaceBuildingOrder(this, xy);

View File

@@ -10,41 +10,34 @@ namespace OpenRa.Game
PlaceBuilding building;
int2 xy;
public PlaceBuildingOrder(PlaceBuilding building, int2 xy)
public PlaceBuildingOrder( PlaceBuilding building, int2 xy )
{
this.building = building;
this.xy = xy;
}
public override void Apply(bool leftMouseButton)
public override void Apply( bool leftMouseButton )
{
if (leftMouseButton)
if( leftMouseButton )
{
Game.world.AddFrameEndTask(_ =>
Game.world.AddFrameEndTask( _ =>
{
Log.Write("Player \"{0}\" builds {1}", building.Owner.PlayerName, building.Name);
Log.Write( "Player \"{0}\" builds {1}", building.Owner.PlayerName, building.Name );
//Adjust placement for cursor to be in middle
var footprint = Rules.Footprint.GetFootprint(building.Name);
int maxWidth = 0;
foreach (var row in footprint)
if (row.Length > maxWidth)
maxWidth = row.Length;
Game.world.Add(new Actor(building.Name,
xy - new int2(maxWidth / 2, footprint.Length / 2), building.Owner));
Game.world.Add( new Actor( building.Name, xy - GameRules.Footprint.AdjustForBuildingSize( building.Name ), building.Owner ) );
Game.controller.orderGenerator = null;
Game.worldRenderer.uiOverlay.KillOverlay();
});
} );
}
else
{
Game.world.AddFrameEndTask(_ =>
Game.world.AddFrameEndTask( _ =>
{
Game.controller.orderGenerator = null;
Game.worldRenderer.uiOverlay.KillOverlay();
});
} );
}
}
}

View File

@@ -21,14 +21,13 @@ namespace OpenRa.Game.Traits
anim.PlayThen("make", () => anim.PlayRepeating("idle"));
// at this point, we already know where we are, so we can safely place the bib in the smudge
if (((UnitInfo.BuildingInfo)self.unitInfo).Bib)
var buildingInfo = (UnitInfo.BuildingInfo)self.unitInfo;
if (buildingInfo.Bib)
{
var fp = Rules.Footprint.GetFootprint(self.unitInfo.Name);
var bibOffset = fp.Length - 2;
var size = fp.First().Length;
var size = buildingInfo.Dimensions.X;
var bibOffset = buildingInfo.Dimensions.Y - 1;
var startIndex = (size == 2) ? SmallBibStart : LargeBibStart;
for (int i = 0; i < 2 * size; i++)
{
var p = self.Location + Game.map.Offset + new int2(i % size, i / size + bibOffset);

View File

@@ -35,9 +35,9 @@ namespace OpenRa.Game
if (!hasOverlay)
return;
foreach (var t in Footprint.Tiles(name,position))
spriteRenderer.DrawSprite(Game.IsCellBuildable(t, UnitMovementType.Wheel)
? buildOk : buildBlocked, Game.CellSize * t, 0);
foreach( var t in Footprint.Tiles( Rules.UnitInfo[ name ], position ) )
spriteRenderer.DrawSprite( Game.IsCellBuildable( t, UnitMovementType.Wheel )
? buildOk : buildBlocked, Game.CellSize * t, 0 );
spriteRenderer.Flush();
}

View File

@@ -1,6 +1,178 @@
[BuildingTypes]
FCOM
V01
V02
V03
V04
V05
V06
V07
V08
V09
V10
V11
V12
V13
V14
V15
V16
V17
V18
V19
V20
V21
V22
V23
V24
V25
V26
V27
V28
V29
V30
V31
V32
V33
V34
V35
V36
V37
BARL
BRL3
MISS
[FCOM]
Description=Forward Command Post
Traits=Building, RenderBuilding
Dimensions=2,2
Footprint=xx xx
[V01]
Traits=Building, RenderBuilding
Image=FCOM
[V02]
Traits=Building, RenderBuilding
Image=FCOM
[V03]
Traits=Building, RenderBuilding
Image=FCOM
[V04]
Traits=Building, RenderBuilding
Image=FCOM
[V05]
Traits=Building, RenderBuilding
Image=FCOM
[V06]
Traits=Building, RenderBuilding
Image=FCOM
[V07]
Traits=Building, RenderBuilding
Image=FCOM
[V08]
Traits=Building, RenderBuilding
Image=FCOM
[V09]
Traits=Building, RenderBuilding
Image=FCOM
[V10]
Traits=Building, RenderBuilding
Image=FCOM
[V11]
Traits=Building, RenderBuilding
Image=FCOM
[V12]
Traits=Building, RenderBuilding
Image=FCOM
[V13]
Traits=Building, RenderBuilding
Image=FCOM
[V14]
Traits=Building, RenderBuilding
Image=FCOM
[V15]
Traits=Building, RenderBuilding
Image=FCOM
[V16]
Traits=Building, RenderBuilding
Image=FCOM
[V17]
Traits=Building, RenderBuilding
Image=FCOM
[V18]
Traits=Building, RenderBuilding
Image=FCOM
[V19]
Traits=Building, RenderBuilding
Image=FCOM
[V20]
Traits=Building, RenderBuilding
Image=FCOM
[V21]
Traits=Building, RenderBuilding
Image=FCOM
[V22]
Traits=Building, RenderBuilding
Image=FCOM
[V23]
Traits=Building, RenderBuilding
Image=FCOM
[V24]
Traits=Building, RenderBuilding
Image=FCOM
[V25]
Traits=Building, RenderBuilding
Image=FCOM
[V26]
Traits=Building, RenderBuilding
Image=FCOM
[V27]
Traits=Building, RenderBuilding
Image=FCOM
[V28]
Traits=Building, RenderBuilding
Image=FCOM
[V29]
Traits=Building, RenderBuilding
Image=FCOM
[V30]
Traits=Building, RenderBuilding
Image=FCOM
[V31]
Traits=Building, RenderBuilding
Image=FCOM
[V32]
Traits=Building, RenderBuilding
Image=FCOM
[V33]
Traits=Building, RenderBuilding
Image=FCOM
[V34]
Traits=Building, RenderBuilding
Image=FCOM
[V35]
Traits=Building, RenderBuilding
Image=FCOM
[V36]
Traits=Building, RenderBuilding
Image=FCOM
[V37]
Traits=Building, RenderBuilding
Image=FCOM
[BARL]
Traits=Building, RenderBuilding
Image=FCOM
[BRL3]
Traits=Building, RenderBuilding
Image=FCOM
[MISS]
Traits=Building, RenderBuilding
Image=FCOM
[VehicleTypes]
TRUK
[TRUK]
Traits=Mobile, RenderUnit

View File

@@ -1,18 +0,0 @@
#
# Building footprints
#
# default is indicated by *
x : ftur sbag brik fenc gun pbox hbox silo gap kenn *
_ x : tsla agun
xx xx == : powr dome barr tent domf hpad atek
xxx xxx === : weap weaf stek
___ xxx xxx === : apwr
xxx xxx xxx === : fact facf
xxx xxx xxx : syrf syrd spen spef
xx : sam mslo
_x_ xxx x== === : proc
xxx xxx : afld
_x_ xxx _x_ : fix
xx xx : iron

View File

@@ -1721,7 +1721,7 @@ Strength=1
Points=1
Armor=none
Cost=75
Repariable=false
Repairable=false
Adjacent=1
Sight=0
@@ -1731,7 +1731,7 @@ Strength=1
Points=1
Armor=wood
Cost=25
Repariable=false
Repairable=false
Adjacent=1
Sight=0
@@ -1739,7 +1739,7 @@ Sight=0
[WOOD]
Strength=1
Points=1
Repariable=false
Repairable=false
Adjacent=1
Sight=0
@@ -1850,224 +1850,224 @@ BaseNormal=no
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
Capturable=true
[V02]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V03]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V04]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V05]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V06]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V07]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V08]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V09]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V10]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V11]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V12]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V13]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V14]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V15]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V16]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V17]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V18]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V19]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V20]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V21]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V22]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V23]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V24]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V25]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V26]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V27]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V28]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V29]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V30]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V31]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V32]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V33]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V34]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V35]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V36]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
[V37]
Strength=400
Points=5
Armor=wood
Repariable=false
Repairable=false
; ******* Weapon Statistics *******

View File

@@ -169,6 +169,13 @@
<sequence name="make" start="0" length="*" src="gunmake" />
</unit>
<!-- AA gun -->
<unit name="agun">
<sequence name="idle" start="0" length="32"/>
<sequence name="damaged-idle" start="32" length="32"/>
<sequence name="make" start="0" length="*" src="agunmake" />
</unit>
<!-- sam site -->
<unit name="sam">
<sequence name="idle" start="0" length="32"/>
@@ -204,6 +211,13 @@
<sequence name="make" start="0" length="*" src="hboxmake" />
</unit>
<!-- gap generator -->
<unit name="gap">
<sequence name="idle" start="0" length="32"/>
<sequence name="damaged-idle" start="32" length="32"/>
<sequence name="make" start="0" length="*" src="gapmake" />
</unit>
<!-- iron curtain -->
<unit name="iron">
<sequence name="idle" start="0" length="11"/>

View File

@@ -143,105 +143,178 @@ SPEF
DOMF
; TODO? : campaign-specific stuff - FCOM, civilian buildings, etc
; `Dimensions` is the size of a box that will include the whole building, excluding bib.
; ("bib-ness" can be altered in rules.ini; we can't expect people to change this, too)
; `Footprint` is the pathability and buildability of each cell occupied by the building
; _ : Not occupied by the building (e.g: the holes in the refinery and the service depot)
; x : Solid. cannot be walked on or built on.
; = : Occupied by a building, but can be walked on normally. (e.g: the drop-off point on the refinery)
[IRON]
Description=Iron Curtain
Traits=Building, RenderBuilding
Dimensions=2,2
Footprint=xx xx
[ATEK]
Description=Allied Tech Center
Traits=Building, RenderBuilding
Dimensions=2,2
Footprint=xx xx
[PDOX]
Description=Chronosphere
Traits=Building, RenderBuilding
Dimensions=2,1
Footprint=xx
[WEAP]
Description=War Factory
Traits=Building, RenderWarFactory
Dimensions=3,2
Footprint=xxx xxx
[SYRD]
Description=Shipyard
Traits=Building, RenderBuilding
Dimensions=3,3
Footprint=xxx xxx xxx
[SPEN]
Description=Sub Pen
Traits=Building, RenderBuilding
Dimensions=3,3
Footprint=xxx xxx xxx
[PBOX]
Description=Pillbox
Traits=Building, RenderBuilding
Dimensions=1,1
Footprint=x
[HBOX]
Description=Camo Pillbox
Traits=Building, RenderBuilding
Dimensions=1,1
Footprint=x
[TSLA]
Description=Tesla Coil
Traits=Building, RenderBuilding
Dimensions=1,2
Footprint=_ x
[GUN]
Description=Turret
Traits=Building, Turreted, RenderBuildingTurreted
Dimensions=1,1
Footprint=x
[AGUN]
Description=AA Gun
Traits=Building, Turreted, RenderBuildingTurreted
Dimensions=1,2
Footprint=_ x
[FTUR]
Description=Flame Turret
Traits=Building, RenderBuilding
Dimensions=1,1
Footprint=x
[FACT]
Description=Construction Yard
Traits=Building, RenderBuilding
Dimensions=3,3
Footprint=xxx xxx xxx
[PROC]
Description=Ore Refinery
Traits=Building, RenderBuilding
Dimensions=3,3
Footprint=_x_ xxx x==
[SILO]
Description=Silo
Traits=Building, RenderBuildingOre
Dimensions=1,1
Footprint=x
[HPAD]
Description=Helipad
Traits=Building, RenderBuilding
Dimensions=2,2
Footprint=xx xx
[DOME]
Description=Radar Dome
Traits=Building, RenderBuilding
Dimensions=2,2
Footprint=xx xx
[GAP]
Description=Gap Generator
Traits=Building, RenderBuilding
Dimensions=1,2
Footprint=_ x
[SAM]
Description=SAM Site
Traits=Building, Turreted, RenderBuildingTurreted
Dimensions=2,1
Footprint=xx
[MSLO]
Description=Missile Silo
Traits=Building, RenderBuilding
Dimensions=2,1
Footprint=xx
[AFLD]
Description=Airstrip
Traits=Building, RenderBuilding
Dimensions=3,2
Footprint=xxx xxx
[POWR]
Description=Power Plant
Traits=Building, RenderBuilding
Dimensions=2,2
Footprint=xx xx
[APWR]
Description=Advanced Power Plant
Traits=Building, RenderBuilding
Dimensions=3,3
Footprint=___ xxx xxx
[STEK]
Description=Soviet Tech Center
Traits=Building, RenderBuilding
Dimensions=3,2
Footprint=xxx xxx
[BARR]
Description=Soviet Barracks
Traits=Building, RenderBuilding
Dimensions=2,2
Footprint=xx xx
[TENT]
Description=Allied Barracks
Traits=Building, RenderBuilding
Dimensions=2,2
Footprint=xx xx
[KENN]
Description=Kennel
Traits=Building, RenderBuilding
Dimensions=1,1
Footprint=x
[FIX]
Description=Service Depot
Traits=Building, RenderBuilding
Dimensions=3,3
Footprint=_x_ xxx _x_
[FACF]
Description=Fake Construction Yard
Traits=Building, RenderBuilding
Dimensions=3,3
Footprint=xxx xxx xxx
[WEAF]
Description=Fake War Factory
Traits=Building, RenderWarFactory
Dimensions=3,2
Footprint=xxx xxx
[SYRF]
Description=Fake Shipyard
Traits=Building, RenderBuilding
Dimensions=3,3
Footprint=xxx xxx xxx
[SPEF]
Description=Fake Sub Pen
Traits=Building, RenderBuilding
Dimensions=3,3
Footprint=xxx xxx xxx
[DOMF]
Description=Fake Radar Dome
Traits=Building, RenderBuilding
Dimensions=2,2
Footprint=xx xx
;[SBAG]
;Description=Sandbags
;[BRIK]