Как мы выяснили в
статье про физику bhop'а, его успешность зависит от сочетания текущей скорости и числа FOG, то есть количества фреймов, проведённых на земле. И то, и другое мы можем узнать в реальном времени с помощью статистики прыжков, однако в зависимости от правил сообщества это может быть запрещено или облагаться штрафом при записи демок. В связи с этим возникает вопрос - возможно ли оценить bhop без помощи статы? Если величину скорости мы ещё можем предположить, то о количесте FOG можно было бы судить разве что по звуку. В kreedz сообществе существуют несколько заблуждений касательно того, насколько это осуществимо. Попробуем разобраться.
Звуки шагов
При обычном беге на земле звуки шагов проигрываются каждые 0.3 секунды, то есть 300 миллисекунд. За это отвечает счётчик
flTimeStepSound
, который приравнивается 300 в функции
PM_UpdateStepSound:
Эта функция вызывается каждый фрейм из
PM_PlayerMove, как и уже знакомая нам
PM_ReduceTimers, в которой все счётчики, в том числе и
flTimeStepSound
, уменьшаются на длительность фрейма в миллисекундах (то есть на 10 при 100 fps). Когда мы прыгаем на lj блоке,
flTimeStepSound
за время пребывания в воздухе постепенно уменьшается до нуля и остаётся нулевым вплоть до приземления. И как только мы оказались на земле, счётчик приравнивается 300, и мы тут же слышим звук шага.
Обратите внимание, что при скорости меньше 150 юнитов/с мы сразу выходим из
PM_UpdateStepSound, то есть передвижение будет бесшумным. Например, это произойдёт при зажатой клавише
Shift
, так как скорость с пистолетом в таком случае 250 * 0.52 = 130 юнитов/с, и даже со скаутом мы получаем лишь 260 * 0.52 = 135.2 юнита/с. Если же скорость достаточно большая, то помимо
flTimeStepSound
нам нужно задать коэффициент громкости
fvol
- при обычном беге он равен 0.5. В зависимости от условий громкость и периодичность могут меняться, например на лестнице и в присяде звук становится тише и проигрывается реже.
Теперь заглянем в
PM_PlayStepSound, которой передаются громкость
fvol
и тип текстуры
step
у нас под ногами:
Здесь происходит выбор конкретного звука для проигрывания, по 4 звука для каждого типа текстуры. При этом одна пара звуков условно соответствует правой ноге, а вторая пара левой, и благодаря переменной
iStepLeft
правая и левая нога неизменно чередуются. Выбор же звука внутри каждой пары происходит случайно, то есть игрок не может заранее предсказать, как именно будет звучать его следующий шаг.
Звук double duck
В
статье про физику countjump мы узнали, что между double duck'ами на ровной поверхности мы проводим 21 фрейм в воздухе. Казалось бы, за это время счётчик
flTimeStepSound
просто не успеет обнулиться, а значит часть double duck'ов должна оказаться беззвучными. Однако и для такого случая у движка припасена своя заготовка - внутри функции
PM_UnDuck при успешно выполненном переходе модельки в стоячее положение из
flTimeStepSound
вычитается 100. То есть даже если сделать всего один scroll duck, то в первый фрейм в воздухе
flTimeStepSound
уменьшится не на 10, а на 110. А если ещё и сделать пару scroll duck'ов воздухе, то
flTimeStepSound
тут же обратится в ноль. Так что если вы на ровной поверхности не услышали свой double duck, то это значит только одно - ваша скорость меньше 150 юнитов/с.
Звук bhop
В отличие от double duck'а для обычного бхопа на ровной поверхности 300 миллисекунд вполне достаточно, чтобы счётчик
flTimeStepSound
успел обнулиться в воздухе. Поэтому в момент приземления мы сразу же услышим звук шага. Но это ещё не всё. Функция
PM_PlayStepSound вызывается ещё и в
PM_Jump, то есть в момент прыжка (опять же при условии, что скорость больше 150 юнитов/с), причём с коэффициентом громкости 1.0. Если при bhop'е мы провели на земле всего один фрейм, то в нём
PM_PlayStepSound будет вызвана дважды - один раз из-за приземления, а второй из-за прыжка. Однако первый звук будет просто проигнорирован, и мы услышим только второй звук в чистом виде:
Если же мы провели на земле два фрейма, то проиграются оба звука. Поскольку время между ними очень мало, они фактически сольются в один звук, но доминирующим по-прежнему будет второй из них (его громкость в два раза больше). Конечный результат будет зависеть от каждой конкретной пары:
Здесь хорошо видно, что лишь половина пар отличаются от аналогичных вариантов для FOG1. Например, step1+step4 для FOG2 имеет более выраженное начало, чем step1+step4 для FOG1, однако step3+step4 для FOG2 и FOG1 практически неотличим. При последовательных bhop'ах (без остановок и double duck'ов) мы всегда будем слышать либо сначала правый шаг, а затем левый, либо наоборот. То есть из 8 вариантов сочетаний FOG2 мы сможем услышать 4. Однако даже это не сильно поможет нам, поскольку из 4 пар две будут по-прежнему неотличимы от своих аналогов для FOG1.
Таким образом, звук FOG2 лишь в половине случаев отличается от FOG1. Мало того, звучание каждый пары может немного меняться от случая к случаю. Вот, к примеру, пара step3+step2, записанная в разное время:
И даже те отличия, что видны на диаграммах, услышать не так уж и просто. Вы можете сами убедиться в этом,
скачав звуковые файлы), по которым была написана эта статья. Там же вы сможете найти все те же варианты для FOG3:
Здесь отличия выражены уже ярче, хотя в половине случаев определить их на слух не менее сложно. В итоге звук bhop'а всё же может дать подсказку, но узнать число FOG наверняка не позволяет.