Пишем клон движка Doom: чтение информации карт


Классический The Ultimate Doom С этой игры началась эпоха шутеров

8 комментариев

1 сентября, 2018

[Всего: 47 Средний: 4.6/5]

Стоит просто вспомнить первый раз, когда я увидел старый Doom (1993), который еще даже не был тогда Ultimate Doom (1995, с четвертым эпизодом Thy Flesh Consumed), как по моему лицу градом ссыпаются слезы умиления. Игру Doom знает каждый, а если кто-то не знает, то самое время узнать – это же классика, ставшая бессмертной легендой. Ладно, это звучит дико пафосно, но Doom игра действительно отличная и ее можно прямо сейчас скачать.

Обсудить Doom I в комментах

Без этого поста просто нельзя было, ведь на каждом doom-сайте есть свой раздел с дистрибутивами всех частей Doom. Пока вот по порядку начну с первой, далее Doom 2, а потом уже и до дилогии Final Doom дойдем, которую, кстати, лепили не ID, а Team TNT, ну да ладно.

Понравился сайт? Донаты помогают его развивать!

Здесь можно скачать именно версию The Ultimate Doom – полноценную, интересную, завораживающую. Если сравнивать архитектуру с современными вадниками, то иногда хочется добродушно усмехнуться прошлой простоте, но все равно каждый уровень сделан с душой, потому и классика.

Для истории я публикую первую основную версию Doom 1.9 (1993), отличающаяся от версии Ultimate тем, что в ней нет четвертого эпизода, а также существуют некоторые минимальные различия в строении уровней.

Вступай в сообщество думеров

Да и четвертый эпизод все-таки сильно выделяется на фоне первых трех: уровни стали сложнее и интересней, дизайн также претерпел изменения – добавилась какая-никакая детализация. Эпизод Thy Flesh Consumed можно назвать мостом между Doom I (1993) и Doom II (1994), где действие происходит уже на Земле после ее разрушения.

Ходят предания, что до сих пор существуют олдфаги, не признающие даже Doom 2 с ее манкубусами и арахнатронами, они до сих пор, раз за разом проходят Ultimate Doom и ищут пользовательские WAD’ы специально под эту часть. Но никто их никогда не видел вживую.

История рассказывает о морском пехотинце, отказавшимся по приказу стрелять в безоружных людей, и сосланном за несоблюдение субординации на марсианскую базу UAC, где ученые пытаются наладить телепортацию с Марса на спутники Фобос и Деймос. Как обычно все пошло криво: портал открыл проход между реальным миром и адом, выпустив наружу орды демонов, а наш герой (DoomGuy) – единственный выживший, которому и придется разгребать все те авгиевы конюшни, устроенные гениальными сотрудниками корпорации UAC.

Самое запоминающееся место в игре Doom 1 – восьмая карта первого эпизода (E1M8), где после небольшой стычки с демонами игрок встречается лицом к лицу с двумя баронами ада. Сколько же здесь народу полегло…

Впрочем, если тебе будет скучно и чересчур легко играть в The Ultimate Doom, то к нему спокойно можно подключить, к примеру, мод Brutal Doom, который заставить твою пятую точку полыхать аки пионерский костер (для запуска мода используй порт GZDoom или Zandronum). И пусть в первой части Doom нет двустволки, мы все равно ее любим, и будем даже иногда проходить из ностальгических или извращенных порывов души.

С чем играть
ПортыМожно скачать любой порт для Doom на выбор
КартыРекомендую попробовать случайные уровни от генератора Oblige
МодыМод Beautiful Doom украсит игру новой анимацией и графикой без коренных изменений геймплея

Рекомендации

  • Порт GZDoom 4.0.0 от 7 апреля 2020 Наконец завезли поддержку технологии Vulkan
  • Уровни Alien Vendetta: Black Label для Doom 2 Достойное продолжение достойного оригинала
  • Порт GZDoom 4.1.2 от 14 мая 2020 Улучшена поддержка графической технологии Vulkan
  • Oblige – генератор случайных уровней Doom Источник бесконечных карт для прохождения
  • Мод Bolognese Gore Mod v2.0 – максимум мяса в Doom Больше крови богу крови!
  • Freak-уровень Infected Station для Doom 2 Мясная карта от админа сайта

← Новая версия мода Brutal Doom v21 RC1 Quickfix

Порт GZDoom 3.5.1 от 25 августа 2020 →

Игровой процесс

