Merge pull request #9982 from abcdefg30/chronodesc

Unhardcode and document things in Chronoshiftable
This commit is contained in:
Matthias Mailänder
2015-11-22 16:05:36 +01:00
3 changed files with 31 additions and 16 deletions

View File

@@ -61,9 +61,7 @@ namespace OpenRA.Mods.Common.Lint
var actorReference = new ActorReference(kv.Value.Value, kv.Value.ToDictionary()); var actorReference = new ActorReference(kv.Value.Value, kv.Value.ToDictionary());
var ownerInit = actorReference.InitDict.GetOrDefault<OwnerInit>(); var ownerInit = actorReference.InitDict.GetOrDefault<OwnerInit>();
if (ownerInit == null) if (ownerInit == null)
{
emitError("Actor {0} is not owned by any player.".F(kv.Key)); emitError("Actor {0} is not owned by any player.".F(kv.Key));
}
else else
{ {
var ownerName = ownerInit.PlayerName; var ownerName = ownerInit.PlayerName;

View File

@@ -91,7 +91,7 @@ namespace OpenRA.Mods.Common.Traits
}; };
foreach (var nd in self.TraitsImplementing<INotifyDamage>() foreach (var nd in self.TraitsImplementing<INotifyDamage>()
.Concat(self.Owner.PlayerActor.TraitsImplementing<INotifyDamage>())) .Concat(self.Owner.PlayerActor.TraitsImplementing<INotifyDamage>()))
nd.Damaged(self, ai); nd.Damaged(self, ai);
foreach (var nd in self.TraitsImplementing<INotifyDamageStateChanged>()) foreach (var nd in self.TraitsImplementing<INotifyDamageStateChanged>())
@@ -99,7 +99,7 @@ namespace OpenRA.Mods.Common.Traits
if (Info.NotifyAppliedDamage && repairer != null && repairer.IsInWorld && !repairer.IsDead) if (Info.NotifyAppliedDamage && repairer != null && repairer.IsInWorld && !repairer.IsDead)
foreach (var nd in repairer.TraitsImplementing<INotifyAppliedDamage>() foreach (var nd in repairer.TraitsImplementing<INotifyAppliedDamage>()
.Concat(repairer.Owner.PlayerActor.TraitsImplementing<INotifyAppliedDamage>())) .Concat(repairer.Owner.PlayerActor.TraitsImplementing<INotifyAppliedDamage>()))
nd.AppliedDamage(repairer, self, ai); nd.AppliedDamage(repairer, self, ai);
} }
@@ -133,7 +133,7 @@ namespace OpenRA.Mods.Common.Traits
}; };
foreach (var nd in self.TraitsImplementing<INotifyDamage>() foreach (var nd in self.TraitsImplementing<INotifyDamage>()
.Concat(self.Owner.PlayerActor.TraitsImplementing<INotifyDamage>())) .Concat(self.Owner.PlayerActor.TraitsImplementing<INotifyDamage>()))
nd.Damaged(self, ai); nd.Damaged(self, ai);
if (DamageState != oldState) if (DamageState != oldState)
@@ -142,7 +142,7 @@ namespace OpenRA.Mods.Common.Traits
if (Info.NotifyAppliedDamage && attacker != null && attacker.IsInWorld && !attacker.IsDead) if (Info.NotifyAppliedDamage && attacker != null && attacker.IsInWorld && !attacker.IsDead)
foreach (var nd in attacker.TraitsImplementing<INotifyAppliedDamage>() foreach (var nd in attacker.TraitsImplementing<INotifyAppliedDamage>()
.Concat(attacker.Owner.PlayerActor.TraitsImplementing<INotifyAppliedDamage>())) .Concat(attacker.Owner.PlayerActor.TraitsImplementing<INotifyAppliedDamage>()))
nd.AppliedDamage(attacker, self, ai); nd.AppliedDamage(attacker, self, ai);
if (hp == 0) if (hp == 0)

View File

