Zdoom — 25 применений. типы урона

Сегодня я расскажу о 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//я так и не понял что это но оно не обязательное
}

Ну вот и всё, досвидос дос нам в нос

avatar