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

Comparing deliantra/server/common/loader.C (file contents):
Revision 1.56 by root, Fri Feb 9 01:52:10 2007 UTC vs.
Revision 1.57 by root, Sat Feb 10 01:52:25 2007 UTC

421 * to check for objects to make sure there are no common errors. 421 * to check for objects to make sure there are no common errors.
422 */ 422 */
423static void 423static void
424check_loaded_object (object *op) 424check_loaded_object (object *op)
425{ 425{
426 int ip;
427
428 /* We do some specialised handling to handle legacy cases of name_pl. 426 /* We do some specialised handling to handle legacy cases of name_pl.
429 * If the object doesn't have a name_pl, we just use the object name - 427 * If the object doesn't have a name_pl, we just use the object name -
430 * this isn't perfect (things won't be properly pluralised), but works to 428 * this isn't perfect (things won't be properly pluralised), but works to
431 * that degree (5 heart is still quite understandable). But the case we 429 * that degree (5 heart is still quite understandable). But the case we
432 * also have to catch is if this object is not using the normal name for 430 * also have to catch is if this object is not using the normal name for
433 * the object. In that case, we also want to use the loaded name. 431 * the object. In that case, we also want to use the loaded name.
434 * Otherwise, what happens is that the the plural name will lose 432 * Otherwise, what happens is that the the plural name will lose
435 * information (appear as just 'hearts' and not 'goblins heart') 433 * information (appear as just 'hearts' and not 'goblins heart')
436 */ 434 */
437 if (op->arch && op->name != op->arch->clone.name && op->name_pl == op->arch->clone.name_pl) 435 if (op->arch && op->name != op->arch->clone.name && op->name_pl == op->arch->clone.name_pl)
438 op->name_pl = NULL; 436 op->name_pl = 0;
439 437
440 if (!op->name_pl) 438 if (!op->name_pl)
441 op->name_pl = op->name; 439 op->name_pl = op->name;
442 440
443 /* objects now have a materialname. try to patch it in */ 441 /* objects now have a materialname. try to patch it in */
446 if (op->map != NULL) 444 if (op->map != NULL)
447 set_materialname (op, op->map->difficulty, NULL); 445 set_materialname (op, op->map->difficulty, NULL);
448 else 446 else
449 set_materialname (op, 5, NULL); 447 set_materialname (op, 5, NULL);
450 } 448 }
449
451 /* only do these when program is first run - a bit 450 /* only do these when program is first run - a bit
452 * excessive to do this at every run - most of this is 451 * excessive to do this at every run - most of this is
453 * really just to catch any errors - program will still run, but 452 * really just to catch any errors - program will still run, but
454 * not in the ideal fashion. 453 * not in the ideal fashion.
455 */ 454 */
456 if ((op->type == WEAPON || op->type == BOW) && arch_init) 455 if ((op->type == WEAPON || op->type == BOW) && arch_init)
457 { 456 {
458 if (!op->skill) 457 if (!op->skill)
459 {
460 LOG (llevError, "Weapon %s lacks a skill.\n", op->debug_desc ()); 458 LOG (llevError, "Weapon %s lacks a skill.\n", op->debug_desc ());
461 }
462 else if ((!strcmp (op->skill, "one handed weapons") && op->body_info[1] != -1) || 459 else if ((!strcmp (op->skill, "one handed weapons") && op->body_info[1] != -1) ||
463 (!strcmp (op->skill, "two handed weapons") && op->body_info[1] != -2)) 460 (!strcmp (op->skill, "two handed weapons") && op->body_info[1] != -2))
464 {
465 LOG (llevError, "weapon %s arm usage does not match skill: %d, %s\n", op->debug_desc (), op->body_info[1], &op->skill); 461 LOG (llevError, "weapon %s arm usage does not match skill: %d, %s\n", op->debug_desc (), op->body_info[1], &op->skill);
466 }
467 } 462 }
468 463
469 /* We changed last_heal to gen_sp_armour, which is what it 464 /* We changed last_heal to gen_sp_armour, which is what it
470 * really does for many objects. Need to catch any in maps 465 * really does for many objects. Need to catch any in maps
471 * that may have an old value. 466 * that may have an old value.
472 */ 467 */
473 if ((op->type == WEAPON) || 468 if (op->type == WEAPON
474 (op->type == ARMOUR) || (op->type == HELMET) || 469 || op->type == ARMOUR || op->type == HELMET
475 (op->type == SHIELD) || (op->type == RING) || 470 || op->type == SHIELD || op->type == RING
476 (op->type == BOOTS) || (op->type == GLOVES) || 471 || op->type == BOOTS || op->type == GLOVES
477 (op->type == AMULET) || (op->type == GIRDLE) || (op->type == BRACERS) || (op->type == CLOAK)) 472 || op->type == AMULET || op->type == GIRDLE
473 || op->type == BRACERS || op->type == CLOAK)
478 { 474 {
479 if (op->last_heal) 475 if (op->last_heal)
480 { 476 {
481 LOG (llevDebug, "Object %s still has last_heal set, not gen_sp_armour\n", op->debug_desc ()); 477 LOG (llevDebug, "Object %s still has last_heal set, not gen_sp_armour\n", op->debug_desc ());
482 op->gen_sp_armour = op->last_heal; 478 op->gen_sp_armour = op->last_heal;
483 op->last_heal = 0; 479 op->last_heal = 0;
484 } 480 }
485 481
486 ip = calc_item_power (op, 0); 482 int ip = calc_item_power (op, 0);
483
487 /* Legacy objects from before item power was in the game */ 484 /* Legacy objects from before item power was in the game */
488 if (!op->item_power && ip) 485 if (!op->item_power && ip)
489 { 486 {
490 if (ip > 3) 487 if (ip > 3)
491 {
492 LOG (llevDebug, "Object %s had no item power, using %d\n", op->debug_desc (), ip); 488 LOG (llevDebug, "Object %s had no item power, using %d\n", op->debug_desc (), ip);
493 } 489
494 op->item_power = ip; 490 op->item_power = ip;
495 } 491 }
492
496 /* Check for possibly bogus values. Has to meet both these criteria - 493 /* Check for possibly bogus values. Has to meet both these criteria -
497 * something that has item_power 1 is probably just fine if our calculated 494 * something that has item_power 1 is probably just fine if our calculated
498 * value is 1 or 2 - these values are small enough that hard to be precise. 495 * value is 1 or 2 - these values are small enough that hard to be precise.
499 * similarly, it item_power is 0, the first check will always pass, 496 * similarly, it item_power is 0, the first check will always pass,
500 * but not the second one. 497 * but not the second one.
501 */ 498 */
502 if (ip > 2 * op->item_power && ip > (op->item_power + 3)) 499 if (ip > 2 * op->item_power && ip > (op->item_power + 3))
503 {
504 LOG (llevDebug, "Object %s seems to have too low item power? %d > %d\n", op->debug_desc (), ip, op->item_power); 500 LOG (llevDebug, "Object %s seems to have too low item power? %d > %d\n", op->debug_desc (), ip, op->item_power);
505 }
506
507 } 501 }
502
508 /* Old spellcasting object - need to load in the appropiate object */ 503 /* Old spellcasting object - need to load in the appropiate object */
509 if ((op->type == ROD || op->type == WAND || op->type == SCROLL || op->type == HORN || op->type == FIREWALL || 504 if ((op->type == ROD || op->type == WAND || op->type == SCROLL || op->type == HORN || op->type == FIREWALL ||
510 /* POTIONS and ALTARS don't always cast spells, but if they do, update them */ 505 /* POTIONS and ALTARS don't always cast spells, but if they do, update them */
511 ((op->type == POTION || op->type == ALTAR) && op->stats.sp)) && !op->inv && !arch_init) 506 ((op->type == POTION || op->type == ALTAR) && op->stats.sp)) && !op->inv && !arch_init)
512 { 507 {
513 object *tmp;
514
515 /* Fireall is bizarre in that spell type was stored in dam. Rest are 'normal' 508 /* Fireall is bizarre in that spell type was stored in dam. Rest are 'normal'
516 * in that spell was stored in sp. 509 * in that spell was stored in sp.
517 */ 510 */
518 tmp = get_archetype (spell_mapping[op->type == FIREWALL ? op->stats.dam : op->stats.sp]); 511 object *tmp = get_archetype (spell_mapping[op->type == FIREWALL ? op->stats.dam : op->stats.sp]);
519 insert_ob_in_ob (tmp, op); 512 insert_ob_in_ob (tmp, op);
520 op->randomitems = NULL; /* So another spell isn't created for this object */ 513 op->randomitems = NULL; /* So another spell isn't created for this object */
521 } 514 }
515
522 /* spellbooks & runes use slaying. But not to arch name, but to spell name */ 516 /* spellbooks & runes use slaying. But not to arch name, but to spell name */
523
524 if ((op->type == SPELLBOOK || op->type == RUNE) && op->slaying && !op->inv && !arch_init) 517 if ((op->type == SPELLBOOK || op->type == RUNE) && op->slaying && !op->inv && !arch_init)
525 { 518 {
526 object *tmp;
527
528 tmp = get_archetype_by_object_name (op->slaying); 519 object *tmp = get_archetype_by_object_name (op->slaying);
529 insert_ob_in_ob (tmp, op); 520 insert_ob_in_ob (tmp, op);
530 op->randomitems = NULL; /* So another spell isn't created for this object */ 521 op->randomitems = NULL; /* So another spell isn't created for this object */
531 /* without this, value is all screwed up */ 522 /* without this, value is all screwed up */
532 op->value = op->arch->clone.value * op->inv->value; 523 op->value = op->arch->clone.value * op->inv->value;
533 } 524 }
569 { 560 {
570 op->move_type = MOVE_ALL; 561 op->move_type = MOVE_ALL;
571 op->stats.maxhp = 0; 562 op->stats.maxhp = 0;
572 } 563 }
573 else 564 else
574 {
575 op->move_type = MOVE_WALK; 565 op->move_type = MOVE_WALK;
576 }
577 } 566 }
578 } 567 }
579 568
580} 569}
581 570

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines