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

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

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

Источник: geektimes.ru