Бензопила в игре
Игроку предлагается поочередно исследовать уровни разной сложности, разгадывать пространственные и (редко) логические задачи, находить тайники, уничтожать как можно больше монстров и выживать. Уровни представляют собой запутанные лабиринты со множеством дверей, ключей, лифтов, шахт, кнопок и секретных комнат. Вместо пола могут быть лава, кислоты разной силы, вода, ядовитые отходы. На большинстве уровней есть телепорты, мгновенно переносящие игрока в другое место на текущем уровне. Некоторые участки пола способны двигаться в вертикальном направлении (как по желанию, так и без желания игрока), другие могут из камня превратиться в кислоту (обычно это выглядит как погружение пола в окружающие его отходы), третьи открывают тайные двери с засадой (технически это осуществляется при пересечении границы между участками, а не при нахождении в одном из них). Потолки некоторых норовят опуститься, как пресс, и сдавить игрока (что не обязательно смертельно даже при сжатии его до нулевой высоты). Кнопками открываются проходы, недоступные ранее, активируются двери и так далее. Так или иначе, конечной целью игрока является поиск выхода с уровня. Это может быть рубильник (зачастую в комнате с надписью «Выход», люк в полу, особый телепорт или монстр-босс. Увиденная игроком часть уровня, за исключением некоторых секретов и «технических» границ наподобие скайбокс, наносится на автокарту.

Игровой процесс во многом основывается на сложности и интерактивности окружения (лифты, прессы, прочее оборудование). На уровнях есть немало секретных мест, которые необязательно посещать, а также имеются секретные уровни. Как и в Wolfenstein 3D, присутствуют в достаточном количестве помещения-«статисты», не являющиеся секретными, необязательные для прохождения и вообще практически нейтральные к игровому процессу, функция которых состоит только в создании атмосферы и внесении некоторого разнообразия. Навигация на уровне, выбор последовательности и тактики прохождения отдельных его частей и задействования его интерактивных элементов приводят к тому, что в Doom против игрока играет практически весь уровень как единое целое, что тоже является довольно характерной чертой игры. Искусственный интеллект противников, напротив, был ослаблен по сравнению с Wolfenstein 3D (в котором примитивность архитектуры уровней облегчала программирование таких поведенческих шаблонов, как способность солдат зайти со спины или позвать из соседней комнаты подмогу). Пришедшая на смену динамичность уровня как такового является наиболее интересной и новаторской особенностью Doom. Уровень может существенно изменяться по ходу прохождения, что достигается в основном с помощью движения потолков и полов. Также весьма необычны для своего времени разнообразные ловушки, представленные закрывающимися дверями или, например, телепортирующимися противниками из помещения, в которое игрок не может попасть. Несмотря на определённую примитивность и причастность к жанру шутера, описанные выше тактические задачи придавали игре черты приключенческого жанра, требовавшие активного исследования уровня, многие из которых требовали от начинающего игрока много времени на прохождение.

Управление, предлагаемое по умолчанию, совершенно не соответствует современному стандарту управления в шутерах от первого лица, с использованием мыши для поворота и прицеливания и раскладкой WASD для управления движением, однако после выхода первой версии игры многие игроки привыкли именно к такой раскладке, несмотря на наличие многочисленных настроек, позволяющих менять раскладку на любую удобную пользователю: в отличие от Wolfenstein 3D, в Doom можно выставить независимый одновременный прицел мышью (только по горизонтали, прицеливание по вертикали невозможно из-за ограничений движка) и стрейф клавишами при помощи штатных средств, что позволило игрокам в своё время играть в Doom параллельно с более поздними играми этого жанра, не сбивая рефлексов.

Как и в Wolfenstein 3D, в нижней части экрана отображается лицо главного героя, которое реагирует на происходящие события: смотрит в направлении, откуда игрок был атакован, поглядывает по сторонам, кровожадно улыбается при подбирании полезных предметов и оружия, покрывается кровью при снижении здоровья. Лицо указывало пользователям, не имевшим звуковой карты, откуда исходит опасность.

Многопользовательская игра

В оригинальной игре доступно два многопользовательских режима: кооперативный и Deathmatch (так называемый Deathmatch 1.0

). Кооперативный — модификация обычной одиночной игры, когда несколько игроков вместе проходят уровни, сражаясь против монстров; на некоторых уровнях монстров в многопользовательской игре больше. В режиме
Deathmatch
игроки перестреливаются друг с другом, набирая «фраги» — очки за убийства оппонентов. Начиная с версии 1.5 в Doom появился режим
Deathmatch 2.0
. Правила
Deathmatch 2.0
и стали классическими правилами
Deathmatch
в других играх.

Также он исправлял недостаток Deathmatch 1.0

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

Изначально отдельных уровней для многопользовательской игры не было, поэтому она происходила на уровнях для одиночной. При выходе из уровня показывалась таблица фрагов, и все игроки переходили на следующий. Предполагалось, что они могут закончить перестрелку тогда, когда они того хотят. В действительности же из-за быстрого течения игры кнопки выхода нажимались случайно, и часто игра кончалась преждевременно. Создатели сторонних уровней либо не делали выхода вообще (но тогда терялась возможность увидеть таблицу фрагов), либо ставили «кооперативный выход»: чтобы закончить уровень, требовались согласованные действия двух игроков.

Doom поддерживал до 4-х игроков по локальной сети (по протоколу IPX), модему или последовательному порту. В отличие от большинства последующих игр, в которых многопользовательская игра завершалась при отключении создавшего её участника (сервера), в «Doom» при этом игра продолжалась. В комплект с игрой входила программа DWANGO, позволявшая играть через интернет и использовавшая 666-й порт. С тех пор порт № 666 зарезервирован за игрой Doom и введён в стандарты RFC[2].

Введение

Цель этого проекта — создание клона движка DOOM, использующего ресурсы, выпущенные вместе с Ultimate DOOM (версия со Steam).
Он будет представлен в виде туториала — я не хочу добиваться в коде максимальной производительности, а просто создам работающую версию, и позже начну её улучшать и оптимизировать.

У меня нет опыта создания игр или игровых движков, и мало опыта в написании статей, поэтому можете предлагать свои изменения или даже полностью переписать код.

Вот список ресурсов и ссылок.

Книга Game Engine Black Book: DOOM Фабьена Санглара. Одна из лучших книг по внутреннему устройству DOOM.

Doom Wiki

Исходный код DOOM

Исходный код Chocolate Doom

Требования

  • Visual Studio: подойдёт любой IDE; я буду работать в Visual Studio 2020.
  • SDL2: библиотеки.
  • DOOM: копия Steam-версии Ultimate DOOM, нам из неё понадобится только файл WAD.

Необязательное

  • Slade3: хороший инструмент для проверки нашей работы.

Мысли

Не знаю, смогу и я завершить этот проект, но приложу для этого все силы.
Моей целевой платформой будет Windows, но поскольку я использую SDL, будет просто заставить движок работать под любой другой платформой.

А пока установим Visual Studio!

Проект был переименован из Handmade DOOM в Do It Yourself Doom with SLD (DIY Doom), чтобы его не путали с другими проектами под названием «Handmade». В туториале есть несколько скриншотов, на которых он всё ещё называется Handmade DOOM.

Другие примечания

В процессе написания кода я ошибочно считывал больше байтов, чем нужно, и получал неверные значения. Для отладки я начал смотреть на смещение WAD в памяти, чтобы понять, нахожусь ли я на нужном смещении. Это можно сделать при помощи окна памяти Visual Studio, которые оказываются очень полезным инструментом при отслеживании байтов или памяти (также в этом окне можно устанавливать точки останова).
Если вы не видите окно памяти, то перейдите в Debug > Memory > Memory.

Теперь мы видим значения в памяти в шестнадцатеричном виде. Эти значения можно сравнить с hex-отображением в slade, нажав правой клавишей на любой lump и отобразив его как hex. Сравниваем их с адресом загруженного в память WAD. И последнее на сегодня: мы увидели все эти значения вершин, но есть ли простой способ визуализировать их без написания кода? Я не хочу тратить время на это, просто чтобы выяснить, что мы движемся не в том направлении.

Наверняка уже кто-то создал графопостроитель. Я загуглил «draw points on a graph» и первым результатом оказался веб-сайт Plot Points — Desmos. На нём можно вставить числа из буфера обмена, и он нарисует их. Они должны быть в формате «(x, y)». Чтобы получить его, достаточно немного изменить функцию вывода на экран.

cout << «(» << vertex.XPosition << «,» << vertex.YPosition << «)» << endl; Ого! Это уже похоже на E1M1! Мы чего-то добились! Если вам лениво это делать, то вот ссылка на заполненный точками график: Plot Vertex.

Но давайте сделаем ещё один шаг: немного потрудившись, мы можем соединить эти точки на основании linedefs.

Вот ссылка: E1M1 Plot Vertex

Рейтинг
( 2 оценки, среднее 5 из 5 )
Понравилась статья? Поделиться с друзьями: