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.76 by root, Mon Apr 30 04:25:30 2007 UTC vs.
Revision 1.83 by root, Mon May 7 06:01:48 2007 UTC

1/* 1/*
2 * CrossFire, A Multiplayer game for X-windows 2 * CrossFire, A Multiplayer game
3 * 3 *
4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team 4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
5 * Copyright (C) 2001 Mark Wedel & Crossfire Development Team 5 * Copyright (C) 2001 Mark Wedel & Crossfire Development Team
6 * Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (C) 1992 Frank Tore Johansen
7 * 7 *
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * 21 *
22 * The authors can be reached via e-mail to <crossfire@schmorp.de> 22 * The authors can be reached via e-mail to <crossfire@schmorp.de>
23 */ 23 */
24 24
25#include <cmath>
26
25#include <global.h> 27#include <global.h>
26#include <living.h> 28#include <living.h>
27#include <spells.h> 29#include <spells.h>
28#include <skills.h> 30#include <skills.h>
29#include <tod.h> 31#include <tod.h>
30 32
31#include <sproto.h> 33#include <sproto.h>
32 34
33/* Want this regardless of rplay. */ 35/* Want this regardless of rplay. */
34#include <sounds.h> 36#include <sounds.h>
35
36/* need math lib for double-precision and pow() in dragon_eat_flesh() */
37#include <math.h>
38 37
39/** 38/**
40 * Check if op should abort moving victim because of it's race or slaying. 39 * Check if op should abort moving victim because of it's race or slaying.
41 * Returns 1 if it should abort, returns 0 if it should continue. 40 * Returns 1 if it should abort, returns 0 if it should continue.
42 */ 41 */
765{ 764{
766 object *otmp; 765 object *otmp;
767 766
768 if (op->type != PLAYER) 767 if (op->type != PLAYER)
769 return 0; 768 return 0;
769
770 if (!QUERY_FLAG (op, FLAG_WIZCAST) && (get_map_flags (op->map, NULL, op->x, op->y, NULL, NULL) & P_NO_MAGIC)) 770 if (!QUERY_FLAG (op, FLAG_WIZCAST) && (get_map_flags (op->map, NULL, op->x, op->y, NULL, NULL) & P_NO_MAGIC))
771 { 771 {
772 new_draw_info (NDI_UNIQUE, 0, op, "Something blocks the magic of the scroll."); 772 new_draw_info (NDI_UNIQUE, 0, op, "Something blocks the magic of the scroll.");
773 return 0; 773 return 0;
774 } 774 }
775
775 otmp = find_marked_object (op); 776 otmp = find_marked_object (op);
776 if (!otmp) 777 if (!otmp)
777 { 778 {
778 new_draw_info (NDI_UNIQUE, 0, op, "You need to mark a weapon object."); 779 new_draw_info (NDI_UNIQUE, 0, op, "You need to mark a weapon object.");
779 return 0; 780 return 0;
780 } 781 }
782
781 if (otmp->type != WEAPON && otmp->type != BOW) 783 if (otmp->type != WEAPON && otmp->type != BOW)
782 { 784 {
783 new_draw_info (NDI_UNIQUE, 0, op, "Marked item is not a weapon or bow"); 785 new_draw_info (NDI_UNIQUE, 0, op, "Marked item is not a weapon or bow");
784 return 0; 786 return 0;
785 } 787 }
788
786 new_draw_info (NDI_UNIQUE, 0, op, "Applied weapon builder."); 789 new_draw_info (NDI_UNIQUE, 0, op, "Applied weapon builder.");
787 improve_weapon (op, tmp, otmp); 790 improve_weapon (op, tmp, otmp);
788 esrv_send_item (op, otmp); 791 esrv_send_item (op, otmp);
789 return 1; 792 return 1;
790} 793}
2292 } 2295 }
2293 2296
2294 return 0; 2297 return 0;
2295} 2298}
2296 2299
2297
2298/** 2300/**
2299 * Main apply handler. 2301 * Main apply handler.
2300 * 2302 *
2301 * Checks for unpaid items before applying. 2303 * Checks for unpaid items before applying.
2302 * 2304 *
2309 * being applied. 2311 * being applied.
2310 * 2312 *
2311 * aflag is special (always apply/unapply) flags. Nothing is done with 2313 * aflag is special (always apply/unapply) flags. Nothing is done with
2312 * them in this function - they are passed to apply_special 2314 * them in this function - they are passed to apply_special
2313 */ 2315 */
2314
2315int 2316int
2316manual_apply (object *op, object *tmp, int aflag) 2317manual_apply (object *op, object *tmp, int aflag)
2317{ 2318{
2318 if (tmp->head) 2319 if (tmp->head)
2319 tmp = tmp->head; 2320 tmp = tmp->head;
2449 case LAMP: 2450 case LAMP:
2450 case BUILDER: 2451 case BUILDER:
2451 case SKILL_TOOL: 2452 case SKILL_TOOL:
2452 if (tmp->env != op) 2453 if (tmp->env != op)
2453 return 2; /* not in inventory */ 2454 return 2; /* not in inventory */
2455
2454 (void) apply_special (op, tmp, aflag); 2456 apply_special (op, tmp, aflag);
2455 return 1; 2457 return 1;
2456 2458
2457 case DRINK: 2459 case DRINK:
2458 case FOOD: 2460 case FOOD:
2459 case FLESH: 2461 case FLESH:
2643 switch (op->type) 2645 switch (op->type)
2644 { 2646 {
2645 case WEAPON: 2647 case WEAPON:
2646 new_draw_info_format (NDI_UNIQUE, 0, who, "You unwield %s.", query_name (op)); 2648 new_draw_info_format (NDI_UNIQUE, 0, who, "You unwield %s.", query_name (op));
2647 2649
2648 (void) change_abil (who, op); 2650 change_abil (who, op);
2649 if (QUERY_FLAG (who, FLAG_READY_WEAPON))
2650 CLEAR_FLAG (who, FLAG_READY_WEAPON); 2651 CLEAR_FLAG (who, FLAG_READY_WEAPON);
2652
2653 if (who->contr)
2654 {
2655 if (who->contr->combat_ob == op)
2656 who->contr->combat_ob = 0;
2657
2658 if (who->current_weapon == op)
2659 who->current_weapon = 0;
2660 }
2661
2651 clear_skill (who); 2662 clear_skill (who);
2652 break; 2663 break;
2653 2664
2654 case SKILL: /* allows objects to impart skills */ 2665 case SKILL: /* allows objects to impart skills */
2655 case SKILL_TOOL: 2666 case SKILL_TOOL:
2656 if (op != who->chosen_skill) 2667 if (op != who->chosen_skill)
2657 LOG (llevError, "BUG: apply_special(): applied skill is not a chosen skill\n"); 2668 LOG (llevError, "BUG: apply_special(): applied skill is not a chosen skill\n");
2658 2669
2659 if (who->type == PLAYER) 2670 if (who->contr)
2660 {
2661 if (who->contr->ranged_ob == op)
2662 { 2671 {
2663 who->contr->ranged_skill = 0;
2664 who->contr->ranged_ob = 0;
2665 }
2666
2667 if (!op->invisible) 2672 if (!op->invisible)
2668 new_draw_info_format (NDI_UNIQUE, 0, who, "You stop using the %s.", query_name (op)); 2673 new_draw_info_format (NDI_UNIQUE, 0, who, "You stop using the %s.", query_name (op));
2669 else 2674 else
2670 new_draw_info_format (NDI_UNIQUE, 0, who, "You can no longer use the skill: %s.", &op->skill); 2675 new_draw_info_format (NDI_UNIQUE, 0, who, "You can no longer use the skill: %s.", &op->skill);
2671 } 2676 }
2684 case AMULET: 2689 case AMULET:
2685 case GIRDLE: 2690 case GIRDLE:
2686 case BRACERS: 2691 case BRACERS:
2687 case CLOAK: 2692 case CLOAK:
2688 new_draw_info_format (NDI_UNIQUE, 0, who, "You unwear %s.", query_name (op)); 2693 new_draw_info_format (NDI_UNIQUE, 0, who, "You unwear %s.", query_name (op));
2689 (void) change_abil (who, op); 2694 change_abil (who, op);
2690 break; 2695 break;
2696
2691 case LAMP: 2697 case LAMP:
2692 new_draw_info_format (NDI_UNIQUE, 0, who, "You turn off your %s.", &op->name); 2698 new_draw_info_format (NDI_UNIQUE, 0, who, "You turn off your %s.", &op->name);
2693 tmp2 = arch_to_object (op->other_arch); 2699 tmp2 = arch_to_object (op->other_arch);
2694 tmp2->x = op->x; 2700 tmp2->x = op->x;
2695 tmp2->y = op->y; 2701 tmp2->y = op->y;
2700 CLEAR_FLAG (tmp2, FLAG_APPLIED); 2706 CLEAR_FLAG (tmp2, FLAG_APPLIED);
2701 2707
2702 if (QUERY_FLAG (op, FLAG_INV_LOCKED)) 2708 if (QUERY_FLAG (op, FLAG_INV_LOCKED))
2703 SET_FLAG (tmp2, FLAG_INV_LOCKED); 2709 SET_FLAG (tmp2, FLAG_INV_LOCKED);
2704 2710
2705 if (who->type == PLAYER) 2711 if (who->contr)
2706 esrv_del_item (who->contr, op->count); 2712 esrv_del_item (who->contr, op->count);
2707 2713
2708 op->destroy (); 2714 op->destroy ();
2709 insert_ob_in_ob (tmp2, who); 2715 insert_ob_in_ob (tmp2, who);
2710 who->update_stats (); 2716 who->update_stats ();
2717
2711 if (QUERY_FLAG (op, FLAG_CURSED) || QUERY_FLAG (op, FLAG_DAMNED)) 2718 if (QUERY_FLAG (op, FLAG_CURSED) || QUERY_FLAG (op, FLAG_DAMNED))
2712 { 2719 {
2713 if (who->type == PLAYER) 2720 if (who->contr)
2714 { 2721 {
2715 new_draw_info (NDI_UNIQUE, 0, who, "Oops, it feels deadly cold!"); 2722 new_draw_info (NDI_UNIQUE, 0, who, "Oops, it feels deadly cold!");
2716 SET_FLAG (tmp2, FLAG_KNOWN_CURSED); 2723 SET_FLAG (tmp2, FLAG_KNOWN_CURSED);
2717 } 2724 }
2718 } 2725 }
2719 if (who->type == PLAYER) 2726
2727 if (who->contr)
2720 esrv_send_item (who, tmp2); 2728 esrv_send_item (who, tmp2);
2729
2721 return 1; /* otherwise, an attempt to drop causes problems */ 2730 return 1; /* otherwise, an attempt to drop causes problems */
2722 break;
2723 2731
2724 case BOW: 2732 case BOW:
2725 case WAND: 2733 case WAND:
2726 case ROD: 2734 case ROD:
2727 case HORN: 2735 case HORN:
2728 clear_skill (who); 2736 clear_skill (who);
2729 if (who->type == PLAYER) 2737
2738 if (who->contr)
2730 { 2739 {
2731 new_draw_info_format (NDI_UNIQUE, 0, who, "You unready %s.", query_name (op)); 2740 new_draw_info_format (NDI_UNIQUE, 0, who, "You unready %s.", query_name (op));
2732 2741
2733 who->contr->ranged_skill = 0; 2742 if (who->contr->ranged_ob == op)
2734 who->contr->ranged_ob = 0; 2743 who->contr->ranged_ob = 0;
2744
2745 if (who->current_weapon == op)
2746 who->current_weapon = 0;
2735 } 2747 }
2736 else 2748 else
2737 { 2749 {
2738 if (op->type == BOW) 2750 if (op->type == BOW)
2739 CLEAR_FLAG (who, FLAG_READY_BOW); 2751 CLEAR_FLAG (who, FLAG_READY_BOW);
2742 } 2754 }
2743 2755
2744 break; 2756 break;
2745 2757
2746 case BUILDER: 2758 case BUILDER:
2747 if (who->type == PLAYER) 2759 if (who->contr)
2748 { 2760 {
2749 new_draw_info_format (NDI_UNIQUE, 0, who, "You unready %s.", query_name (op)); 2761 new_draw_info_format (NDI_UNIQUE, 0, who, "You unready %s.", query_name (op));
2750 2762
2751 who->contr->ranged_skill = 0; 2763 if (who->contr->ranged_ob == op)
2752 who->contr->ranged_ob = 0; 2764 who->contr->ranged_ob = 0;
2753 } 2765 }
2754 break; 2766 break;
2755 2767
2756 default: 2768 default:
2757 new_draw_info_format (NDI_UNIQUE, 0, who, "You unapply %s.", query_name (op)); 2769 new_draw_info_format (NDI_UNIQUE, 0, who, "You unapply %s.", query_name (op));
2763 if (!(aflags & AP_NO_MERGE)) 2775 if (!(aflags & AP_NO_MERGE))
2764 { 2776 {
2765 object *tmp; 2777 object *tmp;
2766 2778
2767 tmp = merge_ob (op, NULL); 2779 tmp = merge_ob (op, NULL);
2768 if (who->type == PLAYER) 2780
2781 if (who->contr)
2769 { 2782 {
2770 if (tmp) 2783 if (tmp)
2771 { /* it was merged */ 2784 { /* it was merged */
2772 esrv_del_item (who->contr, op->count); 2785 esrv_del_item (who->contr, op->count);
2773 op = tmp; 2786 op = tmp;
2774 } 2787 }
2775 2788
2776 esrv_send_item (who, op); 2789 esrv_send_item (who, op);
2777 } 2790 }
2778 } 2791 }
2792
2779 return 0; 2793 return 0;
2780} 2794}
2781 2795
2782/** 2796/**
2783 * Returns the object that is using location 'loc'. 2797 * Returns the object that is using location 'loc'.
2800 2814
2801 if (!start) 2815 if (!start)
2802 return NULL; 2816 return NULL;
2803 2817
2804 for (tmp = start; tmp; tmp = tmp->below) 2818 for (tmp = start; tmp; tmp = tmp->below)
2805 if (QUERY_FLAG (tmp, FLAG_APPLIED) && tmp->body_info[loc] && (!tmp->invisible || tmp->type == SKILL)) 2819 if (QUERY_FLAG (tmp, FLAG_APPLIED) && tmp->slot[loc].info && (!tmp->invisible || tmp->type == SKILL))
2806 return tmp; 2820 return tmp;
2807 2821
2808 return NULL; 2822 return NULL;
2809} 2823}
2810
2811
2812 2824
2813/** 2825/**
2814 * 'op' wants to apply an object, but can't because of other equipment. 2826 * 'op' wants to apply an object, but can't because of other equipment.
2815 * This should only be called when it is known 2827 * This should only be called when it is known
2816 * that there are objects to unapply. This makes pretty heavy 2828 * that there are objects to unapply. This makes pretty heavy
2822 * another function that does just that. 2834 * another function that does just that.
2823 */ 2835 */
2824int 2836int
2825unapply_for_ob (object *who, object *op, int aflags) 2837unapply_for_ob (object *who, object *op, int aflags)
2826{ 2838{
2827 int i; 2839 if (op->is_range ())
2828 object *tmp = NULL, *last;
2829
2830 /* If we are applying a shield or weapon, unapply any equipped shield
2831 * or weapons first - only allowed to use one weapon/shield at a time.
2832 */
2833 if (op->type == WEAPON || op->type == SHIELD)
2834 {
2835 for (tmp = who->inv; tmp; tmp = tmp->below) 2840 for (object *tmp = who->inv; tmp; tmp = tmp->below)
2836 {
2837 if (QUERY_FLAG (tmp, FLAG_APPLIED) && tmp->type == op->type) 2841 if (QUERY_FLAG (tmp, FLAG_APPLIED) && tmp->is_range ())
2838 {
2839 if ((aflags & AP_IGNORE_CURSE) || (aflags & AP_PRINT) || (!QUERY_FLAG (tmp, FLAG_CURSED) && !QUERY_FLAG (tmp, FLAG_DAMNED))) 2842 if ((aflags & AP_IGNORE_CURSE) || (aflags & AP_PRINT) || (!QUERY_FLAG (tmp, FLAG_CURSED) && !QUERY_FLAG (tmp, FLAG_DAMNED)))
2840 { 2843 {
2841 if (aflags & AP_PRINT) 2844 if (aflags & AP_PRINT)
2842 new_draw_info (NDI_UNIQUE, 0, who, query_name (tmp)); 2845 new_draw_info (NDI_UNIQUE, 0, who, query_name (tmp));
2843 else 2846 else
2844 unapply_special (who, tmp, aflags); 2847 unapply_special (who, tmp, aflags);
2845 } 2848 }
2846 else 2849 else
2847 { 2850 {
2848 /* In this case, we want to try and remove a cursed item. 2851 /* In this case, we want to try and remove a cursed item.
2849 * While we know it won't work, we want unapply_special to 2852 * While we know it won't work, we want unapply_special to
2850 * at least generate the message. 2853 * at least generate the message.
2851 */ 2854 */
2852 new_draw_info_format (NDI_UNIQUE, 0, who, "No matter how hard you try, you just can't\nremove %s.", query_name (tmp)); 2855 new_draw_info_format (NDI_UNIQUE, 0, who, "No matter how hard you try, you just can't remove the %s.", query_name (tmp));
2853 return 1; 2856 return 1;
2854 }
2855
2856 } 2857 }
2857 }
2858 }
2859 2858
2860 for (i = 0; i < NUM_BODY_LOCATIONS; i++) 2859 for (int i = 0; i < NUM_BODY_LOCATIONS; i++)
2861 { 2860 {
2862 /* this used up a slot that we need to free */ 2861 /* this used up a slot that we need to free */
2863 if (op->body_info[i]) 2862 if (op->slot[i].info)
2864 { 2863 {
2865 last = who->inv; 2864 object *last = who->inv;
2866 2865
2867 /* We do a while loop - may need to remove several items in order 2866 /* We do a while loop - may need to remove several items in order
2868 * to free up enough slots. 2867 * to free up enough slots.
2869 */ 2868 */
2870 while ((who->body_used[i] + op->body_info[i]) < 0) 2869 while ((who->slot[i].used + op->slot[i].info) < 0)
2871 { 2870 {
2872 tmp = get_item_from_body_location (last, i); 2871 object *tmp = get_item_from_body_location (last, i);
2872
2873 if (!tmp) 2873 if (!tmp)
2874 { 2874 {
2875#if 0 2875#if 0
2876 /* Not a bug - we'll get this if the player has cursed items 2876 /* Not a bug - we'll get this if the player has cursed items
2877 * equipped. 2877 * equipped.
2878 */ 2878 */
2879 LOG (llevError, "Can't find object using location %d (%s) on %s\n", i, body_locations[i].save_name, who->name); 2879 LOG (llevError, "Can't find object using location %d (%s) on %s\n", i, body_locations[i].save_name, who->name);
2880#endif 2880#endif
2881 return 1; 2881 return 1;
2882 } 2882 }
2883
2883 /* If we are just printing, we don't care about cursed status */ 2884 /* If we are just printing, we don't care about cursed status */
2884 if ((aflags & AP_IGNORE_CURSE) || (aflags & AP_PRINT) || (!(QUERY_FLAG (tmp, FLAG_CURSED) || QUERY_FLAG (tmp, FLAG_DAMNED)))) 2885 if ((aflags & AP_IGNORE_CURSE) || (aflags & AP_PRINT) || (!(QUERY_FLAG (tmp, FLAG_CURSED) || QUERY_FLAG (tmp, FLAG_DAMNED))))
2885 { 2886 {
2886 if (aflags & AP_PRINT) 2887 if (aflags & AP_PRINT)
2887 new_draw_info (NDI_UNIQUE, 0, who, query_name (tmp)); 2888 new_draw_info (NDI_UNIQUE, 0, who, query_name (tmp));
2895 * so it may not be critical (eg, putting on a ring and you have 2896 * so it may not be critical (eg, putting on a ring and you have
2896 * one cursed ring.) 2897 * one cursed ring.)
2897 */ 2898 */
2898 new_draw_info_format (NDI_UNIQUE, 0, who, "The %s just won't come off", query_name (tmp)); 2899 new_draw_info_format (NDI_UNIQUE, 0, who, "The %s just won't come off", query_name (tmp));
2899 } 2900 }
2901
2900 last = tmp->below; 2902 last = tmp->below;
2901 } 2903 }
2902 /* if we got here, this slot is freed up - otherwise, if it wasn't freed up, the 2904 /* if we got here, this slot is freed up - otherwise, if it wasn't freed up, the
2903 * return in the !tmp would have kicked in. 2905 * return in the !tmp would have kicked in.
2904 */ 2906 */
2905 } /* if op is using this body location */ 2907 } /* if op is using this body location */
2906 } /* for body lcoations */ 2908 } /* for body lcoations */
2909
2907 return 0; 2910 return 0;
2908} 2911}
2909 2912
2910/** 2913/**
2911 * Checks to see if 'who' can apply object 'op'. 2914 * Checks to see if 'who' can apply object 'op'.
2912 * Returns 0 if apply can be done without anything special. 2915 * Returns 0 if apply can be done without anything special.
2913 * Otherwise returns a bitmask - potentially several of these may be 2916 * Otherwise returns a bitmask - potentially several of these may be
2914 * set, but largely depends on circumstance - in the future, processing 2917 * set, but largely depends on circumstance - in the future, processing
2915 * may be pruned once we know some status (eg, once CAN_APPLY_NEVER 2918 * may be pruned once we know some status (eg, once CAN_APPLY_NEVER
2916 * is set, do we really are what the other flags may be?) 2919 * is set, do we really are what the other flags may be?)
2917 * 2920 *
2918 * See include/define.h for detailed description of the meaning of 2921 * See include/define.h for detailed description of the meaning of
2919 * these return values. 2922 * these return values.
2920 */ 2923 */
2922can_apply_object (object *who, object *op) 2925can_apply_object (object *who, object *op)
2923{ 2926{
2924 if (INVOKE_OBJECT (CAN_BE_APPLIED, op, ARG_OBJECT (who)) || INVOKE_OBJECT (CAN_APPLY, who, ARG_OBJECT (op))) 2927 if (INVOKE_OBJECT (CAN_BE_APPLIED, op, ARG_OBJECT (who)) || INVOKE_OBJECT (CAN_APPLY, who, ARG_OBJECT (op)))
2925 return RESULT_INT (0); 2928 return RESULT_INT (0);
2926 2929
2927 int i, retval = 0; 2930 int retval = 0;
2928 object *tmp = NULL, *ws = NULL; 2931 object *tmp = 0, *ws = 0;
2929 2932
2930 /* Players have 2 'arm's, so they could in theory equip 2 shields or 2933 for (int i = 0; i < NUM_BODY_LOCATIONS; i++)
2931 * 2 weapons, but we don't want to let them do that. So if they are
2932 * trying to equip a weapon or shield, see if they already have one
2933 * in place and store that way.
2934 */
2935 if (op->type == WEAPON || op->type == SHIELD)
2936 { 2934 {
2937 for (tmp = who->inv; tmp && !ws; tmp = tmp->below) 2935 if (op->slot[i].info)
2938 { 2936 {
2939 if (QUERY_FLAG (tmp, FLAG_APPLIED) && tmp->type == op->type) 2937 /* Item uses more slots than we have */
2938 if (abs (op->slot[i].info) > who->slot[i].info)
2940 { 2939 {
2941 retval = CAN_APPLY_UNAPPLY;
2942 ws = tmp;
2943 }
2944 }
2945 }
2946
2947 for (i = 0; i < NUM_BODY_LOCATIONS; i++)
2948 {
2949 if (op->body_info[i])
2950 {
2951 /* Item uses more slots than we have */
2952 if (FABS (op->body_info[i]) > who->body_info[i])
2953 {
2954 /* Could return now for efficiently - rest of info below isn' 2940 /* Could return now for efficiency - rest of info below isn't
2955 * really needed. 2941 * really needed.
2956 */ 2942 */
2957 retval |= CAN_APPLY_NEVER; 2943 retval |= CAN_APPLY_NEVER;
2958 } 2944 }
2959 else if ((who->body_used[i] + op->body_info[i]) < 0) 2945 else if ((who->slot[i].used + op->slot[i].info) < 0)
2960 { 2946 {
2961 /* in this case, equipping this would use more free spots than 2947 /* in this case, equipping this would use more free spots than
2962 * we have. 2948 * we have.
2963 */ 2949 */
2964 object *tmp1;
2965
2966 2950
2967 /* if we have an applied weapon/shield, and unapply it would free 2951 /* if we have an applied weapon/shield, and unapply it would free
2968 * enough slots to equip the new item, then just set this can 2952 * enough slots to equip the new item, then just set this can
2969 * continue. We don't care about the logic below - if you have 2953 * continue. We don't care about the logic below - if you have
2970 * shield equipped and try to equip another shield, there is only 2954 * shield equipped and try to equip another shield, there is only
2972 * does take into the account cases where what is being applied 2956 * does take into the account cases where what is being applied
2973 * may be two handed for example. 2957 * may be two handed for example.
2974 */ 2958 */
2975 if (ws) 2959 if (ws)
2976 { 2960 {
2977 if ((who->body_used[i] - ws->body_info[i] + op->body_info[i]) >= 0) 2961 if ((who->slot[i].used - ws->slot[i].info + op->slot[i].info) >= 0)
2978 { 2962 {
2979 retval |= CAN_APPLY_UNAPPLY; 2963 retval |= CAN_APPLY_UNAPPLY;
2980 continue; 2964 continue;
2981 } 2965 }
2982 } 2966 }
2983 2967
2984 tmp1 = get_item_from_body_location (who->inv, i); 2968 object *tmp1 = get_item_from_body_location (who->inv, i);
2985 if (!tmp1) 2969 if (!tmp1)
2986 { 2970 {
2987#if 0 2971#if 0
2988 /* This is sort of an error, but happens a lot when old players 2972 /* This is sort of an error, but happens a lot when old players
2989 * join in with more stuff equipped than they are now allowed. 2973 * join in with more stuff equipped than they are now allowed.
3000 */ 2984 */
3001 retval |= CAN_APPLY_UNAPPLY; 2985 retval |= CAN_APPLY_UNAPPLY;
3002 if (!tmp) 2986 if (!tmp)
3003 tmp = tmp1; 2987 tmp = tmp1;
3004 else if (tmp != tmp1) 2988 else if (tmp != tmp1)
3005 {
3006 retval |= CAN_APPLY_UNAPPLY_MULT; 2989 retval |= CAN_APPLY_UNAPPLY_MULT;
3007 } 2990
3008 /* This object isn't using up all the slots, so there must 2991 /* This object isn't using up all the slots, so there must
3009 * be another. If so, and it the new item doesn't need all 2992 * be another. If so, and it the new item doesn't need all
3010 * the slots, the player then has a choice. 2993 * the slots, the player then has a choice.
3011 */ 2994 */
3012 if (((who->body_used[i] - tmp1->body_info[i]) != who->body_info[i]) && (FABS (op->body_info[i]) < who->body_info[i])) 2995 if ((who->slot[i].used - tmp1->slot[i].info != who->slot[i].info)
2996 && abs (op->slot[i].info) < who->slot[i].info)
3013 retval |= CAN_APPLY_UNAPPLY_CHOICE; 2997 retval |= CAN_APPLY_UNAPPLY_CHOICE;
3014 2998
3015 /* Does unequippint 'tmp1' free up enough slots for this to be 2999 /* Does unequippint 'tmp1' free up enough slots for this to be
3016 * equipped? If not, there must be something else to unapply. 3000 * equipped? If not, there must be something else to unapply.
3017 */ 3001 */
3018 if ((who->body_used[i] + op->body_info[i] - tmp1->body_info[i]) < 0) 3002 if (who->slot[i].used + op->slot[i].info < tmp1->slot[i].info)
3019 retval |= CAN_APPLY_UNAPPLY_MULT; 3003 retval |= CAN_APPLY_UNAPPLY_MULT;
3020
3021 } 3004 }
3022 } /* if not enough free slots */ 3005 } /* if not enough free slots */
3023 } /* if this object uses location i */ 3006 } /* if this object uses location i */
3024 } /* for i -> num_body_locations loop */ 3007 } /* for i -> num_body_locations loop */
3025 3008
3038 3021
3039 if (who->type != PLAYER) 3022 if (who->type != PLAYER)
3040 { 3023 {
3041 if ((op->type == WAND || op->type == HORN || op->type == ROD) && !QUERY_FLAG (who, FLAG_USE_RANGE)) 3024 if ((op->type == WAND || op->type == HORN || op->type == ROD) && !QUERY_FLAG (who, FLAG_USE_RANGE))
3042 retval |= CAN_APPLY_RESTRICTION; 3025 retval |= CAN_APPLY_RESTRICTION;
3026
3043 if (op->type == BOW && !QUERY_FLAG (who, FLAG_USE_BOW)) 3027 if (op->type == BOW && !QUERY_FLAG (who, FLAG_USE_BOW))
3044 retval |= CAN_APPLY_RESTRICTION; 3028 retval |= CAN_APPLY_RESTRICTION;
3029
3045 if (op->type == RING && !QUERY_FLAG (who, FLAG_USE_RING)) 3030 if (op->type == RING && !QUERY_FLAG (who, FLAG_USE_RING))
3046 retval |= CAN_APPLY_RESTRICTION; 3031 retval |= CAN_APPLY_RESTRICTION;
3032
3047 if (op->type == BOW && !QUERY_FLAG (who, FLAG_USE_BOW)) 3033 if (op->type == BOW && !QUERY_FLAG (who, FLAG_USE_BOW))
3048 retval |= CAN_APPLY_RESTRICTION; 3034 retval |= CAN_APPLY_RESTRICTION;
3049 } 3035 }
3050 3036
3051 return retval; 3037 return retval;
3076int 3062int
3077apply_special (object *who, object *op, int aflags) 3063apply_special (object *who, object *op, int aflags)
3078{ 3064{
3079 int basic_flag = aflags & AP_BASIC_FLAGS; 3065 int basic_flag = aflags & AP_BASIC_FLAGS;
3080 object *tmp, *tmp2, *skop = NULL; 3066 object *tmp, *tmp2, *skop = NULL;
3081 int i;
3082 3067
3083 if (who == NULL) 3068 if (who == NULL)
3084 { 3069 {
3085 LOG (llevError, "apply_special() from object without environment.\n"); 3070 LOG (llevError, "apply_special() from object without environment.\n");
3086 return 1; 3071 return 1;
3099 if (!(aflags & AP_IGNORE_CURSE) && (QUERY_FLAG (op, FLAG_CURSED) || QUERY_FLAG (op, FLAG_DAMNED))) 3084 if (!(aflags & AP_IGNORE_CURSE) && (QUERY_FLAG (op, FLAG_CURSED) || QUERY_FLAG (op, FLAG_DAMNED)))
3100 { 3085 {
3101 new_draw_info_format (NDI_UNIQUE, 0, who, "No matter how hard you try, you just can't\nremove %s.", query_name (op)); 3086 new_draw_info_format (NDI_UNIQUE, 0, who, "No matter how hard you try, you just can't\nremove %s.", query_name (op));
3102 return 1; 3087 return 1;
3103 } 3088 }
3089
3104 return unapply_special (who, op, aflags); 3090 return unapply_special (who, op, aflags);
3105 } 3091 }
3106 3092
3107 if (basic_flag == AP_UNAPPLY) 3093 if (basic_flag == AP_UNAPPLY)
3108 return 0; 3094 return 0;
3109 3095
3110 i = can_apply_object (who, op);
3111
3112 /* Can't just apply this object. Lets see what not and what to do */ 3096 /* Can't just apply this object. Lets see what not and what to do */
3113 if (i) 3097 if (int i = can_apply_object (who, op))
3114 { 3098 {
3115 if (i & CAN_APPLY_NEVER) 3099 if (i & CAN_APPLY_NEVER)
3116 { 3100 {
3117 new_draw_info_format (NDI_UNIQUE, 0, who, "You don't have the body to use a %s\n", query_name (op)); 3101 new_draw_info_format (NDI_UNIQUE, 0, who, "You don't have the body to use a %s\n", query_name (op));
3118 return 1; 3102 return 1;
3120 else if (i & CAN_APPLY_RESTRICTION) 3104 else if (i & CAN_APPLY_RESTRICTION)
3121 { 3105 {
3122 new_draw_info_format (NDI_UNIQUE, 0, who, "You have a prohibition against using a %s\n", query_name (op)); 3106 new_draw_info_format (NDI_UNIQUE, 0, who, "You have a prohibition against using a %s\n", query_name (op));
3123 return 1; 3107 return 1;
3124 } 3108 }
3109
3125 if (who->type != PLAYER) 3110 if (who->type != PLAYER)
3126 { 3111 {
3127 /* Some error, so don't try to equip something more */ 3112 /* Some error, so don't try to equip something more */
3128 if (unapply_for_ob (who, op, aflags)) 3113 if (unapply_for_ob (who, op, aflags))
3129 return 1; 3114 return 1;
3135 new_draw_info (NDI_UNIQUE, 0, who, "You need to unapply some of the following item(s) or change your applymode:"); 3120 new_draw_info (NDI_UNIQUE, 0, who, "You need to unapply some of the following item(s) or change your applymode:");
3136 unapply_for_ob (who, op, AP_PRINT); 3121 unapply_for_ob (who, op, AP_PRINT);
3137 return 1; 3122 return 1;
3138 } 3123 }
3139 else if (who->contr->unapply == unapply_always || !(i & CAN_APPLY_UNAPPLY_CHOICE)) 3124 else if (who->contr->unapply == unapply_always || !(i & CAN_APPLY_UNAPPLY_CHOICE))
3140 {
3141 i = unapply_for_ob (who, op, aflags); 3125 if (unapply_for_ob (who, op, aflags))
3142 if (i)
3143 return 1; 3126 return 1;
3144 }
3145 } 3127 }
3146 } 3128 }
3147 3129
3148 if (op->skill && op->type != SKILL && op->type != SKILL_TOOL) 3130 if (op->skill && op->type != SKILL && op->type != SKILL_TOOL)
3149 { 3131 {
3150 skop = find_skill_by_name (who, op->skill); 3132 skop = find_skill_by_name (who, op->skill);
3133
3151 if (!skop) 3134 if (!skop)
3152 { 3135 {
3153 new_draw_info_format (NDI_UNIQUE, 0, who, "You need the %s skill to use this item!", &op->skill); 3136 new_draw_info_format (NDI_UNIQUE, 0, who, "You need the %s skill to use this item!", &op->skill);
3154 return 1; 3137 return 1;
3155 } 3138 }
3158 * skill so that the dam and wc get updated 3141 * skill so that the dam and wc get updated
3159 */ 3142 */
3160 change_skill (who, skop, 0); 3143 change_skill (who, skop, 0);
3161 } 3144 }
3162 3145
3146 if (who->type == PLAYER
3147 && op->item_power
3163 if (who->type == PLAYER && op->item_power && (op->item_power + who->contr->item_power) > (settings.item_power_factor * who->level)) 3148 && op->item_power + who->contr->item_power > settings.item_power_factor * who->level)
3164 { 3149 {
3165 new_draw_info (NDI_UNIQUE, 0, who, 3150 new_draw_info (NDI_UNIQUE, 0, who,
3166 "Equipping that combined with other items would consume your soul! " 3151 "Equipping that combined with other items would consume your soul! "
3167 "[use the skills command to check your available item power]"); 3152 "[use the skills command to check your available item power]");
3168 return 1; 3153 return 1;
3169 } 3154 }
3170 3155
3171
3172 /* Ok. We are now at the state where we can apply the new object. 3156 /* Ok. We are now at the state where we can apply the new object.
3173 * Note that we don't have the checks for can_use_... 3157 * Note that we don't have the checks for can_use_...
3174 * below - that is already taken care of by can_apply_object. 3158 * below - that is already taken care of by can_apply_object.
3175 */ 3159 */
3176
3177 if (op->nrof > 1) 3160 if (op->nrof > 1)
3178 tmp = get_split_ob (op, op->nrof - 1); 3161 tmp = get_split_ob (op, op->nrof - 1);
3179 else 3162 else
3180 tmp = NULL; 3163 tmp = 0;
3181 3164
3182 if (INVOKE_OBJECT (BE_READY, op, ARG_OBJECT (who)) || INVOKE_OBJECT (READY, who, ARG_OBJECT (op))) 3165 if (INVOKE_OBJECT (BE_READY, op, ARG_OBJECT (who)) || INVOKE_OBJECT (READY, who, ARG_OBJECT (op)))
3183 return RESULT_INT (0); 3166 return RESULT_INT (0);
3184 3167
3185 switch (op->type) 3168 switch (op->type)
3186 { 3169 {
3187 case WEAPON: 3170 case WEAPON:
3188 if (!check_weapon_power (who, op->last_eat)) 3171 if (!check_weapon_power (who, op->last_eat))
3189 { 3172 {
3190 new_draw_info (NDI_UNIQUE, 0, who, "That weapon is too powerful for you to use."); 3173 new_draw_info (NDI_UNIQUE, 0, who, "This weapon is too powerful for you to use.");
3191 new_draw_info (NDI_UNIQUE, 0, who, "It would consume your soul!."); 3174 new_draw_info (NDI_UNIQUE, 0, who, "It would consume your soul!.");
3175
3192 if (tmp != NULL) 3176 if (tmp)
3193 (void) insert_ob_in_ob (tmp, who); 3177 insert_ob_in_ob (tmp, who);
3178
3194 return 1; 3179 return 1;
3195 } 3180 }
3196 3181
3197 //TODO: this obviously fails for players using a shiorter prefix 3182 //TODO: this obviously fails for players using a shorter prefix
3198 // i.e. "R" can use Ragnarok's swors. 3183 // i.e. "R" can use Ragnarok's sword.
3199 if (op->level && (strncmp (op->name, who->name, strlen (who->name)))) 3184 if (op->level && (strncmp (op->name, who->name, strlen (who->name))))
3200 { 3185 {
3201 /* if the weapon does not have the name as the character, can't use it. */ 3186 /* if the weapon does not have the name as the character, can't use it. */
3202 /* (Ragnarok's sword attempted to be used by Foo: won't work) */ 3187 /* (Ragnarok's sword attempted to be used by Foo: won't work) */
3203 new_draw_info (NDI_UNIQUE, 0, who, "The weapon does not recognize you as its owner."); 3188 new_draw_info (NDI_UNIQUE, 0, who, "The weapon does not recognize you as its owner.");
3206 insert_ob_in_ob (tmp, who); 3191 insert_ob_in_ob (tmp, who);
3207 3192
3208 return 1; 3193 return 1;
3209 } 3194 }
3210 3195
3196 if (!skop)
3197 {
3198 new_draw_info_format (NDI_UNIQUE, 0, who, "The %s is broken, please report this to the dungeon master!", query_name (op));//TODO
3199 return 1;
3200 }
3201
3211 SET_FLAG (op, FLAG_APPLIED); 3202 SET_FLAG (op, FLAG_APPLIED);
3212
3213 if (skop)
3214 change_skill (who, skop, 1); 3203 change_skill (who, skop, 1);
3204
3205 if (who->contr)
3206 {
3207 who->contr->combat_ob = op;
3208 who->current_weapon = op;
3209 }
3215 3210
3216 if (!QUERY_FLAG (who, FLAG_READY_WEAPON)) 3211 if (!QUERY_FLAG (who, FLAG_READY_WEAPON))
3217 SET_FLAG (who, FLAG_READY_WEAPON); 3212 SET_FLAG (who, FLAG_READY_WEAPON);
3218 3213
3219 new_draw_info_format (NDI_UNIQUE, 0, who, "You wield %s.", query_name (op)); 3214 new_draw_info_format (NDI_UNIQUE, 0, who, "You wield %s.", query_name (op));
3237 break; 3232 break;
3238 3233
3239 case LAMP: 3234 case LAMP:
3240 if (op->stats.food < 1) 3235 if (op->stats.food < 1)
3241 { 3236 {
3242 new_draw_info_format (NDI_UNIQUE, 0, who, "Your %s is out of" " fuel!", &op->name); 3237 new_draw_info_format (NDI_UNIQUE, 0, who, "Your %s is out of fuel!", &op->name);
3243 return 1; 3238 return 1;
3244 } 3239 }
3245 3240
3246 new_draw_info_format (NDI_UNIQUE, 0, who, "You turn on your %s.", &op->name); 3241 new_draw_info_format (NDI_UNIQUE, 0, who, "You turn on your %s.", &op->name);
3247 tmp2 = arch_to_object (op->other_arch); 3242 tmp2 = arch_to_object (op->other_arch);
3268 } 3263 }
3269 3264
3270 who->update_stats (); 3265 who->update_stats ();
3271 3266
3272 if (QUERY_FLAG (op, FLAG_CURSED) || QUERY_FLAG (op, FLAG_DAMNED)) 3267 if (QUERY_FLAG (op, FLAG_CURSED) || QUERY_FLAG (op, FLAG_DAMNED))
3273 {
3274 if (who->type == PLAYER) 3268 if (who->type == PLAYER)
3275 { 3269 {
3276 new_draw_info (NDI_UNIQUE, 0, who, "Oops, it feels deadly cold!"); 3270 new_draw_info (NDI_UNIQUE, 0, who, "Oops, it feels deadly cold!");
3277 SET_FLAG (tmp2, FLAG_KNOWN_CURSED); 3271 SET_FLAG (tmp2, FLAG_KNOWN_CURSED);
3278 } 3272 }
3279 }
3280 3273
3281 if (who->type == PLAYER) 3274 if (who->type == PLAYER)
3282 esrv_send_item (who, tmp2); 3275 esrv_send_item (who, tmp2);
3283 3276
3284 return 0; 3277 return 0;
3290 { 3283 {
3291 LOG (llevError, "BUG: apply_special(): can't apply two skills\n"); 3284 LOG (llevError, "BUG: apply_special(): can't apply two skills\n");
3292 return 1; 3285 return 1;
3293 } 3286 }
3294 3287
3295 if (who->type == PLAYER) 3288 if (player *pl = who->contr)
3289 {
3290 if (IS_COMBAT_SKILL (op->subtype))
3296 { 3291 {
3297 who->contr->ranged_skill = who; 3292 if (skill_flags [op->subtype] & SF_NEED_WEAPON)
3298 who->contr->ranged_ob = op; 3293 {
3294 for (object *item = who->inv; item; item = item->below)
3295 if (item->type == WEAPON && item->flag [FLAG_APPLIED])
3296 {
3297 pl->combat_ob = who->current_weapon = item;
3298 goto found_weapon;
3299 }
3300
3301 new_draw_info (NDI_UNIQUE, 0, who, "You need to apply a melee weapon before readying this skill");
3302 return 1;
3303
3304 found_weapon:;
3305 }
3306 else
3307 {
3308 pl->combat_ob = op;
3309 op->current_weapon = 0;
3310 }
3311 }
3312 else if (IS_RANGED_SKILL (op->subtype))
3313 {
3314 if (skill_flags [op->subtype] & SF_NEED_BOW)
3315 {
3316 for (object *item = who->inv; item; item = item->below)
3317 if (item->type == BOW && item->flag [FLAG_APPLIED])
3318 {
3319 pl->ranged_ob = who->current_weapon = item;
3320 goto found_bow;
3321 }
3322
3323 new_draw_info (NDI_UNIQUE, 0, who, "You need to apply a missile weapon before readying this skill");
3324 return 1;
3325
3326 found_bow:;
3327 }
3328 else if (skill_flags [op->subtype] & SF_NEED_ITEM)
3329 {
3330 for (object *item = who->inv; item; item = item->below)
3331 if (item->flag [FLAG_APPLIED]
3332 && (item->type == WAND || item->type == ROD || item->type == HORN))
3333 {
3334 pl->ranged_ob = who->current_weapon = item;
3335 goto found_item;
3336 }
3337
3338 new_draw_info (NDI_UNIQUE, 0, who, "You need to apply a magic item before readying this skill");
3339 return 1;
3340
3341 found_item:;
3342 }
3343 else
3344 {
3345 pl->ranged_ob = op;
3346 op->current_weapon = 0;
3347 }
3348 }
3299 3349
3300 if (!op->invisible) 3350 if (!op->invisible)
3301 { 3351 {
3302 new_draw_info_format (NDI_UNIQUE, 0, who, "You ready %s.", query_name (op)); 3352 new_draw_info_format (NDI_UNIQUE, 0, who, "You ready %s.", query_name (op));
3303 new_draw_info_format (NDI_UNIQUE, 0, who, "You can now use the skill: %s.", &op->skill); 3353 new_draw_info_format (NDI_UNIQUE, 0, who, "You can now use the skill: %s.", &op->skill);
3313 break; 3363 break;
3314 3364
3315 case BOW: 3365 case BOW:
3316 if (!check_weapon_power (who, op->last_eat)) 3366 if (!check_weapon_power (who, op->last_eat))
3317 { 3367 {
3318 new_draw_info (NDI_UNIQUE, 0, who, "That item is too powerful for you to use."); 3368 new_draw_info (NDI_UNIQUE, 0, who, "That weapon is too powerful for you to use.");
3319 new_draw_info (NDI_UNIQUE, 0, who, "It would consume your soul!."); 3369 new_draw_info (NDI_UNIQUE, 0, who, "It would consume your soul!.");
3320 3370
3321 if (tmp) 3371 if (tmp)
3322 insert_ob_in_ob (tmp, who); 3372 insert_ob_in_ob (tmp, who);
3323 3373
3325 } 3375 }
3326 3376
3327 if (op->level && (strncmp (op->name, who->name, strlen (who->name)))) 3377 if (op->level && (strncmp (op->name, who->name, strlen (who->name))))
3328 { 3378 {
3329 new_draw_info (NDI_UNIQUE, 0, who, "The weapon does not recognize you as its owner."); 3379 new_draw_info (NDI_UNIQUE, 0, who, "The weapon does not recognize you as its owner.");
3330 if (tmp != NULL) 3380 if (tmp)
3331 insert_ob_in_ob (tmp, who); 3381 insert_ob_in_ob (tmp, who);
3332 3382
3333 return 1; 3383 return 1;
3334 } 3384 }
3335 3385
3336 /*FALLTHROUGH*/ 3386 /*FALLTHROUGH*/
3337 case WAND: 3387 case WAND:
3338 case ROD: 3388 case ROD:
3339 case HORN: 3389 case HORN:
3340 /* check for skill, alter player status */ 3390 /* check for skill, alter player status */
3391
3392 if (!skop)
3393 {
3394 new_draw_info_format (NDI_UNIQUE, 0, who, "The %s is broken, please report this to the dungeon master!", query_name (op));//TODO
3395 return 1;
3396 }
3397
3341 SET_FLAG (op, FLAG_APPLIED); 3398 SET_FLAG (op, FLAG_APPLIED);
3342 if (skop)
3343 change_skill (who, skop, 0); 3399 change_skill (who, skop, 0);
3344 3400
3345 if (who->type == PLAYER) 3401 if (who->contr)
3346 { 3402 {
3403 who->contr->ranged_ob = op;
3404
3347 new_draw_info_format (NDI_UNIQUE, 0, who, "You ready %s.", query_name (op)); 3405 new_draw_info_format (NDI_UNIQUE, 0, who, "You ready %s.", query_name (op));
3348 3406
3349 if (op->type == BOW) 3407 if (op->type == BOW)
3350 { 3408 {
3409 who->current_weapon = op;
3351 change_abil (who, op); 3410 change_abil (who, op);
3352 new_draw_info_format (NDI_UNIQUE, 0, who, 3411 new_draw_info_format (NDI_UNIQUE, 0, who,
3353 "You will now fire %s with %s.", op->race ? &op->race : "nothing", query_name (op)); 3412 "You will now fire %s with %s.", op->race ? &op->race : "nothing", query_name (op));
3354 } 3413 }
3355
3356 who->contr->ranged_skill = find_skill_by_name (who, op->skill);//TODO
3357 who->contr->ranged_ob = op;
3358 } 3414 }
3359 else 3415 else
3360 { 3416 {
3361 if (op->type == BOW) 3417 if (op->type == BOW)
3362 SET_FLAG (who, FLAG_READY_BOW); 3418 SET_FLAG (who, FLAG_READY_BOW);
3372 if (who->contr->ranged_ob && who->contr->ranged_ob->type == BUILDER) 3428 if (who->contr->ranged_ob && who->contr->ranged_ob->type == BUILDER)
3373 unapply_special (who, who->contr->ranged_ob, 0); 3429 unapply_special (who, who->contr->ranged_ob, 0);
3374 3430
3375 new_draw_info_format (NDI_UNIQUE, 0, who, "You ready your %s.", query_name (op)); 3431 new_draw_info_format (NDI_UNIQUE, 0, who, "You ready your %s.", query_name (op));
3376 3432
3377 who->contr->ranged_skill = who;
3378 who->contr->ranged_ob = op; 3433 who->contr->ranged_ob = op;
3379 } 3434 }
3380 break; 3435 break;
3381 3436
3382 default: 3437 default:
3383 new_draw_info_format (NDI_UNIQUE, 0, who, "You apply %s.", query_name (op)); 3438 new_draw_info_format (NDI_UNIQUE, 0, who, "You apply %s.", query_name (op));
3384 } /* end of switch op->type */ 3439 } /* end of switch op->type */
3385 3440
3386 SET_FLAG (op, FLAG_APPLIED); 3441 SET_FLAG (op, FLAG_APPLIED);
3387 3442
3388 if (tmp != NULL) 3443 if (tmp)
3389 tmp = insert_ob_in_ob (tmp, who); 3444 tmp = insert_ob_in_ob (tmp, who);
3390 3445
3391 who->update_stats (); 3446 who->update_stats ();
3392 3447
3393 /* We exclude spell casting objects. The fire code will set the 3448 /* We exclude spell casting objects. The fire code will set the
3583 && tmp->type != PLAYER_CHANGER && tmp->type != CLASS && tmp->has_random_items ()) 3638 && tmp->type != PLAYER_CHANGER && tmp->type != CLASS && tmp->has_random_items ())
3584 { 3639 {
3585 create_treasure (tmp->randomitems, tmp, GT_APPLY, difficulty, 0); 3640 create_treasure (tmp->randomitems, tmp, GT_APPLY, difficulty, 0);
3586 tmp->randomitems = NULL; 3641 tmp->randomitems = NULL;
3587 } 3642 }
3643
3588 // close all containers 3644 // close all containers
3589 else if (tmp->type == CONTAINER) 3645 else if (tmp->type == CONTAINER)
3590 tmp->flag [FLAG_APPLIED] = 0; 3646 tmp->flag [FLAG_APPLIED] = 0;
3591 3647
3592 tmp = above; 3648 tmp = above;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines