--- deliantra/server/common/object.C 2008/12/28 03:58:36 1.274 +++ deliantra/server/common/object.C 2009/01/11 06:08:40 1.281 @@ -1,7 +1,7 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * Copyright (©) 2005,2006,2007,2008,2009 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team * Copyright (©) 1992,2007 Frank Tore Johansen * @@ -965,7 +965,7 @@ object::do_destroy () { if (flag [FLAG_IS_LINKED]) - remove_button_link (this); + remove_link (); if (flag [FLAG_FRIENDLY]) remove_friendly_object (this); @@ -1496,15 +1496,15 @@ * op is the object to insert it under: supplies x and the map. */ void -replace_insert_ob_in_map (const char *arch_string, object *op) +replace_insert_ob_in_map (shstr_tmp archname, object *op) { /* first search for itself and remove any old instances */ for (object *tmp = op->ms ().bot; tmp; tmp = tmp->above) - if (!strcmp (tmp->arch->archname, arch_string)) /* same archetype */ + if (tmp->arch->archname == archname) /* same archetype */ tmp->destroy (); - object *tmp = arch_to_object (archetype::find (arch_string)); + object *tmp = arch_to_object (archetype::find (archname)); tmp->x = op->x; tmp->y = op->y; @@ -2059,13 +2059,8 @@ int find_dir (maptile *m, int x, int y, object *exclude) { - int i, max = SIZEOFFREE, mflags; - - sint16 nx, ny; - object *tmp; - maptile *mp; - - MoveType blocked, move_type; + int max = SIZEOFFREE, mflags; + MoveType move_type; if (exclude && exclude->head_ () != exclude) { @@ -2078,33 +2073,25 @@ move_type = MOVE_ALL; } - for (i = 1; i < max; i++) + for (int i = 1; i < max; i++) { - mp = m; - nx = x + freearr_x[i]; - ny = y + freearr_y[i]; + mapxy pos (m, x, y); + pos.move (i); - mflags = get_map_flags (m, &mp, nx, ny, &nx, &ny); - - if (mflags & P_OUT_OF_MAP) + if (!pos.normalise ()) max = maxfree[i]; else { - mapspace &ms = mp->at (nx, ny); + mapspace &ms = *pos; - blocked = ms.move_block; - - if ((move_type & blocked) == move_type) - max = maxfree[i]; - else if (mflags & P_IS_ALIVE) + if ((move_type & ms.move_block) == move_type) + max = maxfree [i]; + else if (ms.flags () & P_IS_ALIVE) { - for (tmp = ms.bot; tmp; tmp = tmp->above) + for (object *tmp = ms.bot; tmp; tmp = tmp->above) if ((tmp->flag [FLAG_MONSTER] || tmp->is_player ()) && (tmp != exclude || (tmp->head_ () != tmp && tmp->head_ () != exclude))) - break; - - if (tmp) - return freedir[i]; + return freedir [i]; } } } @@ -2189,7 +2176,7 @@ * Moved from spell_util.c to object.c with the other related direction * functions. */ -int reduction_dir[SIZEOFFREE][3] = { +const int reduction_dir[SIZEOFFREE][3] = { {0, 0, 0}, /* 0 */ {0, 0, 0}, /* 1 */ {0, 0, 0}, /* 2 */ @@ -2337,18 +2324,18 @@ return 0; } -const shstr & -object::kv_get (const shstr &key) const +shstr_tmp +object::kv_get (shstr_tmp key) const { for (key_value *kv = key_values; kv; kv = kv->next) if (kv->key == key) return kv->value; - return shstr_null; + return shstr (); } void -object::kv_set (const shstr &key, const shstr &value) +object::kv_set (shstr_tmp key, shstr_tmp value) { for (key_value *kv = key_values; kv; kv = kv->next) if (kv->key == key) @@ -2367,7 +2354,7 @@ } void -object::kv_del (const shstr &key) +object::kv_del (shstr_tmp key) { for (key_value **kvp = &key_values; *kvp; kvp = &(*kvp)->next) if ((*kvp)->key == key) @@ -2508,7 +2495,7 @@ // client needs item update to make it work, client bug requires this to be separate esrv_update_item (UPD_FLAGS, this, old_container); - new_draw_info_format (NDI_UNIQUE, 0, this, "You close %s.", query_name (old_container)); + new_draw_info_format (NDI_UNIQUE, 0, this, "You close %s.", old_container->query_name ()); play_sound (sound_find ("chest_close")); } @@ -2528,7 +2515,7 @@ } #endif - new_draw_info_format (NDI_UNIQUE, 0, this, "You open %s.", query_name (new_container)); + new_draw_info_format (NDI_UNIQUE, 0, this, "You open %s.", new_container->query_name ()); // make sure the container is available, client bug requires this to be separate esrv_send_item (this, new_container); @@ -2546,7 +2533,7 @@ } object * -object::force_find (const shstr name) +object::force_find (shstr_tmp name) { /* cycle through his inventory to look for the MARK we want to * place @@ -2559,7 +2546,7 @@ } object * -object::force_add (const shstr name, int duration) +object::force_add (shstr_tmp name, int duration) { if (object *force = force_find (name)) force->destroy (); @@ -2578,21 +2565,24 @@ } void -object::play_sound (faceidx sound) +object::play_sound (faceidx sound) const { if (!sound) return; - if (flag [FLAG_REMOVED]) - return; - - if (env) - { - if (object *pl = in_player ()) - pl->contr->play_sound (sound); - } - else + if (is_on_map ()) map->play_sound (sound, x, y); + else if (object *pl = in_player ()) + pl->contr->play_sound (sound); +} + +void +object::say_msg (const char *msg) const +{ + if (is_on_map ()) + map->say_msg (msg, x, y); + else if (object *pl = in_player ()) + pl->contr->play_sound (sound); } void