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

Comparing deliantra/server/server/apply.C (file contents):
Revision 1.102 by root, Thu May 17 22:29:46 2007 UTC vs.
Revision 1.103 by root, Fri May 18 01:01:02 2007 UTC

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:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines