Как стать автором
Обновить

Детерминированный Doom

Время на прочтение 2 мин
Количество просмотров 26K
Автор оригинала: Jonathan Dowland
Автор статьи: Джонатан Дауленд (Jonathan Dowland), ведущий программист в одной из Open Source компаний, разработчик Debian и большой фанат Doom.



Что будет, если убрать случайность из Doom?

Недавно я почему-то подумал про Doom. В тот вечер мне захотелось изучить некоторые варианты поведения старой версии Doom. Для этого я открыл бинарник в hex-редакторе и заменил обращения к генератору случайных чисел на статические значения.

Вместо того, чтобы использовать системный ГСЧ, в Doom есть фиксированная таблица с 256 случайными числами, откуда извлекаются значения в соответствии с игровой логикой. Заменив всю таблицу фиксированным значением, вы в реальности делаете игру полностью детерминированной.

Как это выглядит? Я попробовал два значения: 0x00 и 0xFF. С каждым из них вместо эффекта «тающего» экрана в конце уровней картинка стиралась строго вертикально: ГСЧ использовался для сдвига каждого столбца. Монстры умирают не с разными криками, а с одним и тем же для каждой категории монстров. Огнестрельное оружие (hitscan) вообще не даёт разброса. Дробовик стреляет как снайперская винтовка, и пулемёт тоже. Можно подумать, что такой «супер-дробовик» обладает большой убойной силой, но есть нюанс: разброс пуль был его преимуществом.

При значении 0x00 монстры никогда не издают тихих звуков (дыхание и т.д.). С другой стороны, при 0xFF они делают это постоянно: так часто, что каждый звук накладывается на предыдущий, так что перед вами эдакое монстроподобное гудение. Это весьма подавляет даже при небольшом количестве монстров.

При 0xFF все участки с мигающим светом становятся статичными. А при 0x00 они мигают как сумасшедшие.

При 0x00 монстры вроде бы начинают атаковать чаще, чем обычно. Ущерб для здоровья, похоже, идёт по максимуму. Самый вредоносный пол («super hellslime»/20%) может нанести ущерб, даже на вас надет костюм радиационной защиты. В нормальной игре шанс получить повреждения в таком костюме очень низкий: около 2,6% для каждого раза; здесь же он повышается до 100%.

Становятся странными и другие аспекты игры. Монстры могут всегда применять дистанционную атаку, независимо от расстояния до вас. Или неожиданно прекратить преследование. Я видел, как они бессмысленно ходят кругами, если встречают препятствие. Вероятность вступления в бой для монстра или нулевая, или стопроцентная. Игрок или молчит, или кричит от боли при получении ранения.

Если вы хотите сами попробовать, то проще всего отредактировать файл m_random.c из исходников, хотя можно и изменить бинарник в hex-редакторе. Ищите 256-байтную последовательность, которая начинается с ['0x0', '0x8', '0x6d', '0xdc', '0xde', '0xf1'] и заканчивается ['0x78', '0xa3', '0xec', '0xf9'].
Теги:
Хабы:
+54
Комментарии 19
Комментарии Комментарии 19

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн