ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/object.C
(Generate patch)

Comparing deliantra/server/common/object.C (file contents):
Revision 1.148 by root, Mon May 14 19:08:25 2007 UTC vs.
Revision 1.155 by root, Thu May 17 21:32:08 2007 UTC

505 //new_draw_info_format (NDI_UNIQUE, 0, this, "You switch to your %s.", &ob->name); 505 //new_draw_info_format (NDI_UNIQUE, 0, this, "You switch to your %s.", &ob->name);
506 } 506 }
507 else 507 else
508 ;//new_draw_info_format (NDI_UNIQUE, 0, this, "You unwield your weapons."); 508 ;//new_draw_info_format (NDI_UNIQUE, 0, this, "You unwield your weapons.");
509 509
510 if (ob && !ob->flag [FLAG_APPLIED] && ob->type != SPELL)
511 {
512 LOG (llevError | logBacktrace, "%s changed to unapplied weapon %s",
513 &name, ob->debug_desc ());
514 return false;
515 }
516
510 return true; 517 return true;
511} 518}
512 519
513/* Zero the key_values on op, decrementing the shared-string 520/* Zero the key_values on op, decrementing the shared-string
514 * refcounts and freeing the links. 521 * refcounts and freeing the links.
1229object * 1236object *
1230insert_ob_in_map (object *op, maptile *m, object *originator, int flag) 1237insert_ob_in_map (object *op, maptile *m, object *originator, int flag)
1231{ 1238{
1232 assert (!op->flag [FLAG_FREED]); 1239 assert (!op->flag [FLAG_FREED]);
1233 1240
1234 object *tmp, *top, *floor = NULL; 1241 object *top, *floor = NULL;
1235 1242
1236 op->remove (); 1243 op->remove ();
1237 1244
1238#if 0 1245#if 0
1239 if (!m->active != !op->active) 1246 if (!m->active != !op->active)
1255#endif 1262#endif
1256 return op; 1263 return op;
1257 } 1264 }
1258 1265
1259 if (object *more = op->more) 1266 if (object *more = op->more)
1260 {
1261 if (!insert_ob_in_map (more, m, originator, flag)) 1267 if (!insert_ob_in_map (more, m, originator, flag))
1262 {
1263 if (!op->head)
1264 LOG (llevError, "BUG: insert_ob_in_map(): inserting op->more killed op\n");
1265
1266 return 0; 1268 return 0;
1267 }
1268 }
1269 1269
1270 CLEAR_FLAG (op, FLAG_REMOVED); 1270 CLEAR_FLAG (op, FLAG_REMOVED);
1271 1271
1272 /* Ideally, the caller figures this out. However, it complicates a lot 1272 /* Ideally, the caller figures this out. However, it complicates a lot
1273 * of areas of callers (eg, anything that uses find_free_spot would now 1273 * of areas of callers (eg, anything that uses find_free_spot would now
1280 mapspace &ms = op->ms (); 1280 mapspace &ms = op->ms ();
1281 1281
1282 /* this has to be done after we translate the coordinates. 1282 /* this has to be done after we translate the coordinates.
1283 */ 1283 */
1284 if (op->nrof && !(flag & INS_NO_MERGE)) 1284 if (op->nrof && !(flag & INS_NO_MERGE))
1285 for (tmp = ms.bot; tmp; tmp = tmp->above) 1285 for (object *tmp = ms.bot; tmp; tmp = tmp->above)
1286 if (object::can_merge (op, tmp)) 1286 if (object::can_merge (op, tmp))
1287 { 1287 {
1288 op->nrof += tmp->nrof; 1288 op->nrof += tmp->nrof;
1289 tmp->destroy (); 1289 tmp->destroy ();
1290 } 1290 }
1459 * blocked() and wall() work properly), and these flags are updated by 1459 * blocked() and wall() work properly), and these flags are updated by
1460 * update_object(). 1460 * update_object().
1461 */ 1461 */
1462 1462
1463 /* if this is not the head or flag has been passed, don't check walk on status */ 1463 /* if this is not the head or flag has been passed, don't check walk on status */
1464 if (!(flag & INS_NO_WALK_ON) && !op->head) 1464 if (!(flag & INS_NO_WALK_ON) && op->head_ () == op)
1465 { 1465 {
1466 if (check_move_on (op, originator)) 1466 if (check_move_on (op, originator))
1467 return 0; 1467 return 0;
1468 1468
1469 /* If we are a multi part object, lets work our way through the check 1469 /* If we are a multi part object, lets work our way through the check
1470 * walk on's. 1470 * walk on's.
1471 */ 1471 */
1472 for (tmp = op->more; tmp != NULL; tmp = tmp->more) 1472 for (object *tmp = op->more; tmp; tmp = tmp->more)
1473 if (check_move_on (tmp, originator)) 1473 if (check_move_on (tmp, originator))
1474 return 0; 1474 return 0;
1475 } 1475 }
1476 1476
1477 return op; 1477 return op;
1658 LOG (llevError, "Trying to put object in NULL.\n%s\n", dump); 1658 LOG (llevError, "Trying to put object in NULL.\n%s\n", dump);
1659 free (dump); 1659 free (dump);
1660 return op; 1660 return op;
1661 } 1661 }
1662 1662
1663 if (where->head) 1663 if (where->head_ () != where)
1664 { 1664 {
1665 LOG (llevDebug, "Warning: Tried to insert object into wrong part of multipart object.\n"); 1665 LOG (llevError | logBacktrace, "Warning: Tried to insert object into wrong part of multipart object.\n");
1666 where = where->head; 1666 where = where->head;
1667 } 1667 }
1668 1668
1669 return where->insert (op); 1669 return where->insert (op);
1670} 1670}
1998 for (object *tmp = op->inv; tmp != NULL; tmp = tmp->below) 1998 for (object *tmp = op->inv; tmp != NULL; tmp = tmp->below)
1999 { 1999 {
2000 CLEAR_FLAG (tmp, flag); 2000 CLEAR_FLAG (tmp, flag);
2001 unflag_inv (tmp, flag); 2001 unflag_inv (tmp, flag);
2002 } 2002 }
2003}
2004
2005/*
2006 * set_cheat(object) sets the cheat flag (WAS_WIZ) in the object and in
2007 * all it's inventory (recursively).
2008 * If checksums are used, a player will get set_cheat called for
2009 * him/her-self and all object carried by a call to this function.
2010 */
2011void
2012set_cheat (object *op)
2013{
2014 SET_FLAG (op, FLAG_WAS_WIZ);
2015 flag_inv (op, FLAG_WAS_WIZ);
2016} 2003}
2017 2004
2018/* 2005/*
2019 * find_free_spot(object, map, x, y, start, stop) will search for 2006 * find_free_spot(object, map, x, y, start, stop) will search for
2020 * a spot at the given map and coordinates which will be able to contain 2007 * a spot at the given map and coordinates which will be able to contain
2138 object *tmp; 2125 object *tmp;
2139 maptile *mp; 2126 maptile *mp;
2140 2127
2141 MoveType blocked, move_type; 2128 MoveType blocked, move_type;
2142 2129
2143 if (exclude && exclude->head) 2130 if (exclude && exclude->head_ () != exclude)
2144 { 2131 {
2145 exclude = exclude->head; 2132 exclude = exclude->head;
2146 move_type = exclude->move_type; 2133 move_type = exclude->move_type;
2147 } 2134 }
2148 else 2135 else
2171 max = maxfree[i]; 2158 max = maxfree[i];
2172 else if (mflags & P_IS_ALIVE) 2159 else if (mflags & P_IS_ALIVE)
2173 { 2160 {
2174 for (tmp = ms.bot; tmp; tmp = tmp->above) 2161 for (tmp = ms.bot; tmp; tmp = tmp->above)
2175 if ((tmp->flag [FLAG_MONSTER] || tmp->type == PLAYER) 2162 if ((tmp->flag [FLAG_MONSTER] || tmp->type == PLAYER)
2176 && (tmp != exclude || (tmp->head && tmp->head != exclude))) 2163 && (tmp != exclude || (tmp->head_ () != tmp && tmp->head_ () != exclude)))
2177 break; 2164 break;
2178 2165
2179 if (tmp) 2166 if (tmp)
2180 return freedir[i]; 2167 return freedir[i];
2181 } 2168 }
2376 * create clone from object to another 2363 * create clone from object to another
2377 */ 2364 */
2378object * 2365object *
2379object_create_clone (object *asrc) 2366object_create_clone (object *asrc)
2380{ 2367{
2381 object *dst = 0, *tmp, *src, *part, *prev, *item; 2368 object *dst = 0, *tmp, *src, *prev, *item;
2382 2369
2383 if (!asrc) 2370 if (!asrc)
2384 return 0; 2371 return 0;
2385 2372
2386 src = asrc;
2387 if (src->head)
2388 src = src->head; 2373 src = asrc->head_ ();
2389 2374
2390 prev = 0; 2375 prev = 0;
2391 for (part = src; part; part = part->more) 2376 for (object *part = src; part; part = part->more)
2392 { 2377 {
2393 tmp = part->clone (); 2378 tmp = part->clone ();
2394 tmp->x -= src->x; 2379 tmp->x -= src->x;
2395 tmp->y -= src->y; 2380 tmp->y -= src->y;
2396 2381

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines