DECORATE. Создание напарников

Эта статья была изменена автором

Играя в brutal doom вы периодически пересекались с напарниками, так вот об этих напарниках и пойдёт речь.

Для начала, посмотрим кусочек кода напарников из моего мода(старого и кринжового).

ACTOR Marines 4304
{
//$Category Friendly NPCs
Game Doom
Health 900
Radius 4
Height 56
Speed 6
PainChance 50
-> MONSTER <-
-FLOORCLIP

да да и ещё раз ДА! напарники это монстры, но почему они убивают своих ? (наверно потому напарникам сверлят в 8 утра)

вот по этому тут этот тутор,

Для начала, вернёмся в в прошлое, когда болон только написал тутор zdoom.создание монстров(1), и напишем этот код

ACTOR marine 14349
{
Health 100
Radius 20
Height 56
Mass 100
Speed 10
PainChance 200
Monster
+FLOORCLIP
SeeSound "grunt/sight"
PainSound "grunt/pain"
DeathSound "grunt/death"
ActiveSound "grunt/active"
HitObituary "pain!!!"
Obituary "pain???"
States
{
      Spawn:
play AB 10 A_Look
Loop
      See:
play AABBCCDD 3 A_Chase
Loop
      Missile:
play EF 8 A_FaceTarget
play G 6 A_PosAttack
Goto See
       Pain:
play H 2
play H 2 A_Pain
Goto See
       Death:
play I 8
play J 8 A_Scream
play K 6
play L 6 A_NoBlocking
play M -1
Stop
      XDeath:
play N 5
play O 5 A_XScream
play P 5
play Q 5 A_NoBlocking
play RST 5
play U -1
Stop
       Raise:
play MLKJI 8
Goto See
}
}

так вот наш будущий напарник

его поведение сейчас:

и сейчас он ведёт себя как обычный монстр, но как тогда сделать напарника?

всё легко и просто!

ACTOR marine 14349
{
Health 100
Radius 20
Height 56
Mass 100
Speed 10
PainChance 200
Monster
+FLOORCLIP
-> +FRIENDLY <-
SeeSound "grunt/sight"
PainSound "grunt/pain"
DeathSound "grunt/death"
ActiveSound "grunt/active"
HitObituary "pain!!!"
Obituary "pain???"
States
{
        Spawn:
play AB 10 A_Look
Loop
        See:
play AABBCCDD 3 A_Chase
Loop
       Missile:
play EF 8 A_FaceTarget
play G 6 A_PosAttack
Goto See
     Pain:
play H 2
play H 2 A_Pain
Goto See
        Death:
play I 8
play J 8 A_Scream
play K 6
play L 6 A_NoBlocking
play M -1
Stop
          XDeath:
play N 5
play O 5 A_XScream
play P 5
play Q 5 A_NoBlocking
play RST 5
play U -1
Stop
       Raise:
play MLKJI 8
Goto See
}
}

вот оно! флаг дружелюбный делает противоположность монстра.

и если вы хотите сделать так чтобы напарник не воевал с монстрами то поставьте ему флаг +NOINFIGHTING

его поведение с флагом FRIENDLY:

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

для начала создания интеллекта надо узнать семейство скриптов a_jump.

примеры с a_jump:

a_jump(256,»стэйт1″, «стэйт2» (можно больше стэйтов))

так и давайте поймём что это такое

пример 1, 256 шанс перескакивания на стэйт, т.е 0 он не перескакивает, 256 перескакивает всегда, если стэйт один то он перескакивает на один и тот же стэйт каждый раз когда он перескакивает, если несколько, то стэйт выбирается рандомно, т.е A_Jump(128, «Missile1», «Missile2») означает, что есть 25% того что с этого момента актор будет воспроизводить стэйт Missile1 и ещё 25% того что Missile2
Формула шанса перескакивания: Шанс из 256 \ 256 * 100(переводим в % из 100) / количество стэйтов(если их несколько и мы считаем шанс одного стэйта)

примеры с a_jumpif:

a_jumpif(условие, «Стэйт»)

Перескакивание на какой-то стэйт если условие совпадает, например условие WaterLevel == 3 (актор полностью в воде)

примеры с a_jumpifinventory:

a_jumpifinventory(«инвенторий», число, «Стэйт»)

если число какого-то инвентория равно или больше какому-то числу, то перескакиваем на какой-то стейт

теперь мы можем сделать интеллект, зная принцип семейства функций a_jump.

мой пример приятеля с интеллектом

ACTOR marine 14349
{
Health 100
Radius 20
Height 56
Mass 100
Speed 10
PainChance 200
Monster
+FLOORCLIP
+FRIENDLY
SeeSound "grunt/sight"
PainSound "grunt/pain"
DeathSound "grunt/death"
ActiveSound "grunt/active"
HitObituary "pain!!!"
Obituary "pain???"
States
{
	Spawn:
play AB 10 A_Look
Loop
	See:
play a 0 a_jumpif(damage > 10, "run")
play a 0 a_jumpif(damage > 20, "jumpup")
play AABBCCDD 3 A_Chase
Loop
    jumpup:
play a 0 a_changeflag("FLOORCLIP", 0)
play A 1 ThrustThing(0, Random(24, 48), 0, 0)
goto see
    run:
play AA 3 A_Chase
play AA 0 A_Chase
play AA 0 A_Chase
PLAY BB 3 A_Chase
PLAY BB 0 A_Chase 
PLAY BB 0 A_Chase 
PLAY CC 3 A_Chase 
PLAY CC 0 A_Chase 
PLAY CC 0 A_Chase 
PLAY DD 3 A_Chase
PLAY DD 0 A_Chase
PLAY DD 0 A_Chase
Loop
	Missile:
	PLAY A 0 A_JUMP(256, "Missile1", "Missile2", "Missile3")
goto see
    Missile1:
play EF 8 A_FaceTarget
play G 6 A_PosAttack
Goto See
    Missile2:
play EF 8 A_FaceTarget
play G 6 A_PosAttack
play AA 0 A_Chase
play G 2 A_PosAttack
play G 1 A_PosAttack
play AA 0 A_Chase
play AA 0 A_Chase
play AA 0 A_Chase
play G 6 A_PosAttack
play AA 0 A_Chase
play G 2 A_PosAttack
play G 1 A_PosAttack
play AA 0 A_Chase
Goto See
    Missile3:
play EF 8 A_FaceTarget
play G 6 A_SposAttackUseAtkSound
Goto See
	Pain:
play H 0 A_JUMP(256, "RUN", "PAIN1")
Goto see
    Pain1:
play H 2
play H 2 A_Pain
Goto See
	Death:
play I 8
play J 8 A_Scream
play K 6
play L 6 A_NoBlocking
play M -1
Stop
	XDeath:
play N 5
play O 5 A_XScream
play P 5
play Q 5 A_NoBlocking
play RST 5
play U -1
Stop
	Raise:
play MLKJI 8
Goto See
}
}
avatar