Added FacingInit and AltitudeInit. Used in Mobile/Aircraft/Husks. Refactored Production, SpyPlane, Paratroopers and LeavesHusk

This commit is contained in:
alzeih
2010-08-02 00:49:26 +12:00
parent 2cc6e197fa
commit 4ea66ea309
8 changed files with 83 additions and 19 deletions

View File

@@ -36,17 +36,57 @@ namespace OpenRA
{ {
return dict.Get<T>().Value( world ); return dict.Get<T>().Value( world );
} }
public bool Contains<T>()
where T : IActorInit
{
return dict.Contains<T>();
}
} }
public interface IActorInit public interface IActorInit {}
{
}
public interface IActorInit<T> : IActorInit public interface IActorInit<T> : IActorInit
{ {
T Value( World world ); T Value( World world );
} }
public class FacingInit : IActorInit<int>
{
[FieldFromYamlKey]
public readonly int value = 128;
public FacingInit() { }
public FacingInit( int init )
{
value = init;
}
public int Value( World world )
{
return value;
}
}
public class AltitudeInit : IActorInit<int>
{
[FieldFromYamlKey]
public readonly int value = 0;
public AltitudeInit() { }
public AltitudeInit( int init )
{
value = init;
}
public int Value( World world )
{
return value;
}
}
public class LocationInit : IActorInit<int2> public class LocationInit : IActorInit<int2>
{ {
[FieldFromYamlKey] [FieldFromYamlKey]

View File

@@ -77,6 +77,8 @@ namespace OpenRA.Traits
this.self = init.self; this.self = init.self;
this.Info = info; this.Info = info;
this.__fromCell = this.__toCell = init.Get<LocationInit,int2>(); this.__fromCell = this.__toCell = init.Get<LocationInit,int2>();
this.Facing = init.Contains<FacingInit>() ? init.Get<FacingInit,int>() : info.InitialFacing;
this.Altitude = init.Contains<AltitudeInit>() ? init.Get<AltitudeInit,int>() : 0;
shroud = self.World.WorldActor.traits.Get<Shroud>(); shroud = self.World.WorldActor.traits.Get<Shroud>();
uim = self.World.WorldActor.traits.Get<UnitInfluence>(); uim = self.World.WorldActor.traits.Get<UnitInfluence>();

View File

@@ -12,6 +12,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.GameRules; using OpenRA.GameRules;
using System.Drawing; using System.Drawing;
using OpenRA.FileFormats;
namespace OpenRA.Traits namespace OpenRA.Traits
{ {
@@ -55,8 +56,11 @@ namespace OpenRA.Traits
if( location == null || self.World.WorldActor.traits.Get<UnitInfluence>().GetUnitsAt( location.Value ).Any() ) if( location == null || self.World.WorldActor.traits.Get<UnitInfluence>().GetUnitsAt( location.Value ).Any() )
return false; return false;
var newUnit = self.World.CreateActor( producee.Name, location.Value, self.Owner ); var newUnit = self.World.CreateActor( producee.Name, new TypeDictionary
newUnit.traits.Get<IFacing>().Facing = CreationFacing( self, newUnit ); ; {
new LocationInit( location.Value ),
new OwnerInit( self.Owner ),
});
var pi = self.Info.Traits.Get<ProductionInfo>(); var pi = self.Info.Traits.Get<ProductionInfo>();
var rp = self.traits.GetOrDefault<RallyPoint>(); var rp = self.traits.GetOrDefault<RallyPoint>();

View File

@@ -42,6 +42,8 @@ namespace OpenRA.Mods.RA
public Aircraft( ActorInitializer init , AircraftInfo info) public Aircraft( ActorInitializer init , AircraftInfo info)
{ {
this.Location = init.Get<LocationInit,int2>(); this.Location = init.Get<LocationInit,int2>();
this.Facing = init.Contains<FacingInit>() ? init.Get<FacingInit,int>() : info.InitialFacing;
this.Altitude = init.Contains<AltitudeInit>() ? init.Get<AltitudeInit,int>() : 0;
Info = info; Info = info;
} }

View File

@@ -27,12 +27,13 @@ namespace OpenRA.Mods.RA
[Sync] [Sync]
public int Facing { get; set; } public int Facing { get; set; }
public int ROT { get { return 0; } } public int ROT { get { return 0; } }
public int InitialFacing { get { return 0; } } public int InitialFacing { get { return 128; } }
public Husk(ActorInitializer init) public Husk(ActorInitializer init)
{ {
this.self = init.self; this.self = init.self;
this.location = init.Get<LocationInit,int2>(); this.location = init.Get<LocationInit,int2>();
this.Facing = init.Contains<FacingInit>() ? init.Get<FacingInit,int>() : 128;
self.World.WorldActor.traits.Get<UnitInfluence>().Add(self, this); self.World.WorldActor.traits.Get<UnitInfluence>().Add(self, this);
} }

View File

@@ -9,6 +9,7 @@
#endregion #endregion
using OpenRA.Traits; using OpenRA.Traits;
using OpenRA.FileFormats;
namespace OpenRA.Mods.RA namespace OpenRA.Mods.RA
{ {
@@ -26,9 +27,13 @@ namespace OpenRA.Mods.RA
self.World.AddFrameEndTask(w => self.World.AddFrameEndTask(w =>
{ {
var info = self.Info.Traits.Get<LeavesHuskInfo>(); var info = self.Info.Traits.Get<LeavesHuskInfo>();
var husk = w.CreateActor(info.HuskActor, self.Location, self.Owner);
husk.CenterLocation = self.CenterLocation; var husk = w.CreateActor(info.HuskActor, new TypeDictionary
husk.traits.Get<IFacing>().Facing = self.traits.Get<IFacing>().Facing; {
new LocationInit( self.Location ),
new OwnerInit( self.Owner ),
new FacingInit( self.traits.Get<IFacing>().Facing ),
});
var turreted = self.traits.GetOrDefault<Turreted>(); var turreted = self.traits.GetOrDefault<Turreted>();
if (turreted != null) if (turreted != null)

View File

@@ -11,6 +11,7 @@
using OpenRA.Mods.RA.Activities; using OpenRA.Mods.RA.Activities;
using OpenRA.Orders; using OpenRA.Orders;
using OpenRA.Traits; using OpenRA.Traits;
using OpenRA.FileFormats;
namespace OpenRA.Mods.RA namespace OpenRA.Mods.RA
{ {
@@ -57,12 +58,16 @@ namespace OpenRA.Mods.RA
var startPos = owner.World.ChooseRandomEdgeCell(); var startPos = owner.World.ChooseRandomEdgeCell();
owner.World.AddFrameEndTask(w => owner.World.AddFrameEndTask(w =>
{ {
var flareType = (Info as ParatroopersPowerInfo).FlareType; var info = (Info as ParatroopersPowerInfo);
var flare = flareType != null ? w.CreateActor(flareType, p, owner) : null; var flare = info.FlareType != null ? w.CreateActor(info.FlareType, p, owner) : null;
var a = w.CreateActor((Info as ParatroopersPowerInfo).UnitType, startPos, owner); var a = w.CreateActor(info.UnitType, new TypeDictionary
a.traits.Get<IFacing>().Facing = Util.GetFacing(p - startPos, 0); {
a.traits.Get<IMove>().Altitude = a.Info.Traits.Get<PlaneInfo>().CruiseAltitude; new LocationInit( startPos ),
new OwnerInit( owner ),
new FacingInit( Util.GetFacing(p - startPos, 0) ),
new AltitudeInit( Rules.Info[info.UnitType].Traits.Get<PlaneInfo>().CruiseAltitude ),
});
a.CancelActivity(); a.CancelActivity();
a.QueueActivity(new FlyCircle(p)); a.QueueActivity(new FlyCircle(p));

View File

@@ -12,6 +12,7 @@ using OpenRA.Mods.RA.Activities;
using OpenRA.Orders; using OpenRA.Orders;
using OpenRA.Traits; using OpenRA.Traits;
using OpenRA.Traits.Activities; using OpenRA.Traits.Activities;
using OpenRA.FileFormats;
namespace OpenRA.Mods.RA namespace OpenRA.Mods.RA
{ {
@@ -45,9 +46,13 @@ namespace OpenRA.Mods.RA
var enterCell = self.World.ChooseRandomEdgeCell(); var enterCell = self.World.ChooseRandomEdgeCell();
var plane = self.World.CreateActor("U2", enterCell, self.Owner); var plane = self.World.CreateActor("u2", new TypeDictionary
plane.traits.Get<IMove>().Altitude = plane.Info.Traits.Get<PlaneInfo>().CruiseAltitude; {
plane.traits.Get<IFacing>().Facing = Util.GetFacing(order.TargetLocation - enterCell, 0); new LocationInit( enterCell ),
new OwnerInit( self.Owner ),
new FacingInit( Util.GetFacing(order.TargetLocation - enterCell, 0) ),
new AltitudeInit( Rules.Info["u2"].Traits.Get<PlaneInfo>().CruiseAltitude ),
});
plane.CancelActivity(); plane.CancelActivity();
plane.QueueActivity(new Fly(Util.CenterOfCell(order.TargetLocation))); plane.QueueActivity(new Fly(Util.CenterOfCell(order.TargetLocation)));