diff --git a/binaries/data/mods/public/globalscripts/Templates.js b/binaries/data/mods/public/globalscripts/Templates.js index 411bfdf847..f125ec3c95 100644 --- a/binaries/data/mods/public/globalscripts/Templates.js +++ b/binaries/data/mods/public/globalscripts/Templates.js @@ -437,10 +437,12 @@ function GetTemplateDataHelper(template, player, auraTemplates, modifiers = {}) if (template.UnitMotion) { + const walkSpeed = getEntityValue("UnitMotion/WalkSpeed"); ret.speed = { - "walk": getEntityValue("UnitMotion/WalkSpeed"), + "walk": walkSpeed, + "run": walkSpeed, + "acceleration": getEntityValue("UnitMotion/Acceleration") }; - ret.speed.run = getEntityValue("UnitMotion/WalkSpeed"); if (template.UnitMotion.RunMultiplier) ret.speed.run *= getEntityValue("UnitMotion/RunMultiplier"); } diff --git a/binaries/data/mods/public/gui/common/tooltips.js b/binaries/data/mods/public/gui/common/tooltips.js index 2746ee055a..d20aa78d52 100644 --- a/binaries/data/mods/public/gui/common/tooltips.js +++ b/binaries/data/mods/public/gui/common/tooltips.js @@ -1005,12 +1005,13 @@ function getSpeedTooltip(template) if (!template.speed) return ""; - let walk = template.speed.walk.toFixed(1); - let run = template.speed.run.toFixed(1); + const walk = template.speed.walk.toFixed(1); + const run = template.speed.run.toFixed(1); if (walk == 0 && run == 0) return ""; + const acceleration = template.speed.acceleration.toFixed(1); return sprintf(translate("%(label)s %(speeds)s"), { "label": headerFont(translate("Speed:")), "speeds": @@ -1022,6 +1023,11 @@ function getSpeedTooltip(template) sprintf(translate("%(speed)s %(movementType)s"), { "speed": run, "movementType": unitFont(translate("Run")) + }) + + commaFont(translate(", ")) + + sprintf(translate("%(speed)s %(movementType)s"), { + "speed": acceleration, + "movementType": unitFont(translate("Acceleration")) }) }); } diff --git a/binaries/data/mods/public/simulation/components/Formation.js b/binaries/data/mods/public/simulation/components/Formation.js index 6a9dd9e798..086ef3241a 100644 --- a/binaries/data/mods/public/simulation/components/Formation.js +++ b/binaries/data/mods/public/simulation/components/Formation.js @@ -895,17 +895,22 @@ Formation.prototype.ComputeMotionParameters = function() { let maxRadius = 0; let minSpeed = Infinity; + let minAcceleration = Infinity; for (let ent of this.members) { let cmpUnitMotion = Engine.QueryInterface(ent, IID_UnitMotion); if (cmpUnitMotion) + { minSpeed = Math.min(minSpeed, cmpUnitMotion.GetWalkSpeed()); + minAcceleration = Math.min(minAcceleration, cmpUnitMotion.GetAcceleration()); + } } minSpeed *= this.GetSpeedMultiplier(); let cmpUnitMotion = Engine.QueryInterface(this.entity, IID_UnitMotion); cmpUnitMotion.SetSpeedMultiplier(minSpeed / cmpUnitMotion.GetWalkSpeed()); + cmpUnitMotion.SetAcceleration(minAcceleration); }; Formation.prototype.ShapeUpdate = function() diff --git a/binaries/data/mods/public/simulation/components/GuiInterface.js b/binaries/data/mods/public/simulation/components/GuiInterface.js index f6adf74015..34d528c1f7 100644 --- a/binaries/data/mods/public/simulation/components/GuiInterface.js +++ b/binaries/data/mods/public/simulation/components/GuiInterface.js @@ -585,7 +585,8 @@ GuiInterface.prototype.GetEntityState = function(player, ent) if (cmpUnitMotion) ret.speed = { "walk": cmpUnitMotion.GetWalkSpeed(), - "run": cmpUnitMotion.GetWalkSpeed() * cmpUnitMotion.GetRunMultiplier() + "run": cmpUnitMotion.GetWalkSpeed() * cmpUnitMotion.GetRunMultiplier(), + "acceleration": cmpUnitMotion.GetAcceleration() }; let cmpUpkeep = Engine.QueryInterface(ent, IID_Upkeep); diff --git a/binaries/data/mods/public/simulation/components/UnitMotionFlying.js b/binaries/data/mods/public/simulation/components/UnitMotionFlying.js index 277a445f84..fe16744210 100644 --- a/binaries/data/mods/public/simulation/components/UnitMotionFlying.js +++ b/binaries/data/mods/public/simulation/components/UnitMotionFlying.js @@ -345,6 +345,16 @@ UnitMotionFlying.prototype.GetSpeedMultiplier = function() return this.speed / +this.template.MaxSpeed; }; +UnitMotionFlying.prototype.GetAcceleration = function() +{ + return +this.template.AccelRate; +}; + +UnitMotionFlying.prototype.SetAcceleration = function() +{ + // Acceleration is set by the template. Ignore. +}; + UnitMotionFlying.prototype.GetPassabilityClassName = function() { return this.template.PassabilityClass; diff --git a/binaries/data/mods/public/simulation/components/tests/test_UnitAI.js b/binaries/data/mods/public/simulation/components/tests/test_UnitAI.js index ddfcc81b72..ed70aec2fa 100644 --- a/binaries/data/mods/public/simulation/components/tests/test_UnitAI.js +++ b/binaries/data/mods/public/simulation/components/tests/test_UnitAI.js @@ -94,6 +94,7 @@ TestTargetEntityRenaming( "MoveToTargetRange": () => true, "GetRunMultiplier": () => 1, "SetSpeedMultiplier": () => {}, + "GetAcceleration": () => 1, "StopMoving": () => {} }); @@ -168,6 +169,7 @@ function TestFormationExiting(mode) AddMock(unit, IID_UnitMotion, { "GetWalkSpeed": () => 1, + "GetAcceleration": () => 1, "MoveToFormationOffset": (target, x, z) => {}, "MoveToTargetRange": (target, min, max) => true, "SetMemberOfFormation": () => {}, @@ -243,6 +245,7 @@ function TestFormationExiting(mode) "GetWalkSpeed": () => 1, "StopMoving": () => {}, "SetSpeedMultiplier": () => {}, + "SetAcceleration": (accel) => {}, "MoveToPointRange": () => true, "SetFacePointAfterMove": () => {}, "GetFacePointAfterMove": () => true, @@ -348,6 +351,7 @@ function TestMoveIntoFormationWhileAttacking() AddMock(unit + i, IID_UnitMotion, { "GetWalkSpeed": () => 1, + "GetAcceleration": () => 1, "MoveToFormationOffset": (target, x, z) => {}, "MoveToTargetRange": (target, min, max) => true, "SetMemberOfFormation": () => {}, @@ -414,6 +418,7 @@ function TestMoveIntoFormationWhileAttacking() AddMock(controller, IID_UnitMotion, { "GetWalkSpeed": () => 1, "SetSpeedMultiplier": (speed) => {}, + "SetAcceleration": (accel) => {}, "MoveToPointRange": (x, z, minRange, maxRange) => {}, "StopMoving": () => {}, "SetFacePointAfterMove": () => {}, diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_camel.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_camel.xml index b0c5af7937..1a661c121a 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_camel.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_camel.xml @@ -27,6 +27,7 @@ 0.45 + 0.45 fauna/camel.xml diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_chicken.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_chicken.xml index e63b2ac537..5e5af8053f 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_chicken.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_chicken.xml @@ -42,6 +42,7 @@ 0.15 + 0.15 fauna/chicken.xml diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_crocodile_nile.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_crocodile_nile.xml index 44512fe3f0..4622572fc0 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_crocodile_nile.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_crocodile_nile.xml @@ -47,6 +47,7 @@ 0.3 + 0.3 fauna/crocodile.xml diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_donkey.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_donkey.xml index 1923deaf19..cb40e29f9e 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_donkey.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_donkey.xml @@ -28,6 +28,7 @@ 0.8 + 0.8 fauna/donkey.xml diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_giraffe.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_giraffe.xml index b1f1009d39..f8de339e96 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_giraffe.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_giraffe.xml @@ -20,6 +20,7 @@ 0.6 + 0.6 fauna/giraffe_adult.xml diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_giraffe_infant.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_giraffe_infant.xml index ba35c672f9..edb3d229bc 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_giraffe_infant.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_giraffe_infant.xml @@ -20,6 +20,7 @@ 0.6 + 0.6 fauna/giraffe_baby.xml diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_goat.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_goat.xml index 412e78e967..a4b32154e9 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_goat.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_goat.xml @@ -35,6 +35,7 @@ 0.45 + 0.45 fauna/goat.xml diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_horse.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_horse.xml index eaeafcae40..71fa19997b 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_horse.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_horse.xml @@ -28,6 +28,7 @@ 0.8 + 0.8 fauna/horse.xml diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_lion.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_lion.xml index 43d329bd73..795310326e 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_lion.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_lion.xml @@ -36,6 +36,7 @@ 0.45 + 0.45 fauna/lion.xml diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_peacock.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_peacock.xml index 8a46d5e717..224b6d65f5 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_peacock.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_peacock.xml @@ -40,6 +40,7 @@ 0.3 + 0.3 fauna/peacock.xml diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_pig.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_pig.xml index 2f2fb9dfe4..14afb3b4a4 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_pig.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_pig.xml @@ -35,6 +35,7 @@ 0.45 + 0.45 fauna/pig1.xml diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_pig_flaming.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_pig_flaming.xml index 115e5780a8..4f10491f54 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_pig_flaming.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_pig_flaming.xml @@ -29,6 +29,7 @@ 3.5 + 3.5 diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_piglet.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_piglet.xml index 60465bc1ab..7aa56b531c 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_piglet.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_piglet.xml @@ -19,6 +19,7 @@ 0.25 + 0.25 fauna/piglet.xml diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_shark.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_shark.xml index c8098de1a3..80f224ad66 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_shark.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_shark.xml @@ -45,6 +45,7 @@ ship-small 0.6 + 0.6 false diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_sheep.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_sheep.xml index ca8b196b72..e66353c81b 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_sheep.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_sheep.xml @@ -35,6 +35,7 @@ 0.45 + 0.45 fauna/sheep3.xml diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_wildebeest.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_wildebeest.xml index 96ee0f036f..2961c72009 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_wildebeest.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_wildebeest.xml @@ -20,6 +20,7 @@ 0.9 + 0.9 fauna/wildebeest.xml diff --git a/binaries/data/mods/public/simulation/templates/gaia/fauna_zebra.xml b/binaries/data/mods/public/simulation/templates/gaia/fauna_zebra.xml index 5cbeb6ea19..ea6af3fa70 100644 --- a/binaries/data/mods/public/simulation/templates/gaia/fauna_zebra.xml +++ b/binaries/data/mods/public/simulation/templates/gaia/fauna_zebra.xml @@ -20,6 +20,7 @@ 0.9 + 0.9 fauna/zebra.xml diff --git a/binaries/data/mods/public/simulation/templates/template_formation.xml b/binaries/data/mods/public/simulation/templates/template_formation.xml index d26e71f089..99b90fa9ed 100644 --- a/binaries/data/mods/public/simulation/templates/template_formation.xml +++ b/binaries/data/mods/public/simulation/templates/template_formation.xml @@ -69,8 +69,10 @@ true - 1.0 - 100.0 + 1 + 100 + 0.1 + 100 large diff --git a/binaries/data/mods/public/simulation/templates/template_unit.xml b/binaries/data/mods/public/simulation/templates/template_unit.xml index d8dbb35c73..76c9c8ede6 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit.xml @@ -123,8 +123,10 @@ false default - 9.0 + 9 1.67 + 1.5 + 18 false diff --git a/binaries/data/mods/public/simulation/templates/template_unit_catafalque.xml b/binaries/data/mods/public/simulation/templates/template_unit_catafalque.xml index 3cad7fc2ea..1c4029d29b 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_catafalque.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_catafalque.xml @@ -52,6 +52,7 @@ large 0.55 + 0.275 units/global/catafalque.xml diff --git a/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_archer.xml b/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_archer.xml index 4463513126..504a62e5ef 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_archer.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_archer.xml @@ -36,5 +36,6 @@ 0.85 + 0.85 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_crossbowman.xml b/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_crossbowman.xml index f7f115082b..793b00247a 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_crossbowman.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_crossbowman.xml @@ -41,5 +41,6 @@ 0.8 + 0.8 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_javelineer.xml b/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_javelineer.xml index dc8557b253..2276026d7d 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_javelineer.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_cavalry_ranged_javelineer.xml @@ -36,5 +36,6 @@ 0.9 + 0.9 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_archer.xml b/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_archer.xml index 97335a1de9..bfcc411012 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_archer.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_archer.xml @@ -42,5 +42,6 @@ 0.85 + 0.85 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_crossbowman.xml b/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_crossbowman.xml index 40c1b42760..c5c92da291 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_crossbowman.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_crossbowman.xml @@ -42,5 +42,6 @@ 0.8 + 0.8 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_javelineer.xml b/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_javelineer.xml index d9cbb16587..cc2b203246 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_javelineer.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_champion_cavalry_javelineer.xml @@ -42,5 +42,6 @@ 0.9 + 0.9 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_champion_elephant.xml b/binaries/data/mods/public/simulation/templates/template_unit_champion_elephant.xml index d441a209c3..e2c5852125 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_champion_elephant.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_champion_elephant.xml @@ -55,6 +55,7 @@ large + 0.5 100 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_archer.xml b/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_archer.xml index eb63b8c502..cd2b8c0243 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_archer.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_archer.xml @@ -46,5 +46,6 @@ 1.2 + 2.4 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_crossbowman.xml b/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_crossbowman.xml index 32c8bce84f..b1e6e3ea8e 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_crossbowman.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_crossbowman.xml @@ -46,5 +46,6 @@ 0.6 + 1.2 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_javelineer.xml b/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_javelineer.xml index 27bf908e87..1f3eae6c0e 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_javelineer.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_javelineer.xml @@ -46,5 +46,6 @@ 1.2 + 1.2 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_pikeman.xml b/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_pikeman.xml index 4c6af8a288..a932fe0fbd 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_pikeman.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_champion_infantry_pikeman.xml @@ -46,5 +46,6 @@ 0.9 + 0.9 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_dog.xml b/binaries/data/mods/public/simulation/templates/template_unit_dog.xml index 492822196b..335674a57e 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_dog.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_dog.xml @@ -67,6 +67,7 @@ 1.5 2 + 1.5 30 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_elephant.xml b/binaries/data/mods/public/simulation/templates/template_unit_elephant.xml index b33b945600..abba4e7ae1 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_elephant.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_elephant.xml @@ -54,6 +54,7 @@ large + 0.5 100 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_fauna.xml b/binaries/data/mods/public/simulation/templates/template_unit_fauna.xml index 439d289732..e755d31f14 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_fauna.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_fauna.xml @@ -46,6 +46,7 @@ 0.7 + 0.7 true diff --git a/binaries/data/mods/public/simulation/templates/template_unit_fauna_herd_domestic_cattle.xml b/binaries/data/mods/public/simulation/templates/template_unit_fauna_herd_domestic_cattle.xml index 45772808cc..6144838f30 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_fauna_herd_domestic_cattle.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_fauna_herd_domestic_cattle.xml @@ -11,5 +11,6 @@ 0.4 1.4 + 0.4 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_defensive_bull.xml b/binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_defensive_bull.xml index 0d34c73de7..16719b6245 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_defensive_bull.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_defensive_bull.xml @@ -16,5 +16,6 @@ large 0.4 2.0 + 0.4 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_defensive_elephant.xml b/binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_defensive_elephant.xml index 63ca0eabfa..88e287040f 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_defensive_elephant.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_defensive_elephant.xml @@ -21,5 +21,6 @@ large 0.5 + 0.25 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_whale.xml b/binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_whale.xml index 94ed4d258e..d4a60ed2b7 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_whale.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_fauna_hunt_whale.xml @@ -55,5 +55,6 @@ ship-small 1.8 1 + 1.8 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_fauna_wild_aggressive_dog.xml b/binaries/data/mods/public/simulation/templates/template_unit_fauna_wild_aggressive_dog.xml index 209748433e..41c5d7513c 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_fauna_wild_aggressive_dog.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_fauna_wild_aggressive_dog.xml @@ -14,5 +14,6 @@ 1.6 + 1.6 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_archer.xml b/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_archer.xml index 25eb8846a0..9be65c1944 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_archer.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_archer.xml @@ -42,5 +42,6 @@ 0.85 + 0.85 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_crossbowman.xml b/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_crossbowman.xml index d0c6210471..f723b77c92 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_crossbowman.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_crossbowman.xml @@ -42,5 +42,6 @@ 0.8 + 0.8 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_javelineer.xml b/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_javelineer.xml index a34a374df1..f8a81a7980 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_javelineer.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_hero_cavalry_javelineer.xml @@ -42,5 +42,6 @@ 0.9 + 0.9 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_hero_elephant_melee.xml b/binaries/data/mods/public/simulation/templates/template_unit_hero_elephant_melee.xml index dab20e71c9..fc5c284dbb 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_hero_elephant_melee.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_hero_elephant_melee.xml @@ -73,5 +73,6 @@ large + 0.5 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_infantry_melee_pikeman.xml b/binaries/data/mods/public/simulation/templates/template_unit_infantry_melee_pikeman.xml index 9a18d5bfd3..2109a0c8cd 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_infantry_melee_pikeman.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_infantry_melee_pikeman.xml @@ -50,5 +50,6 @@ 0.9 + 0.9 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_archer.xml b/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_archer.xml index 645875181e..37425587da 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_archer.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_archer.xml @@ -48,5 +48,6 @@ 1.2 + 2.4 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_crossbowman.xml b/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_crossbowman.xml index 7ca8bb74eb..1c0de449f2 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_crossbowman.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_crossbowman.xml @@ -49,5 +49,6 @@ 0.6 + 1.2 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_javelineer.xml b/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_javelineer.xml index d95d0b7034..f10506e076 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_javelineer.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_javelineer.xml @@ -47,5 +47,6 @@ 2.4 + 4.8 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_slinger.xml b/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_slinger.xml index 050f287746..4dad993052 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_slinger.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_slinger.xml @@ -49,5 +49,6 @@ 1.2 + 1.2 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_ship.xml b/binaries/data/mods/public/simulation/templates/template_unit_ship.xml index e90d7e7a3c..6f08a0385d 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_ship.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_ship.xml @@ -73,5 +73,7 @@ ship + 0.5 + 0.25 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_ship_bireme.xml b/binaries/data/mods/public/simulation/templates/template_unit_ship_bireme.xml index 331b123e7d..3eceb98834 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_ship_bireme.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_ship_bireme.xml @@ -59,6 +59,7 @@ 1.55 + 1.55 90 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_ship_fire.xml b/binaries/data/mods/public/simulation/templates/template_unit_ship_fire.xml index 6b6edb539d..3c4e5bbad7 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_ship_fire.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_ship_fire.xml @@ -47,6 +47,7 @@ ship-small 1.6 + 1.6 60 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_ship_fishing.xml b/binaries/data/mods/public/simulation/templates/template_unit_ship_fishing.xml index ddf9e65778..893cb62c50 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_ship_fishing.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_ship_fishing.xml @@ -71,6 +71,7 @@ ship-small 1.1 + 1.1 30 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_ship_merchant.xml b/binaries/data/mods/public/simulation/templates/template_unit_ship_merchant.xml index fd6666ffd2..ed3ea95642 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_ship_merchant.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_ship_merchant.xml @@ -39,6 +39,7 @@ ship-small 1.35 + 1.6 50 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_ship_quinquereme.xml b/binaries/data/mods/public/simulation/templates/template_unit_ship_quinquereme.xml index c7c36ac618..77d7298c00 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_ship_quinquereme.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_ship_quinquereme.xml @@ -67,6 +67,7 @@ 1.8 + 1.8 110 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_ship_trireme.xml b/binaries/data/mods/public/simulation/templates/template_unit_ship_trireme.xml index a832295d12..626beaf53b 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_ship_trireme.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_ship_trireme.xml @@ -62,6 +62,7 @@ 1.8 + 1.8 90 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_siege.xml b/binaries/data/mods/public/simulation/templates/template_unit_siege.xml index cb9cd24964..a3f00f6382 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_siege.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_siege.xml @@ -60,5 +60,7 @@ large 1 + 0.75 + 0.25 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_siege_boltshooter.xml b/binaries/data/mods/public/simulation/templates/template_unit_siege_boltshooter.xml index 592d04d75f..893947444e 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_siege_boltshooter.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_siege_boltshooter.xml @@ -71,6 +71,7 @@ 0.9 + 0.9 100 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_siege_ram.xml b/binaries/data/mods/public/simulation/templates/template_unit_siege_ram.xml index 846f53b545..ce18fe4f7b 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_siege_ram.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_siege_ram.xml @@ -59,6 +59,7 @@ 0.8 + 0.8 80 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_siege_stonethrower.xml b/binaries/data/mods/public/simulation/templates/template_unit_siege_stonethrower.xml index 8bc561da94..725ac2c573 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_siege_stonethrower.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_siege_stonethrower.xml @@ -64,6 +64,7 @@ 0.8 + 0.8 100 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_siege_tower.xml b/binaries/data/mods/public/simulation/templates/template_unit_siege_tower.xml index a2b9e7e786..08545390f3 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_siege_tower.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_siege_tower.xml @@ -95,6 +95,7 @@ 0.7 + 0.7 80 diff --git a/binaries/data/mods/public/simulation/templates/template_unit_support_elephant.xml b/binaries/data/mods/public/simulation/templates/template_unit_support_elephant.xml index 8f3fba0f3c..485dc870c7 100644 --- a/binaries/data/mods/public/simulation/templates/template_unit_support_elephant.xml +++ b/binaries/data/mods/public/simulation/templates/template_unit_support_elephant.xml @@ -70,6 +70,7 @@ large 0.6 + 0.3 50 diff --git a/binaries/data/mods/public/simulation/templates/units/brit/ship_trireme.xml b/binaries/data/mods/public/simulation/templates/units/brit/ship_trireme.xml index 93dbe03652..c2a1b149ca 100644 --- a/binaries/data/mods/public/simulation/templates/units/brit/ship_trireme.xml +++ b/binaries/data/mods/public/simulation/templates/units/brit/ship_trireme.xml @@ -23,6 +23,7 @@ 0.9 + 0.9 structures/celts/warship.xml diff --git a/binaries/data/mods/public/simulation/templates/units/gaul/champion_fanatic.xml b/binaries/data/mods/public/simulation/templates/units/gaul/champion_fanatic.xml index ec6f3532f4..6ae62f23c8 100644 --- a/binaries/data/mods/public/simulation/templates/units/gaul/champion_fanatic.xml +++ b/binaries/data/mods/public/simulation/templates/units/gaul/champion_fanatic.xml @@ -17,6 +17,7 @@ 1.4 + 1.4 units/gauls/infantry_spearman_c.xml diff --git a/binaries/data/mods/public/simulation/templates/units/gaul/ship_trireme.xml b/binaries/data/mods/public/simulation/templates/units/gaul/ship_trireme.xml index b4278adffa..bb05be6ee9 100644 --- a/binaries/data/mods/public/simulation/templates/units/gaul/ship_trireme.xml +++ b/binaries/data/mods/public/simulation/templates/units/gaul/ship_trireme.xml @@ -23,6 +23,7 @@ 0.9 + 0.9 structures/celts/warship.xml diff --git a/binaries/data/mods/public/simulation/templates/units/iber/ship_trireme.xml b/binaries/data/mods/public/simulation/templates/units/iber/ship_trireme.xml index b4cd39662e..cbda5c6567 100644 --- a/binaries/data/mods/public/simulation/templates/units/iber/ship_trireme.xml +++ b/binaries/data/mods/public/simulation/templates/units/iber/ship_trireme.xml @@ -24,6 +24,7 @@ 0.9 + 0.9 structures/iberians/warship.xml diff --git a/binaries/data/mods/public/simulation/templates/units/maur/ship_trireme.xml b/binaries/data/mods/public/simulation/templates/units/maur/ship_trireme.xml index 8c70376831..2f87b0f161 100644 --- a/binaries/data/mods/public/simulation/templates/units/maur/ship_trireme.xml +++ b/binaries/data/mods/public/simulation/templates/units/maur/ship_trireme.xml @@ -23,6 +23,7 @@ 0.9 + 0.9 structures/mauryas/trireme.xml diff --git a/binaries/data/mods/public/simulation/templates/units/rome/champion_infantry_spear_gladiator.xml b/binaries/data/mods/public/simulation/templates/units/rome/champion_infantry_spear_gladiator.xml index ae46ee4b07..0f4c74f967 100644 --- a/binaries/data/mods/public/simulation/templates/units/rome/champion_infantry_spear_gladiator.xml +++ b/binaries/data/mods/public/simulation/templates/units/rome/champion_infantry_spear_gladiator.xml @@ -36,6 +36,7 @@ 1.5 + 1.5 0.5 diff --git a/binaries/data/mods/public/simulation/templates/units/rome/champion_infantry_sword_gladiator.xml b/binaries/data/mods/public/simulation/templates/units/rome/champion_infantry_sword_gladiator.xml index dda976e7f5..9fd7855295 100644 --- a/binaries/data/mods/public/simulation/templates/units/rome/champion_infantry_sword_gladiator.xml +++ b/binaries/data/mods/public/simulation/templates/units/rome/champion_infantry_sword_gladiator.xml @@ -37,6 +37,7 @@ 1.4 + 1.4 0.5 diff --git a/source/simulation2/components/CCmpUnitMotion.h b/source/simulation2/components/CCmpUnitMotion.h index 709d0adca6..417bf65aba 100644 --- a/source/simulation2/components/CCmpUnitMotion.h +++ b/source/simulation2/components/CCmpUnitMotion.h @@ -153,7 +153,7 @@ public: bool m_IsFormationController; - fixed m_TemplateWalkSpeed, m_TemplateRunMultiplier; + fixed m_TemplateWalkSpeed, m_TemplateRunMultiplier, m_TemplateAcceleration; pass_class_t m_PassClass; std::string m_PassClassName; @@ -225,8 +225,12 @@ public: // This caches the resulting speed from m_WalkSpeed * m_SpeedMultiplier for convenience. fixed m_Speed; - // Current mean speed (over the last turn). - fixed m_CurSpeed; + // The speed achieved at the end of the current turn. + fixed m_CurrentSpeed; + + fixed m_InstantTurnAngle; + + fixed m_Acceleration; // Currently active paths (storing waypoints in reverse order). // The last item in each path is the point we're currently heading towards. @@ -244,15 +248,21 @@ public: "" "" "" - "" + "" "" "" "" - "" + "" "" "" "" - "" + "" + "" + "" + "" + "" + "" + "" "" "" "" @@ -270,12 +280,16 @@ public: m_WalkSpeed = m_TemplateWalkSpeed = m_Speed = paramNode.GetChild("WalkSpeed").ToFixed(); m_SpeedMultiplier = fixed::FromInt(1); - m_CurSpeed = fixed::Zero(); + m_CurrentSpeed = fixed::Zero(); m_RunMultiplier = m_TemplateRunMultiplier = fixed::FromInt(1); if (paramNode.GetChild("RunMultiplier").IsOk()) m_RunMultiplier = m_TemplateRunMultiplier = paramNode.GetChild("RunMultiplier").ToFixed(); + m_InstantTurnAngle = paramNode.GetChild("InstantTurnAngle").ToFixed(); + + m_Acceleration = m_TemplateAcceleration = paramNode.GetChild("Acceleration").ToFixed(); + CmpPtr cmpPathfinder(GetSystemEntity()); if (cmpPathfinder) { @@ -322,7 +336,11 @@ public: serialize.NumberFixed_Unbounded("speed multiplier", m_SpeedMultiplier); - serialize.NumberFixed_Unbounded("current speed", m_CurSpeed); + serialize.NumberFixed_Unbounded("current speed", m_CurrentSpeed); + + serialize.NumberFixed_Unbounded("instant turn angle", m_InstantTurnAngle); + + serialize.NumberFixed_Unbounded("acceleration", m_Acceleration); serialize.Bool("facePointAfterMove", m_FacePointAfterMove); serialize.Bool("pushing", m_Pushing); @@ -456,15 +474,25 @@ public: CFixedVector2D pos = cmpPosition->GetPosition2D(); entity_angle_t angle = cmpPosition->GetRotation().Y; - + fixed speed = m_CurrentSpeed; // Copy the path so we don't change it. WaypointPath shortPath = m_ShortPath; WaypointPath longPath = m_LongPath; - PerformMove(dt, cmpPosition->GetTurnRate(), shortPath, longPath, pos, angle); + PerformMove(dt, cmpPosition->GetTurnRate(), shortPath, longPath, pos, speed, angle); return pos; } + virtual fixed GetAcceleration() const + { + return m_Acceleration; + } + + virtual void SetAcceleration(fixed acceleration) + { + m_Acceleration = acceleration; + } + virtual pass_class_t GetPassabilityClass() const { return m_PassClass; @@ -485,7 +513,7 @@ public: virtual fixed GetCurrentSpeed() const { - return m_CurSpeed; + return m_CurrentSpeed; } virtual void SetFacePointAfterMove(bool facePointAfterMove) @@ -721,13 +749,13 @@ private: * This does not send actually change the position. * @returns true if the move was obstructed. */ - bool PerformMove(fixed dt, const fixed& turnRate, WaypointPath& shortPath, WaypointPath& longPath, CFixedVector2D& pos, entity_angle_t& angle) const; + bool PerformMove(fixed dt, const fixed& turnRate, WaypointPath& shortPath, WaypointPath& longPath, CFixedVector2D& pos, fixed& speed, entity_angle_t& angle) const; /** * Update other components on our speed. * (For performance, this should try to avoid sending messages). */ - void UpdateMovementState(entity_pos_t speed); + void UpdateMovementState(entity_pos_t speed, entity_pos_t meanSpeed); /** * React if our move was obstructed. @@ -993,7 +1021,7 @@ void CCmpUnitMotion::PreMove(CCmpUnitMotionManager::MotionState& state) // If we were idle and will still be, no need for an update. state.needUpdate = state.cmpPosition->IsInWorld() && - (m_CurSpeed != fixed::Zero() || m_MoveRequest.m_Type != MoveRequest::NONE); + (m_CurrentSpeed != fixed::Zero() || m_MoveRequest.m_Type != MoveRequest::NONE); if (!m_BlockMovement) return; @@ -1017,7 +1045,7 @@ void CCmpUnitMotion::Move(CCmpUnitMotionManager::MotionState& state, fixed dt) // to it, then throw away our current path and go straight to it. state.wentStraight = TryGoingStraightToTarget(state.initialPos, true); - state.wasObstructed = PerformMove(dt, state.cmpPosition->GetTurnRate(), m_ShortPath, m_LongPath, state.pos, state.angle); + state.wasObstructed = PerformMove(dt, state.cmpPosition->GetTurnRate(), m_ShortPath, m_LongPath, state.pos, state.speed, state.angle); } void CCmpUnitMotion::PostMove(CCmpUnitMotionManager::MotionState& state, fixed dt) @@ -1027,7 +1055,7 @@ void CCmpUnitMotion::PostMove(CCmpUnitMotionManager::MotionState& state, fixed d { if (state.angle != state.initialAngle) state.cmpPosition->TurnTo(state.angle); - UpdateMovementState(fixed::Zero()); + UpdateMovementState(fixed::Zero(), fixed::Zero()); } else { @@ -1041,7 +1069,7 @@ void CCmpUnitMotion::PostMove(CCmpUnitMotionManager::MotionState& state, fixed d state.cmpPosition->MoveAndTurnTo(state.pos.X, state.pos.Y, state.angle); // Calculate the mean speed over this past turn. - UpdateMovementState(offset.Length() / dt); + UpdateMovementState(state.speed, offset.Length() / dt); } if (state.wasObstructed && HandleObstructedMove(state.pos != state.initialPos)) @@ -1094,7 +1122,7 @@ bool CCmpUnitMotion::PossiblyAtDestination() const return false; } -bool CCmpUnitMotion::PerformMove(fixed dt, const fixed& turnRate, WaypointPath& shortPath, WaypointPath& longPath, CFixedVector2D& pos, entity_angle_t& angle) const +bool CCmpUnitMotion::PerformMove(fixed dt, const fixed& turnRate, WaypointPath& shortPath, WaypointPath& longPath, CFixedVector2D& pos, fixed& speed, entity_angle_t& angle) const { // If there are no waypoint, behave as though we were obstructed and let HandleObstructedMove handle it. if (shortPath.m_Waypoints.empty() && longPath.m_Waypoints.empty()) @@ -1151,21 +1179,26 @@ bool CCmpUnitMotion::PerformMove(fixed dt, const fixed& turnRate, WaypointPath& target = CFixedVector2D(shortPath.m_Waypoints.back().x, shortPath.m_Waypoints.back().z); CFixedVector2D offset = target - pos; - if (turnRate > zero && !offset.IsZero()) + + fixed angleDiff = angle - atan2_approx(offset.X, offset.Y); + fixed absoluteAngleDiff = angleDiff.Absolute(); + if (absoluteAngleDiff > entity_angle_t::Pi()) + absoluteAngleDiff = entity_angle_t::Pi() * 2 - absoluteAngleDiff; + + // We only rotate to the instantTurnAngle angle. The rest we rotate during movement. + if (absoluteAngleDiff > m_InstantTurnAngle) { - fixed maxRotation = turnRate.Multiply(timeLeft); - fixed angleDiff = angle - atan2_approx(offset.X, offset.Y); - if (angleDiff != zero) + // Stop moving when rotating this far. + speed = zero; + if (turnRate > zero && !offset.IsZero()) { - fixed absoluteAngleDiff = angleDiff.Absolute(); - if (absoluteAngleDiff > entity_angle_t::Pi()) - absoluteAngleDiff = entity_angle_t::Pi() * 2 - absoluteAngleDiff; + fixed maxRotation = turnRate.Multiply(timeLeft); // Figure out whether rotating will increase or decrease the angle, and how far we need to rotate in that direction. int direction = (entity_angle_t::Zero() < angleDiff && angleDiff <= entity_angle_t::Pi()) || angleDiff < -entity_angle_t::Pi() ? -1 : 1; // Can't rotate far enough, just rotate in the correct direction. - if (absoluteAngleDiff > maxRotation) + if (absoluteAngleDiff - m_InstantTurnAngle > maxRotation) { angle += maxRotation * direction; if (angle * direction > entity_angle_t::Pi()) @@ -1174,13 +1207,21 @@ bool CCmpUnitMotion::PerformMove(fixed dt, const fixed& turnRate, WaypointPath& } // Rotate towards the next waypoint and continue moving. angle = atan2_approx(offset.X, offset.Y); - // Give some 'free' rotation for angles below 0.5 radians. - timeLeft = (std::min(maxRotation, maxRotation - absoluteAngleDiff + fixed::FromInt(1)/2)) / turnRate; + timeLeft = std::min(maxRotation, maxRotation - absoluteAngleDiff + m_InstantTurnAngle) / turnRate; } } + else + { + // Modify the speed depending on the angle difference. + fixed sin, cos; + sincos_approx(angleDiff, sin, cos); + speed = speed.Multiply(cos); + } // Work out how far we can travel in timeLeft. - fixed maxdist = maxSpeed.Multiply(timeLeft); + fixed accelTime = std::min(timeLeft, (maxSpeed - speed) / m_Acceleration); + fixed accelDist = speed.Multiply(accelTime) + accelTime.Square().Multiply(m_Acceleration) / 2; + fixed maxdist = accelDist + maxSpeed.Multiply(timeLeft - accelTime); // If the target is close, we can move there directly. fixed offsetLength = offset.Length(); @@ -1191,7 +1232,20 @@ bool CCmpUnitMotion::PerformMove(fixed dt, const fixed& turnRate, WaypointPath& pos = target; // Spend the rest of the time heading towards the next waypoint. - timeLeft = (maxdist - offsetLength) / maxSpeed; + // Either we still need to accelerate after, or we have reached maxSpeed. + // The former is much less likely than the latter: usually we can reach + // maxSpeed within one waypoint. So the Sqrt is not too bad. + if (offsetLength <= accelDist) + { + fixed requiredTime = (-speed + (speed.Square() + offsetLength.Multiply(m_Acceleration).Multiply(fixed::FromInt(2))).Sqrt()) / m_Acceleration; + timeLeft -= requiredTime; + speed += m_Acceleration.Multiply(requiredTime); + } + else + { + timeLeft -= accelTime + (offsetLength - accelDist) / maxSpeed; + speed = maxSpeed; + } if (shortPath.m_Waypoints.empty()) longPath.m_Waypoints.pop_back(); @@ -1212,6 +1266,8 @@ bool CCmpUnitMotion::PerformMove(fixed dt, const fixed& turnRate, WaypointPath& offset.Normalize(maxdist); target = pos + offset; + speed = std::min(maxSpeed, speed + m_Acceleration.Multiply(timeLeft)); + if (cmpPathfinder->CheckMovement(GetObstructionFilter(specificIgnore), pos.X, pos.Y, target.X, target.Y, m_Clearance, m_PassClass)) pos = target; else @@ -1223,18 +1279,18 @@ bool CCmpUnitMotion::PerformMove(fixed dt, const fixed& turnRate, WaypointPath& return false; } -void CCmpUnitMotion::UpdateMovementState(entity_pos_t speed) +void CCmpUnitMotion::UpdateMovementState(entity_pos_t speed, entity_pos_t meanSpeed) { CmpPtr cmpVisual(GetEntityHandle()); if (cmpVisual) { - if (speed == fixed::Zero()) + if (meanSpeed == fixed::Zero()) cmpVisual->SelectMovementAnimation("idle", fixed::FromInt(1)); else - cmpVisual->SelectMovementAnimation(speed > (m_WalkSpeed / 2).Multiply(m_RunMultiplier + fixed::FromInt(1)) ? "run" : "walk", speed); + cmpVisual->SelectMovementAnimation(meanSpeed > (m_WalkSpeed / 2).Multiply(m_RunMultiplier + fixed::FromInt(1)) ? "run" : "walk", meanSpeed); } - m_CurSpeed = speed; + m_CurrentSpeed = speed; } bool CCmpUnitMotion::HandleObstructedMove(bool moved) diff --git a/source/simulation2/components/CCmpUnitMotionManager.h b/source/simulation2/components/CCmpUnitMotionManager.h index 8641e66cd6..e32c94a259 100644 --- a/source/simulation2/components/CCmpUnitMotionManager.h +++ b/source/simulation2/components/CCmpUnitMotionManager.h @@ -60,6 +60,8 @@ public: // Accumulated "pushing" from nearby units. CFixedVector2D push; + fixed speed; + fixed initialAngle; fixed angle; diff --git a/source/simulation2/components/CCmpUnitMotion_System.cpp b/source/simulation2/components/CCmpUnitMotion_System.cpp index fc3938eba1..523278e8b4 100644 --- a/source/simulation2/components/CCmpUnitMotion_System.cpp +++ b/source/simulation2/components/CCmpUnitMotion_System.cpp @@ -167,6 +167,7 @@ void CCmpUnitMotionManager::Move(EntityMap& ents, fixed dt) it->second.initialPos = it->second.cmpPosition->GetPosition2D(); it->second.initialAngle = it->second.cmpPosition->GetRotation().Y; it->second.pos = it->second.initialPos; + it->second.speed = it->second.cmpUnitMotion->GetCurrentSpeed(); it->second.angle = it->second.initialAngle; ENSURE(it->second.pos.X.ToInt_RoundToZero() / PUSHING_GRID_SIZE < m_MovingUnits.width() && it->second.pos.Y.ToInt_RoundToZero() / PUSHING_GRID_SIZE < m_MovingUnits.height()); diff --git a/source/simulation2/components/ICmpUnitMotion.cpp b/source/simulation2/components/ICmpUnitMotion.cpp index 589d678808..96ce87bd79 100644 --- a/source/simulation2/components/ICmpUnitMotion.cpp +++ b/source/simulation2/components/ICmpUnitMotion.cpp @@ -37,6 +37,8 @@ DEFINE_INTERFACE_METHOD("GetWalkSpeed", ICmpUnitMotion, GetWalkSpeed) DEFINE_INTERFACE_METHOD("GetRunMultiplier", ICmpUnitMotion, GetRunMultiplier) DEFINE_INTERFACE_METHOD("EstimateFuturePosition", ICmpUnitMotion, EstimateFuturePosition) DEFINE_INTERFACE_METHOD("SetSpeedMultiplier", ICmpUnitMotion, SetSpeedMultiplier) +DEFINE_INTERFACE_METHOD("GetAcceleration", ICmpUnitMotion, GetAcceleration) +DEFINE_INTERFACE_METHOD("SetAcceleration", ICmpUnitMotion, SetAcceleration) DEFINE_INTERFACE_METHOD("GetPassabilityClassName", ICmpUnitMotion, GetPassabilityClassName) DEFINE_INTERFACE_METHOD("GetUnitClearance", ICmpUnitMotion, GetUnitClearance) DEFINE_INTERFACE_METHOD("SetFacePointAfterMove", ICmpUnitMotion, SetFacePointAfterMove) @@ -124,6 +126,16 @@ public: return m_Script.Call("EstimateFuturePosition", dt); } + virtual fixed GetAcceleration() const + { + return m_Script.Call("GetAcceleration"); + } + + virtual void SetAcceleration(fixed acceleration) + { + m_Script.CallVoid("SetAcceleration", acceleration); + } + virtual void SetFacePointAfterMove(bool facePointAfterMove) { m_Script.CallVoid("SetFacePointAfterMove", facePointAfterMove); diff --git a/source/simulation2/components/ICmpUnitMotion.h b/source/simulation2/components/ICmpUnitMotion.h index e85f0969a8..46661edde5 100644 --- a/source/simulation2/components/ICmpUnitMotion.h +++ b/source/simulation2/components/ICmpUnitMotion.h @@ -87,7 +87,7 @@ public: virtual void StopMoving() = 0; /** - * Get the distance travelled over the last turn. + * Get the speed at the end of the current turn. */ virtual fixed GetCurrentSpeed() const = 0; @@ -129,6 +129,17 @@ public: */ virtual CFixedVector2D EstimateFuturePosition(const fixed dt) const = 0; + /** + * Get the current acceleration. + */ + virtual fixed GetAcceleration() const = 0; + + /** + * Set the current acceleration. + * @param acceleration The acceleration. + */ + virtual void SetAcceleration(fixed acceleration) = 0; + /** * Set whether the unit will turn to face the target point after finishing moving. */