Creating new monsters or other complex items
Warning: Information on this page is outdated. It relies on DECORATE functionality (which is currently deprecated in GZDoom), and may also contain mistakes, bad practices or missing details. See here for an up-to-date ZScript version of this page. |
Monsters are just regular actors that call some specific monster AI action functions:
It's these functions that make an actor act like a monster but there's a few more things to observe:
- Use the Monster property. This sets up all the necessary flags to make an actor act like a monster.
- A monster's height and radius should be set properly. Unlike decorations it is essential that these values are correct because they are used by the collision detection code which also checks whether a monster has been hit by a weapon.
- A monster should have proper definitions for all standard sounds or it might remain silent in certain situations.
- A monster requires a minimum set of states:
- Spawn: This should define a looping 'idle' sequence. This sequence has to call A_Look or A_Look2 repeatedly so that the monster can react to players.
- See: This defines a looping walking sequence. This sequence has to call A_Chase or one of its variants repeatedly so that the monster can walk around and do things.
- Melee/Missile: This defines a near or far attack sequence. At least one of them is needed so that the monster is able to attack players or other monsters
- Death: This is called when the monster's health goes below zero.
- You can also define one of the optional special death sequences, a Pain state which makes the monster react to being attacked or the Raise state which makes it resurrectable by Arch-Viles or other monsters capable of doing that.
This is an example of a properly defined monster. It is just an exact replica of Doom's pistol shooting Zombie:
actor ZombieClone 3004 { SpawnID 4 Obituary "%o was killed by a zombieman." Health 20 Radius 20 Height 56 Mass 100 Speed 8 PainChance 200 SeeSound "grunt/sight" AttackSound "grunt/attack" PainSound "grunt/pain" DeathSound "grunt/death" ActiveSound "grunt/active" DropItem "Clip" 256 Monster +FLOORCLIP 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 POSS L -1 stop XDeath: POSS M 5 POSS N 5 A_XScream POSS O 5 A_NoBlocking POSS PQRST 5 POSS U -1 stop Raise: POSS KJIH 5 goto See } }
If you don't need a complete monster but ony a subset of its functions you can do so. For example to create a shootable item that doesn't act as a monster all you have to do is to remove the See state, the call to A_Look in the spawn state and replace the Monster property with the appropriate flags. The one flag you need is SHOOTABLE but normally you might want to set a few others as well. This is an example of a shootable decoration:
actor FloorLamp 10247 { Health 1 Radius 16 Height 51 DeathSound "misc/glass" +SHOOTABLE +SOLID +NOBLOOD states { Spawn: HAWA A -1 Bright Loop Death: HAWA B 11 A_Scream HAWA C 9 HAWA D -1 A_Fall Stop } }
Other things are possible as well, for example an actor that reacts to seeing a player but instead of waking up and attacking the player it is doing something else, for example playing a sound:
actor TriggerSound1 10601 { SeeSound "ts1" +NOBLOCKMAP states { Spawn: TNT1 A 2 A_Look Loop See: TNT1 A 1 Stop } }