Index: ps/trunk/binaries/data/mods/public/globalscripts/Templates.js
===================================================================
--- ps/trunk/binaries/data/mods/public/globalscripts/Templates.js
+++ ps/trunk/binaries/data/mods/public/globalscripts/Templates.js
@@ -205,13 +205,14 @@
(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 == "true";
Object.assign(ret.attack[type], getAttackEffects(template.Attack[type], "Attack/" + type));
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,
};
Index: ps/trunk/binaries/data/mods/public/simulation/components/Attack.js
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/components/Attack.js
+++ ps/trunk/binaries/data/mods/public/simulation/components/Attack.js
@@ -71,6 +71,7 @@
"props/units/weapons/rock_flaming.xml" +
"props/units/weapons/rock_explosion.xml" +
"0.1" +
+ "false" +
"" +
"Champion" +
"" +
@@ -153,6 +154,7 @@
"" +
"" +
"" +
+ "" +
"" +
"" +
"" +
@@ -419,7 +421,7 @@
return {
"attackData": this.GetAttackEffectsData(type, true),
- "friendlyFire": this.template[type].Splash.FriendlyFire != "false",
+ "friendlyFire": this.template[type].Splash.FriendlyFire == "true",
"radius": ApplyValueModificationsToEntity("Attack/" + type + "/Splash/Range", +this.template[type].Splash.Range, this.entity),
"shape": this.template[type].Splash.Shape,
};
@@ -541,6 +543,7 @@
"projectileId": id,
"attackImpactSound": attackImpactSound,
"splash": this.GetSplashData(type),
+ "friendlyFire": this.template[type].Projectile.FriendlyFire == "true",
};
cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_DelayedDamage, "MissileHit", +this.template[type].Delay + timeToTarget * 1000, data);
Index: ps/trunk/binaries/data/mods/public/simulation/components/DelayedDamage.js
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/components/DelayedDamage.js
+++ ps/trunk/binaries/data/mods/public/simulation/components/DelayedDamage.js
@@ -20,6 +20,7 @@
* @param {number} data.projectileId - The id of the projectile.
* @param {Vector3D} data.direction - The unit vector defining the direction.
* @param {string} data.attackImpactSound - The name of the sound emited on impact.
+ * @param {boolean} data.friendlyFire - A flag indicating whether allied entities can also be damaged.
* ***When splash damage***
* @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.
@@ -67,9 +68,11 @@
if (!targetPosition)
return;
- // If we didn't hit the main target look for nearby units
- let cmpPlayer = QueryPlayerIDInterface(data.attackerOwner);
- let ents = Attacking.EntitiesNearPoint(Vector2D.from3D(data.position), targetPosition.horizDistanceTo(data.position) * 2, cmpPlayer.GetEnemies());
+ // If we didn't hit the main target look for nearby units.
+ let ents = Attacking.EntitiesNearPoint(Vector2D.from3D(data.position),
+ targetPosition.horizDistanceTo(data.position) * 2,
+ Attacking.GetPlayersToDamage(data.attackerOwner, data.friendlyFire));
+
for (let ent of ents)
{
if (!Attacking.TestCollision(ent, data.position, lateness))
Index: ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Attack.js
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Attack.js
+++ ps/trunk/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: ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Damage.js
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Damage.js
+++ ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Damage.js
@@ -40,6 +40,7 @@
"Speed": 75.0,
"Spread": 0.5,
"Gravity": 9.81,
+ "FriendlyFire": "false",
"LaunchPoint": { "@y": 3 }
}
}
@@ -384,6 +385,7 @@
"position": targetPos,
"direction": new Vector3D(1, 0, 0),
"projectileId": 9,
+ "friendlyFire": "false",
};
AddMock(SYSTEM_ENTITY, IID_PlayerManager, {
@@ -570,6 +572,52 @@
TS_ASSERT_EQUALS(dealtDamage, 100 + 10000 * 200);
dealtDamage = 0;
hitEnts.clear();
+
+ // Test splash damage with friendly fire.
+ data.splash = {};
+ data.splash.friendlyFire = true;
+ data.splash.radius = 10;
+ data.splash.shape = "Circular";
+ data.splash.attackData = { "Damage": { "Pierce": 0, "Crush": 200 } };
+
+ AddMock(SYSTEM_ENTITY, IID_RangeManager, {
+ "ExecuteQueryAroundPos": () => [61, 62]
+ });
+
+ dealtDamage = 0;
+ AddMock(61, IID_Health, {
+ "TakeDamage": (effectData, __, ___, mult) => {
+ hitEnts.add(61);
+ dealtDamage += mult * (effectData.Pierce + effectData.Crush);
+ return { "killed": false, "change": -mult * (effectData.Pierce + effectData.Crush) };
+ }
+ });
+
+ AddMock(62, IID_Position, {
+ "GetPosition": () => new Vector3D(8, 10, 0),
+ "GetPreviousPosition": () => new Vector3D(8, 10, 0),
+ "GetPosition2D": () => new Vector2D(8, 0),
+ "IsInWorld": () => true,
+ });
+
+ AddMock(62, IID_Health, {
+ "TakeDamage": (effectData, __, ___, mult) => {
+ hitEnts.add(62);
+ TS_ASSERT_EQUALS(mult * (effectData.Pierce + effectData.Crush), 200 * 0.75);
+ return { "killed": false, "change": -mult * (effectData.Pierce + effectData.Crush) };
+ }
+ });
+
+ AddMock(62, IID_Footprint, {
+ "GetShape": () => ({ "type": "circle", "radius": 20 }),
+ });
+
+ cmpDelayedDamage.MissileHit(data, 0);
+ TS_ASSERT(hitEnts.has(61));
+ TS_ASSERT_EQUALS(dealtDamage, 100 + 2 * 200);
+ dealtDamage = 0;
+ TS_ASSERT(hitEnts.has(62));
+ hitEnts.clear();
}
Test_MissileHit();
Index: ps/trunk/binaries/data/mods/public/simulation/templates/campaigns/campaign_city_minor_test.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/campaigns/campaign_city_minor_test.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/campaigns/campaign_city_minor_test.xml
@@ -13,6 +13,7 @@
2000
75.0
+ false
Index: ps/trunk/binaries/data/mods/public/simulation/templates/campaigns/campaign_city_test.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/campaigns/campaign_city_test.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/campaigns/campaign_city_test.xml
@@ -13,6 +13,7 @@
2000
75.0
+ false
Index: ps/trunk/binaries/data/mods/public/simulation/templates/structures/rome_army_camp.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/structures/rome_army_camp.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/structures/rome_army_camp.xml
@@ -26,6 +26,7 @@
75.0
1.5
9.81
+ false
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_structure_civic_civil_centre.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_structure_civic_civil_centre.xml
+++ ps/trunk/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: ps/trunk/binaries/data/mods/public/simulation/templates/template_structure_defensive_tower.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_structure_defensive_tower.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_structure_defensive_tower.xml
@@ -14,6 +14,7 @@
75.0
1.5
39.81
+ false
Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_structure_defensive_wall_tower.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_structure_defensive_wall_tower.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_structure_defensive_wall_tower.xml
@@ -16,6 +16,7 @@
75.0
1.5
39.81
+ false
Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_structure_military_fortress.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_structure_military_fortress.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_structure_military_fortress.xml
@@ -21,6 +21,7 @@
75.0
1.5
9.81
+ false
Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged.xml
@@ -16,6 +16,7 @@
75.0
3.0
9.81
+ false
Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_archer.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_archer.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_archer.xml
@@ -16,6 +16,7 @@
75.0
1.0
39.81
+ false
Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_javelinist.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_javelinist.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_javelinist.xml
@@ -16,6 +16,7 @@
62.5
1.0
39.81
+ false
Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_archer.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_archer.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_archer.xml
@@ -16,6 +16,7 @@
75.0
1.0
39.81
+ false
Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_javelinist.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_javelinist.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_javelinist.xml
@@ -16,6 +16,7 @@
62.5
1.0
39.81
+ false
Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_archer.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_archer.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_archer.xml
@@ -16,6 +16,7 @@
75.0
0.5
39.81
+ false
Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_javelinist.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_javelinist.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_javelinist.xml
@@ -16,6 +16,7 @@
62.5
0.5
39.81
+ false
Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_archer.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_archer.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_archer.xml
@@ -16,6 +16,7 @@
75.0
0.5
39.81
+ false
Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_javelinist.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_javelinist.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_javelinist.xml
@@ -16,6 +16,7 @@
62.5
0.5
39.81
+ false
Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged.xml
@@ -21,6 +21,7 @@
75.0
3.0
9.81
+ false
Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_ship_bireme.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_ship_bireme.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_ship_bireme.xml
@@ -16,6 +16,7 @@
75.0
2.0
39.81
+ false
Ship Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_ship_quinquereme.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_ship_quinquereme.xml
+++ ps/trunk/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: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_ship_trireme.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_ship_trireme.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_ship_trireme.xml
@@ -16,6 +16,7 @@
75.0
2.0
39.81
+ false
Ship Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_siege_boltshooter.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_siege_boltshooter.xml
+++ ps/trunk/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: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_siege_stonethrower.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_siege_stonethrower.xml
+++ ps/trunk/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: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_siege_tower.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_siege_tower.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_siege_tower.xml
@@ -17,6 +17,7 @@
75.0
2.0
9.81
+ false
Human
Index: ps/trunk/binaries/data/mods/public/simulation/templates/units/plane.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/units/plane.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/units/plane.xml
@@ -16,6 +16,7 @@
75.0
1.0
9.81
+ false
Index: ps/trunk/binaries/data/mods/public/simulation/templates/units/theb_siege_fireraiser.xml
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/templates/units/theb_siege_fireraiser.xml
+++ ps/trunk/binaries/data/mods/public/simulation/templates/units/theb_siege_fireraiser.xml
@@ -16,6 +16,7 @@
10.0
2.0
9.81
+ false