О рандоме и особенностях -ah


В былые времена появилась команда -ah. Ожидалось, что она поможет против мапхака, но, как известно, благими намерениями и икап строился.

Суть

Суть команды -ah проста: если юнита не видно, его иконка заменяется на пустую, а модель делается полностью прозрачной. При желании можно указать, какую из двух опций включать — командой -mode 1/2. Но на практике…

Иконка
Замена иконки на пустую невозможна. Достаточно знать путь к этой иконке, который так или иначе необходимо указать вручную, и минимальными знаниями моддинга, чтобы заменить пустую иконку на обычную. Плюс — эта иконка всегда видна, даже поверх тумана войны. В итоге эту опцию удалили вовсе — сейчас иконки даже не пытаются скрыть.

Прозрачность
Прозрачностью юнитов мешает адекватно взаимодействовать с ними. При входе или выходе из тумана модель остается невидимой какое-то время, что сильно мешает простым игрокам. А у выблядков по-умолчанию стоит округление всех прозрачных объектов в непрозрачные, что сводит на нет весь смысл подобных фокусов.


Итак, выяснили, что ah само по себе нынче бесполезно. Теперь о его побочном воздействии.

Побочные эффекты

Лечебные чары. Побочные эффекты: сухость во рту, тошнота, рвота, зуд, галлюцинации, потеря рассудка, кома и смерть. Ну что же, попробуем!

Все реплеи смотрятся от лица первого доступного игрока-человека. В дотке это синий. Если бы ah работал в реплеях как положено, он бы скрывал всех скуржей и мешал нормально смотреть игру. Поэтому реализована особая проверка на тип игры.

Игра уходит в паузу, включается режим видео (те самые границы по бокам экрана), выключается видеорежим, выключается пауза. После этого можно однозначно сказать, что это реплей или реальная игра. И все бы ничего, но режим видео включается посредством стандартной функции — а она сбрасывает генератор случайных чисел на рестарт.

Генератор псевдослучайных чисел


Как и в любой мультиплеерной игре, в WC3 нет «чистого» рандома — всё отсчитывается с конкретного оффсета, который синхронизируется между всеми игроками при старте. Все случайные значения, генерируемые с момента переключения экрана в видеорежим, идут в одном и том же порядке — это нужно было Blizzard для синхронных анимаций юнитов во время показа роликов. Что это значит?

Что, прописав -ah, все рандомы перестают быть рандомом. Например, если никаких других вызовов функции случайных значений не происходит, использование -roll будет возвращать одни и те же значения при любом количестве рестартов.

Случайные значения окружают всё в доте. Это каждая атака (разброс урона), это roll, это random (не сразу, а через 6 секунд, когда герой, собственно, будет выбираться), это -rh, это атака при наличии баша или крита и т.п.

Применение

На этом основан баг с получением «всегда одного и того же героя при помощи ah».



Если генератор не будет сбит каким-то еще событием рандома, то выпадет всегда нужный герой. Откуда необходимость в точности до секунды? Потому что с момента загрузки карты на фоне тикают сотри триггеров, некоторые — ежесекундно, некоторые — намного реже. И в некоторых из них есть моменты генерации рандомных чисел.

Например, на 17й секунде сработали 2 триггера, каждый из которых создал себе по 10 случайных значений — и только поэтому выпадает Мипо. Если кто-то запросит еще одно случайное значение, например тот же -roll — появится уже не мипо, а кто-то другой. Аналогично можно самостоятельно сдвигать счетчик, используя ролл после ввода ah и до появления героя.

11 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.