ANIMDEFS

From ZDoom Wiki
Jump to navigation Jump to search

ANIMDEFS is ZDoom's Hexen-derived answer to BOOM's ANIMATED and SWITCHES lumps. ANIMDEFS provides additional flexibility, allowing one to not only animate textures with any amount of images at any rate of animation, and not only to make standard Doom-style on/off switch textures, but to combine the two. Switches can be animated like textures, and can even be set to play sounds (which must be defined in SNDINFO) at any given point during the animation. Textures are not necessarily actual textures, but can also be used for HUD graphics. Strife-style animated doors, camera textures and animated particles can also be created with this lump.

ANIMDEFS, like ANIMATED, should be provided in a WAD only once, unlike compiled scripts contained in BEHAVIOR lumps, which are level-specific. An ANIMDEFS lump, when loaded, will apply to all maps played in any given gameplay session, and therefore will apply to all levels within a given WAD.

Although all ANIMDEFS commands allow you to specify textures by lump offset from the base texture it is not recommended to do this. Use real texture names whenever possible as this is more robust and doesn't depend on lump ordering in a WAD. The index method is only maintained for backwards compatibility with Hexen and older ZDoom WADs.

Multiple ANIMDEFS lumps are cumulative: all such lumps will be parsed in the order in which they are loaded.

The followings commands can be used in an ANIMDEFS lump:

Animated graphics

  • TEXTURE/FLAT [optional] <name>:
Starts a new animation definition. TEXTURE defines a wall texture animation, FLAT a flat animation. This is something of a moot point though, since 'flat' and 'texture' are interchangeable in versions of ZDoom from 2.0.48 and up. The only difference is the search order in the case of duplicate names, see namespace for more information.
If the "optional" keyword is used, no warnings are issued if the needed lumps are not found.
Both flat and texture support the same commands:
  • PIC <number|name> tics <duration> | rand <min max>
Defines one animation frame. The texture used for it can either be specified as an index (with the base texture being index 1 and each subsequent index the following texture in the list) or as a name. If the frame texture is specified by index it is not necessary to order the indices in any way and you also can use the same index multiple times in the sequence. If the frame texture is specified by name, order in the WAD or TEXTUREx lump is irrelevant. The duration for each frame can either be specified as a constant value or as a range in which the duration is randomly selected. To specify a constant duration, add 'tics <duration>' to the definition. For a random interval, add 'rand <min max>'. min and max define the minimum and maximum values of the frame's duration. Only the base picture of the animation will animate if an animation is defined like this. Unlike most other places in the engine where you can specify tics for duration, the value may be fractional (e.g. 4.3 tics) instead of whole tics. This is because texture animations are controlled by the renderer timer instead of the play timer, which allows them finer accuracy.
  • RANGE <name|number> tics <duration> | rand <min max> | Oscillate
Defines an animation range. <number> or <name> defines the last picture in the animation. This is either specified as a texture name or an offset from the base texture. Note that if you specify a number n, the animation will have n+1 frames. You can use 'tics' and 'rand' as with PIC. Unlike PIC, though, an animation defined like this will animate all frames, much like an animation defined in the ANIMATED lump. If the Oscillate flag is added, when the animation reaches the end, it will animate towards the first frame instead of looping.
Note: although this does not affect compatibility with mods using Oscillate with RANGE, as of GZDoom 1.9.0, the flag is not part of the command's syntax.
  • ALLOWDECALS
Normally decals are disallowed on animated textures. With this command you can specifically enable decals for the current texture.
  • OSCILLATE
When the animation reaches the end, it will animate towards the first frame instead of looping. This works for both RANGE and PIC.
  • RANDOM
The texture animation is randomized instead of being sequential.

Interface graphics

Despite the "texture" or "flat" name, this function can be used for non-texture graphics, notably Powerup icons. The following graphics are defined in the default ANIMDEFS lump:

One exception is SPFLY0 whose behavior is more complicated (since it can be suspended) and is therefore still hardcoded.

The menu selectors are also defined in ANIMDEFS:

  • Doom, Chex Quest, Harmony, Urban Brawl: M_SKULL1
  • Heretic, Hexen: M_SLCTR1
  • Strife: M_CURS1

Switches

  • SWITCH
Starts a new switch definition. The full definition looks like this:
switch <game> <base texture> on [activation sequence] tics|rand <duration in tics> off [deactivation sequence] tics|rand <duration in tics>
  • <game> (optional)
A game name like doom, hexen, strife can be specified.
  • <base texture>
This is the name of the texture the switch is being defined for, for example SW1GRAY (a gray switch with a red button in Doom).
  • on
Defines the graphic/sound used when the switch is activated.
  • off (optional)
Defines the graphic/sound used when the switch is activated. If this is omitted, the switch will return to the base texture and play the game's standard switch sound.
On and off commands can be followed with:
  • pic <name>
Defines the texture to be displayed for this sequence. The texture is defined by name. There can be multiple pic definitions in each sequence for the switch.
Beware of using textures making use of the flag NullTexture from the TEXTURES lump as this can cause adverse effects.
  • sound <soundname>
Defines the sound that is played when the switch is pressed/reset. As usual, this uses a logical sound name from SNDINFO and not the name of the sound lump.
If the sound is not defined, switches/normbutn will be played.
  • tics <duration> | rand <min max>
Defines how long the texture will be displayed before reverting to the base one. If 0 is used, the texture will stay for 1 second (Verification needed).
Note: the texture will only revert if the special attached to the switch is a repeatable action. If it isn't, the switch will stay activated forever.

Decals are not disabled on switch sequences, therefore there is no "allowdecals" option for switches. (To disable decals on switches, you need to disable decals on the individual textures used in the switch sequence, using the TEXTURES format to have access to the NoDecals flag.)

Examples

These examples are from ANIMDEFS in gzdoom.pk3:

switch doom 1 SW1BRCOM on pic SW2BRCOM tics 0
switch hexen SW51_OFF on sound Switch2 pic SW51_ON tics 0
switch strife GLASS01 on sound world/glassbreak pic GLASS02 tics 0
switch strife DORWS04 on sound switches/bolt pic DORWS05 tics 0 off sound switches/boltback pic DORWS04 tics 0

Warping graphics

  • WARP texture|flat <name> [allowdecals]
  • WARP texture|flat <name> <speed> [allowdecals]
Defines a warping effect for flats and textures. This will make the flat (or texture) warp similar to the water in Quake or Q2. This effect can also be used with sprites. As with other animated textures, you can optionally add 'allowdecals' to override the default behavior of not placing decals on animated textures. You can also add an optional float value after the name to control the speed of the warp animation. Warping anything larger than 256x256 in software for OpenGL (i.e. for legacy support only) is too costly so it is intentionally disabled. Shader-based warping does not have this limitation. It also can warp textures of any size but for non-square textures it may not look the same as the software algorithm. Warp and warp2 cannot be used with long texture names.
  • WARP2 texture|flat <name> [allowdecals]
  • WARP2 texture|flat <name> <speed> [allowdecals]
Same as WARP, but with nicer water-like effect.

Animated doors

  • ANIMATEDDOOR <name>:
Starts a definition for an animation sequence that can be used with the Door_Animated line special. Unlike animated textures, the duration of each frame is not defined here; rather, the duration of each frame is given by the speed argument to Door_Animated.
The following commands are supported:
  • OPENSOUND <soundsequence>
Defines the sound sequence that is being played when the door opens. This sound sequence must be defined in the SNDSEQ lump.
  • CLOSESOUND <soundsequence>
Defines the sound sequence that is being played when the door closes. This sound sequence must be defined in the SNDSEQ lump.
  • PIC <number|name>
Defines one animation frame for this door. The texture used for it can either be specified as an index (with the base texture being index 1 and each subsequent index the following texture in the list) or as a name. If the frame texture is specified by index it is not necessary to order the indices in any way and you also can use the same index multiple times in the sequence. If the frame texture is specified by name, order in the WAD or TEXTUREx lump is irrelevant. The frames inside the sequence must be ordered from fully closed to fully open and the number of frames is not restricted in any way
  • ALLOWDECALS
Normally decals are disallowed on animated door textures. With this command you can specifically enable decals for the current texture.

Camera textures

CAMERATEXTURE <texture name> <width> <heigth> [fit <width> <height> [worldpanning]]
Define a texture that can show a camera view. You have to specify a name and a size. If <texture name> is an existing texture the image will be scaled to fit that texture's size. Optionally, you can also specify the size the image will be scaled to with the FIT keyword. Adding the worldpanning keyword makes camera textures pan in world units instead of texture units.
Square textures use less memory than non-square textures. However, if you want to use a camera that can see the texture it renders into, you should use a non-square texture. You have to use the SetCameraToTexture ACS command to specify the image this texture shows.

Canvas textures

CANVASTEXTURE <texture name> <width> <height> [fit <width> <height> [worldpanning]]
Define a texture that can be drawn to. Takes the same parameters as defining a camera texture, with the same behavior.
Canvas textures are interfaced with from ZScript through the Canvas object.

Fire textures

(New from 4.13.0)

FIRETEXTURE <texture name> tics <duration> [allowdecals]
Define a fire texture, which will be displayed using the method from https://fabiensanglard.net/doom_fire_psx/. The first color defined will be used as the background color to fade to and the last color defined will be the starting color to fade from, in the reverse order defined. The following commands are supported:
  • PALETTE <index>
Defines a color from PLAYPAL by index ranging from 0 to 255. Black palette will be made fully transparent.
  • COLOR <red> <green> <blue> <alpha>
Defines a color with RGBA values ranging from 0 to 255.

Other

texture <graphic name> NoTrim
By default, GZDoom trims empty space in images, which may cause issues when rotating sprites or scaling sprites (e.g. the anchor point used by A_OverlayRotate, A_OverlayScale and actor's roll is defined by the image's size, but since the empty space is trimmed, it can be hard to predict its placement). Specifying this disables the trimming for the graphic.
The graphic name can be both the name of a graphic file, or a TEXTURES definition.
The texture keyword is necessary regardless of the type of graphic.

Alternatively can be done in TEXTURES.

Examples

An animated flat:

flat x_001
    pic 1 tics 5
    pic 2 tics 5
    pic 3 tics 5
    pic 4 tics 5

An animated texture that allows decals:

texture x_water1
    allowdecals
    pic x_water1 rand 5 12
    pic x_water2 rand 5 12
    pic x_water3 rand 5 12
    pic x_water4 rand 5 12

A simple toggle switch:

switch SW_1_UP on sound Switch1 pic SW_1_DN tics 0
switch SW_1_DN off sound Switch2 pic SW_1_UP tics 0

A switch that plays an animation when it is toggled, but is filtered to only be active if the game is 'Doom':

switch doom sw1nj15 
on sound switches/lever2 
pic sw1nj15b tics 8 
pic sw1nj15c tics 8 
pic sw2nj15 tics 8 

off sound switches/lever2 
pic sw1nj15c tics 8 
pic sw1nj15b tics 8 
pic sw1nj15 tics 0

A warped flat (the second variation allows decals to appear):

warp flat qslime2
warp flat qslime2 allowdecals

An animated door texture:

animateddoor DORIRS01
   opensound DoorOpenAirlock
   closesound DoorCloseAirlock
   pic DORIRS01 
   pic DORIRS02 
   pic DORIRS03 
   pic DORIRS04 
   pic DORIRS05 
   pic DORIRS06 
   pic DORIRS07 
   pic DORIRS08

A 64x64 camera texture:

cameratexture CAMTEX1 64 64

An 80x50 camera texture that is scaled down from a 100x50 resolution camera:

cameratexture CAMTEX2 100 50 fit 80 50

A 64x64 resolution camera that replaces the STARTAN2 texture. Since fit is not specified, the texture will be fit to the original texture's size (128x128):

cameratexture STARTAN2 64 64

This is the same thing as the previous example, but prevents the texture from scaling by explicitly specifying the fit size:

cameratexture STARTAN2 64 64 fit 64 64

The fire texture defined to fade black-to-white:

FIRETEXTURE BLACKFIRE tics 4
   color 255 255 255 255
   color 200 200 200 255
   color 180 180 180 255
   color 150 150 150 255
   color 125 125 125 255
   color 100 100 100 255
   color 75 75 75 255
   color 50 50 50 255
   color 30 30 30 255
   color 15 15 15 255
   color 0 0 0 0

