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.146 by root, Fri May 11 21:07:13 2007 UTC vs.
Revision 1.155 by root, Thu May 17 21:32:08 2007 UTC

450 owner = owner->owner; 450 owner = owner->owner;
451 451
452 this->owner = owner; 452 this->owner = owner;
453} 453}
454 454
455void 455int
456object::slottype () const
457{
458 if (type == SKILL)
459 {
460 if (IS_COMBAT_SKILL (subtype)) return slot_combat;
461 if (IS_RANGED_SKILL (subtype)) return slot_ranged;
462 }
463 else
464 {
465 if (slot [body_combat].info) return slot_combat;
466 if (slot [body_range ].info) return slot_ranged;
467 }
468
469 return slot_none;
470}
471
472bool
456object::set_weapon (object *ob) 473object::change_weapon (object *ob)
457{ 474{
458 if (current_weapon == ob) 475 if (current_weapon == ob)
459 return; 476 return true;
460
461 new_draw_info_format (NDI_UNIQUE, 0, this, "You switch to your %s.", &ob->name);
462 477
463 if (chosen_skill) 478 if (chosen_skill)
464 chosen_skill->flag [FLAG_APPLIED] = false; 479 chosen_skill->flag [FLAG_APPLIED] = false;
465 480
466 current_weapon = ob; 481 current_weapon = ob;
467 chosen_skill = ob->type == SKILL ? ob : find_skill_by_name (this, ob->skill); 482 chosen_skill = !ob || ob->type == SKILL ? ob : find_skill_by_name (this, ob->skill);
468 483
469 if (chosen_skill) 484 if (chosen_skill)
470 chosen_skill->flag [FLAG_APPLIED] = true; 485 chosen_skill->flag [FLAG_APPLIED] = true;
471 486
472 update_stats (); 487 update_stats ();
488
489 if (ob)
490 {
491 // now check wether any body locations became invalid, in which case
492 // we cannot apply the weapon at the moment.
493 for (int i = 0; i < NUM_BODY_LOCATIONS; ++i)
494 if (slot[i].used < 0)
495 {
496 current_weapon = chosen_skill = 0;
497 update_stats ();
498
499 new_draw_info_format (NDI_UNIQUE, 0, this,
500 "You try to balance your applied items all at once, but the %s is too much. "
501 "You need to unapply some items first.", &ob->name);
502 return false;
503 }
504
505 //new_draw_info_format (NDI_UNIQUE, 0, this, "You switch to your %s.", &ob->name);
506 }
507 else
508 ;//new_draw_info_format (NDI_UNIQUE, 0, this, "You unwield your weapons.");
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
517 return true;
473} 518}
474 519
475/* Zero the key_values on op, decrementing the shared-string 520/* Zero the key_values on op, decrementing the shared-string
476 * refcounts and freeing the links. 521 * refcounts and freeing the links.
477 */ 522 */
1191object * 1236object *
1192insert_ob_in_map (object *op, maptile *m, object *originator, int flag) 1237insert_ob_in_map (object *op, maptile *m, object *originator, int flag)
1193{ 1238{
1194 assert (!op->flag [FLAG_FREED]); 1239 assert (!op->flag [FLAG_FREED]);
1195 1240
1196 object *tmp, *top, *floor = NULL; 1241 object *top, *floor = NULL;
1197 1242
1198 op->remove (); 1243 op->remove ();
1199 1244
1200#if 0 1245#if 0
1201 if (!m->active != !op->active) 1246 if (!m->active != !op->active)
1217#endif 1262#endif
1218 return op; 1263 return op;
1219 } 1264 }
1220 1265
1221 if (object *more = op->more) 1266 if (object *more = op->more)
1222 {
1223 if (!insert_ob_in_map (more, m, originator, flag)) 1267 if (!insert_ob_in_map (more, m, originator, flag))
1224 {
1225 if (!op->head)
1226 LOG (llevError, "BUG: insert_ob_in_map(): inserting op->more killed op\n");
1227
1228 return 0; 1268 return 0;
1229 }
1230 }
1231 1269
1232 CLEAR_FLAG (op, FLAG_REMOVED); 1270 CLEAR_FLAG (op, FLAG_REMOVED);
1233 1271
1234 /* Ideally, the caller figures this out. However, it complicates a lot 1272 /* Ideally, the caller figures this out. However, it complicates a lot
1235 * 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
1242 mapspace &ms = op->ms (); 1280 mapspace &ms = op->ms ();
1243 1281
1244 /* this has to be done after we translate the coordinates. 1282 /* this has to be done after we translate the coordinates.
1245 */ 1283 */
1246 if (op->nrof && !(flag & INS_NO_MERGE)) 1284 if (op->nrof && !(flag & INS_NO_MERGE))
1247 for (tmp = ms.bot; tmp; tmp = tmp->above) 1285 for (object *tmp = ms.bot; tmp; tmp = tmp->above)
1248 if (object::can_merge (op, tmp)) 1286 if (object::can_merge (op, tmp))
1249 { 1287 {
1250 op->nrof += tmp->nrof; 1288 op->nrof += tmp->nrof;
1251 tmp->destroy (); 1289 tmp->destroy ();
1252 } 1290 }
1421 * blocked() and wall() work properly), and these flags are updated by 1459 * blocked() and wall() work properly), and these flags are updated by
1422 * update_object(). 1460 * update_object().
1423 */ 1461 */
1424 1462
1425 /* 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 */
1426 if (!(flag & INS_NO_WALK_ON) && !op->head) 1464 if (!(flag & INS_NO_WALK_ON) && op->head_ () == op)
1427 { 1465 {
1428 if (check_move_on (op, originator)) 1466 if (check_move_on (op, originator))
1429 return 0; 1467 return 0;
1430 1468
1431 /* 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
1432 * walk on's. 1470 * walk on's.
1433 */ 1471 */
1434 for (tmp = op->more; tmp != NULL; tmp = tmp->more) 1472 for (object *tmp = op->more; tmp; tmp = tmp->more)
1435 if (check_move_on (tmp, originator)) 1473 if (check_move_on (tmp, originator))
1436 return 0; 1474 return 0;
1437 } 1475 }
1438 1476
1439 return op; 1477 return op;
1620 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);
1621 free (dump); 1659 free (dump);
1622 return op; 1660 return op;
1623 } 1661 }
1624 1662
1625 if (where->head) 1663 if (where->head_ () != where)
1626 { 1664 {
1627 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");
1628 where = where->head; 1666 where = where->head;
1629 } 1667 }
1630 1668
1631 return where->insert (op); 1669 return where->insert (op);
1632} 1670}
1960 for (object *tmp = op->inv; tmp != NULL; tmp = tmp->below) 1998 for (object *tmp = op->inv; tmp != NULL; tmp = tmp->below)
1961 { 1999 {
1962 CLEAR_FLAG (tmp, flag); 2000 CLEAR_FLAG (tmp, flag);
1963 unflag_inv (tmp, flag); 2001 unflag_inv (tmp, flag);
1964 } 2002 }
1965}
1966
1967/*
1968 * set_cheat(object) sets the cheat flag (WAS_WIZ) in the object and in
1969 * all it's inventory (recursively).
1970 * If checksums are used, a player will get set_cheat called for
1971 * him/her-self and all object carried by a call to this function.
1972 */
1973void
1974set_cheat (object *op)
1975{
1976 SET_FLAG (op, FLAG_WAS_WIZ);
1977 flag_inv (op, FLAG_WAS_WIZ);
1978} 2003}
1979 2004
1980/* 2005/*
1981 * 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
1982 * 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
2100 object *tmp; 2125 object *tmp;
2101 maptile *mp; 2126 maptile *mp;
2102 2127
2103 MoveType blocked, move_type; 2128 MoveType blocked, move_type;
2104 2129
2105 if (exclude && exclude->head) 2130 if (exclude && exclude->head_ () != exclude)
2106 { 2131 {
2107 exclude = exclude->head; 2132 exclude = exclude->head;
2108 move_type = exclude->move_type; 2133 move_type = exclude->move_type;
2109 } 2134 }
2110 else 2135 else
2133 max = maxfree[i]; 2158 max = maxfree[i];
2134 else if (mflags & P_IS_ALIVE) 2159 else if (mflags & P_IS_ALIVE)
2135 { 2160 {
2136 for (tmp = ms.bot; tmp; tmp = tmp->above) 2161 for (tmp = ms.bot; tmp; tmp = tmp->above)
2137 if ((tmp->flag [FLAG_MONSTER] || tmp->type == PLAYER) 2162 if ((tmp->flag [FLAG_MONSTER] || tmp->type == PLAYER)
2138 && (tmp != exclude || (tmp->head && tmp->head != exclude))) 2163 && (tmp != exclude || (tmp->head_ () != tmp && tmp->head_ () != exclude)))
2139 break; 2164 break;
2140 2165
2141 if (tmp) 2166 if (tmp)
2142 return freedir[i]; 2167 return freedir[i];
2143 } 2168 }
2338 * create clone from object to another 2363 * create clone from object to another
2339 */ 2364 */
2340object * 2365object *
2341object_create_clone (object *asrc) 2366object_create_clone (object *asrc)
2342{ 2367{
2343 object *dst = 0, *tmp, *src, *part, *prev, *item; 2368 object *dst = 0, *tmp, *src, *prev, *item;
2344 2369
2345 if (!asrc) 2370 if (!asrc)
2346 return 0; 2371 return 0;
2347 2372
2348 src = asrc;
2349 if (src->head)
2350 src = src->head; 2373 src = asrc->head_ ();
2351 2374
2352 prev = 0; 2375 prev = 0;
2353 for (part = src; part; part = part->more) 2376 for (object *part = src; part; part = part->more)
2354 { 2377 {
2355 tmp = part->clone (); 2378 tmp = part->clone ();
2356 tmp->x -= src->x; 2379 tmp->x -= src->x;
2357 tmp->y -= src->y; 2380 tmp->y -= src->y;
2358 2381

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines