Данный гайд был сделан по реквесту Егор Борисенко, свои реквесты в комментариях или в группе вк.
Предисловие.
В этой статье я расскажу вам о создании колонн (Pillar) в ZDoom. Научимся открывать и закрывать их, а также, создавать вертикальные двухсторонние двери.
Возводим колонну.
Сначала, откройте Ultimate Doom Builder, и создайте там, такие колонны.

Далее, задайте этому сектору — тег.

Линии с которыми вы собираетесь взаимодействовать обязательно должны выглядывать наружу. Поменять сторону линии, можно наведя мышкой на линию и нажав F в 2d режиме.
К зеленой линии, установите действие Pillar Build.

Разберем аргументы у Pillar Build:
- Sector Tag — номер сектора колонны
- Movement Speed — скорость перемещения пола и потолка сектора.
- Target Height (rel.) — если указан 0, то пол/потолок будет перемещаться до соприкосновения пола/потолка, в противном случае, на заданное значение.
В игре, это действие приведет к соединению пола и потолка.

К противоположной линии, установите действие Pillar Open.

У Pillar Open, разберем новые аргументы:
- Lower Floor By — если 0, то пол колонны перемещается до пола вне колонны, иначе, перемещается на заданное значение.
- Raise Ceiling by — тоже самое что и Lower Floor By, но с потолками.
В игре, это выглядит так.

Таким образом, мы можем открыть колонну, и закрыть её.
Создаем вертикальную двухстороннюю дверь.
К сожалению в ZDoom нет действия открывающего колонну и через некоторое закрывающего её, как у двери, в действии Door Generic (202). Однако, используя возможности ACS, и действия Pillar Open, Pillar Build, мы можем обойти это ограничение.
Добавьте следующий код к себе в ACS.
#include "zcommon.acs"
script 2(int tag){
int waitTime = 40;
Pillar_Open(tag,16,0,0);
TagWait(tag);
ACS_NamedExecuteAlways("pillarBack",0,tag,waitTime,0);
}
script "pillarBack" (int tag, int waitTime) {
int myTimer = waitTime;
while(myTimer != 0){
myTimer--;
Delay(1);
}
Pillar_BuildAndCrush(tag,16,0, 10,2);
}
Далее, создайте парочку закрытых колонн.

И привяжите к линиям колонн выполнение 2-го скрипта. В поле tag, укажите тег сектора колонны.

Все, двери созданы.

Далее разберем ACS код добавленный ранее.
Разбираем ACS код вертикальных двухсторонних дверей.
Разберем 2-ой скрипт.
script 2(int tag){ //Данный скрипт принимает число (int) и хранит его в переменной tag
int waitTime = 40;
Pillar_Open(tag,16,0,0); //Открываем колонную указанного тега, со скоростью 16,двигаем до максимума пол (0), и потолок (0)
TagWait(tag); //Ждем пока действие в секторе tag (открытие колонны) закончится.
ACS_NamedExecuteAlways("pillarBack",0,tag,waitTime,0); //Выполняем скрипт pillarBack в новом потоке, из первой карты (0), в качестве аргументов передаем tag и waitTime.
}
Т.е. скрипт 2, принимает tag сектора колонны, открывает её со скоростью 16, ждет пока она полностью откроется, и выполняет скрипт pillarBack, передав ему tag колонны и время ожидания.
Остальное я разобрал в комментариях (//), едем дальше.
script "pillarBack" (int tag, int waitTime) {
int myTimer = waitTime; //Переносим значение waitTime в переменную myTimer
while(myTimer != 0){ //Делаем заддержку myTimer тиков
myTimer--; //Уменьшаем myTimer на 1
Delay(1); //Ждем 1 тик
}
Pillar_BuildAndCrush(tag,16,0, 10,2); //Вызываем закрытие колонны
}
Данный скрипт ждет waitTime тиков, и вызывает Pillar_BuildAndCrush. Разберем эту комманду.
Pillar_BuildAndCrush(тег_сектора,скорость_закрытия,расстояние_перемещения, урон_при_раздавливании, множитель_этого_урона);
- тег_сектора — задает сектор колонны
- скорость_закрытия — скорость перемещения потолка и пола.
- расстояние_перемещения — если указан 0, то пол/потолок будет перемещаться до соприкосновения пола/потолка, в противном случае, на заданное значение.
- урон_при_раздавливании — урон что получает игрок при раздавливании.
- множитель_этого_урона — урон_при_раздавливании множится на это число.
Вроде все рассмотрел, если остались вопросы, оставляйте их в комментариях или в группе вк.
Итоговый результат.
