sequences for the rest of the buildable buildings, and fixes to make HBOX and MSLO work

- HBOX and MSLO sprites are in temperat/snow mixes with .tem/.sno extensions (and not present in interior)
This commit is contained in:
Bob
2009-10-10 19:30:19 +13:00
parent 4c9bd5c095
commit 4fa05a6d40
5 changed files with 201 additions and 72 deletions

View File

@@ -26,5 +26,20 @@ namespace OpenRa.FileFormats
throw new FileNotFoundException("File not found", filename); throw new FileNotFoundException("File not found", filename);
} }
public static Stream OpenWithExts( string filename, params string[] exts )
{
foreach( var ext in exts )
{
foreach( IFolder folder in mountedFolders )
{
Stream s = folder.GetContent( filename + ext );
if( s != null )
return s;
}
}
throw new FileNotFoundException( "File not found", filename );
}
} }
} }

View File

@@ -22,6 +22,7 @@ namespace OpenRa.Game
{ {
unitInfo = Rules.UnitInfo.Get( name ); unitInfo = Rules.UnitInfo.Get( name );
Location = location; Location = location;
CenterLocation = new float2( 12, 12 ) + 24 * (float2)Location;
Owner = owner; Owner = owner;
switch( name ) switch( name )
@@ -29,7 +30,7 @@ namespace OpenRa.Game
///// vehicles ///// ///// vehicles /////
case "mcv": case "mcv":
traits.Add( new Traits.Mobile( this ) ); traits.Add( new Traits.Mobile( this ) );
traits.Add( new Traits.RenderUnit( this, name ) ); traits.Add( new Traits.RenderUnit( this ) );
traits.Add( new Traits.McvDeploy( this ) ); traits.Add( new Traits.McvDeploy( this ) );
break; break;
case "mnly": case "mnly":
@@ -37,7 +38,7 @@ namespace OpenRa.Game
case "v2rl": case "v2rl":
case "arty": case "arty":
traits.Add( new Traits.Mobile( this ) ); traits.Add( new Traits.Mobile( this ) );
traits.Add( new Traits.RenderUnit( this, name ) ); traits.Add( new Traits.RenderUnit( this ) );
break; break;
case "jeep": case "jeep":
case "1tnk": case "1tnk":
@@ -48,11 +49,11 @@ namespace OpenRa.Game
case "mgg": case "mgg":
traits.Add( new Traits.Mobile( this ) ); traits.Add( new Traits.Mobile( this ) );
traits.Add( new Traits.Turreted( this ) ); traits.Add( new Traits.Turreted( this ) );
traits.Add( new Traits.RenderUnitTurreted( this, name ) ); traits.Add( new Traits.RenderUnitTurreted( this ) );
break; break;
case "harv": case "harv":
traits.Add( new Traits.Mobile( this ) ); traits.Add( new Traits.Mobile( this ) );
traits.Add( new Traits.RenderUnit( this, name ) ); traits.Add( new Traits.RenderUnit( this ) );
break; break;
///// TODO: infantry ///// ///// TODO: infantry /////
@@ -66,7 +67,6 @@ namespace OpenRa.Game
case "mslo": case "mslo":
case "atek": case "atek":
case "stek": case "stek":
case "weap":
case "fact": case "fact":
case "proc": case "proc":
case "silo": case "silo":
@@ -79,7 +79,8 @@ namespace OpenRa.Game
case "tent": case "tent":
case "kenn": case "kenn":
case "fix": case "fix":
//SYRD, SPEN case "spen":
case "syrd":
//GAP //GAP
//SBAG, BRIK, FENC //SBAG, BRIK, FENC
//FACF, WEAF, SYRF, SPEF, DOMF //FACF, WEAF, SYRF, SPEF, DOMF
@@ -88,14 +89,18 @@ namespace OpenRa.Game
case "tsla": case "tsla":
case "ftur": case "ftur":
traits.Add( new Traits.Building( this ) ); traits.Add( new Traits.Building( this ) );
traits.Add( new Traits.RenderBuilding( this, name ) ); traits.Add( new Traits.RenderBuilding( this ) );
break;
case "weap":
traits.Add( new Traits.Building( this ) );
traits.Add( new Traits.RenderWarFactory( this ) );
break; break;
case "gun": case "gun":
case "agun": case "agun":
case "sam": case "sam":
traits.Add( new Traits.Building( this ) ); traits.Add( new Traits.Building( this ) );
traits.Add( new Traits.Turreted( this ) ); traits.Add( new Traits.Turreted( this ) );
traits.Add( new Traits.RenderBuildingTurreted( this, name ) ); traits.Add( new Traits.RenderBuildingTurreted( this ) );
break; break;
default: default:
throw new NotImplementedException( "Actor traits for " + name ); throw new NotImplementedException( "Actor traits for " + name );
@@ -114,7 +119,7 @@ namespace OpenRa.Game
tick.Tick( this, game, dt ); tick.Tick( this, game, dt );
} }
public float2 CenterLocation { get { return new float2( 12, 12 ) + 24 * (float2)Location; } } public float2 CenterLocation;
public float2 SelectedSize { get { return Render().FirstOrDefault().First.size; } } public float2 SelectedSize { get { return Render().FirstOrDefault().First.size; } }
public IEnumerable<Pair<Sprite, float2>> Render() public IEnumerable<Pair<Sprite, float2>> Render()
@@ -152,9 +157,9 @@ namespace OpenRa.Game
{ {
public Animation anim; public Animation anim;
public RenderSimple( Actor self, string unitName ) public RenderSimple( Actor self )
{ {
anim = new Animation( unitName ); anim = new Animation( self.unitInfo.Name );
} }
public abstract IEnumerable<Pair<Sprite, float2>> Render( Actor self ); public abstract IEnumerable<Pair<Sprite, float2>> Render( Actor self );
@@ -167,10 +172,10 @@ namespace OpenRa.Game
class RenderBuilding : RenderSimple class RenderBuilding : RenderSimple
{ {
public RenderBuilding( Actor self, string unitName ) public RenderBuilding( Actor self )
: base( self, unitName ) : base( self )
{ {
anim.PlayThen( "make", () => anim.Play( "idle" ) ); anim.PlayThen( "make", () => anim.PlayRepeating( "idle" ) );
} }
public override IEnumerable<Pair<Sprite, float2>> Render( Actor self ) public override IEnumerable<Pair<Sprite, float2>> Render( Actor self )
@@ -181,17 +186,48 @@ namespace OpenRa.Game
class RenderBuildingTurreted : RenderBuilding class RenderBuildingTurreted : RenderBuilding
{ {
public RenderBuildingTurreted( Actor self, string unitName ) public RenderBuildingTurreted( Actor self )
: base( self, unitName ) : base( self )
{ {
anim.PlayThen( "make", () => anim.PlayFetchIndex( "idle", () => self.traits.Get<Turreted>().turretFacing ) ); anim.PlayThen( "make", () => anim.PlayFetchIndex( "idle", () => self.traits.Get<Turreted>().turretFacing ) );
} }
} }
class RenderWarFactory : RenderBuilding
{
public Animation roof;
bool doneBuilding;
public RenderWarFactory( Actor self )
: base( self )
{
roof = new Animation( self.unitInfo.Name );
anim.PlayThen( "make", () =>
{
doneBuilding = true;
anim.Play( "idle" );
roof.Play( "idle-top" );
} );
}
public override IEnumerable<Pair<Sprite, float2>> Render( Actor self )
{
yield return Pair.New( anim.Image, 24f * (float2)self.Location );
if( doneBuilding )
yield return Pair.New( roof.Image, 24f * (float2)self.Location );
}
public override void Tick( Actor self, Game game, int dt )
{
base.Tick( self, game, dt );
roof.Tick( dt );
}
}
class RenderUnit : RenderSimple class RenderUnit : RenderSimple
{ {
public RenderUnit( Actor self, string unitName ) public RenderUnit( Actor self )
:base( self, unitName ) : base( self )
{ {
anim.PlayFetchIndex( "idle", () => self.traits.Get<Mobile>().facing ); anim.PlayFetchIndex( "idle", () => self.traits.Get<Mobile>().facing );
} }
@@ -215,20 +251,18 @@ namespace OpenRa.Game
{ {
public Animation turretAnim; public Animation turretAnim;
public RenderUnitTurreted( Actor self, string unitName ) public RenderUnitTurreted( Actor self )
: base( self, unitName ) : base( self )
{ {
turretAnim = new Animation( unitName ); turretAnim = new Animation( self.unitInfo.Name );
turretAnim.PlayFetchIndex( "turret", () => self.traits.Get<Turreted>().turretFacing ); turretAnim.PlayFetchIndex( "turret", () => self.traits.Get<Turreted>().turretFacing );
} }
public override IEnumerable<Pair<Sprite, float2>> Render( Actor self ) public override IEnumerable<Pair<Sprite, float2>> Render( Actor self )
{ {
var mobile = self.traits.Get<Mobile>(); var mobile = self.traits.Get<Mobile>();
float fraction = ( mobile.moveFraction > 0 ) ? (float)mobile.moveFraction / mobile.moveFractionTotal : 0f; yield return Centered( anim.Image, self.CenterLocation );
var centerLocation = new float2( 12, 12 ) + 24 * float2.Lerp( mobile.fromCell, mobile.toCell, fraction ); yield return Centered( turretAnim.Image, self.CenterLocation );
yield return Centered( anim.Image, centerLocation );
yield return Centered( turretAnim.Image, centerLocation );
} }
public override void Tick( Actor self, Game game, int dt ) public override void Tick( Actor self, Game game, int dt )
@@ -287,7 +321,19 @@ namespace OpenRa.Game
return highest; return highest;
} }
void UpdateCenterLocation()
{
float fraction = ( moveFraction > 0 ) ? (float)moveFraction / moveFractionTotal : 0f;
self.CenterLocation = new float2( 12, 12 ) + 24 * float2.Lerp( fromCell, toCell, fraction );
}
public void Tick( Actor self, Game game, int dt ) public void Tick( Actor self, Game game, int dt )
{
Move( self, game, dt );
UpdateCenterLocation();
}
void Move( Actor self, Game game, int dt )
{ {
if( fromCell != toCell ) if( fromCell != toCell )
{ {
@@ -385,7 +431,10 @@ namespace OpenRa.Game
public void Tick( Actor self, Game game, int dt ) public void Tick( Actor self, Game game, int dt )
{ {
if( first && self.Owner == game.LocalPlayer ) if( first && self.Owner == game.LocalPlayer )
{
self.Owner.TechTree.Build( self.unitInfo.Name, true ); self.Owner.TechTree.Build( self.unitInfo.Name, true );
self.CenterLocation = 24 * (float2)self.Location + 0.5f * self.SelectedSize;
}
first = false; first = false;
} }
} }

View File

@@ -84,7 +84,7 @@ namespace OpenRa.Game.GameRules
public BaseInfo( string name, IniSection ini ) public BaseInfo( string name, IniSection ini )
{ {
Name = name; Name = name.ToLowerInvariant();
foreach( var x in ini ) foreach( var x in ini )
{ {

View File

@@ -24,7 +24,7 @@ namespace OpenRa.Game.Graphics
int low = sprites.Count; int low = sprites.Count;
ShpReader reader = new ShpReader(FileSystem.Open(name + ".shp")); ShpReader reader = new ShpReader( FileSystem.OpenWithExts( name, ".shp", ".tem", ".sno", ".int" ) );
foreach (ImageHeader h in reader) foreach (ImageHeader h in reader)
sprites.Add(SheetBuilder.Add(h.Image, reader.Size)); sprites.Add(SheetBuilder.Add(h.Image, reader.Size));

View File

@@ -31,7 +31,6 @@
<sequences> <sequences>
<!-- construction yard --> <!-- construction yard -->
<unit name="fact"> <unit name="fact">
<sequence name="idle" start="0"/> <sequence name="idle" start="0"/>
<sequence name="make" start="0" length="32" src="factmake" /> <sequence name="make" start="0" length="32" src="factmake" />
@@ -41,15 +40,20 @@
</unit> </unit>
<!-- refinery --> <!-- refinery -->
<unit name="proc"> <unit name="proc">
<sequence name="idle" start="0"/> <sequence name="idle" start="0"/>
<sequence name="damaged-idle" start="1"/> <sequence name="damaged-idle" start="1"/>
<sequence name="make" start="0" length="*" src="procmake" /> <sequence name="make" start="0" length="*" src="procmake" />
</unit> </unit>
<!-- power plant --> <!-- silo -->
<unit name="silo">
<sequence name="idle" start="0" length="5"/>
<sequence name="damaged-idle" start="5" length="5"/>
<sequence name="make" start="0" length="*" src="silomake" />
</unit>
<!-- power plant -->
<unit name="powr"> <unit name="powr">
<sequence name="idle" start="0"/> <sequence name="idle" start="0"/>
<sequence name="damaged-idle" start="1"/> <sequence name="damaged-idle" start="1"/>
@@ -57,7 +61,6 @@
</unit> </unit>
<!-- advanced power plant --> <!-- advanced power plant -->
<unit name="apwr"> <unit name="apwr">
<sequence name="idle" start="0"/> <sequence name="idle" start="0"/>
<sequence name="damaged-idle" start="1"/> <sequence name="damaged-idle" start="1"/>
@@ -65,7 +68,6 @@
</unit> </unit>
<!-- soviet barracks --> <!-- soviet barracks -->
<unit name="barr"> <unit name="barr">
<sequence name="idle" start="0" length="10"/> <sequence name="idle" start="0" length="10"/>
<sequence name="damaged-idle" start="10" length="10"/> <sequence name="damaged-idle" start="10" length="10"/>
@@ -73,15 +75,20 @@
</unit> </unit>
<!-- allied barracks --> <!-- allied barracks -->
<unit name="tent"> <unit name="tent">
<sequence name="idle" start="0" length="10"/> <sequence name="idle" start="0" length="10"/>
<sequence name="damaged-idle" start="10" length="10"/> <sequence name="damaged-idle" start="10" length="10"/>
<sequence name="make" start="0" length="*" src="tentmake" /> <sequence name="make" start="0" length="*" src="tentmake" />
</unit> </unit>
<!-- radar dome --> <!-- kennel -->
<unit name="kenn">
<sequence name="idle" start="0"/>
<sequence name="damaged-idle" start="1"/>
<sequence name="make" start="0" length="*" src="kennmake" />
</unit>
<!-- radar dome -->
<unit name="dome"> <unit name="dome">
<sequence name="idle" start="0"/> <sequence name="idle" start="0"/>
<sequence name="damaged-idle" start="1"/> <sequence name="damaged-idle" start="1"/>
@@ -89,7 +96,6 @@
</unit> </unit>
<!-- allied tech center --> <!-- allied tech center -->
<unit name="atek"> <unit name="atek">
<sequence name="idle" start="0"/> <sequence name="idle" start="0"/>
<sequence name="damaged-idle" start="1"/> <sequence name="damaged-idle" start="1"/>
@@ -97,7 +103,6 @@
</unit> </unit>
<!-- soviet tech center --> <!-- soviet tech center -->
<unit name="stek"> <unit name="stek">
<sequence name="idle" start="0"/> <sequence name="idle" start="0"/>
<sequence name="damaged-idle" start="1"/> <sequence name="damaged-idle" start="1"/>
@@ -105,39 +110,111 @@
</unit> </unit>
<!-- war factory --> <!-- war factory -->
<unit name="weap"> <unit name="weap">
<sequence name="idle" start="0"/> <sequence name="idle" start="0"/>
<sequence name="damaged-idle" start="1"/> <sequence name="damaged-idle" start="1"/>
<sequence name="make" start="0" length="*" src="weapmake" /> <sequence name="make" start="0" length="*" src="weapmake" />
<sequence name="build-top" start="0" length="4" src="weap2" /> <sequence name="build-top" start="0" length="4" src="weap2" />
<sequence name="build2-top" start="4" length="4" src="weap2" /> <sequence name="build2-top" start="4" length="4" src="weap2" />
<sequence name="idle-top" start="0" length="1" src="weap2" /> <sequence name="idle-top" start="0" length="1" src="weap2" />
<sequence name="damaged-idle_top" start="4" length="1" src="weap2" /> <sequence name="damaged-idle_top" start="4" length="1" src="weap2" />
</unit>
<!-- helipad -->
<unit name="hpad">
<sequence name="idle" start="0" length="7"/>
<sequence name="damaged-idle" start="7" length="7"/>
<sequence name="make" start="0" length="*" src="hpadmake" />
</unit>
<!-- airfield -->
<unit name="afld">
<sequence name="idle" start="0" length="8"/>
<sequence name="damaged-idle" start="8" length="8"/>
<sequence name="make" start="0" length="*" src="afldmake" />
</unit>
<!-- sub pen -->
<unit name="spen">
<sequence name="idle" start="0"/>
<sequence name="damaged-idle" start="1"/>
<sequence name="make" start="0" length="*" src="spenmake" />
</unit>
<!-- shipyard -->
<unit name="syrd">
<sequence name="idle" start="0"/>
<sequence name="damaged-idle" start="1"/>
<sequence name="make" start="0" length="*" src="syrdmake" />
</unit>
<!-- repair pad -->
<unit name="fix">
<sequence name="idle" start="0" length="7"/>
<sequence name="damaged-idle" start="7" length="7"/>
<sequence name="make" start="0" length="*" src="fixmake" />
</unit> </unit>
<!-- allied gun turret --> <!-- allied gun turret -->
<unit name="gun"> <unit name="gun">
<sequence name="idle" start="0" length="32"/> <sequence name="idle" start="0" length="32"/>
<sequence name="damaged-idle" start="1" length="32"/> <sequence name="damaged-idle" start="32" length="32"/>
<sequence name="make" start="0" length="*" src="gunmake" /> <sequence name="make" start="0" length="*" src="gunmake" />
</unit> </unit>
<!-- mcv --> <!-- sam site -->
<unit name="sam">
<sequence name="idle" start="0" length="32"/>
<sequence name="damaged-idle" start="34" length="32"/>
<sequence name="make" start="0" length="*" src="sammake" />
</unit>
<!-- flame turret -->
<unit name="ftur">
<sequence name="idle" start="0"/>
<sequence name="damaged-idle" start="1"/>
<sequence name="make" start="0" length="*" src="fturmake" />
</unit>
<!-- tesla coil -->
<unit name="tsla">
<sequence name="idle" start="0" length="10"/>
<sequence name="damaged-idle" start="10" length="10"/>
<sequence name="make" start="0" length="*" src="tslamake" />
</unit>
<!-- iron curtain -->
<unit name="iron">
<sequence name="idle" start="0" length="11"/>
<sequence name="damaged-idle" start="11" length="11"/>
<sequence name="make" start="0" length="*" src="ironmake" />
</unit>
<!-- chronosphere -->
<unit name="pdox">
<sequence name="idle" start="0" length="29"/>
<sequence name="damaged-idle" start="29" length="29"/>
<sequence name="make" start="0" length="*" src="pdoxmake" />
</unit>
<!-- nuclear missile silo -->
<unit name="mslo">
<sequence name="idle" start="0" length="8"/>
<sequence name="damaged-idle" start="8" length="8"/>
<sequence name="make" start="0" length="*" src="mslomake" />
</unit>
<!-- mcv -->
<unit name="mcv"> <unit name="mcv">
<sequence name="idle" start="0" length="*"/> <sequence name="idle" start="0" length="*"/>
</unit> </unit>
<!-- truck --> <!-- truck -->
<unit name="truk"> <unit name="truk">
<sequence name="idle" start="0" length="*"/> <sequence name="idle" start="0" length="*"/>
</unit> </unit>
<!-- harv --> <!-- harv -->
<unit name="harv"> <unit name="harv">
<sequence name="idle" start="0" length="32"/> <sequence name="idle" start="0" length="32"/>
<sequence name="harvest0" start="32" length="8"/> <sequence name="harvest0" start="32" length="8"/>
@@ -152,35 +229,30 @@
</unit> </unit>
<!-- light tank --> <!-- light tank -->
<unit name="1tnk"> <unit name="1tnk">
<sequence name="idle" start="0" length="32"/> <sequence name="idle" start="0" length="32"/>
<sequence name="turret" start="32" length="32"/> <sequence name="turret" start="32" length="32"/>
</unit> </unit>
<!-- medium tank --> <!-- medium tank -->
<unit name="2tnk"> <unit name="2tnk">
<sequence name="idle" start="0" length="32"/> <sequence name="idle" start="0" length="32"/>
<sequence name="turret" start="32" length="32"/> <sequence name="turret" start="32" length="32"/>
</unit> </unit>
<!-- heavy tank --> <!-- heavy tank -->
<unit name="3tnk"> <unit name="3tnk">
<sequence name="idle" start="0" length="32"/> <sequence name="idle" start="0" length="32"/>
<sequence name="turret" start="32" length="32"/> <sequence name="turret" start="32" length="32"/>
</unit> </unit>
<!-- mammoth tank --> <!-- mammoth tank -->
<unit name="4tnk"> <unit name="4tnk">
<sequence name="idle" start="0" length="32"/> <sequence name="idle" start="0" length="32"/>
<sequence name="turret" start="32" length="32"/> <sequence name="turret" start="32" length="32"/>
</unit> </unit>
<!-- v2 rocket launcher --> <!-- v2 rocket launcher -->
<unit name="v2rl"> <unit name="v2rl">
<sequence name="idle" start="0" length="32"/> <sequence name="idle" start="0" length="32"/>
<sequence name="reloading" start="32" length="32"/> <sequence name="reloading" start="32" length="32"/>
@@ -188,47 +260,40 @@
</unit> </unit>
<!-- artillery --> <!-- artillery -->
<unit name="arty"> <unit name="arty">
<sequence name="idle" start="0" length="32"/> <sequence name="idle" start="0" length="32"/>
</unit> </unit>
<!-- jeep --> <!-- jeep -->
<unit name="jeep"> <unit name="jeep">
<sequence name="idle" start="0" length="32"/> <sequence name="idle" start="0" length="32"/>
<sequence name="turret" start="32" length="32"/> <sequence name="turret" start="32" length="32"/>
</unit> </unit>
<!-- apc --> <!-- apc -->
<unit name="apc"> <unit name="apc">
<sequence name="idle" start="0" length="32"/> <sequence name="idle" start="0" length="32"/>
</unit> </unit>
<!-- mine layer --> <!-- mine layer -->
<unit name="mnly"> <unit name="mnly">
<sequence name="idle" start="0" length="32"/> <sequence name="idle" start="0" length="32"/>
<!-- and 16 "lay mine" sprites, not used in real-ra --> <!-- and 16 "lay mine" sprites, not used in real-ra -->
</unit> </unit>
<!-- radar jammer --> <!-- radar jammer -->
<unit name="mrj"> <unit name="mrj">
<sequence name="idle" start="0" length="32"/> <sequence name="idle" start="0" length="32"/>
<sequence name="turret" start="32" length="32"/> <sequence name="turret" start="32" length="32"/>
</unit> </unit>
<!-- mobile gap generator --> <!-- mobile gap generator -->
<unit name="mgg"> <unit name="mgg">
<sequence name="idle" start="0" length="32"/> <sequence name="idle" start="0" length="32"/>
<sequence name="turret" start="32" length="8"/> <sequence name="turret" start="32" length="8"/>
</unit> </unit>
<!-- build clock - hacked in --> <!-- build clock - hacked in -->
<unit name="clock"> <unit name="clock">
<sequence name="idle" start="0" length="*"/> <sequence name="idle" start="0" length="*"/>
</unit> </unit>