Не распыляясь на долгие вступления, скажу лишь, что различного рода русскоязычных мануалов по созданию сложных карт для этой культовой игры весьма много, однако по созданию оружия информации почти нет. Поэтому я для таких же, как и я, начинающих модеров я вскрыл несколько wad-файлов и получил некий шаблон, на основе которого можно собрать свой мод. Скачать его можно здесь: https://disk.yandex.ru/d/16PfVGm4vZT3SQ
Ниже пояснения о том, как же этим пользоваться.
Для начала, неплохо было бы уметь обращаться с компьютером, знать, как устроен интерфейс в стандартных офисных программ и в проводнике. Работать мы будем в программе SLADE, которая является самым известным, продвинутым и используемым редактором ресурсов Doom. Многие, кто хоть как-то знаком с созданием модов Doom, примерно знают, как ей пользоваться, но, всё же, стоит объяснить основы.
Вообще, чаще всего модификация представляет собой файл с расширением «.wad», так же, как и основные ресурсы игры. То есть все скрипты, графика, 3д модели и звуки спрятаны в один файл. Чуть реже «вады» могут объединяться в .pk3-архивы, которые, по сути, являются особо структурированными zip-файлами. Все файлы модов условно называют PWADами. Как уже говорилось чуть ранее, основные ресурсы игры вложены в один wad-файл, и его называют IWAD. Именно он обязательно нужен для запуска любой игры на основе id Tech 1, независимо от порта. То, как выглядят ресурсы внутри «вада», отчасти напоминает обычную сжатую папку. Каждый ресурс внутри архива имеет своё уникальное имя. Расширения у него нет, и тип данных отображается так, как мы настроим. К примеру, в SLADE любой ресурс можно отобразить в виде шестнадцатиричного кода, текста или таблицы. По сокольку при запуске нескольких «вадов» они подключаются последовательно, при наличии двух ресурсов с одинаковым именем используется тот, что подключен последним.
Теперь рассмотрим саму программу SLADE:
Как мы видим, окно разделено на несколько частей.
1 – собственно, ресурсы внутри WADа, "входы". Далее для простоты и удобства я буду называть словом «файлы» именно их, хотя это не совсем верно. Важно не только имя файла, но и его позиция.
2 – здесь отображается и редактируется содержимое выделенного файла.
3 – здесь отображены все открытые вады.
4 – последние открытые вады.
5 – вкладки. Каждый вад или pk3 открывается в своей вкладке, все вложенные папки открываются в новых вкладках. Так же при желании и отдельные файлы можно открыть отдельных вкладках.
6 – похожая панель есть в большинстве офисных программ. Это создание, сохранение, загрузка и закрытие проекта.
7 – панель, управляющая файлами внутри вада. Так, первые шесть иконок –создать новый файл, создать вложенную папку, импортировать ресурсы, открыть различные встроенные редакторы, тестовый запуск. Далее – функции, которые можно выбрать, нажав на нужный файл пкм – переименовать, копировать/вставить, переместить и т.д.
Каждый файл несёт определённый тип информации, например, графическую или текстовую. Кстати, изображения загружать можно как и в true colour, так и с палитрой. Так же файл может быть пустым, но иметь особое имя – такие файлы играют роль маркеров.
В принципе, это всё, что следует понимать, чтобы работать в SLADE.
Итак, для начала рассмотрим созданный мной шаблон снаружи. Моя модификация включает в себя два прототипа огнестрельного оружия и одно холодное.
Винтовка – имеет два режима стрельбы: стреляет очередями, пока зажата ЛКМ после чего долго перезаряжается, или же при нажатии ПКМ выпускает одиночные выстрелы с менее длинным колдауном. Стреляет хитсканами.
Плазмаган – пускает плазменные заряды, которые взрываются при контакте с поверхностями. Стреляет проджектайлами.
Плазменный клинок – наносит сильный урон в ближнем бою, имеет две анимации атаки.
Такой набор я посчитал универсальным, так как в нём присутствуют все основные механики и приёмы. При необходимости их можно будет комбинировать в зависимости от поставленной задачи.
Теперь откроем мой вад в SLADE и посмотрим, как он устроен изнутри.
В архиве нет подкаталогов, однако сразу бросается в глаза одна особенность: все графические файлы находятся между маркерами SS_START и SS_END. Это очень важно. Таким образом нужно выделять все спрайты игровых объектов, будь то оружие, аптечка, монстр, куст или же сам игрок, в то время как текстуры стен, пола и потолка можно не выделять.
Так же в архиве присутствуют текстовые и звуковые файлы. Их порядок не важен, но лучше отсортировать их, чтобы не путаться. Со звуками всё понятно, а вот с текстовыми файлами чуть сложнее.
Основной текстовый файл носит имя DECORATE. В нём находится основная часть скрипта или, если скриптов много, ссылки на другие файлы. DECALDEF отвечает за специальные визуальные эффекты, например, прозрачность или свечение. SOUNDINFO соотносит название звукового файла и название, используемое в скриптах.
Теперь же следует показать читателю содержание текстовых файлов, поясняя при этом их структуру и значение написанного.
Скрипт внутри DECORATE-файла строится по следующему принципу:
[название объекта]
{
[постоянные свойства объекта]
}
{
[последовательность действий, выполняемых объектом]
}
Но прописывать все объекты в одном входе не очень удобно, поэтому я решил, что в моём PWADе логичнее всего будет распределить скрипты на три группы, на три разных текстовых листа. Поэтому создаём ещё три текстовых файла, называем их на наше усмотрение, а в нашем Decorate пишем по строчке на каждый вспомогательный вход:
#include “{имя вспомогательного входа}”
При этом, мы всё ещё можем писать скрипт в самом decorate.
Итак, оружие первое, название:
ACTOR QRIFE : WEAPON 10000
ACTOR – вводное слово, обозначает начало скрипта игрового объекта. Далее игровые объекты я буду называть акторами.
QRIFE – имя актора, можно придумать любое
Weapon – тип актора, конкретно этот – оружие
10000 – номер актора, и нужен для того, чтобы актор можно было поставить в редакторе карт (если актор создаётся другим актором, то номер не нужен), должен быть уникален для каждого актора
Далее открываем логические скобки, постоянные свойства:
ATTACKSOUND "D" –звук, который будет проигрываться во время атаки
WEAPON.SELECTIONORDER 400 – что-то вроде приоритета выбора – если два оружия находятся в одном слоте, сначала будет выбрано то, чей приоритет выше.
WEAPON.SLOTNUMBER 2 – слот быстрого выбора (например, наше оружие можно быстро выбрать, нажав «2»)
WEAPON.AMMOTYPE1 "qqq"
WEAPON.AMMOTYPE2 "qqq" – тип снарядов. Для создания нового типа снарядов создаётся отдельный актор
WEAPON.AMMOUSE1 1– количество снарядов, используемое за один выстрел основной атакой
WEAPON.AMMOUSE2 1 – количество снарядов, используемое за один выстрел дополнительной атакой
WEAPON.AMMOGIVE 100 – количество снарядов, выдающихся при подборе оружиия
SCALE 0.5 – масштаб спрайта объекта на уровне
DECAL "QRIFE" – ссылка на вход, в котором можно будет прописать следы от выстрелов на стенах. К нему вернёмся позже.
Эти свойства прописывать не обязательно, и порядок их тоже не принципиален
Далее – пишем «states», открываем вторые скобки и прописываем анимации и действия, привязанные к этим анимациям:
Первой пропишем анимацию спавна объекта на карте:
SPAWN: - тип анимации
RIFE E -1 – имя входа со спрайтом, а так же скорость анимации. Но, по скольку данная анимация статична, пишем «-1»
STOP – команда к остановке анимации
Вторая анимация, которую мы пропишем – «ready», оружие на изготовке, готовое к атаке
READY:
RIFE C 5
RIFE D 5
RIFE C 5
RIFE D 5
RIFE C 5
RIFE D 5
RIFE C 5
RIFE D 5
RIFE A 1 A_WEAPONREADY – здесь даём привязанную к спрайту команду
GOTO READY +8 – команда перейти к анимации «READY», а за тем на восемь спрайтов вперёд
Теперь пропишем анимации смены оружия:
DESELECT:
RIFE C 1 A_LOWER – с каждым спрайтом оружие будет немного опускаться, и когда оно опустится полностью, оружие сменится
RIFE D 1 A_LOWER
LOOP – анимация будет повторяться
SELECT:
RIFE C 1 A_RAISE – теперь оружие поднимается, и когда поднимется, анимация сменится на «READY»
RIFE D 1 A_RAISE
LOOP
Теперь перейдём к самому интересному – анимациям атаки:
FIRE:
RIFE B 1 A_FIREBULLETS (0, 0, 0, 8) – атака хитсканом, в первых двух аргументах указываем координаты места появления пули по горизонтали и вертикали, а в четвёртом – урон от выстрела
RIFE A 1
TNT1 A 0 A_REFIRE – повторение атаки, пока зажата кнопка атаки (TNT1 – пустой спрайт)
GOTO READY
И дополнительной атаки, менее мощную, но с более быстрой перезарядкой:
ALTFIRE:
RIFE B 1 A_FIREBULLETS (0, 0, 0, 8)
RIFE A 1
GOTO READY +6
Закрываем обе скобки и теперь, чтобы всё работало, пропишем тип боеприпасов, используемых оружием:
actor QQQ: AMMO
{
INVENTORY.MAXAMOUNT 1000 – максимальное количество снарядов в запасе
STATES
{
SPAWN:
TNT1 A -1 –данный актор на карте конечно не появится, но необходимо прописать хотя бы одну анимацию
STOP
}
}
Теперь вспоминаем про дырки от пуль:
Создаём файл с названием «decaldef» и пишем:
DECAL QRIFE
{
PIC PLSMA0 – указываем нужный нам вход-спрайт
ADD 0.5 – прозрачность спрайта следа
SHADE "05 05 05" – оттенок по RGB
X-SCALE 0.25
Y-SCALE 0.25 – масштабирование спрайта
}
Второе оружие пускает проджектайлы, поэтому будут некоторые отличия помимо используемых спрайтов:
ACTOR QRAIL : WEAPON 10001
{
ATTACKSOUND "S"
WEAPON.SELECTIONORDER 500
WEAPON.SLOTNUMBER 3
WEAPON.AMMOTYPE1 "ROR"
WEAPON.AMMOUSE 1
WEAPON.AMMOGIVE 5
SCALE 0.5
STATES
{
READY:
rail b 25
rail c 1 A_WEAPONREADY
GOTO READY +1
SPAWN:
RAIL G -1
STOP
DESELECT:
rail a 1 A_LOWER
LOOP
SELECT:
rail a 1 A_RAISE
LOOP
FIRE:
rail d 1 A_FireCustomMissile ("LASER", 0, TRUE) – вот здесь как раз таки начинаются ключевые отличия. Эта команда создаёт новый актор. Первое значение аргумента – имя актора, который должен заспавниться. Второе – угол, под которым появится проджектайл. «True» - урон будет защитываться
rail c 1 A_PLAYSOUND ("S",TRUE,5) – на этом спрайте будет проигран нужный звук. Аргументы:
“s” – имя входа с нужным звуком, потом пишем TRUE, затем громкость.
rail e 1 A_LIGHT(10) – световая вспышка
GOTO READY
}
}
Проджектайлы тоже являются акторами. Наши будут работать так:
Заряд спавнится рядом с игроком и летит по прямой , при этом он постоянно создаёт след из статичных объектов, а если он будет сталкиваться со стеной, на его месте появится некое подобие взрыва – графический эффект и область урона.
ACTOR LASER
{
RADIUS 5 – радиус объекта. Именно этот параметр, а не размер спрайта влияет на границы объекта на карте
SPEED 15 – скорость нашего летуна
DAMAGE 800 – урон от попадания
PROJECTILE - обязательно нужно написать, что этот актор – проджектайл
SCALE 0.25
DECAL "QRAIL" – след на стене, как в первом оружии
STATES
{
SPAWN:
PLSM A 1 Bright A_CustomMissile("LSD",0,0,0,0) – тоже команда для спавна, но спавна из другого объекта, а не на месте игрока. Конечно, можно использовать и предыдущую команду, но здесь можно прописать точку спавна, а не только угол: имя объекта, координаты по игрику, по иксу, угол и коэффициент самонавидения (aim)
LOOP – необходимо, чтобы один имеющийся спрайт проигрывался снова и снова, а не останавливаться, чтобы команда спавна выполнялась постоянно
DEATH: - анимация, которая включится при попадании встену
PLSD A 1 A_CustomMissile("boom",0,0,0,0)
PLSD A 1 BRIGHT A_CustomMissile("boomEXP",0,32,0,0)
PLSD A 1 BRIGHT A_CustomMissile("boomEXP",0,0,0,0)
PLSD A 1 BRIGHT A_CustomMissile("boomEXP",0,-32,0,0)
STOP
}
}
След от снаряда в воздухе:
ACTOR LSD
{
RADIUS 0
SPEED 0
DAMAGE 0
PROJECTILE
SCALE 0.25
RENDERSTYLE ADD – указывает на то, что объект частично прозрачен
ALPHA 0.2 – коэффициент прозрачности
STATES
{
SPAWN:
PLSM AAAAAA 200 bright
STOP
}
}
Опасная зона взрывыва:
ACTOR boom
{
RADIUS 256
SPEED 0
DAMAGE 8000
PROJECTILE
SCALE 5
STATES
{
SPAWN:
TNT1 A 11
STOP
}
}
Графический эффект от взрыва:
ACTOR boomEXP
{
RADIUS 0
SPEED 0
DAMAGE 0
PROJECTILE
SCALE 5
+NOCLIP – объект не будет сталкиваться со стенами. Без эого флага возможны баги, связанные с тем, что объект, условно говоря, не влезает в комнату, где должен появиться.
RENDERSTYLE ADD
ALPHA 0.2
STATES
{
SPAWN:
PLSM AAAAAA 1 Bright bright A_PLAYSOUND ("f",TRUE,50,0)
PLSD A 1 Bright
PLSM AAAAAA 1 Bright
PLSD A 1 Bright
STOP
}
}
Далее пропишем актор для боезапаса. Отличия будут и тут: добавим возможность добавить этот актор на карту, чтобы игрок мог его подобрать и пополнить запас:
actor rOr: AMMO 10002 – появляется номер, чтобы данный актор мог быть размещён на уровне
{
INVENTORY.MAXAMOUNT 100
INVENTORY.AMOUNT 5 – именно эта строчка покажет, сколько снарядов получит игрок
scale 0.5
STATES
{
SPAWN:
rail f -1 Bright
}
}
И вот мыдобрались до оружия, принципиально отличающегося как от того, что мы сделали ранее, так и от того, что есть в оригинальной игре: дамы и господа, вашему вниманию – ножик!
А по сути, он работает почти как проджектайловая пушка: перед игроком будет появляться объект, который будет наносить урон врагам. Только теперь он будет во-первых невидим, во-вторых недвижим, и в-третьих он будет исчезать сразу после появления.
Так же здесь мы используем хитрость, которая поможет разнообразить анимации.
Итак, смотрим:
ACTOR QKNIFE : WEAPON 10003
{
ATTACKSOUND "S"
WEAPON.SELECTIONORDER 500
WEAPON.SLOTNUMBER 1
SCALE 0.5
STATES
{
SPAWN:
KNFE A -1
STOP
READY:
KNIF C 1 A_WEAPONREADY
GOTO READY
KNIF A 1 A_WEAPONREADY
GOTO READY +1 – данная анимация состоит из двух различных циклов, то есть у неё есть две независимые вариации
SELECT:
KNIF C 1 A_RAISE
LOOP
DESELECT:
KNIF C 1 A_LOWER
LOOP
FIRE:
TNT1 A 0 A_JUMP (128, "FIRE2") – с вероятностью 128 из 255 будет произведён переход к анимации "FIRE2". Теперь при атаке случайным образом будет проиграна одна из двух анимаций. Количество их может быть любым.
KNIF C 1 A_CustomMissile("PUFF",50,0,0,0)
KNIF D 1
KNIF E 1
KNIF F 1
TNT1 A 0 A_REFIRE
GOTO READY +1
FIRE2:
KNIF A 1 A_SPAWNITEM("PUFF",50,0,0,0)
FNIF F 1
KNIF E 1
KNIF D 1
KNIF C 1
TNT1 A 0 A_REFIRE
GOTO READY
}
}
ACTOR PUFF
{
RADIUS 50
SPEED 0
DAMAGE 800
PROJECTILE
SCALE 0.25
DECAL "QRAIL"
STATES
{
SPAWN:
PLSM A 1 Bright
STOP
}
}х
Что же касается названий используемых звуковых файлов, то, как упоминалось выше, их названия необходимо соотнести с используемыми в тексте именами. Для этого заполняем файл SNDINFO:
D D
S SH
F F
Слева – имена из текста, справа – собственное имя файла, регистр не учитывается. Поскольку у меня всего три звука, их названия не отличаются оригинальностью.
Теперь вад полностью работает.