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