… | |
… | |
2615 | { |
2615 | { |
2616 | if (INVOKE_OBJECT (BE_UNREADY, op, ARG_OBJECT (who), ARG_INT (aflags)) |
2616 | if (INVOKE_OBJECT (BE_UNREADY, op, ARG_OBJECT (who), ARG_INT (aflags)) |
2617 | || INVOKE_OBJECT (UNREADY, who, ARG_OBJECT (op), ARG_INT (aflags))) |
2617 | || INVOKE_OBJECT (UNREADY, who, ARG_OBJECT (op), ARG_INT (aflags))) |
2618 | return RESULT_INT (0); |
2618 | return RESULT_INT (0); |
2619 | |
2619 | |
2620 | object *tmp2; |
|
|
2621 | |
|
|
2622 | CLEAR_FLAG (op, FLAG_APPLIED); |
2620 | CLEAR_FLAG (op, FLAG_APPLIED); |
2623 | |
2621 | |
2624 | if (player *pl = who->contr) |
2622 | if (player *pl = who->contr) |
2625 | { |
2623 | { |
2626 | if (op == pl->ranged_ob) pl->ranged_ob = 0; |
2624 | if (op == pl->ranged_ob) pl->ranged_ob = 0; |
2627 | if (op == pl->combat_ob) pl->combat_ob = 0; |
2625 | if (op == pl->combat_ob) pl->combat_ob = 0; |
|
|
2626 | |
|
|
2627 | if (op == who->current_weapon) |
|
|
2628 | who->change_weapon (pl->combat_ob ? pl->combat_ob : pl->ranged_ob); |
2628 | } |
2629 | } |
|
|
2630 | else if (op == who->current_weapon) |
|
|
2631 | who->change_weapon (0); |
2629 | |
2632 | |
2630 | switch (op->type) |
2633 | switch (op->type) |
2631 | { |
2634 | { |
2632 | case SKILL_TOOL: |
2635 | case SKILL_TOOL: |
2633 | // unapplying a skill tool should also unapply the skill it governs |
2636 | // unapplying a skill tool should also unapply the skill it governs |
… | |
… | |
2646 | case WEAPON: |
2649 | case WEAPON: |
2647 | new_draw_info_format (NDI_UNIQUE, 0, who, "You unwield %s.", query_name (op)); |
2650 | new_draw_info_format (NDI_UNIQUE, 0, who, "You unwield %s.", query_name (op)); |
2648 | |
2651 | |
2649 | change_abil (who, op); |
2652 | change_abil (who, op); |
2650 | CLEAR_FLAG (who, FLAG_READY_WEAPON); |
2653 | CLEAR_FLAG (who, FLAG_READY_WEAPON); |
2651 | clear_skill (who); |
|
|
2652 | break; |
2654 | break; |
2653 | |
2655 | |
2654 | case SKILL: |
2656 | case SKILL: |
2655 | if (op != who->chosen_skill) |
|
|
2656 | LOG (llevError, "BUG: apply_special(): applied skill is not a chosen skill\n"); |
|
|
2657 | |
|
|
2658 | if (who->contr) |
2657 | if (who->contr) |
2659 | { |
2658 | { |
2660 | if (!op->invisible) |
2659 | if (!op->invisible) |
2661 | new_draw_info_format (NDI_UNIQUE, 0, who, "You stop using the %s.", query_name (op)); |
2660 | new_draw_info_format (NDI_UNIQUE, 0, who, "You stop using the %s.", query_name (op)); |
2662 | else |
2661 | else |
2663 | new_draw_info_format (NDI_UNIQUE, 0, who, "You can no longer use the skill: %s.", &op->skill); |
2662 | new_draw_info_format (NDI_UNIQUE, 0, who, "You can no longer use the skill: %s.", &op->skill); |
2664 | } |
2663 | } |
2665 | |
2664 | |
2666 | change_abil (who, op); |
2665 | change_abil (who, op); |
2667 | who->chosen_skill = 0; |
|
|
2668 | CLEAR_FLAG (who, FLAG_READY_SKILL); |
2666 | CLEAR_FLAG (who, FLAG_READY_SKILL); |
2669 | break; |
2667 | break; |
2670 | |
2668 | |
2671 | case ARMOUR: |
2669 | case ARMOUR: |
2672 | case HELMET: |
2670 | case HELMET: |
… | |
… | |
2681 | new_draw_info_format (NDI_UNIQUE, 0, who, "You unwear %s.", query_name (op)); |
2679 | new_draw_info_format (NDI_UNIQUE, 0, who, "You unwear %s.", query_name (op)); |
2682 | change_abil (who, op); |
2680 | change_abil (who, op); |
2683 | break; |
2681 | break; |
2684 | |
2682 | |
2685 | case LAMP: |
2683 | case LAMP: |
|
|
2684 | { |
2686 | new_draw_info_format (NDI_UNIQUE, 0, who, "You turn off your %s.", &op->name); |
2685 | new_draw_info_format (NDI_UNIQUE, 0, who, "You turn off your %s.", &op->name); |
|
|
2686 | |
2687 | tmp2 = arch_to_object (op->other_arch); |
2687 | object *tmp2 = arch_to_object (op->other_arch); |
2688 | tmp2->x = op->x; |
2688 | tmp2->x = op->x; |
2689 | tmp2->y = op->y; |
2689 | tmp2->y = op->y; |
2690 | tmp2->map = op->map; |
2690 | tmp2->map = op->map; |
2691 | tmp2->below = op->below; |
2691 | tmp2->below = op->below; |
2692 | tmp2->above = op->above; |
2692 | tmp2->above = op->above; |
2693 | tmp2->stats.food = op->stats.food; |
2693 | tmp2->stats.food = op->stats.food; |
2694 | CLEAR_FLAG (tmp2, FLAG_APPLIED); |
2694 | CLEAR_FLAG (tmp2, FLAG_APPLIED); |
2695 | |
2695 | |
2696 | if (QUERY_FLAG (op, FLAG_INV_LOCKED)) |
2696 | if (QUERY_FLAG (op, FLAG_INV_LOCKED)) |
2697 | SET_FLAG (tmp2, FLAG_INV_LOCKED); |
2697 | SET_FLAG (tmp2, FLAG_INV_LOCKED); |
2698 | |
2698 | |
2699 | if (who->contr) |
2699 | if (who->contr) |
2700 | esrv_del_item (who->contr, op->count); |
2700 | esrv_del_item (who->contr, op->count); |
2701 | |
2701 | |
2702 | op->destroy (); |
2702 | op->destroy (); |
2703 | insert_ob_in_ob (tmp2, who); |
2703 | insert_ob_in_ob (tmp2, who); |
2704 | who->update_stats (); |
2704 | who->update_stats (); |
2705 | |
2705 | |
2706 | if (QUERY_FLAG (op, FLAG_CURSED) || QUERY_FLAG (op, FLAG_DAMNED)) |
2706 | if (QUERY_FLAG (op, FLAG_CURSED) || QUERY_FLAG (op, FLAG_DAMNED)) |
2707 | { |
2707 | { |
2708 | if (who->contr) |
2708 | if (who->contr) |
2709 | { |
2709 | { |
2710 | new_draw_info (NDI_UNIQUE, 0, who, "Oops, it feels deadly cold!"); |
2710 | new_draw_info (NDI_UNIQUE, 0, who, "Oops, it feels deadly cold!"); |
2711 | SET_FLAG (tmp2, FLAG_KNOWN_CURSED); |
2711 | SET_FLAG (tmp2, FLAG_KNOWN_CURSED); |
2712 | } |
2712 | } |
2713 | } |
2713 | } |
2714 | |
2714 | |
2715 | if (who->contr) |
2715 | if (who->contr) |
2716 | esrv_send_item (who, tmp2); |
2716 | esrv_send_item (who, tmp2); |
|
|
2717 | } |
2717 | |
2718 | |
2718 | return 1; /* otherwise, an attempt to drop causes problems */ |
2719 | return 1; /* otherwise, an attempt to drop causes problems */ |
2719 | |
2720 | |
2720 | case BOW: |
2721 | case BOW: |
2721 | case WAND: |
2722 | case WAND: |
2722 | case ROD: |
2723 | case ROD: |
2723 | case HORN: |
2724 | case HORN: |
2724 | clear_skill (who); |
|
|
2725 | |
|
|
2726 | if (who->contr) |
2725 | if (who->contr) |
2727 | { |
|
|
2728 | new_draw_info_format (NDI_UNIQUE, 0, who, "You unready %s.", query_name (op)); |
2726 | new_draw_info_format (NDI_UNIQUE, 0, who, "You unready %s.", query_name (op)); |
2729 | |
|
|
2730 | if (who->contr->ranged_ob == op) |
|
|
2731 | who->contr->ranged_ob = 0; |
|
|
2732 | |
|
|
2733 | if (who->current_weapon == op) |
|
|
2734 | who->current_weapon = 0; |
|
|
2735 | } |
|
|
2736 | else |
2727 | else |
2737 | { |
2728 | { |
|
|
2729 | who->change_skill (0); |
|
|
2730 | |
2738 | if (op->type == BOW) |
2731 | if (op->type == BOW) |
2739 | CLEAR_FLAG (who, FLAG_READY_BOW); |
2732 | CLEAR_FLAG (who, FLAG_READY_BOW); |
2740 | else |
2733 | else |
2741 | CLEAR_FLAG (who, FLAG_READY_RANGE); |
2734 | CLEAR_FLAG (who, FLAG_READY_RANGE); |
2742 | } |
2735 | } |
2743 | |
2736 | |
2744 | break; |
2737 | break; |
2745 | |
2738 | |
2746 | case BUILDER: |
2739 | case BUILDER: |
2747 | if (who->contr) |
2740 | if (who->contr) |
2748 | { |
|
|
2749 | new_draw_info_format (NDI_UNIQUE, 0, who, "You unready %s.", query_name (op)); |
2741 | new_draw_info_format (NDI_UNIQUE, 0, who, "You unready %s.", query_name (op)); |
2750 | |
|
|
2751 | if (who->contr->ranged_ob == op) |
|
|
2752 | who->contr->ranged_ob = 0; |
|
|
2753 | } |
|
|
2754 | break; |
2742 | break; |
2755 | |
2743 | |
2756 | default: |
2744 | default: |
2757 | new_draw_info_format (NDI_UNIQUE, 0, who, "You unapply %s.", query_name (op)); |
2745 | new_draw_info_format (NDI_UNIQUE, 0, who, "You unapply %s.", query_name (op)); |
2758 | break; |
2746 | break; |
… | |
… | |
3034 | * AP_UNAPPLY=always unapply). |
3022 | * AP_UNAPPLY=always unapply). |
3035 | * |
3023 | * |
3036 | * Optional flags: |
3024 | * Optional flags: |
3037 | * AP_NO_MERGE: don't merge an unapplied object with other objects |
3025 | * AP_NO_MERGE: don't merge an unapplied object with other objects |
3038 | * AP_IGNORE_CURSE: unapply cursed items |
3026 | * AP_IGNORE_CURSE: unapply cursed items |
|
|
3027 | * AP_NO_READY: do not ready skills when applying skill tools |
3039 | * |
3028 | * |
3040 | * Usage example: apply_special (who, op, AP_UNAPPLY | AP_IGNORE_CURSE) |
3029 | * Usage example: apply_special (who, op, AP_UNAPPLY | AP_IGNORE_CURSE) |
3041 | * |
3030 | * |
3042 | * apply_special() doesn't check for unpaid items. |
3031 | * apply_special() doesn't check for unpaid items. |
3043 | */ |
3032 | */ |
… | |
… | |
3194 | who->change_skill (skop); |
3183 | who->change_skill (skop); |
3195 | |
3184 | |
3196 | if (who->contr) |
3185 | if (who->contr) |
3197 | who->change_weapon (who->contr->combat_ob = op); |
3186 | who->change_weapon (who->contr->combat_ob = op); |
3198 | |
3187 | |
3199 | if (!QUERY_FLAG (who, FLAG_READY_WEAPON)) |
|
|
3200 | SET_FLAG (who, FLAG_READY_WEAPON); |
|
|
3201 | |
|
|
3202 | new_draw_info_format (NDI_UNIQUE, 0, who, "You wield %s.", query_name (op)); |
3188 | new_draw_info_format (NDI_UNIQUE, 0, who, "You wield %s.", query_name (op)); |
3203 | |
3189 | |
|
|
3190 | SET_FLAG (who, FLAG_READY_WEAPON); |
3204 | change_abil (who, op); |
3191 | change_abil (who, op); |
3205 | break; |
3192 | break; |
3206 | |
3193 | |
3207 | case ARMOUR: |
3194 | case ARMOUR: |
3208 | case HELMET: |
3195 | case HELMET: |