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.75 by elmex, Sun Apr 15 19:13:21 2007 UTC vs.
Revision 1.76 by root, Mon Apr 30 04:25:30 2007 UTC

2637 return RESULT_INT (0); 2637 return RESULT_INT (0);
2638 2638
2639 object *tmp2; 2639 object *tmp2;
2640 2640
2641 CLEAR_FLAG (op, FLAG_APPLIED); 2641 CLEAR_FLAG (op, FLAG_APPLIED);
2642
2642 switch (op->type) 2643 switch (op->type)
2643 { 2644 {
2644 case WEAPON: 2645 case WEAPON:
2645 new_draw_info_format (NDI_UNIQUE, 0, who, "You unwield %s.", query_name (op)); 2646 new_draw_info_format (NDI_UNIQUE, 0, who, "You unwield %s.", query_name (op));
2646 2647
2651 break; 2652 break;
2652 2653
2653 case SKILL: /* allows objects to impart skills */ 2654 case SKILL: /* allows objects to impart skills */
2654 case SKILL_TOOL: 2655 case SKILL_TOOL:
2655 if (op != who->chosen_skill) 2656 if (op != who->chosen_skill)
2656 {
2657 LOG (llevError, "BUG: apply_special(): applied skill is not a chosen skill\n"); 2657 LOG (llevError, "BUG: apply_special(): applied skill is not a chosen skill\n");
2658 } 2658
2659 if (who->type == PLAYER) 2659 if (who->type == PLAYER)
2660 { 2660 {
2661 if (who->contr->shoottype == range_skill) 2661 if (who->contr->ranged_ob == op)
2662 who->contr->shoottype = range_none; 2662 {
2663 who->contr->ranged_skill = 0;
2664 who->contr->ranged_ob = 0;
2665 }
2666
2663 if (!op->invisible) 2667 if (!op->invisible)
2664 {
2665 new_draw_info_format (NDI_UNIQUE, 0, who, "You stop using the %s.", query_name (op)); 2668 new_draw_info_format (NDI_UNIQUE, 0, who, "You stop using the %s.", query_name (op));
2666 }
2667 else 2669 else
2668 {
2669 new_draw_info_format (NDI_UNIQUE, 0, who, "You can no longer use the skill: %s.", &op->skill); 2670 new_draw_info_format (NDI_UNIQUE, 0, who, "You can no longer use the skill: %s.", &op->skill);
2670 } 2671 }
2671 } 2672
2672 (void) change_abil (who, op); 2673 change_abil (who, op);
2673 who->chosen_skill = NULL; 2674 who->chosen_skill = 0;
2674 CLEAR_FLAG (who, FLAG_READY_SKILL); 2675 CLEAR_FLAG (who, FLAG_READY_SKILL);
2675 break; 2676 break;
2676 2677
2677 case ARMOUR: 2678 case ARMOUR:
2678 case HELMET: 2679 case HELMET:
2717 } 2718 }
2718 if (who->type == PLAYER) 2719 if (who->type == PLAYER)
2719 esrv_send_item (who, tmp2); 2720 esrv_send_item (who, tmp2);
2720 return 1; /* otherwise, an attempt to drop causes problems */ 2721 return 1; /* otherwise, an attempt to drop causes problems */
2721 break; 2722 break;
2723
2722 case BOW: 2724 case BOW:
2723 case WAND: 2725 case WAND:
2724 case ROD: 2726 case ROD:
2725 case HORN: 2727 case HORN:
2726 clear_skill (who); 2728 clear_skill (who);
2727 new_draw_info_format (NDI_UNIQUE, 0, who, "You unready %s.", query_name (op));
2728 if (who->type == PLAYER) 2729 if (who->type == PLAYER)
2729 { 2730 {
2730 who->contr->shoottype = range_none; 2731 new_draw_info_format (NDI_UNIQUE, 0, who, "You unready %s.", query_name (op));
2732
2733 who->contr->ranged_skill = 0;
2734 who->contr->ranged_ob = 0;
2731 } 2735 }
2732 else 2736 else
2733 { 2737 {
2734 if (op->type == BOW) 2738 if (op->type == BOW)
2735 CLEAR_FLAG (who, FLAG_READY_BOW); 2739 CLEAR_FLAG (who, FLAG_READY_BOW);
2736 else 2740 else
2737 CLEAR_FLAG (who, FLAG_READY_RANGE); 2741 CLEAR_FLAG (who, FLAG_READY_RANGE);
2738 } 2742 }
2743
2739 break; 2744 break;
2740 2745
2741 case BUILDER: 2746 case BUILDER:
2747 if (who->type == PLAYER)
2748 {
2742 new_draw_info_format (NDI_UNIQUE, 0, who, "You unready %s.", query_name (op)); 2749 new_draw_info_format (NDI_UNIQUE, 0, who, "You unready %s.", query_name (op));
2743 who->contr->shoottype = range_none; 2750
2744 who->contr->ranges[range_builder] = NULL; 2751 who->contr->ranged_skill = 0;
2752 who->contr->ranged_ob = 0;
2753 }
2745 break; 2754 break;
2746 2755
2747 default: 2756 default:
2748 new_draw_info_format (NDI_UNIQUE, 0, who, "You unapply %s.", query_name (op)); 2757 new_draw_info_format (NDI_UNIQUE, 0, who, "You unapply %s.", query_name (op));
2749 break; 2758 break;
2933 ws = tmp; 2942 ws = tmp;
2934 } 2943 }
2935 } 2944 }
2936 } 2945 }
2937 2946
2938
2939 for (i = 0; i < NUM_BODY_LOCATIONS; i++) 2947 for (i = 0; i < NUM_BODY_LOCATIONS; i++)
2940 { 2948 {
2941 if (op->body_info[i]) 2949 if (op->body_info[i])
2942 { 2950 {
2943 /* Item uses more slots than we have */ 2951 /* Item uses more slots than we have */
3022 * and weapons all use the same slot. Similar for horn/rod/wand - they 3030 * and weapons all use the same slot. Similar for horn/rod/wand - they
3023 * all use the same location. 3031 * all use the same location.
3024 */ 3032 */
3025 if (op->type == WEAPON && !QUERY_FLAG (who, FLAG_USE_WEAPON)) 3033 if (op->type == WEAPON && !QUERY_FLAG (who, FLAG_USE_WEAPON))
3026 retval |= CAN_APPLY_RESTRICTION; 3034 retval |= CAN_APPLY_RESTRICTION;
3035
3027 if (op->type == SHIELD && !QUERY_FLAG (who, FLAG_USE_SHIELD)) 3036 if (op->type == SHIELD && !QUERY_FLAG (who, FLAG_USE_SHIELD))
3028 retval |= CAN_APPLY_RESTRICTION; 3037 retval |= CAN_APPLY_RESTRICTION;
3029
3030 3038
3031 if (who->type != PLAYER) 3039 if (who->type != PLAYER)
3032 { 3040 {
3033 if ((op->type == WAND || op->type == HORN || op->type == ROD) && !QUERY_FLAG (who, FLAG_USE_RANGE)) 3041 if ((op->type == WAND || op->type == HORN || op->type == ROD) && !QUERY_FLAG (who, FLAG_USE_RANGE))
3034 retval |= CAN_APPLY_RESTRICTION; 3042 retval |= CAN_APPLY_RESTRICTION;
3037 if (op->type == RING && !QUERY_FLAG (who, FLAG_USE_RING)) 3045 if (op->type == RING && !QUERY_FLAG (who, FLAG_USE_RING))
3038 retval |= CAN_APPLY_RESTRICTION; 3046 retval |= CAN_APPLY_RESTRICTION;
3039 if (op->type == BOW && !QUERY_FLAG (who, FLAG_USE_BOW)) 3047 if (op->type == BOW && !QUERY_FLAG (who, FLAG_USE_BOW))
3040 retval |= CAN_APPLY_RESTRICTION; 3048 retval |= CAN_APPLY_RESTRICTION;
3041 } 3049 }
3050
3042 return retval; 3051 return retval;
3043} 3052}
3044
3045
3046 3053
3047/** 3054/**
3048 * who is the object using the object. It can be a monster. 3055 * who is the object using the object. It can be a monster.
3049 * op is the object they are using. op is an equipment type item, 3056 * op is the object they are using. op is an equipment type item,
3050 * eg, one which you put on and keep on for a while, and not something 3057 * eg, one which you put on and keep on for a while, and not something
3145 { 3152 {
3146 new_draw_info_format (NDI_UNIQUE, 0, who, "You need the %s skill to use this item!", &op->skill); 3153 new_draw_info_format (NDI_UNIQUE, 0, who, "You need the %s skill to use this item!", &op->skill);
3147 return 1; 3154 return 1;
3148 } 3155 }
3149 else 3156 else
3150 {
3151 /* While experience will be credited properly, we want to change the 3157 /* While experience will be credited properly, we want to change the
3152 * skill so that the dam and wc get updated 3158 * skill so that the dam and wc get updated
3153 */ 3159 */
3154 change_skill (who, skop, 0); 3160 change_skill (who, skop, 0);
3155 }
3156 } 3161 }
3157 3162
3158 if (who->type == PLAYER && op->item_power && (op->item_power + who->contr->item_power) > (settings.item_power_factor * who->level)) 3163 if (who->type == PLAYER && op->item_power && (op->item_power + who->contr->item_power) > (settings.item_power_factor * who->level))
3159 { 3164 {
3160 new_draw_info (NDI_UNIQUE, 0, who, 3165 new_draw_info (NDI_UNIQUE, 0, who,
3205 3210
3206 SET_FLAG (op, FLAG_APPLIED); 3211 SET_FLAG (op, FLAG_APPLIED);
3207 3212
3208 if (skop) 3213 if (skop)
3209 change_skill (who, skop, 1); 3214 change_skill (who, skop, 1);
3215
3210 if (!QUERY_FLAG (who, FLAG_READY_WEAPON)) 3216 if (!QUERY_FLAG (who, FLAG_READY_WEAPON))
3211 SET_FLAG (who, FLAG_READY_WEAPON); 3217 SET_FLAG (who, FLAG_READY_WEAPON);
3212 3218
3213 new_draw_info_format (NDI_UNIQUE, 0, who, "You wield %s.", query_name (op)); 3219 new_draw_info_format (NDI_UNIQUE, 0, who, "You wield %s.", query_name (op));
3214 3220
3215 (void) change_abil (who, op); 3221 change_abil (who, op);
3216 break; 3222 break;
3217 3223
3218 case ARMOUR: 3224 case ARMOUR:
3219 case HELMET: 3225 case HELMET:
3220 case SHIELD: 3226 case SHIELD:
3225 case CLOAK: 3231 case CLOAK:
3226 case RING: 3232 case RING:
3227 case AMULET: 3233 case AMULET:
3228 SET_FLAG (op, FLAG_APPLIED); 3234 SET_FLAG (op, FLAG_APPLIED);
3229 new_draw_info_format (NDI_UNIQUE, 0, who, "You wear %s.", query_name (op)); 3235 new_draw_info_format (NDI_UNIQUE, 0, who, "You wear %s.", query_name (op));
3230 (void) change_abil (who, op); 3236 change_abil (who, op);
3231 break; 3237 break;
3238
3232 case LAMP: 3239 case LAMP:
3233 if (op->stats.food < 1) 3240 if (op->stats.food < 1)
3234 { 3241 {
3235 new_draw_info_format (NDI_UNIQUE, 0, who, "Your %s is out of" " fuel!", &op->name); 3242 new_draw_info_format (NDI_UNIQUE, 0, who, "Your %s is out of" " fuel!", &op->name);
3236 return 1; 3243 return 1;
3237 } 3244 }
3245
3238 new_draw_info_format (NDI_UNIQUE, 0, who, "You turn on your %s.", &op->name); 3246 new_draw_info_format (NDI_UNIQUE, 0, who, "You turn on your %s.", &op->name);
3239 tmp2 = arch_to_object (op->other_arch); 3247 tmp2 = arch_to_object (op->other_arch);
3240 tmp2->stats.food = op->stats.food; 3248 tmp2->stats.food = op->stats.food;
3241 SET_FLAG (tmp2, FLAG_APPLIED); 3249 SET_FLAG (tmp2, FLAG_APPLIED);
3250
3242 if (QUERY_FLAG (op, FLAG_INV_LOCKED)) 3251 if (QUERY_FLAG (op, FLAG_INV_LOCKED))
3243 SET_FLAG (tmp2, FLAG_INV_LOCKED); 3252 SET_FLAG (tmp2, FLAG_INV_LOCKED);
3253
3244 insert_ob_in_ob (tmp2, who); 3254 insert_ob_in_ob (tmp2, who);
3245 3255
3246 /* Remove the old lantern */ 3256 /* Remove the old lantern */
3247 if (who->type == PLAYER) 3257 if (who->type == PLAYER)
3248 esrv_del_item (who->contr, op->count); 3258 esrv_del_item (who->contr, op->count);
3249 3259
3250 op->destroy (); 3260 op->destroy ();
3251 3261
3252 /* insert the portion that was split off */ 3262 /* insert the portion that was split off */
3253 if (tmp != NULL) 3263 if (tmp)
3254 { 3264 {
3255 (void) insert_ob_in_ob (tmp, who); 3265 insert_ob_in_ob (tmp, who);
3256 if (who->type == PLAYER) 3266 if (who->type == PLAYER)
3257 esrv_send_item (who, tmp); 3267 esrv_send_item (who, tmp);
3258 } 3268 }
3269
3259 who->update_stats (); 3270 who->update_stats ();
3271
3260 if (QUERY_FLAG (op, FLAG_CURSED) || QUERY_FLAG (op, FLAG_DAMNED)) 3272 if (QUERY_FLAG (op, FLAG_CURSED) || QUERY_FLAG (op, FLAG_DAMNED))
3261 { 3273 {
3262 if (who->type == PLAYER) 3274 if (who->type == PLAYER)
3263 { 3275 {
3264 new_draw_info (NDI_UNIQUE, 0, who, "Oops, it feels deadly cold!"); 3276 new_draw_info (NDI_UNIQUE, 0, who, "Oops, it feels deadly cold!");
3265 SET_FLAG (tmp2, FLAG_KNOWN_CURSED); 3277 SET_FLAG (tmp2, FLAG_KNOWN_CURSED);
3266 } 3278 }
3267 } 3279 }
3280
3268 if (who->type == PLAYER) 3281 if (who->type == PLAYER)
3269 esrv_send_item (who, tmp2); 3282 esrv_send_item (who, tmp2);
3283
3270 return 0; 3284 return 0;
3271 break;
3272 3285
3273 /* this part is needed for skill-tools */ 3286 /* this part is needed for skill-tools */
3274 case SKILL: 3287 case SKILL:
3275 case SKILL_TOOL: 3288 case SKILL_TOOL:
3276 if (who->chosen_skill) 3289 if (who->chosen_skill)
3277 { 3290 {
3278 LOG (llevError, "BUG: apply_special(): can't apply two skills\n"); 3291 LOG (llevError, "BUG: apply_special(): can't apply two skills\n");
3279 return 1; 3292 return 1;
3280 } 3293 }
3294
3281 if (who->type == PLAYER) 3295 if (who->type == PLAYER)
3282 { 3296 {
3283 who->contr->shoottype = range_skill;
3284 who->contr->ranges[range_skill] = op; 3297 who->contr->ranged_skill = who;
3298 who->contr->ranged_ob = op;
3299
3285 if (!op->invisible) 3300 if (!op->invisible)
3286 { 3301 {
3287 new_draw_info_format (NDI_UNIQUE, 0, who, "You ready %s.", query_name (op)); 3302 new_draw_info_format (NDI_UNIQUE, 0, who, "You ready %s.", query_name (op));
3288 new_draw_info_format (NDI_UNIQUE, 0, who, "You can now use the skill: %s.", &op->skill); 3303 new_draw_info_format (NDI_UNIQUE, 0, who, "You can now use the skill: %s.", &op->skill);
3289 } 3304 }
3290 else 3305 else
3291 {
3292 new_draw_info_format (NDI_UNIQUE, 0, who, "Readied skill: %s.", op->skill ? &op->skill : &op->name); 3306 new_draw_info_format (NDI_UNIQUE, 0, who, "Readied skill: %s.", op->skill ? &op->skill : &op->name);
3293 } 3307 }
3294 } 3308
3295 SET_FLAG (op, FLAG_APPLIED); 3309 SET_FLAG (op, FLAG_APPLIED);
3296 (void) change_abil (who, op); 3310 change_abil (who, op);
3297 who->chosen_skill = op; 3311 who->chosen_skill = op;
3298 SET_FLAG (who, FLAG_READY_SKILL); 3312 SET_FLAG (who, FLAG_READY_SKILL);
3299 break; 3313 break;
3300 3314
3301 case BOW: 3315 case BOW:
3302 if (!check_weapon_power (who, op->last_eat)) 3316 if (!check_weapon_power (who, op->last_eat))
3303 { 3317 {
3304 new_draw_info (NDI_UNIQUE, 0, who, "That item is too powerful for you to use."); 3318 new_draw_info (NDI_UNIQUE, 0, who, "That item is too powerful for you to use.");
3305 new_draw_info (NDI_UNIQUE, 0, who, "It would consume your soul!."); 3319 new_draw_info (NDI_UNIQUE, 0, who, "It would consume your soul!.");
3320
3306 if (tmp != NULL) 3321 if (tmp)
3307 (void) insert_ob_in_ob (tmp, who); 3322 insert_ob_in_ob (tmp, who);
3323
3308 return 1; 3324 return 1;
3309 } 3325 }
3326
3310 if (op->level && (strncmp (op->name, who->name, strlen (who->name)))) 3327 if (op->level && (strncmp (op->name, who->name, strlen (who->name))))
3311 { 3328 {
3312 new_draw_info (NDI_UNIQUE, 0, who, "The weapon does not recognize you as its owner."); 3329 new_draw_info (NDI_UNIQUE, 0, who, "The weapon does not recognize you as its owner.");
3313 if (tmp != NULL) 3330 if (tmp != NULL)
3314 (void) insert_ob_in_ob (tmp, who); 3331 insert_ob_in_ob (tmp, who);
3332
3315 return 1; 3333 return 1;
3316 } 3334 }
3335
3317 /*FALLTHROUGH*/ case WAND: 3336 /*FALLTHROUGH*/
3337 case WAND:
3318 case ROD: 3338 case ROD:
3319 case HORN: 3339 case HORN:
3320 /* check for skill, alter player status */ 3340 /* check for skill, alter player status */
3321 SET_FLAG (op, FLAG_APPLIED); 3341 SET_FLAG (op, FLAG_APPLIED);
3322 if (skop) 3342 if (skop)
3323 change_skill (who, skop, 0); 3343 change_skill (who, skop, 0);
3324 new_draw_info_format (NDI_UNIQUE, 0, who, "You ready %s.", query_name (op));
3325 3344
3326 if (who->type == PLAYER) 3345 if (who->type == PLAYER)
3327 { 3346 {
3347 new_draw_info_format (NDI_UNIQUE, 0, who, "You ready %s.", query_name (op));
3348
3328 if (op->type == BOW) 3349 if (op->type == BOW)
3329 { 3350 {
3330 (void) change_abil (who, op); 3351 change_abil (who, op);
3331 new_draw_info_format (NDI_UNIQUE, 0, who, 3352 new_draw_info_format (NDI_UNIQUE, 0, who,
3332 "You will now fire %s with %s.", op->race ? &op->race : "nothing", query_name (op)); 3353 "You will now fire %s with %s.", op->race ? &op->race : "nothing", query_name (op));
3333 who->contr->shoottype = range_bow;
3334 } 3354 }
3335 else 3355
3336 { 3356 who->contr->ranged_skill = find_skill_by_name (who, op->skill);//TODO
3337 who->contr->shoottype = range_misc; 3357 who->contr->ranged_ob = op;
3338 }
3339 } 3358 }
3340 else 3359 else
3341 { 3360 {
3342 if (op->type == BOW) 3361 if (op->type == BOW)
3343 SET_FLAG (who, FLAG_READY_BOW); 3362 SET_FLAG (who, FLAG_READY_BOW);
3344 else 3363 else
3345 SET_FLAG (who, FLAG_READY_RANGE); 3364 SET_FLAG (who, FLAG_READY_RANGE);
3346 } 3365 }
3366
3347 break; 3367 break;
3348 3368
3349 case BUILDER: 3369 case BUILDER:
3350 if (who->contr->ranges[range_builder]) 3370 if (who->type == PLAYER)
3371 {
3372 if (who->contr->ranged_ob && who->contr->ranged_ob->type == BUILDER)
3351 unapply_special (who, who->contr->ranges[range_builder], 0); 3373 unapply_special (who, who->contr->ranged_ob, 0);
3352 who->contr->shoottype = range_builder; 3374
3353 who->contr->ranges[range_builder] = op;
3354 new_draw_info_format (NDI_UNIQUE, 0, who, "You ready your %s.", query_name (op)); 3375 new_draw_info_format (NDI_UNIQUE, 0, who, "You ready your %s.", query_name (op));
3376
3377 who->contr->ranged_skill = who;
3378 who->contr->ranged_ob = op;
3379 }
3355 break; 3380 break;
3356 3381
3357 default: 3382 default:
3358 new_draw_info_format (NDI_UNIQUE, 0, who, "You apply %s.", query_name (op)); 3383 new_draw_info_format (NDI_UNIQUE, 0, who, "You apply %s.", query_name (op));
3359 } /* end of switch op->type */ 3384 } /* end of switch op->type */
3378 { 3403 {
3379 new_draw_info (NDI_UNIQUE, 0, who, "Oops, it feels deadly cold!"); 3404 new_draw_info (NDI_UNIQUE, 0, who, "Oops, it feels deadly cold!");
3380 SET_FLAG (op, FLAG_KNOWN_CURSED); 3405 SET_FLAG (op, FLAG_KNOWN_CURSED);
3381 } 3406 }
3382 } 3407 }
3408
3383 if (who->type == PLAYER) 3409 if (who->type == PLAYER)
3384 { 3410 {
3385 /* if multiple objects were applied, update both slots */ 3411 /* if multiple objects were applied, update both slots */
3386 if (tmp) 3412 if (tmp)
3387 esrv_send_item (who, tmp); 3413 esrv_send_item (who, tmp);
3414
3388 esrv_send_item (who, op); 3415 esrv_send_item (who, op);
3389 } 3416 }
3417
3390 return 0; 3418 return 0;
3391} 3419}
3392
3393 3420
3394int 3421int
3395monster_apply_special (object *who, object *op, int aflags) 3422monster_apply_special (object *who, object *op, int aflags)
3396{ 3423{
3397 if (QUERY_FLAG (op, FLAG_UNPAID) && !QUERY_FLAG (op, FLAG_APPLIED)) 3424 if (QUERY_FLAG (op, FLAG_UNPAID) && !QUERY_FLAG (op, FLAG_APPLIED))

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines