… | |
… | |
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 | */ |
423 | static void |
423 | static void |
424 | check_loaded_object (object *op) |
424 | check_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 | |