From 5bdbdbfbf80b8409ae5bf6881a7b52d1bdc4426d Mon Sep 17 00:00:00 2001 From: Niko Marmeladkov Date: Fri, 16 Oct 2026 22:39:11 +0300 Subject: [PATCH] =?UTF-8?q?A19:=20=D0=BD=D0=B0=D0=B9=D0=B4=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=85=D0=B0=D0=BD=D0=B8=D0=B7=D0=BC=20=D0=B4=D0=B2?= =?UTF-8?q?=D0=B8=D0=B6=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BA?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D1=81=D1=82=D0=B8=20=D0=BD=D0=B0=20=D1=81?= =?UTF-8?q?=D0=BA=D0=BB=D0=BE=D0=BD=D0=B5=20(=D0=B2=D0=BE=D0=B7=D0=B2?= =?UTF-8?q?=D1=80=D0=B0=D1=82=20=D0=BF=D0=BE=D1=82=D0=B5=D1=80=D1=8F=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В gamemovement.cpp (ClipVelocity, строка ~3144) есть блок flRedirectCoeff: после отсечения вектор скорости растягивается вдоль скольжения на потерянную в плоскость компоненту (out *= (len + |v·n|·coeff)/len). Это и есть причина, по которой в движке на ходибельном склоне нет замедления. Коэффициент передаётся в TryPlayerMove третьим параметром; в базовом game 2013 он нулевой, у мода может быть своим. Наивный перенос проверен замером и провалился: если возвращать потерянное на каждом контакте каждого подшага, бонус копится за кадр — на 15° скорость ушла в 442 юнита/с. Правка откачена, дерево зелёное (23 сьюта, 28 картовых тестов). Правильный перенос записан в docs/PARITY.md E23.7: возврат считается один раз на отсечение, длина берётся до отсечения, результат ограничивается желаемой скоростью кадра; приёмка — таблица probe_slope_angles (до 44° не ниже 95% от 250). --- docs/PARITY.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/PARITY.md b/docs/PARITY.md index f317e65..9eb2df6 100644 --- a/docs/PARITY.md +++ b/docs/PARITY.md @@ -2979,3 +2979,29 @@ disp: построено 110, нарисовано 89, отсев: скайбо расстоянию, как в `CGameMovement::StepMove`, и чтобы подъём считался основной дорогой на ходибельном склоне. Приёмка — эта же таблица: до 44° скорость не ниже 95% от 250. + +### E23.7. Где движок берёт скорость на склоне + +Найдено в `gamemovement.cpp` (`ClipVelocity`, строка ~3144): + +```cpp + if ( flRedirectCoeff > 0.f ) + { + // Redirect clipped velocity along angle of movement + float flLen = out.Length(); + out *= ( -1.f * flBlocked * flRedirectCoeff + flLen ) / flLen; + } +``` + +`flBlocked` — это `v·n` до отсечения (отрицательное, движемся в плоскость), +`out` — уже отсечённая скорость. То есть движок **возвращает потерянную в +плоскость скорость**, растягивая вектор вдоль скольжения. Это и есть отсутствие +замедления на рампе. Коэффициент передаётся в `TryPlayerMove` третьим +параметром; в базовом `game` 2013 он равен нулю, у мода может быть своим. + +**Попытка перенести наивно — провалилась (замер).** Если возвращать потерянное +на каждом контакте каждого подшага, бонус накапливается за кадр: на 15° скорость +улетела в 442 юнита/с (в движке такого нет). Правильный перенос: возврат +считается **один раз на отсечение**, длина берётся **до** отсечения, и +результат ограничивается желаемой скоростью кадра. Правка откачена, приёмка +прежняя — таблица `probe_slope_angles`: до 44° не ниже 95% от 250.