A Jump: Difference between revisions

From ZDoom Wiki
Jump to navigation Jump to search
Content deleted Content added
GrayFace (talk | contribs)
Examples: Fixed code formatting
GrayFace (talk | contribs)
Examples: added that state labels are safer
 
Line 40: Line 40:
POSS E -1 // <-- Or here, with equal probability.
POSS E -1 // <-- Or here, with equal probability.


These examples use state labels. As you can see from both methods, state labels are a much simpler way of doing jumps.
These examples use state labels. As you can see from both methods, state labels are a much simpler and safer way of doing jumps.
POSS A 0 '''A_Jump''' (128, "Pain")
POSS A 0 '''A_Jump''' (128, "Pain")

Latest revision as of 19:35, 29 August 2026

state A_Jump (int chance, int offset, ...)
state A_Jump (int chance, str "state", ...)

Note: Jump functions perform differently inside of anonymous functions.

Usage

Randomly advances to different frame. The chance value can range between 0 and 256. A chance of 0 will never jump, while a chance of 256 will always jump. If the jump does not happen, then the frame or instruction immediately following the A_Jump will be used as if A_Jump had not been present. If more than one offset or state values are present, A_Jump will choose one of them at random.

Note that offset specifies the number of frames to skip over, and not the number of lines. Instructions like goto, loop and stop cannot be jumped to directly for this reason. (If you need the A_Jump command to skip directly to an instruction, see the last example below for a way to do this.)

Jumps made with A_Jump are virtual, i.e. if the execution pointer is currently in the state of a base class of an actor, it will jump to the redefined state (if exists) of the derived actor. This is in contrast to the goto keyword which is static and execution does not leave the base class.

Note: Because of a limitation in the decorate code parser, you cannot use A_Jump on a single line if it has more than one state while using offset to specify the state to jump to. You will either need to split the states onto multiple lines and add an A_Jump to each line individually, or reference an actual state label like "See", "Melee", etc to make it work properly.

Examples

The following examples are the old method of jumping without states. They are still usable but it is strongly recommended that you use state labels for convenience.

  POSS A 0 A_Jump (256, 2)
  POSS A 5
  POSS A 5 // <- Jumps to this one (always)
  POSS A 5
  POSS A 0 A_Jump (128, 4)
  POSS ABC 5
  POSS D 5 // <- Jumps to this one (%50 chance)
  POSS E 3
  POSS A 0 A_Jump (5, 1)
  goto Melee // <- This line doesn't count because it does not define a frame
  POSS A 5 // <- Jumps to this one (~2% chance)
  POSS B 3
  POSS A 0 A_Jump (128, 2, 3, 6)
  POSS A 5 // <-- Has a 50% chance of dropping through to here (no jump), otherwise...
  goto Death
  POSS B 6 // <-- Jumps here...
  goto See
  POSS BCD 5 // <-- Or here...
  goto Death
  POSS E -1 // <-- Or here, with equal probability.

These examples use state labels. As you can see from both methods, state labels are a much simpler and safer way of doing jumps.

  POSS A 0 A_Jump (128, "Pain")
  POSS ABC 3
  Stop
Pain: // <-- 50% chance to jump to this state
  POSS G 3
  POSS G 3 A_Pain // Play pain sound
  loop
  POSS A 0 A_Jump (256, "Boogie", "Gasp", "Death") // <-- Always jumps to either...
  Stop
Boogie: // <-- This state...
  POSS ABCD 4
  loop
Gasp: // <-- This state...
  POSS E 15
  Goto See
Death: // <-- Or this state at an equal chance.
  POSS H 5
  POSS I 5 A_Scream
  POSS J 5 A_NoBlocking
  POSS K 5
  POSS L -1
  stop

Here is a real example of where jumping to different states would be useful. This is a custom made DECORATE version of Korax's attack pattern using state jumps.

Missile:
  KORX E 8 Bright A_FaceTarget
  KORX E 0 A_PlaySound("KoraxAttack")
  TNT1 A 0 A_Jump(256, "Wraith", "DemonFX1", "DemonFX2", "FireDemon", "Centaur", "Serpent")
  Goto See
Serpent:
  KORX A 0 A_SpawnProjectile ("SerpentFX", 55, -52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("SerpentFX", 55, 52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("SerpentFX", 82, -52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("SerpentFX", 82, 52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("SerpentFX", 110, -35, 0, 4, 0)
  KORX F 8 A_SpawnProjectile ("SerpentFX", 110, 35, 0, 4, 0)
  KORX E 5 Bright
  Goto See
Wraith:
  KORX A 0 A_SpawnProjectile ("WraithFX1", 55, -52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("WraithFX1", 55, 52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("WraithFX1", 82, -52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("WraithFX1", 82, 52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("WraithFX1", 110, -35, 0, 4, 0)
  KORX F 8 A_SpawnProjectile ("WraithFX1", 110, 35, 0, 4, 0)
  KORX E 5 Bright
  Goto See
DemonFX1:
  KORX A 0 A_SpawnProjectile ("Demon1FX1", 55, -52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("Demon1FX1", 55, 52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("Demon1FX1", 82, -52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("Demon1FX1", 82, 52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("Demon1FX1", 110, -35, 0, 4, 0)
  KORX F 8 A_SpawnProjectile ("Demon1FX1", 110, 35, 0, 4, 0)
  KORX E 5 Bright
  Goto See
DemonFX2:
  KORX A 0 A_SpawnProjectile ("Demon2FX1", 55, -52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("Demon2FX1", 55, 52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("Demon2FX1", 82, -52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("Demon2FX1", 82, 52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("Demon2FX1", 110, -35, 0, 4, 0)
  KORX F 8 A_SpawnProjectile ("Demon2FX1", 110, 35, 0, 4, 0)
  KORX E 5 Bright
  Goto See
FireDemon:
  KORX A 0 A_SpawnProjectile ("FireDemonMissile", 55, -52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("FireDemonMissile", 55, 52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("FireDemonMissile", 82, -52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("FireDemonMissile", 82, 52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("FireDemonMissile", 110, -35, 0, 4, 0)
  KORX F 8 A_SpawnProjectile ("FireDemonMissile", 110, 35, 0, 4, 0)
  KORX E 5 Bright
  Goto See
Centaur:
  KORX A 0 A_SpawnProjectile ("CentaurFX", 55, -52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("CentaurFX", 55, 52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("CentaurFX", 82, -52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("CentaurFX", 82, 52, 0, 4, 0)
  KORX A 0 A_SpawnProjectile ("CentaurFX", 110, -35, 0, 4, 0)
  KORX F 8 A_SpawnProjectile ("CentaurFX", 110, 35, 0, 4, 0)
  KORX E 5 Bright
  Goto See