Сегодня я расскажу о 25 применениях типов урона, что ж, сразу к делу.
1. Кастомная анимация боли
Pain.Fire:
HEAD E 3 A_SpawnItemEx("ArchvileFire")
HEAD E 0 A_Pain
HEAD F 3 A_SpawnItemEx("ArchvileFire")
HEAD E 0 A_Pain
HEAD E 3 A_SpawnItemEx("ArchvileFire")
HEAD E 0 A_Pain
HEAD F 3 A_SpawnItemEx("ArchvileFire")
HEAD E 0 A_Pain
HEAD E 3 A_SpawnItemEx("ArchvileFire")
HEAD E 0 A_Pain
HEAD F 3 A_SpawnItemEx("ArchvileFire")
HEAD E 0 A_Pain
Goto See
2. Кастомная анимация смерти
Death.Ice:
IMPI A 0 A_PlaySound("Monsters\Freeze")
IMPI ABCDEFGHIJ 5 A_PlaySound("Monsters\Defrosting")
TROO I 6
TROO J 5 A_Scream
TROO K 4
TROO L 3 A_NoBlocking
TROO M -1
Stop
3. Лечение
Pain.HealingExplode:
BOSS E 0 A_PlaySound("baron/sight")
BOSS E 0 A_QuakeEx(9, 9, 9, 140, 0, 128)
BOSS E 0 HealThing(24, 0)
BOSS E 35
Goto See
4. Агрессия монстра с флагом NoInFighting
Pain.Angry_Alert:
VILE Q 0 A_ChangeFlag("NoInFighting", False)
VILE Q 0 A_AlertMonsters
VILE Q 0 A_Pain
VILE Q 4 A_RadiusThrust(-10000, 512)
VILE Q 0 A_QuakeEx(9, 9, 9, 70, 0, 256)
VILE "[\]" 35 A_PlaySound("Vile/RunFools")
Goto IBossOfThisGym_Fools
Удобность этого способа в том, что ты можешь сам контролировать поведение монстров когда в них попали свои(для этого не обязательно ставить флаг NoInFighting в монстре), однако для этого нужен отдельный тип урона, но сделать снаряд который будет иметь два типа урона( 1 просто тип урона снаряда 2 для проверки фриендли фаера) легко
ACTOR FriendlyFireArachnotronPlasma : ArachnotronPlasma
{
DamageType "Plasma"
States
{
Death:
APBX A 0 A_SpawnItemEx("FriendlyFireDamage")
APBX ABCDE 5 BRIGHT
Stop
}
}
Actor FriendlyFireDamage
{
+NoInterasction
+DontThrust
DamageType "Angry_Alert"
States
{
Spawn:
TNT1 A 0 A_Explode((1), 16)
Stop
}
}
5. Опускание вниз
Pain.Action_Down:
FATT A 0 HealThing(1, 0)// чтобы не было урона
FATT A 0 ThrustThingZ(0, 32, 1, 0)
Goto See
6. Подымание вверх
Pain.Action_Up:
FATT A 0 HealThing(1, 0)// чтобы не было урона
FATT A 0 ThrustThingZ(0, 32, 0, 0)
Goto See
7. Передвижение
Pain.Action_Forward:
POSS A 0 HealThing(1, 0)// чтобы не было урона
POSS A 0 ThrustThing(Angle/360*256, 32, 0, 0)
Goto See
8. Поворот
Pain.Action_Rotate:
CPOS A 0 A_SetAngle((GetSpawnHealth - health) * 10)// угл зависит от дамага, 360 = 36 дамага
CPOS A 0 HealThing((GetSpawnHealth - health) * 10, 0)// чтобы не было урона
Goto See//пример этого кода не работает со старыми портами
Pain.Action_Rotate:
CPOS A 0 A_SetAngle((ACS_NamedExecuteWithResult("GetActorSPWHealth", 0)- health) * 10)
CPOS A 0 HealThing((ACS_NamedExecuteWithResult("GetActorSPWHealth", 0) - health) * 10, 0)
Goto See//этот код работает со старыми портами
9. Нажимная плита
Pain.PlateAction_Map14Index23:
PLAY A 0 HealThing(1, 0)// чтобы не было урона
PLAY A 0 Sector_SetDamage(245, 0, 0, 0, 0)/*удалить действие нажимной плиты(удалить дамаг), чтобы плиту можно было использовать только один раз*/
PLAY A 0 Floor_LowerByValue(245, 32, 8)//опускание нажимной плиты
PLAY A 5
PLAY A 0 Generic_Door(284, 32, 1, 0, 0)
PLAY A 10
PLAY A 0 Generic_Stairs(288, 16, 8, 0, 0)
PLAY A 0 Floor_RaiseByValue(245, 32, 8)//подымание нажимной плиты
Goto See
10. Контроль над ACS скриптами при нахождении в секторе
Pain.SectorAction_ACS_Terminate_68:
PLAY A 0 HealThing(1, 0)// чтобы не было урона
PLAY A 0 ACS_Terminate(68, 0)
Goto See
11. Заморозка акторов(отключение движения)
Pain.MotionFreeze:
BSPI A 0 HealThing(1, 0)// чтобы не было урона
BSPI A 0 A_ChangeFlag("DontThrust", True)/*тут показан пример полной остановки движения, т.е актора нельзя сдвинуть ничем, даже ThrustThing*/
Goto See
Pain.MotionFreeze:
BSPI A 0 HealThing(1, 0)// чтобы не было урона
BSPI A 0 A_ScaleVelocity(0.0)/*Тут уже пример похож на SetPlayerProperty(0, On, PROP_Frozen) только для любого актора, т.е проперти speed выставляется на 0*/
Goto See
12. Выведение текста на экран
Pain.Print_Freeman_you_fool:
PLAY A 0 HealThing(1, 0)// чтобы не было урона
PLAY A 0 A_Print("Freeman! you fool!", 2)
Goto Spawn
13. Заморозка времени
Pain.TimeFreeze:
PLAY A 0 HealThing(1, 0)// чтобы не было урона
PLAY A 0 A_GiveInventory("TimeFreezeSphere")
Goto Spawn
14. Выставление определённых аргументов
Pain.MonsterSpot_ChangeMonster:
TNT1 A 0 A_SetArg(0, GetSpawnHealth - health)//тип монстра зависит от дамага
TNT1 A 0 HealThing((GetSpawnHealth - health), 0)// чтобы не было урона
Goto Spawn//этот пример кода не работает на старых портах
Pain.MonsterSpot_ChangeMonster:
TNT1 A 0 A_SetArg(0, ACS_NamedExecuteWithResult("GetActorSPWHealth", 0)- health)
TNT1 A 0 HealThing((ACS_NamedExecuteWithResult("GetActorSPWHealth", 0)- health), 0)
Goto Spawn//этот пример кода работает со старыми портами
15. Изменение высоты пола/потолка
Pain.FloorControl_LowerBy8Speed16:
TNT1 A 0 Floor_LowerByValue(0, 16, 8)
Goto Spawn
15. Изменение цвета сектора
Pain.ColorControl_SetRed365:
TNT1 A 0 Sector_SetColor(365, GetSpawnHealth - health, 0, 0, 0)// от дамага зависит количество красного
TNT1 A 0 HealThing(GetSpawnHealth - health), 0)
Goto Spawn//данный пример кода не для старых портов
Pain.ColorControl_SetRed365:
TNT1 A 0 Sector_SetColor(365, ACS_NamedExecuteWithResult("GetActorSPWHealth", 0) - health, 0, 0, 0)
TNT1 A 0 HealThing((ACS_NamedExecuteWithResult("GetActorSPWHealth", 0)- health), 0)
Goto Spawn//вот это уже работает со старыми портами
16. Изменение размера текстуры
Pain.TextureControl_Line238Resize:
TNT1 A 0 Line_SetTextureScale(365, GetSpawnHealth - health, GetSpawnHealth - health, 0)/*взависимости от урона актор поставит размер текстуры*/
TNT1 A 0 HealThing(GetSpawnHealth - health), 0)// для того чтобы не было урона
Goto Spawn//этот пример не для старых портов
Pain.TextureControl_Line238Resize:
TNT1 A 0 Line_SetTextureScale(365, ACS_NamedExecuteWithResult("GetActorSPWHealth", 0)- health, GetSpawnHealth - health, 0)
TNT1 A 0 HealThing((ACS_NamedExecuteWithResult("GetActorSPWHealth", 0)- health), 0)
Goto Spawn//это уже для старых портов
17. Секретный выход с уровня(переход на секретный уровень)
Pain.DamageExit_Secret:
TNT1 A 0 Exit_Secret(0)
Stop
18. Изменение уровня сложности
Pain.ChangeSkillDamage:
CYBR A 0 A_PlaySound("cyber/sight")
CYBR A 0 ChangeSkill(ACS_NamedExecuteWithResult("GetSkill", 0) + 1)//что меня не убивает, делает меня игру сильней
Goto See
19. Изменение камеры
Pain.DemonsView:
SARG A 0 ChangeCamera(0, 1, 0)
Goto See
20. Автосэйв игрока
Pain.SaveScamDamage:
PAIN A 0 Autosave
Goto See
21. Изменение яркости сектора
Pain.LightDamage:
SKEL L 0 A_Jump(256, "UpLight", "DownLight")
Goto See
UpLight:
SKEL L 5 Light_RaiseByValue(User_SectorTag, Random(16, 32))
SKEL L 5 A_Pain
Goto See
DownLight:
SKEL L 5 Light_LowerByValue(User_SectorTag, Random(16, 32))
SKEL L 5 A_Pain
Goto See
22. Контроль над полиобъектами
Pain.Fire:
SPOS G 3 Polyobj_DoorSwing(23, 16, 64, 35)
SPOS G 3 A_Pain
Goto See
23. Телепортация
Pain.Posion:
SKUL E 3 Bright Teleport(0, Random(1, 100), 0)
SKUL E 3 Bright A_Pain
Goto See
24. Передвижение текстуры
Pain.Electric:
SPID I 3 Bright Scroll_Texture_Both
(
User_LineId, ACS_NamedExecuteWithResult("Scroll_GetVelX", 0)
0, ACS_NamedExecuteWithResult("Scroll_GetVelZ", 0),
ACS_NamedExecuteWithResult("Scroll_GetVelZ", 0)
)/*Я так оформил функцию потому что если бы она была в одну строчку то мотать код вправо чтобы посмотреть конец свойств не удобно*/
SPID I 3 Bright A_Pain
Goto See
25. Изменение цели
Pain.MonsterRetarget:
BOS2 A 8 A_RearrangePointers(AAPTR_Tracer)
Goto See
Добавление типа урона которого можно использовать в уровнях
Чтобы сделать такой тип урона нужно записать подобный код в decorate
DamageType "имя"
{
NoArmor//не обязательное свойство, оно делает броню бесполезной против этого типа урона
Factor 1.0/*не обязательное свойство, может быть не только 1.0, множитель на который обычно умножается урон, это свойство перебивается свойством актора DamageFactor если он у актора есть*/
ReplaceFactor//я так и не понял что это но оно не обязательное
}
Ну вот и всё, досвидос дос нам в нос