From 12badfa84bb15cb07d5f76689d54a11cba6ac692 Mon Sep 17 00:00:00 2001 From: Ferywir <65760459+Ferywir@users.noreply.github.com> Date: Tue, 30 Jun 2026 08:01:16 +0200 Subject: [PATCH] fix(troops): apply Tournament Square bonus only beyond the threshold [#304] (#317) procDistanceTime() multiplied the whole travel distance by the Tournament Square speed factor as soon as the distance reached TS_THRESHOLD. That made the trip time jump down at the threshold, so a target just past it arrived dramatically sooner than a nearer one (e.g. a village 41 tiles away raided faster than one 18 tiles away). In T3.6 the Tournament Square only speeds up the part of the journey beyond the threshold: the first TS_THRESHOLD tiles are walked at base speed and the remainder at the boosted speed. Split the computation accordingly so travel time stays monotonic with distance while still rewarding a high-level square. This is a long-standing bug, unrelated to the Generator refactor (which only reformatted the same whole-distance multiplication). The same fix is applied to the duplicate procDistanceTime() in Admin/database.php used by the admin troop-return helper. Co-authored-by: Claude Opus 4.8 --- GameEngine/Admin/database.php | 12 ++++++++++-- GameEngine/Generator.php | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/GameEngine/Admin/database.php b/GameEngine/Admin/database.php index 77230348..ebad51bc 100755 --- a/GameEngine/Admin/database.php +++ b/GameEngine/Admin/database.php @@ -676,8 +676,16 @@ class adm_DB { } $distance = SQRT(POW($xdistance, 2) + POW($ydistance, 2)); $speed = $ref; - if ($this->getTypeLevel(14, $vid)!= 0 && $distance >= TS_THRESHOLD) { - $speed = $speed * ($bid14[$this->getTypeLevel(14, $vid)]['attri'] / 100); + $tSquareLevel = $this->getTypeLevel(14, $vid); + + if ($tSquareLevel != 0 && $distance >= TS_THRESHOLD && $speed > 0) { + // Tournament Square only speeds up the part of the journey beyond + // the threshold (issue #304): the first TS_THRESHOLD tiles are + // walked at base speed and the remainder at the boosted speed. + $boostedSpeed = $speed * ($bid14[$tSquareLevel]['attri'] / 100); + $time = (TS_THRESHOLD / $speed) + (($distance - TS_THRESHOLD) / $boostedSpeed); + + return round($time * 3600 / INCREASE_SPEED); } if ($speed!= 0) { diff --git a/GameEngine/Generator.php b/GameEngine/Generator.php index 2f54fe7d..ab3d91de 100755 --- a/GameEngine/Generator.php +++ b/GameEngine/Generator.php @@ -98,8 +98,16 @@ class MyGenerator $tSquareLevel = $database->getFieldLevelInVillage($vid, 14); - if ($tSquareLevel > 0 && $distance >= TS_THRESHOLD) { - $speed *= ($bid14[$tSquareLevel]['attri'] / 100); + if ($tSquareLevel > 0 && $distance >= TS_THRESHOLD && $speed > 0) { + // Tournament Square only speeds up the part of the journey + // beyond the threshold: the first TS_THRESHOLD tiles are walked + // at base speed and the remainder at the boosted speed. + // Multiplying the whole distance made far targets arrive sooner + // than near ones (issue #304). + $boostedSpeed = $speed * ($bid14[$tSquareLevel]['attri'] / 100); + $time = (TS_THRESHOLD / $speed) + (($distance - TS_THRESHOLD) / $boostedSpeed); + + return round($time * 3600 / INCREASE_SPEED); } }