Zdoom Mapping, ACS, взрывающиеся стены, как в Duke 3d

Всем здрасьте. Сегодня наш урок будет о такой фишке, как взрывающиеся стены из Duke 3d.
Начну с того, что у меня есть уже достаточно большой опыт по конвертированию карт из Build-игр на движок дума. Первый мой проект был по игре Shadow Warrior , от туда были сконверчены все карты из сингла. На данном скриншоте демонстрируется карта из дополнения Duke Vacation(пляжный дюк). И конечно же подобные стены были как в шедое, так и в дюке.
Для начала определимся с небольшими нюансами. Во времена здаемона уже был мод с билдовскими картами из игры Blood, но реализация ввиду отсутствия декорейта была мягко говоря — никакущая. Взрывающиеся стены там были, но применялся принцип опускания секторов и «взорвать» такую стену можно было даже с пистолета. Долгие и упорные изучения особенностей декорейта и АЦС позволили создать совершенно новую систему, со «своим блек джеком».
И так правильно определимся, что нам нужно: чтобы стена именно взрывалась взрывающим оружием и чтобы эта система была как можно универсальнее, для более гибкого использования.
В UDMF формате есть очень хорошая фишка у объектов — при смерти вызывается какое либо действие. Это нам и сыграет на руку. Давайте с вами создадим пустой объект в декорейте, задача которого будет только одна — делать какое либо действие при смерти(и при этом его не будет видно):


Actor SWWallDamagePoint 20188 { -SOLID +SHOOTABLE +NOBLOOD +NOTAUTOAIMED Height 0 Radius 0 Health 8 States { Spawn: TNT1 A 1 Loop Death: TNT1 A 1 Stop } }

Обратите внимание, на параметры Height и Radius — там нули, как раз для того, чтобы объект не принимал урон из оружия, которое не взрывается или стреляет хитсканами. Это очень важный нюанс, который позволяет сделать систему универсальной под любой мод, без использования DamageType. Так же обратите, что у актора стоит новый порядковый номер, отличный от всех. Я опущу нюанс по добавлению новых ресурсов, не тема данного урока. Вообщем новый номер будет отображаться в списке новых предметов в редакторе карт.

Давайте теперь с вами сделаем комнату, в которой будет заранее взорванная стена. Например вот так:

Теперь определимся со следующими вещами. Что происходит при взрыве стены? «Конечно же спавнятся сами взрывы!» — скажите вы и будете абсолютно правы. НО! — нужно ведь создать позиции под данные взрывы. В UDMF для этих целей есть спец. предмет — MapSpot. Мап-споты могут иметь свои уникальные тэги, что облегчает нам работу. Давайте теперь внутри нашей стены создадим 3 мап-спота, которые будут служить «якорями» для спавна взрывов. А так же «пронумеруем» наши мап-споты по порядку, начиная от 1 до 3. Например вот так:

Следующий логичный вопрос — а как саму стену то закрыть? Для этого нам придётся лезть в параметры линий, благо в в UDMF формате их много и они достаточно гибкие. Но обо всём по порядку. Выходим из 3д режима и выделяем все линии, которые будут «закрыты» мидл-текстурами. Стоит заметить, что нашим линиям нужно будет задать свой уникальный тэг. Зачем? — объясню ниже. Выделяем и лезем в параметры вот так:

Заметьте, какие параметры выставлены у линии — непроходимость(impassible) и различные блоки монстров\игроков\хитсканов\снарядов. После таких манипуляций стена «запечатана» и непроходима. Теперь, условно, «взорванности» нет. Что же дальше? Давайте теперь визуально обозначим эту стену, как ту, что можно взорвать. Вот так:

Обратите внимание, что это простая одиночная линия с мидл-текстурой, которая не множится. Линии выставлен тот же тэг, что и тем стенам, которые «запечатали» проход. Это важно! Объясню почему позже.
Следующий наш шаг — теперь нам надо связать наши стены и мап-споты в одно целое. А именно вспоминаем наш пустой актор, который мы создали в начале для того, чтобы он просто «умирал». Поместим предмет вот так:

И так, нам остаётся только актор, который будет «взрывом». Я сделал свой, используя ресурсы Duke 3d, вы можете использовать любой другой свой. В качестве примера я выложу готовый код «актора-взрыва»:

ACTOR DukeExplodeSpot 20187
{
+Ripper
+NoGravity
-SOLID
Scale 0.7
States
{
Spawn:
TNT1 A 0
TNT1 AAAAAAAAA 0 Radius_Quake(5,35,0,25,0)
TNT1 A 0 A_Explode(35,85)
DNXD A 1 Bright A_PlaySound("BOMBEXPL", 7, 1.0)
DNXD A 1 Bright
DNXD BCDEFGHIJKLMNOPRSTU 2 Bright
Stop
}
}

Теперь, пройдя весь долгий путь, у нас есть полный набор для «связывания» такой стены в скриптах. Открываем редактор скриптов в редакторе карт и в наше окно пишем вот такой вот текст:

Include "zcommon.acs"

//---------Wall scripts-----------//
Script 1 (void)
{
SetLineTexture(4, SIDE_FRONT, TEXTURE_MIDDLE, "-");
SetLineBlocking(4,BLOCK_NOTHING);
Line_SetBlocking(4, 0, 16);
Line_SetBlocking(4, 0, 512);
Line_SetBlocking(4, 0, 32);
SpawnSpotForced("DukeExplodeSpot", 1, 0, 0);
delay(5);
SpawnSpotForced("DukeExplodeSpot", 2, 0, 0);
delay(5);
SpawnSpotForced("DukeExplodeSpot", 3, 0, 0);
}

Обратим внимание на данный скрипт — он очень простой.
SetLineTexture — функция, которая подменяет текстуру у линии, где SIDE_FRONT — с какой стороны текстура(с лицевой или со спины), и TEXTURE_MIDDLE — «средняя часть», та самая мидл текстура. Помните я упомянул, что у одиночной линии с текстурой «трещины» надо поставить такой же тэг, что и у стен, которые «запечатывали» проход. Вот за этим.
SetLineBlocking и Line_SetBlocking — функции, которые отменяют блоки на заданных линиях по указаным тэгам. Это для того, чтобы «разблокировать» наши линии, которые запечатали проход.
SpawnSpotForced — спавн нашего «актора-взрыва» в мап-споты-якоря.

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

Что же будет в игре? А вот что:

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

avataravatar

Пожалуйста отключи блокировщик рекламы, или внеси сайт в белый список!

Please disable your adblocker or whitelist this site!