Examples for actor definitions
------------------------------

1) a complete definition from scratch:

ACTOR ZombieMan 3004
{
    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 "%o was killed by a zombieman."
    DropItem Clip
    Damage 4
    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_BulletAttack
        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_Fall
        POSS K 5
        POSS L -1
        Stop
    XDeath:
        POSS M 5
        POSS N 5 A_XScream
        POSS O 5 A_Fall
        POSS PQRST 5
        POSS U -1
        Stop
    Raise:
        POSS KJIH 5
        Goto See
    }
}


2) an actor which inherits from an existing one:


ACTOR PlasmaZombie : ZombieMan 9600
{
    Health 40
    DropItem Cell
    MissileType PlasmaBall
    States
    {
    Missile:
        POSS E 10 A_FaceTarget
        POSS F 5 A_MissileAttack
        POSS E 5 A_FaceTarget
        POSS F 5 A_MissileAttack
        POSS E 5 A_FaceTarget
        POSS F 5 A_MissileAttack
        Goto See
    }
}

(this is a zombie which fires 3 plasma bullets when attacking)


3) an actor which uses SKIP_SUPER

ACTOR DeadZombieMan : ZombieMan 18
{
    SKIP_SUPER
    Spawn Parent Death+4
}

(this actor doesn't inherit anything from its parent - it just uses
 some of its states.)


Syntax:
-------

ACTOR classname [ : parentclassname] [doomednum]
{
    properties 
    flags
    ...
}

classname:              The name this new actor is referenced by in the game
parentclassname:        (optional) The name of a parent class this new actor
                        inherits its attributes from.
doomednum:              Editor number for this actor (optional)


List of properties:
===================

SKIP_SUPER              reinitializes the actor as if it has no parent
                        This can be used to have access to the parent's
                        states without inheriting its attributes. See
                        3) above for an example.
SPAWNID value            defines the spawn ID to be used with Thing_Spawn
                        and its derivates.
HEALTH value            defines the health a monster starts with
                        Default is 1000
REACTIONTIME value      Time in tics (1/35 seconds) a monster needs
                        to attack back. There is normally no need to
                        change this value. 
                        Default is 8
PAINCHANCE value        Probability of entering the pain state.
                        255=always, 0=never
                        Default is 0
DAMAGE value            For a projectile defines the damage it inflicts
                        upon impact. The formula is random(1,8)*damage
                        or (random(1,4)*damage if STRIFEDAMAGE is set.
                        This also defines the damage for actors which
                        attack like the Lost Soul. The formula for this
                        is random(1,8)*damage.
                        DAMAGE is also used to define how many bullets
                        are fired by the generic hitscan attack function
                        A_Bulletattack.
                        Default is 0
SPEED value             Defines how fast an actor moves. For projectiles
                        this is the distance it moves. For monsters it
                        defines the size of one step done in A_Chase.
                        Default is 0.
RADIUS value            Defines the radius of this actor.
                        Default is 20.
HEIGHT value            Defines the height of this actor
                        Default is 16.
MASS value              Defines the mass of this actor.
                        The larger the mass the less an actor moves when
                        being thrust by damage.
                        Default is 100. 
XSCALE value            Defines the X-scaling for this actor.
                        Range is [0.0, 4.0].
                        Default is 1.0                    
YSCALE value            Defines the Y-scaling for this actor.
                        Range is [0.0, 4.0].
                        Default is 1.0                    
SCALE value             Combines XScale and YScale
                        Range is [0.0, 4.0].
                        Default is 1.0                    
SEESOUND name           Defines the sound the actor makes when it sees
                        the player (for monsters) or when a projectile
                        is spawned.
ATTACKSOUND name        Defines the sound the actor makes when attacking.
PAINSOUND name          Defines the sound the actor makes when in pain.
                        To hear this sound A_Pain has to be called.
DEATHSOUND name         Defines the sound the actor makes when dying
                        or when a projectile explodes.
ACTIVESOUND name        Defines the sound the actor makes when active.
MELEESOUND name         Defines the sound the actor makes when doing
                        a melee attack in A_MeleeAttack. Note that
                        several original attack functions which have
                        such a sound use a hard coded reference (e.g.
                        A_TroopAttack uses imp/melee)
RENDERSTYLE type        Defines how this actor is rendered. Useful values are:
                        NONE - actor is invisible
                        NORMAL - actor is visible and not translucent
                        FUZZY - like the Spectre in Doom
                        TRANSLUCENT - actor is translucent.
                        ADD - actor uses additive translucency.
                        Default is NORMAL
ALPHA value             defines the opacity/intensity for render styles 
                        TRANSLUCENT and ADD.
                        Range is [0.0, 1.0]
                        Default is 1.0
DEATHHEIGHT value       Defines the height this actor has after dying.
                        Default is 1/4 of the original height                    
BURNHEIGHT value        Defines the height this actor has after dying by fire.
                        Default is 1/4 of the original height                    
*OBITUARY string        Defines the obituary string for this actor. This string
                        uses a few placeholders:
                        %o: victim's name                    
                        %k: killer's name
                        %g: he/she/it
                        %h: him/her/it
                        %p: his/her/its
*HITOBITUARY string     Defines the obituary string for a melee attack by this
                        actor. If not present OBITUARY is used. The same format
                        as for OBITUARY appplies.
*DONTHURTSHOOTER        If this actor deals explosive damage and is a projectile
                        it does not hurt the shooter.
*EXPLOSIONRADIUS value  Defines the radius of explosive damage
                        Default is 128
*EXPLOSIONDAMAGE value  Defines the amount of explosive damage
                        Default is 128
MELEEDAMAGE value       Defines the amount of damage this monste will inflict
                        when using A_MeleeAttack. The formula is random(1,8)*damage.
MISSILETYPE name        Defines the projectile type this monster is firing when
                        using A_MissileAttack. Any valid projectile present in the
                        game can be specified.
MISSILEHEIGHT value     Defines the height at which the projectile is spawned.
                        Default is 32.                        
MONSTER                 Sets all appropriate flags to make this actor act as a regular
                        monster. The following flags are being set:
                        SHOOTABLE, COUNTKILL, SOLID, CANPUSHWALLS, ACTIVATEMCROSS, CANPASS, ISMONSTER.
PROJECTILE              Sets all appropriate flags to make this actor act as a regular
                        projectile. The following flags are being set:
                        NOBLOCKMAP, NOGRAVITY, DROPOFF, MISSILE, ACTIVATEIMPACT, ACTIVATEPCROSS, NOTELEPORT.
CLEARFLAGS              clears all flags 
*DROPITEM name [probability [amount]]
                        Drops an item of type 'name' when dying. Optionally the probability
                        can be specified. A probability of 255 means the item is always dropped,
                        a probability of 0 means it is never dropped.
                        amount is only applicable for Heretic ammuniton. It specifies how much
                        ammo the dropped item contains.
                        There can be more than one DROPITEM definitions for an actor. The
                        amount is unlimited.
                        DROPITEM works differently with inherited actors. An actor can inherit
                        a list of DROPITEM definitions from its parent but if it defines one
                        of its own the entire parent's list is discarded.
SPAWN
SEE
MELEE
MISSILE
PAIN
DEATH
XDEATH
BURN
ICE
RAISE
CRASH                   With these keywords a specific state in the actor can be either cleared
                        or set to one of the parent's states. The syntax is:
                        SPAWN 0 to clear a state or
                        SPAWN PARENT DEATH[+offset] to set a parent's state. See 3) above for an
                        example
                        
STATES                  Defines an actor's states. See the separate block STATES for more information


Properties prefixed with a '*' cannot be inherited from predefined actors due to the
implementation.


List of flags
=============


Flags are special properties that can be either set or cleared
+flagname sets a flag
-flagname clears a flag

The following flags exist. If applicable the name is identical with the one used
in regular DECORATE items.

SOLID                   set when the object should be solid (blocking)
SHOOTABLE               object can be damaged. If health goes below 0 it dies
NOSECTOR                Object is not linked into the sector. This makes it invisible
                        and excludes it from certain physics checks.
NOBLOCKMAP              This object is excluded from passive collision detection. Nothing else
                        can run into a NOBLOCKMAP object but the object itself can run
                        into others. All projectiles have this set.
AMBUSH                  Monster is 'deaf'. Normally this is set in an editor on a per-
                        object basis.
JUSTHIT                 try to attack right back (used in monster AI, probably not
                        particularly useful in actor definitions)
JUSTATTACKED            take at least one step before attacking   
SPAWNCEILING            spawned hanging from the ceiling as opposed to standing on the 
                        floor.
NOGRAVITY               Actor is not subject to gravity
DROPOFF                 Monster can walk over ledges/taller steps.
NOCLIP                  Actor is totally excluded from collision detection and
                        can walk through walls etc.
FLOAT                   Floating monster - can change height at will.
TELEPORT                Although implemented there isn't a single actor which
                        uses this flag. I can't say what it does precisely but
                        it excludes an actor that has it set from certain parts
                        of the collision detection logic.
MISSILE                 Actor is a projectile.
SHADOW                  Actor is nearly invisible. Unlike regular Doom this does
                        not automatically imply fuzziness. For that you have to
                        specify RenderStyle Fuzzy.
NOBLOOD                 Actor does not bleed when hurt.
CORPSE                  Actor is a corpse. For normal actors there is no need to
                        set this but in combination with the crashstate it might
                        be useful.
COUNTKILL               Counts toward kill percentage
COUNTITEM               Counts toward item percentage
NOTDMATCH               Is not being spawned in Deathmatch games.
NOLIFTDROP              Does not drop when a lift under it lowers
STEALTH                 Stealth monster
ICECORPSE               Actor is a frozen corpse
LOWGRAVITY              Actor is subject to low gravity
WINDTHRUST              Actor is thrust by the Heretic wind specials. I hope its
                        functionality is some day expanded to the Boom wind specials
HERETICBOUNCE           Heretic style bouncing (objects only bounce off the floor)
HEXENBOUNCE             Hexen style bouncing (objects bounce off floors and walls)
DOOMBOUNCE              ZDoom style bouncing (like hexen but stops when losing a certain
                        amount of momentum)
                        The 3 bounce types are mutually exclusive
FLOORCLIP               Actor's lower part is clipped when standing in a sector
                        with a liquid texture (defined in  the TERRAIN lump)
SPAWNFLOAT              Actor is spawned hat a random height in the sector.
NOTELEPORT              Actor cannot teleport
RIPPER                  For projectiles that can rip through monsters and players.
PUSHABLE                Actor can be pushed.
SLIDESONWALLS           Actor can slide along walls
CANPASS                 Actor uses height sensitive collision detection. Use with care!
                        This only makes sense on actors that can move by themselves.
CANNOTPUSH              This actor cannot push pushable objects.
THRUGHOST               This actor passes through ghosts (set with the GHOST flag.)
BOSS                    Actor is a boss. Bosses have a few special properties
                        (like playing some sounds at full volume.)
FIREDAMAGE              Actor inflicts fire damage. 
ICEDAMAGE               Actor inflicts ice damage.
NODAMAGETHRUST          Upon hitting another actor the victim is not thrust when damaged.
TELESTOMP               This actor can telefrag others.
FLOATBOB                use float bobbing z movement like Heretic/Hexen's powerups
ACTIVATEIMPACT          Upon hitting a wall this actor can activate G1/GR lines
CANPUSHWALLS            Upon hitting a wall this actor can activate P1/PR lines
ACTIVATEMCROSS          This actor can activate 'Monster crosses' lines.
ACTIVATEPCROSS          This actor can activate 'Projectile crosses' lines.
CANTLEAVEFLOORPIC       This actor cannot cross into a sector with a different floor
                        texture.
NONSHOOTABLE            Actor cannot be hit (projectiles pass through.)
INVULNERABLE            Actor cannot be hurt.
DORMANT                 Actor is dormant and has to be activated with Thing_Activate.
SEEKERMISSILE           Actor is a homing missile. This is only used as a hint to the
                        game. For a homing missile to be effective it has to use
                        one of the seeker missile code pointers in its moving states.
REFLECTIVE              Actor reflects missiles shot at it.
FLOORHUGGER             defines a projectile that is moving along the floor.
CEILINGHUGGER           defines a projectile that is moving along the ceiling.
NORADIUSDMG             Actor cannot be hurt by radius (explosive) damage.
GHOST                   Actor is a ghost. This does not imply translucency etc.
DONTSPLASH              Actor does not create any terrain splashes
DONTOVERLAP             Two actors with this flag cannot overlap at the same x/y-position
                        but different heights
DONTMORPH               Cannot be morphed into a chicken or pig.
DONTSQUASH              This actor cannot be instantly killed by Heretic's powered up Mace.
FULLVOLACTIVE           Plays its active sound at full volume
ISMONSTER               Actor is a monster
SKYEXPLODE              Projectile explodes when hitting a sky instead of vanishing
STAYMORPHED             If morphed this actor cannot revert to its original form.
DONTBLAST               Cannot be blasted by Hexen's Disc of Repulsion.
CANBLAST                Can be blasted by Hexen's Disc of Repulsion. For monsters this is
                        implicit.
NOTARGET                cannot be targeted by other monsters.
DONTGIB                 cannot be crushed to a pile of blood.
NOBLOCKMONST            can walk through monster blocking lines.
FULLVOLDEATH            Plays its death sound at full volume
CANBOUNCEWATER          Can bounce on water. Normally an object is destroyed in this case.
NOWALLBOUNCESND         Does not play a sound when bouncing off a wall. Normally the
                        Seesound is played in this case.
FOILINVUL               Can hurt invulnerable monsters (but not players.)
NOTELEOTHER             Cannot be teleported by Hexen's banishment device.
QUICKTORETALIATE        Immediately switches targets when being attacked.
NOICEDEATH              Monster cannot be frozen, used to prevent the generic ice death.
RANDOMIZE               Randomizes the duration for its first frame. Most of Doom's projectiles
                        use this.
FIXMAPTHINGPOS          Move thing out of walls. For torches and similar things that tend to be
                        placed directly on a wall.
ACTLIKEBRIDGE           Uses the special collision logic for bridge things.
STRIFEDAMAGE            Strife uses a different damage calculation for its projectiles.


States (a.k.a. Frames)
======================

States define the behavior of an actor. For any regular actor there are the following
labels:

SPAWN                   defines the state that is displayed when an actor is spawned
                        For monsters this is normally also the idle loop.
SEE                     defines the walking animation for a monster. 
MELEE                   defines the melee (near) attack.
MISSILE                 defines the missile (far) attack.
PAIN                    defines the pain action
DEATH                   defines the normal death sequence
XDEATH                  defines the extreme (splatter) death sequence
BURN                    defines the burn (fire) death sequence
ICE                     defines the freeze (ice) death sequence
RAISE                   defines the resurrection sequence (for the Arch Vile)
CRASH                   defines the crash sequence. This is entered when the actor
                        is a corpse and hits the floor.




A state definition is started with the 'STATES' keyword and enclosed
by braces '{', '}'.

A state definition consists of the following:

1) State labels. This is one of the keywords listed above followed by a ':'.
    Example
        Spawn:
    defines the entry point for the spawn state.
    
