Merge pull request #8727 from atlimit8/MultipleTargetableTraits

TargetTypes by Upgrade and Replacement of Targetable* by Targetable and ITargetablePositions
This commit is contained in:
Matthias Mailänder
2015-09-03 07:41:34 +02:00
52 changed files with 403 additions and 300 deletions

View File

@@ -125,8 +125,8 @@ namespace OpenRA.GameRules
/// <summary>Checks if the weapon is valid against (can target) the actor.</summary> /// <summary>Checks if the weapon is valid against (can target) the actor.</summary>
public bool IsValidAgainst(Actor victim, Actor firedBy) public bool IsValidAgainst(Actor victim, Actor firedBy)
{ {
var targetable = victim.TraitOrDefault<ITargetable>(); var targetable = victim.TraitsImplementing<ITargetable>().Where(Exts.IsTraitEnabled);
if (targetable == null || !IsValidTarget(targetable.TargetTypes)) if (!IsValidTarget(targetable.SelectMany(t => t.TargetTypes)))
return false; return false;
if (!Warheads.Any(w => w.IsValidAgainst(victim, firedBy))) if (!Warheads.Any(w => w.IsValidAgainst(victim, firedBy)))
@@ -138,8 +138,7 @@ namespace OpenRA.GameRules
/// <summary>Checks if the weapon is valid against (can target) the frozen actor.</summary> /// <summary>Checks if the weapon is valid against (can target) the frozen actor.</summary>
public bool IsValidAgainst(FrozenActor victim, Actor firedBy) public bool IsValidAgainst(FrozenActor victim, Actor firedBy)
{ {
var targetable = victim.Info.Traits.GetOrDefault<ITargetableInfo>(); if (!IsValidTarget(victim.TargetTypes))
if (targetable == null || !IsValidTarget(targetable.GetTargetTypes()))
return false; return false;
if (!Warheads.Any(w => w.IsValidAgainst(victim, firedBy))) if (!Warheads.Any(w => w.IsValidAgainst(victim, firedBy)))

View File

@@ -27,6 +27,7 @@ namespace OpenRA.Traits
public readonly PPos[] Footprint; public readonly PPos[] Footprint;
public readonly WPos CenterPosition; public readonly WPos CenterPosition;
public readonly Rectangle Bounds; public readonly Rectangle Bounds;
public readonly string[] TargetTypes;
readonly IRemoveFrozenActor[] removeFrozenActors; readonly IRemoveFrozenActor[] removeFrozenActors;
readonly Actor actor; readonly Actor actor;
readonly Shroud shroud; readonly Shroud shroud;
@@ -56,6 +57,7 @@ namespace OpenRA.Traits
CenterPosition = self.CenterPosition; CenterPosition = self.CenterPosition;
Bounds = self.Bounds; Bounds = self.Bounds;
TargetTypes = self.TraitsImplementing<ITargetable>().Where(Exts.IsTraitEnabled).SelectMany(t => t.TargetTypes).Distinct().ToArray();
UpdateVisibility(); UpdateVisibility();
} }

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Traits
TargetType type; TargetType type;
Actor actor; Actor actor;
ITargetable targetable; IEnumerable<ITargetable> targetable;
FrozenActor frozen; FrozenActor frozen;
WPos pos; WPos pos;
int generation; int generation;
@@ -48,7 +48,7 @@ namespace OpenRA.Traits
return new Target return new Target
{ {
actor = a, actor = a,
targetable = a.TraitOrDefault<ITargetable>(), targetable = a.TraitsImplementing<ITargetable>(),
type = TargetType.Actor, type = TargetType.Actor,
generation = a.Generation, generation = a.Generation,
}; };
@@ -83,15 +83,18 @@ namespace OpenRA.Traits
if (targeter == null || Type == TargetType.Invalid) if (targeter == null || Type == TargetType.Invalid)
return false; return false;
if (targetable != null && !targetable.TargetableBy(actor, targeter)) var targeted = this.actor;
if (targeted != null && !targetable.Any(t => t.IsTraitEnabled() && t.TargetableBy(targeted, targeter)))
return false; return false;
return true; return true;
} }
// Currently all or nothing.
// TODO: either replace based on target type or put in singleton trait
public bool RequiresForceFire public bool RequiresForceFire
{ {
get { return targetable != null && targetable.RequiresForceFire; } get { return targetable != null && targetable.Any(Exts.IsTraitEnabled) && targetable.Where(Exts.IsTraitEnabled).All(t => t.RequiresForceFire); }
} }
// Representative position - see Positions for the full set of targetable positions. // Representative position - see Positions for the full set of targetable positions.
@@ -123,12 +126,19 @@ namespace OpenRA.Traits
switch (Type) switch (Type)
{ {
case TargetType.Actor: case TargetType.Actor:
var targetable = actor.TraitOrDefault<ITargetable>(); var targetable = actor.TraitsImplementing<ITargetable>().Where(Exts.IsTraitEnabled);
if (targetable == null) if (!targetable.Any())
return new[] { actor.CenterPosition }; return new[] { actor.CenterPosition };
var positions = targetable.TargetablePositions(actor); var targetablePositions = actor.TraitOrDefault<ITargetablePositions>();
return positions.Any() ? positions : new[] { actor.CenterPosition }; if (targetablePositions != null)
{
var positions = targetablePositions.TargetablePositions(actor);
if (positions.Any())
return positions;
}
return new[] { actor.CenterPosition };
case TargetType.FrozenActor: case TargetType.FrozenActor:
return new[] { frozen.CenterPosition }; return new[] { frozen.CenterPosition };
case TargetType.Terrain: case TargetType.Terrain:

View File

@@ -315,12 +315,17 @@ namespace OpenRA.Traits
public interface ITargetable public interface ITargetable
{ {
// Check IsTraitEnabled or !IsTraitDisabled first
string[] TargetTypes { get; } string[] TargetTypes { get; }
IEnumerable<WPos> TargetablePositions(Actor self);
bool TargetableBy(Actor self, Actor byActor); bool TargetableBy(Actor self, Actor byActor);
bool RequiresForceFire { get; } bool RequiresForceFire { get; }
} }
public interface ITargetablePositions
{
IEnumerable<WPos> TargetablePositions(Actor self);
}
public interface INotifyStanceChanged public interface INotifyStanceChanged
{ {
void StanceChanged(Actor self, Player a, Player b, void StanceChanged(Actor self, Player a, Player b,

View File

@@ -63,13 +63,13 @@ namespace OpenRA.Mods.Common.AI
if (!a.HasTrait<AttackBase>()) if (!a.HasTrait<AttackBase>())
return false; return false;
var targetable = target.TraitOrDefault<ITargetable>(); var targetTypes = target.TraitsImplementing<ITargetable>().Where(Exts.IsTraitEnabled).SelectMany(t => t.TargetTypes);
if (targetable == null) if (!targetTypes.Any())
return false; return false;
var arms = a.TraitsImplementing<Armament>(); var arms = a.TraitsImplementing<Armament>();
foreach (var arm in arms) foreach (var arm in arms)
if (arm.Weapon.IsValidTarget(targetable.TargetTypes)) if (arm.Weapon.IsValidTarget(targetTypes))
return true; return true;
return false; return false;

View File

@@ -125,14 +125,11 @@ namespace OpenRA.Mods.Common.AI
if (a == null) if (a == null)
return 0; return 0;
var targetable = a.TraitOrDefault<ITargetable>(); var targetable = a.TraitsImplementing<ITargetable>().Where(Exts.IsTraitEnabled);
if (targetable == null) if (!targetable.Any(t => t.TargetableBy(a, firedBy.PlayerActor)))
return 0; return 0;
if (!targetable.TargetableBy(a, firedBy.PlayerActor)) if (Types.Intersect(targetable.SelectMany(t => t.TargetTypes)).Any())
return 0;
if (Types.Intersect(targetable.TargetTypes).Any())
{ {
switch (TargetMetric) switch (TargetMetric)
{ {

View File

@@ -29,8 +29,7 @@ namespace OpenRA.Mods.Common.Activities
bool IsTargetable(Actor self, Actor viewer) bool IsTargetable(Actor self, Actor viewer)
{ {
var targetable = self.TraitOrDefault<ITargetable>(); return self.TraitsImplementing<ITargetable>().Any(t => t.IsTraitEnabled() && t.TargetableBy(self, viewer));
return targetable != null && targetable.TargetableBy(self, viewer);
} }
public override Activity Tick(Actor self) public override Activity Tick(Actor self)

View File

@@ -256,7 +256,6 @@
<Compile Include="Traits\Air\Helicopter.cs" /> <Compile Include="Traits\Air\Helicopter.cs" />
<Compile Include="Traits\Air\Plane.cs" /> <Compile Include="Traits\Air\Plane.cs" />
<Compile Include="Traits\Air\ReturnOnIdle.cs" /> <Compile Include="Traits\Air\ReturnOnIdle.cs" />
<Compile Include="Traits\Air\TargetableAircraft.cs" />
<Compile Include="Traits\AppearsOnRadar.cs" /> <Compile Include="Traits\AppearsOnRadar.cs" />
<Compile Include="Traits\Armament.cs" /> <Compile Include="Traits\Armament.cs" />
<Compile Include="Traits\Armor.cs" /> <Compile Include="Traits\Armor.cs" />
@@ -293,7 +292,6 @@
<Compile Include="Traits\Buildings\RepairableBuilding.cs" /> <Compile Include="Traits\Buildings\RepairableBuilding.cs" />
<Compile Include="Traits\Buildings\RepairsUnits.cs" /> <Compile Include="Traits\Buildings\RepairsUnits.cs" />
<Compile Include="Traits\Buildings\Reservable.cs" /> <Compile Include="Traits\Buildings\Reservable.cs" />
<Compile Include="Traits\Buildings\TargetableBuilding.cs" />
<Compile Include="Traits\Burns.cs" /> <Compile Include="Traits\Burns.cs" />
<Compile Include="Traits\C4Demolition.cs" /> <Compile Include="Traits\C4Demolition.cs" />
<Compile Include="Traits\VeteranProductionIconOverlay.cs" /> <Compile Include="Traits\VeteranProductionIconOverlay.cs" />
@@ -476,7 +474,7 @@
<Compile Include="Traits\SupportPowers\SupportPower.cs" /> <Compile Include="Traits\SupportPowers\SupportPower.cs" />
<Compile Include="Traits\SupportPowers\SupportPowerManager.cs" /> <Compile Include="Traits\SupportPowers\SupportPowerManager.cs" />
<Compile Include="Traits\SupportPowers\SpawnActorPower.cs" /> <Compile Include="Traits\SupportPowers\SpawnActorPower.cs" />
<Compile Include="Traits\TargetableUnit.cs" /> <Compile Include="Traits\Targetable.cs" />
<Compile Include="Traits\ThrowsParticle.cs" /> <Compile Include="Traits\ThrowsParticle.cs" />
<Compile Include="Traits\Tooltip.cs" /> <Compile Include="Traits\Tooltip.cs" />
<Compile Include="Traits\TransformOnCapture.cs" /> <Compile Include="Traits\TransformOnCapture.cs" />

View File

@@ -77,12 +77,12 @@ namespace OpenRA.Mods.Common.Orders
public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor)
{ {
return target.TraitsImplementing<ITargetable>().Any(t => t.TargetTypes.Intersect(targetTypes).Any()); return target.TraitsImplementing<ITargetable>().Any(t => t.IsTraitEnabled() && t.TargetTypes.Intersect(targetTypes).Any());
} }
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor)
{ {
return target.Info.Traits.WithInterface<ITargetableInfo>().Any(t => t.GetTargetTypes().Intersect(targetTypes).Any()); return target.TargetTypes.Intersect(targetTypes).Any();
} }
} }
} }

View File

@@ -35,6 +35,9 @@ namespace OpenRA.Mods.Common.Traits
public readonly int InitialFacing = 0; public readonly int InitialFacing = 0;
public readonly int ROT = 255; public readonly int ROT = 255;
public readonly int Speed = 1; public readonly int Speed = 1;
[Desc("Minimum altitude where this aircraft is considered airborne")]
public readonly int MinAirborneAltitude = 1;
public readonly string[] LandableTerrainTypes = { }; public readonly string[] LandableTerrainTypes = { };
[Desc("Can the actor be ordered to move in to shroud?")] [Desc("Can the actor be ordered to move in to shroud?")]
@@ -46,22 +49,52 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] public readonly string Voice = "Action"; [VoiceReference] public readonly string Voice = "Action";
[UpgradeGrantedReference]
[Desc("The upgrades to grant to self while airborne.")]
public readonly string[] AirborneUpgrades = { };
public IReadOnlyDictionary<CPos, SubCell> OccupiedCells(ActorInfo info, CPos location, SubCell subCell = SubCell.Any) { return new ReadOnlyDictionary<CPos, SubCell>(); } public IReadOnlyDictionary<CPos, SubCell> OccupiedCells(ActorInfo info, CPos location, SubCell subCell = SubCell.Any) { return new ReadOnlyDictionary<CPos, SubCell>(); }
bool IOccupySpaceInfo.SharesCell { get { return false; } } bool IOccupySpaceInfo.SharesCell { get { return false; } }
} }
public class Aircraft : IFacing, IPositionable, ISync, IIssueOrder, IOrderVoice, INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyActorDisposing public class Aircraft : IFacing, IPositionable, ISync, IIssueOrder, IOrderVoice, INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyCreated, INotifyActorDisposing
{ {
static readonly Pair<CPos, SubCell>[] NoCells = { }; static readonly Pair<CPos, SubCell>[] NoCells = { };
readonly AircraftInfo info; readonly AircraftInfo info;
readonly Actor self; readonly Actor self;
UpgradeManager um;
[Sync] public int Facing { get; set; } [Sync] public int Facing { get; set; }
[Sync] public WPos CenterPosition { get; private set; } [Sync] public WPos CenterPosition { get; private set; }
public CPos TopLeft { get { return self.World.Map.CellContaining(CenterPosition); } } public CPos TopLeft { get { return self.World.Map.CellContaining(CenterPosition); } }
public IDisposable Reservation; public IDisposable Reservation;
public int ROT { get { return info.ROT; } } public int ROT { get { return info.ROT; } }
bool IsAirborne
{
get
{
return airborne;
}
set
{
if (airborne == value)
return;
airborne = value;
if (um != null)
{
if (airborne)
foreach (var u in info.AirborneUpgrades)
um.GrantUpgrade(self, u, this);
else
foreach (var u in info.AirborneUpgrades)
um.RevokeUpgrade(self, u, this);
}
}
}
bool airborne = false;
public Aircraft(ActorInitializer init, AircraftInfo info) public Aircraft(ActorInitializer init, AircraftInfo info)
{ {
@@ -77,6 +110,8 @@ namespace OpenRA.Mods.Common.Traits
Facing = init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : info.InitialFacing; Facing = init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : info.InitialFacing;
} }
public void Created(Actor self) { um = self.TraitOrDefault<UpgradeManager>(); }
bool firstTick = true; bool firstTick = true;
public virtual void Tick(Actor self) public virtual void Tick(Actor self)
{ {
@@ -197,6 +232,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
self.World.ScreenMap.Update(self); self.World.ScreenMap.Update(self);
self.World.ActorMap.UpdatePosition(self, this); self.World.ActorMap.UpdatePosition(self, this);
IsAirborne = self.World.Map.DistanceAboveTerrain(CenterPosition).Length >= info.MinAirborneAltitude;
} }
} }
@@ -213,6 +249,8 @@ namespace OpenRA.Mods.Common.Traits
self.World.ActorMap.AddInfluence(self, this); self.World.ActorMap.AddInfluence(self, this);
self.World.ActorMap.AddPosition(self, this); self.World.ActorMap.AddPosition(self, this);
self.World.ScreenMap.Add(self); self.World.ScreenMap.Add(self);
if (self.World.Map.DistanceAboveTerrain(CenterPosition).Length >= info.MinAirborneAltitude)
IsAirborne = true;
} }
public void RemovedFromWorld(Actor self) public void RemovedFromWorld(Actor self)
@@ -221,6 +259,7 @@ namespace OpenRA.Mods.Common.Traits
self.World.ActorMap.RemoveInfluence(self, this); self.World.ActorMap.RemoveInfluence(self, this);
self.World.ActorMap.RemovePosition(self, this); self.World.ActorMap.RemovePosition(self, this);
self.World.ScreenMap.Remove(self); self.World.ScreenMap.Remove(self);
IsAirborne = false;
} }
public bool AircraftCanEnter(Actor a) public bool AircraftCanEnter(Actor a)

