A19: найден механизм движка для скорости на склоне (возврат потерянного)
Some checks are pending
CI / checks (push) Waiting to run

В 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).
This commit is contained in:
Niko Marmeladkov 2026-10-16 22:39:11 +03:00
parent e638607ee1
commit 5bdbdbfbf8

View file

@ -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.