@@ -19,21 +19,29 @@ namespace OpenRA.Mods.RA.Traits
[Desc("Can be teleported via Chronoshift power.")] [Desc("Can be teleported via Chronoshift power.")]
public class ChronoshiftableInfo : ITraitInfo public class ChronoshiftableInfo : ITraitInfo
{ {
[Desc("Should the actor die instead of being teleported?")]
public readonly bool ExplodeInstead = false; public readonly bool ExplodeInstead = false;
public readonly string ChronoshiftSound = "chrono2.aud"; public readonly string ChronoshiftSound = "chrono2.aud";
[Desc("Should the actor return to its location after the chronoshift weared out?.")]
public readonly bool ReturnToOrigin = true;
[Desc("The color the bar of the 'return-to-origin' logic has.")]
public readonly Color TimeBarColor = Color.White;
public object Create(ActorInitializer init) { return new Chronoshiftable(init, this); } public object Create(ActorInitializer init) { return new Chronoshiftable(init, this); }
} }
public class Chronoshiftable : ITick, ISync, ISelectionBar, IDeathActorInitModifier public class Chronoshiftable : ITick, ISync, ISelectionBar, IDeathActorInitModifier, INotifyCreated
{ {
readonly ChronoshiftableInfo info; readonly ChronoshiftableInfo info;
readonly Actor self; readonly Actor self;
Actor chronosphere; Actor chronosphere;
bool killCargo; bool killCargo;
int duration; int duration;
IPositionable iPositionable;
// Return-to-sender logic // Return-to-origin logic
[Sync] public CPos Origin; [Sync] public CPos Origin;
[Sync] public int ReturnTicks = 0; [Sync] public int ReturnTicks = 0;
@@ -54,7 +62,7 @@ namespace OpenRA.Mods.RA.Traits
public void Tick(Actor self) public void Tick(Actor self)
{ {
if (ReturnTicks <= 0) if (!info.ReturnToOrigin || ReturnTicks <= 0)
return; return;
// Return to original location // Return to original location
@@ -65,28 +73,33 @@ namespace OpenRA.Mods.RA.Traits
} }
} }
public void Created(Actor self)
{
iPositionable = self.TraitOrDefault<IPositionable>();
}
// Can't be used in synced code, except with ignoreVis. // Can't be used in synced code, except with ignoreVis.
public virtual bool CanChronoshiftTo(Actor self, CPos targetLocation) public virtual bool CanChronoshiftTo(Actor self, CPos targetLocation)
{ {
// TODO: Allow enemy units to be chronoshifted into bad terrain to kill them // TODO: Allow enemy units to be chronoshifted into bad terrain to kill them
return self.Info.HasTraitInfo<IPositionableInfo>() && self.Trait<IPositionable>().CanEnterCell(targetLocation); return iPositionable != null && iPositionable.CanEnterCell(targetLocation);
} }
public virtual bool Teleport(Actor self, CPos targetLocation, int duration, bool killCargo, Actor chronosphere) public virtual bool Teleport(Actor self, CPos targetLocation, int duration, bool killCargo, Actor chronosphere)
{ {
// some things appear chronoshiftable, but instead they just die. // Some things appear chronoshiftable, but instead they just die.
if (info.ExplodeInstead) if (info.ExplodeInstead)
{ {
self.World.AddFrameEndTask(w => self.World.AddFrameEndTask(w =>
{ {
// damage is inflicted by the chronosphere // Damage is inflicted by the chronosphere
if (!self.Disposed) if (!self.Disposed)
self.InflictDamage(chronosphere, int.MaxValue, null); self.InflictDamage(chronosphere, int.MaxValue, null);
}); });
return true; return true;
} }
// Set up return-to-sender info // Set up return-to-origin info
Origin = self.Location; Origin = self.Location;
ReturnTicks = duration; ReturnTicks = duration;
this.duration = duration; this.duration = duration;
@@ -103,19 +116,23 @@ namespace OpenRA.Mods.RA.Traits
// Show the remaining time as a bar // Show the remaining time as a bar
public float GetValue() public float GetValue()
{ {
// otherwise an empty bar is rendered all the time if (!info.ReturnToOrigin)
return 0f;
// Otherwise an empty bar is rendered all the time
if (ReturnTicks == 0 || !self.Owner.IsAlliedWith(self.World.RenderPlayer)) if (ReturnTicks == 0 || !self.Owner.IsAlliedWith(self.World.RenderPlayer))
return 0f; return 0f;
return (float)ReturnTicks / duration; return (float)ReturnTicks / duration;
} }
public Color GetColor() { return Color.White; } public Color GetColor() { return info.TimeBarColor; }
public void ModifyDeathActorInit(Actor self, TypeDictionary init) public void ModifyDeathActorInit(Actor self, TypeDictionary init)
{ {
if (ReturnTicks <= 0) if (!info.ReturnToOrigin || ReturnTicks <= 0)
return; return;
init.Add(new ChronoshiftOriginInit(Origin)); init.Add(new ChronoshiftOriginInit(Origin));
init.Add(new ChronoshiftReturnInit(ReturnTicks)); init.Add(new ChronoshiftReturnInit(ReturnTicks));
if (chronosphere != self) if (chronosphere != self)