The animated flats and textures from Doom:

flat	BLOOD1  	range	BLOOD3  	tics 8
flat	FWATER1 	range	FWATER4 	tics 8
flat	LAVA1   	range	LAVA4		tics 8
flat	NUKAGE1 	range	NUKAGE3 	tics 8
flat	SLIME01 	range	SLIME04 	tics 8
flat	SLIME05 	range	SLIME08 	tics 8
flat	SLIME09 	range	SLIME12 	tics 8
flat	SWATER1 	range	SWATER4 	tics 8
texture	BFALL1  	range	BFALL4  	tics 8
texture	BLODGR1 	range	BLODGR4 	tics 8 allowdecals
texture	BLODRIP1	range	BLODRIP4	tics 8 allowdecals
texture	DBRAIN1 	range	DBRAIN4 	tics 8
texture	FIREBLU1	range	FIREBLU2	tics 8
texture	FIRELAV3	range	FIRELAVA	tics 8
texture	FIREMAG1	range	FIREMAG3	tics 8
texture	FIREWALA	range	FIREWALL	tics 8
texture	GSTFONT1	range	GSTFONT3	tics 8 allowdecals
texture	ROCKRED1	range	ROCKRED3	tics 8 allowdecals
texture	SFALL1  	range	SFALL4  	tics 8
texture	SLADRIP1	range	SLADRIP4	tics 8 allowdecals
texture	WFALL1  	range	WFALL4  	tics 8

The animated flats and textures from Heretic:

flat	FLATHUH1	range	FLATHUH4	tics 8
flat	FLTFLWW1	range	FLTFLWW3	tics 9
flat	FLTLAVA1	range	FLTLAVA4	tics 8
flat	FLTSLUD1	range	FLTSLUT3	tics 8
flat	FLTTELE1	range	FLTTELE4	tics 6
flat	FLTWAWA1	range	FLTWAWA3	tics 8
texture	LAVAFL1 	range	LAVAFL3 	tics 6
texture	WATRWAL1	range	WATRWAL3	tics 4

The animated flats and textures from Strife:

flat	F_CONVY1	range	F_CONVY2	tics 4
flat	F_FAN1  	range	F_FAN2  	tics 4
flat	F_HWATR1	range	F_HWATR3	tics 4
flat	F_PWATR1	range	F_PWATR3	tics 11
flat	F_RDALN1	range	F_RDALN4	tics 4
flat	F_SCANR1	range	F_SCANR4	tics 4 
flat	F_SCANR5	range	F_SCANR8	tics 4
flat	F_TELE1 	range	F_TELE2 	tics 4
flat	P_VWATR1	range	F_VWATR3	tics 4 // Yes, P_VWATR1, not F_VWATR1.
flat	F_WATR01	range	F_WATR03	tics 8
texture	BRKGRY13	range	BRKGRY16	tics 10
texture	BRNSCN01	range	BRNSCN04	tics 10
texture	COMP01  	range	COMP04  	tics 4
texture	COMP05  	range	COMP08  	tics 6
texture	COMP09  	range	COMP12  	tics 11
texture	COMP13  	range	COMP16  	tics 12
texture	COMP17  	range	COMP20  	tics 12
texture	COMP21  	range	COMP24  	tics 12
texture	COMP25  	range	COMP28  	tics 12
texture	COMP29  	range	COMP32  	tics 12
texture	COMP33  	range	COMP37  	tics 12
texture	COMP38  	range	COMP41  	tics 12
texture	COMP42  	range	COMP49  	tics 10
texture	CONCRT09	range	CONCRT12	tics 11
texture	CONCRT22	range	CONCRT25	tics 11
texture	FAN01   	range	FAN02   	tics 4
texture	FORCE01 	range	FORCE04 	tics 4
texture	FORCE05 	range	FORCE08 	tics 4
texture	SCAN01  	range	SCAN04  	tics 4
texture	SCAN05  	range	SCAN08  	tics 4
texture	SWTRMG01	range	SWTRMG03	tics 4
texture	WALPMP01	range	WALPMP02	tics 16
texture	WALTEK16	range	WALTEK17	tics 8