Go to the documentation of this file.
78 "You can't do that to yourself.");
83 "That player is in no state for that right now.");
96 if (!
pl->stack_items || !
pl->stack_position) {
102 pl->stack_position--;
104 "Popped item from stack, %d left.",
123 if (!
pl->stack_position) {
132 "Stacked item was removed!");
151 if (!
pl->stack_items) {
162 pl->stack_items[
pl->stack_position] =
item;
164 "Item stacked as %d.",
166 pl->stack_position++;
197 int item_tag, item_position;
215 if (sscanf(*
params,
"%d", &item_tag)) {
243 if (sscanf(*
params,
"$%d", &item_position)) {
252 if (item_position >=
pl->stack_position) {
256 "No such stack item %d!",
266 "Stack item %d was removed.",
277 if (!strncmp(*
params,
"me", 2)) {
311 "loadtest will stress server through teleporting at different map places. "
312 "Use at your own risk. Very long loop used so server may have to be reset. "
313 "type loadtest TRUE to run");
319 if (strncmp(
params,
"TRUE", 4))
334 op->contr->hidden = 0;
338 "You are no longer hidden from other players");
341 "%s has entered the game.",
op->name);
353 if (
op->contr->hidden) {
358 "The Dungeon Master has arrived!");
361 op->contr->hidden = 1;
363 "Other players will no longer see you.");
368 "The Dungeon Master is gone...");
372 "%s leaves the game.",
423 if (*
params ==
'\0' || !(
str =
const_cast<char *
>(strchr(
params,
' ')))) {
425 "Usage: set_god player god");
433 "Set whose god - can not find object %s?",
444 "%s is not a player - can not change its god",
478 "%s is kicked out of the game.",
510 "Usage: banish <player>.");
520 if ((banishfile = fopen(
buf,
"a")) == NULL) {
523 "Could not find banish_file.");
532 fprintf(banishfile,
"# %s (%s) banned by %s at %s\n",
pl->ob->name,
pl->socket->host,
op->name, ctime(&now));
533 fprintf(banishfile,
"*@%s\n",
pl->socket->host);
536 LOG(
llevDebug,
"! %s banned %s from IP: %s.\n",
op->name,
pl->ob->name,
pl->socket->host);
543 "%s banishes %s from the land!",
544 op->name,
pl->ob->name);
575 "Overlay save error!");
578 "Current map has been saved as an overlay.");
598 "Overlay successfully removed.");
601 "Overlay couldn't be removed.");
604 "No overlay for current map.");
620 "Usage: toggle_shout <player>.");
628 if (
pl->ob->contr->no_shout == 0) {
629 pl->ob->contr->no_shout = 1;
632 "You have been muzzled by the DM!");
642 pl->ob->contr->no_shout = 0;
644 "You are allowed to shout and chat again.");
646 "You remove %s's muzzle.",
659 if (strlen(
params) == 0) {
673 }
else if (strcmp(
params,
"cancel") == 0) {
677 LOG(
llevInfo,
"Server shutdown cancelled by %s.\n",
op->name);
683 }
else if (strncmp(
params,
"now", 3) == 0) {
689 LOG(
llevInfo,
"Server shutdown initiated by %s.\n",
op->name);
690 }
else if (strcmp(
params,
"idle") == 0) {
696 LOG(
llevInfo,
"Server idle shutdown scheduled by %s.\n",
op->name);
699 int minutes = atoi(
params);
701 if (minutes > 0 && minutes <= 720) {
704 "Server will shut down in %d minutes.", minutes);
707 LOG(
llevInfo,
"Server shutdown scheduled in %d minutes by %s.\n", minutes,
op->name);
711 "Please specify a reasonable time in minutes.");
730 "Go to what level?");
751 "Usage: freeze [ticks] <player>.");
761 "Usage: freeze [ticks] <player>.");
772 "You have been frozen by the DM!");
775 "You freeze %s for %d ticks",
776 pl->ob->name, ticks);
778 pl->ob->speed_left = -(
pl->ob->speed*ticks);
829 "Usage: arrest <player>.");
840 "Can't jail player, there is no map to hold them");
846 "Can't jail player, map loading issue or already in jail's position");
852 "You have been arrested.");
876 "Usage: summon <player>.");
887 "Can not find a free spot to place summoned player.");
898 "You are summoned.");
943 "Usage: teleport <player>.");
950 "No such player or ambiguous name.");
957 "Can not find a free spot to teleport to.");
967 if (!
op->contr->hidden)
969 "You see a portal open.");
971 "You teleport to %s",
1002 int magic,
set_magic = 0, set_nrof = 0, gotquote, gotspace;
1004 char *cp, *bp, *bp2, *bp3, *endline, cpy[
MAX_BUF];
1013 "Usage: create [nr] [magic] <archetype> [ of <artifact>] [variable_to_patch setting]");
1020 endline = bp+strlen(bp);
1022 if (sscanf(bp,
"%u ", &nrof)) {
1023 if ((bp = strchr(cpy,
' ')) == NULL) {
1025 "Usage: create [nr] [magic] <archetype> [ of <artifact>] [variable_to_patch setting]");
1032 if (sscanf(bp,
"%d ", &magic)) {
1033 if ((bp = strchr(bp,
' ')) == NULL) {
1035 "Usage: create [nr] [magic] <archetype> [ of <artifact>] [variable_to_patch setting]");
1040 LOG(
llevDebug,
"%s creates: (%d) (%d) %s\n",
op->name, nrof, magic, bp);
1042 if ((cp = strstr(bp,
" of ")) != NULL) {
1046 for (bp2 = bp; *bp2; bp2++) {
1056 "No such archetype.");
1061 char spell_name[
MAX_BUF], *fsp = NULL;
1074 fsp = strchr(spell_name,
' ');
1082 bp2 = cp+strlen(spell_name)+1;
1095 "No artifact list for type %d\n",
1099 auto i = std::find_if(items.cbegin(), items.cend(),
1100 [&] (
const auto art) { return !strcmp(art->item->name, cp) && legal_artifact_combination(&at->clone, art); });
1101 art = i == items.cend() ? nullptr : *i;
1105 "No such artifact ([%d] of %s)",
1109 LOG(
llevDebug,
"%s creates: (%d) (%d) (%s) of (%s)\n",
op->name, set_nrof ? nrof : 0,
set_magic ? magic : 0, bp, cp);
1116 "Unable to find spell %s for object that needs it, or it is of wrong type",
1123 "Unable to find spell %s for object that needs it, or it is of wrong type",
1152 while (*bp2 && bp2 <= endline) {
1156 for (bp3 = bp2; *bp3 && gotspace < 2 && gotquote < 2; bp3++) {
1170 }
else if (*bp3 ==
' ') {
1180 if (gotspace == 2 || gotquote == 2) {
1183 }
else if (*bp3 ==
'\0')
1186 if ((gotquote && gotquote != 2)
1187 || (gotspace != 2 && gotquote != 2)) {
1196 "Malformed create line: %s",
1205 "Unknown variable %s",
1210 tmp->name,
tmp->count, bp2);
1241 for (i = 0; i < (set_nrof ? nrof : 1); i++) {
1243 object *prev = NULL, *head = NULL, *dup;
1245 for (atmp = at; atmp != NULL; atmp = atmp->
more) {
1261 dup->x =
op->x+dup->arch->clone.x;
1262 dup->y =
op->y+dup->arch->clone.y;
1273 object *
check = head;
1288 "Object too big to insert in map, or wrong position.");
1346 "Inventory of what object (nr)?");
1393 "Object is marked original");
1411 "Aggression turned OFF");
1416 "Aggression turned ON");
1440 if (sscanf(
params,
"%d", &i))
1447 "Patch what object (nr)?");
1453 "As insane as you are, I cannot allow you to possess yourself.");
1473 if (i == 1 || i == 6 || i == 8 || i == 9)
1474 victim->body_info[i] = 2;
1476 victim->body_info[i] = 1;
1494 const char *arg, *arg2;
1506 "Patch what values?");
1510 if ((arg2 = strchr(arg,
' ')))
1516 "Unknown variable %s",
1521 tmp->name,
tmp->count, arg, arg2);
1572 "Remove what object (nr)?");
1578 "Unable to remove a player!");
1587 "%s is already removed!",
1598 if (
tmp->speed != 0) {
1620 "Free what object (nr)?");
1631 "Warning: item was not removed, will do so now.");
1641 if (sscanf(
params,
"%s %[^\n]", account_name, newpw) != 2) {
1643 "Usage: accountpasswd ACCOUNT PASSWORD");
1651 "Updated account password.");
1655 "Invalid characters in new password.");
1659 "Invalid characters in new password.");
1663 "Error changing password.");
1679 object *skillob = NULL;
1685 || ((
q = sscanf(
params,
"%s %d %[^\r\n]",
buf, &i, skill)) < 2)) {
1687 "Usage: addexp player quantity [skill].");
1705 "Unable to find skill %s in %s",
1716 pl->ob->stats.exp += i;
1737 "Current speed is %d",
1745 "The speed is changed to %d.",
1779 "[Fixed]Statistics for %s:",
pl->ob->name);
1782 "[fixed]Str : %-2d H.P. : %-4d MAX : %d",
1783 pl->ob->stats.Str,
pl->ob->stats.hp,
pl->ob->stats.maxhp);
1786 "[fixed]Dex : %-2d S.P. : %-4d MAX : %d",
1787 pl->ob->stats.Dex,
pl->ob->stats.sp,
pl->ob->stats.maxsp);
1790 "[fixed]Con : %-2d AC : %-4d WC : %d",
1791 pl->ob->stats.Con,
pl->ob->stats.ac,
pl->ob->stats.wc);
1794 "[fixed]Int : %-2d Damage : %d",
1795 pl->ob->stats.Int,
pl->ob->stats.dam);
1798 "[fixed]Wis : %-2d EXP : %" FMT64,
1799 pl->ob->stats.Wis,
pl->ob->stats.exp);
1802 "[fixed]Pow : %-2d Grace : %d",
1803 pl->ob->stats.Pow,
pl->ob->stats.grace);
1806 "[fixed]Cha : %-2d Food : %d",
1807 pl->ob->stats.Cha,
pl->ob->stats.food);
1820 char thing[20], thing2[20];
1828 || sscanf(
params,
"%s %s %d", thing, thing2, &iii) != 3
1829 || thing[0] ==
'\0') {
1835 if (thing2[0] ==
'\0') {
1837 "You can't change that.");
1843 "Illegal range of stat.\n");
1848 if (!strcmp(
pl->ob->name, thing)) {
1851 if (!strcmp(
"str", thing2))
1852 pl->ob->stats.Str = iii,
pl->orig_stats.Str = iii;
1853 if (!strcmp(
"dex", thing2))
1854 pl->ob->stats.Dex = iii,
pl->orig_stats.Dex = iii;
1855 if (!strcmp(
"con", thing2))
1856 pl->ob->stats.Con = iii,
pl->orig_stats.Con = iii;
1857 if (!strcmp(
"wis", thing2))
1858 pl->ob->stats.Wis = iii,
pl->orig_stats.Wis = iii;
1859 if (!strcmp(
"cha", thing2))
1860 pl->ob->stats.Cha = iii,
pl->orig_stats.Cha = iii;
1861 if (!strcmp(
"int", thing2))
1862 pl->ob->stats.Int = iii,
pl->orig_stats.Int = iii;
1863 if (!strcmp(
"pow", thing2))
1864 pl->ob->stats.Pow = iii,
pl->orig_stats.Pow = iii;
1866 "%s has been altered.",
1887 object *dummy = NULL, *
tmp = NULL;
1889 const char *space, *confirmation = NULL;
1898 space = strchr(
params,
' ');
1899 if (space != NULL) {
1905 if (strcmp(
params,
".") == 0) {
1919 if (
m->unique && (
op->map ==
m)) {
1922 "Cannot reset a unique player map while on it. Use "
1923 "'reset full-reset %s' while standing somewhere else.",
1928 if (strncmp(
"full-reset", confirmation, strlen(
"full-reset"))) {
1938 if ((
op->contr &&
op->contr->transport) && (
op->map ==
m)) {
1940 "You need to disembark first.");
1946 sstring reset_group =
m->reset_group;
1947 m->reset_group = NULL;
1951 LOG(
llevError,
"Tried to swap out map which was not in memory.\n");
1952 m->reset_group = reset_group;
1961 if (strncmp(
m->path,
"/random/", 8) == 0) {
1971 "You cannot reset a random map when inside it.");
1972 m->reset_group = reset_group;
2001 "Reset failed, error code: %d.",
res);
2012 m->reset_group = reset_group;
2018 "Reset failed, couldn't swap map, the following players are on it:");
2020 if (
pl->ob->map ==
m &&
pl->ob !=
op) {
2028 "hmm, I don't see any other players on this map, something else is the problem.");
2029 m->reset_group = reset_group;
2065 if (confirmation == NULL) {
2068 "Use 'reset full-reset %s' to fully reset the map.",
params);
2088 if (
op->contr->hidden) {
2092 "The Dungeon Master is gone...");
2117 static int checkdm(
object *
op,
const char *pl_name,
const char *pl_passwd,
const char *pl_host) {
2120 char line_buf[160],
name[160], passwd[160], host[160];
2122 #ifdef RESTRICTIVE_DM
2123 *pl_name =
op->name ?
op->name :
"*";
2129 if ((dmfile = fopen(
buf,
"r")) == NULL) {
2134 while (fgets(line_buf, 160, dmfile) != NULL) {
2136 if (line_buf[0] ==
'#' || line_buf[0] ==
'\n')
2138 if (sscanf(line_buf,
"%[^:]:%[^:]:%s\n",
name, passwd, host) != 3) {
2139 LOG(
llevError,
"Warning - malformed dm file entry: %s\n", line_buf);
2140 }
else if ((!strcmp(
name,
"*") || (pl_name && !strcmp(pl_name,
name)))
2141 && (!strcmp(passwd,
"*") || !strcmp(passwd, pl_passwd))
2142 && (!strcmp(host,
"*") || !strcmp(host, pl_host))) {
2171 "You are already the Dungeon Master!");
2181 "Ok, you are the Dungeon Master!");
2193 "The Dungeon Master has arrived!");
2199 "Sorry Pal, I don't think so.");
2229 op->invisible += 100;
2232 "You turn invisible.");
2256 size_t spell_name_length;
2262 if (ar->clone.type !=
SPELL)
2265 if (strncmp(ar->name,
"spelldirect_", 12) == 0)
2268 if (strcmp(ar->clone.name, spell_name) != 0)
2272 if (!conflict_found) {
2275 "More than one archetype matches the spell name %s:",
2299 spell_name_length = strlen(spell_name);
2304 if (ar->clone.type !=
SPELL)
2307 if (strncmp(ar->name,
"spelldirect_", 12) == 0)
2310 if (strncmp(ar->clone.name, spell_name, spell_name_length) != 0)
2314 if (!conflict_found) {
2317 "More than one spell matches %s:",
2342 "The spell %s does not exist.",
2360 if (
op->contr == NULL || *
params ==
'\0') {
2362 "Which spell do you want to learn?");
2373 "You already know the spell %s.",
2418 if (
op->contr == NULL || *
params ==
'\0') {
2420 "Which spell do you want to forget?");
2425 if (spell == NULL) {
2427 "You do not know the spell %s.",
2463 "Load which plugin?");
2467 snprintf(
buf,
sizeof(
buf), LIBDIR
"/plugins/%s",
params);
2472 "Plugin %s successfully loaded.",
2476 "Could not load plugin %s.",
2493 "Remove which plugin?");
2500 "Plugin %s successfully removed.",
2505 "Could not remove plugin %s.",
2572 "Item stack contents:");
2583 " %d : (lost item: %d)",
2598 op->contr->stack_position = 0;
2600 "Item stack cleared.");
2623 object *left, *right;
2626 int left_from, right_from;
2631 "Compare to what item?");
2643 "Compare what item?");
2648 "Item difference:");
2657 if (
op->contr->stack_position > 1) {
2661 "(Note: first item taken from undertop)");
2671 if (*diff ==
'\0') {
2687 object *left, *right, *inserted;
2688 int left_from, right_from;
2694 "Insert into what object?");
2706 "Insert what item?");
2717 if (
op->contr->stack_position > 1) {
2721 "(Note: item to insert into taken from undertop)");
2728 if (left == right) {
2730 "Can't insert an object into itself!");
2736 "Can't insert a player into something!");
2744 if (inserted != right)
2751 "Inserted %s in %s",
2766 int maps_used = 0, mapmem = 0, objects_used = 0,
x,
y;
2769 for (mp =
styles; mp != NULL; mp = mp->
next) {
2781 "[fixed]Style maps loaded: %d",
2784 "[fixed]Memory used, not");
2786 "[fixed]including objects: %d",
2789 "[fixed]Style objects: %d",
2792 "[fixed]Mem for objects: %lu",
2793 (
unsigned long)(objects_used*
sizeof(
object)));
2813 if (
op->contr->followed_player != NULL) {
2825 if (other ==
op->contr) {
2835 "You can only follow members in the same party.");
2846 if (
op->contr->followed_player)
2889 if (
op &&
op->below) {
2904 if (
op &&
op->above) {
static player * get_other_player_from_name(object *op, const char *name)
void command_overlay_reset(object *op, const char *params)
void command_possess(object *op, const char *params)
static void set_magic(int difficulty, object *op, int max_magic, int flags)
#define FREE_AND_CLEAR_STR_IF(xyz)
#define FREE_OBJ_NO_DESTROY_CALLBACK
void set_abs_magic(object *op, int magic)
void command_overlay_save(object *op, const char *params)
#define NUM_BODY_LOCATIONS
#define MSG_TYPE_COMMAND_SUCCESS
void command_style_map_info(object *op, const char *params)
#define MSG_TYPE_ADMIN_PLAYER
void LOG(LogLevel logLevel, const char *format,...)
static void reset_faces_sent(struct socket_struct *socket)
void command_patch(object *op, const char *params)
#define QUERY_FLAG(xyz, p)
int plugins_remove_plugin(const char *id)
int plugins_init_plugin(const char *libfile)
void do_learn_spell(object *op, object *spell, int special_prayer)
void command_shutdown(object *op, const char *params)
mapstruct * has_been_loaded(const char *name)
void flush_old_maps(void)
void esrv_new_player(player *pl, uint32_t weight)
void command_speed(object *op, const char *params)
uint8_t permanent_exp_ratio
void esrv_send_inventory(object *pl, object *op)
static int do_wizard_dm(object *op, const char *params, int silent)
void command_learn_spell(object *op, const char *params)
StringBuffer * stringbuffer_new(void)
void object_set_enemy(object *op, object *enemy)
std::vector< artifact * > items
static void dm_stack_pop(player *pl)
#define FLAG_OBJ_ORIGINAL
void give_artifact_abilities(object *op, const object *artifact)
void command_arrest(object *op, const char *params)
void command_teleport(object *op, const char *params)
void command_mon_aggr(object *op, const char *params)
static void dm_stack_push(player *pl, tag_t item)
int64_t check_exp_adjust(const object *op, int64_t exp)
void draw_ext_info_format(int flags, int pri, const object *pl, uint8_t type, uint8_t subtype, const char *format,...) PRINTF_ARGS(6
void command_purge_quest(object *op, const char *param)
void calc_perm_exp(object *op)
static void unhide(object *op)
void do_dump(object *who, object *what)
void object_copy(const object *src_ob, object *dest_ob)
void command_invisible(object *op, const char *params)
void fix_object(object *op)
void command_banish(object *op, const char *params)
void plugins_display_list(object *op)
void command_addexp(object *op, const char *params)
void command_listplugins(object *op, const char *params)
#define MSG_TYPE_COMMAND_ERROR
object * object_find_by_tag_global(tag_t i)
void create_treasure(treasurelist *t, object *op, int flag, int difficulty, int tries)
void set_tick_duration(long t)
AssetsManager * getManager()
object * object_insert_in_ob(object *op, object *where)
const object * find_god(const char *name)
#define SAVE_MODE_OVERLAY
void command_learn_special_prayer(object *op, const char *params)
void command_remove(object *op, const char *params)
void map_remove_unique_files(const mapstruct *map)
#define MSG_TYPE_ADMIN_DM
#define MSG_TYPE_COMMAND_DEBUG
uint8_t spell_encumbrance
static event_registration m
void clear_los(player *pl)
char * stringbuffer_finish(StringBuffer *sb)
void object_free_drop_inventory(object *ob)
void object_update(object *op, int action)
void command_toggle_shout(object *op, const char *params)
uint32_t map_size(mapstruct *m)
void command_setgod(object *op, const char *params)
short freearr_y[SIZEOFFREE]
void command_create(object *op, const char *params)
uint8_t death_penalty_ratio
void command_reset(object *op, const char *params)
static void do_wizard_hide(object *op, int silent_dm)
void query_name(const object *op, char *buf, size_t size)
void command_summon(object *op, const char *params)
uint16_t set_friendly_fire
char * path_combine_and_normalize(const char *src, const char *dst, char *path, size_t size)
#define MSG_TYPE_COMMAND_DM
void command_purge_quest_definitions(object *op, const char *param)
void object_dump(const object *op, StringBuffer *sb)
sstring add_string(const char *str)
void command_dm(object *op, const char *params)
int out_of_map(mapstruct *m, int x, int y)
void command_abil(object *op, const char *params)
object * lookup_spell_by_name(object *op, const char *spname)
void command_dumpbelow(object *op, const char *params)
void command_diff(object *op, const char *params)
void object_update_speed(object *op)
void command_inventory(object *op, const char *params)
void do_goto(object *op, const char *name, int x, int y)
void command_swap(object *op, const char *params)
void command_help(object *op, const char *params)
struct shutdown_s shutdown_state
void show_skills(object *op, const char *search)
void command_skills(object *op, const char *params)
object * object_create_arch(archetype *at)
void player_lvl_adj(object *who, object *op)
void object_free(object *ob, int flags)
void command_dumpabove(object *op, const char *params)
void command_insert_into(object *op, const char *params)
#define FLAG_UNAGGRESSIVE
void assets_finish_archetypes_for_play()
void each(std::function< void(T *)> op)
int become_follower(object *op, const object *new_god)
void command_goto(object *op, const char *params)
uint8_t death_penalty_level
object * object_insert_in_map_at(object *op, mapstruct *m, object *originator, int flag, int x, int y)
struct archetype * other_arch
object * find_skill_by_name(object *who, const char *name)
void command_kick(object *op, const char *params)
void command_loadtest(object *op, const char *params)
Archetypes * archetypes()
size_t strlcpy(char *dst, const char *src, size_t size)
object * object_new(void)
void create_overlay_pathname(const char *name, char *buf, size_t size)
void monster_check_apply_all(object *monster)
void command_hide(object *op, const char *params)
#define SAVE_ERROR_UCREATION
#define FREE_AND_CLEAR_STR(xyz)
void command_freeze(object *op, const char *params)
uint8_t spell_failure_effects
#define MSG_TYPE_COMMAND_FAILURE
#define FOR_MAP_PREPARE(map_, mx_, my_, it_)
void command_forget_spell(object *op, const char *params)
int allow_denied_spells_writing
void command_nowiz(object *op, const char *params)
int swap_map(mapstruct *map)
void command_loadplugin(object *op, const char *params)
archetype * find_archetype_by_object_name(const char *name)
object * get_jail_exit(object *op)
static void command_learn_spell_or_prayer(object *op, const char *params, int special_prayer)
static object * get_spell_by_name(object *op, const char *spell_name)
bool can_follow(object *op, player *other)
int is_identifiable_type(const object *op)
void enter_exit(object *op, object *exit_ob)
object * object_find_by_name_global(const char *str)
object * check_spell_known(object *op, const char *name)
static object * find_object_both(const char *params)
const typedef char * sstring
void command_settings(object *op, const char *ignored)
int set_variable(object *op, const char *buf)
void command_stats(object *op, const char *params)
void command_dump(object *op, const char *params)
int object_find_free_spot(const object *ob, mapstruct *m, int x, int y, int start, int stop)
void command_dmhide(object *op, const char *params)
void esrv_update_item(int flags, object *pl, object *op)
void command_unloadplugin(object *op, const char *params)
#define CLEAR_FLAG(xyz, p)
int player_arrest(object *who)
void command_follow(object *op, const char *params)
static object * get_dm_object(player *pl, const char **params, int *from)
void get_ob_diff(StringBuffer *sb, const object *op, const object *op2)
player * find_player_partial_name(const char *plname)
int account_change_password(const char *account_name, const char *current_password, const char *new_password)
object * arch_to_object(archetype *at)
void object_give_identified_properties(object *op)
int get_rangevector(object *op1, const object *op2, rv_vector *retval, int flags)
static int checkdm(object *op, const char *pl_name, const char *pl_passwd, const char *pl_host)
#define MSG_TYPE_COMMAND_MAPS
void command_accountpasswd(object *op, const char *params)
struct treasurelist * randomitems
void draw_ext_info(int flags, int pri, const object *pl, uint8_t type, uint8_t subtype, const char *message)
#define MSG_TYPE_COMMUNICATION_PARTY
void object_remove(object *op)
archetype * try_find_archetype(const char *name)
void inventory(object *op, object *inv)
void do_forget_spell(object *op, const char *spell)
static void command_kick2(object *op, const char *params)
void do_some_living(object *op)
int save_map(mapstruct *m, int flag)
void command_stack_push(object *op, const char *params)
void assets_collect(const char *datadir, int what)
uint8_t no_player_stealing
void command_free(object *op, const char *params)
#define MSG_TYPE_COMMUNICATION
void update_los(object *op)
short freearr_x[SIZEOFFREE]
void command_recollect(object *op, const char *params)
void command_stack_pop(object *op, const char *params)
uint8_t create_home_portals
artifactlist * find_artifactlist(int type)
#define SAVE_ERROR_PLAYER
static object * dm_stack_peek(player *pl)
void events_execute_global_event(int eventcode,...)
void command_stack_clear(object *op, const char *params)
void command_stack_list(object *op, const char *params)