From ZDoom Wiki
Jump to navigation Jump to search
Note: This feature is for ZScript only.

States are what store information about the current animation and logical state of an Actor or overlay. A state is not the entire sequence of a label but the single frame that defines what something is doing at that very moment. For instance:

  PISG A 4;
  PISG B 6 A_FirePistol;
  PISG C 4;
  PISG B 5 A_ReFire;
  Goto Ready;

In the above case, there's not one state, but four. PISG A, B, C, and then B again all define separate states. They are all combined under one state sequence with the first being given the state label Fire. This also applies for stacked frames:

  WEAP AAA 4 A_WeaponReady;
  WEAP BCB 4 A_WeaponReady;

The above has six states, WEAP A, A, A, B, C, and B. When using a function like ResolveState, the state returned is the one defined at the given label. For instance, calling ResolveState("Fire") would return the state PISG A 4;

An Actor or PSprite's state can be gotten at any time via its CurState variable e.g. myActor.CurState


Note: All fields are defined as readonly.

  • State NextState - Stores a pointer to the next state in the sequence. If null, the Actor/PSprite is set to terminate after this state.
  • int sprite - The index of the sprite to use for this state. This is the same as GetSpriteIndex() with the name of the sprite the state uses. This has a few notable base values:
    • 0 - Sprite is set to TNT1
    • 1 - State is set to be fixed i.e. doesn't change sprite or frame
    • 2 - Sprite is set to use the same sprite as the previous state
  • int16 Tics - The base duration of the state measured in tics.
  • uint16 TicRange - If non-zero, defines a random range for the duration. This is done via Tics + Random2[StateTics]() % (TicRange + 1)
  • uint8 Frame - The frame id to use for this state e.g. A = 0, B = 1, etc.
  • uint8 UseFlags - Defines where the state can be used e.g. in weapon overlays, in CustomInventory overlays, etc.
  • int Misc1 - The x offset to give an overlay via the Offset keyword.
  • int Misc2 - The y offset to give an overlay via the Offset keyword.
  • uint16 bSlow - The state is marked with the Slow keyword.
  • uint16 bFast - The state is marked with the Fast keyword.
  • bool bFullbright - The state is marked with the Bright keyword.
  • bool bNoDelay - The state is marked with the NoDelay keyword.
  • bool bSameFrame - The state uses the same frame as the previous state.
  • bool bCanRaise - The state is marked with the CanRaise keyword.
  • bool bDehacked - The state has been replaced via DeHackEd.



  • int DistanceTo(State other)
  • bool ValidateSpriteFrame()
  • TextureID, bool, Vector2 GetSpriteTexture(int rotation, int skin = 0, Vector2 scale = (0,0))
Returns a TextureID of the sprite used in the calling state. The rotation argument is a value from 0 to 16 to account for sprite rotations (which support up to 16 angles), with 0 meaning "front", 8 meaning "back" and so on. Since states are available in static context, this doesn't require an actor pointer. For example, this is valid:
state s = GetDefaultByType("Cacodemon").spawnstate;
TextureID stex = s.GetSpriteTexture(8);
// stex now contains a TextureID for the HEADA5 sprite
  • bool InStateSequence(State base)

See also