Crossfire Server, Trunk  R20513
Functions
move.c File Reference

Those functions handle object moving and pushing. More...

#include "global.h"
#include <stdlib.h>
#include "sproto.h"
Include dependency graph for move.c:

Go to the source code of this file.

Functions

int move_ob (object *op, int dir, object *originator)
 Op is trying to move in direction dir. More...
 
int move_object (object *op, int dir)
 Try to move op in the direction "dir". More...
 
int move_to (object *op, int x, int y)
 Move an object one square toward a specified destination on the same map. More...
 
int push_ob (object *who, int dir, object *pusher)
 Something is pushing some other object. More...
 
void recursive_roll (object *op, int dir, object *pusher)
 An object is pushed by another which is trying to take its place. More...
 
static int roll_ob (object *op, int dir, object *pusher)
 An object is being pushed, and may push other objects. More...
 
int teleport (object *teleporter, uint8_t tele_type, object *user)
 Teleport an item around a nearby random teleporter of specified type. More...
 
int transfer_ob (object *op, int x, int y, int randomly, object *originator)
 Move an object (even linked objects) to another spot on the same map. More...
 
static int try_fit (object *op, mapstruct *m, int x, int y)
 Checks if an objects fits on a specified spot. More...
 

Detailed Description

Those functions handle object moving and pushing.

Definition in file move.c.

Function Documentation

int move_ob ( object op,
int  dir,
object originator 
)

Op is trying to move in direction dir.

Parameters
opwhat is moving.
dirwhat direction op wants to move.
originatortypically the same as op, but can be different if originator is causing op to move (originator is pushing op).
Return values
0op is not able to move to the desired space.
1op was moved.

Definition at line 58 of file move.c.

References blocked_link(), obj::contr, obj::count, obj::direction, pl::do_los, esrv_map_scroll(), FLAG_WIZPASS, FOR_INV_FINISH, FOR_INV_PREPARE, freearr_x, freearr_y, get_map_flags(), socket_struct::look_position, obj::map, monster_check_doors(), monster_check_earthwalls(), obj::more, object_insert_in_map_at(), object_remove(), object_was_destroyed, P_OUT_OF_MAP, PLAYER, QUERY_FLAG, pl::socket, TRANSPORT, obj::type, socket_struct::update_look, obj::will_apply, WILL_APPLY_DOOR, WILL_APPLY_EARTHWALL, obj::x, and obj::y.

Referenced by cfapi_object_move(), flee_player(), move_object(), move_player_attack(), move_to(), pets_move(), pets_move_golem(), and recursive_roll().

Here is the call graph for this function:

Here is the caller graph for this function:

int move_object ( object op,
int  dir 
)

Try to move op in the direction "dir".

Parameters
opwhat to move.
dirmoving direction.
Return values
0something blocks the passage.
1op was moved..

Definition at line 39 of file move.c.

References move_ob().

Referenced by check_spell_knockback(), monster_circ1_move(), monster_circ2_move(), monster_move(), monster_move_randomly(), monster_pace2_moveh(), monster_pace2_movev(), monster_pace_moveh(), monster_pace_movev(), monster_rand_move(), move_player_mover(), and push_ob().

Here is the call graph for this function:

Here is the caller graph for this function:

int move_to ( object op,
int  x,
int  y 
)

Move an object one square toward a specified destination on the same map.

The move takes into account blocked squares for op, and things like that. No check is done to know if the object has enough speed to move.

Parameters
opobject to move
x
ydestination coordinates
Returns
0 if op is on the specified spot, 1 if it moved towards the goal, 2 if it didn't find any path to the goal.

Definition at line 545 of file move.c.

References animate_object(), obj::animation_id, obj::direction, obj::facing, get_map_flags(), GET_MAP_OB, obj::map, monster_compute_path(), move_ob(), P_OUT_OF_MAP, obj::x, and obj::y.

Referenced by cfapi_object_transfer().

Here is the call graph for this function:

Here is the caller graph for this function:

int push_ob ( object who,
int  dir,
object pusher 
)

Something is pushing some other object.

Parameters
whoobject being pushed.
dirpushing direction.
pusherwhat is pushing who.
Return values
1if pushing invokes a attack
0no attack during pushing.
Todo:
fix return value which is weird for last case.

Definition at line 417 of file move.c.

References CLEAR_FLAG, obj::contr, draw_ext_info_format(), esrv_map_scroll(), FLAG_FRIENDLY, FLAG_NEUTRAL, FLAG_SLEEP, FLAG_STAND_STILL, FLAG_UNAGGRESSIVE, FLAG_WIZ, freearr_x, freearr_y, HEAD, obj::level, socket_struct::look_position, obj::map, obj::more, move_object(), MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_FAILURE, MSG_TYPE_VICTIM, MSG_TYPE_VICTIM_WAS_PUSHED, obj::name, NDI_UNIQUE, object_get_owner(), object_insert_in_map_at(), object_remove(), object_set_enemy(), pl::party, PLAYER, PREFER_HIGH, QUERY_FLAG, random_roll(), pl::run_on, pl::socket, obj::stats, liv::Str, obj::type, socket_struct::update_look, obj::x, and obj::y.

