Index: binaries/data/mods/public/globalscripts/Templates.js
===================================================================
--- binaries/data/mods/public/globalscripts/Templates.js
+++ binaries/data/mods/public/globalscripts/Templates.js
@@ -197,11 +197,12 @@
(2 * ret.attack[type].elevationBonus + ret.attack[type].maxRange));
}
ret.attack[type].repeatTime = getAttackStat("RepeatTime");
+ if (template.Attack[type].Projectile)
+ ret.attack[type].friendlyFire = template.Attack[type].Projectile.FriendlyFire != "false";
if (template.Attack[type].Splash)
{
ret.attack[type].splash = {
- // true if undefined
"friendlyFire": template.Attack[type].Splash.FriendlyFire != "false",
"shape": template.Attack[type].Splash.Shape,
"damage": {}
Index: binaries/data/mods/public/simulation/components/Attack.js
===================================================================
--- binaries/data/mods/public/simulation/components/Attack.js
+++ binaries/data/mods/public/simulation/components/Attack.js
@@ -105,6 +105,7 @@
"props/units/weapons/rock_flaming.xml" +
"props/units/weapons/rock_explosion.xml" +
"0.1" +
+ "false" +
"" +
"Champion" +
"" +
@@ -195,6 +196,7 @@
"" +
"" +
"" +
+ "" +
"" +
"" +
"" +
@@ -481,10 +483,11 @@
if (!this.template[type].Splash)
return false;
- let splash = {};
- splash.damage = this.GetAttackStrengths(type + ".Splash");
- splash.friendlyFire = this.template[type].Splash.FriendlyFire != "false";
- splash.shape = this.template[type].Splash.Shape;
+ let splash = {
+ "damage": this.GetAttackStrengths(type + ".Splash"),
+ "friendlyFire": this.template[type].Splash.FriendlyFire != "false",
+ "shape": this.template[type].Splash.Shape
+ };
return splash;
};
@@ -579,7 +582,7 @@
// 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)
{
@@ -611,18 +614,19 @@
"bonus": this.GetBonusTemplate(type),
"isSplash": false,
"attackerOwner": attackerOwner,
+ "friendlyFire": this.template[type].Projectile.FriendlyFire != "false",
"attackImpactSound": attackImpactSound,
"statusEffects": this.template[type].StatusEffects
};
- if (this.template[type].Splash)
- {
- 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");
- }
+ if (this.template[type].Splash && +this.template[type].Splash.Range > 0)
+ data.splash = {
+ "friendlyFire": this.template[type].Splash.FriendlyFire != "false",
+ "radius": +this.template[type].Splash.Range,
+ "shape": this.template[type].Splash.Shape,
+ "strengths": this.GetAttackStrengths(type + ".Splash"),
+ "bonus": this.GetBonusTemplate(type + ".Splash")
+ };
+
cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_Damage, "MissileHit", timeToTarget * 1000 + +this.template[type].Delay, data);
}
else if (type == "Capture")
Index: binaries/data/mods/public/simulation/components/Damage.js
===================================================================
--- binaries/data/mods/public/simulation/components/Damage.js
+++ binaries/data/mods/public/simulation/components/Damage.js
@@ -95,11 +95,11 @@
* @param {string} data.attackImpactSound - The name of the sound emited on impact.
* @param {Object} data.statusEffects - Status effects eg. poisoning, burning etc.
* ***When splash damage***
- * @param {boolean} data.friendlyFire - A flag indicating if allied entities are also damaged.
- * @param {number} data.radius - The radius of the splash damage.
- * @param {string} data.shape - The shape of the splash range.
- * @param {Object} data.splashBonus - The attack bonus template from the attacker.
- * @param {Object} data.splashStrengths - Data of the form { 'hack': number, 'pierce': number, 'crush': number }.
+ * @param {boolean} data.splash.friendlyFire - a flag indicating if allied entities are also damaged.
+ * @param {number} data.splash.radius - the radius of the splash damage.
+ * @param {string} data.splash.shape - the shape of the splash range.
+ * @param {Object} data.splash.bonus - the attack bonus template from the attacker.
+ * @param {Object} data.splash.strengths - data of the form { 'hack': number, 'pierce': number, 'crush': number }.
*/
Damage.prototype.MissileHit = function(data, lateness)
{
@@ -111,21 +111,19 @@
cmpSoundManager.PlaySoundGroupAtPosition(data.attackImpactSound, data.position);
// Do this first in case the direct hit kills the target
- if (data.isSplash)
- {
+ if (data.splash)
this.CauseDamageOverArea({
"attacker": data.attacker,
"origin": Vector2D.from3D(data.position),
- "radius": data.radius,
- "shape": data.shape,
- "strengths": data.splashStrengths,
- "splashBonus": data.splashBonus,
+ "radius": data.splash.radius,
+ "shape": data.splash.shape,
+ "strengths": data.splash.strengths,
+ "splashBonus": data.splash.bonus,
"direction": data.direction,
"playersToDamage": this.GetPlayersToDamage(data.attackerOwner, data.friendlyFire),
"type": data.type,
"attackerOwner": data.attackerOwner
});
- }
let cmpProjectileManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ProjectileManager);
@@ -150,8 +148,8 @@
return;
// If we didn't hit the main target look for nearby units
- let cmpPlayer = QueryPlayerIDInterface(data.attackerOwner);
- let ents = this.EntitiesNearPoint(Vector2D.from3D(data.position), targetPosition.horizDistanceTo(data.position) * 2, cmpPlayer.GetEnemies());
+ let playersToDamage = this.GetPlayersToDamage(data.attackerOwner, data.friendlyFire);
+ let ents = this.EntitiesNearPoint(Vector2D.from3D(data.position), targetPosition.horizDistanceTo(data.position) * 2, playersToDamage);
for (let ent of ents)
{
if (!this.TestCollision(ent, data.position, lateness))
Index: binaries/data/mods/public/simulation/components/tests/test_Attack.js
===================================================================
--- binaries/data/mods/public/simulation/components/tests/test_Attack.js
+++ binaries/data/mods/public/simulation/components/tests/test_Attack.js
@@ -78,7 +78,8 @@
"Projectile": {
"Speed": 10,
"Spread": 2,
- "Gravity": 1
+ "Gravity": 1,
+ "FriendlyFire": "false",
},
"PreferredClasses": {
"_string": "Archer"
Index: binaries/data/mods/public/simulation/components/tests/test_Damage.js
===================================================================
--- binaries/data/mods/public/simulation/components/tests/test_Damage.js
+++ binaries/data/mods/public/simulation/components/tests/test_Damage.js
@@ -25,7 +25,7 @@
let cmpDamage = ConstructComponent(SYSTEM_ENTITY, "Damage");
let cmpTimer = ConstructComponent(SYSTEM_ENTITY, "Timer");
- cmpTimer.OnUpdate({ turnLength: 1 });
+ cmpTimer.OnUpdate({ "turnLength": 1 });
let attacker = 11;
let atkPlayerEntity = 1;
let attackerOwner = 6;
@@ -39,6 +39,7 @@
"Speed": 75.0,
"Spread": 0.5,
"Gravity": 9.81,
+ "FriendlyFire": "false",
"LaunchPoint": { "@y": 3 }
}
}
@@ -61,9 +62,8 @@
"multiplier": 1.0,
"attackerOwner": attackerOwner,
"position": targetPos,
- "isSplash": false,
"projectileId": 9,
- "direction": new Vector3D(1,0,0)
+ "direction": new Vector3D(1, 0, 0)
};
AddMock(atkPlayerEntity, IID_Player, {
@@ -114,7 +114,7 @@
function TestDamage()
{
- cmpTimer.OnUpdate({ turnLength: 1 });
+ cmpTimer.OnUpdate({ "turnLength": 1 });
TS_ASSERT(damageTaken);
damageTaken = false;
}
@@ -156,14 +156,14 @@
"origin": origin,
"radius": 10,
"shape": "Linear",
- "strengths": { "hack" : 100, "pierce" : 0, "crush": 0 },
+ "strengths": { "hack": 100, "pierce": 0, "crush": 0 },
"direction": new Vector3D(1, 747, 0),
"playersToDamage": [2],
"type": "Ranged",
"attackerOwner": attackerOwner
};
- let fallOff = function(x,y)
+ let fallOff = function(x, y)
{
return (1 - x * x / (data.radius * data.radius)) * (1 - 25 * y * y / (data.radius * data.radius));
};
@@ -315,7 +315,7 @@
"origin": new Vector2D(3, 4),
"radius": radius,
"shape": "Circular",
- "strengths": { "hack" : 100, "pierce" : 0, "crush": 0 },
+ "strengths": { "hack": 100, "pierce": 0, "crush": 0 },
"playersToDamage": [2],
"type": "Ranged",
"attackerOwner": 1
@@ -351,7 +351,7 @@
"direction": new Vector3D(1, 0, 0),
"projectileId": 9,
"bonus": undefined,
- "isSplash": false,
+ "friendlyFire": "false",
"attackerOwner": 1
};
@@ -450,12 +450,12 @@
hitEnts.clear();
// Add a splash damage.
-
- data.friendlyFire = false;
- data.radius = 10;
- data.shape = "Circular";
- data.isSplash = true;
- data.splashStrengths = { "hack": 0, "pierce": 0, "crush": 200 };
+ data.splash = {
+ "friendlyFire": "false",
+ "radius": 10,
+ "shape": "Circular",
+ "strengths": { "hack": 0, "pierce": 0, "crush": 200 }
+ };
AddMock(SYSTEM_ENTITY, IID_RangeManager, {
"ExecuteQueryAroundPos": () => [61, 62]
@@ -519,7 +519,7 @@
dealtDamage = 0;
hitEnts.clear();
- data.splashBonus = splashBonus;
+ data.splash.bonus = splashBonus;
cmpDamage.MissileHit(data, 0);
TS_ASSERT(hitEnts.has(61));
TS_ASSERT_EQUALS(dealtDamage, 400 * 100 + 10000 * 200);
Index: binaries/data/mods/public/simulation/templates/campaigns/campaign_city_minor_test.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/campaigns/campaign_city_minor_test.xml
+++ binaries/data/mods/public/simulation/templates/campaigns/campaign_city_minor_test.xml
@@ -13,6 +13,7 @@
2000
75.0
+ false
Index: binaries/data/mods/public/simulation/templates/campaigns/campaign_city_test.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/campaigns/campaign_city_test.xml
+++ binaries/data/mods/public/simulation/templates/campaigns/campaign_city_test.xml
@@ -13,6 +13,7 @@
2000
75.0
+ false
Index: binaries/data/mods/public/simulation/templates/structures/rome_army_camp.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/structures/rome_army_camp.xml
+++ binaries/data/mods/public/simulation/templates/structures/rome_army_camp.xml
@@ -26,6 +26,7 @@
75.0
1.5
9.81
+ false
Index: binaries/data/mods/public/simulation/templates/template_structure_civic_civil_centre.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_structure_civic_civil_centre.xml
+++ binaries/data/mods/public/simulation/templates/template_structure_civic_civil_centre.xml
@@ -31,6 +31,7 @@
75.0
1.5
9.81
+ false
Human
Index: binaries/data/mods/public/simulation/templates/template_structure_defensive_tower.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_structure_defensive_tower.xml
+++ binaries/data/mods/public/simulation/templates/template_structure_defensive_tower.xml
@@ -14,6 +14,7 @@
75.0
1.5
9.81
+ false
Human
Index: binaries/data/mods/public/simulation/templates/template_structure_defensive_wall_tower.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_structure_defensive_wall_tower.xml
+++ binaries/data/mods/public/simulation/templates/template_structure_defensive_wall_tower.xml
@@ -16,6 +16,7 @@
75.0
1.5
9.81
+ false
Human
Index: binaries/data/mods/public/simulation/templates/template_structure_military_fortress.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_structure_military_fortress.xml
+++ binaries/data/mods/public/simulation/templates/template_structure_military_fortress.xml
@@ -21,6 +21,7 @@
75.0
1.5
9.81
+ false
Human
Index: binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_archer.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_archer.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_archer.xml
@@ -14,6 +14,7 @@
75.0
3.0
+ false
Index: binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_javelinist.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_javelinist.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_javelinist.xml
@@ -14,6 +14,7 @@
62.5
4.0
+ false
Index: binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_archer.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_archer.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_archer.xml
@@ -16,6 +16,7 @@
75.0
1.0
9.81
+ false
Human
Index: binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_javelinist.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_javelinist.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_javelinist.xml
@@ -16,6 +16,7 @@
62.5
1.0
9.81
+ false
Human
Index: binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_archer.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_archer.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_archer.xml
@@ -16,6 +16,7 @@
75.0
1.0
9.81
+ false
Human
Index: binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_javelinist.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_javelinist.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_javelinist.xml
@@ -16,6 +16,7 @@
62.5
1.0
9.81
+ false
Human
Index: binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_archer.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_archer.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_archer.xml
@@ -16,6 +16,7 @@
75.0
0.5
9.81
+ false
Human
Index: binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_javelinist.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_javelinist.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_javelinist.xml
@@ -16,6 +16,7 @@
62.5
0.5
9.81
+ false
Human
Index: binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_archer.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_archer.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_archer.xml
@@ -16,6 +16,7 @@
75.0
0.5
9.81
+ false
Human
Index: binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_javelinist.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_javelinist.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_javelinist.xml
@@ -16,6 +16,7 @@
62.5
0.5
9.81
+ false
Human
Index: binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_archer.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_archer.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_archer.xml
@@ -18,6 +18,7 @@
75.0
3.0
+ false
Index: binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_javelinist.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_javelinist.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_javelinist.xml
@@ -18,6 +18,7 @@
62.5
4.0
+ false
Index: binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_slinger.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_slinger.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_slinger.xml
@@ -18,6 +18,7 @@
62.5
3.0
+ false
Index: binaries/data/mods/public/simulation/templates/template_unit_ship_bireme.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_ship_bireme.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_ship_bireme.xml
@@ -16,6 +16,7 @@
75.0
2.0
9.81
+ false
Ship Human
Index: binaries/data/mods/public/simulation/templates/template_unit_ship_quinquereme.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_ship_quinquereme.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_ship_quinquereme.xml
@@ -26,6 +26,7 @@
37.5
4.0
9.81
+ false
Ship Structure
Index: binaries/data/mods/public/simulation/templates/template_unit_ship_trireme.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_ship_trireme.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_ship_trireme.xml
@@ -16,6 +16,7 @@
75.0
2.0
9.81
+ false
Ship Human
Index: binaries/data/mods/public/simulation/templates/template_unit_siege_boltshooter.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_siege_boltshooter.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_siege_boltshooter.xml
@@ -26,6 +26,7 @@
150.0
2.0
9.81
+ false
Human Siege
Index: binaries/data/mods/public/simulation/templates/template_unit_siege_stonethrower.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_siege_stonethrower.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_siege_stonethrower.xml
@@ -16,6 +16,7 @@
37.5
4.0
9.81
+ false
props/units/weapons/rock_explosion.xml
0.1
Index: binaries/data/mods/public/simulation/templates/template_unit_siege_tower.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/template_unit_siege_tower.xml
+++ binaries/data/mods/public/simulation/templates/template_unit_siege_tower.xml
@@ -17,6 +17,7 @@
75.0
2.0
9.81
+ false
Human
Index: binaries/data/mods/public/simulation/templates/units/plane.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/units/plane.xml
+++ binaries/data/mods/public/simulation/templates/units/plane.xml
@@ -16,6 +16,7 @@
75.0
1.0
9.81
+ false
Index: binaries/data/mods/public/simulation/templates/units/rome_siege_onager.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/units/rome_siege_onager.xml
+++ binaries/data/mods/public/simulation/templates/units/rome_siege_onager.xml
@@ -19,6 +19,7 @@
37.5
9.81
+ false
Index: binaries/data/mods/public/simulation/templates/units/theb_siege_fireraiser.xml
===================================================================
--- binaries/data/mods/public/simulation/templates/units/theb_siege_fireraiser.xml
+++ binaries/data/mods/public/simulation/templates/units/theb_siege_fireraiser.xml
@@ -16,6 +16,7 @@
10.0
2.0
9.81
+ false