Move more things in the projectile part of the Attack/Ranged component

Following D945, I reckon more things should be moved from Attack/Ranged
to Attack/Ranged/Projectile.

In the long run, I think most things should be moved to the Projectile,
which would let us have several projectiles per attack (for example),
make it easier to abstract away from the Melee/Ranged attack types, and
would also be more coherent. This is the first step, as it adds the
Projectile to all templates.

This also makes the launch point a parameter, though I only add "y" as
implementing the rotation is left as an exercise to the reader.

Reviewed By: bb
Differential Revision: https://code.wildfiregames.com/D1171
This was SVN commit r22184.
This commit is contained in:
wraitii 2019-04-13 09:27:14 +00:00
parent 4a5fb3ba94
commit b1659e7618
35 changed files with 239 additions and 139 deletions

View File

@ -72,8 +72,6 @@ Attack.prototype.Schema =
"<ElevationBonus>15.0</ElevationBonus>" +
"<PrepareTime>800</PrepareTime>" +
"<RepeatTime>1600</RepeatTime>" +
"<ProjectileSpeed>50.0</ProjectileSpeed>" +
"<Spread>2.5</Spread>" +
"<Delay>1000</Delay>" +
"<Bonuses>" +
"<Bonus1>" +
@ -82,6 +80,8 @@ Attack.prototype.Schema =
"</Bonus1>" +
"</Bonuses>" +
"<Projectile>" +
"<Speed>50.0</Speed>" +
"<Spread>2.5</Spread>" +
"<ActorName>props/units/weapons/rock_flaming.xml</ActorName>" +
"<ImpactActorName>props/units/weapons/rock_explosion.xml</ImpactActorName>" +
"<ImpactAnimationLifetime>0.1</ImpactAnimationLifetime>" +
@ -144,38 +144,7 @@ Attack.prototype.Schema =
"<element name='RepeatTime' a:help='Time between attacks (in milliseconds). The attack animation will be stretched to match this time'>" +
"<data type='positiveInteger'/>" +
"</element>" +
"<element name='ProjectileSpeed' a:help='Speed of projectiles (in metres per second)'>" +
"<ref name='positiveDecimal'/>" +
"</element>" +
"<element name='Gravity' a:help='The gravity affecting the projectile. This affects the shape of the flight curve.'>" +
"<ref name='nonNegativeDecimal'/>" +
"</element>" +
"<element name='Spread' a:help='Standard deviation of the bivariate normal distribution of hits at 100 meters. A disk at 100 meters from the attacker with this radius (2x this radius, 3x this radius) is expected to include the landing points of 39.3% (86.5%, 98.9%) of the rounds.'><ref name='nonNegativeDecimal'/></element>" +
"<element name='Delay' a:help='Delay of the damage in milliseconds'><ref name='nonNegativeDecimal'/></element>" +
Attack.prototype.bonusesSchema +
Attack.prototype.preferredClassesSchema +
Attack.prototype.restrictedClassesSchema +
"<optional>" +
"<element name='Projectile'>" +
"<interleave>" +
"<oneOrMore>" +
"<choice>" +
"<element name='ActorName' a:help='actor of the projectile animation'>" +
"<text/>" +
"</element>" +
"<interleave>" +
"<element name='ImpactActorName' a:help='actor of the projectile impact animation'>" +
"<text/>" +
"</element>" +
"<element name='ImpactAnimationLifetime' a:help='length of the projectile impact animation'>" +
"<ref name='positiveDecimal'/>" +
"</element>" +
"</interleave>" +
"</choice>" +
"</oneOrMore>" +
"</interleave>" +
"</element>" +
"</optional>" +
"<optional>" +
"<element name='Splash'>" +
"<interleave>" +
@ -187,6 +156,40 @@ Attack.prototype.Schema =
"</interleave>" +
"</element>" +
"</optional>" +
"<element name='Projectile'>" +
"<interleave>" +
"<element name='Speed' a:help='Speed of projectiles (in meters per second).'>" +
"<ref name='positiveDecimal'/>" +
"</element>" +
"<element name='Spread' a:help='Standard deviation of the bivariate normal distribution of hits at 100 meters. A disk at 100 meters from the attacker with this radius (2x this radius, 3x this radius) is expected to include the landing points of 39.3% (86.5%, 98.9%) of the rounds.'><ref name='nonNegativeDecimal'/></element>" +
"<element name='Gravity' a:help='The gravity affecting the projectile. This affects the shape of the flight curve.'>" +
"<ref name='nonNegativeDecimal'/>" +
"</element>" +
"<optional>" +
"<element name='LaunchPoint' a:help='Delta from the unit position where to launch the projectile.'>" +
"<attribute name='y'>" +
"<data type='decimal'/>" +
"</attribute>" +
"</element>" +
"</optional>" +
"<optional>" +
"<element name='ActorName' a:help='actor of the projectile animation.'>" +
"<text/>" +
"</element>" +
"</optional>" +
"<optional>" +
"<element name='ImpactActorName' a:help='actor of the projectile impact animation'>" +
"<text/>" +
"</element>" +
"<element name='ImpactAnimationLifetime' a:help='length of the projectile impact animation.'>" +
"<ref name='positiveDecimal'/>" +
"</element>" +
"</optional>" +
"</interleave>" +
"</element>" +
Attack.prototype.bonusesSchema +
Attack.prototype.preferredClassesSchema +
Attack.prototype.restrictedClassesSchema +
"</interleave>" +
"</element>" +
"</optional>" +
@ -493,8 +496,8 @@ Attack.prototype.PerformAttack = function(type, target)
// * Obstacles like trees could reduce the probability of the target being hit
// * Obstacles like walls should block projectiles entirely
let horizSpeed = +this.template[type].ProjectileSpeed;
let gravity = +this.template[type].Gravity;
let horizSpeed = +this.template[type].Projectile.Speed;
let gravity = +this.template[type].Projectile.Gravity;
//horizSpeed /= 2; gravity /= 2; // slow it down for testing
let cmpPosition = Engine.QueryInterface(this.entity, IID_Position);
@ -513,7 +516,7 @@ Attack.prototype.PerformAttack = function(type, target)
let predictedPosition = (timeToTarget !== false) ? Vector3D.mult(targetVelocity, timeToTarget).add(targetPosition) : targetPosition;
// Add inaccuracy based on spread.
let distanceModifiedSpread = ApplyValueModificationsToEntity("Attack/Ranged/Spread", +this.template.Ranged.Spread, this.entity) *
let distanceModifiedSpread = ApplyValueModificationsToEntity("Attack/Ranged/Spread", +this.template[type].Projectile.Spread, this.entity) *
predictedPosition.horizDistanceTo(selfPosition) / 100;
let randNorm = randomNormal2D();
@ -534,16 +537,14 @@ Attack.prototype.PerformAttack = function(type, target)
let actorName = "";
let impactActorName = "";
let impactAnimationLifetime = 0;
if (this.template.Ranged.Projectile)
{
actorName = this.template.Ranged.Projectile.ActorName || "";
impactActorName = this.template.Ranged.Projectile.ImpactActorName || "";
impactAnimationLifetime = this.template.Ranged.Projectile.ImpactAnimationLifetime || 0;
}
let launchPoint = selfPosition.clone();
// TODO: remove this when all the ranged unit templates are updated with Projectile/Launchpoint
launchPoint.y += 3;
actorName = this.template[type].Projectile.ActorName || "";
impactActorName = this.template[type].Projectile.ImpactActorName || "";
impactAnimationLifetime = this.template[type].Projectile.ImpactAnimationLifetime || 0;
// TODO: Use unit rotation to implement x/z offsets.
let deltaLaunchPoint = new Vector3D(0, this.template[type].Projectile.LaunchPoint["@y"], 0.0);
let launchPoint = Vector3D.add(selfPosition, deltaLaunchPoint);
let cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
if (cmpVisual)
@ -578,16 +579,16 @@ Attack.prototype.PerformAttack = function(type, target)
"attackerOwner": attackerOwner,
"attackImpactSound": attackImpactSound
};
if (this.template.Ranged.Splash)
if (this.template[type].Splash)
{
data.friendlyFire = this.template.Ranged.Splash.FriendlyFire != "false";
data.radius = +this.template.Ranged.Splash.Range;
data.shape = this.template.Ranged.Splash.Shape;
data.friendlyFire = this.template[type].Splash.FriendlyFire != "false";
data.radius = +this.template[type].Splash.Range;
data.shape = this.template[type].Splash.Shape;
data.isSplash = true;
data.splashStrengths = this.GetAttackStrengths(type + ".Splash");
data.splashBonus = this.GetBonusTemplate(type + ".Splash");
}
cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_Damage, "MissileHit", timeToTarget * 1000 + +this.template.Ranged.Delay, data);
cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_Damage, "MissileHit", timeToTarget * 1000 + +this.template[type].Delay, data);
}
else if (type == "Capture")
{

View File

@ -71,9 +71,11 @@ function attackComponentTest(defenderClass, isEnemy, test_function)
"MaxRange": 80,
"PrepareTime": 300,
"RepeatTime": 500,
"ProjectileSpeed": 50,
"Gravity": 9.81,
"Spread": 2.5,
"Projectile": {
"Speed": 10,
"Spread": 2,
"Gravity": 1
}
"PreferredClasses": {
"_string": "Archer"
},

View File

@ -28,7 +28,20 @@ function Test_Generic()
let attacker = 11;
let atkPlayerEntity = 1;
let attackerOwner = 6;
let cmpAttack = ConstructComponent(attacker, "Attack", { "Ranged": { "ProjectileSpeed": 500, "Gravity": 9.81, "Spread": 0.5, "MaxRange": 50, "MinRange": 0, "Delay": 0 } } );
let cmpAttack = ConstructComponent(attacker, "Attack",
{
"Ranged": {
"MaxRange": 50,
"MinRange": 0,
"Delay": 0,
"Projectile": {
"Speed": 75.0,
"Spread": 0.5,
"Gravity": 9.81,
"LaunchPoint": { "@y": 3 }
}
}
});
let damage = 5;
let target = 21;
let targetOwner = 7;

View File

@ -7,9 +7,11 @@
<Crush>0.0</Crush>
<MaxRange>50.0</MaxRange>
<MinRange>1.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<PrepareTime>1200</PrepareTime>
<RepeatTime>2000</RepeatTime>
<Projectile>
<Speed>75.0</Speed>
</Projectile>
</Ranged>
</Attack>
<BuildingAI>

View File

@ -7,9 +7,11 @@
<Crush>0.0</Crush>
<MaxRange>50.0</MaxRange>
<MinRange>1.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<PrepareTime>1200</PrepareTime>
<RepeatTime>2000</RepeatTime>
<Projectile>
<Speed>75.0</Speed>
</Projectile>
</Ranged>
</Attack>
<BuildingAI>

View File

@ -17,12 +17,15 @@
<Crush>0.0</Crush>
<MaxRange>60.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>1200</PrepareTime>
<RepeatTime>2000</RepeatTime>
<Spread>1.5</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>1.5</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<RangeOverlay>
<LineTexture>outline_border.png</LineTexture>
<LineTextureMask>outline_border_mask.png</LineTextureMask>

View File

@ -22,12 +22,15 @@
<Crush>0.0</Crush>
<MaxRange>72.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>1200</PrepareTime>
<RepeatTime>2000</RepeatTime>
<Spread>1.5</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>1.5</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
<RangeOverlay>
<LineTexture>outline_border.png</LineTexture>

View File

@ -5,12 +5,15 @@
<Hack>0</Hack>
<Pierce>0</Pierce>
<Crush>0</Crush>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>1200</PrepareTime>
<RepeatTime>2000</RepeatTime>
<Spread>1.5</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>1.5</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
<RangeOverlay>
<LineTexture>outline_border.png</LineTexture>

View File

@ -7,12 +7,15 @@
<Crush>0.0</Crush>
<MaxRange>72.0</MaxRange>
<MinRange>12.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>1200</PrepareTime>
<RepeatTime>2000</RepeatTime>
<Spread>1.5</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>1.5</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
<RangeOverlay>
<LineTexture>outline_border.png</LineTexture>

View File

@ -12,12 +12,15 @@
<Crush>0.0</Crush>
<MaxRange>72.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>1200</PrepareTime>
<RepeatTime>2000</RepeatTime>
<Spread>1.5</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>1.5</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
<RangeOverlay>
<LineTexture>outline_border.png</LineTexture>

View File

@ -7,12 +7,15 @@
<Crush>0</Crush>
<MaxRange>16.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>1000</PrepareTime>
<RepeatTime>1500</RepeatTime>
<Spread>3.0</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>3.0</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
</Ranged>
</Attack>

View File

@ -7,10 +7,12 @@
<Crush>0</Crush>
<MaxRange>72.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<PrepareTime>500</PrepareTime>
<RepeatTime>1000</RepeatTime>
<Spread>3.0</Spread>
<Projectile>
<Speed>75.0</Speed>
<Spread>3.0</Spread>
</Projectile>
</Ranged>
</Attack>
<Cost>

View File

@ -7,10 +7,12 @@
<Crush>0</Crush>
<MaxRange>28.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>62.5</ProjectileSpeed>
<PrepareTime>750</PrepareTime>
<RepeatTime>1250</RepeatTime>
<Spread>4.0</Spread>
<Projectile>
<Speed>62.5</Speed>
<Spread>4.0</Spread>
</Projectile>
</Ranged>
</Attack>
<Cost>

View File

@ -7,12 +7,15 @@
<Crush>0</Crush>
<MaxRange>76.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>500</PrepareTime>
<RepeatTime>1000</RepeatTime>
<Spread>1.0</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>1.0</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
</Ranged>
</Attack>

View File

@ -7,12 +7,15 @@
<Crush>0.0</Crush>
<MaxRange>32.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>62.5</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>750</PrepareTime>
<RepeatTime>1250</RepeatTime>
<Spread>1.0</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>62.5</Speed>
<Spread>1.0</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
</Ranged>
</Attack>

View File

@ -7,12 +7,15 @@
<Crush>0</Crush>
<MaxRange>76</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>300</PrepareTime>
<RepeatTime>500</RepeatTime>
<Spread>1.0</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>1.0</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
</Ranged>
</Attack>

View File

@ -7,12 +7,15 @@
<Crush>0</Crush>
<MaxRange>28.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>62.5</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>500</PrepareTime>
<RepeatTime>1000</RepeatTime>
<Spread>1.0</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>62.5</Speed>
<Spread>1.0</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
</Ranged>
</Attack>

View File

@ -7,12 +7,15 @@
<Crush>0</Crush>
<MaxRange>80.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>1200</PrepareTime>
<RepeatTime>2000</RepeatTime>
<Spread>0.5</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>0.5</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
</Ranged>
</Attack>

View File

@ -7,12 +7,15 @@
<Crush>0.0</Crush>
<MaxRange>36.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>62.5</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>750</PrepareTime>
<RepeatTime>1250</RepeatTime>
<Spread>0.5</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>62.5</Speed>
<Spread>0.5</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
</Ranged>
</Attack>

View File

@ -7,12 +7,15 @@
<Crush>0</Crush>
<MaxRange>80</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>200</PrepareTime>
<RepeatTime>300</RepeatTime>
<Spread>0.5</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>0.5</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
</Ranged>
</Attack>

View File

@ -7,12 +7,15 @@
<Crush>0</Crush>
<MaxRange>32.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>62.5</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>600</PrepareTime>
<RepeatTime>1000</RepeatTime>
<Spread>0.5</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>62.5</Speed>
<Spread>0.5</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
</Ranged>
</Attack>

View File

@ -12,12 +12,15 @@
<Crush>0</Crush>
<MaxRange>10.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>750</PrepareTime>
<RepeatTime>1250</RepeatTime>
<Spread>3.0</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>3.0</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
</Ranged>
</Attack>

View File

@ -11,10 +11,12 @@
<Crush>0</Crush>
<MaxRange>72.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<PrepareTime>600</PrepareTime>
<RepeatTime>1000</RepeatTime>
<Spread>3.0</Spread>
<Projectile>
<Speed>75.0</Speed>
<Spread>3.0</Spread>
</Projectile>
</Ranged>
</Attack>
<Cost>

View File

@ -11,10 +11,12 @@
<Crush>0</Crush>
<MaxRange>24.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>62.5</ProjectileSpeed>
<PrepareTime>750</PrepareTime>
<RepeatTime>1250</RepeatTime>
<Spread>4.0</Spread>
<Projectile>
<Speed>62.5</Speed>
<Spread>4.0</Spread>
</Projectile>
</Ranged>
</Attack>
<Cost>

View File

@ -11,10 +11,12 @@
<Crush>1.0</Crush>
<MaxRange>48.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>62.5</ProjectileSpeed>
<PrepareTime>500</PrepareTime>
<RepeatTime>1000</RepeatTime>
<Spread>3.0</Spread>
<Projectile>
<Speed>62.5</Speed>
<Spread>3.0</Spread>
</Projectile>
</Ranged>
</Attack>
<Cost>

View File

@ -7,12 +7,15 @@
<Crush>0.0</Crush>
<MaxRange>45.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>1000</PrepareTime>
<RepeatTime>2000</RepeatTime>
<Spread>2.0</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>2.0</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Ship Human</PreferredClasses>
</Ranged>
</Attack>

View File

@ -7,11 +7,8 @@
<Crush>100.0</Crush>
<MaxRange>72.0</MaxRange>
<MinRange>10.0</MinRange>
<ProjectileSpeed>37.5</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>2000</PrepareTime>
<RepeatTime>5000</RepeatTime>
<Spread>4.0</Spread>
<Delay>0</Delay>
<Splash>
<Shape>Circular</Shape>
@ -21,6 +18,12 @@
<Pierce>15.0</Pierce>
<Crush>35.0</Crush>
</Splash>
<Projectile>
<Speed>37.5</Speed>
<Spread>4.0</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Ship Structure</PreferredClasses>
</Ranged>
</Attack>

View File

@ -7,12 +7,15 @@
<Crush>0.0</Crush>
<MaxRange>55.0</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>1000</PrepareTime>
<RepeatTime>2000</RepeatTime>
<Spread>2.0</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>2.0</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Ship Human</PreferredClasses>
</Ranged>
</Attack>

View File

@ -7,9 +7,6 @@
<Crush>25.0</Crush>
<MaxRange>80.0</MaxRange>
<MinRange>26.0</MinRange>
<Spread>2.0</Spread>
<ProjectileSpeed>150.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>3000</PrepareTime>
<RepeatTime>4000</RepeatTime>
<Delay>0</Delay>
@ -21,6 +18,12 @@
<Pierce>75.0</Pierce>
<Crush>5.0</Crush>
</Splash>
<Projectile>
<Speed>150.0</Speed>
<Spread>2.0</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human Siege</PreferredClasses>
</Ranged>
</Attack>

View File

@ -7,13 +7,14 @@
<Crush>100.0</Crush>
<MaxRange>80.0</MaxRange>
<MinRange>26.0</MinRange>
<ProjectileSpeed>37.5</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>4000</PrepareTime>
<RepeatTime>5000</RepeatTime>
<Spread>4.0</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>37.5</Speed>
<Spread>4.0</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
<ImpactActorName>props/units/weapons/rock_explosion.xml</ImpactActorName>
<ImpactAnimationLifetime>0.1</ImpactAnimationLifetime>
</Projectile>

View File

@ -8,12 +8,15 @@
<MaxRange>55.0</MaxRange>
<MinRange>10.0</MinRange>
<ElevationBonus>10</ElevationBonus>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>1200</PrepareTime>
<RepeatTime>2000</RepeatTime>
<Spread>2.0</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>2.0</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
<RangeOverlay>
<LineTexture>outline_border.png</LineTexture>

View File

@ -7,10 +7,11 @@
<Crush>0</Crush>
<MaxRange>76</MaxRange>
<MinRange>0.0</MinRange>
<ProjectileSpeed>100.0</ProjectileSpeed>
<PrepareTime>2320</PrepareTime>
<RepeatTime>3000</RepeatTime>
<Spread>1.0</Spread>
<Projectile>
<Speed>100.0</Speed>
</Projectile>
<PreferredClasses datatype="tokens">Human</PreferredClasses>
</Ranged>
</Attack>

View File

@ -7,12 +7,15 @@
<Crush>227.0</Crush>
<MaxRange>120</MaxRange>
<MinRange>80</MinRange>
<ProjectileSpeed>75.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>0</PrepareTime>
<RepeatTime>10000</RepeatTime>
<Spread>1.0</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>75.0</Speed>
<Spread>1.0</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
</Ranged>
</Attack>
<BuildingAI>

View File

@ -4,8 +4,6 @@
<Ranged>
<MaxRange>76</MaxRange>
<MinRange>26.0</MinRange>
<ProjectileSpeed>37.5</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>3700</PrepareTime>
<RepeatTime>5000</RepeatTime>
<Splash>
@ -16,6 +14,10 @@
<Pierce>0.0</Pierce>
<Crush>40.0</Crush>
</Splash>
<Projectile>
<Speed>37.5</Speed>
<Gravity>9.81</Gravity>
</Projectile>
</Ranged>
</Attack>
<Cost>

View File

@ -7,12 +7,15 @@
<Crush>50.0</Crush>
<MaxRange>12</MaxRange>
<MinRange>8.0</MinRange>
<ProjectileSpeed>10.0</ProjectileSpeed>
<Gravity>9.81</Gravity>
<PrepareTime>2000</PrepareTime>
<RepeatTime>2000</RepeatTime>
<Spread>2.0</Spread>
<Delay>0</Delay>
<Projectile>
<Speed>10.0</Speed>
<Spread>2.0</Spread>
<Gravity>9.81</Gravity>
<LaunchPoint y="3"/>
</Projectile>
</Ranged>
</Attack>
<DeathDamage>