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


ДЛЯ МОДДИНГА

Хотите изменит наклон\поворот предмета? вам нужен A_SETROLL, A_SETPITCH, A_SETANGLE
A_SETROLL(roll[- + =] число) Наклон влево\вправо,

A_SETPITCH(PITCH[- + =] число) Наклон вверх\вниз,

И кстати, когда вы смотрите вверх вниз вы изменяете pitch игрока,
A_SETANGLE(ANGLE[- + =] число) Поворот вправо\влево,

Так к примеру можно сделать наклон камеры игрока
actor newDoomPlayer : PlayerPawn
{
Speed 1
Health 100
Radius 16
Height 56
Mass 100
PainChance 255
Player.DisplayName "Marine"
Player.CrouchSprite "PLYC"
Player.StartItem "Pistol"
Player.StartItem "Fist"
Player.StartItem "Clip", 50
Player.WeaponSlot 1, "Fist", "Chainsaw"
Player.WeaponSlot 2, "Pistol"
Player.WeaponSlot 3, "Shotgun", "SuperShotgun"
Player.WeaponSlot 4, "Chaingun"
Player.WeaponSlot 5, "RocketLauncher"
Player.WeaponSlot 6, "PlasmaRifle"
Player.WeaponSlot 7, "BFG9000"
Player.ColorRange 112, 127
Player.Colorset 0, "$TXT_COLOR_GREEN", 0x70, 0x7F, 0x72
Player.Colorset 1, "$TXT_COLOR_GRAY", 0x60, 0x6F, 0x62
Player.Colorset 2, "$TXT_COLOR_BROWN", 0x40, 0x4F, 0x42
Player.Colorset 3, "$TXT_COLOR_RED", 0x20, 0x2F, 0x22
// Doom Legacy additions
Player.Colorset 4, "$TXT_COLOR_LIGHTGRAY", 0x58, 0x67, 0x5A
Player.Colorset 5, "$TXT_COLOR_LIGHTBROWN", 0x38, 0x47, 0x3A
Player.Colorset 6, "$TXT_COLOR_LIGHTRED", 0xB0, 0xBF, 0xB2
Player.Colorset 7, "$TXT_COLOR_LIGHTBLUE", 0xC0, 0xCF, 0xC2
States
{
Spawn:
PLAY A -1 a_setroll(0)
Loop
See:
PLAY AB 2 a_setroll(roll+0.5)
PLAY A 0 a_setroll(0)
play CD 2 a_setroll(roll-0.5)
Loop
Missile:
PLAY E 6 a_setpitch(pitch+1)
play e 0 a_recoil(1) //ну эт уже не наклон а отхождение назад
PLAY E 6 a_setpitch(pitch-1)
Goto Spawn
Melee:
PLAY F 6 BRIGHT
Goto Missile
Pain:
PLAY G 0 a_recoil(1)
play g 0 a_setangle(angle+1)
PLAY G 2 A_Pain
Goto Spawn
Death:
PLAY H 0 A_PlayerSkinCheck("AltSkinDeath")
Death1:
PLAY H 10 a_setroll(90)
PLAY I 10 A_PlayerScream
PLAY J 10 A_NoBlocking
PLAY KLM 10
PLAY N -1
Stop
XDeath:
PLAY O 0 A_PlayerSkinCheck("AltSkinXDeath")
XDeath1:
PLAY O 5
PLAY P 5 A_XScream
PLAY Q 5 A_NoBlocking
PLAY RSTUV 5 a_setroll(roll+90)
PLAY W -1
Stop
AltSkinDeath:
PLAY H 6 a_setroll(90)
PLAY I 6 A_PlayerScream
PLAY JK 6
PLAY L 6 A_NoBlocking
PLAY MNO 6
PLAY P -1
Stop
AltSkinXDeath:
PLAY Q 5 A_PlayerScream
PLAY R 0 A_NoBlocking
PLAY R 5 A_SkullPop
PLAY STUVWX 5 a_setroll(roll+90)
PLAY Y -1
Stop
}
}
Если что, стейт spawn у игрока это когда он просто стоит, see ты идёшь, melee/missile стрельба, death смэрт, xdeath варш мен, pain когда ударился мизинцем об тумбочку
Но делая такой поворот камеры, будьте осторожны с a_setroll, так как этот параметр игрок не может изменить, то есть повернуть влево\вправо вы можете и посмотреть вверх вниз тож можете но наклонится влево\вправо вы не можете, и roll может изменить только код.

Так, нам нужна отпечатка после пули
decal имя отпечатки
{
pic спрайт отпечатки
x-scale размер по горизонтали
y-scale размер по вертикали
}
И потклучаем отпечатку к декорэйт
actor подзатыльник
{
height 8
radius 6
damage 5
speed 20
-> DECAL ИМЯ <-
PROJECTILE
states
{
Spawn:
BAL1 AB 4 bright
loop
Death:
BAL1 CDE 6 bright
stop
}
}

