Health as an ActorInit
This commit is contained in:
@@ -15,13 +15,13 @@ using System.Linq;
|
|||||||
using OpenRA.Effects;
|
using OpenRA.Effects;
|
||||||
using OpenRA.Traits.Activities;
|
using OpenRA.Traits.Activities;
|
||||||
using OpenRA.GameRules;
|
using OpenRA.GameRules;
|
||||||
|
using OpenRA.FileFormats;
|
||||||
|
|
||||||
namespace OpenRA.Traits
|
namespace OpenRA.Traits
|
||||||
{
|
{
|
||||||
public class HealthInfo : ITraitInfo
|
public class HealthInfo : ITraitInfo
|
||||||
{
|
{
|
||||||
public readonly int HP = 0;
|
public readonly int HP = 0;
|
||||||
public readonly int InitialHP = 0;
|
|
||||||
public readonly ArmorType Armor = ArmorType.none;
|
public readonly ArmorType Armor = ArmorType.none;
|
||||||
public virtual object Create(ActorInitializer init) { return new Health(init, this); }
|
public virtual object Create(ActorInitializer init) { return new Health(init, this); }
|
||||||
}
|
}
|
||||||
@@ -39,7 +39,7 @@ namespace OpenRA.Traits
|
|||||||
{
|
{
|
||||||
Info = info;
|
Info = info;
|
||||||
MaxHP = info.HP;
|
MaxHP = info.HP;
|
||||||
hp = (info.InitialHP == 0) ? MaxHP : info.InitialHP;
|
hp = init.Contains<HealthInit>() ? (int)(init.Get<HealthInit, float>()*MaxHP) : MaxHP;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int HP { get { return hp; } }
|
public int HP { get { return hp; } }
|
||||||
@@ -47,7 +47,6 @@ namespace OpenRA.Traits
|
|||||||
public float HPFraction
|
public float HPFraction
|
||||||
{
|
{
|
||||||
get { return hp * 1f / MaxHP; }
|
get { return hp * 1f / MaxHP; }
|
||||||
set { hp = (int)(value * MaxHP); }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsDead { get { return hp <= 0; } }
|
public bool IsDead { get { return hp <= 0; } }
|
||||||
@@ -117,6 +116,26 @@ namespace OpenRA.Traits
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class HealthInit : IActorInit<float>
|
||||||
|
{
|
||||||
|
[FieldFromYamlKey]
|
||||||
|
public readonly float value = 1f;
|
||||||
|
|
||||||
|
public HealthInit() { }
|
||||||
|
|
||||||
|
public HealthInit( float init )
|
||||||
|
{
|
||||||
|
value = init;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float Value( World world )
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static class HealthExts
|
public static class HealthExts
|
||||||
{
|
{
|
||||||
public static bool IsDead(this Actor self)
|
public static bool IsDead(this Actor self)
|
||||||
|
|||||||
@@ -52,17 +52,17 @@ namespace OpenRA.Mods.RA.Activities
|
|||||||
self.World.Remove(self);
|
self.World.Remove(self);
|
||||||
foreach (var s in sounds)
|
foreach (var s in sounds)
|
||||||
Sound.PlayToPlayer(self.Owner, s, self.CenterLocation);
|
Sound.PlayToPlayer(self.Owner, s, self.CenterLocation);
|
||||||
|
|
||||||
var a = w.CreateActor( actor, new TypeDictionary
|
var init = new TypeDictionary
|
||||||
{
|
{
|
||||||
new LocationInit( self.Location + offset ),
|
new LocationInit( self.Location + offset ),
|
||||||
new OwnerInit( self.Owner ),
|
new OwnerInit( self.Owner ),
|
||||||
new FacingInit( facing ),
|
new FacingInit( facing ),
|
||||||
});
|
};
|
||||||
var oldHealth = self.traits.GetOrDefault<Health>();
|
if (self.traits.Contains<Health>())
|
||||||
var newHealth = a.traits.GetOrDefault<Health>();
|
init.Add( new HealthInit( self.traits.Get<Health>().HPFraction ));
|
||||||
if (oldHealth != null && newHealth != null)
|
|
||||||
newHealth.HPFraction = oldHealth.HPFraction;
|
var a = w.CreateActor( actor, init );
|
||||||
|
|
||||||
if (selected)
|
if (selected)
|
||||||
w.Selection.Add(w, a);
|
w.Selection.Add(w, a);
|
||||||
|
|||||||
@@ -37,27 +37,27 @@ namespace OpenRA.Mods.RA
|
|||||||
|
|
||||||
public object Create(ActorInitializer init) { return new Bridge(init.self, this); }
|
public object Create(ActorInitializer init) { return new Bridge(init.self, this); }
|
||||||
|
|
||||||
public IEnumerable<ushort> Templates
|
public IEnumerable<Pair<ushort, float>> Templates
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (Template != 0)
|
if (Template != 0)
|
||||||
yield return Template;
|
yield return Pair.New(Template, 1f);
|
||||||
|
|
||||||
if (DamagedTemplate != 0)
|
if (DamagedTemplate != 0)
|
||||||
yield return DamagedTemplate;
|
yield return Pair.New(DamagedTemplate, .5f);
|
||||||
|
|
||||||
if (DestroyedTemplate != 0)
|
if (DestroyedTemplate != 0)
|
||||||
yield return DestroyedTemplate;
|
yield return Pair.New(DestroyedTemplate, 0f);
|
||||||
|
|
||||||
if (DestroyedPlusNorthTemplate != 0)
|
if (DestroyedPlusNorthTemplate != 0)
|
||||||
yield return DestroyedPlusNorthTemplate;
|
yield return Pair.New(DestroyedPlusNorthTemplate, 0f);
|
||||||
|
|
||||||
if (DestroyedPlusSouthTemplate != 0)
|
if (DestroyedPlusSouthTemplate != 0)
|
||||||
yield return DestroyedPlusSouthTemplate;
|
yield return Pair.New(DestroyedPlusSouthTemplate, 0f);
|
||||||
|
|
||||||
if (DestroyedPlusBothTemplate != 0)
|
if (DestroyedPlusBothTemplate != 0)
|
||||||
yield return DestroyedPlusBothTemplate;
|
yield return Pair.New(DestroyedPlusBothTemplate, 0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -89,10 +89,6 @@ namespace OpenRA.Mods.RA
|
|||||||
public void Create(ushort template, Dictionary<int2, byte> subtiles)
|
public void Create(ushort template, Dictionary<int2, byte> subtiles)
|
||||||
{
|
{
|
||||||
currentTemplate = template;
|
currentTemplate = template;
|
||||||
if (template == Info.DamagedTemplate)
|
|
||||||
Health.HPFraction = .5f;
|
|
||||||
else if (template != Info.Template)
|
|
||||||
Health.HPFraction = 0f;
|
|
||||||
|
|
||||||
// Create a new cache to store the tile data
|
// Create a new cache to store the tile data
|
||||||
if (cachedTileset != self.World.Map.Tileset)
|
if (cachedTileset != self.World.Map.Tileset)
|
||||||
@@ -106,10 +102,10 @@ namespace OpenRA.Mods.RA
|
|||||||
// Cache templates and tiles for the different states
|
// Cache templates and tiles for the different states
|
||||||
foreach (var t in Info.Templates)
|
foreach (var t in Info.Templates)
|
||||||
{
|
{
|
||||||
Templates.Add(t,self.World.TileSet.Templates[t]);
|
Templates.Add(t.First,self.World.TileSet.Templates[t.First]);
|
||||||
TileSprites.Add(t,subtiles.ToDictionary(
|
TileSprites.Add(t.First,subtiles.ToDictionary(
|
||||||
a => a.Key,
|
a => a.Key,
|
||||||
a => sprites[new TileReference<ushort,byte>(t, (byte)a.Value)]));
|
a => sprites[new TileReference<ushort,byte>(t.First, (byte)a.Value)]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ namespace OpenRA.Mods.RA
|
|||||||
{
|
{
|
||||||
readonly BridgeLayerInfo Info;
|
readonly BridgeLayerInfo Info;
|
||||||
readonly World world;
|
readonly World world;
|
||||||
Dictionary<ushort, string> BridgeTypes = new Dictionary<ushort, string>();
|
Dictionary<ushort, Pair<string, float>> BridgeTypes = new Dictionary<ushort, Pair<string,float>>();
|
||||||
Bridge[,] Bridges;
|
Bridge[,] Bridges;
|
||||||
|
|
||||||
public BridgeLayer(Actor self, BridgeLayerInfo Info)
|
public BridgeLayer(Actor self, BridgeLayerInfo Info)
|
||||||
@@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA
|
|||||||
var bi = Rules.Info[bridge].Traits.Get<BridgeInfo>();
|
var bi = Rules.Info[bridge].Traits.Get<BridgeInfo>();
|
||||||
foreach (var template in bi.Templates)
|
foreach (var template in bi.Templates)
|
||||||
{
|
{
|
||||||
BridgeTypes.Add(template, bridge);
|
BridgeTypes.Add(template.First, Pair.New(bridge, template.Second));
|
||||||
Log.Write("debug", "Adding template {0} for bridge {1}", template, bridge);
|
Log.Write("debug", "Adding template {0} for bridge {1}", template, bridge);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -81,10 +81,11 @@ namespace OpenRA.Mods.RA
|
|||||||
var nj = j - image / template.Size.X;
|
var nj = j - image / template.Size.X;
|
||||||
|
|
||||||
// Create a new actor for this bridge and keep track of which subtiles this bridge includes
|
// Create a new actor for this bridge and keep track of which subtiles this bridge includes
|
||||||
var bridge = w.CreateActor(BridgeTypes[tile], new TypeDictionary
|
var bridge = w.CreateActor(BridgeTypes[tile].First, new TypeDictionary
|
||||||
{
|
{
|
||||||
new LocationInit( new int2(ni, nj) ),
|
new LocationInit( new int2(ni, nj) ),
|
||||||
new OwnerInit( w.WorldActor.Owner ),
|
new OwnerInit( w.WorldActor.Owner ),
|
||||||
|
new HealthInit( BridgeTypes[tile].Second ),
|
||||||
}).traits.Get<Bridge>();
|
}).traits.Get<Bridge>();
|
||||||
|
|
||||||
Dictionary<int2, byte> subTiles = new Dictionary<int2, byte>();
|
Dictionary<int2, byte> subTiles = new Dictionary<int2, byte>();
|
||||||
|
|||||||
Reference in New Issue
Block a user