Crossfire Server, Trunk
build_map.c File Reference
#include "global.h"
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "living.h"
#include "skills.h"
#include "spells.h"
#include "sproto.h"
#include "tod.h"
+ Include dependency graph for build_map.c:

Go to the source code of this file.

Functions

static int adjust_sign_msg (object *pl, short x, short y, object *tmp)
 
static int apply_builder_floor (object *pl, object *new_floor, short x, short y)
 
static int apply_builder_item (object *pl, object *new_item, short x, short y)
 
void apply_builder_remove (object *pl, int dir)
 
static int apply_builder_wall (object *pl, object *new_wall, short x, short y)
 
static int apply_builder_window (object *pl, object *new_wall_win, short x, short y)
 
void apply_map_builder (object *pl, int dir)
 
static int can_build_over (struct mapdef *map, object *new_item, short x, short y)
 
static int find_or_create_connection_for_map (object *pl, short x, short y, object *rune)
 
static int find_unused_connected_value (struct mapdef *map)
 
static void fix_walls (struct mapdef *map, int x, int y)
 
static objectget_connection_rune (object *pl, short x, short y)
 
static objectget_msg_book (object *pl, short x, short y)
 
static objectget_wall (struct mapdef *map, int x, int y)
 
static void remove_marking_runes (struct mapdef *map, short x, short y)
 

Detailed Description

This file handles all ingame construction functions: builders, destroyers, building materials.

Basically, those enable a player to alter in real-time a map.

Todo:
document building, forces used to store connection values, ...

Definition in file build_map.c.

Function Documentation

◆ adjust_sign_msg()

static int adjust_sign_msg ( object pl,
short  x,
short  y,
object tmp 
)
static

Make the built object inherit the msg of books that are used with it. For objects already invisible (i.e. magic mouths & ears), also make it it inherit the face and the name with "talking " prepended.

The book is removed during the operation.

Parameters
plplayer building.
x
ybuilding coordinates.
tmpobject that is being built.
Returns
-1 if no text found, 0 if ok to build.

Definition at line 184 of file build_map.c.

References add_string(), buf, obj::custom_name, draw_ext_info(), obj::face, free_string(), get_msg_book(), MAX_BUF, obj::msg, MSG_TYPE_APPLY, MSG_TYPE_APPLY_BUILD, obj::name, obj::name_pl, NDI_UNIQUE, object_free_drop_inventory(), object_remove(), object_set_msg(), Ice::tmp, diamondslots::x, and diamondslots::y.

Referenced by apply_builder_item().

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

◆ apply_builder_floor()

static int apply_builder_floor ( object pl,
object new_floor,
short  x,
short  y 
)
static

Floor building function.

Floors can be built:

  • on existing floors, with or without a detector/button
  • on an existing wall, with or without a floor under it
Note
this function will inconditionally change squares around (x, y) so don't call it with x == 0 for instance!
Parameters
plplayer building.
new_floornew floor object
x
ywhere to build.
Returns
1 if the floor was built

Definition at line 506 of file build_map.c.

References obj::arch, arch_to_object(), draw_ext_info(), fix_walls(), FLAG_IS_BUILDABLE, FLAG_IS_FLOOR, FLAG_UNIQUE, FLOOR, FOR_MAP_FINISH, FOR_MAP_PREPARE, freearr_x, freearr_y, GET_MAP_OB, INS_BELOW_ORIGINATOR, INS_ON_TOP, MAX_BUF, diamondslots::message, MSG_TYPE_APPLY, MSG_TYPE_APPLY_BUILD, NDI_UNIQUE, object_free_drop_inventory(), object_insert_in_map_at(), object_remove(), OUT_OF_REAL_MAP, QUERY_FLAG, SET_FLAG, Ice::tmp, obj::type, WALL, diamondslots::x, and diamondslots::y.

Referenced by apply_map_builder().

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

◆ apply_builder_item()

static int apply_builder_item ( object pl,
object new_item,
short  x,
short  y 
)
static

Generic item builder.

Item must be put on a square with a floor, you can have something under.

Type of inserted item is tested for specific cases (doors & such).

Item is inserted above the floor.

Note that it is the responsability of the caller to check whether the space is buildable or not.

Parameters
plplayer building.
new_itemnew item being built
x
ywhere to build.
Returns
1 if the item was built

Definition at line 796 of file build_map.c.

References add_button_link(), adjust_sign_msg(), obj::arch, BUTTON, CF_HANDLE, push::connected, DETECTOR, DOOR, draw_ext_info(), draw_ext_info_format(), find_or_create_connection_for_map(), FLAG_IS_FLOOR, FLAG_NO_PICK, FLOOR, FOR_OB_AND_ABOVE_FINISH, FOR_OB_AND_ABOVE_PREPARE, GATE, get_connection_rune(), GET_MAP_OB, INS_ABOVE_FLOOR_ONLY, MAGIC_EAR, MAX_BUF, MSG_TYPE_APPLY, MSG_TYPE_APPLY_BUILD, give::name, archt::name, NDI_UNIQUE, object_free_drop_inventory(), object_insert_in_map_at(), object_remove(), PEDESTAL, QUERY_FLAG, query_name(), SET_FLAG, SIGN, TIMED_GATE, obj::type, diamondslots::x, and diamondslots::y.