2) State definitions. These consist of a sprite name, a frame sequence,
    the duration in tics (1/35 seconds) and optionally the 'BRIGHT'
    keyword to indicate a fullbright display and an action function name
    (code pointer)
    Example
        POSS AABBCCDD 4 A_Chase
    This defines 8 states. Each one of them uses the sprite POSS, has a duration
    of 4 and uses the code pointer A_Chase which is the standard walk function
    for monsters. Of these 8 states the first 2 will use the sprite frame 'A',
    the next 2 the frame 'B' and so on. The length of theframe sequence can be
    up to 256 characters. Valid frames are 'A'-'Z', '[', '\' and ']'.
    Different sprites can be freely mixed in an actor definition each separate
    state definition is limited to one sprite only.
    
3) Jump instructions
    There are 4 different jump instructions:
    
    -Loop       jumps to the most recently defined state label. This is
                used for a looping animation
    -Stop       Stops animating this actor. Normally this is used at the
                end of the death sequences.
    -Wait       Loops the last defined state. This is only useful if a
                code pointer is used that waits a given time or for a
                certain event. Currently the only usable code pointer
                for this is A_FreezeDeathChunks which is normally used
                at the end of a freeze death sequence.
    -Goto label+offset
                Jumps to an arbitrary state in the current actor.
                With this you can also jump to a state that was
                inherited by a parent. See Example 2) above for this
                The 'Goto see' jumps to the walking animation that
                has been inherited.
    
