Actor Nightmare_Raise : inventory
{Inventory.MaxAmount 1}
Actor Simple_Raise : inventory
{Inventory.MaxAmount 1}
Actor NightMare_Closer : inventory
{Inventory.MaxAmount 1}
Actor Simple_Closer : inventory
{Inventory.MaxAmount 1}
Actor Simple_Archvile : Archvile replaces Archvile
{
Health 700
Radius 20
Height 56
Mass 500
Speed 15
PainChance 10
Monster
MaxTargetRange 896
+QUICKTORETALIATE
+FLOORCLIP
+NOTARGET
SeeSound "vile/sight"
PainSound "vile/pain"
DeathSound "vile/death"
ActiveSound "vile/active"
MeleeSound "vile/stop"
Obituary "$OB_VILE"
States
{
Spawn:
VILE AB 10 A_Look
Loop
See:
VILE AABBCCDDEEFF 2 { A_Chase; return A_JumpIf(CountInv("Simple_Closer") > 0, "Heal"); }//если труп близко, воскрешаем.
Loop
Missile:
VILE G 0 Bright A_VileStart
VILE G 10 Bright A_FaceTarget
VILE H 8 Bright A_VileTarget
VILE IJKLMN 8 Bright A_FaceTarget
VILE O 8 Bright A_VileAttack
VILE P 20 Bright
Goto See
Heal:
TNT1 A 0 A_RadiusGive("Simple_Raise", 130, RGF_CORPSES, 1)
VILE "[\]" 10 Bright A_TakeInventory("Simple_Closer")
Goto See
Pain:
VILE Q 5
VILE Q 5 A_Pain
Goto See
Death:
VILE Q 7
VILE R 7 A_Scream
VILE S 7 A_NoBlocking
VILE TUVWXY 7
VILE Z -1
Stop
}
}
Actor Nightmare_Archvile : Archvile 7417
{//$Category NightMare
RenderStyle Subtract
SpawnID 1114
Health 1400
Bloodcolor 0 72 48
//renderstyle translucent
Alpha 0.7
Radius 20
Height 56
Mass 500
Speed 15
PainChance 10
Monster
MaxTargetRange 896
+QUICKTORETALIATE +FLOORCLIP +NOTARGET
SeeSound "vile/sight"
PainSound "vile/pain"
DeathSound "vile/death"
ActiveSound "vile/active"
MeleeSound "vile/stop"
Obituary "%o was splattered by a Nightmare Archvile."
States
{ Spawn:
VIL2 AB 10 A_Look
Loop
See:
//VIL2 F 0 A_JumpIf(CountInv("NightMare_Closer") > 0, "Heal.nightmare")
VIL2 AABBCCDDEEFF 2
{
A_Chase;
return A_JumpIf(CountInv("NightMare_Closer") > 0, "Heal");
}
Loop
Missile:
VIL2 G 0 BRIGHT A_VileStart //("NmArchvileFire")
VIL2 G 10 BRIGHT A_FaceTarget
VIL2 H 8 BRIGHT A_VileTarget //("NmArchvileFire")
VIL2 IJKLMN 8 BRIGHT A_FaceTarget
VIL2 O 8 BRIGHT A_VileAttack ("NmArchvileFire")
VIL2 P 20 BRIGHT
Goto See
Heal://.nightmare:
TNT1 A 0 A_RadiusGive("Nightmare_Raise", 130, RGF_CORPSES, 1)
VIL2 "[\]" 10 BRIGHT A_TakeInventory("NightMare_Closer")
Goto See
Pain:
VIL2 Q 5
VIL2 Q 5 A_Pain
Goto See
Death:
VIL2 Q 7
VIL2 R 7 A_Scream
VIL2 S 7 A_NoBlocking
VIL2 TUVWXY 7
VIL2 Z -1
Stop
Crush:
PON3 A -1 A_PlaySound ("Misc/Gibbed")
stop
}
}
Actor NmArchvileFire
{ +NOBLOCKMAP +NOGRAVITY
// RenderStyle Add
RenderStyle Subtract
Alpha 1
States
{ Spawn:
FIR2 A 2 BRIGHT A_StartFire
FIR2 BAB 2 BRIGHT A_Fire
FIR2 C 2 BRIGHT A_FireCrackle
FIR2 BCBCDCDCDEDED 2 BRIGHT A_Fire
FIR2 E 2 BRIGHT A_FireCrackle
FIR2 FEFEFGHGHGH 2 BRIGHT A_Fire
Stop
}
}
ACTOR Simple_ZombieMan : ZombieMan replaces ZombieMan
{
Health 20
Radius 20
Height 56
Speed 8
PainChance 200
Monster
+FLOORCLIP
SeeSound "grunt/sight"
AttackSound "grunt/attack"
PainSound "grunt/pain"
DeathSound "grunt/death"
ActiveSound "grunt/active"
Obituary "$OB_ZOMBIE" // "%o was killed by a zombieman."
DropItem "Clip"
States
{
Spawn:
POSS AB 10 A_Look
Loop
See:
POSS AABBCCDD 4 A_Chase
Loop
Missile:
POSS E 10 A_FaceTarget
POSS F 8 A_PosAttack
POSS E 8
Goto See
Pain:
POSS G 3
POSS G 3 A_Pain
Goto See
//==============================================================================
Death:
POSS H 5
POSS I 5 A_Scream
POSS J 5 A_NoBlocking
POSS K 5
Death.Wait:
POSS L 1 A_RadiusGive("Simple_Closer", 64, RGF_MONSTERS, 1, "Simple_Archvile")//Раздает вещь что бы кошмарный арч нашел труп
POSS L 0 A_JumpIf(CountInv("Simple_Raise") > 0, "Raise.Loop")//Проверяем, если арч воскресил моба, прыгаем в стейт воскрешения
POSS L 3
Loop
XDeath:
POSS M 5
POSS N 5 A_XScream
POSS O 5 A_NoBlocking
POSS PQRST 5
XDeath.Wait:
POSS U 1 A_RadiusGive("Simple_Closer", 64, RGF_MONSTERS, 1, "Simple_Archvile")//Раздает вещь что бы кошмарный арч нашел труп
POSS U 0 A_JumpIf(CountInv("Simple_Raise") > 0, "Raise.Loop")//Проверяем, если арч воскресил моба, прыгаем в стейт воскрешения
POSS U 3
Loop
Raise.Loop:
POSS H -1 {A_TakeInventory("Simple_Raise", 999); A_TakeInventory("Simple_Closer", 999); Thing_Raise(0, 1);}//Отсюда прыгнет в Raise стейт
Stop
Raise:
POSS K 5
POSS JIH 5 {A_TakeInventory("Simple_Raise", 999); A_TakeInventory("Simple_Closer", 999);}
Goto See
}
}
ACTOR Nightmare_ZombieMan 12000 //: ZombieMan replaces ZombieMan 12000
{
//$Category NightMare
Health 20
Radius 20
Height 56
Speed 10
PainChance 200
Monster
+FLOORCLIP
SeeSound "grunt/sight"
AttackSound "grunt/attack"
PainSound "grunt/pain"
DeathSound "grunt/death"
ActiveSound "grunt/active"
Obituary "$OB_ZOMBIE" // "%o was killed by a zombieman."
DropItem "Clip"
States
{
Spawn:
POSS AB 10 A_Look
Loop
See:
POSS AABBCCDD 4 A_Chase
Loop
Missile:
POSS E 10 A_FaceTarget
POSS F 8 A_PosAttack
POSS E 8
Goto See
Pain:
POSS G 3
POSS G 3 A_Pain
Goto See
//==============================================================================
Death:
POSS H 5
POSS I 5 A_Scream
POSS J 5 A_NoBlocking
POSS K 5
Death.Wait:
POSS L 1 A_RadiusGive("NightMare_Closer", 64, RGF_MONSTERS, 1, "Nightmare_Archvile")//Раздает вещь в радиусе 64 что бы кошмарный арч нашел труп
POSS L 0 A_JumpIf(CountInv("Nightmare_Raise") > 0, "Raise.Loop")//Проверяем, если арч воскресил моба, прыгаем в стейт воскрешения
POSS L 3
Loop
XDeath:
POSS M 5
POSS N 5 A_XScream
POSS O 5 A_NoBlocking
POSS PQRST 5
XDeath.Wait:
POSS U 1 A_RadiusGive("NightMare_Closer", 64, RGF_MONSTERS, 1, "Nightmare_Archvile")//Раздает вещь что бы кошмарный арч нашел труп
POSS U 0 A_JumpIf(CountInv("Nightmare_Raise") > 0, "Raise.Loop")//Проверяем, если арч воскресил моба, прыгаем в стейт воскрешения
POSS U 3
Loop
Raise.Loop:
POSS H -1 {A_TakeInventory("Nightmare_Raise", 999); A_TakeInventory("NightMare_Closer", 999); Thing_Raise(0, 1);}//Отсюда прыгнет в Raise стейт
Stop
Raise:
POSS K 5
POSS JIH 5 {A_TakeInventory("Nightmare_Raise", 999); A_TakeInventory("NightMare_Closer", 999);}
Goto See
}
}
Я надеюсь понятно что да как дальше делать?
Ну в смысле как делать других кошмарных монстров?
т.е. по сути надо простым и кошмарным монстрам менять стейты смерти и воскрешения, можно копипастой и править имена спрайтов..
alekv Ну и винегрет получился в коде. Буду думать стоило ли оно того, но спасибо. На сколько я знаю Арч не должен воскрешать тек, кого на куски порвало, только если труп целый остался Арч может его воскресить, у тебя на видео он всех подряд оживляет.
И гляжу не получилось у тебя задействовать эту новую атаку у кошмарного арча:
Скрытый текст:
Actor NmArchvileFire
{ +NOBLOCKMAP +NOGRAVITY
// RenderStyle Add
Alpha 1
States
{ Spawn:
FIR2 A 2 BRIGHT A_StartFire
FIR2 BAB 2 BRIGHT A_Fire
FIR2 C 2 BRIGHT A_FireCrackle
FIR2 BCBCDCDCDEDED 2 BRIGHT A_Fire
FIR2 E 2 BRIGHT A_FireCrackle
FIR2 FEFEFGHGHGH 2 BRIGHT A_Fire
Stop
}
}
я то прилепил её, но она не работает, кошмарный арч продолжает жарить огнём простого арча.
и кстати RenderStyle Subtract тут не в кассу, только транслюсент, заменять спрайты нужно в ручную каждый, ну это уже мои тараканы.
Много поменял ты зачемто значений номера акторов и названия в некоторых местах, они не заработают у меня))) пока не переправлю назад
Как сделать так, чтобы при пересечении какой-либо линии/при нажатии какой-либо кнопки у игрока пересекшего/нажавшего забирались все собранные ключи? Порт Zandronum, ну и ZDoom тоже собственно.
EDIT: Решено.
Спасибо, хотя я уже сам это нашел, но все же
У меня сейчас уже возникает вопрос по маппингу, не скриптингу: мне надо объединить две карты в одну, и возникает вот такая вот проблема: на одной карте таги начинаются с 1, и на других тоже. А надо, чтобы таги шли по порядку и на разных картах чтобы были разные, а то сразу вместо чего-то одного используешь что-то на каждой карте. Возможно ли как-нибудь их разъединить?
Что-то у меня такое чувство, что только вручную.
IvanFeeD, если через Doom Builder, то в настройках по F5, во вкладке "Pasting", есть функция "Renumber all tags to resolve conflicts with existing tags" ("Перенумеровать все теги для упреждения конфликтов с уже существующими тегами"). То есть ты выставляешь эту настройку и просто копируешь всё в одну карту.
Не атака такая же, просто спрайты другие и свечение другое, но для этого нужно кошмарному арчу как то прописать новую огненную атаку, которая по функционалу ни чем не отличается от обычной арч-атаки, только визуально. Надеюсь получится.
VILE H 8 Bright A_VileTarget(ИМЯ_НОВОГО_АКТОРА_АТАКИ)
А можно как то запретить обоим Арчам воскрешать трупы монстров, если они разорваны? (если труп перешёл в стейт XDeath)
Я так понял в XDeath надо убрать -1 так как здесь пишут что By default, only states with a -1 (infinite) duration are eligible.
Кстати, вопрос в зрительный зал: если вышеописанный метод с CanRaise пашет, может имеет смысл сделать так:
1) Каждому монстру делаем Death стейт без -1 (тобишь через loop)
2) Каждый тип Арча раздает свой айтем через radiusgive
3) Монстр в Death стейте чекает айтем, и если видим совпадение (например и монстр некошмарный и предмет некошмарный), то jump на те строки где CanRaise
А можно как то запретить обоим Арчам воскрешать трупы монстров, если они разорваны? (если труп перешёл в стейт XDeath)
Да, сотри у монстров в стейт XDeath.Wait полностью
и допиши вот эти 2 строки
POSS U -1
Stop
Вот так:
XDeath:
POSS M 5
POSS N 5 A_XScream
POSS O 5 A_NoBlocking
POSS PQRST 5
POSS U -1
Stop
SSV_Victoryan:
Осталось сделать чтобы по одному воскрешал монстров а не пачкой =D
Я думал над этим, но ничего толкового не придумал.
SSV_Victoryan:
и кстати RenderStyle Subtract тут не в кассу, только транслюсент, заменять спрайты нужно в ручную каждый, ну это уже мои тараканы.
Много поменял ты зачемто значений номера акторов и названия в некоторых местах, они не заработают у меня))) пока не переправлю назад
Это все для тестов было.
MyNameIs:
хотя не особо беспроблемно. корпсу только RadiusGive умеет давать?
Тут дело не в том как дать что-то корпсу, а в том как сделать так что бы воскрес только 1 монстр из 10 лежащих рядом
т.е. по факту я не могу сказать арчу что бы тот попробовал найти корпсы в радиусе 128 и если есть корпсы, надо выбрать 1ого и реснуть его.
Хотя наверное можно еще накостылить ацсом, арч как бы знает сколько трупов рядом т.к. каждый труп дает арчу вещь.. получил арч 10 вещей и во время воскрешения запускается ацс скрипт который... а чего он делает ХЗ.
Но еще есть вариант через глобальные переменные+массив попробовать, но это совсем уж..
Т.е. каждый корпс при смерти запоминает в переменную координаты, т.е. получится допустим 5 разных координат (5 корпсов лежащих рядом)
т.к. я знаб координаты всех 5ти, можно в одних из спавнить актера который даст корпсу вещь из-за которой он реснится.. НУ ЭТЖ ппц
Да и там мб понадобился бы динамический массив который умеет только зскрипт.. короче хз +)
Ну, вот еще 1 вариант, арч когда хилит, спавнит 1ого актера, который летитползетварпается к любому корпсу в радиусе хила арча т.е. 64 мап пикселя и когда позиция актера и корпса будет ==, актер радиусгивом даст корпсу вещь и корпс реснится..
Проблема в том, как натравить такого актера на корпса!! А так вариант вполне себе норм.
Добавлено спустя 20 минут 4 секунды:
theleo_ua:
Будет ли такое работать и какие подводные камни?
Ну так и работает.. Только поднимает всех монстров в радиусе. т.е. если 3-4 корпса кошмарных, поднимет всех т.к. радиусгив дает всем корпсам.
Вопрос в зрительный зал: есть вот такая конструкция:
Скрытый текст:
XDeath:
POSS M 5
POSS N 5 A_XScream
POSS O 5 A_NoBlocking
POSS PQRST 5
POSS U -1
Stop
и есть такая:
Скрытый текст:
XDeath:
POSS M 5
POSS N 5 A_XScream
POSS O 5 A_NoBlocking
POSS PQRST 5
Goto XDeath2
XDeath2:
POSS U 1
Loop
Будет ли второй вариант негативно влиять на производительность?
SSV_Victoryan:
И я так и не понял почему арчи не сможет оживить монстра, если сделать такую заглушку в икссмерти.
Потому что арч (как я понял из вики) пытается воскресить только те трупы, которые находятся на фреймах длительность которых -1 (и игнорит те трупы, которые находятся на фреймах длительность которых 0 или больше)
alekv:
Ну так и работает.. Только поднимает всех монстров в радиусе. т.е. если 3-4 корпса кошмарных, поднимет всех т.к. радиусгив дает всем корпсам.
Значит ты неправильно понял мою идею. Распишу подробнее:
1) Радиус гив делают арчи в состоянии See. Монстры/трупы ничего никому не радиусгивают
2) Когда труп в состоянии Death детектит, что ему арч дал предмет, то в зависимости от типа предмета этот труп джампает на такие фреймы, у которых есть приписка CanRaise (после чего убирает предмет, который ему дал арч), причем на этом фрейме он будет только 1 тик (количество тиков подобрать исходя из того, как часто арч радиусгивает)
Т.е. предмет не заставляет труп воскреситься, он всего лишь разрешает арчу его затриггерить.
Соответственно, если у нас несколько трупов рядом, мы как бы разрешаем арчу триггерить каждый труп обычным для арча способом, но так как арч своим обычным способом не умеет триггерить сразу несколько трупов, то он должен затриггерить только один (т.е. арчам мы ни в коем случае не переопределяем их vilechase и ни в коем случае не заставляем их принудительно джампать на heal, и единственное, что мы изменим в состоянии SEE для арча, это добавим туда радиусгив предмета с именем "это некошмарный арч" (или "это кошмарный арч"))
И еще важный момент: чтобы ликвидировать ситуацию, когда 2 разных арча рядом, и "правильный" арч дал предмет, а "неправильный арч" воскресил, сделать проверку на трупе, что если есть предмет каждого типа, то не джампать на фреймы с CanRaise, пока предмет не станет только одного типа. И исходя из текущего абзаца я так понял что радиусгивать надо таки на каждом тике
Вот желательно что бы простой арч да же не пытался воскрешать кошмарных(игнорировал)
1 - если сделать твоим способом, думаю арч будет пытаться ресать любой труп
2 - vileChase это и есть лекалка! т.е. стейт heal арчу просто для красоты дан.. Лечит трупы именно VileChase, а только потом прыгает в стейт хилл показать как он красиво поднял трупы =(
Опять что-то пошло не так чёрт.
Обычный арч(с права) вообще перестал оживлять обычных монстров. кАрч (с лева) вроде правильно оживляет только кМонстров (подсунул ему простого импа для проверки) но жарит огнём новым через любое препятствие, попробовал ноклипом спрятаться за картой так он и туда дотянулся.
Вот вырезал из декора ключевые части кода, который перекопировал в него из этой темы(вроде правильно приклеил но мог что-то не доглядеть):
Скрытый текст:
Actor Nightmare_Raise : inventory
{Inventory.MaxAmount 1}
Actor Simple_Raise : inventory
{Inventory.MaxAmount 1}
Actor NightMare_Closer : inventory
{Inventory.MaxAmount 1}
Actor Simple_Closer : inventory
{Inventory.MaxAmount 1}
/===============================
Actor HOTDImp : DoomImp Replaces DoomImp
{ States
{ Death:
TROO I 8 A_SetScale(ScaleX * RandomPick(-1.0, 1.0), ScaleY)
TROO J 8 A_Scream
TROO K 6
TROO L 6 A_NoBlocking
Death.Wait:
TROO M 1 A_RadiusGive("Simple_Closer", 64, RGF_MONSTERS, 1, "HOTDArchvile")
//^Раздает вещь что бы кошмарный арч нашел труп
TROO M 0 A_JumpIf(CountInv("Simple_Raise") > 0, "Raise.Loop")
//^Проверяем, если арч воскресил моба, прыгаем в стейт воскрешения
TROO M 3
Loop
Raise.Loop:
TROO I -1 {A_TakeInventory("Simple_Raise", 999); A_TakeInventory("Simple_Closer", 999); Thing_Raise(0, 1);}
//^Отсюда прыгнет в Raise стейт
Stop
Raise:
TROO MLKJI 8 {A_TakeInventory("Simple_Raise", 999); A_TakeInventory("Simple_Closer", 999);}
Goto See
Crush:
POL5 A -1 A_PlaySound ("Misc/Gibbed")
stop
}
}
/=====================================
Actor HOTDArchvile : Archvile Replaces Archvile
{ States
{ See:
VILE AABBCCDDEEFF 2 { A_Chase; return A_JumpIf(CountInv("Simple_Closer") > 0, "Heal"); }
//^если труп близко, воскрешаем.
Loop
Heal:
TNT1 A 0 A_RadiusGive("Simple_Raise", 130, RGF_CORPSES, 1)
VILE "[\]" 10 BRIGHT A_TakeInventory("Simple_Closer")
Goto See
Death:
VILE Q 7 A_SetScale(ScaleX * RandomPick(-1.0, 1.0), ScaleY)
VILE R 7 A_Scream
VILE S 7 A_NoBlocking
VILE TUVWXY 7
VILE Z -1
Stop
Crush:
POL5 A -1 A_PlaySound ("Misc/Gibbed")
stop
}
}
/=====================================
Actor NmImp 7404
{ SpawnID 1005
Health 120
Bloodcolor 0 72 48
Renderstyle Translucent
Alpha 0.7
Radius 20
Height 56
Mass 100
Speed 8
PainChance 200
Monster
+FLOORCLIP -COUNTKILL
SeeSound "imp/sight"
PainSound "imp/pain"
DeathSound "imp/death"
ActiveSound "NmMonsters/active"
MeleeSound "imp/melee"
Obituary "%o was cursed by a Nightmare Imp."
HitObituary "%o was touched by a Nightmare Imp."
MissileType NmImpBall
States
{ Spawn:
TRO2 AB 10 A_Look
Loop
See:
TRO2 AABBCCDD 3 A_Chase
Loop
Melee:
Missile:
TRO2 EF 8 A_FaceTarget
TRO2 G 8 A_CustomComboAttack("NmImpBall", 32, 3 * random(1, 8), "imp/melee")
Goto See
Pain:
TRO2 H 2
TRO2 H 2 A_Pain
Goto See
Death:
TRO2 I 8 A_SetScale(ScaleX * RandomPick(-1.0, 1.0), ScaleY)
TRO2 J 8 A_Scream
TRO2 K 6
TRO2 L 6 A_NoBlocking
Death.Wait:
TRO2 M 1 A_RadiusGive("NightMare_Closer", 64, RGF_MONSTERS, 1, "NmArchvile")
TRO2 M 0 A_JumpIf(CountInv("Nightmare_Raise") > 0, "Raise.Loop")
TRO2 M 3
Loop
Raise.Loop:
TRO2 I -1 {A_TakeInventory("Nightmare_Raise", 999); A_TakeInventory("NightMare_Closer", 999); Thing_Raise(0, 1);}
Stop
Raise:
TRO2 MLKJI 8 {A_TakeInventory("Nightmare_Raise", 999); A_TakeInventory("NightMare_Closer", 999);}
Goto See
XDeath:
TRO2 N 5
TRO2 O 5 A_XScream
TRO2 P 5
TRO2 Q 5 A_NoBlocking
TRO2 RST 5
TRO2 U -1
Stop
Crush:
PON3 A -1 A_PlaySound ("Misc/Gibbed")
stop
}
}
/=====================================
Actor NmArchvile 7417
{ SpawnID 1114
Health 1400
Bloodcolor 0 72 48
renderstyle translucent
Alpha 0.7
Radius 20
Height 56
Mass 500
Speed 15
PainChance 10
Monster
MaxTargetRange 896
+QUICKTORETALIATE +FLOORCLIP +NOTARGET -COUNTKILL
SeeSound "vile/sight"
PainSound "vile/pain"
DeathSound "vile/death"
ActiveSound "vile/active"
MeleeSound "vile/stop"
Obituary "%o was splattered by a Nightmare Archvile."
States
{ Spawn:
VIL2 AB 10 A_Look
Loop
See:
//VIL2 F 0 A_JumpIf(CountInv("NightMare_Closer") > 0, "Heal.nightmare")
VIL2 AABBCCDDEEFF 2 {A_Chase; return A_JumpIf(CountInv("NightMare_Closer") > 0, "Heal");}
Missile:
VIL2 G 0 BRIGHT A_VileStart
VIL2 G 10 BRIGHT A_FaceTarget
VIL2 H 8 BRIGHT A_VileTarget ("NmArchvileFire")
VIL2 IJKLMN 8 BRIGHT A_FaceTarget
VIL2 O 8 BRIGHT A_VileAttack
VIL2 P 20 BRIGHT
Goto See
Heal:
TNT1 A 0 A_RadiusGive("Nightmare_Raise", 130, RGF_CORPSES, 1)
VIL2 "[\]" 10 BRIGHT A_TakeInventory("NightMare_Closer")
Goto See
Pain:
VIL2 Q 5
VIL2 Q 5 A_Pain
Goto See
Death:
VIL2 Q 7
VIL2 R 7 A_Scream
VIL2 S 7 A_NoBlocking
VIL2 TUVWXY 7
VIL2 Z -1
Stop
Crush:
PON3 A -1 A_PlaySound ("Misc/Gibbed")
stop
}
}
/=====================================
Actor NmArchvileFire
{ +NOBLOCKMAP +NOGRAVITY
RenderStyle Add //translucent
Alpha 1
States
{ Spawn:
FIR2 A 2 BRIGHT A_StartFire
FIR2 BAB 2 BRIGHT A_Fire
FIR2 C 2 BRIGHT A_FireCrackle
FIR2 BCBCDCDCDEDED 2 BRIGHT A_Fire
FIR2 E 2 BRIGHT A_FireCrackle
FIR2 FEFEFGHGHGH 2 BRIGHT A_Fire
Stop
}
}
2 - vileChase это и есть лекалка! т.е. стейт heal арчу просто для красоты дан.. Лечит трупы именно VileChase, а только потом прыгает в стейт хилл показать как он красиво поднял трупы =(
Я в курсе
alekv:
1 - если сделать твоим способом, думаю арч будет пытаться ресать любой труп
1) внимательно читаешь вот это https://zdoom.org/wiki/Actor_states#CanRaise 2) ответь мне на следующий вопрос: есть оригинальный арч (его не переопределяли в декорейте) и три трупа в одном и том же месте:
Вася:
Скрытый текст:
XDeath:
POSS M 5
POSS N 5 A_XScream
POSS O 5 A_NoBlocking
POSS PQRST 5
POSS U -1
Stop
Петя:
Скрытый текст:
XDeath:
POSS M 5
POSS N 5 A_XScream
POSS O 5 A_NoBlocking
POSS PQRST 5
Goto XDeath2
XDeath2:
POSS U 1
Loop
И Сергей:
Скрытый текст:
XDeath:
POSS M 5
POSS N 5 A_XScream
POSS O 5 A_NoBlocking
POSS PQRST 5
Goto XDeath2
XDeath2:
POSS U 1 CanRaise
Loop
Исходя из этого, кого из них захочет воскрешать арч (напомню, что арч оригинальный, его не изменяли в декорейте) - Васю, Петю или Сергея?
Я вот начал пытаться этот метод реализовать, и проблема появилась в том, что когда я убиваю зомбимена в первый раз, арч его воскрешает, а когда второй раз, арч уже игнорит, и как потом выяснилось, проблема в том, что воскрешенный (и убитый заново) зомбимен почему-то не хочет принимать инвентори от арча. Вот реально не пойму, какого черта у радиусгива нет флага RGF_ALL который тупо даст предмет всем объектам в радиусе, чтобы не париться, к какому классу относится воскресший от CanRaise и умерший заново зомбимен
Я вот начал пытаться этот метод реализовать, и проблема появилась в том, что когда я убиваю зомбимена в первый раз, арч его воскрешает, а когда второй раз, арч уже игнорит, и как потом выяснилось, проблема в том, что воскрешенный (и убитый заново) зомбимен почему-то не хочет принимать инвентори от арча. Вот реально не пойму, какого черта у радиусгива нет флага RGF_ALL который тупо даст предмет всем объектам в радиусе, чтобы не париться, к какому классу относится воскресший от CanRaise и умерший заново зомбимен
alekv:
RGF_CORPSES | RGF_MONSTERS | итд
Адская жесть, проблема оказалась в том, что для того, чтобы твой переопределенный стейт SEE работал корректно (например если в Raise было написано Goto See чтобы оно прыгало именно на твой переопределенный See), то надо весь декорейт арча/зомбимена копипастить в твоего переопределенного (знающие люди - подскажите, как это лечить без копипасты тех стейтов, которые не переопределялись)
ACTOR NORMAL_Vile : Inventory
{
Inventory.MaxAmount 1
States
{
Spawn:
TNT1 A -1
Stop
}
}
ACTOR BLACK_Vile : Inventory
{
Inventory.MaxAmount 1
States
{
Spawn:
TNT1 A -1
Stop
}
}
//---------------------------------------------------------------------------------------------
//ARCH VILE NORMAL
ACTOR Archvile_NORMAL : Archvile replaces Archvile
{
States
{
Spawn:
VILE AB 10 A_Look
Loop
See:
VILE A 1 A_VileChase
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE A 1
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE A 1 A_VileChase
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE A 1
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE B 1 A_VileChase
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE B 1
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE B 1 A_VileChase
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE B 1
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE C 1 A_VileChase
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE C 1
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE C 1 A_VileChase
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE C 1
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE D 1 A_VileChase
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE D 1
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE D 1 A_VileChase
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE D 1
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE E 1 A_VileChase
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE E 1
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE E 1 A_VileChase
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE E 1
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE F 1 A_VileChase
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE F 1
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE F 1 A_VileChase
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE F 1
TNT1 A 0 A_RadiusGive("NORMAL_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
Loop
Missile:
VILE G 0 Bright A_VileStart
VILE G 10 Bright A_FaceTarget
VILE H 8 Bright A_VileTarget
VILE IJKLMN 8 Bright A_FaceTarget
VILE O 8 Bright A_VileAttack
VILE P 20 Bright
Goto See
Heal:
VILE "[]" 10 Bright
Goto See
Pain:
VILE Q 5
VILE Q 5 A_Pain
Goto See
Death:
VILE Q 7
VILE R 7 A_Scream
VILE S 7 A_NoBlocking
VILE TUVWXY 7
VILE Z -1
Stop
//---------------------------------------------------------------------------------------------
//ARCH VILE BLACK
ACTOR Archvile_BLACK : Archvile
{
RenderStyle Stencil
StencilColor Black
States
{
Spawn:
VILE AB 10 A_Look
Loop
See:
VILE A 1 A_VileChase
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE A 1
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE A 1 A_VileChase
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE A 1
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE B 1 A_VileChase
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE B 1
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE B 1 A_VileChase
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE B 1
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE C 1 A_VileChase
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE C 1
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE C 1 A_VileChase
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE C 1
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE D 1 A_VileChase
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE D 1
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE D 1 A_VileChase
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE D 1
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE E 1 A_VileChase
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE E 1
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE E 1 A_VileChase
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE E 1
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE F 1 A_VileChase
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE F 1
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE F 1 A_VileChase
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
VILE F 1
TNT1 A 0 A_RadiusGive("BLACK_Vile", 130, RGF_CORPSES | RGF_KILLED | RGF_NOSIGHT, 1)
Loop
Missile:
VILE G 0 Bright A_VileStart
VILE G 10 Bright A_FaceTarget
VILE H 8 Bright A_VileTarget
VILE IJKLMN 8 Bright A_FaceTarget
VILE O 8 Bright A_VileAttack
VILE P 20 Bright
Goto See
Heal:
VILE "[]" 10 Bright
Goto See
Pain:
VILE Q 5
VILE Q 5 A_Pain
Goto See
Death:
VILE Q 7
VILE R 7 A_Scream
VILE S 7 A_NoBlocking
VILE TUVWXY 7
VILE Z -1
Stop
}//States
}//ACTOR Archvile_BLACK : Archvile
//---------------------------------------------------------------------------------------------
//ZOMBIEMAN NORMAL
ACTOR ZombieMan_NORMAL : ZombieMan replaces ZombieMan
{
States
{
Spawn:
POSS AB 10 A_Look
Loop
See:
POSS AABBCCDD 4 A_Chase
Loop
Missile:
POSS E 10 A_FaceTarget
POSS F 8 A_PosAttack
POSS E 8
Goto See
Pain:
POSS G 3
POSS G 3 A_Pain
Goto See
Death:
POSS H 5
POSS I 5 A_Scream
POSS J 5 A_NoBlocking
POSS K 5
Goto DeathCheck
DeathCheck:
TNT1 A 0 A_JumpIfInventory("BLACK_Vile", 1, "DeathWithoutRaise")
TNT1 A 0 A_JumpIfInventory("NORMAL_Vile", 1, "DeathWithRaise")
POSS L 1
Loop
DeathWithRaise:
TNT1 A 0 A_TakeInventory("NORMAL_Vile", 1)
TNT1 A 0 A_TakeInventory("BLACK_Vile", 1)
POSS L 1 CanRaise
Goto DeathCheck
DeathWithoutRaise:
TNT1 A 0 A_TakeInventory("NORMAL_Vile", 1)
TNT1 A 0 A_TakeInventory("BLACK_Vile", 1)
POSS L 1
Goto DeathCheck
XDeath:
POSS M 5
POSS N 5 A_XScream
POSS O 5 A_NoBlocking
POSS PQRST 5
Goto XDeathLoop
XDeathLoop:
POSS U 1
Loop
//---------------------------------------------------------------------------------------------
//ZOMBIEMAN BLACK
ACTOR ZombieMan_BLACK : ZombieMan
{
RenderStyle Stencil
StencilColor Black
States
{
Spawn:
POSS AB 10 A_Look
Loop
See:
POSS AABBCCDD 4 A_Chase
Loop
Missile:
POSS E 10 A_FaceTarget
POSS F 8 A_PosAttack
POSS E 8
Goto See
Pain:
POSS G 3
POSS G 3 A_Pain
Goto See
Death:
POSS H 5
POSS I 5 A_Scream
POSS J 5 A_NoBlocking
POSS K 5
Goto DeathCheck
DeathCheck:
TNT1 A 0 A_JumpIfInventory("NORMAL_Vile", 1, "DeathWithoutRaise")
TNT1 A 0 A_JumpIfInventory("BLACK_Vile", 1, "DeathWithRaise")
POSS L 1
Loop
DeathWithRaise:
TNT1 A 0 A_TakeInventory("NORMAL_Vile", 1)
TNT1 A 0 A_TakeInventory("BLACK_Vile", 1)
POSS L 1 CanRaise
Goto DeathCheck
DeathWithoutRaise:
TNT1 A 0 A_TakeInventory("NORMAL_Vile", 1)
TNT1 A 0 A_TakeInventory("BLACK_Vile", 1)
POSS L 1
Goto DeathCheck
XDeath:
POSS M 5
POSS N 5 A_XScream
POSS O 5 A_NoBlocking
POSS PQRST 5
Goto XDeathLoop
XDeathLoop:
POSS U 1
Loop
но жарит огнём новым через любое препятствие, попробовал ноклипом спрятаться за картой так он и туда дотянулся.
Попробуй вместо
Actor NmArchvile 7417
писать так:
Actor NmArchvile : Archvile 7417
И так для всех твоих арчвайлов (т.е. ты их будешь не с нуля создавать, а наследовать с существующих)
номера (которые 7417) естественно должны быть разными для каждого типа арчвайла
Попробуй вместо
Actor NmArchvile 7417
писать так:
Actor NmArchvile : Archvile 7417
И так для всех твоих арчвайлов (т.е. ты их будешь не с нуля создавать, а наследовать с существующих)
номера (которые 7417) естественно должны быть разными для каждого типа арчвайла
Проблема в том, что монстры созданные через копирование : кода от других монстров не сражаются между собой и не могут друг друга убить если их натравить друг на друга(снарядами не могут, но огнестрелом могут убить). Сей час попробую твой вариант сделать, но без использования : копирования настроек существующих монстров. Мне нужно чтобы кошмарные дрались с простыми монстрами, если те заденут других и наоборот.
Напишу что выйдет в итоге, думаю проблема с новым огнём кошмарного арча останется не разрешённой.