Referenced by apply_map_builder().

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

◆ apply_builder_remove()

void apply_builder_remove ( object pl,
int  dir 
)

Item remover.

Removes first buildable item, either under or above the floor

Parameters
plplayer removing an item.
dirdirection the player is trying to remove.

Definition at line 889 of file build_map.c.

References BUTTON, CF_HANDLE, DETECTOR, DOOR, draw_ext_info(), draw_ext_info_format(), FLAG_IS_FLOOR, FLAG_IS_LINKED, FLOOR, freearr_x, freearr_y, GATE, GET_MAP_OB, say::item, llevError, LOG(), MAGIC_EAR, MAX_BUF, MSG_TYPE_APPLY, MSG_TYPE_APPLY_BUILD, give::name, NDI_UNIQUE, object_free_drop_inventory(), object_remove(), PEDESTAL, QUERY_FLAG, query_name(), remove_button_link(), SIGN, TIMED_GATE, WALL, diamondslots::x, and diamondslots::y.

Referenced by apply_map_builder().

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

◆ apply_builder_wall()

static int apply_builder_wall ( object pl,
object new_wall,
short  x,
short  y 
)
static

Wall building function

Walls can be built:

  • on a floor without anything else
  • on an existing wall, with or without a floor
Parameters
plplayer building.
new_wallnew wall object
x
ywhere to build.
Returns
1 if the wall was built

Definition at line 626 of file build_map.c.

References obj::arch, draw_ext_info(), fix_walls(), get_wall(), INS_ABOVE_FLOOR_ONLY, MAX_BUF, diamondslots::message, MSG_TYPE_APPLY, MSG_TYPE_APPLY_BUILD, archt::name, NDI_UNIQUE, object_free_drop_inventory(), object_insert_in_map_at(), object_remove(), OUT_OF_REAL_MAP, remove_marking_runes(), obj::type, WALL, diamondslots::x, and diamondslots::y.

Referenced by apply_map_builder().

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

◆ apply_builder_window()

static int apply_builder_window ( object pl,
object new_wall_win,
short  x,
short  y 
)
static

Window building function

Windows can be built only on top of existing vertical or horizontal walls (*wall_2_1_1 or *wall_2_1_2).

Parameters
plplayer building.
new_wall_winnew windowed wall object
x
ywhere to build.
Returns
1 if the window was built

Definition at line 706 of file build_map.c.

References obj::arch, arch_to_object(), draw_ext_info(), find_archetype(), obj::flags, get_wall(), INS_ABOVE_FLOOR_ONLY, MAX_BUF, MSG_TYPE_APPLY, MSG_TYPE_APPLY_BUILD, archt::name, NDI_UNIQUE, object_free_drop_inventory(), object_insert_in_map_at(), object_remove(), obj::type, WALL, diamondslots::x, and diamondslots::y.

Referenced by apply_map_builder().

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

◆ apply_map_builder()

void apply_map_builder ( object pl,
int  dir 
)

Global building function

This is the general map building function. Called when the player 'fires' a builder or remover object.

Parameters
plplayer building or removing.
dirbuilding direction.

Definition at line 959 of file build_map.c.

References apply_builder_floor(), apply_builder_item(), apply_builder_remove(), apply_builder_wall(), apply_builder_window(), create-tower::builder, can_build_over(), draw_ext_info(), find_archetype(), find_marked_object(), FLAG_IS_BUILDABLE, FLAG_UNPAID, FOR_OB_AND_ABOVE_FINISH, FOR_OB_AND_ABOVE_PREPARE, freearr_x, freearr_y, GET_MAP_OB, IS_PLAYER(), llevError, LOG(), MAP_HEIGHT, MAP_WIDTH, MATERIAL, MSG_TYPE_APPLY, MSG_TYPE_APPLY_BUILD, NDI_UNIQUE, object_create_arch(), object_decrease_nrof_by_one, QUERY_FLAG, range_builder, pl::ranges, SET_FLAG, SIGN, obj::slaying, ST_BD_BUILD, ST_BD_REMOVE, ST_MAT_FLOOR, ST_MAT_ITEM, ST_MAT_WALL, ST_MAT_WINDOW, obj::subtype, Ice::tmp, obj::type, diamondslots::x, and diamondslots::y.

Referenced by fire().

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

◆ can_build_over()

static int can_build_over ( struct mapdef map,
object new_item,
short  x,
short  y 
)
static

Check if objects on a square interfere with building.

Parameters
mapmap we're building on.
new_itemitem the player is trying to build, must not be NULL.
x
ycoordinates where to build.
Returns
0 if new_item can't be built on the spot, 1 if it can be built.

Definition at line 48 of file build_map.c.

