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.