… | |
… | |
219 | /* make sure he's a player -- needed because of class change. */ |
219 | /* make sure he's a player -- needed because of class change. */ |
220 | ob->type = PLAYER; // we are paranoid |
220 | ob->type = PLAYER; // we are paranoid |
221 | ob->race = ob->arch->race; |
221 | ob->race = ob->arch->race; |
222 | |
222 | |
223 | ob->update_weight (); |
223 | ob->update_weight (); |
224 | link_player_skills (ob); |
224 | link_skills (); |
225 | |
225 | |
226 | CLEAR_FLAG (ob, FLAG_NO_FIX_PLAYER); |
226 | CLEAR_FLAG (ob, FLAG_NO_FIX_PLAYER); |
227 | |
227 | |
228 | assign (title, ob->arch->object::name); |
228 | assign (title, ob->arch->object::name); |
229 | |
229 | |
… | |
… | |
366 | attachable::do_destroy (); |
366 | attachable::do_destroy (); |
367 | |
367 | |
368 | if (ob) |
368 | if (ob) |
369 | { |
369 | { |
370 | ob->destroy_inv (false); |
370 | ob->destroy_inv (false); |
371 | ob->destroy (); |
371 | ob->destroy (true); |
372 | } |
372 | } |
373 | |
373 | |
374 | ob = observe = 0; |
374 | ob = observe = 0; |
375 | } |
375 | } |
376 | |
376 | |
… | |
… | |
668 | || op->type == CLOAK || op->type == HELMET |
668 | || op->type == CLOAK || op->type == HELMET |
669 | || op->type == SHIELD || op->type == GLOVES |
669 | || op->type == SHIELD || op->type == GLOVES |
670 | || op->type == BRACERS || op->type == GIRDLE)) |
670 | || op->type == BRACERS || op->type == GIRDLE)) |
671 | || (!QUERY_FLAG (pl, FLAG_USE_WEAPON) && op->type == WEAPON)) |
671 | || (!QUERY_FLAG (pl, FLAG_USE_WEAPON) && op->type == WEAPON)) |
672 | { |
672 | { |
673 | op->destroy (); |
673 | op->destroy (true); |
674 | continue; |
674 | continue; |
675 | } |
675 | } |
676 | } |
676 | } |
677 | |
677 | |
678 | /* This really needs to be better - we should really give |
678 | /* This really needs to be better - we should really give |
… | |
… | |
689 | if (tmp->type == op->type && tmp->name == op->name) |
689 | if (tmp->type == op->type && tmp->name == op->name) |
690 | break; |
690 | break; |
691 | |
691 | |
692 | if (tmp) |
692 | if (tmp) |
693 | { |
693 | { |
694 | op->destroy (); |
694 | op->destroy (true); |
695 | LOG (llevError, "give_initial_items: Removing duplicate object %s\n", &tmp->name); |
695 | LOG (llevError, "give_initial_items: Removing duplicate object %s\n", &tmp->name); |
696 | continue; |
696 | continue; |
697 | } |
697 | } |
698 | |
698 | |
699 | if (op->nrof > 1) |
699 | if (op->nrof > 1) |
… | |
… | |
714 | CLEAR_FLAG (op, FLAG_DAMNED); |
714 | CLEAR_FLAG (op, FLAG_DAMNED); |
715 | } |
715 | } |
716 | |
716 | |
717 | if (op->type == SPELL) |
717 | if (op->type == SPELL) |
718 | { |
718 | { |
719 | op->destroy (); |
719 | op->destroy (true); |
720 | continue; |
720 | continue; |
721 | } |
721 | } |
722 | else if (op->type == SKILL) |
722 | else if (op->type == SKILL) |
723 | { |
723 | { |
724 | SET_FLAG (op, FLAG_CAN_USE_SKILL); |
724 | SET_FLAG (op, FLAG_CAN_USE_SKILL); |
… | |
… | |
728 | else /* lock all 'normal items by default */ |
728 | else /* lock all 'normal items by default */ |
729 | SET_FLAG (op, FLAG_INV_LOCKED); |
729 | SET_FLAG (op, FLAG_INV_LOCKED); |
730 | } /* for loop of objects in player inv */ |
730 | } /* for loop of objects in player inv */ |
731 | |
731 | |
732 | /* Need to set up the skill pointers */ |
732 | /* Need to set up the skill pointers */ |
733 | link_player_skills (pl); |
733 | pl->contr->link_skills (); |
734 | } |
734 | } |
735 | |
735 | |
736 | void |
736 | void |
737 | get_party_password (object *op, partylist *party) |
737 | get_party_password (object *op, partylist *party) |
738 | { |
738 | { |
… | |
… | |
870 | ob->msg = 0; |
870 | ob->msg = 0; |
871 | |
871 | |
872 | start_info (ob); |
872 | start_info (ob); |
873 | CLEAR_FLAG (ob, FLAG_WIZ); |
873 | CLEAR_FLAG (ob, FLAG_WIZ); |
874 | give_initial_items (ob, ob->randomitems); |
874 | give_initial_items (ob, ob->randomitems); |
875 | link_player_skills (ob); |
|
|
876 | esrv_send_inventory (ob, ob); |
875 | esrv_send_inventory (ob, ob); |
877 | ob->update_stats (); |
876 | ob->update_stats (); |
878 | |
877 | |
879 | /* This moves the player to a different start map, if there |
878 | /* This moves the player to a different start map, if there |
880 | * is one for this race |
879 | * is one for this race |
… | |
… | |
1579 | } |
1578 | } |
1580 | |
1579 | |
1581 | /* this should not happen, but sometimes does */ |
1580 | /* this should not happen, but sometimes does */ |
1582 | if (arrow->nrof == 0) |
1581 | if (arrow->nrof == 0) |
1583 | { |
1582 | { |
|
|
1583 | LOG (llevError | logBacktrace, "arrow (%s) has nrof 0\n", arrow->debug_desc ()); |
1584 | arrow->destroy (); |
1584 | arrow->destroy (true); |
1585 | return 0; |
1585 | return 0; |
1586 | } |
1586 | } |
1587 | |
1587 | |
1588 | left = arrow; /* these are arrows left to the player */ |
1588 | left = arrow; /* these are arrows left to the player */ |
1589 | arrow = arrow->split (); |
1589 | arrow = arrow->split (); |
… | |
… | |
2253 | if (QUERY_FLAG (tmp, FLAG_APPLIED) && QUERY_FLAG (tmp, FLAG_LIFESAVE)) |
2253 | if (QUERY_FLAG (tmp, FLAG_APPLIED) && QUERY_FLAG (tmp, FLAG_LIFESAVE)) |
2254 | { |
2254 | { |
2255 | op->play_sound (sound_find ("ob_evaporate")); |
2255 | op->play_sound (sound_find ("ob_evaporate")); |
2256 | new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s vibrates violently, then evaporates.", query_name (tmp)); |
2256 | new_draw_info_format (NDI_UNIQUE, 0, op, "Your %s vibrates violently, then evaporates.", query_name (tmp)); |
2257 | |
2257 | |
2258 | tmp->destroy (); |
2258 | tmp->destroy (true); |
2259 | CLEAR_FLAG (op, FLAG_LIFESAVE); |
2259 | CLEAR_FLAG (op, FLAG_LIFESAVE); |
2260 | |
2260 | |
2261 | if (op->stats.hp < 0) |
2261 | if (op->stats.hp < 0) |
2262 | op->stats.hp = op->stats.maxhp; |
2262 | op->stats.hp = op->stats.maxhp; |
2263 | |
2263 | |
… | |
… | |
2312 | const char * |
2312 | const char * |
2313 | gravestone_text (object *op) |
2313 | gravestone_text (object *op) |
2314 | { |
2314 | { |
2315 | static dynbuf_text buf; |
2315 | static dynbuf_text buf; |
2316 | |
2316 | |
2317 | buf << "---- R.I.P. ----\n\n"; |
2317 | buf << "---- R.I.P. ----\n\n" |
2318 | op->name; |
2318 | << op->name; |
2319 | |
2319 | |
2320 | if (op->type == PLAYER) |
2320 | if (op->type == PLAYER) |
2321 | buf << " the " << op->contr->title; |
2321 | buf << " the " << op->contr->title; |
2322 | |
2322 | |
2323 | buf << "\n\n"; |
2323 | buf << "\n\n"; |
… | |
… | |
2569 | op->stats.food = 0; |
2569 | op->stats.food = 0; |
2570 | |
2570 | |
2571 | if (op->stats.hp < 0) |
2571 | if (op->stats.hp < 0) |
2572 | { |
2572 | { |
2573 | op->contr->killer = archetype::get ("killer_starvation"); |
2573 | op->contr->killer = archetype::get ("killer_starvation"); |
2574 | op->contr->killer->destroy (); |
2574 | op->contr->killer->destroy (true); |
2575 | } |
2575 | } |
2576 | } |
2576 | } |
2577 | |
2577 | |
2578 | /* killer should be set here already */ |
2578 | /* killer should be set here already */ |
2579 | if (op->stats.hp < 0 && !QUERY_FLAG (op, FLAG_WIZ)) |
2579 | if (op->stats.hp < 0 && !QUERY_FLAG (op, FLAG_WIZ)) |
… | |
… | |
2610 | |
2610 | |
2611 | /* restore player */ |
2611 | /* restore player */ |
2612 | at = archetype::find ("poisoning"); |
2612 | at = archetype::find ("poisoning"); |
2613 | if (object *tmp = present_arch_in_ob (at, op)) |
2613 | if (object *tmp = present_arch_in_ob (at, op)) |
2614 | { |
2614 | { |
2615 | tmp->destroy (); |
2615 | tmp->destroy (true); |
2616 | new_draw_info (NDI_UNIQUE, 0, op, "Your body feels cleansed"); |
2616 | new_draw_info (NDI_UNIQUE, 0, op, "Your body feels cleansed"); |
2617 | } |
2617 | } |
2618 | |
2618 | |
2619 | at = archetype::find ("confusion"); |
2619 | at = archetype::find ("confusion"); |
2620 | if (object *tmp = present_arch_in_ob (at, op)) |
2620 | if (object *tmp = present_arch_in_ob (at, op)) |
2621 | { |
2621 | { |
2622 | tmp->destroy (); |
2622 | tmp->destroy (true); |
2623 | new_draw_info (NDI_UNIQUE, 0, tmp, "Your mind feels clearer"); |
2623 | new_draw_info (NDI_UNIQUE, 0, tmp, "Your mind feels clearer"); |
2624 | } |
2624 | } |
2625 | |
2625 | |
2626 | cure_disease (op, 0, 0); /* remove any disease */ |
2626 | cure_disease (op, 0, 0); /* remove any disease */ |
2627 | op->stats.hp = op->stats.maxhp; |
2627 | op->stats.hp = op->stats.maxhp; |
… | |
… | |
2792 | * exp loss on the stone. |
2792 | * exp loss on the stone. |
2793 | */ |
2793 | */ |
2794 | tmp = arch_to_object (archetype::find ("gravestone")); |
2794 | tmp = arch_to_object (archetype::find ("gravestone")); |
2795 | tmp->name = format ("%s's gravestone", &op->name); |
2795 | tmp->name = format ("%s's gravestone", &op->name); |
2796 | tmp->name_pl = format ("%s's gravestones", &op->name); |
2796 | tmp->name_pl = format ("%s's gravestones", &op->name); |
2797 | tmp->msg = format ("RIP\nHere rests the hero %s the %s,\nwho was killed\nby %s.\n", &op->name, op->contr->title, op->contr->killer_name ()); |
2797 | tmp->msg = format ("T<RIP>\n\nHere rests the hero %s the %s,\rwho was killed\rby %s.\n", |
|
|
2798 | &op->name, op->contr->title, op->contr->killer_name ()); |
2798 | tmp->x = op->x, tmp->y = op->y; |
2799 | tmp->x = op->x, tmp->y = op->y; |
2799 | insert_ob_in_map (tmp, op->map, NULL, 0); |
2800 | insert_ob_in_map (tmp, op->map, NULL, 0); |
2800 | |
2801 | |
2801 | /**************************************/ |
2802 | /**************************************/ |
2802 | /* */ |
2803 | /* */ |
… | |
… | |
2811 | at = archetype::find ("poisoning"); |
2812 | at = archetype::find ("poisoning"); |
2812 | tmp = present_arch_in_ob (at, op); |
2813 | tmp = present_arch_in_ob (at, op); |
2813 | |
2814 | |
2814 | if (tmp) |
2815 | if (tmp) |
2815 | { |
2816 | { |
2816 | tmp->destroy (); |
2817 | tmp->destroy (true); |
2817 | new_draw_info (NDI_UNIQUE, 0, op, "Your body feels cleansed"); |
2818 | new_draw_info (NDI_UNIQUE, 0, op, "Your body feels cleansed"); |
2818 | } |
2819 | } |
2819 | |
2820 | |
2820 | at = archetype::find ("confusion"); |
2821 | at = archetype::find ("confusion"); |
2821 | tmp = present_arch_in_ob (at, op); |
2822 | tmp = present_arch_in_ob (at, op); |
2822 | if (tmp) |
2823 | if (tmp) |
2823 | { |
2824 | { |
2824 | tmp->destroy (); |
2825 | tmp->destroy (true); |
2825 | new_draw_info (NDI_UNIQUE, 0, tmp, "Your mind feels clearer"); |
2826 | new_draw_info (NDI_UNIQUE, 0, tmp, "Your mind feels clearer"); |
2826 | } |
2827 | } |
2827 | |
2828 | |
2828 | cure_disease (op, 0, 0); /* remove any disease */ |
2829 | cure_disease (op, 0, 0); /* remove any disease */ |
2829 | |
2830 | |
… | |
… | |
2832 | for (object *item = op->inv; item; ) |
2833 | for (object *item = op->inv; item; ) |
2833 | { |
2834 | { |
2834 | object *next = item->below; |
2835 | object *next = item->below; |
2835 | |
2836 | |
2836 | if (item->type == SPELL_EFFECT && item->active) |
2837 | if (item->type == SPELL_EFFECT && item->active) |
2837 | item->destroy (); |
2838 | item->destroy (true); |
2838 | |
2839 | |
2839 | item = next; |
2840 | item = next; |
2840 | } |
2841 | } |
2841 | |
2842 | |
2842 | /*add_exp(op, (op->stats.exp * -0.20)); */ |
2843 | /*add_exp(op, (op->stats.exp * -0.20)); */ |
… | |
… | |
2890 | if (will_kill_again & (1 << at)) |
2891 | if (will_kill_again & (1 << at)) |
2891 | force->resist[at] = 100; |
2892 | force->resist[at] = 100; |
2892 | |
2893 | |
2893 | insert_ob_in_ob (force, op); |
2894 | insert_ob_in_ob (force, op); |
2894 | op->update_stats (); |
2895 | op->update_stats (); |
2895 | |
|
|
2896 | } |
2896 | } |
2897 | |
2897 | |
2898 | new_draw_info (NDI_UNIQUE, 0, op, "YOU HAVE DIED."); |
2898 | new_draw_info (NDI_UNIQUE, 0, op, "YOU HAVE DIED."); |
2899 | } |
2899 | } |
2900 | |
2900 | |
… | |
… | |
2924 | { |
2924 | { |
2925 | tmp->decrease (rndm (1, tmp->nrof - 1)); |
2925 | tmp->decrease (rndm (1, tmp->nrof - 1)); |
2926 | insert_ob_in_map (tmp, op->map, NULL, 0); |
2926 | insert_ob_in_map (tmp, op->map, NULL, 0); |
2927 | } |
2927 | } |
2928 | else |
2928 | else |
2929 | tmp->destroy (); |
2929 | tmp->destroy (true); |
2930 | } |
2930 | } |
2931 | else |
2931 | else |
2932 | insert_ob_in_map (tmp, op->map, NULL, 0); |
2932 | insert_ob_in_map (tmp, op->map, NULL, 0); |
2933 | } |
2933 | } |
2934 | } |
2934 | } |
… | |
… | |
2995 | if (op->type == PLAYER) |
2995 | if (op->type == PLAYER) |
2996 | new_draw_info_format (NDI_UNIQUE, 0, op, "You cast %s.", &spob->name); |
2996 | new_draw_info_format (NDI_UNIQUE, 0, op, "You cast %s.", &spob->name); |
2997 | |
2997 | |
2998 | cast_spell (op, throw_ob, dir, spob, NULL); |
2998 | cast_spell (op, throw_ob, dir, spob, NULL); |
2999 | |
2999 | |
3000 | throw_ob->destroy (); |
3000 | throw_ob->destroy (true); |
3001 | } |
3001 | } |
3002 | |
3002 | |
3003 | void |
3003 | void |
3004 | make_visible (object *op) |
3004 | make_visible (object *op) |
3005 | { |
3005 | { |