Referenced by move_player_attack().

Here is the call graph for this function:

Here is the caller graph for this function:

void recursive_roll ( object op,
int  dir,
object pusher 
)

An object is pushed by another which is trying to take its place.

Parameters
opwhat is being pushed.
dirpushing direction.
pusherwhat is pushing op.

Definition at line 276 of file move.c.

References draw_ext_info_format(), MAX_BUF, move_ob(), MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_FAILURE, MSG_TYPE_COMMAND_SUCCESS, NDI_BLACK, NDI_UNIQUE, query_name(), and roll_ob().

Referenced by move_player_attack().

Here is the call graph for this function:

Here is the caller graph for this function:

static int roll_ob ( object op,
int  dir,
object pusher 
)
static

An object is being pushed, and may push other objects.

This is not perfect yet. it does not roll objects behind multipart objects properly. Support for rolling multipart objects is questionable.

Parameters
opwhat is being pushed.
dirpushing direction.
pusherwhat is pushing op.
Return values
0op couldn't move.
1op, and potentially other objects, moved.

Definition at line 363 of file move.c.

References FLAG_CAN_ROLL, flags, FOR_MAP_FINISH, FOR_MAP_PREPARE, freearr_x, freearr_y, get_map_flags(), GET_MAP_MOVE_BLOCK, HEAD, obj::map, obj::move_type, OB_MOVE_BLOCK, object_insert_in_map_at(), object_remove(), P_IS_ALIVE, P_OUT_OF_MAP, PREFER_LOW, QUERY_FLAG, random_roll(), obj::stats, liv::Str, try_fit(), obj::weight, obj::x, and obj::y.

Referenced by recursive_roll().

Here is the call graph for this function:

Here is the caller graph for this function:

int teleport ( object teleporter,
uint8_t  tele_type,
object user 
)

Teleport an item around a nearby random teleporter of specified type.

It is basically used so that shop_mats and normal teleporters can be used close to each other and not have the player put to the one of another type.

Parameters
teleporterwhat is teleporting user.
tele_typewhat object type user can be put on. this is either set to SHOP_MAT or TELEPORTER.
userwhat object to teleport.
Return values
1user was destroyed.
0user is still valid, but may have moved or not.
Todo:
fix weird return values.

Definition at line 188 of file move.c.

References obj::contr, FOR_MAP_FINISH, FOR_MAP_PREPARE, freearr_x, freearr_y, get_map_flags(), GET_MAP_MOVE_BLOCK, HEAD, llevError, LOG(), obj::map, map_newmap_cmd(), obj::name, OB_TYPE_MOVE_BLOCK, object_find_free_spot(), object_insert_in_map_at(), object_remove(), OUT_OF_REAL_MAP, P_OUT_OF_MAP, PLAYER, player_update_bg_music(), RANDOM, SHOP_MAT, pl::socket, obj::type, obj::x, and obj::y.

Referenced by initteleport(), move_teleporter(), runteleport(), and shop_mat_type_move_on().

Here is the call graph for this function:

Here is the caller graph for this function:

int transfer_ob ( object op,
int  x,
int  y,
int  randomly,
object originator 
)

Move an object (even linked objects) to another spot on the same map.

Does nothing if there is no free spot.

Parameters
opwhat to move.
x
ynew coordinates.
randomlyif true, use object_find_free_spot() to find the destination, otherwise use object_find_first_free_spot().
originatorwhat is causing op to move.
Return values
1op was destroyed.
0op was moved.

Definition at line 144 of file move.c.

References obj::contr, freearr_x, freearr_y, HEAD, obj::map, map_newmap_cmd(), object_find_first_free_spot(), object_find_free_spot(), object_insert_in_map_at(), object_remove(), PLAYER, player_update_bg_music(), SIZEOFFREE, pl::socket, and obj::type.

Referenced by cfapi_object_transfer(), hole_type_move_on(), kill_player(), move_teleporter(), shop_mat_type_move_on(), and trapdoor_type_move_on().

Here is the call graph for this function:

Here is the caller graph for this function:

static int try_fit ( object op,
mapstruct m,
int  x,
int  y 
)
static

Checks if an objects fits on a specified spot.

This is a new version of blocked, this one handles objects that can be passed through by monsters with the CAN_PASS_THRU defined.

Very new version handles also multipart objects This is currently only used for the boulder roll code.

Parameters
opwhat object to fit.
m
x
ywhere to put op.
Return values
1object does not fit.
0object fits.

Definition at line 314 of file move.c.

References DOOR, FLAG_ALIVE, FOR_MAP_FINISH, FOR_MAP_PREPARE, get_map_flags(), HEAD, obj::more, OB_MOVE_BLOCK, P_OUT_OF_MAP, QUERY_FLAG, obj::x, and obj::y.

Referenced by roll_ob().

Here is the call graph for this function:

Here is the caller graph for this function: