Детерминизм
Почему уровень с тем же сидом играется одинаково на любом устройстве, как устроена случайность и что это даёт
Уровень - функция времени
Уровень собирается на таймлайне. Каждый объект живёт на отрезке кадров и движется по ключам
Уровень не читает ваши действия. Поэтому кадр 1200 выглядит одинаково, живы вы, мертвы, в рывке или за вас играет бот
Влияние идёт в одну сторону. Уровень может менять размер аватара, замедлять его, забирать управление или выключать столкновения. Обратного канала от аватара к уровню нет
Триггеров нет. Разработчики обсуждают их для будущих версий, но ничего не решено
Уровень идёт по реальному времени. Частота кадров задаёт только то, как часто перерисовывается экран. Один и тот же забег идёт одинаково и на 30, и на 144 кадрах в секунду
Сид
Сид берётся из первого места, где он задан:
Сид игрокана экране уровня (Случайновыбирает новый,Очиститьубирает)- собственный сид уровня, заданный автором
- новый сид на этот забег
0 значит "не задан". Поэтому обычный уровень берёт новый сид при каждой загрузке
Окно результата показывает сид забега, а рекорд его хранит. Так удачный забег можно повторить
Как устроена случайность
Случайное значение в уровне не берётся из генератора, который помнит своё состояние. Оно вычисляется по своему адресу:
Hash(seed, keyframe frame, layer, start frame, track, channel)
Один и тот же адрес всегда даёт одно и то же число. На любом устройстве и в любом порядке вычислений. Каждая часть адреса - то, что редактирует автор. Поэтому та же раскладка повторяет тот же забег
Что это даёт
- Warm-бот рассчитывает маршрут через весь уровень до начала забега. Это возможно, потому что сыграется ровно тот уровень, под который он планировал
- Reflex-бот строит кадры впереди текущего и уворачивается по ним
- Отмотка к контрольной точке заново строит нужный кадр, а не отменяет что-либо
- Редактор строит любой кадр с нуля, поэтому перемотка мгновенная
- Рекорды и статистика значат одно и то же на любом устройстве
Известные ограничения
Сторона уровня детерминирована. У стороны аватара есть дефекты, которые разработчики записали и пока не исправили:
- два препятствия задели аватара в одном кадре. Какое из них задаёт направление отбрасывания, может отличаться между забегами
- часы аватара не сбрасываются при старте уровня. Рывок может длиться на кадр дольше или короче, смотря сколько грузился уровень
Повтор одного и того же забега бота на одной сборке совпал при замере до последней цифры. Значит, эти дефекты срабатывают не на каждом уровне. Из-за них забег воспроизводим на практике, но не гарантированно