Crossfire Server, Trunk
move.c File Reference
#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)
 
int move_object (object *op, int dir)
 
int move_to (object *op, int x, int y)
 
int object_teleport (object *op, mapstruct *map, int x, int y)
 
int push_ob (object *who, int dir, object *pusher)
 
void recursive_roll (object *op, int dir, object *pusher)
 
static int roll_ob (object *op, int dir, object *pusher)
 
int teleport (object *teleporter, uint8_t tele_type, object *user)
 
int transfer_ob (object *op, int x, int y, int randomly, object *originator)
 
static int try_fit (object *op, mapstruct *m, int x, int y)
 

Detailed Description

Those functions handle object moving and pushing.

Definition in file move.c.

Function Documentation

◆ move_ob()

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(), pl::do_los, esrv_map_scroll(), FLAG_ALIVE, FLAG_WIZPASS, FOR_INV_FINISH, FOR_INV_PREPARE, freearr_x, freearr_y, get_map_flags(), socket_struct::look_position, m, obj::map, monster_check_doors(), monster_check_earthwalls(), obj::more, MOVE_WALK, object_insert_in_map_at(), object_remove(), object_was_destroyed, give::op, P_OUT_OF_MAP, play_sound_map(), PLAYER, QUERY_FLAG, pl::socket, SOUND_TYPE_GROUND, TRANSPORT, socket_struct::update_look, WILL_APPLY_DOOR, WILL_APPLY_EARTHWALL, diamondslots::x, obj::x, diamondslots::y, and obj::y.

Referenced by cfapi_object_move(), eventListener(), 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:

◆ move_object()

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(), and give::op.

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:

◆ move_to()

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 563 of file move.c.

References animate_object(), give::direction, get_map_flags(), GET_MAP_OB, monster_compute_path(), move_ob(), give::op, P_OUT_OF_MAP, diamondslots::x, and diamondslots::y.

Referenced by cfapi_object_transfer().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ object_teleport()

int object_teleport ( object op,
mapstruct map,
int  x,
int  y 
)

Move the specified object in a free spot around the map's x & y.

Parameters
opobject to move, may be REMOVED or not.
mapmap to move op to.
xcoordinate to move op to.
ycoordinate to move op to.
Returns
1 if op was moved, 0 else.

Definition at line 597 of file move.c.

References FLAG_REMOVED, disinfect::map, map_newmap_cmd(), object_find_first_free_spot(), object_insert_in_map_at(), object_remove(), give::op, out_of_map(), PLAYER, player_update_bg_music(), QUERY_FLAG, diamondslots::x, and diamondslots::y.

Referenced by add_npc_to_point(), add_npc_to_zone(), and cfapi_object_teleport().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ push_ob()

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 434 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, m, obj::map, monster_npc_call_help(), 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, guildbuy::temp, obj::type, socket_struct::update_look, autojail::who, 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:

◆ recursive_roll()

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 293 of file move.c.

References draw_ext_info_format(), MAX_BUF, move_ob(), MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_FAILURE, MSG_TYPE_COMMAND_SUCCESS, give::name, NDI_BLACK, NDI_UNIQUE, give::op, query_name(), roll_ob(), and nlohmann::detail::void().

Referenced by move_player_attack().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ roll_ob()

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 380 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, m, OB_MOVE_BLOCK, object_insert_in_map_at(), object_remove(), give::op, P_IS_ALIVE, P_OUT_OF_MAP, PREFER_LOW, QUERY_FLAG, random_roll(), obj::stats, liv::Str, Ice::tmp, try_fit(), diamondslots::x, and diamondslots::y.

Referenced by recursive_roll().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ teleport()

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 204 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(), m, 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, pets_attempt_follow(), PLAYER, player_update_bg_music(), RANDOM, SHOP_MAT, pl::socket, Ice::tmp, 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:

◆ transfer_ob()

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 163 of file move.c.

References freearr_x, freearr_y, HEAD, map_newmap_cmd(), object_find_first_free_spot(), object_find_free_spot(), object_insert_in_map_at(), object_remove(), give::op, pets_attempt_follow(), PLAYER, player_update_bg_music(), SIZEOFFREE, diamondslots::x, and diamondslots::y.

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:

◆ try_fit()

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 331 of file move.c.

References DOOR, FLAG_ALIVE, FOR_MAP_FINISH, FOR_MAP_PREPARE, get_map_flags(), HEAD, m, obj::more, OB_MOVE_BLOCK, give::op, P_OUT_OF_MAP, QUERY_FLAG, Ice::tmp, diamondslots::x, obj::x, diamondslots::y, and obj::y.

Referenced by roll_ob().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: