Автор статьи: Джонатан Дауленд (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'
].
Автор: alizar