Бочка не отталкивается, оружие не отскакивает при сильном ударе в стену да оно и не подвижно, ну и где реалистичность? Ну так она есть, но её код в предметы не добавлена в дум.
+PUSHABLE
PushFactor число силы отталкивания
Это нужно для отталкивания.
+HexenBounce
+CanBounceWater //отскок от воды, по желанию
BounceFactor число силы отскока
Это нужно для отскока.
Отскок и отталкивание совсем другие вещи. отталкивание: если в предмет врезался другой актор то предмет оттолкнётся от актора, отскок: если предмет влетел в стену то он отскочит от стены
и то и другое можно впихнуть в один актор
Для маппинга
Итак, я сделал карту со всяким для маппинга и сейчас мы будем её разбирать


Гифка такая не качественная потому что очень сильно сжата до 2мб, увы такие правила сайта.
И под изменением света я имею в виду не тот разноцветный свет а изменение brightness сектора.
И так, давайте сделаем acs script и подключим его к линии
script 1 (VOID)
{
Light_ChangeToValue(тэг сектора, число brightness);
}
+БОНУС
для рестарта или цикла скрипта acs нужен
Рестарт:
restart;
Цикл:
while (TRUE)
{
комманды
}
И цикл тож надо вставить в сам скрипт


Есть 23 вида dynamic light акторов, но на гифке 3 основных динамических светов
PULSE LIGHT
Медленное перекачивание первого радиуса света до второго радиуса

FLICKER LIGHT
Мигающий свет, но когда он мигает он не пропадает на время а потом включается, а время работает радиус света primary intensity а потом работает радиус secondary intensity. Ну если поставить на какой-то из радиусов 0 то свет будет пропадать а потом светится и так циклически

LIGHT
Ну тут функций и нету, простой динамический свет, чей радиус света можно изменить

Ооо и кстти, у света можно изменять цвет с помощью аргументов актора red, green, blue
и я напишу несколько комбинаций цветов.
ЖЁЛТЫЙ = RED 255, GREEN 255, BLUE 0.
ФИОЛЕТОВЫЙ = RED 255, GREEN 0, BLUE 255.
ОРАНЖЕВЫЙ = RED 255, GREEN 155, BLUE 0.
БИРЮЗОВЫЙ = RED 0, GREEN 255, BLUE 255.
Ну с красным, зелёным и синим понятно, и ещё, чёрный цвет не виден


Итак, когда мы переходим линию нас атакует три напарника из тутора DECORATE. Создание напарников и в том прикол что это напарник
и то что они не уходят с места это всего лишь линии вокруг них с флагом block monsters
но тут два вопроса
- Почему они в нас стреляют
- Почему они только на стейте выстрела
И теперь давайте опять нырнём в acs
script 2 (VOID)
{
while (TRUE)
{
SETACTORFLAG(19, "FRIENDLY", 0);
SetActorState(19, "Missile2");
delay(26);
}
}
И давайте всё это разрежем на кусочки чтобы разглядеть по лучше.
SETACTORFLAG('id актора, "флаг", bool(true(флаг включён) или false(флаг выключен)));
SetActorState(id актора, "стейт");
delay(число тиков); //задержка, ожидание
И вот ответ, а delay нужен что бы стейт доработал до конца а потом опять включился с помощью цикла.
Но самое главное в этой сцене это изменение флага, а SetActorState просто делает стрельбу постоянной (и при этом на столько постоянной что эта команда даже не даёт прокрутится стейту смерти актора, держите в курсе).


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

Но проход надо замаскировать (ну если игрок должен видеть монстров которые будут телепортироваться, то не надо маскировать)
МАСКИРОВКА
Шаг 1: Пол\потолок поднять или опустить до пола\потолка но при этом оставить один пиксель для звука

Шаг 2: Добавить текстуру в слот middle и выровнить её (быстро выровнить можно нажав ctrl+a, ну это уже горячая клавиша редактора карт)

Шаг 3 по желанию: Поставить флаги impossible, block projectiles на линию
МАСКИРОВКА ОКОНЧЕНА
Теперь надо поставить вот такую стенку в комнате

Но главное чтобы эта стена не была до потолка, и наче звук не пройдёт до монстров,
теперь вокруг стены делаем линии с экшином teleport, и ставим телепорту всё то что на картинке

И теперь надо на сектор поставить тег, и в этот сектор поставить точку телепорта

и точке телепорта тоже надо дать тег (точка телепорта должна быть в секторе с тегом на который ссылается телепорт)
и теперь давайте поставим монстров между стенкой которую мы создали ранее

Стойте стойте стойте, у вас не получилось? если у вас не получилось то вы сделали так что бы до монстров не доходил звук, просто они не пойдут на линию телепортации, они просто будут стоять ибо зачем им идти если они звука не слышали тобиж они о вашем присутствие не знают, и если монстры услышат звук или до них дойдёт команда alert monsters то они начнут двигаться и идти тобиж они перейдут через линию телепортации и телепортнуться в точку телепортации (сколько раз я сказал телепортации?).
Мда, и вправду, торт — это ложь!.
вот и сказочке конец
и всем