View File

@@ -1,43 +0,0 @@
#region Copyright & License Information
/*
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System.Collections.Generic;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
public class TargetableAircraftInfo : TargetableUnitInfo
{
public readonly string[] GroundedTargetTypes = { };
public override object Create(ActorInitializer init) { return new TargetableAircraft(init.Self, this); }
}
public class TargetableAircraft : TargetableUnit
{
readonly TargetableAircraftInfo info;
readonly Actor self;
public TargetableAircraft(Actor self, TargetableAircraftInfo info)
: base(self, info)
{
this.info = info;
this.self = self;
}
public override string[] TargetTypes
{
get
{
return IsTraitDisabled ? None
: (self.CenterPosition.Z > 0 ? info.TargetTypes : info.GroundedTargetTypes);
}
}
}
}

View File

@@ -116,7 +116,7 @@ namespace OpenRA.Mods.Common.Traits
bool IOccupySpaceInfo.SharesCell { get { return false; } } bool IOccupySpaceInfo.SharesCell { get { return false; } }
} }
public class Building : IOccupySpace, INotifySold, INotifyTransform, ISync, INotifyCreated, INotifyAddedToWorld, INotifyRemovedFromWorld public class Building : IOccupySpace, INotifySold, INotifyTransform, ISync, INotifyCreated, INotifyAddedToWorld, INotifyRemovedFromWorld, ITargetablePositions
{ {
public readonly BuildingInfo Info; public readonly BuildingInfo Info;
public bool BuildComplete { get; private set; } public bool BuildComplete { get; private set; }
@@ -157,6 +157,11 @@ namespace OpenRA.Mods.Common.Traits
Pair<CPos, SubCell>[] occupiedCells; Pair<CPos, SubCell>[] occupiedCells;
public IEnumerable<Pair<CPos, SubCell>> OccupiedCells() { return occupiedCells; } public IEnumerable<Pair<CPos, SubCell>> OccupiedCells() { return occupiedCells; }
public IEnumerable<WPos> TargetablePositions(Actor self)
{
return OccupiedCells().Select(c => self.World.Map.CenterOfCell(c.First));
}
public void Created(Actor self) public void Created(Actor self)
{ {
if (SkipMakeAnimation || !self.HasTrait<WithMakeAnimation>()) if (SkipMakeAnimation || !self.HasTrait<WithMakeAnimation>())

View File

@@ -1,49 +0,0 @@
#region Copyright & License Information
/*
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System.Collections.Generic;
using System.Linq;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
public class TargetableBuildingInfo : ITraitInfo, ITargetableInfo, Requires<BuildingInfo>
{
[FieldLoader.Require]
public readonly string[] TargetTypes = { };
public string[] GetTargetTypes() { return TargetTypes; }
public bool RequiresForceFire = false;
public object Create(ActorInitializer init) { return new TargetableBuilding(init.Self, this); }
}
public class TargetableBuilding : ITargetable
{
readonly TargetableBuildingInfo info;
readonly Building building;
public TargetableBuilding(Actor self, TargetableBuildingInfo info)
{
this.info = info;
building = self.Trait<Building>();
}
public string[] TargetTypes { get { return info.TargetTypes; } }
public bool TargetableBy(Actor self, Actor byActor) { return true; }
public IEnumerable<WPos> TargetablePositions(Actor self)
{
return building.OccupiedCells().Select(c => self.World.Map.CenterOfCell(c.First));
}
public bool RequiresForceFire { get { return info.RequiresForceFire; } }
}
}

View File

@@ -38,13 +38,18 @@ namespace OpenRA.Mods.Common.Traits
public readonly string[] CloakTypes = { "Cloak" }; public readonly string[] CloakTypes = { "Cloak" };
[UpgradeGrantedReference]
[Desc("The upgrades to grant to self while cloaked.")]
public readonly string[] WhileCloakedUpgrades = { };
public override object Create(ActorInitializer init) { return new Cloak(init.Self, this); } public override object Create(ActorInitializer init) { return new Cloak(init.Self, this); }
} }
public class Cloak : UpgradableTrait<CloakInfo>, IRenderModifier, INotifyDamageStateChanged, INotifyAttack, ITick, IVisibilityModifier, IRadarColorModifier public class Cloak : UpgradableTrait<CloakInfo>, IRenderModifier, INotifyDamageStateChanged, INotifyAttack, ITick, IVisibilityModifier, IRadarColorModifier, INotifyCreated
{ {
[Sync] int remainingTime; [Sync] int remainingTime;
[Sync] bool damageDisabled; [Sync] bool damageDisabled;
UpgradeManager upgradeManager;
Actor self; Actor self;
CPos? lastPos; CPos? lastPos;
@@ -57,6 +62,17 @@ namespace OpenRA.Mods.Common.Traits
remainingTime = info.InitialDelay; remainingTime = info.InitialDelay;
} }
public void Created(Actor self)
{
upgradeManager = self.TraitOrDefault<UpgradeManager>();
if (remainingTime == 0)
{
if (upgradeManager != null)
foreach (var u in Info.WhileCloakedUpgrades)
upgradeManager.GrantUpgrade(self, u, this);
}
}
protected override void UpgradeDisabled(Actor self) protected override void UpgradeDisabled(Actor self)
{ {
Uncloak(); Uncloak();
@@ -68,7 +84,12 @@ namespace OpenRA.Mods.Common.Traits
public void Uncloak(int time) public void Uncloak(int time)
{ {
if (Cloaked) if (Cloaked)
{
Sound.Play(Info.UncloakSound, self.CenterPosition); Sound.Play(Info.UncloakSound, self.CenterPosition);
if (upgradeManager != null)
foreach (var u in Info.WhileCloakedUpgrades)
upgradeManager.RevokeUpgrade(self, u, this);
}
remainingTime = Math.Max(remainingTime, time); remainingTime = Math.Max(remainingTime, time);
} }
@@ -106,7 +127,12 @@ namespace OpenRA.Mods.Common.Traits
return; return;
if (remainingTime > 0 && !IsTraitDisabled && !damageDisabled && --remainingTime <= 0) if (remainingTime > 0 && !IsTraitDisabled && !damageDisabled && --remainingTime <= 0)
{
Sound.Play(Info.CloakSound, self.CenterPosition); Sound.Play(Info.CloakSound, self.CenterPosition);
if (upgradeManager != null)
foreach (var u in Info.WhileCloakedUpgrades)
upgradeManager.GrantUpgrade(self, u, this);
}
if (self.IsDisabled()) if (self.IsDisabled())
Uncloak(); Uncloak();

View File

@@ -57,8 +57,8 @@ namespace OpenRA.Mods.Common.Traits
if (info.ValidFactions.Any() && !info.ValidFactions.Contains(collector.Owner.Faction.InternalName)) if (info.ValidFactions.Any() && !info.ValidFactions.Contains(collector.Owner.Faction.InternalName))
return false; return false;
var targetable = collector.Info.Traits.GetOrDefault<ITargetableInfo>(); var targetable = collector.TraitsImplementing<ITargetable>();
if (targetable == null || !info.ValidTargets.Intersect(targetable.GetTargetTypes()).Any()) if (!info.ValidTargets.Intersect(targetable.SelectMany(t => t.TargetTypes)).Any())
return false; return false;
var positionable = collector.TraitOrDefault<IPositionable>(); var positionable = collector.TraitOrDefault<IPositionable>();

View File

@@ -14,7 +14,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits namespace OpenRA.Mods.Common.Traits
{ {
[Desc("Actor can be targeted.")] [Desc("Actor can be targeted.")]
public class TargetableUnitInfo : UpgradableTraitInfo, ITargetableInfo public class TargetableInfo : UpgradableTraitInfo, ITargetableInfo
{ {
[Desc("Target type. Used for filtering (in)valid targets.")] [Desc("Target type. Used for filtering (in)valid targets.")]
public readonly string[] TargetTypes = { }; public readonly string[] TargetTypes = { };
@@ -22,15 +22,15 @@ namespace OpenRA.Mods.Common.Traits
public bool RequiresForceFire = false; public bool RequiresForceFire = false;
public override object Create(ActorInitializer init) { return new TargetableUnit(init.Self, this); } public override object Create(ActorInitializer init) { return new Targetable(init.Self, this); }
} }
public class TargetableUnit : UpgradableTrait<TargetableUnitInfo>, ITargetable public class Targetable : UpgradableTrait<TargetableInfo>, ITargetable
{ {
protected static readonly string[] None = new string[] { }; protected static readonly string[] None = new string[] { };
protected Cloak cloak; protected Cloak cloak;
public TargetableUnit(Actor self, TargetableUnitInfo info) public Targetable(Actor self, TargetableInfo info)
: base(info) : base(info)
{ {
cloak = self.TraitOrDefault<Cloak>(); cloak = self.TraitOrDefault<Cloak>();
@@ -46,12 +46,7 @@ namespace OpenRA.Mods.Common.Traits
return cloak.IsVisible(self, viewer.Owner); return cloak.IsVisible(self, viewer.Owner);
} }
public virtual string[] TargetTypes { get { return IsTraitDisabled ? None : Info.TargetTypes; } } public virtual string[] TargetTypes { get { return Info.TargetTypes; } }
public virtual IEnumerable<WPos> TargetablePositions(Actor self)
{
yield return self.CenterPosition;
}
public bool RequiresForceFire { get { return Info.RequiresForceFire; } } public bool RequiresForceFire { get { return Info.RequiresForceFire; } }
} }

View File

@@ -1965,6 +1965,92 @@ namespace OpenRA.Mods.Common.UtilityCommands
} }
} }
if (engineVersion < 20150902)
{
if (depth == 1)
{
if (node.Key == "TargetableUnit" || node.Key == "TargetableBuilding")
node.Key = "Targetable";
else if (node.Key == "-TargetableUnit" || node.Key == "-TargetableBuilding")
node.Key = "-Targetable";
}
else if (depth == 0)
{
// Split TargetableSubmarine into two Targetable traits
var targetableSubmarine = node.Value.Nodes.FirstOrDefault(n => n.Key == "TargetableSubmarine");
if (targetableSubmarine != null)
{
node.Value.Nodes.RemoveAll(n => n.Key == "-Targetable");
targetableSubmarine.Key = "Targetable";
targetableSubmarine.Value.Nodes.Add(new MiniYamlNode("UpgradeTypes", "underwater"));
targetableSubmarine.Value.Nodes.Add(new MiniYamlNode("UpgradeMaxEnabledLevel", "0"));
var cloakedTargetTypes = targetableSubmarine.Value.Nodes.FirstOrDefault(n => n.Key == "CloakedTargetTypes");
if (cloakedTargetTypes != null)
{
targetableSubmarine.Value.Nodes.Remove(cloakedTargetTypes);
cloakedTargetTypes.Key = "TargetTypes";
}
else
cloakedTargetTypes = new MiniYamlNode("TargetTypes", "");
node.Value.Nodes.Add(new MiniYamlNode("Targetable@UNDERWATER", "", new List<MiniYamlNode> {
cloakedTargetTypes,
new MiniYamlNode("UpgradeTypes", "underwater"),
new MiniYamlNode("UpgradeMinEnabledLevel", "1")
}));
}
// Add `WhileCloakedUpgrades: underwater` to Cloak trait if `CloakTypes: Underwater`
var cloak = node.Value.Nodes.FirstOrDefault(n => (n.Key == "Cloak" || n.Key.StartsWith("Cloak@"))
&& n.Value.Nodes.Any(p => p.Key == "CloakTypes" && p.Value.Value == "Underwater"));
if (cloak != null)
cloak.Value.Nodes.Add(new MiniYamlNode("WhileCloakedUpgrades", "underwater"));
// Remove split traits if TargetableSubmarine was removed
var untargetableSubmarine = node.Value.Nodes.FirstOrDefault(n => n.Key == "-TargetableSubmarine");
if (untargetableSubmarine != null)
{
untargetableSubmarine.Key = "-Targetable";
node.Value.Nodes.Add(new MiniYamlNode("-Targetable@UNDERWATER", ""));
}
// Split TargetableAircraft into two Targetable traits
var targetableAircraft = node.Value.Nodes.FirstOrDefault(n => n.Key == "TargetableAircraft");
if (targetableAircraft != null)
{
node.Value.Nodes.RemoveAll(n => n.Key == "-Targetable");
targetableAircraft.Key = "Targetable@AIRBORNE";
targetableAircraft.Value.Nodes.Add(new MiniYamlNode("UpgradeTypes", "airborne"));
targetableAircraft.Value.Nodes.Add(new MiniYamlNode("UpgradeMinEnabledLevel", "1"));
var groundTargetTypes = targetableAircraft.Value.Nodes.FirstOrDefault(n => n.Key == "GroundedTargetTypes");
if (groundTargetTypes != null)
{
targetableAircraft.Value.Nodes.Remove(groundTargetTypes);
groundTargetTypes.Key = "TargetTypes";
}
else
groundTargetTypes = new MiniYamlNode("TargetTypes", "");
node.Value.Nodes.Add(new MiniYamlNode("Targetable@GROUND", "", new List<MiniYamlNode> {
groundTargetTypes,
new MiniYamlNode("UpgradeTypes", "airborne"),
new MiniYamlNode("UpgradeMaxEnabledLevel", "0")
}));
}
// Add `AirborneUpgrades: airborne` to Plane and Helicopter
var aircraft = node.Value.Nodes.FirstOrDefault(n => n.Key == "Plane" || n.Key == "Helicopter");
if (aircraft != null)
aircraft.Value.Nodes.Add(new MiniYamlNode("AirborneUpgrades", "airborne"));
// Remove split traits if TargetableAircraft was removed
var untargetableAircraft = node.Value.Nodes.FirstOrDefault(n => n.Key == "-TargetableAircraft");
if (untargetableAircraft != null)
{
untargetableAircraft.Key = "-TargetableUnit@GROUND";
node.Value.Nodes.Add(new MiniYamlNode("-TargetableUnit@AIRBORNE", ""));
}
}
}
UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1); UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
} }
} }

View File

@@ -9,6 +9,7 @@
#endregion #endregion
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.Common.Warheads namespace OpenRA.Mods.Common.Warheads
@@ -58,8 +59,8 @@ namespace OpenRA.Mods.Common.Warheads
return false; return false;
// A target type is valid if it is in the valid targets list, and not in the invalid targets list. // A target type is valid if it is in the valid targets list, and not in the invalid targets list.
var targetable = victim.TraitOrDefault<ITargetable>(); var targetable = victim.TraitsImplementing<ITargetable>().Where(Exts.IsTraitEnabled);
if (targetable == null || !IsValidTarget(targetable.TargetTypes)) if (!IsValidTarget(targetable.SelectMany(t => t.TargetTypes)))
return false; return false;
return true; return true;
@@ -74,8 +75,7 @@ namespace OpenRA.Mods.Common.Warheads
return false; return false;
// A target type is valid if it is in the valid targets list, and not in the invalid targets list. // A target type is valid if it is in the valid targets list, and not in the invalid targets list.
var targetable = victim.Info.Traits.GetOrDefault<ITargetableInfo>(); if (!IsValidTarget(victim.TargetTypes))
if (targetable == null || !IsValidTarget(targetable.GetTargetTypes()))
return false; return false;
return true; return true;

View File

@@ -112,7 +112,6 @@
<Compile Include="Traits\SupportPowers\GpsPower.cs" /> <Compile Include="Traits\SupportPowers\GpsPower.cs" />
<Compile Include="Traits\SupportPowers\ParatroopersPower.cs" /> <Compile Include="Traits\SupportPowers\ParatroopersPower.cs" />
<Compile Include="Traits\SpawnActorOnDeath.cs" /> <Compile Include="Traits\SpawnActorOnDeath.cs" />
<Compile Include="Traits\TargetableSubmarine.cs" />
<Compile Include="Scripting\Properties\ChronosphereProperties.cs" /> <Compile Include="Scripting\Properties\ChronosphereProperties.cs" />
<Compile Include="Scripting\Properties\ParadropProperties.cs" /> <Compile Include="Scripting\Properties\ParadropProperties.cs" />
<Compile Include="Scripting\Properties\ParatroopersProperties.cs" /> <Compile Include="Scripting\Properties\ParatroopersProperties.cs" />

View File

@@ -61,7 +61,7 @@ namespace OpenRA.Mods.RA.Traits
if (order.ExtraData == 0 && order.TargetActor == null) if (order.ExtraData == 0 && order.TargetActor == null)
return false; return false;
ActorInfo ai; IEnumerable<string> targetTypes;
if (order.ExtraData != 0) if (order.ExtraData != 0)
{ {
@@ -74,13 +74,13 @@ namespace OpenRA.Mods.RA.Traits
if (frozen == null) if (frozen == null)
return false; return false;
ai = frozen.Info; targetTypes = frozen.TargetTypes;
} }
else else
ai = order.TargetActor.Info; targetTypes = order.TargetActor.TraitsImplementing<ITargetable>().Where(Exts.IsTraitEnabled)
.SelectMany(t => t.TargetTypes);
var i = ai.Traits.GetOrDefault<ITargetableInfo>(); return targetTypes.Intersect(Info.Types).Any();
return i != null && i.GetTargetTypes().Intersect(Info.Types).Any();
} }
public string VoicePhraseForOrder(Actor self, Order order) public string VoicePhraseForOrder(Actor self, Order order)
@@ -95,7 +95,8 @@ namespace OpenRA.Mods.RA.Traits
return; return;
var target = self.ResolveFrozenActorOrder(order, Color.Red); var target = self.ResolveFrozenActorOrder(order, Color.Red);
if (target.Type != TargetType.Actor) if (target.Type != TargetType.Actor
|| target.Actor.TraitsImplementing<ITargetable>().SelectMany(t => t.TargetTypes).Intersect(Info.Types).Any())
return; return;
if (!order.Queued) if (!order.Queued)

View File

@@ -1,42 +0,0 @@
#region Copyright & License Information
/*
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using OpenRA.Mods.Common.Traits;
using OpenRA.Traits;
namespace OpenRA.Mods.RA.Traits
{
public class TargetableSubmarineInfo : TargetableUnitInfo, Requires<CloakInfo>
{
public readonly string[] CloakedTargetTypes = { };
public override object Create(ActorInitializer init) { return new TargetableSubmarine(init.Self, this); }
}
public class TargetableSubmarine : TargetableUnit
{
readonly TargetableSubmarineInfo info;
public TargetableSubmarine(Actor self, TargetableSubmarineInfo info)
: base(self, info)
{
this.info = info;
}
public override string[] TargetTypes
{
get
{
return IsTraitDisabled ? None
: (cloak.Cloaked ? info.CloakedTargetTypes : info.TargetTypes);
}
}
}
}

View File

@@ -511,7 +511,7 @@ Rules:
Buildable: Buildable:
Prerequisites: ~disabled Prerequisites: ~disabled
A10: A10:
TargetableUnit: Targetable:
Sequences: Sequences:

View File

@@ -16,6 +16,7 @@ TRAN:
InitialFacing: 0 InitialFacing: 0
LandableTerrainTypes: Clear,Rough,Road,Ore,Beach,Tiberium,BlueTiberium LandableTerrainTypes: Clear,Rough,Road,Ore,Beach,Tiberium,BlueTiberium
AltitudeVelocity: 0c100 AltitudeVelocity: 0c100
AirborneUpgrades: airborne
Health: Health:
HP: 90 HP: 90
Armor: Armor:
@@ -56,6 +57,7 @@ HELI:
RearmBuildings: hpad RearmBuildings: hpad
ROT: 4 ROT: 4
Speed: 186 Speed: 186
AirborneUpgrades: airborne
Health: Health:
HP: 125 HP: 125
Armor: Armor:
@@ -107,6 +109,7 @@ ORCA:
RearmBuildings: hpad RearmBuildings: hpad
ROT: 4 ROT: 4
Speed: 186 Speed: 186
AirborneUpgrades: airborne
Health: Health:
HP: 90 HP: 90
Armor: Armor:
@@ -152,6 +155,7 @@ C17:
ROT: 5 ROT: 5
Speed: 326 Speed: 326
Repulsable: False Repulsable: False
AirborneUpgrades: airborne
Health: Health:
HP: 25 HP: 25
Armor: Armor:
@@ -188,6 +192,7 @@ A10:
ROT: 4 ROT: 4
Speed: 373 Speed: 373
Repulsable: False Repulsable: False
AirborneUpgrades: airborne
Health: Health:
HP: 150 HP: 150
Armor: Armor:
@@ -219,6 +224,7 @@ TRAN.Husk:
Helicopter: Helicopter:
ROT: 5 ROT: 5
Speed: 140 Speed: 140
AirborneUpgrades: airborne
RevealsShroud: RevealsShroud:
Range: 8c0 Range: 8c0
Type: CenterPosition Type: CenterPosition
@@ -236,6 +242,7 @@ HELI.Husk:
Helicopter: Helicopter:
ROT: 4 ROT: 4
Speed: 186 Speed: 186
AirborneUpgrades: airborne
RevealsShroud: RevealsShroud:
Range: 10c0 Range: 10c0
Type: CenterPosition Type: CenterPosition
@@ -251,6 +258,7 @@ ORCA.Husk:
Helicopter: Helicopter:
ROT: 4 ROT: 4
Speed: 186 Speed: 186
AirborneUpgrades: airborne
RevealsShroud: RevealsShroud:
Range: 10c0 Range: 10c0
Type: CenterPosition Type: CenterPosition

View File

@@ -374,7 +374,7 @@ BRIDGEHUT:
CustomSelectionSize: CustomSelectionSize:
CustomBounds: 48,48 CustomBounds: 48,48
BridgeHut: BridgeHut:
TargetableBuilding: Targetable:
TargetTypes: BridgeHut, C4 TargetTypes: BridgeHut, C4
C1: C1:

View File

@@ -64,7 +64,7 @@
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Bounds: 24,24 Bounds: 24,24
TargetableUnit: Targetable:
TargetTypes: Ground, Vehicle TargetTypes: Ground, Vehicle
Repairable: Repairable:
Passenger: Passenger:
@@ -116,9 +116,14 @@
Inherits@2: ^GainsExperience Inherits@2: ^GainsExperience
AppearsOnRadar: AppearsOnRadar:
UseLocation: yes UseLocation: yes
TargetableAircraft: Targetable@GROUND:
TargetTypes: Ground, Vehicle
UpgradeTypes: airborne
UpgradeMaxEnabledLevel: 0
Targetable@AIRBORNE:
TargetTypes: Air TargetTypes: Air
GroundedTargetTypes: Ground, Vehicle UpgradeTypes: airborne
UpgradeMinEnabledLevel: 1
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Bounds: 24,24 Bounds: 24,24
@@ -126,6 +131,7 @@
RepairBuildings: hpad RepairBuildings: hpad
RearmBuildings: RearmBuildings:
LandWhenIdle: false LandWhenIdle: false
AirborneUpgrades: airborne
HiddenUnderFog: HiddenUnderFog:
Type: CenterPosition Type: CenterPosition
ActorLostNotification: ActorLostNotification:
@@ -172,7 +178,7 @@
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Bounds: 12,17,0,-6 Bounds: 12,17,0,-6
TargetableUnit: Targetable:
TargetTypes: Ground, Infantry TargetTypes: Ground, Infantry
RenderSprites: RenderSprites:
QuantizeFacingsFromSequence: QuantizeFacingsFromSequence:
@@ -302,7 +308,7 @@
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Bounds: 24,24 Bounds: 24,24
TargetableUnit: Targetable:
TargetTypes: Ground TargetTypes: Ground
HiddenUnderFog: HiddenUnderFog:
QuantizeFacingsFromSequence: QuantizeFacingsFromSequence:
@@ -346,7 +352,7 @@
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Bounds: 24,24 Bounds: 24,24
TargetableUnit: Targetable:
TargetTypes: Ground TargetTypes: Ground
AutoTarget: AutoTarget:
ScanRadius: 5 ScanRadius: 5
@@ -405,7 +411,7 @@
Water: 100 Water: 100
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
TargetableUnit: Targetable:
TargetTypes: Ground, Water TargetTypes: Ground, Water
HiddenUnderFog: HiddenUnderFog:
ActorLostNotification: ActorLostNotification:
@@ -421,7 +427,7 @@
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Priority: 3 Priority: 3
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, Structure TargetTypes: Ground, C4, Structure
Armor: Armor:
Type: Wood Type: Wood
@@ -520,7 +526,7 @@
Tooltip: Tooltip:
Name: Field Name: Field
-WithBuildingExplosion: -WithBuildingExplosion:
-TargetableBuilding: -Targetable:
-Demolishable: -Demolishable:
RenderSprites: RenderSprites:
Palette: terrain Palette: terrain
@@ -553,7 +559,7 @@
BuildSounds: hvydoor1.aud BuildSounds: hvydoor1.aud
Adjacent: 7 Adjacent: 7
TerrainTypes: Clear,Road TerrainTypes: Clear,Road
TargetableBuilding: Targetable:
TargetTypes: Ground, Wall TargetTypes: Ground, Wall
Crushable: Crushable:
CrushClasses: wall CrushClasses: wall
@@ -662,7 +668,7 @@
AllowedTerrain: Clear, Rough, Road, Tiberium, BlueTiberium, Beach AllowedTerrain: Clear, Rough, Road, Tiberium, BlueTiberium, Beach
Burns: Burns:
Interval: 2 Interval: 2
TargetableUnit: Targetable:
RequiresForceFire: yes RequiresForceFire: yes
TargetTypes: Ground, Husk TargetTypes: Ground, Husk
Capturable: Capturable:
@@ -692,7 +698,7 @@
AlwaysVisible: AlwaysVisible:
Tooltip: Tooltip:
Name: Bridge Name: Bridge
TargetableBuilding: Targetable:
RequiresForceFire: yes RequiresForceFire: yes
TargetTypes: Ground, Water TargetTypes: Ground, Water
Health: Health:

View File

@@ -528,7 +528,7 @@ STNK:
AttackFrontal: AttackFrontal:
AutoTarget: AutoTarget:
InitialStance: HoldFire InitialStance: HoldFire
TargetableUnit: Targetable:
SpawnActorOnDeath: SpawnActorOnDeath:
Actor: STNK.Husk Actor: STNK.Husk
-MustBeDestroyed: -MustBeDestroyed:

View File

@@ -20,6 +20,7 @@ carryall.reinforce:
Repulsable: False Repulsable: False
LandAltitude: 100 LandAltitude: 100
LandWhenIdle: False LandWhenIdle: False
AirborneUpgrades: airborne
SpawnActorOnDeath: SpawnActorOnDeath:
Actor: carryall.husk Actor: carryall.husk
Carryall: Carryall:
@@ -53,6 +54,7 @@ carryall.infantry:
RepairBuildings: repair RepairBuildings: repair
RearmBuildings: RearmBuildings:
Repulsable: False Repulsable: False
AirborneUpgrades: airborne
Cargo: Cargo:
MaxWeight: 5 MaxWeight: 5
Types: Infantry Types: Infantry
@@ -77,6 +79,7 @@ frigate:
RepairBuildings: repair RepairBuildings: repair
RearmBuildings: RearmBuildings:
Repulsable: False Repulsable: False
AirborneUpgrades: airborne
Health: Health:
HP: 500 HP: 500
-AppearsOnRadar: -AppearsOnRadar:
@@ -116,14 +119,20 @@ orni:
Speed: 280 Speed: 280
RepairBuildings: repair RepairBuildings: repair
RearmBuildings: RearmBuildings:
AirborneUpgrades: airborne
SpawnActorOnDeath: SpawnActorOnDeath:
Actor: orni.husk Actor: orni.husk
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Bounds: 32,32 Bounds: 32,32
TargetableAircraft: Targetable@GROUND:
TargetTypes: Ground, Vehicle
UpgradeTypes: airborne
UpgradeMaxEnabledLevel: 0
Targetable@AIRBORNE:
TargetTypes: Air TargetTypes: Air
GroundedTargetTypes: Ground, Vehicle UpgradeTypes: airborne
UpgradeMinEnabledLevel: 1
Voiced: Voiced:
VoiceSet: GenericVoice VoiceSet: GenericVoice
@@ -142,6 +151,7 @@ orni.bomber:
RepairBuildings: repair RepairBuildings: repair
RearmBuildings: RearmBuildings:
Repulsable: False Repulsable: False
AirborneUpgrades: airborne
AmmoPool: AmmoPool:
Ammo: 5 Ammo: 5
Tooltip: Tooltip:
@@ -161,6 +171,7 @@ orni.husk:
Speed: 280 Speed: 280
RepairBuildings: RepairBuildings:
RearmBuildings: RearmBuildings:
AirborneUpgrades: airborne
RenderSprites: RenderSprites:
Image: orni Image: orni
@@ -173,6 +184,7 @@ orni.bomber.husk:
Speed: 350 Speed: 350
RepairBuildings: RepairBuildings:
RearmBuildings: RearmBuildings:
AirborneUpgrades: airborne
RenderSprites: RenderSprites:
Image: orni Image: orni
@@ -185,6 +197,7 @@ carryall.husk:
Speed: 210 Speed: 210
RepairBuildings: RepairBuildings:
RearmBuildings: RearmBuildings:
AirborneUpgrades: airborne
RenderSprites: RenderSprites:
Image: carryall Image: carryall
@@ -197,6 +210,7 @@ carryall.infantry.husk:
Speed: 280 Speed: 280
RepairBuildings: RepairBuildings:
RearmBuildings: RearmBuildings:
AirborneUpgrades: airborne
RenderSprites: RenderSprites:
Image: carryall Image: carryall

View File

@@ -34,7 +34,7 @@ sandworm:
Sand: 100 Sand: 100
Dune: 100 Dune: 100
Spice: 100 Spice: 100
TargetableUnit: Targetable:
TargetTypes: Ground TargetTypes: Ground
WithFacingSpriteBody: WithFacingSpriteBody:
WithAttackOverlay: WithAttackOverlay:

View File

@@ -65,7 +65,7 @@
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Bounds: 32,32 Bounds: 32,32
TargetableUnit: Targetable:
TargetTypes: Ground, Vehicle, C4 TargetTypes: Ground, Vehicle, C4
Passenger: Passenger:
CargoType: Vehicle CargoType: Vehicle
@@ -130,7 +130,7 @@
AllowedTerrain: Sand, Rock, Transition, Concrete, Spice, SpiceBlobs, Dune AllowedTerrain: Sand, Rock, Transition, Concrete, Spice, SpiceBlobs, Dune
Burns: Burns:
Interval: 4 Interval: 4
TargetableUnit: Targetable:
TargetTypes: Ground, Vehicle TargetTypes: Ground, Vehicle
RequiresForceFire: yes RequiresForceFire: yes
Capturable: Capturable:
@@ -188,7 +188,7 @@
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Bounds: 12,18,0,-6 Bounds: 12,18,0,-6
TargetableUnit: Targetable:
TargetTypes: Ground, Infantry TargetTypes: Ground, Infantry
UpgradeTypes: parachute UpgradeTypes: parachute
UpgradeMaxEnabledLevel: 0 UpgradeMaxEnabledLevel: 0
@@ -260,7 +260,7 @@
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Priority: 2 Priority: 2
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, Structure TargetTypes: Ground, C4, Structure
Building: Building:
Dimensions: 1,1 Dimensions: 1,1

View File

@@ -133,6 +133,7 @@ waypoint:
Inherits: carryall Inherits: carryall
Helicopter: Helicopter:
InitialFacing: 104 InitialFacing: 104
AirborneUpgrades: airborne
RenderSprites: RenderSprites:
Image: carryall Image: carryall
Palette: colorpicker Palette: colorpicker

View File

@@ -509,7 +509,7 @@ wall:
NodeTypes: wall, turret NodeTypes: wall, turret
LineBuildNode: LineBuildNode:
Types: wall Types: wall
TargetableBuilding: Targetable:
TargetTypes: Ground, Wall TargetTypes: Ground, Wall
RenderSprites: RenderSprites:
WithWallSpriteBody: WithWallSpriteBody:

View File

@@ -1382,21 +1382,19 @@ Rules:
-ExternalCaptures: -ExternalCaptures:
Captures: Captures:
CaptureTypes: building CaptureTypes: building
Cloak@JAIL: Targetable:
UpgradeTypes: jail UpgradeTypes: jail
UpgradeMinEnabledLevel: 1 UpgradeMaxEnabledLevel: 0
InitialDelay: 0 Targetable@PRISONER:
CloakDelay: 0 TargetTypes: Prisoner
Palette:
RenderSprites: RenderSprites:
Image: E6 Image: E6
MEDI: MEDI:
Cloak@JAIL: Targetable:
UpgradeTypes: jail UpgradeTypes: jail
UpgradeMinEnabledLevel: 1 UpgradeMaxEnabledLevel: 0
InitialDelay: 0 Targetable@PRISONER:
CloakDelay: 0 TargetTypes: Prisoner
Palette:
E7.noautotarget: E7.noautotarget:
Inherits: E7 Inherits: E7
AutoTarget: AutoTarget:
@@ -1544,6 +1542,9 @@ Sequences:
VoxelSequences: VoxelSequences:
Weapons: Weapons:
BarrelExplode:
Warhead@1Dam:
ValidTargets: Ground, Prisoner
Voices: Voices:

View File

@@ -1278,21 +1278,19 @@ Rules:
Captures: Captures:
CaptureTypes: building CaptureTypes: building
WithInfantryBody: WithInfantryBody:
Cloak@JAIL: Targetable:
UpgradeTypes: jail UpgradeTypes: jail
UpgradeMinEnabledLevel: 1 UpgradeMaxEnabledLevel: 0
InitialDelay: 0 Targetable@PRISONER:
CloakDelay: 0 TargetTypes: Prisoner
Palette:
RenderSprites: RenderSprites:
Image: E6 Image: E6
MEDI: MEDI:
Cloak@JAIL: Targetable:
UpgradeTypes: jail UpgradeTypes: jail
UpgradeMinEnabledLevel: 1 UpgradeMaxEnabledLevel: 0
InitialDelay: 0 Targetable@PRISONER:
CloakDelay: 0 TargetTypes: Prisoner
Palette:
E7.noautotarget: E7.noautotarget:
Inherits: E7 Inherits: E7
AutoTarget: AutoTarget:
@@ -1385,7 +1383,7 @@ Rules:
-Selectable: -Selectable:
-Demolishable: -Demolishable:
-Huntable: -Huntable:
-TargetableUnit: -Targetable:
-Armament: -Armament:
-WithMuzzleFlash: -WithMuzzleFlash:
Cargo: Cargo:
@@ -1432,6 +1430,9 @@ Weapons:
FireballLauncher: FireballLauncher:
Projectile: Projectile:
High: True High: True
BarrelExplode:
Warhead@1Dam:
ValidTargets: Ground, Prisoner
Voices: Voices:

View File

@@ -1651,7 +1651,7 @@ Rules:
Prerequisites: ~disabled Prerequisites: ~disabled
LST: LST:
-Selectable: -Selectable:
TargetableUnit: Targetable:
TargetTypes: Ground, Water TargetTypes: Ground, Water
Tooltip: Tooltip:
GenericVisibility: Enemy GenericVisibility: Enemy
@@ -1668,8 +1668,8 @@ Rules:
Range: 4c0 Range: 4c0
Tooltip: Tooltip:
ShowOwnerRow: false ShowOwnerRow: false
TargetableAircraft: Targetable@GROUND:
GroundedTargetTypes: Ground TargetTypes: Ground
TRAN.IN: TRAN.IN:
Inherits: TRAN Inherits: TRAN
RenderSprites: RenderSprites:
@@ -1696,13 +1696,13 @@ Rules:
ShowOwnerRow: false ShowOwnerRow: false
WEAP: WEAP:
-InfiltrateForSupportPower: -InfiltrateForSupportPower:
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, Structure, Mission Objectives TargetTypes: Ground, C4, DetonateAttack, Structure, Mission Objectives
MISS: MISS:
Tooltip: Tooltip:
Name: Prison Name: Prison
ShowOwnerRow: False ShowOwnerRow: False
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, Structure, Mission Objectives TargetTypes: Ground, C4, DetonateAttack, Structure, Mission Objectives
E7.noautotarget: E7.noautotarget:
Inherits: E7 Inherits: E7

View File

@@ -644,7 +644,7 @@ Rules:
DamageMultiplier@INVULNERABLE: DamageMultiplier@INVULNERABLE:
Modifier: 0 Modifier: 0
-Selectable: -Selectable:
-TargetableBuilding: -Targetable:
Player: Player:
StrategicVictoryConditions: StrategicVictoryConditions:
TicksToHold: 3000 TicksToHold: 3000

View File

@@ -2241,7 +2241,7 @@ Rules:
RenderSprites: RenderSprites:
Image: DOME Image: DOME
-InfiltrateForExploration: -InfiltrateForExploration:
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, MissionObjective TargetTypes: Ground, C4, DetonateAttack, MissionObjective
SPY: SPY:
Infiltrates: Infiltrates:

View File

@@ -1282,7 +1282,7 @@ Rules:
Power: Power:
Amount: 0 Amount: 0
-Selectable: -Selectable:
-TargetableBuilding: -Targetable:
-GivesBuildableArea: -GivesBuildableArea:
-Huntable: -Huntable:
RenderSprites: RenderSprites:

View File

@@ -12,6 +12,7 @@ BADR:
Speed: 149 Speed: 149
Repulsable: False Repulsable: False
MaximumPitch: 56 MaximumPitch: 56
AirborneUpgrades: airborne
Cargo: Cargo:
MaxWeight: 10 MaxWeight: 10
-Selectable: -Selectable:
@@ -49,6 +50,7 @@ BADR.Bomber:
Speed: 149 Speed: 149
Repulsable: False Repulsable: False
MaximumPitch: 56 MaximumPitch: 56
AirborneUpgrades: airborne
AmmoPool: AmmoPool:
Ammo: 7 Ammo: 7
-Selectable: -Selectable:
@@ -106,6 +108,7 @@ MIG:
RearmBuildings: afld RearmBuildings: afld
RepulsionSpeed: 40 RepulsionSpeed: 40
MaximumPitch: 56 MaximumPitch: 56
AirborneUpgrades: airborne
AutoTarget: AutoTarget:
TargetWhenIdle: false TargetWhenIdle: false
TargetWhenDamaged: false TargetWhenDamaged: false
@@ -167,6 +170,7 @@ YAK:
Speed: 178 Speed: 178
RepulsionSpeed: 40 RepulsionSpeed: 40
MaximumPitch: 56 MaximumPitch: 56
AirborneUpgrades: airborne
AutoTarget: AutoTarget:
TargetWhenIdle: false TargetWhenIdle: false
TargetWhenDamaged: false TargetWhenDamaged: false
@@ -215,6 +219,7 @@ TRAN:
Speed: 112 Speed: 112
LandableTerrainTypes: Clear,Rough,Road,Ore,Beach LandableTerrainTypes: Clear,Rough,Road,Ore,Beach
AltitudeVelocity: 0c100 AltitudeVelocity: 0c100
AirborneUpgrades: airborne
WithRotor@PRIMARY: WithRotor@PRIMARY:
Offset: -597,0,341 Offset: -597,0,341
Sequence: rotor2 Sequence: rotor2
@@ -261,6 +266,7 @@ HELI:
InitialFacing: 20 InitialFacing: 20
ROT: 4 ROT: 4
Speed: 149 Speed: 149
AirborneUpgrades: airborne
AutoTarget: AutoTarget:
InitialStance: HoldFire InitialStance: HoldFire
WithRotor: WithRotor:
@@ -312,6 +318,7 @@ HIND:
InitialFacing: 20 InitialFacing: 20
ROT: 4 ROT: 4
Speed: 112 Speed: 112
AirborneUpgrades: airborne
AutoTarget: AutoTarget:
InitialStance: HoldFire InitialStance: HoldFire
WithRotor: WithRotor:
@@ -341,10 +348,11 @@ U2:
Speed: 373 Speed: 373
Repulsable: False Repulsable: False
MaximumPitch: 56 MaximumPitch: 56
AirborneUpgrades: airborne
AttackBomber: AttackBomber:
-Selectable: -Selectable:
-Voiced: -Voiced:
-TargetableAircraft: -Targetable@AIRBORNE:
-GainsExperience: -GainsExperience:
Contrail@1: Contrail@1:
Offset: -725,683,0 Offset: -725,683,0

View File

@@ -242,7 +242,7 @@ V19.Husk:
Sequence: fire-loop Sequence: fire-loop
-Health: -Health:
-Selectable: -Selectable:
-TargetableBuilding: -Targetable:
-Demolishable: -Demolishable:
BARL: BARL:
@@ -259,7 +259,7 @@ BARL:
AutoTargetIgnore: AutoTargetIgnore:
Armor: Armor:
Type: None Type: None
TargetableBuilding: Targetable:
TargetTypes: Ground, DemoTruck TargetTypes: Ground, DemoTruck
-ShakeOnDeath: -ShakeOnDeath:
-SoundOnDamageTransition: -SoundOnDamageTransition:
@@ -279,7 +279,7 @@ BRL3:
AutoTargetIgnore: AutoTargetIgnore:
Armor: Armor:
Type: None Type: None
TargetableBuilding: Targetable:
TargetTypes: Ground, DemoTruck TargetTypes: Ground, DemoTruck
-ShakeOnDeath: -ShakeOnDeath:
-SoundOnDamageTransition: -SoundOnDamageTransition:
@@ -497,7 +497,7 @@ BRIDGEHUT:
CustomSelectionSize: CustomSelectionSize:
CustomBounds: 48,48 CustomBounds: 48,48
BridgeHut: BridgeHut:
TargetableBuilding: Targetable:
TargetTypes: BridgeHut, C4 TargetTypes: BridgeHut, C4
BRIDGEHUT.small: BRIDGEHUT.small:
@@ -508,7 +508,7 @@ BRIDGEHUT.small:
CustomSelectionSize: CustomSelectionSize:
CustomBounds: 24,24 CustomBounds: 24,24
BridgeHut: BridgeHut:
TargetableBuilding: Targetable:
TargetTypes: BridgeHut, C4 TargetTypes: BridgeHut, C4
V20: V20:

View File

@@ -77,7 +77,7 @@
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Bounds: 24, 24 Bounds: 24, 24
TargetableUnit: Targetable:
TargetTypes: Ground, Repair, Vehicle TargetTypes: Ground, Repair, Vehicle
UpgradeTypes: parachute UpgradeTypes: parachute
UpgradeMaxEnabledLevel: 0 UpgradeMaxEnabledLevel: 0
@@ -149,7 +149,7 @@
Ore: 70 Ore: 70
Gems: 70 Gems: 70
Beach: 70 Beach: 70
TargetableUnit: Targetable:
TargetTypes: Ground, C4, Repair, Tank TargetTypes: Ground, C4, Repair, Tank
ProximityCaptor: ProximityCaptor:
Types: Tank Types: Tank
@@ -181,7 +181,7 @@
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Bounds: 12,18,0,-8 Bounds: 12,18,0,-8
TargetableUnit: Targetable:
TargetTypes: Ground, Infantry, Disguise TargetTypes: Ground, Infantry, Disguise
UpgradeTypes: parachute UpgradeTypes: parachute
UpgradeMaxEnabledLevel: 0 UpgradeMaxEnabledLevel: 0
@@ -299,7 +299,7 @@
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Bounds: 24,24 Bounds: 24,24
TargetableUnit: Targetable:
TargetTypes: Ground, Water, Repair TargetTypes: Ground, Water, Repair
HiddenUnderFog: HiddenUnderFog:
AttackMove: AttackMove:
@@ -339,9 +339,14 @@
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Bounds: 24,24 Bounds: 24,24
TargetableAircraft: Targetable@GROUND:
TargetTypes: Ground, Repair, Vehicle
UpgradeTypes: airborne
UpgradeMaxEnabledLevel: 0
Targetable@AIRBORNE:
TargetTypes: Air TargetTypes: Air
GroundedTargetTypes: Ground, Repair, Vehicle UpgradeTypes: airborne
UpgradeMinEnabledLevel: 1
HiddenUnderFog: HiddenUnderFog:
Type: CenterPosition Type: CenterPosition
AttackMove: AttackMove:
@@ -385,7 +390,7 @@
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Priority: 3 Priority: 3
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, Structure TargetTypes: Ground, C4, DetonateAttack, Structure
Building: Building:
Dimensions: 1,1 Dimensions: 1,1
@@ -433,7 +438,7 @@
^Defense: ^Defense:
Inherits: ^Building Inherits: ^Building
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, Structure, Defense TargetTypes: Ground, C4, DetonateAttack, Structure, Defense
MustBeDestroyed: MustBeDestroyed:
RequiredForShortGame: false RequiredForShortGame: false
@@ -462,7 +467,7 @@
NodeTypes: wall NodeTypes: wall
LineBuildNode: LineBuildNode:
Types: wall Types: wall
TargetableBuilding: Targetable:
TargetTypes: Ground, DetonateAttack, Wall TargetTypes: Ground, DetonateAttack, Wall
RenderSprites: RenderSprites:
Palette: effect Palette: effect
@@ -518,7 +523,7 @@
AutoTargetIgnore: AutoTargetIgnore:
Armor: Armor:
Type: Light Type: Light
TargetableBuilding: Targetable:
TargetTypes: Ground, DetonateAttack TargetTypes: Ground, DetonateAttack
^CivBuilding: ^CivBuilding:
@@ -533,7 +538,7 @@
-Selectable: -Selectable:
Tooltip: Tooltip:
Name: Field Name: Field
-TargetableBuilding: -Targetable:
-Demolishable: -Demolishable:
ProximityCaptor: ProximityCaptor:
Types: CivilianField Types: CivilianField
@@ -598,7 +603,7 @@
TransformOnCapture: TransformOnCapture:
ForceHealthPercentage: 25 ForceHealthPercentage: 25
DisabledOverlay: DisabledOverlay:
TargetableUnit: Targetable:
TargetTypes: Ground, Husk TargetTypes: Ground, Husk
RequiresForceFire: true RequiresForceFire: true
Chronoshiftable: Chronoshiftable:
@@ -625,7 +630,7 @@
AlwaysVisible: AlwaysVisible:
Tooltip: Tooltip:
Name: Bridge Name: Bridge
TargetableBuilding: Targetable:
TargetTypes: Ground, Water TargetTypes: Ground, Water
RequiresForceFire: true RequiresForceFire: true
Building: Building:

View File

@@ -57,7 +57,7 @@ SYRF:
GenericName: Shipyard GenericName: Shipyard
GenericVisibility: Enemy GenericVisibility: Enemy
GenericStancePrefix: False GenericStancePrefix: False
TargetableBuilding: Targetable:
TargetTypes: Ground, Water TargetTypes: Ground, Water
Building: Building:
Footprint: xxx xxx xxx Footprint: xxx xxx xxx
@@ -73,7 +73,7 @@ SYRF:
SPEF: SPEF:
Inherits: ^FakeBuilding Inherits: ^FakeBuilding
TargetableBuilding: Targetable:
TargetTypes: Ground, Water TargetTypes: Ground, Water
Buildable: Buildable:
BuildPaletteOrder: 910 BuildPaletteOrder: 910

View File

@@ -88,6 +88,7 @@ TRAN.Husk:
Helicopter: Helicopter:
ROT: 4 ROT: 4
Speed: 149 Speed: 149
AirborneUpgrades: airborne
WithRotor@PRIMARY: WithRotor@PRIMARY:
Offset: -597,0,341 Offset: -597,0,341
WithRotor@SECONDARY: WithRotor@SECONDARY:
@@ -119,6 +120,7 @@ BADR.Husk:
Plane: Plane:
ROT: 5 ROT: 5
Speed: 149 Speed: 149
AirborneUpgrades: airborne
SmokeTrailWhenDamaged@0: SmokeTrailWhenDamaged@0:
Offset: -432,560,0 Offset: -432,560,0
Interval: 2 Interval: 2
@@ -141,6 +143,7 @@ MIG.Husk:
Plane: Plane:
ROT: 5 ROT: 5
Speed: 186 Speed: 186
AirborneUpgrades: airborne
SmokeTrailWhenDamaged: SmokeTrailWhenDamaged:
Offset: -853,0,171 Offset: -853,0,171
Interval: 2 Interval: 2
@@ -160,6 +163,7 @@ YAK.Husk:
Plane: Plane:
ROT: 5 ROT: 5
Speed: 149 Speed: 149
AirborneUpgrades: airborne
SmokeTrailWhenDamaged: SmokeTrailWhenDamaged:
Offset: -853,0,0 Offset: -853,0,0
Interval: 2 Interval: 2
@@ -177,6 +181,7 @@ HELI.Husk:
Helicopter: Helicopter:
ROT: 4 ROT: 4
Speed: 149 Speed: 149
AirborneUpgrades: airborne
WithRotor: WithRotor:
Offset: 0,0,85 Offset: 0,0,85
SmokeTrailWhenDamaged: SmokeTrailWhenDamaged:
@@ -195,6 +200,7 @@ HIND.Husk:
Helicopter: Helicopter:
ROT: 4 ROT: 4
Speed: 112 Speed: 112
AirborneUpgrades: airborne
WithRotor: WithRotor:
SmokeTrailWhenDamaged: SmokeTrailWhenDamaged:
Offset: -427,0,0 Offset: -427,0,0
@@ -210,6 +216,7 @@ U2.Husk:
Plane: Plane:
ROT: 7 ROT: 7
Speed: 373 Speed: 373
AirborneUpgrades: airborne
Contrail@1: Contrail@1:
Offset: -725,683,0 Offset: -725,683,0
Contrail@2: Contrail@2:

View File

@@ -32,7 +32,7 @@ DOG:
Voice: Attack Voice: Attack
AttackMove: AttackMove:
Voice: Move Voice: Move
TargetableUnit: Targetable:
TargetTypes: Ground, Infantry TargetTypes: Ground, Infantry
WithInfantryBody: WithInfantryBody:
AttackSequence: shoot AttackSequence: shoot
@@ -587,7 +587,7 @@ Ant:
AttackSequence: bite AttackSequence: bite
Armament: Armament:
Weapon: mandible Weapon: mandible
TargetableUnit: Targetable:
TargetTypes: Ground, Infantry TargetTypes: Ground, Infantry
WithDeathAnimation: WithDeathAnimation:
UseDeathTypeSuffix: false UseDeathTypeSuffix: false

View File

@@ -22,7 +22,7 @@ MINP:
Name: Mine Name: Mine
ProximityCaptor: ProximityCaptor:
Types: Mine Types: Mine
TargetableUnit: Targetable:
TargetTypes: Ground TargetTypes: Ground
BodyOrientation: BodyOrientation:
QuantizedFacings: 1 QuantizedFacings: 1
@@ -53,7 +53,7 @@ MINV:
Name: Mine Name: Mine
ProximityCaptor: ProximityCaptor:
Types: Mine Types: Mine
TargetableUnit: Targetable:
TargetTypes: Ground TargetTypes: Ground
BodyOrientation: BodyOrientation:
QuantizedFacings: 1 QuantizedFacings: 1
@@ -431,5 +431,5 @@ CTFLAG:
DamageMultiplier@INVULNERABLE: DamageMultiplier@INVULNERABLE:
Modifier: 0 Modifier: 0
-Selectable: -Selectable:
-TargetableBuilding: -Targetable:

View File

@@ -19,16 +19,21 @@ SS:
Speed: 71 Speed: 71
RevealsShroud: RevealsShroud:
Range: 6c0 Range: 6c0
-TargetableUnit: Targetable:
TargetableSubmarine:
TargetTypes: Ground, Water, Repair TargetTypes: Ground, Water, Repair
CloakedTargetTypes: Underwater, Repair UpgradeTypes: underwater
UpgradeMaxEnabledLevel: 0
Targetable@UNDERWATER:
TargetTypes: Underwater, Repair
UpgradeTypes: underwater
UpgradeMinEnabledLevel: 1
Cloak: Cloak:
CloakTypes: Underwater CloakTypes: Underwater
InitialDelay: 0 InitialDelay: 0
CloakDelay: 50 CloakDelay: 50
CloakSound: subshow1.aud CloakSound: subshow1.aud
UncloakSound: subshow1.aud UncloakSound: subshow1.aud
WhileCloakedUpgrades: underwater
Armament: Armament:
Weapon: TorpTube Weapon: TorpTube
LocalOffset: 0,-171,0, 0,171,0 LocalOffset: 0,-171,0, 0,171,0
@@ -68,16 +73,21 @@ MSUB:
Speed: 42 Speed: 42
RevealsShroud: RevealsShroud:
Range: 6c0 Range: 6c0
-TargetableUnit: Targetable:
TargetableSubmarine:
TargetTypes: Ground, Water, Repair TargetTypes: Ground, Water, Repair
CloakedTargetTypes: Underwater, Repair UpgradeTypes: underwater
UpgradeMaxEnabledLevel: 0
Targetable@UNDERWATER:
TargetTypes: Underwater, Repair
UpgradeTypes: underwater
UpgradeMinEnabledLevel: 1
Cloak: Cloak:
CloakTypes: Underwater CloakTypes: Underwater
InitialDelay: 0 InitialDelay: 0
CloakDelay: 100 CloakDelay: 100
CloakSound: subshow1.aud CloakSound: subshow1.aud
UncloakSound: subshow1.aud UncloakSound: subshow1.aud
WhileCloakedUpgrades: underwater
Armament: Armament:
Weapon: SubMissile Weapon: SubMissile
LocalOffset: 0,-171,0, 0,171,0 LocalOffset: 0,-171,0, 0,171,0

View File

@@ -100,7 +100,7 @@ SPEN:
Queue: Building Queue: Building
BuildPaletteOrder: 50 BuildPaletteOrder: 50
Prerequisites: anypower, ~structures.soviet, ~techlevel.low Prerequisites: anypower, ~structures.soviet, ~techlevel.low
TargetableBuilding: Targetable:
TargetTypes: Ground, Water, C4, DetonateAttack, SpyInfiltrate TargetTypes: Ground, Water, C4, DetonateAttack, SpyInfiltrate
Building: Building:
Footprint: xxx xxx xxx Footprint: xxx xxx xxx
@@ -181,7 +181,7 @@ SYRD:
Tooltip: Tooltip:
Name: Shipyard Name: Shipyard
Description: Produces and repairs ships\nand transports. Description: Produces and repairs ships\nand transports.
TargetableBuilding: Targetable:
TargetTypes: Ground, Water, C4, DetonateAttack, SpyInfiltrate TargetTypes: Ground, Water, C4, DetonateAttack, SpyInfiltrate
Building: Building:
Footprint: xxx xxx xxx Footprint: xxx xxx xxx
@@ -476,7 +476,7 @@ DOME:
Building: Building:
Footprint: xx xx Footprint: xx xx
Dimensions: 2,2 Dimensions: 2,2
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate
RequiresPower: RequiresPower:
CanPowerDown: CanPowerDown:
@@ -823,7 +823,7 @@ WEAP:
Power: Power:
Amount: -30 Amount: -30
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate
InfiltrateForSupportPower: InfiltrateForSupportPower:
Proxy: vehicles.upgraded Proxy: vehicles.upgraded
@@ -920,7 +920,7 @@ PROC:
Bounds: 72,50,0,12 Bounds: 72,50,0,12
SelectionDecorations: SelectionDecorations:
VisualBounds: 72,70,0,-2 VisualBounds: 72,70,0,-2
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate
Health: Health:
HP: 900 HP: 900
@@ -1050,7 +1050,7 @@ HPAD:
RequiresPrerequisites: structures.germany RequiresPrerequisites: structures.germany
Prerequisite: aircraft.germany Prerequisite: aircraft.germany
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate
InfiltrateForSupportPower: InfiltrateForSupportPower:
Proxy: aircraft.upgraded Proxy: aircraft.upgraded
@@ -1159,7 +1159,7 @@ AFLD:
Power: Power:
Amount: -20 Amount: -20
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate
InfiltrateForSupportPower: InfiltrateForSupportPower:
Proxy: aircraft.upgraded Proxy: aircraft.upgraded
@@ -1191,7 +1191,7 @@ POWR:
Amount: 100 Amount: 100
InfiltrateForPowerOutage: InfiltrateForPowerOutage:
AffectedByPowerOutage: AffectedByPowerOutage:
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate
ScalePowerWithHealth: ScalePowerWithHealth:
DisabledOverlay: DisabledOverlay:
@@ -1232,7 +1232,7 @@ APWR:
Amount: 200 Amount: 200
InfiltrateForPowerOutage: InfiltrateForPowerOutage:
AffectedByPowerOutage: AffectedByPowerOutage:
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate
ScalePowerWithHealth: ScalePowerWithHealth:
DisabledOverlay: DisabledOverlay:
@@ -1332,7 +1332,7 @@ BARR:
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
InfiltrateForSupportPower: InfiltrateForSupportPower:
Proxy: barracks.upgraded Proxy: barracks.upgraded
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate
KENN: KENN:
@@ -1439,7 +1439,7 @@ TENT:
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
InfiltrateForSupportPower: InfiltrateForSupportPower:
Proxy: barracks.upgraded Proxy: barracks.upgraded
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate
FIX: FIX:

View File

@@ -699,7 +699,7 @@ QTNK:
VisualBounds: 44,38,0,-4 VisualBounds: 44,38,0,-4
MadTank: MadTank:
-EjectOnDeath: -EjectOnDeath:
TargetableUnit: Targetable:
TargetTypes: Ground, MADTank, Repair TargetTypes: Ground, MADTank, Repair
STNK: STNK:

View File

@@ -10,6 +10,7 @@ DPOD:
Speed: 149 Speed: 149
InitialFacing: 0 InitialFacing: 0
LandableTerrainTypes: Clear LandableTerrainTypes: Clear
AirborneUpgrades: airborne
Health: Health:
HP: 60 HP: 60
Armor: Armor:
@@ -47,6 +48,7 @@ DSHP:
LandableTerrainTypes: Clear LandableTerrainTypes: Clear
TakeoffSound: dropup1.aud TakeoffSound: dropup1.aud
LandingSound: dropdwn1.aud LandingSound: dropdwn1.aud
AirborneUpgrades: airborne
Health: Health:
HP: 200 HP: 200
Armor: Armor:
@@ -78,6 +80,7 @@ ORCA:
RearmBuildings: gahpad, nahpad RearmBuildings: gahpad, nahpad
ROT: 5 ROT: 5
Speed: 186 Speed: 186
AirborneUpgrades: airborne
Health: Health:
HP: 200 HP: 200
Armor: Armor:
@@ -117,6 +120,7 @@ ORCAB:
MaximumPitch: 120 MaximumPitch: 120
ROT: 3 ROT: 3
Speed: 96 Speed: 96
AirborneUpgrades: airborne
Health: Health:
HP: 260 HP: 260
Armor: Armor:
@@ -159,6 +163,7 @@ ORCATRAN:
LandableTerrainTypes: Clear LandableTerrainTypes: Clear
TakeoffSound: dropup1.aud TakeoffSound: dropup1.aud
LandingSound: dropdwn1.aud LandingSound: dropdwn1.aud
AirborneUpgrades: airborne
Health: Health:
HP: 200 HP: 200
Armor: Armor:
@@ -193,6 +198,7 @@ TRNSPORT:
TakeoffSound: dropup1.aud TakeoffSound: dropup1.aud
LandingSound: dropdwn1.aud LandingSound: dropdwn1.aud
AltitudeVelocity: 64 AltitudeVelocity: 64
AirborneUpgrades: airborne
Health: Health:
HP: 175 HP: 175
Armor: Armor:
@@ -224,6 +230,7 @@ SCRIN:
MaximumPitch: 90 MaximumPitch: 90
ROT: 3 ROT: 3
Speed: 168 Speed: 168
AirborneUpgrades: airborne
Health: Health:
HP: 280 HP: 280
Armor: Armor:
@@ -262,6 +269,7 @@ APACHE:
RearmBuildings: gahpad, nahpad RearmBuildings: gahpad, nahpad
ROT: 5 ROT: 5
Speed: 130 Speed: 130
AirborneUpgrades: airborne
Health: Health:
HP: 225 HP: 225
Armor: Armor:

View File

@@ -225,7 +225,7 @@ DOGGIE:
Speed: 113 Speed: 113
Voiced: Voiced:
VoiceSet: Fiend VoiceSet: Fiend
TargetableUnit: Targetable:
TargetTypes: Ground TargetTypes: Ground
Armament: Armament:
Weapon: FiendShard Weapon: FiendShard

View File

@@ -71,7 +71,7 @@
Palette: pips Palette: pips
Selectable: Selectable:
Priority: 3 Priority: 3
TargetableBuilding: Targetable:
TargetTypes: Ground, Building, C4 TargetTypes: Ground, Building, C4
Building: Building:
Dimensions: 1,1 Dimensions: 1,1
@@ -187,7 +187,7 @@
NodeTypes: wall NodeTypes: wall
LineBuildNode: LineBuildNode:
Types: wall Types: wall
TargetableBuilding: Targetable:
TargetTypes: Ground, Wall, C4 TargetTypes: Ground, Wall, C4
RenderSprites: RenderSprites:
AutoSelectionSize: AutoSelectionSize:
@@ -252,7 +252,7 @@
Bounds: 14,23,-1,-9 Bounds: 14,23,-1,-9
Voiced: Voiced:
VoiceSet: Infantry VoiceSet: Infantry
TargetableUnit: Targetable:
TargetTypes: Ground, Infantry TargetTypes: Ground, Infantry
QuantizeFacingsFromSequence: QuantizeFacingsFromSequence:
Sequence: stand Sequence: stand
@@ -378,7 +378,7 @@
Palette: pips Palette: pips
Voiced: Voiced:
VoiceSet: Vehicle VoiceSet: Vehicle
TargetableUnit: Targetable:
TargetTypes: Ground, Vehicle, Repair TargetTypes: Ground, Vehicle, Repair
Repairable: Repairable:
RepairBuildings: gadept RepairBuildings: gadept
@@ -453,9 +453,14 @@
DrawLineToTarget: DrawLineToTarget:
AppearsOnRadar: AppearsOnRadar:
UseLocation: yes UseLocation: yes
TargetableAircraft: Targetable@GROUND:
TargetTypes: Ground
UpgradeTypes: airborne
UpgradeMaxEnabledLevel: 0
Targetable@AIRBORNE:
TargetTypes: Air TargetTypes: Air
GroundedTargetTypes: Ground UpgradeTypes: airborne
UpgradeMinEnabledLevel: 1
Selectable: Selectable:
SelectionDecorations: SelectionDecorations:
Palette: pips Palette: pips
@@ -484,6 +489,7 @@
LandWhenIdle: no LandWhenIdle: no
CruiseAltitude: 2048 CruiseAltitude: 2048
Voice: Move Voice: Move
AirborneUpgrades: airborne
^Plane: ^Plane:
Inherits: ^Aircraft Inherits: ^Aircraft
@@ -493,6 +499,7 @@
LandWhenIdle: no LandWhenIdle: no
CruiseAltitude: 2560 CruiseAltitude: 2560
Voice: Move Voice: Move
AirborneUpgrades: airborne
ReturnOnIdle: ReturnOnIdle:
^Viceroid: ^Viceroid:
@@ -520,7 +527,7 @@
Palette: pips Palette: pips
Selectable: Selectable:
Bounds: 26,26,0,-3 Bounds: 26,26,0,-3
TargetableUnit: Targetable:
TargetTypes: Ground TargetTypes: Ground
AttackMove: AttackMove:
HiddenUnderFog: HiddenUnderFog:
@@ -651,7 +658,7 @@
SelectionDecorations: SelectionDecorations:
Palette: pips Palette: pips
Selectable: Selectable:
TargetableBuilding: Targetable:
TargetTypes: Ground, Repair TargetTypes: Ground, Repair
Guardable: Guardable:
HiddenUnderFog: HiddenUnderFog:
@@ -681,7 +688,7 @@
Palette: pips Palette: pips
Voiced: Voiced:
VoiceSet: Vehicle VoiceSet: Vehicle
TargetableUnit: Targetable:
TargetTypes: Ground, Vehicle TargetTypes: Ground, Vehicle
Passenger: Passenger:
CargoType: Infantry CargoType: Infantry

View File

@@ -30,7 +30,7 @@ GAPOWR:
Amount: 100 Amount: 100
InfiltrateForPowerOutage: InfiltrateForPowerOutage:
AffectedByPowerOutage: AffectedByPowerOutage:
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate
ScalePowerWithHealth: ScalePowerWithHealth:
DisabledOverlay: DisabledOverlay:
@@ -288,7 +288,7 @@ GARADR:
WithIdleOverlay@DISH: WithIdleOverlay@DISH:
Sequence: idle-dish Sequence: idle-dish
PauseOnLowPower: yes PauseOnLowPower: yes
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, SpyInfiltrate TargetTypes: Ground, C4, SpyInfiltrate
Power: Power:
Amount: -50 Amount: -50

View File

@@ -28,7 +28,7 @@ NAPOWR:
Amount: 100 Amount: 100
InfiltrateForPowerOutage: InfiltrateForPowerOutage:
AffectedByPowerOutage: AffectedByPowerOutage:
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate
ScalePowerWithHealth: ScalePowerWithHealth:
DisabledOverlay: DisabledOverlay:
@@ -65,7 +65,7 @@ NAAPWR:
Amount: 200 Amount: 200
InfiltrateForPowerOutage: InfiltrateForPowerOutage:
AffectedByPowerOutage: AffectedByPowerOutage:
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate
ScalePowerWithHealth: ScalePowerWithHealth:
DisabledOverlay: DisabledOverlay:
@@ -243,7 +243,7 @@ NARADR:
WithIdleOverlay@DISH: WithIdleOverlay@DISH:
Sequence: idle-dish Sequence: idle-dish
PauseOnLowPower: yes PauseOnLowPower: yes
TargetableBuilding: Targetable:
TargetTypes: Ground, C4, SpyInfiltrate TargetTypes: Ground, C4, SpyInfiltrate
Power: Power:
Amount: -50 Amount: -50