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

Комментарии (19)


  1. GeckoPelt
    24.04.2015 14:15
    +17

    — Доктор, когда я касаюсь кончиком языка фольги, в которой запекали картошку, у меня начинает покалывать мочка левого уха. Что бы это могло значить?
    — Это значит, голубчик, что у вас слишком много свободного времени!


    1. amarao
      24.04.2015 14:52
      +6

      — Доктор, когда я касаюсь острым кусочком проволоки кристалла кремния под напряжением, то я вижу в точке прикосновения свечение.
      А) Это значит, голубчик, что у вас слишком много свободного времени!
      Б) Любопытно. Свечение полупроводникового перехода… Исследуйте вопрос чуть поглубже.


      1. GeckoPelt
        24.04.2015 14:58
        +1

        Не согласен, это скорее похоже на лулзы наподобие подкрутить в Duke Nukem 3D в CON-файлах скрипт попадания пули так, чтобы вместо анимации дырки спавнился взрыв из РПГ :) Забавно, конечно, спору нет.


        1. amarao
          24.04.2015 16:06
          +9

          Лично мне было интересно увидеть, как решали проблему рандома в условиях, когда рандома негде толком взять. Кому-то любопытство кажется излишним, и он мирно продолжает жрать бананы на дереве в зоопарке.


          1. GeckoPelt
            24.04.2015 16:28

            Это да, я как-то раньше не заморачивался посмотреть, заглянул в исходник, элегантно!


  1. Fedorkov
    24.04.2015 15:31
    +3

    разброс пуль был его интегрированной особенностью
    каждый сэмпл накладывается на предыдущий, так что перед вами своеобразный монстроподобный дрон.
    Google Translate?


    1. iago
      24.04.2015 17:32
      +5

      не придирайтесь, нормальный перевод. Бывают нааамного хуже.


    1. mihuil
      24.04.2015 18:53

      Слово «дрон» встречается в музыке, как описание мощного глубокого вибрирующего звука с обертонами. Посмотрите видео игры на диджериду, вы сразу поймете о чем речь.


  1. kahi4
    24.04.2015 15:46
    +10

    Очень не хватает каких-то скриншотов или еще лучше — видео.


  1. tsvetkovpa
    24.04.2015 17:22
    +5

    В детстве на ZX Spectrum как то по учебнику делал эффект таяния экрана и в качестве набора случайных чисел использовал первые 16 килобайт памяти где хранилась прошивка.


    1. un_def
      24.04.2015 22:57

      Помним-помним, AND байт из ROM (#0000-#3FFF) с байтами экрана (#4000-#5800) в несколько проходов + финальная очистка (вдруг кто-то из битов «выжил» + очистить область атрибутов).


  1. vitaly80
    25.04.2015 14:24

    А еще можно вспомнить, как в Duke3D меняли мощность оружия в файле USER.CON.


  1. Ndividuum
    27.04.2015 09:59

    В наше время мы разбирали картриджи для дендика и закорачивали случайные отверстия в плате двумя иголками, соединёнными проволокой.
    Эффекты были крайне непредсказуемыми, но веселье чистым и безудержным — кто найдёт более оригинальное КЗ с наиболее умопомрачительным эффектом.


  1. muradovm
    29.04.2015 09:52

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

    Интересно, как логика выбирала значение из таблицы. Тоже должна была делать это как-то случайно.


    1. r0zh0k
      29.04.2015 11:01

      Алгоритм выбора тоже детерминирован вроде как
      github.com/id-Software/DOOM/blob/master/linuxdoom-1.10/m_random.c


  1. Dovgaluk
    29.04.2015 11:24

    Странный заголовок для статьи.
    Если там таблица вместо по-настоящему случайных данных, значит случайности и нет вовсе.
    Это типа как галактики генерировались в Elite на ZX Spectrum.


    1. Lain_13
      29.04.2015 12:54

      Строго говоря да. Но тут фокус в том, что сам игрок вносит элемент случайности так-как от его действий зависит то как часто и для чего игра будет обращаться к генератору. Соответственно каждое обращение даёт строго детерминированный результат, но, при этом, на что конкретно он повлияет предсказать мы не можем.


  1. amartyno
    29.04.2015 13:14

    вот тут куча утилит по редактированию всего и вся в Doom 2: www.doomworld.com/classicdoom/utils/editors.php
    не помню как программа называлась, но была такая даже с текстовым UI, в котором можно было поведение всего в Doom 2 поменять

    самое запоминившееся:
    — очень медленные ракеты — их можно было веером запускать на открытом пространстве и никто от них укрыться не мог, т.к. приседаний и прыжков не было, можно было только убежать
    — пулемёт, стреляющий с невероятной скоростью — если противник попадал под такой огонь, то умирал практически сразу

    P.S. всё тестировалось на уровне gsxr2 при игре в deathmatch


  1. red_andr
    29.04.2015 22:30

    В своё время также модифицировали дробовик. Получалось супероружие, от которого не было спасения. Попадание под фактически лазерный пучок дроби приводило к мгновенной смерти.