References obj::arch, BOOK, BUTTON, CF_HANDLE, archt::clone, DETECTOR, DOOR, FLAG_IS_BUILDABLE, FOR_MAP_FINISH, FOR_MAP_PREPARE, GATE, HEAD, MAGIC_EAR, disinfect::map, obj::more, guildjoin::ob, PEDESTAL, QUERY_FLAG, SIGN, Ice::tmp, obj::type, diamondslots::x, obj::x, diamondslots::y, and obj::y.

Referenced by apply_map_builder().

+ Here is the caller graph for this function:

◆ find_or_create_connection_for_map()

static int find_or_create_connection_for_map ( object pl,
short  x,
short  y,
object rune 
)
static

Helper function for door/button/connected item building.

Will search the specified spot for a marking rune. If not found, returns -1 Else, searches a force in op's inventory matching the map's name and the rune's text. If found, returns the connection value associated else searches a new connection value, and adds the force to the player.

Parameters
plplayer building.
x
ycoordinates where to build.
runerune used to indicate the connection value. If NULL, building is searched for one.
Returns
-1 for failure, else connection value.

Definition at line 271 of file build_map.c.

References add_string(), push::connected, create_archetype(), draw_ext_info(), find_unused_connected_value(), FOR_INV_FINISH, FOR_INV_PREPARE, dragon_attune::force, FORCE, FORCE_NAME, get_connection_rune(), obj::msg, MSG_TYPE_APPLY, MSG_TYPE_APPLY_BUILD, NDI_UNIQUE, object_insert_in_ob(), object_set_msg(), object_update_speed(), Ice::tmp, diamondslots::x, and diamondslots::y.

Referenced by apply_builder_item().

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

◆ find_unused_connected_value()

static int find_unused_connected_value ( struct mapdef map)
static

Returns an unused value for 'connected'.

Tries 1000 random values, then returns -1.

Parameters
mapmap for which to find a value
Returns
'connected' value with no item, or -1 if failure.

Definition at line 233 of file build_map.c.

References push::connected, disinfect::map, oblinkpt::next, and oblinkpt::value.

Referenced by find_or_create_connection_for_map().

+ Here is the caller graph for this function:

◆ fix_walls()

static void fix_walls ( struct mapdef map,
int  x,
int  y 
)
static

Fixes walls around specified spot

Basically it ensures the correct wall is put where needed.

Note
x & y must be valid map coordinates.
Parameters
map
x
yposition to fix.
Todo:
investigate possible merge with retrofit_joined_wall() used for random maps

Definition at line 335 of file build_map.c.

References obj::arch, arch_to_object(), obj::flags, get_wall(), INS_ABOVE_FLOOR_ONLY, disinfect::map, MAP_HEIGHT, MAP_WIDTH, MAX_BUF, archt::name, object_free_drop_inventory(), object_insert_in_map_at(), object_remove(), try_find_archetype(), obj::type, WALL, diamondslots::x, and diamondslots::y.

Referenced by apply_builder_floor(), and apply_builder_wall().

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

◆ get_connection_rune()

static object* get_connection_rune ( object pl,
short  x,
short  y 
)
static

Returns the marking rune on the square, for purposes of building connections.

Parameters
plplayer trying to build.
x
ycoordinates to search.
Returns
marking rune, NULL if none found.

Definition at line 103 of file build_map.c.

References FOR_MAP_FINISH, FOR_MAP_PREPARE, SIGN, diamondslots::x, and diamondslots::y.

Referenced by apply_builder_item(), and find_or_create_connection_for_map().

+ Here is the caller graph for this function:

◆ get_msg_book()

static object* get_msg_book ( object pl,
short  x,
short  y 
)
static

Returns the book/scroll on the current square, for purposes of building

Parameters
plplayer trying to build.
x
ycoordinates to search.
Returns
book, NULL if none found.

Definition at line 122 of file build_map.c.

References BOOK, FOR_MAP_FINISH, FOR_MAP_PREPARE, diamondslots::x, and diamondslots::y.

Referenced by adjust_sign_msg().

+ Here is the caller graph for this function:

◆ get_wall()

static object* get_wall ( struct mapdef map,
int  x,
int  y 
)
static

Returns first item of type WALL.

Parameters
map
x
ywhere to search.
Returns
wall, or NULL if none found.
Todo:
isn't there a similar function somewhere? put this in a common library? investigate possible merge with retrofit_joined_wall() used for random maps

Definition at line 142 of file build_map.c.

References FOR_MAP_FINISH, FOR_MAP_PREPARE, disinfect::map, WALL, diamondslots::x, and diamondslots::y.

Referenced by apply_builder_wall(), apply_builder_window(), and fix_walls().

+ Here is the caller graph for this function:

◆ remove_marking_runes()

static void remove_marking_runes ( struct mapdef map,
short  x,
short  y 
)
static

Erases all marking runes at specified location (before building a wall)

Parameters
map
x
ycoordinates to erase runes at.

Definition at line 158 of file build_map.c.

References FOR_MAP_FINISH, FOR_MAP_PREPARE, disinfect::map, object_free_drop_inventory(), object_remove(), SIGN, diamondslots::x, and diamondslots::y.

Referenced by apply_builder_wall().

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