--- deliantra/server/common/object.C 2008/12/31 18:07:41 1.276 +++ deliantra/server/common/object.C 2009/10/03 22:36:08 1.288 @@ -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 * @@ -330,7 +330,7 @@ return env; // else a player could have our env open - object *envest = env->outer_env (); + object *envest = env->outer_env_or_self (); // the player itself is always on a map, so we will find him here // even if our inv is in a player. @@ -557,7 +557,8 @@ new_draw_info_format (NDI_UNIQUE, 0, this, "You try to balance all your items at once, " "but the %s is just too much for your body. " - "[You need to unapply some items first.]", &ob->name); + "[You need to unapply some items first - use the 'body' command to see " + "how many items you cna wera on a specific body part.]", &ob->name); return false; } @@ -794,7 +795,7 @@ { SET_FLAG (this, FLAG_REMOVED); - expmul = 1.0; + //expmul = 1.0; declared const for the time being face = blank_face; } @@ -833,11 +834,13 @@ if (active) return; - if (has_active_speed () && flag [FLAG_FREED]) LOG (llevError | logBacktrace, "BUG: tried to activate freed object %s\n", debug_desc ());//D - if (has_active_speed () && flag [FLAG_DEBUG]) LOG (llevError | logBacktrace, "BUG: tried to activate DEBUG object %s\n", debug_desc ());//D temp - if (has_active_speed ()) - actives.insert (this); + { + if (flag [FLAG_FREED]) + LOG (llevError | logBacktrace, "BUG: tried to activate freed object %s\n", debug_desc ());//D + + actives.insert (this); + } } void @@ -965,7 +968,7 @@ object::do_destroy () { if (flag [FLAG_IS_LINKED]) - remove_button_link (this); + remove_link (); if (flag [FLAG_FRIENDLY]) remove_friendly_object (this); @@ -1299,9 +1302,10 @@ if (!insert_ob_in_map (more, m, originator, flag)) return 0; - CLEAR_FLAG (op, FLAG_REMOVED); - + op->flag [FLAG_REMOVED] = false; + op->env = 0; op->map = newmap; + mapspace &ms = op->ms (); /* this has to be done after we translate the coordinates. @@ -1332,8 +1336,11 @@ } if (!originator->is_on_map ()) - LOG (llevDebug | logBacktrace, "insert_ob_in_map(%s) called with INS_BELOW_ORIGINATOR when originator '%s' not on map", - op->debug_desc (), originator->debug_desc ()); + { + LOG (llevError, "insert_ob_in_map(%s) called with INS_BELOW_ORIGINATOR when originator '%s' not on map", + op->debug_desc (), originator->debug_desc ()); + abort (); + } op->above = originator; op->below = originator->below; @@ -1475,7 +1482,7 @@ */ /* if this is not the head or flag has been passed, don't check walk on status */ - if (!(flag & INS_NO_WALK_ON) && op->head_ () == op) + if (!(flag & INS_NO_WALK_ON) && op->is_head ()) { if (check_move_on (op, originator)) return 0; @@ -1496,15 +1503,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; @@ -1700,18 +1707,20 @@ int check_move_on (object *op, object *originator) { + if (QUERY_FLAG (op, FLAG_NO_APPLY)) + return 0; + object *tmp; maptile *m = op->map; int x = op->x, y = op->y; - MoveType move_on, move_slow, move_block; + mapspace &ms = m->at (x, y); - if (QUERY_FLAG (op, FLAG_NO_APPLY)) - return 0; + ms.update (); - move_on = GET_MAP_MOVE_ON (op->map, op->x, op->y); - move_slow = GET_MAP_MOVE_SLOW (op->map, op->x, op->y); - move_block = GET_MAP_MOVE_BLOCK (op->map, op->x, op->y); + MoveType move_on = ms.move_on; + MoveType move_slow = ms.move_slow; + MoveType move_block = ms.move_block; /* if nothing on this space will slow op down or be applied, * no need to do checking below. have to make sure move_type @@ -1732,19 +1741,10 @@ /* The objects have to be checked from top to bottom. * Hence, we first go to the top: */ - - for (tmp = op->ms ().bot; tmp && tmp->above; tmp = tmp->above) + for (object *next, *tmp = ms.top; tmp; tmp = next) { - /* Trim the search when we find the first other spell effect - * this helps performance so that if a space has 50 spell objects, - * we don't need to check all of them. - */ - if ((tmp->move_type & MOVE_FLY_LOW) && QUERY_FLAG (tmp, FLAG_NO_PICK)) - break; - } + next = tmp->below; - for (; tmp; tmp = tmp->below) - { if (tmp == op) continue; /* Can't apply yourself */ @@ -1759,13 +1759,11 @@ if ((!op->move_type && tmp->move_slow & MOVE_WALK) || ((op->move_type & tmp->move_slow) && (op->move_type & ~tmp->move_slow & ~tmp->move_block) == 0)) { - - float - diff = tmp->move_slow_penalty * fabs (op->speed); + float diff = tmp->move_slow_penalty * fabs (op->speed); if (op->is_player ()) - if ((QUERY_FLAG (tmp, FLAG_IS_HILLY) && find_skill_by_number (op, SK_CLIMBING)) || - (QUERY_FLAG (tmp, FLAG_IS_WOODED) && find_skill_by_number (op, SK_WOODSMAN))) + if ((tmp->flag [FLAG_IS_HILLY ] && find_skill_by_number (op, SK_CLIMBING)) || + (tmp->flag [FLAG_IS_WOODED] && find_skill_by_number (op, SK_WOODSMAN))) diff /= 4.0; op->speed_left -= diff; @@ -2176,7 +2174,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 */ @@ -2495,7 +2493,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")); } @@ -2515,7 +2513,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); @@ -2565,21 +2563,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