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 @@ -93,35 +93,13 @@ "0.0" + "0.0" + "" + + "1000" + "4.0" + "" + "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - Attacking.BuildAttackEffectsSchema() + - "" + - "" + - "" + - "" + - "" + // TODO: it shouldn't be stretched - "" + - "" + - Attack.prototype.preferredClassesSchema + - Attack.prototype.restrictedClassesSchema + - "" + - "" + - "" + - "" + - "" + + "" + + "" + + "" + "" + "" + "" + @@ -133,9 +111,11 @@ "" + Attacking.BuildAttackEffectsSchema() + "" + - "" + + "" + + "" + + "" + ""+ - "" + + "" + "" + "" + "" + @@ -146,13 +126,17 @@ "" + "" + "" + - "" + - "" + - "" + - "" + + "" + + "" + + "" + + "" + + "" + + "" + // TODO: it shouldn't be stretched "" + "" + - "" + + "" + + "" + + "" + "" + "" + "" + @@ -163,82 +147,45 @@ "" + "" + "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + + "" + + "" + + "" + + "" + "" + "" + - "" + - "" + - "" + - Attack.prototype.preferredClassesSchema + - Attack.prototype.restrictedClassesSchema + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - Attacking.BuildAttackEffectsSchema() + - "" + - "" + // TODO: it shouldn't be stretched - "" + - "" + - Attack.prototype.preferredClassesSchema + - Attack.prototype.restrictedClassesSchema + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - Attacking.BuildAttackEffectsSchema() + - "" + // TODO: how do these work? + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + Attack.prototype.preferredClassesSchema + Attack.prototype.restrictedClassesSchema + "" + "" + - ""; + ""; Attack.prototype.Init = function() { @@ -502,18 +449,33 @@ */ Attack.prototype.PerformAttack = function(type, target) { - let attackerOwner = Engine.QueryInterface(this.entity, IID_Ownership).GetOwner(); + let cmpPosition = Engine.QueryInterface(this.entity, IID_Position); + if (!cmpPosition || !cmpPosition.IsInWorld()) + return; + let selfPosition = cmpPosition.GetPosition(); + + let cmpTargetPosition = Engine.QueryInterface(target, IID_Position); + if (!cmpTargetPosition || !cmpTargetPosition.IsInWorld()) + return; + let targetPosition = cmpTargetPosition.GetPosition(); + + let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership); + if (!cmpOwnership) + return; + let attackerOwner = cmpOwnership.GetOwner(); let data = { "type": type, "attackData": this.GetAttackEffectsData(type), - "target": target, + "splash": this.GetSplashData(type), "attacker": this.entity, "attackerOwner": attackerOwner, + "target": target, }; - // If this is a ranged attack, then launch a projectile - if (type == "Ranged") + let delay = +(this.template[type].Delay || 0); + + if (this.template[type].Projectile) { let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); let turnLength = cmpTimer.GetLatestTurnLength()/1000; @@ -528,15 +490,6 @@ // We will try to estimate the position of the target, where we can hit it. // We first estimate the time-till-hit by extrapolating linearly the movement // of the last turn. We compute the time till an arrow will intersect the target. - let cmpPosition = Engine.QueryInterface(this.entity, IID_Position); - if (!cmpPosition || !cmpPosition.IsInWorld()) - return; - let selfPosition = cmpPosition.GetPosition(); - let cmpTargetPosition = Engine.QueryInterface(target, IID_Position); - if (!cmpTargetPosition || !cmpTargetPosition.IsInWorld()) - return; - let targetPosition = cmpTargetPosition.GetPosition(); - let targetVelocity = Vector3D.sub(targetPosition, cmpTargetPosition.GetPreviousPosition()).div(turnLength); let timeToTarget = PositionHelper.PredictTimeToTarget(selfPosition, horizSpeed, targetPosition, targetVelocity); @@ -571,31 +524,24 @@ let predictedHeight = cmpTargetPosition.GetHeightAt(predictedPosition.x, predictedPosition.z); // Add inaccuracy based on spread. - let distanceModifiedSpread = ApplyValueModificationsToEntity("Attack/Ranged/Spread", +this.template[type].Projectile.Spread, this.entity) * + let distanceModifiedSpread = ApplyValueModificationsToEntity("Attack/" + type + "/Spread", +this.template[type].Projectile.Spread, this.entity) * predictedPosition.horizDistanceTo(selfPosition) / 100; let randNorm = randomNormal2D(); let offsetX = randNorm[0] * distanceModifiedSpread; let offsetZ = randNorm[1] * distanceModifiedSpread; - let realTargetPosition = new Vector3D(predictedPosition.x + offsetX, predictedHeight, predictedPosition.z + offsetZ); + data.position = new Vector3D(predictedPosition.x + offsetX, predictedHeight, predictedPosition.z + offsetZ); - // Recalculate when the missile will hit the target position. - let realHorizDistance = realTargetPosition.horizDistanceTo(selfPosition); + let realHorizDistance = data.position.horizDistanceTo(selfPosition); timeToTarget = realHorizDistance / horizSpeed; + delay += timeToTarget * 1000; - let missileDirection = Vector3D.sub(realTargetPosition, selfPosition).div(realHorizDistance); - - // Launch the graphical projectile. - let cmpProjectileManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ProjectileManager); + data.direction = Vector3D.sub(data.position, selfPosition).div(realHorizDistance); - let actorName = ""; - let impactActorName = ""; - let impactAnimationLifetime = 0; - - actorName = this.template[type].Projectile.ActorName || ""; - impactActorName = this.template[type].Projectile.ImpactActorName || ""; - impactAnimationLifetime = this.template[type].Projectile.ImpactAnimationLifetime || 0; + let actorName = this.template[type].Projectile.ActorName || ""; + let impactActorName = this.template[type].Projectile.ImpactActorName || ""; + let 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); @@ -614,24 +560,26 @@ launchPoint = visualActorLaunchPoint; } - let id = cmpProjectileManager.LaunchProjectileAtPoint(launchPoint, realTargetPosition, horizSpeed, gravity, actorName, impactActorName, impactAnimationLifetime); + let cmpProjectileManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ProjectileManager); + data.projectileId = cmpProjectileManager.LaunchProjectileAtPoint(launchPoint, data.position, horizSpeed, gravity, actorName, impactActorName, impactAnimationLifetime); - let attackImpactSound = ""; let cmpSound = Engine.QueryInterface(this.entity, IID_Sound); - if (cmpSound) - attackImpactSound = cmpSound.GetSoundGroup("attack_impact_" + type.toLowerCase()); + data.attackImpactSound = cmpSound ? cmpSound.GetSoundGroup("attack_impact_" + type.toLowerCase()) : ""; - data.position = realTargetPosition; - data.direction = missileDirection; - data.projectileId = id; - data.attackImpactSound = attackImpactSound; - data.splash = this.GetSplashData(type); data.friendlyFire = this.template[type].Projectile.FriendlyFire == "true"; - - cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_DelayedDamage, "MissileHit", +this.template[type].Delay + timeToTarget * 1000, data); } else - Attacking.HandleAttackEffects(target, data); + { + data.position = targetPosition; + data.direction = Vector3D.sub(targetPosition, selfPosition); + } + if (delay) + { + let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); + cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_DelayedDamage, "Hit", delay, data); + } + else + Engine.QueryInterface(SYSTEM_ENTITY, IID_DelayedDamage).Hit(data, 0); }; Attack.prototype.OnValueModification = function(msg) @@ -648,20 +596,20 @@ cmpUnitAI.UpdateRangeQueries(); }; -Attack.prototype.GetRangeOverlays = function() +Attack.prototype.GetRangeOverlays = function(type = "Ranged") { - if (!this.template.Ranged || !this.template.Ranged.RangeOverlay) + if (!this.template[type] || !this.template[type].RangeOverlay) return []; - let range = this.GetRange("Ranged"); + let range = this.GetRange(type); let rangeOverlays = []; for (let i in range) if ((i == "min" || i == "max") && range[i]) rangeOverlays.push({ "radius": range[i], - "texture": this.template.Ranged.RangeOverlay.LineTexture, - "textureMask": this.template.Ranged.RangeOverlay.LineTextureMask, - "thickness": +this.template.Ranged.RangeOverlay.LineThickness, + "texture": this.template[type].RangeOverlay.LineTexture, + "textureMask": this.template[type].RangeOverlay.LineTextureMask, + "thickness": +this.template[type].RangeOverlay.LineThickness, }); return rangeOverlays; }; 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 @@ -15,14 +15,13 @@ DelayedDamage.prototype.MISSILE_HIT_RADIUS = 2; /** - * Handles hit logic after the projectile travel time has passed. + * Handles hit logic (after a delay has passed). * @param {Object} data - The data sent by the caller. * @param {string} data.type - The type of damage. * @param {Object} data.attackData - Data of the form { 'effectType': { ...opaque effect data... }, 'Bonuses': {...} }. * @param {number} data.target - The entity id of the target. * @param {number} data.attacker - The entity id of the attacker. * @param {number} data.attackerOwner - The player id of the owner of the attacker. - * @param {Vector2D} data.origin - The origin of the projectile hit. * @param {Vector3D} data.position - The expected position of the target. * @param {number} data.projectileId - The id of the projectile. * @param {Vector3D} data.direction - The unit vector defining the direction. @@ -34,16 +33,14 @@ * @param {string} data.splash.shape - The shape of the splash range. * @param {Object} data.splash.attackData - same as attackData, for splash. */ -DelayedDamage.prototype.MissileHit = function(data, lateness) +DelayedDamage.prototype.Hit = function(data, lateness) { if (!data.position) return; - let cmpSoundManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_SoundManager); - if (cmpSoundManager && data.attackImpactSound) - cmpSoundManager.PlaySoundGroupAtPosition(data.attackImpactSound, data.position); + if (data.attackImpactSound) + Engine.QueryInterface(SYSTEM_ENTITY, IID_SoundManager).PlaySoundGroupAtPosition(data.attackImpactSound, data.position); - // Do this first in case the direct hit kills the target. if (data.splash) Attacking.CauseDamageOverArea({ "type": data.type, @@ -57,14 +54,20 @@ "friendlyFire": data.splash.friendlyFire }); - let cmpProjectileManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ProjectileManager); - - let target = data.target; // Since we can't damage mirages, replace a miraged target by the real target. + let target = data.target; let cmpMirage = Engine.QueryInterface(data.target, IID_Mirage); if (cmpMirage) target = cmpMirage.GetParent(); + if (!data.projectileId) + { + Attacking.HandleAttackEffects(target, data); + return; + } + + let cmpProjectileManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ProjectileManager); + // Deal direct damage if we hit the main target // and we could handle the attack. if (PositionHelper.TestCollision(target, data.position, lateness) && 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 @@ -107,7 +107,7 @@ }); AddMock(SYSTEM_ENTITY, IID_DelayedDamage, { - "MissileHit": () => { + "Hit": () => { damageTaken = true; }, }); @@ -478,7 +478,7 @@ "GetEnemies": () => [2] }); - cmpDelayedDamage.MissileHit(data, 0); + cmpDelayedDamage.Hit(data, 0); TS_ASSERT(hitEnts.has(60)); hitEnts.clear(); @@ -510,13 +510,13 @@ "GetShape": () => ({ "type": "circle", "radius": 20 }) }); - cmpDelayedDamage.MissileHit(data, 0); + cmpDelayedDamage.Hit(data, 0); TS_ASSERT(hitEnts.has(61)); hitEnts.clear(); // Make sure we don't corrupt other tests. DeleteMock(60, IID_Mirage); - cmpDelayedDamage.MissileHit(data, 0); + cmpDelayedDamage.Hit(data, 0); TS_ASSERT(hitEnts.has(60)); hitEnts.clear(); @@ -539,7 +539,7 @@ "ExecuteQueryAroundPos": () => [61] }); - cmpDelayedDamage.MissileHit(data, 0); + cmpDelayedDamage.Hit(data, 0); TS_ASSERT(hitEnts.has(61)); hitEnts.clear(); @@ -589,7 +589,7 @@ "GetShape": () => ({ "type": "circle", "radius": 20 }), }); - cmpDelayedDamage.MissileHit(data, 0); + cmpDelayedDamage.Hit(data, 0); TS_ASSERT(hitEnts.has(61)); TS_ASSERT_EQUALS(dealtDamage, 100 + 200); dealtDamage = 0; @@ -616,35 +616,35 @@ }); data.attackData.Bonuses = bonus; - cmpDelayedDamage.MissileHit(data, 0); + cmpDelayedDamage.Hit(data, 0); TS_ASSERT(hitEnts.has(61)); TS_ASSERT_EQUALS(dealtDamage, 400 * 100 + 200); dealtDamage = 0; hitEnts.clear(); data.splash.attackData.Bonuses = splashBonus; - cmpDelayedDamage.MissileHit(data, 0); + cmpDelayedDamage.Hit(data, 0); TS_ASSERT(hitEnts.has(61)); TS_ASSERT_EQUALS(dealtDamage, 400 * 100 + 10000 * 200); dealtDamage = 0; hitEnts.clear(); data.attackData.Bonuses = undefined; - cmpDelayedDamage.MissileHit(data, 0); + cmpDelayedDamage.Hit(data, 0); TS_ASSERT(hitEnts.has(61)); TS_ASSERT_EQUALS(dealtDamage, 100 + 10000 * 200); dealtDamage = 0; hitEnts.clear(); data.attackData.Bonuses = null; - cmpDelayedDamage.MissileHit(data, 0); + cmpDelayedDamage.Hit(data, 0); TS_ASSERT(hitEnts.has(61)); TS_ASSERT_EQUALS(dealtDamage, 100 + 10000 * 200); dealtDamage = 0; hitEnts.clear(); data.attackData.Bonuses = {}; - cmpDelayedDamage.MissileHit(data, 0); + cmpDelayedDamage.Hit(data, 0); TS_ASSERT(hitEnts.has(61)); TS_ASSERT_EQUALS(dealtDamage, 100 + 10000 * 200); dealtDamage = 0; @@ -696,7 +696,7 @@ "GetShape": () => ({ "type": "circle", "radius": 20 }), }); - cmpDelayedDamage.MissileHit(data, 0); + cmpDelayedDamage.Hit(data, 0); TS_ASSERT(hitEnts.has(61)); TS_ASSERT_EQUALS(dealtDamage, 100 + 200); dealtDamage = 0; 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 @@ -7,10 +7,8 @@ 25 60 - 0 1200 2000 - 0 100 1.5 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 @@ -13,10 +13,8 @@ 12 60 - 0 1200 2000 - 0 100 1.5 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 @@ -7,7 +7,6 @@ 10 1200 2000 - 0 100 1.5 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 @@ -7,10 +7,8 @@ 16 60 - 0 1200 2000 - 0 100 1.5 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry.xml @@ -14,6 +14,8 @@ 1000 2 + 1000 + !Domestic Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_archer.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_archer.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_archer.xml @@ -7,10 +7,8 @@ 7 60 - 0 500 1000 - 0 100 2 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_crossbowman.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_crossbowman.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_crossbowman.xml @@ -7,10 +7,8 @@ 20 60 - 0 2400 3000 - 0 120 2 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_javelineer.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_javelineer.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_javelineer.xml @@ -7,10 +7,8 @@ 18 30 - 0 750 1250 - 0 70 4 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 @@ -7,10 +7,8 @@ 14 60 - 0 500 1000 - 0 100 0.8 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_crossbowman.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_crossbowman.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_crossbowman.xml @@ -7,10 +7,8 @@ 40 60 - 0 2400 3000 - 0 120 0.8 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_javelineer.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_javelineer.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_javelineer.xml @@ -7,10 +7,8 @@ 36 30 - 0 750 1250 - 0 70 1.6 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 @@ -7,10 +7,8 @@ 13.5 60 - 0 500 1000 - 0 100 0.8 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_crossbowman.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_crossbowman.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_crossbowman.xml @@ -7,10 +7,8 @@ 40 60 - 0 2400 3000 - 0 120 0.8 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_javelineer.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_javelineer.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_javelineer.xml @@ -7,10 +7,8 @@ 26 30 - 0 500 1000 - 0 70 1.6 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_elephant_archer.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_elephant_archer.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_elephant_archer.xml @@ -7,10 +7,8 @@ 14 60 - 0 500 1000 - 0 100 2 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 @@ -7,10 +7,8 @@ 28 60 - 0 500 1000 - 0 100 0.4 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_crossbowman.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_crossbowman.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_crossbowman.xml @@ -7,10 +7,8 @@ 80 60 - 0 2400 3000 - 0 120 0.4 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_javelineer.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_javelineer.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_javelineer.xml @@ -7,10 +7,8 @@ 60 30 - 0 750 1250 - 0 70 0.8 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 @@ -7,10 +7,8 @@ 27 60 - 0 500 1000 - 0 100 0.4 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_crossbowman.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_crossbowman.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_crossbowman.xml @@ -7,10 +7,8 @@ 80 60 - 0 2400 3000 - 0 120 0.4 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_javelineer.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_javelineer.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_hero_infantry_javelineer.xml @@ -7,10 +7,8 @@ 50 30 - 0 600 1000 - 0 70 0.8 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry.xml @@ -14,6 +14,8 @@ 1000 2 + 1000 + !Domestic Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_archer.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_archer.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_archer.xml @@ -7,10 +7,8 @@ 6.7 60 - 0 500 1000 - 0 100 2 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_crossbowman.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_crossbowman.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_crossbowman.xml @@ -7,10 +7,8 @@ 20 60 - 0 2400 3000 - 0 120 2 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_javelineer.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_javelineer.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_javelineer.xml @@ -7,10 +7,8 @@ 16 30 - 0 750 1250 - 0 70 4 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_slinger.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_slinger.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_slinger.xml @@ -8,10 +8,8 @@ 1.1 45 - 0 750 1250 - 0 90 3 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 @@ -7,10 +7,8 @@ 35 45 - 0 1000 2000 - 0 100 2 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 @@ -10,7 +10,6 @@ 40 2000 5000 - 0 40 6 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 @@ -7,10 +7,8 @@ 35 55 - 0 1000 2000 - 0 100 2 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 @@ -10,7 +10,6 @@ 15 5000 6000 - 0 150 1 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 @@ -10,7 +10,6 @@ 40 6000 7000 - 0 40 6 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 @@ -12,7 +12,6 @@ 10 1200 2000 - 0 100 2 Index: ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_support_female_citizen.xml =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_support_female_citizen.xml +++ ps/trunk/binaries/data/mods/public/simulation/templates/template_unit_support_female_citizen.xml @@ -16,6 +16,8 @@ 1000 2 + 1000 + !Domestic 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 @@ -11,7 +11,6 @@ 80 0 10000 - 0 75 1 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 @@ -10,7 +10,6 @@ 10 2000 2000 - 0 10 2