Important note:
---------------
This format has been designed for maximum flexibility. As a result no assumptions
are made what the designer wants. No states are ever implicitly created.


Action functions:
=================

This information is kept rather brief. For normal purposes in-depth information
is not necessary. All action functions names are preceded by 'A_'. 

A_BFGSpray              Starts the effect when a BFG projectile hits something
A_Pain                  Plays the pain sound (that's all it does, it can also be used outside the pain sequence!)
A_NoBlocking            Sets the actor to non-blocking and drops items.
A_XScream               Plays the sound 'misc/gibbed'
A_Look                  Look for players - used in the idle sequence of monsters
A_Chase                 Standard walking function - used in the walk sequence of monsters
A_FaceTarget            Change angle to face target
A_PosAttack             Zombie attack (one bullet)
A_Scream                Plays the death sound (that's all it does, it can also be used outside the death sequence!)
A_SPosAttack            Shotgunner attack (3 bullets)
A_VileChase             Arch Vile: look for corpses and walk.
A_VileStart             Plays sound 'vile/start'
A_VileTarget            Spawns the Arch Vile fire.
A_VileAttack            Arch Vile attack function. Inflicts some damage and thrusts victim in the air.
A_Fire                  Keeps Arch Vile's fire in front of target
A_StartFire             Plays sound 'vile/firestrt' and calls A_Fire
A_FireCrackle           Plays sound 'vile/firecrkl' and calls A_Fire
A_Tracer                Homing routine for Revenant's missile
A_SkelWhoosh            Calls A_FaceTarget and plays sound 'skeleton/swing'.
A_SkelFist              Revenant's melee attack.
A_SkelMissile           Revenant's missile attack
A_FatRaise              Calls A_FaceTarget and plays sound 'fatso/raiseguns'.
A_FatAttack1            Mancubus attack 1
A_FatAttack2            Mancubus attack 2
A_FatAttack3            Mancubus attack 3
A_BossDeath             Boss death specials. Has no effect for custom monsters
A_CPosAttack            Chaingunner attack
A_CPosRefire            Chaingunner refiring
A_TroopAttack           Imp attack
A_SargAttack            Demon attack
A_HeadAttack            Cacodemon attack
A_BruisAttack           Baron attack
A_SkullAttack           Lost Soul attack
A_Metal                 Plays 'spider/metal' and calls A_Chase
A_SpidRefire            Spider refiring
A_BabyMetal             Plays 'baby/walk' and calls A_Chase
A_BspiAttack            Arachnotron attack
A_Hoof                  Plays 'cyber/hoof' and calls A_Chase
A_CyberAttack           Cyberdemon attack
A_PainAttack            Pain Elemental attack
A_PainDie               Pain Elemental death
A_KeenDie               Keen death - opens door with tag 666 if all monsters of the calling kind are dead.
A_BrainPain             Plays 'brain/pain' at full volume.
A_BrainScream           Starts brain explosion
A_BrainDie              Ends level if not in deathmatch
A_BrainAwake            Plays 'brain/sight' at full volume.
A_BrainSpit             Spits one brain cube
A_SpawnFly              Brain cube handling incl. monster creation
A_SpawnSound            plays 'brain/cube' and calls A_SpawnFly
A_BrainExplode          Brain explosion
A_Die                   Kills actor
A_Detonate              Inflicts explosive damage - amount specified by DAMAGE in the actor
A_Mushroom              Shoots a lot of mancubus fireballs high in the air

A_SetFloorClip          Sets the FLOORCLIP flag
A_UnSetFloorClip        Clears the FLOORCLIP flag
A_HideThing             Makes actor invisible
A_UnHideThing           Makes actor visible
A_SetInvulnerable       Makes actor invulnerable
A_UnSetInvulnerable     Makes actor vulnerable
A_SetReflective         Sets the REFLECTIVE flag
A_UnSetReflective       Clears the REFLECTIVE flag
A_SetReflectiveInvulnerable   A_SetInvulnerable + A_SetReflective
A_UnSetReflectiveInvulnerable A_UnSetInvulnerable + A_UnSetReflective
A_SetShootable          Makes actor shootable
A_UnSetShootable        Makes actor non shootable
A_NoGravity             makes Actor not subject to gravity
A_Gravity               makes Actor subject to gravity
A_LowGravity            makes Actor subject to low gravity
A_ScreamAndUnblock      combines A_Scream and A_NoBlocking
A_ActiveSound           plays actor's active sound
A_ActiveAndUnblock      combines A_ActiveSound and A_NoBlocking
A_FastChase             A_Chase variation used by Hexen's class bosses
A_FreezeDeath           Starts the freeze death sequence.
A_GenericFreezeDeath    Starts the generic freeze death sequence. Calls A_FreezeDeath and sets the ice palette translation.
A_FreezeDeathChunks     Burst the actor into chunks. The state with this function has to be looped because it waits until all movement has stopped.
A_IceGuyDie             Stops all movement and bursts the actor into ice chunks immediately.


The following functions use some actor properties to determine their behavior
-----------------------------------------------------------------------------

A_Explode               Inflicts explosive damage. 
                        Uses:
                            ExplosionDamage            Amount of damage being inflicted
                            ExplosionRadius            Radius of damage
                            DontHurtShooter            If a projectile, don't hurt the guy who shot it.

A_MeleeAttack           performs a melee attack
                        Uses:
                            MeleeDamage                Amount of damage, The formula is random(1,8)*MeleeDamage
                            MeleeSound                 Sound being played if the actual attack happens.
                            
A_MissileAttack         launches a missile
                        Uses:
                            MissileName                Actor name of the missile being launched
                            MissileHeight              Height above floor for the spawned missile
                            
                        A_MissileAttack can handle homing missiles as long as the missile
                        has the SEEKERMISSILE flag set and contains some kind of tracer
                        code pointer (A_Tracer, A_MummyFX1Seek, etc.) In its moving animation.
                            
A_ComboAttack           combines A_MeleeAttack and A_MissileAttack depending on the current 
                        distance to the target.
                        
A_BulletAttack          Hitscan attack
                        Uses:
                            damage                    amount of bullets being fired
                            
                            
The following functions use direct parameters:
----------------------------------------------

A_PlaySound ("soundname")       Plays the sound soundname
A_PlayWeaponSound ("soundname") Plays the sound soundname on the weapon channel
                                Sounds played with A_PlaySound and A_PlayWeaponSound
                                can occur simultaneously.
A_SeekerMissile (threshold, maxturnangle)
                                Seeker missile handling. threshold and maxturnangle determine
                                how 'aggressive' the missile will home in on its target. The larger
                                the values the more precise it is. threshold specifies the angle
                                inside which the missile will home in directly on its target.
                                If the angle toward the target is larger than threshold it will
                                change its movement angle only partially towards the target.
                                maxturnangle is the maximum change of movement direction that 
                                will be performed in one move. Maxturnangle should be larger
                                than threshold. Both angles are specified in degrees and must be
                                in the range [0, 90].
                                Example: The flaming skull of Heretic's mummy uses an equivalent
                                of A_SeekerMisile 20 30
A_Jump (chance, distance)       Randomly advances to different state. Like painchance, the chance
                                value can range between 0 and 255. A chance of 0 will never advance,
                                while a chance of 255 will almost always advance. If the state is
                                not advanced, then the one immediately following the A_Jump will
                                be used as if A_Jump had not been present.
A_CustomMissile ("missiletype", spawnheight, spawnofs_xy, angle)
                                Spawns a missile attack where "missiletype" is the type of missile
                                to shoot, spawnheight is how high from the monster's feet to shoot
                                the missile, spawnofs_xy is how far the monster's center to shoot
                                the missile, and angle is the direction relative to the monster's
                                facing angle in which to shoot the missile.