Move

From EDukeWiki
Jump to navigation Jump to search

A move command is used to give velocity to an actor.

Define outside an actor as so:

move <name> <horizontal> <vertical>

<name> is the name of the move command.

Warning: You cannot use the same name from a define, or the game will crash.

<horizontal> is the horizontal velocity of the actor. Negative values reverse direction.

<vertical> is the vertical veloctity of the actor. Negative values cause upward motion.


Used inside an actor, a move command is written as:

move <name> <moveflags...>

<moveflags...> is a (possibly empty) sequence of parameters that specify certain hardcoded movement behavior.

You cannot substitute <name> for a number, define, or gamevar. It has to be predefined with the first definition of move.


If your case requires the actor moving clips through sprites and/or walls, you need to pass in a custom clipmask. This command does not support that, see movesprite.

moveflags

Values for each <moveflag> (defined in DEFS.CON) are:

moveflag description internal value
faceplayer actor faces the player. 1
geth use horizontal velocity. 2
getv use vertical velocity. 4
randomangle actor will face random direction. 8
faceplayerslow same as faceplayer, but done gradually. 16
spin spin in a clockwise circle. 32
faceplayersmart same as faceplayer, but with a slight "lead" on position. 64
fleeenemy actor faces away from the player. 128
jumptoplayer actor will move vertically and then fall as if jumping. 257*
seekplayer actor will try to find the best path to the nearest player. 512
furthestdir actor faces the furthest distance from the closest player. 1024
dodgebullet actor attempts to avoid all shots directed at him. The actor will not avoid GROWSPARK. 4096

Making a Useractor move

A useractor can be made to move as part of a given action. The type of the useractor (ie. Enemy/Notenemy) has an impact on how this functions. Typically one might expect that we can apply the move on each tic of the action but it doesn't work that way for type Enemy. For that type, a move is started with a "momentum". If it is applied on each tic, the actor will not move at all. On each tic it must be checked if the actor is already moving, and only call the move if they aren't.

This behaviour does not occur for a Notenemy useractor type.

In other words, for a Notenemy, this is sufficient:

ifaction MYACTION
{
    move mymove // and apply whatever other flags, e.g. geth
}

For an Enemy, use this:

ifaction MYACTION
{
    ifmove mymove {} // alternatively: ifmove mymove nullop
    else 
        move mymove
}