Что будет, если убрать случайность из 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'
].
Комментарии (19)
Fedorkov
24.04.2015 15:31+3разброс пуль был его интегрированной особенностью
каждый сэмпл накладывается на предыдущий, так что перед вами своеобразный монстроподобный дрон.
Google Translate?mihuil
24.04.2015 18:53Слово «дрон» встречается в музыке, как описание мощного глубокого вибрирующего звука с обертонами. Посмотрите видео игры на диджериду, вы сразу поймете о чем речь.
tsvetkovpa
24.04.2015 17:22+5В детстве на ZX Spectrum как то по учебнику делал эффект таяния экрана и в качестве набора случайных чисел использовал первые 16 килобайт памяти где хранилась прошивка.
un_def
24.04.2015 22:57Помним-помним, AND байт из ROM (#0000-#3FFF) с байтами экрана (#4000-#5800) в несколько проходов + финальная очистка (вдруг кто-то из битов «выжил» + очистить область атрибутов).
vitaly80
25.04.2015 14:24А еще можно вспомнить, как в Duke3D меняли мощность оружия в файле USER.CON.
Ndividuum
27.04.2015 09:59В наше время мы разбирали картриджи для дендика и закорачивали случайные отверстия в плате двумя иголками, соединёнными проволокой.
Эффекты были крайне непредсказуемыми, но веселье чистым и безудержным — кто найдёт более оригинальное КЗ с наиболее умопомрачительным эффектом.
muradovm
29.04.2015 09:52>> Вместо того, чтобы использовать системный ГСЧ, в Doom есть фиксированная таблица с 256 случайными числами, откуда извлекаются значения в соответствии с игровой логикой.
Интересно, как логика выбирала значение из таблицы. Тоже должна была делать это как-то случайно.r0zh0k
29.04.2015 11:01Алгоритм выбора тоже детерминирован вроде как
github.com/id-Software/DOOM/blob/master/linuxdoom-1.10/m_random.c
Dovgaluk
29.04.2015 11:24Странный заголовок для статьи.
Если там таблица вместо по-настоящему случайных данных, значит случайности и нет вовсе.
Это типа как галактики генерировались в Elite на ZX Spectrum.Lain_13
29.04.2015 12:54Строго говоря да. Но тут фокус в том, что сам игрок вносит элемент случайности так-как от его действий зависит то как часто и для чего игра будет обращаться к генератору. Соответственно каждое обращение даёт строго детерминированный результат, но, при этом, на что конкретно он повлияет предсказать мы не можем.
amartyno
29.04.2015 13:14вот тут куча утилит по редактированию всего и вся в Doom 2: www.doomworld.com/classicdoom/utils/editors.php
не помню как программа называлась, но была такая даже с текстовым UI, в котором можно было поведение всего в Doom 2 поменять
самое запоминившееся:
— очень медленные ракеты — их можно было веером запускать на открытом пространстве и никто от них укрыться не мог, т.к. приседаний и прыжков не было, можно было только убежать
— пулемёт, стреляющий с невероятной скоростью — если противник попадал под такой огонь, то умирал практически сразу
P.S. всё тестировалось на уровне gsxr2 при игре в deathmatch
red_andr
29.04.2015 22:30В своё время также модифицировали дробовик. Получалось супероружие, от которого не было спасения. Попадание под фактически лазерный пучок дроби приводило к мгновенной смерти.
GeckoPelt
— Доктор, когда я касаюсь кончиком языка фольги, в которой запекали картошку, у меня начинает покалывать мочка левого уха. Что бы это могло значить?
— Это значит, голубчик, что у вас слишком много свободного времени!
amarao
— Доктор, когда я касаюсь острым кусочком проволоки кристалла кремния под напряжением, то я вижу в точке прикосновения свечение.
А) Это значит, голубчик, что у вас слишком много свободного времени!
Б) Любопытно. Свечение полупроводникового перехода… Исследуйте вопрос чуть поглубже.
GeckoPelt
Не согласен, это скорее похоже на лулзы наподобие подкрутить в Duke Nukem 3D в CON-файлах скрипт попадания пули так, чтобы вместо анимации дырки спавнился взрыв из РПГ :) Забавно, конечно, спору нет.
amarao
Лично мне было интересно увидеть, как решали проблему рандома в условиях, когда рандома негде толком взять. Кому-то любопытство кажется излишним, и он мирно продолжает жрать бананы
на деревев зоопарке.GeckoPelt
Это да, я как-то раньше не заморачивался посмотреть, заглянул в исходник, элегантно!