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

Comparing deliantra/server/common/living.C (file contents):
Revision 1.13 by pippijn, Mon Dec 4 17:48:35 2006 UTC vs.
Revision 1.20 by root, Sat Dec 23 06:30:49 2006 UTC

235 235
236/* 236/*
237 * sets Str/Dex/con/Wis/Cha/Int/Pow in stats to value, depending on 237 * sets Str/Dex/con/Wis/Cha/Int/Pow in stats to value, depending on
238 * what attr is (STR to POW). 238 * what attr is (STR to POW).
239 */ 239 */
240
241void 240void
242set_attr_value (living * stats, int attr, sint8 value) 241set_attr_value (living *stats, int attr, sint8 value)
243{ 242{
244 switch (attr) 243 switch (attr)
245 { 244 {
246 case STR: 245 case STR:
247 stats->Str = value; 246 stats->Str = value;
269 268
270/* 269/*
271 * Like set_attr_value(), but instead the value (which can be negative) 270 * Like set_attr_value(), but instead the value (which can be negative)
272 * is added to the specified stat. 271 * is added to the specified stat.
273 */ 272 */
274
275void 273void
276change_attr_value (living * stats, int attr, sint8 value) 274change_attr_value (living *stats, int attr, sint8 value)
277{ 275{
278 if (value == 0) 276 if (value == 0)
279 return; 277 return;
278
280 switch (attr) 279 switch (attr)
281 { 280 {
282 case STR: 281 case STR:
283 stats->Str += value; 282 stats->Str += value;
284 break; 283 break;
308/* 307/*
309 * returns the specified stat. See also set_attr_value(). 308 * returns the specified stat. See also set_attr_value().
310 */ 309 */
311 310
312sint8 311sint8
313get_attr_value (const living * stats, int attr) 312get_attr_value (const living *stats, int attr)
314{ 313{
315 switch (attr) 314 switch (attr)
316 { 315 {
317 case STR:
318 return (stats->Str); 316 case STR: return stats->Str;
319 case DEX:
320 return (stats->Dex); 317 case DEX: return stats->Dex;
321 case CON:
322 return (stats->Con); 318 case CON: return stats->Con;
323 case WIS:
324 return (stats->Wis); 319 case WIS: return stats->Wis;
325 case CHA:
326 return (stats->Cha); 320 case CHA: return stats->Cha;
327 case INT:
328 return (stats->Int); 321 case INT: return stats->Int;
329 case POW:
330 return (stats->Pow); 322 case POW: return stats->Pow;
331 } 323 }
324
332 return 0; 325 return 0;
333} 326}
334 327
335/* 328/*
336 * Ensures that all stats (str/dex/con/wis/cha/int) are within the 329 * Ensures that all stats (str/dex/con/wis/cha/int) are within the
337 * 1-30 stat limit. 330 * 1-30 stat limit.
338 */ 331 */
339 332
340void 333void
341check_stat_bounds (living * stats) 334check_stat_bounds (living *stats)
342{ 335{
343 int i, v; 336 int i, v;
344 337
345 for (i = 0; i < NUM_STATS; i++) 338 for (i = 0; i < NUM_STATS; i++)
346 if ((v = get_attr_value (stats, i)) > MAX_STAT) 339 if ((v = get_attr_value (stats, i)) > MAX_STAT)
378 char message[MAX_BUF]; 371 char message[MAX_BUF];
379 int potion_max = 0; 372 int potion_max = 0;
380 373
381 /* remember what object was like before it was changed. note that 374 /* remember what object was like before it was changed. note that
382 * refop is a local copy of op only to be used for detecting changes 375 * refop is a local copy of op only to be used for detecting changes
383 * found by fix_player. refop is not a real object 376 * found by update_stats. refop is not a real object
384 */ 377 */
385 object_pod refop = *op; 378 object_copy refop = *op;
386 379
387 if (op->type == PLAYER) 380 if (op->type == PLAYER)
388 { 381 {
389 if (tmp->type == POTION) 382 if (tmp->type == POTION)
390 { 383 {
408 nstat = 1; 401 nstat = 1;
409 else if (nstat > 20 + get_attr_value (&(op->arch->clone.stats), j)) 402 else if (nstat > 20 + get_attr_value (&(op->arch->clone.stats), j))
410 { 403 {
411 nstat = 20 + get_attr_value (&(op->arch->clone.stats), j); 404 nstat = 20 + get_attr_value (&(op->arch->clone.stats), j);
412 } 405 }
406
413 if (nstat != ostat) 407 if (nstat != ostat)
414 { 408 {
415 set_attr_value (&(op->contr->orig_stats), j, nstat); 409 set_attr_value (&(op->contr->orig_stats), j, nstat);
416 potion_max = 0; 410 potion_max = 0;
417 } 411 }
419 { 413 {
420 /* potion is useless - player has already hit the natural maximum */ 414 /* potion is useless - player has already hit the natural maximum */
421 potion_max = 1; 415 potion_max = 1;
422 } 416 }
423 } 417 }
418
424 /* This section of code ups the characters normal stats also. I am not 419 /* This section of code ups the characters normal stats also. I am not
425 * sure if this is strictly necessary, being that fix_player probably 420 * sure if this is strictly necessary, being that fix_player probably
426 * recalculates this anyway. 421 * recalculates this anyway.
427 */ 422 */
428 for (j = 0; j < NUM_STATS; j++) 423 for (j = 0; j < NUM_STATS; j++)
429 change_attr_value (&(op->stats), j, flag * get_attr_value (&(tmp->stats), j)); 424 change_attr_value (&(op->stats), j, flag * get_attr_value (&(tmp->stats), j));
425
430 check_stat_bounds (&(op->stats)); 426 check_stat_bounds (&(op->stats));
431 } /* end of potion handling code */ 427 } /* end of potion handling code */
432 } 428 }
433 429
434 /* reset attributes that fix_player doesn't reset since it doesn't search 430 /* reset attributes that fix_player doesn't reset since it doesn't search
448 444
449 /* call fix_player since op object could have whatever attribute due 445 /* call fix_player since op object could have whatever attribute due
450 * to multiple items. if fix_player always has to be called after 446 * to multiple items. if fix_player always has to be called after
451 * change_ability then might as well call it from here 447 * change_ability then might as well call it from here
452 */ 448 */
453 fix_player (op); 449 op->update_stats ();
454 450
455 /* Fix player won't add the bows ability to the player, so don't 451 /* Fix player won't add the bows ability to the player, so don't
456 * print out message if this is a bow. 452 * print out message if this is a bow.
457 */ 453 */
458 if (tmp->attacktype & AT_CONFUSION && tmp->type != BOW) 454 if (tmp->attacktype & AT_CONFUSION && tmp->type != BOW)
459 { 455 {
460 success = 1; 456 success = 1;
461 DIFF_MSG (flag, "Your hands begin to glow red.", "Your hands stop glowing red."); 457 DIFF_MSG (flag, "Your hands begin to glow red.", "Your hands stop glowing red.");
462 } 458 }
459
463 if (QUERY_FLAG (op, FLAG_LIFESAVE) != QUERY_FLAG (&refop, FLAG_LIFESAVE)) 460 if (QUERY_FLAG (op, FLAG_LIFESAVE) != QUERY_FLAG (&refop, FLAG_LIFESAVE))
464 { 461 {
465 success = 1; 462 success = 1;
466 DIFF_MSG (flag, "You feel very protected.", "You don't feel protected anymore."); 463 DIFF_MSG (flag, "You feel very protected.", "You don't feel protected anymore.");
467 } 464 }
465
468 if (QUERY_FLAG (op, FLAG_REFL_MISSILE) != QUERY_FLAG (&refop, FLAG_REFL_MISSILE)) 466 if (QUERY_FLAG (op, FLAG_REFL_MISSILE) != QUERY_FLAG (&refop, FLAG_REFL_MISSILE))
469 { 467 {
470 success = 1; 468 success = 1;
471 DIFF_MSG (flag, "A magic force shimmers around you.", "The magic force fades away."); 469 DIFF_MSG (flag, "A magic force shimmers around you.", "The magic force fades away.");
472 } 470 }
471
473 if (QUERY_FLAG (op, FLAG_REFL_SPELL) != QUERY_FLAG (&refop, FLAG_REFL_SPELL)) 472 if (QUERY_FLAG (op, FLAG_REFL_SPELL) != QUERY_FLAG (&refop, FLAG_REFL_SPELL))
474 { 473 {
475 success = 1; 474 success = 1;
476 DIFF_MSG (flag, "You feel more safe now, somehow.", "Suddenly you feel less safe, somehow."); 475 DIFF_MSG (flag, "You feel more safe now, somehow.", "Suddenly you feel less safe, somehow.");
477 } 476 }
477
478 /* movement type has changed. We don't care about cases where 478 /* movement type has changed. We don't care about cases where
479 * user has multiple items giving the same type appled like we 479 * user has multiple items giving the same type appled like we
480 * used to - that is more work than what we gain, plus messages 480 * used to - that is more work than what we gain, plus messages
481 * can be misleading (a little higher could be miscontrued from 481 * can be misleading (a little higher could be miscontrued from
482 * from fly high) 482 * from fly high)
530 if (QUERY_FLAG (op, FLAG_STEALTH) != QUERY_FLAG (&refop, FLAG_STEALTH)) 530 if (QUERY_FLAG (op, FLAG_STEALTH) != QUERY_FLAG (&refop, FLAG_STEALTH))
531 { 531 {
532 success = 1; 532 success = 1;
533 DIFF_MSG (flag, "You walk more quietly.", "You walk more noisily."); 533 DIFF_MSG (flag, "You walk more quietly.", "You walk more noisily.");
534 } 534 }
535
535 if (QUERY_FLAG (op, FLAG_MAKE_INVIS) != QUERY_FLAG (&refop, FLAG_MAKE_INVIS)) 536 if (QUERY_FLAG (op, FLAG_MAKE_INVIS) != QUERY_FLAG (&refop, FLAG_MAKE_INVIS))
536 { 537 {
537 success = 1; 538 success = 1;
538 DIFF_MSG (flag, "You become transparent.", "You can see yourself."); 539 DIFF_MSG (flag, "You become transparent.", "You can see yourself.");
539 } 540 }
541
540 /* blinded you can tell if more blinded since blinded player has minimal 542 /* blinded you can tell if more blinded since blinded player has minimal
541 * vision 543 * vision
542 */ 544 */
543 if (QUERY_FLAG (tmp, FLAG_BLIND)) 545 if (QUERY_FLAG (tmp, FLAG_BLIND))
544 { 546 {
651 653
652 new_draw_info (NDI_UNIQUE | NDI_BLUE, 0, op, message); 654 new_draw_info (NDI_UNIQUE | NDI_BLUE, 0, op, message);
653 } 655 }
654 } 656 }
655 657
656 if (tmp->type != EXPERIENCE && !potion_max) 658 if (!potion_max)
657 { 659 {
658 for (j = 0; j < NUM_STATS; j++) 660 for (j = 0; j < NUM_STATS; j++)
659 { 661 {
660 if ((i = get_attr_value (&(tmp->stats), j)) != 0) 662 if ((i = get_attr_value (&(tmp->stats), j)) != 0)
661 { 663 {
662 success = 1; 664 success = 1;
663 DIFF_MSG (i * flag, gain_msg[j], lose_msg[j]); 665 DIFF_MSG (i * flag, gain_msg[j], lose_msg[j]);
664 } 666 }
665 } 667 }
666 } 668 }
669
667 return success; 670 return success;
668} 671}
669 672
670/* 673/*
671 * Stat draining by Vick 930307 674 * Stat draining by Vick 930307
672 * (Feeling evil, I made it work as well now. -Frank 8) 675 * (Feeling evil, I made it work as well now. -Frank 8)
673 */ 676 */
674 677
675void 678void
676drain_stat (object *op) 679object::drain_stat ()
677{ 680{
678 drain_specific_stat (op, RANDOM () % NUM_STATS); 681 drain_specific_stat (RANDOM () % NUM_STATS);
679} 682}
680 683
681void 684void
682drain_specific_stat (object *op, int deplete_stats) 685object::drain_specific_stat (int deplete_stats)
683{ 686{
684 object *tmp; 687 object *tmp;
685 archetype *at; 688 archetype *at;
686 689
687 at = archetype::find (ARCH_DEPLETION); 690 at = archetype::find (ARCH_DEPLETION);
690 LOG (llevError, "Couldn't find archetype depletion.\n"); 693 LOG (llevError, "Couldn't find archetype depletion.\n");
691 return; 694 return;
692 } 695 }
693 else 696 else
694 { 697 {
695 tmp = present_arch_in_ob (at, op); 698 tmp = present_arch_in_ob (at, this);
699
696 if (!tmp) 700 if (!tmp)
697 { 701 {
698 tmp = arch_to_object (at); 702 tmp = arch_to_object (at);
699 tmp = insert_ob_in_ob (tmp, op); 703 tmp = insert_ob_in_ob (tmp, this);
700 SET_FLAG (tmp, FLAG_APPLIED); 704 SET_FLAG (tmp, FLAG_APPLIED);
701 } 705 }
702 } 706 }
703 707
704 new_draw_info (NDI_UNIQUE, 0, op, drain_msg[deplete_stats]); 708 new_draw_info (NDI_UNIQUE, 0, this, drain_msg[deplete_stats]);
705 change_attr_value (&tmp->stats, deplete_stats, -1); 709 change_attr_value (&tmp->stats, deplete_stats, -1);
706 fix_player (op); 710 update_stats ();
707} 711}
708 712
709/* 713/*
710 * A value of 0 indicates timeout, otherwise change the luck of the object. 714 * A value of 0 indicates timeout, otherwise change the luck of the object.
711 * via an applied bad_luck object. 715 * via an applied bad_luck object.
712 */ 716 */
713
714void 717void
715change_luck (object *op, int value) 718object::change_luck (int value)
716{ 719{
717 object *tmp;
718 archetype *at;
719 int new_luck;
720
721 at = archetype::find ("luck"); 720 archetype *at = archetype::find ("luck");
722 if (!at) 721 if (!at)
723 LOG (llevError, "Couldn't find archetype luck.\n"); 722 LOG (llevError, "Couldn't find archetype luck.\n");
724 else 723 else
725 { 724 {
726 tmp = present_arch_in_ob (at, op); 725 object *tmp = present_arch_in_ob (at, this);
726
727 if (!tmp) 727 if (!tmp)
728 { 728 {
729 if (!value) 729 if (!value)
730 return; 730 return;
731
731 tmp = arch_to_object (at); 732 tmp = arch_to_object (at);
732 tmp = insert_ob_in_ob (tmp, op); 733 tmp = insert_ob_in_ob (tmp, this);
733 SET_FLAG (tmp, FLAG_APPLIED); 734 SET_FLAG (tmp, FLAG_APPLIED);
734 } 735 }
736
735 if (value) 737 if (value)
736 { 738 {
737 /* Limit the luck value of the bad luck object to +/-100. This 739 /* Limit the luck value of the bad luck object to +/-100. This
738 * (arbitrary) value prevents overflows (both in the bad luck object and 740 * (arbitrary) value prevents overflows (both in the bad luck object and
739 * in op itself). 741 * in op itself).
740 */ 742 */
741 new_luck = tmp->stats.luck + value; 743 int new_luck = tmp->stats.luck + value;
744
742 if (new_luck >= -100 && new_luck <= 100) 745 if (new_luck >= -100 && new_luck <= 100)
743 { 746 {
744 op->stats.luck += value; 747 stats.luck += value;
745 tmp->stats.luck = new_luck; 748 tmp->stats.luck = new_luck;
746 } 749 }
747 } 750 }
748 else 751 else
749 { 752 {
750 if (!tmp->stats.luck) 753 if (!tmp->stats.luck)
751 {
752 return; 754 return;
753 } 755
754 /* Randomly change the players luck. Basically, we move it 756 /* Randomly change the players luck. Basically, we move it
755 * back neutral (if greater>0, subtract, otherwise add) 757 * back neutral (if greater>0, subtract, otherwise add)
756 */ 758 */
757 if (RANDOM () % (FABS (tmp->stats.luck)) >= RANDOM () % 30) 759 if (RANDOM () % (FABS (tmp->stats.luck)) >= RANDOM () % 30)
758 { 760 {
759 int diff = tmp->stats.luck > 0 ? -1 : 1; 761 int diff = tmp->stats.luck > 0 ? -1 : 1;
760 762
761 op->stats.luck += diff; 763 stats.luck += diff;
762 tmp->stats.luck += diff; 764 tmp->stats.luck += diff;
763 } 765 }
764 } 766 }
765 } 767 }
766} 768}
767 769
768/* 770/*
769 * Subtracts stat-bonuses given by the class which the player has chosen. 771 * Subtracts stat-bonuses given by the class which the player has chosen.
770 */ 772 */
771
772void 773void
773remove_statbonus (object *op) 774object::remove_statbonus ()
774{ 775{
775 op->stats.Str -= op->arch->clone.stats.Str; 776 stats.Str -= arch->clone.stats.Str;
776 op->stats.Dex -= op->arch->clone.stats.Dex; 777 stats.Dex -= arch->clone.stats.Dex;
777 op->stats.Con -= op->arch->clone.stats.Con; 778 stats.Con -= arch->clone.stats.Con;
778 op->stats.Wis -= op->arch->clone.stats.Wis; 779 stats.Wis -= arch->clone.stats.Wis;
779 op->stats.Pow -= op->arch->clone.stats.Pow; 780 stats.Pow -= arch->clone.stats.Pow;
780 op->stats.Cha -= op->arch->clone.stats.Cha; 781 stats.Cha -= arch->clone.stats.Cha;
781 op->stats.Int -= op->arch->clone.stats.Int; 782 stats.Int -= arch->clone.stats.Int;
783
782 op->contr->orig_stats.Str -= op->arch->clone.stats.Str; 784 contr->orig_stats.Str -= arch->clone.stats.Str;
783 op->contr->orig_stats.Dex -= op->arch->clone.stats.Dex; 785 contr->orig_stats.Dex -= arch->clone.stats.Dex;
784 op->contr->orig_stats.Con -= op->arch->clone.stats.Con; 786 contr->orig_stats.Con -= arch->clone.stats.Con;
785 op->contr->orig_stats.Wis -= op->arch->clone.stats.Wis; 787 contr->orig_stats.Wis -= arch->clone.stats.Wis;
786 op->contr->orig_stats.Pow -= op->arch->clone.stats.Pow; 788 contr->orig_stats.Pow -= arch->clone.stats.Pow;
787 op->contr->orig_stats.Cha -= op->arch->clone.stats.Cha; 789 contr->orig_stats.Cha -= arch->clone.stats.Cha;
788 op->contr->orig_stats.Int -= op->arch->clone.stats.Int; 790 contr->orig_stats.Int -= arch->clone.stats.Int;
789} 791}
790 792
791/* 793/*
792 * Adds stat-bonuses given by the class which the player has chosen. 794 * Adds stat-bonuses given by the class which the player has chosen.
793 */ 795 */
794
795void 796void
796add_statbonus (object *op) 797object::add_statbonus ()
797{ 798{
798 op->stats.Str += op->arch->clone.stats.Str; 799 stats.Str += arch->clone.stats.Str;
799 op->stats.Dex += op->arch->clone.stats.Dex; 800 stats.Dex += arch->clone.stats.Dex;
800 op->stats.Con += op->arch->clone.stats.Con; 801 stats.Con += arch->clone.stats.Con;
801 op->stats.Wis += op->arch->clone.stats.Wis; 802 stats.Wis += arch->clone.stats.Wis;
802 op->stats.Pow += op->arch->clone.stats.Pow; 803 stats.Pow += arch->clone.stats.Pow;
803 op->stats.Cha += op->arch->clone.stats.Cha; 804 stats.Cha += arch->clone.stats.Cha;
804 op->stats.Int += op->arch->clone.stats.Int; 805 stats.Int += arch->clone.stats.Int;
806
805 op->contr->orig_stats.Str += op->arch->clone.stats.Str; 807 contr->orig_stats.Str += arch->clone.stats.Str;
806 op->contr->orig_stats.Dex += op->arch->clone.stats.Dex; 808 contr->orig_stats.Dex += arch->clone.stats.Dex;
807 op->contr->orig_stats.Con += op->arch->clone.stats.Con; 809 contr->orig_stats.Con += arch->clone.stats.Con;
808 op->contr->orig_stats.Wis += op->arch->clone.stats.Wis; 810 contr->orig_stats.Wis += arch->clone.stats.Wis;
809 op->contr->orig_stats.Pow += op->arch->clone.stats.Pow; 811 contr->orig_stats.Pow += arch->clone.stats.Pow;
810 op->contr->orig_stats.Cha += op->arch->clone.stats.Cha; 812 contr->orig_stats.Cha += arch->clone.stats.Cha;
811 op->contr->orig_stats.Int += op->arch->clone.stats.Int; 813 contr->orig_stats.Int += arch->clone.stats.Int;
812} 814}
813 815
814/* 816/*
815 * Updates all abilities given by applied objects in the inventory 817 * Updates all abilities given by applied objects in the inventory
816 * of the given object. Note: This function works for both monsters 818 * of the given object. Note: This function works for both monsters
822/* July 95 - inserted stuff to handle new skills/exp system - b.t. 824/* July 95 - inserted stuff to handle new skills/exp system - b.t.
823 spell system split, grace points now added to system --peterm 825 spell system split, grace points now added to system --peterm
824 */ 826 */
825 827
826void 828void
827fix_player (object *op) 829object::update_stats ()
828{ 830{
829 int i, j; 831 int i, j;
830 float f, max = 9, added_speed = 0, bonus_speed = 0, sp_tmp, speed_reduce_from_disease = 1; 832 float f, max = 9, added_speed = 0, bonus_speed = 0, sp_tmp, speed_reduce_from_disease = 1;
831 int weapon_weight = 0, weapon_speed = 0; 833 int weapon_weight = 0, weapon_speed = 0;
832 int best_wc = 0, best_ac = 0, wc = 0, ac = 0; 834 int best_wc = 0, best_ac = 0, wc = 0, ac = 0;
833 int prot[NROFATTACKS], vuln[NROFATTACKS], potion_resist[NROFATTACKS]; 835 int prot[NROFATTACKS], vuln[NROFATTACKS], potion_resist[NROFATTACKS];
834 object *grace_obj = NULL, *mana_obj = NULL, *wc_obj = NULL, *tmp; 836 object *grace_obj = NULL, *mana_obj = NULL, *wc_obj = NULL, *tmp;
835 837
836 /* First task is to clear all the values back to their original values */ 838 /* First task is to clear all the values back to their original values */
837 if (op->type == PLAYER) 839 if (type == PLAYER)
838 { 840 {
839 for (i = 0; i < NUM_STATS; i++) 841 for (i = 0; i < NUM_STATS; i++)
840 {
841 set_attr_value (&(op->stats), i, get_attr_value (&(op->contr->orig_stats), i)); 842 set_attr_value (&(stats), i, get_attr_value (&(contr->orig_stats), i));
842 } 843
843 if (settings.spell_encumbrance == TRUE) 844 if (settings.spell_encumbrance == TRUE)
844 op->contr->encumbrance = 0; 845 contr->encumbrance = 0;
845 846
846 op->attacktype = 0; 847 attacktype = 0;
847 op->contr->digestion = 0; 848 contr->digestion = 0;
848 op->contr->gen_hp = 0; 849 contr->gen_hp = 0;
849 op->contr->gen_sp = 0; 850 contr->gen_sp = 0;
850 op->contr->gen_grace = 0; 851 contr->gen_grace = 0;
851 op->contr->gen_sp_armour = 10; 852 contr->gen_sp_armour = 10;
852 op->contr->item_power = 0; 853 contr->item_power = 0;
853 854
854 /* Don't clobber all the range_ values. range_golem otherwise 855 /* Don't clobber all the range_ values. range_golem otherwise
855 * gets reset for no good reason, and we don't want to reset 856 * gets reset for no good reason, and we don't want to reset
856 * range_magic (what spell is readied). These three below 857 * range_magic (what spell is readied). These three below
857 * well get filled in based on what the player has equipped. 858 * well get filled in based on what the player has equipped.
858 */ 859 */
859 op->contr->ranges[range_bow] = NULL; 860 contr->ranges[range_bow] = NULL;
860 op->contr->ranges[range_misc] = NULL; 861 contr->ranges[range_misc] = NULL;
861 op->contr->ranges[range_skill] = NULL; 862 contr->ranges[range_skill] = NULL;
862 } 863 }
864
863 memcpy (op->body_used, op->body_info, sizeof (op->body_info)); 865 memcpy (body_used, body_info, sizeof (body_info));
864 866
865 op->slaying = 0; 867 slaying = 0;
866 868
867 if (!QUERY_FLAG (op, FLAG_WIZ)) 869 if (!QUERY_FLAG (this, FLAG_WIZ))
868 { 870 {
869 CLEAR_FLAG (op, FLAG_XRAYS); 871 CLEAR_FLAG (this, FLAG_XRAYS);
870 CLEAR_FLAG (op, FLAG_MAKE_INVIS); 872 CLEAR_FLAG (this, FLAG_MAKE_INVIS);
871 } 873 }
872 874
873 CLEAR_FLAG (op, FLAG_LIFESAVE); 875 CLEAR_FLAG (this, FLAG_LIFESAVE);
874 CLEAR_FLAG (op, FLAG_STEALTH); 876 CLEAR_FLAG (this, FLAG_STEALTH);
875 CLEAR_FLAG (op, FLAG_BLIND); 877 CLEAR_FLAG (this, FLAG_BLIND);
876 if (!QUERY_FLAG (&op->arch->clone, FLAG_REFL_SPELL))
877 CLEAR_FLAG (op, FLAG_REFL_SPELL);
878 if (!QUERY_FLAG (&op->arch->clone, FLAG_REFL_MISSILE))
879 CLEAR_FLAG (op, FLAG_REFL_MISSILE);
880 if (!QUERY_FLAG (&op->arch->clone, FLAG_UNDEAD))
881 CLEAR_FLAG (op, FLAG_UNDEAD);
882 if (!QUERY_FLAG (&op->arch->clone, FLAG_SEE_IN_DARK))
883 CLEAR_FLAG (op, FLAG_SEE_IN_DARK);
884 878
879 if (!QUERY_FLAG (&arch->clone, FLAG_REFL_SPELL )) CLEAR_FLAG (this, FLAG_REFL_SPELL);
880 if (!QUERY_FLAG (&arch->clone, FLAG_REFL_MISSILE)) CLEAR_FLAG (this, FLAG_REFL_MISSILE);
881 if (!QUERY_FLAG (&arch->clone, FLAG_UNDEAD )) CLEAR_FLAG (this, FLAG_UNDEAD);
882 if (!QUERY_FLAG (&arch->clone, FLAG_SEE_IN_DARK )) CLEAR_FLAG (this, FLAG_SEE_IN_DARK);
883
885 op->path_attuned = op->arch->clone.path_attuned; 884 path_attuned = arch->clone.path_attuned;
886 op->path_repelled = op->arch->clone.path_repelled; 885 path_repelled = arch->clone.path_repelled;
887 op->path_denied = op->arch->clone.path_denied; 886 path_denied = arch->clone.path_denied;
888 op->glow_radius = op->arch->clone.glow_radius; 887 glow_radius = arch->clone.glow_radius;
889 op->move_type = op->arch->clone.move_type; 888 move_type = arch->clone.move_type;
890 op->chosen_skill = NULL; 889 chosen_skill = NULL;
891 890
892 /* initializing resistances from the values in player/monster's 891 /* initializing resistances from the values in player/monster's
893 * archetype clone 892 * archetype clone
894 */ 893 */
895 memcpy (&op->resist, &op->arch->clone.resist, sizeof (op->resist)); 894 memcpy (&resist, &arch->clone.resist, sizeof (resist));
896 895
897 for (i = 0; i < NROFATTACKS; i++) 896 for (i = 0; i < NROFATTACKS; i++)
898 { 897 {
899 if (op->resist[i] > 0) 898 if (resist[i] > 0)
900 prot[i] = op->resist[i], vuln[i] = 0; 899 prot[i] = resist[i], vuln[i] = 0;
901 else 900 else
902 vuln[i] = -(op->resist[i]), prot[i] = 0; 901 vuln[i] = -(resist[i]), prot[i] = 0;
903 potion_resist[i] = 0; 902 potion_resist[i] = 0;
904 } 903 }
905 904
906 wc = op->arch->clone.stats.wc; 905 wc = arch->clone.stats.wc;
907 op->stats.dam = op->arch->clone.stats.dam; 906 stats.dam = arch->clone.stats.dam;
908 907
909 /* for players which cannot use armour, they gain AC -1 per 3 levels, 908 /* for players which cannot use armour, they gain AC -1 per 3 levels,
910 * plus a small amount of physical resist, those poor suckers. ;) 909 * plus a small amount of physical resist, those poor suckers. ;)
911 * the fact that maxlevel is factored in could be considered sort of bogus - 910 * the fact that maxlevel is factored in could be considered sort of bogus -
912 * we should probably give them some bonus and cap it off - otherwise, 911 * we should probably give them some bonus and cap it off - otherwise,
913 * basically, if a server updates its max level, these playes may find 912 * basically, if a server updates its max level, these playes may find
914 * that their protection from physical goes down 913 * that their protection from physical goes down
915 */ 914 */
916 if (!QUERY_FLAG (op, FLAG_USE_ARMOUR) && op->type == PLAYER) 915 if (!QUERY_FLAG (this, FLAG_USE_ARMOUR) && type == PLAYER)
917 { 916 {
918 ac = MAX (-10, op->arch->clone.stats.ac - op->level / 3); 917 ac = MAX (-10, arch->clone.stats.ac - level / 3);
919 prot[ATNR_PHYSICAL] += ((100 - prot[AT_PHYSICAL]) * (80 * op->level / settings.max_level)) / 100; 918 prot[ATNR_PHYSICAL] += ((100 - prot[AT_PHYSICAL]) * (80 * level / settings.max_level)) / 100;
920 } 919 }
921 else 920 else
922 ac = op->arch->clone.stats.ac; 921 ac = arch->clone.stats.ac;
923 922
924 op->stats.luck = op->arch->clone.stats.luck; 923 stats.luck = arch->clone.stats.luck;
925 op->speed = op->arch->clone.speed; 924 speed = arch->clone.speed;
926 925
927 /* OK - we've reset most all the objects attributes to sane values. 926 /* OK - we've reset most all the objects attributes to sane values.
928 * now go through and make adjustments for what the player has equipped. 927 * now go through and make adjustments for what the player has equipped.
929 */ 928 */
930 929
931 for (tmp = op->inv; tmp != NULL; tmp = tmp->below) 930 for (tmp = inv; tmp; tmp = tmp->below)
932 { 931 {
933 /* See note in map.c:update_position about making this additive 932 /* See note in map.c:update_position about making this additive
934 * since light sources are never applied, need to put check here. 933 * since light sources are never applied, need to put check here.
935 */ 934 */
936 if (tmp->glow_radius > op->glow_radius) 935 if (tmp->glow_radius > glow_radius)
937 op->glow_radius = tmp->glow_radius; 936 glow_radius = tmp->glow_radius;
938 937
939 /* This happens because apply_potion calls change_abil with the potion 938 /* This happens because apply_potion calls change_abil with the potion
940 * applied so we can tell the player what chagned. But change_abil 939 * applied so we can tell the player what chagned. But change_abil
941 * then calls this function. 940 * then calls this function.
942 */ 941 */
943 if (QUERY_FLAG (tmp, FLAG_APPLIED) && tmp->type == POTION) 942 if (QUERY_FLAG (tmp, FLAG_APPLIED) && tmp->type == POTION)
944 {
945 continue; 943 continue;
946 }
947 944
948 /* For some things, we don't care what is equipped */ 945 /* For some things, we don't care what is equipped */
949 if (tmp->type == SKILL) 946 if (tmp->type == SKILL)
950 { 947 {
951 /* Want to take the highest skill here. */ 948 /* Want to take the highest skill here. */
954 if (!mana_obj) 951 if (!mana_obj)
955 mana_obj = tmp; 952 mana_obj = tmp;
956 else if (tmp->level > mana_obj->level) 953 else if (tmp->level > mana_obj->level)
957 mana_obj = tmp; 954 mana_obj = tmp;
958 } 955 }
956
959 if (IS_GRACE_SKILL (tmp->subtype)) 957 if (IS_GRACE_SKILL (tmp->subtype))
960 { 958 {
961 if (!grace_obj) 959 if (!grace_obj)
962 grace_obj = tmp; 960 grace_obj = tmp;
963 else if (tmp->level > grace_obj->level) 961 else if (tmp->level > grace_obj->level)
975 * up, etc. 973 * up, etc.
976 */ 974 */
977 if ((QUERY_FLAG (tmp, FLAG_APPLIED) && tmp->type != CONTAINER && tmp->type != CLOSE_CON) || 975 if ((QUERY_FLAG (tmp, FLAG_APPLIED) && tmp->type != CONTAINER && tmp->type != CLOSE_CON) ||
978 (tmp->type == SKILL && tmp->subtype == SK_PRAYING)) 976 (tmp->type == SKILL && tmp->subtype == SK_PRAYING))
979 { 977 {
980 if (op->type == PLAYER) 978 if (type == PLAYER)
981 { 979 {
982 if (tmp->type == BOW) 980 if (tmp->type == BOW)
983 op->contr->ranges[range_bow] = tmp; 981 contr->ranges[range_bow] = tmp;
984 982
985 if (tmp->type == WAND || tmp->type == ROD || tmp->type == HORN) 983 if (tmp->type == WAND || tmp->type == ROD || tmp->type == HORN)
986 op->contr->ranges[range_misc] = tmp; 984 contr->ranges[range_misc] = tmp;
987 985
988 for (i = 0; i < NUM_STATS; i++) 986 for (i = 0; i < NUM_STATS; i++)
989 change_attr_value (&(op->stats), i, get_attr_value (&(tmp->stats), i)); 987 change_attr_value (&(stats), i, get_attr_value (&(tmp->stats), i));
990 988
991 /* these are the items that currently can change digestion, regeneration, 989 /* these are the items that currently can change digestion, regeneration,
992 * spell point recovery and mana point recovery. Seems sort of an arbitary 990 * spell point recovery and mana point recovery. Seems sort of an arbitary
993 * list, but other items store other info into stats array. 991 * list, but other items store other info into stats array.
994 */ 992 */
995 if ((tmp->type == EXPERIENCE) || (tmp->type == WEAPON) || 993 if ((tmp->type == WEAPON) ||
996 (tmp->type == ARMOUR) || (tmp->type == HELMET) || 994 (tmp->type == ARMOUR) || (tmp->type == HELMET) ||
997 (tmp->type == SHIELD) || (tmp->type == RING) || 995 (tmp->type == SHIELD) || (tmp->type == RING) ||
998 (tmp->type == BOOTS) || (tmp->type == GLOVES) || 996 (tmp->type == BOOTS) || (tmp->type == GLOVES) ||
999 (tmp->type == AMULET) || (tmp->type == GIRDLE) || 997 (tmp->type == AMULET) || (tmp->type == GIRDLE) ||
1000 (tmp->type == BRACERS) || (tmp->type == CLOAK) || (tmp->type == DISEASE) || (tmp->type == FORCE) || (tmp->type == SKILL)) 998 (tmp->type == BRACERS) || (tmp->type == CLOAK) ||
999 (tmp->type == DISEASE) || (tmp->type == FORCE) ||
1000 (tmp->type == SKILL))
1001 { 1001 {
1002 op->contr->digestion += tmp->stats.food; 1002 contr->digestion += tmp->stats.food;
1003 op->contr->gen_hp += tmp->stats.hp; 1003 contr->gen_hp += tmp->stats.hp;
1004 op->contr->gen_sp += tmp->stats.sp; 1004 contr->gen_sp += tmp->stats.sp;
1005 op->contr->gen_grace += tmp->stats.grace; 1005 contr->gen_grace += tmp->stats.grace;
1006 op->contr->gen_sp_armour += tmp->gen_sp_armour; 1006 contr->gen_sp_armour += tmp->gen_sp_armour;
1007 op->contr->item_power += tmp->item_power; 1007 contr->item_power += tmp->item_power;
1008 } 1008 }
1009 } /* if this is a player */ 1009 } /* if this is a player */
1010 1010
1011 /* Update slots used for items */ 1011 /* Update slots used for items */
1012 if (QUERY_FLAG (tmp, FLAG_APPLIED)) 1012 if (QUERY_FLAG (tmp, FLAG_APPLIED))
1013 {
1014 for (i = 0; i < NUM_BODY_LOCATIONS; i++) 1013 for (i = 0; i < NUM_BODY_LOCATIONS; i++)
1015 op->body_used[i] += tmp->body_info[i]; 1014 body_used[i] += tmp->body_info[i];
1016 }
1017 1015
1018 if (tmp->type == SYMPTOM) 1016 if (tmp->type == SYMPTOM)
1019 { 1017 {
1020 speed_reduce_from_disease = tmp->last_sp / 100.0; 1018 speed_reduce_from_disease = tmp->last_sp / 100.0;
1021 if (speed_reduce_from_disease == 0) 1019 if (speed_reduce_from_disease == 0)
1048 } 1046 }
1049 } 1047 }
1050 1048
1051 /* There may be other things that should not adjust the attacktype */ 1049 /* There may be other things that should not adjust the attacktype */
1052 if (tmp->type != BOW && tmp->type != SYMPTOM) 1050 if (tmp->type != BOW && tmp->type != SYMPTOM)
1053 op->attacktype |= tmp->attacktype; 1051 attacktype |= tmp->attacktype;
1054 1052
1055 op->path_attuned |= tmp->path_attuned; 1053 path_attuned |= tmp->path_attuned;
1056 op->path_repelled |= tmp->path_repelled; 1054 path_repelled |= tmp->path_repelled;
1057 op->path_denied |= tmp->path_denied; 1055 path_denied |= tmp->path_denied;
1058 op->stats.luck += tmp->stats.luck; 1056 stats.luck += tmp->stats.luck;
1059 op->move_type |= tmp->move_type; 1057 move_type |= tmp->move_type;
1060 1058
1061 if (QUERY_FLAG (tmp, FLAG_LIFESAVE)) 1059 if (QUERY_FLAG (tmp, FLAG_LIFESAVE )) SET_FLAG (this, FLAG_LIFESAVE);
1062 SET_FLAG (op, FLAG_LIFESAVE); 1060 if (QUERY_FLAG (tmp, FLAG_REFL_SPELL )) SET_FLAG (this, FLAG_REFL_SPELL);
1063 if (QUERY_FLAG (tmp, FLAG_REFL_SPELL)) 1061 if (QUERY_FLAG (tmp, FLAG_REFL_MISSILE)) SET_FLAG (this, FLAG_REFL_MISSILE);
1064 SET_FLAG (op, FLAG_REFL_SPELL); 1062 if (QUERY_FLAG (tmp, FLAG_STEALTH )) SET_FLAG (this, FLAG_STEALTH);
1065 if (QUERY_FLAG (tmp, FLAG_REFL_MISSILE)) 1063 if (QUERY_FLAG (tmp, FLAG_XRAYS )) SET_FLAG (this, FLAG_XRAYS);
1066 SET_FLAG (op, FLAG_REFL_MISSILE); 1064 if (QUERY_FLAG (tmp, FLAG_BLIND )) SET_FLAG (this, FLAG_BLIND);
1067 if (QUERY_FLAG (tmp, FLAG_STEALTH)) 1065 if (QUERY_FLAG (tmp, FLAG_SEE_IN_DARK )) SET_FLAG (this, FLAG_SEE_IN_DARK);
1068 SET_FLAG (op, FLAG_STEALTH);
1069 if (QUERY_FLAG (tmp, FLAG_XRAYS))
1070 SET_FLAG (op, FLAG_XRAYS);
1071 if (QUERY_FLAG (tmp, FLAG_BLIND))
1072 SET_FLAG (op, FLAG_BLIND);
1073 if (QUERY_FLAG (tmp, FLAG_SEE_IN_DARK))
1074 SET_FLAG (op, FLAG_SEE_IN_DARK);
1075 1066
1076 if (QUERY_FLAG (tmp, FLAG_UNDEAD) && !QUERY_FLAG (&op->arch->clone, FLAG_UNDEAD)) 1067 if (QUERY_FLAG (tmp, FLAG_UNDEAD) && !QUERY_FLAG (&arch->clone, FLAG_UNDEAD))
1077 SET_FLAG (op, FLAG_UNDEAD); 1068 SET_FLAG (this, FLAG_UNDEAD);
1078 1069
1079 if (QUERY_FLAG (tmp, FLAG_MAKE_INVIS)) 1070 if (QUERY_FLAG (tmp, FLAG_MAKE_INVIS))
1080 { 1071 {
1081 SET_FLAG (op, FLAG_MAKE_INVIS); 1072 SET_FLAG (this, FLAG_MAKE_INVIS);
1082 op->invisible = 1; 1073 invisible = 1;
1083 } 1074 }
1084 1075
1085 if (tmp->stats.exp && tmp->type != SKILL) 1076 if (tmp->stats.exp && tmp->type != SKILL)
1086 { 1077 {
1087 if (tmp->stats.exp > 0) 1078 if (tmp->stats.exp > 0)
1102 break; 1093 break;
1103 1094
1104 if (IS_COMBAT_SKILL (tmp->subtype)) 1095 if (IS_COMBAT_SKILL (tmp->subtype))
1105 wc_obj = tmp; 1096 wc_obj = tmp;
1106 1097
1107 if (op->chosen_skill) 1098 if (chosen_skill)
1108 LOG (llevDebug, "fix_player, op %s has multiple skills applied\n", &op->name); 1099 LOG (llevDebug, "fix_player, op %s has multiple skills applied\n", &name);
1109 1100
1110 op->chosen_skill = tmp; 1101 chosen_skill = tmp;
1111 1102
1112 if (tmp->stats.dam > 0) 1103 if (tmp->stats.dam > 0)
1113 { /* skill is a 'weapon' */ 1104 { /* skill is a 'weapon' */
1114 if (!QUERY_FLAG (op, FLAG_READY_WEAPON)) 1105 if (!QUERY_FLAG (this, FLAG_READY_WEAPON))
1115 weapon_speed = (int) WEAPON_SPEED (tmp); 1106 weapon_speed = (int) WEAPON_SPEED (tmp);
1107
1116 if (weapon_speed < 0) 1108 if (weapon_speed < 0)
1117 weapon_speed = 0; 1109 weapon_speed = 0;
1110
1118 weapon_weight = tmp->weight; 1111 weapon_weight = tmp->weight;
1119 op->stats.dam += tmp->stats.dam * (1 + (op->chosen_skill->level / 9)); 1112 stats.dam += tmp->stats.dam * (1 + (chosen_skill->level / 9));
1113
1120 if (tmp->magic) 1114 if (tmp->magic)
1121 op->stats.dam += tmp->magic; 1115 stats.dam += tmp->magic;
1122 } 1116 }
1123 1117
1124 if (tmp->stats.wc) 1118 if (tmp->stats.wc)
1125 wc -= (tmp->stats.wc + tmp->magic); 1119 wc -= (tmp->stats.wc + tmp->magic);
1126 1120
1127 if (tmp->slaying != NULL) 1121 if (tmp->slaying != NULL)
1128 op->slaying = tmp->slaying; 1122 slaying = tmp->slaying;
1129 1123
1130 if (tmp->stats.ac) 1124 if (tmp->stats.ac)
1131 ac -= (tmp->stats.ac + tmp->magic); 1125 ac -= (tmp->stats.ac + tmp->magic);
1126
1132 if (settings.spell_encumbrance == TRUE && op->type == PLAYER) 1127 if (settings.spell_encumbrance == TRUE && type == PLAYER)
1133 op->contr->encumbrance += (int) 3 *tmp->weight / 1000; 1128 contr->encumbrance += (int) 3 *tmp->weight / 1000;
1134 1129
1135 if (op->type == PLAYER) 1130 if (type == PLAYER)
1136 op->contr->ranges[range_skill] = op; 1131 contr->ranges[range_skill] = this;
1132
1137 break; 1133 break;
1138 1134
1139 case SKILL_TOOL: 1135 case SKILL_TOOL:
1140 if (op->chosen_skill) 1136 if (chosen_skill)
1141 {
1142 LOG (llevDebug, "fix_player, op %s has multiple skills applied\n", &op->name); 1137 LOG (llevDebug, "fix_player, op %s has multiple skills applied\n", &name);
1143 } 1138
1144 op->chosen_skill = tmp; 1139 chosen_skill = tmp;
1140
1145 if (op->type == PLAYER) 1141 if (type == PLAYER)
1146 op->contr->ranges[range_skill] = op; 1142 contr->ranges[range_skill] = this;
1147 break; 1143 break;
1148 1144
1149 case SHIELD: 1145 case SHIELD:
1150 if (settings.spell_encumbrance == TRUE && op->type == PLAYER) 1146 if (settings.spell_encumbrance == TRUE && type == PLAYER)
1151 op->contr->encumbrance += (int) tmp->weight / 2000; 1147 contr->encumbrance += (int) tmp->weight / 2000;
1152 case RING: 1148 case RING:
1153 case AMULET: 1149 case AMULET:
1154 case GIRDLE: 1150 case GIRDLE:
1155 case HELMET: 1151 case HELMET:
1156 case BOOTS: 1152 case BOOTS:
1157 case GLOVES: 1153 case GLOVES:
1158 case CLOAK: 1154 case CLOAK:
1159 if (tmp->stats.wc) 1155 if (tmp->stats.wc)
1160 wc -= (tmp->stats.wc + tmp->magic); 1156 wc -= (tmp->stats.wc + tmp->magic);
1157
1161 if (tmp->stats.dam) 1158 if (tmp->stats.dam)
1162 op->stats.dam += (tmp->stats.dam + tmp->magic); 1159 stats.dam += (tmp->stats.dam + tmp->magic);
1160
1163 if (tmp->stats.ac) 1161 if (tmp->stats.ac)
1164 ac -= (tmp->stats.ac + tmp->magic); 1162 ac -= (tmp->stats.ac + tmp->magic);
1163
1165 break; 1164 break;
1166 1165
1167 case WEAPON: 1166 case WEAPON:
1168 wc -= (tmp->stats.wc + tmp->magic); 1167 wc -= (tmp->stats.wc + tmp->magic);
1168
1169 if (tmp->stats.ac && tmp->stats.ac + tmp->magic > 0) 1169 if (tmp->stats.ac && tmp->stats.ac + tmp->magic > 0)
1170 ac -= tmp->stats.ac + tmp->magic; 1170 ac -= tmp->stats.ac + tmp->magic;
1171
1171 op->stats.dam += (tmp->stats.dam + tmp->magic); 1172 stats.dam += (tmp->stats.dam + tmp->magic);
1172 weapon_weight = tmp->weight; 1173 weapon_weight = tmp->weight;
1173 weapon_speed = ((int) WEAPON_SPEED (tmp) * 2 - tmp->magic) / 2; 1174 weapon_speed = ((int) WEAPON_SPEED (tmp) * 2 - tmp->magic) / 2;
1175
1174 if (weapon_speed < 0) 1176 if (weapon_speed < 0)
1175 weapon_speed = 0; 1177 weapon_speed = 0;
1178
1176 op->slaying = tmp->slaying; 1179 slaying = tmp->slaying;
1177 /* If there is desire that two handed weapons should do 1180 /* If there is desire that two handed weapons should do
1178 * extra strength damage, this is where the code should 1181 * extra strength damage, this is where the code should
1179 * go. 1182 * go.
1180 */ 1183 */
1181 op->current_weapon = tmp; 1184 current_weapon = tmp;
1182 if (settings.spell_encumbrance == TRUE && op->type == PLAYER) 1185 if (settings.spell_encumbrance == TRUE && type == PLAYER)
1183 op->contr->encumbrance += (int) 3 *tmp->weight / 1000; 1186 contr->encumbrance += (int) 3 *tmp->weight / 1000;
1184 1187
1185 break; 1188 break;
1186 1189
1187 case ARMOUR: /* Only the best of these three are used: */ 1190 case ARMOUR: /* Only the best of these three are used: */
1188 if (settings.spell_encumbrance == TRUE && op->type == PLAYER) 1191 if (settings.spell_encumbrance == TRUE && type == PLAYER)
1189 op->contr->encumbrance += (int) tmp->weight / 1000; 1192 contr->encumbrance += (int) tmp->weight / 1000;
1190 1193
1191 case BRACERS: 1194 case BRACERS:
1192 case FORCE: 1195 case FORCE:
1193 if (tmp->stats.wc) 1196 if (tmp->stats.wc)
1194 { 1197 {
1198 best_wc = tmp->stats.wc + tmp->magic; 1201 best_wc = tmp->stats.wc + tmp->magic;
1199 } 1202 }
1200 else 1203 else
1201 wc += tmp->stats.wc + tmp->magic; 1204 wc += tmp->stats.wc + tmp->magic;
1202 } 1205 }
1206
1203 if (tmp->stats.ac) 1207 if (tmp->stats.ac)
1204 { 1208 {
1205 if (best_ac < tmp->stats.ac + tmp->magic) 1209 if (best_ac < tmp->stats.ac + tmp->magic)
1206 { 1210 {
1207 ac += best_ac; /* Remove last bonus */ 1211 ac += best_ac; /* Remove last bonus */
1208 best_ac = tmp->stats.ac + tmp->magic; 1212 best_ac = tmp->stats.ac + tmp->magic;
1209 } 1213 }
1210 else /* To nullify the below effect */ 1214 else /* To nullify the below effect */
1211 ac += tmp->stats.ac + tmp->magic; 1215 ac += tmp->stats.ac + tmp->magic;
1212 } 1216 }
1217
1213 if (tmp->stats.wc) 1218 if (tmp->stats.wc)
1214 wc -= (tmp->stats.wc + tmp->magic); 1219 wc -= (tmp->stats.wc + tmp->magic);
1220
1215 if (tmp->stats.ac) 1221 if (tmp->stats.ac)
1216 ac -= (tmp->stats.ac + tmp->magic); 1222 ac -= (tmp->stats.ac + tmp->magic);
1223
1217 if (ARMOUR_SPEED (tmp) && ARMOUR_SPEED (tmp) / 10.0 < max) 1224 if (ARMOUR_SPEED (tmp) && ARMOUR_SPEED (tmp) / 10.0 < max)
1218 max = ARMOUR_SPEED (tmp) / 10.0; 1225 max = ARMOUR_SPEED (tmp) / 10.0;
1226
1219 break; 1227 break;
1220 } /* switch tmp->type */ 1228 } /* switch tmp->type */
1221 } /* item is equipped */ 1229 } /* item is equipped */
1222 } /* for loop of items */ 1230 } /* for loop of items */
1223 1231
1231 * If there is a cursed (and no uncursed) potion in effect, we take 1239 * If there is a cursed (and no uncursed) potion in effect, we take
1232 * 'total resistance = vulnerability from cursed potion'. 1240 * 'total resistance = vulnerability from cursed potion'.
1233 */ 1241 */
1234 for (i = 0; i < NROFATTACKS; i++) 1242 for (i = 0; i < NROFATTACKS; i++)
1235 { 1243 {
1236 op->resist[i] = prot[i] - vuln[i]; 1244 resist[i] = prot[i] - vuln[i];
1245
1237 if (potion_resist[i] && ((potion_resist[i] > op->resist[i]) || (potion_resist[i] < 0))) 1246 if (potion_resist[i] && ((potion_resist[i] > resist[i]) || (potion_resist[i] < 0)))
1238 op->resist[i] = potion_resist[i]; 1247 resist[i] = potion_resist[i];
1239 } 1248 }
1240 1249
1241 /* Figure out the players sp/mana/hp totals. */ 1250 /* Figure out the players sp/mana/hp totals. */
1242 if (op->type == PLAYER) 1251 if (type == PLAYER)
1243 { 1252 {
1244 int pl_level; 1253 int pl_level;
1245 1254
1246 check_stat_bounds (&(op->stats)); 1255 check_stat_bounds (&(stats));
1247 pl_level = op->level; 1256 pl_level = level;
1248 1257
1249 if (pl_level < 1) 1258 if (pl_level < 1)
1250 pl_level = 1; /* safety, we should always get 1 levels worth of hp! */ 1259 pl_level = 1; /* safety, we should always get 1 levels worth of hp! */
1251 1260
1252 /* You basically get half a con bonus/level. But we do take into account rounding, 1261 /* You basically get half a con bonus/level. But we do take into account rounding,
1253 * so if your bonus is 7, you still get 7 worth of bonus every 2 levels. 1262 * so if your bonus is 7, you still get 7 worth of bonus every 2 levels.
1254 */ 1263 */
1255 for (i = 1, op->stats.maxhp = 0; i <= pl_level && i <= 10; i++) 1264 for (i = 1, stats.maxhp = 0; i <= pl_level && i <= 10; i++)
1256 { 1265 {
1257 j = op->contr->levhp[i] + con_bonus[op->stats.Con] / 2; 1266 j = contr->levhp[i] + con_bonus[stats.Con] / 2;
1267
1258 if (i % 2 && con_bonus[op->stats.Con] % 2) 1268 if (i % 2 && con_bonus[stats.Con] % 2)
1259 { 1269 {
1260 if (con_bonus[op->stats.Con] > 0) 1270 if (con_bonus[stats.Con] > 0)
1261 j++; 1271 j++;
1262 else 1272 else
1263 j--; 1273 j--;
1264 } 1274 }
1275
1265 op->stats.maxhp += j > 1 ? j : 1; /* always get at least 1 hp/level */ 1276 stats.maxhp += j > 1 ? j : 1; /* always get at least 1 hp/level */
1266 } 1277 }
1267 1278
1268 for (i = 11; i <= op->level; i++) 1279 for (i = 11; i <= level; i++)
1269 op->stats.maxhp += 2; 1280 stats.maxhp += 2;
1270 1281
1271 if (op->stats.hp > op->stats.maxhp) 1282 if (stats.hp > stats.maxhp)
1272 op->stats.hp = op->stats.maxhp; 1283 stats.hp = stats.maxhp;
1273 1284
1274 /* Sp gain is controlled by the level of the player's 1285 /* Sp gain is controlled by the level of the player's
1275 * relevant experience object (mana_obj, see above) 1286 * relevant experience object (mana_obj, see above)
1276 */ 1287 */
1277 /* following happen when skills system is not used */ 1288 /* following happen when skills system is not used */
1278 if (!mana_obj) 1289 if (!mana_obj)
1279 mana_obj = op; 1290 mana_obj = this;
1291
1280 if (!grace_obj) 1292 if (!grace_obj)
1281 grace_obj = op; 1293 grace_obj = this;
1294
1282 /* set maxsp */ 1295 /* set maxsp */
1283 if (!mana_obj || !mana_obj->level || op->type != PLAYER) 1296 if (!mana_obj || !mana_obj->level || type != PLAYER)
1284 mana_obj = op; 1297 mana_obj = this;
1285 1298
1286 if (mana_obj == op && op->type == PLAYER) 1299 if (mana_obj == this && type == PLAYER)
1287 {
1288 op->stats.maxsp = 1; 1300 stats.maxsp = 1;
1289 }
1290 else 1301 else
1291 { 1302 {
1292 sp_tmp = 0.0; 1303 sp_tmp = 0.0;
1304
1293 for (i = 1; i <= mana_obj->level && i <= 10; i++) 1305 for (i = 1; i <= mana_obj->level && i <= 10; i++)
1294 { 1306 {
1295 float stmp; 1307 float stmp;
1296 1308
1297 /* Got some extra bonus at first level */ 1309 /* Got some extra bonus at first level */
1298 if (i < 2) 1310 if (i < 2)
1299 {
1300 stmp = op->contr->levsp[i] + ((2.0 * (float) sp_bonus[op->stats.Pow] + (float) sp_bonus[op->stats.Int]) / 6.0); 1311 stmp = contr->levsp[i] + ((2.0 * (float) sp_bonus[stats.Pow] + (float) sp_bonus[stats.Int]) / 6.0);
1301 }
1302 else 1312 else
1303 {
1304 stmp = (float) op->contr->levsp[i] + (2.0 * (float) sp_bonus[op->stats.Pow] + (float) sp_bonus[op->stats.Int]) / 12.0; 1313 stmp = (float) contr->levsp[i] + (2.0 * (float) sp_bonus[stats.Pow] + (float) sp_bonus[stats.Int]) / 12.0;
1305 } 1314
1306 if (stmp < 1.0) 1315 if (stmp < 1.0)
1307 stmp = 1.0; 1316 stmp = 1.0;
1317
1308 sp_tmp += stmp; 1318 sp_tmp += stmp;
1309 } 1319 }
1320
1310 op->stats.maxsp = (int) sp_tmp; 1321 stats.maxsp = (int) sp_tmp;
1311 1322
1312 for (i = 11; i <= mana_obj->level; i++) 1323 for (i = 11; i <= mana_obj->level; i++)
1313 op->stats.maxsp += 2; 1324 stats.maxsp += 2;
1314 } 1325 }
1315 /* Characters can get their sp supercharged via rune of transferrance */ 1326 /* Characters can get their sp supercharged via rune of transferrance */
1316 if (op->stats.sp > op->stats.maxsp * 2) 1327 if (stats.sp > stats.maxsp * 2)
1317 op->stats.sp = op->stats.maxsp * 2; 1328 stats.sp = stats.maxsp * 2;
1318 1329
1319 /* set maxgrace, notice 3-4 lines below it depends on both Wis and Pow */ 1330 /* set maxgrace, notice 3-4 lines below it depends on both Wis and Pow */
1320 if (!grace_obj || !grace_obj->level || op->type != PLAYER) 1331 if (!grace_obj || !grace_obj->level || type != PLAYER)
1321 grace_obj = op; 1332 grace_obj = this;
1322 1333
1323 if (grace_obj == op && op->type == PLAYER) 1334 if (grace_obj == this && type == PLAYER)
1324 {
1325 op->stats.maxgrace = 1; 1335 stats.maxgrace = 1;
1326 }
1327 else 1336 else
1328 { 1337 {
1329 /* store grace in a float - this way, the divisions below don't create 1338 /* store grace in a float - this way, the divisions below don't create
1330 * big jumps when you go from level to level - with int's, it then 1339 * big jumps when you go from level to level - with int's, it then
1331 * becomes big jumps when the sums of the bonuses jump to the next 1340 * becomes big jumps when the sums of the bonuses jump to the next
1332 * step of 8 - with floats, even fractional ones are useful. 1341 * step of 8 - with floats, even fractional ones are useful.
1333 */ 1342 */
1334 sp_tmp = 0.0; 1343 sp_tmp = 0.0;
1335 for (i = 1, op->stats.maxgrace = 0; i <= grace_obj->level && i <= 10; i++) 1344 for (i = 1, stats.maxgrace = 0; i <= grace_obj->level && i <= 10; i++)
1336 { 1345 {
1337 float grace_tmp = 0.0; 1346 float grace_tmp = 0.0;
1338 1347
1339 /* Got some extra bonus at first level */ 1348 /* Got some extra bonus at first level */
1340 if (i < 2) 1349 if (i < 2)
1341 {
1342 grace_tmp = op->contr->levgrace[i] + (((float) grace_bonus[op->stats.Pow] + 1350 grace_tmp = contr->levgrace[i] + (((float) grace_bonus[stats.Pow] +
1343 2.0 * (float) grace_bonus[op->stats.Wis]) / 6.0); 1351 2.0 * (float) grace_bonus[stats.Wis]) / 6.0);
1344 }
1345 else 1352 else
1346 {
1347 grace_tmp = (float) op->contr->levgrace[i] 1353 grace_tmp = (float) contr->levgrace[i]
1348 + ((float) grace_bonus[op->stats.Pow] + 2.0 * (float) grace_bonus[op->stats.Wis]) / 12.0; 1354 + ((float) grace_bonus[stats.Pow] + 2.0 * (float) grace_bonus[stats.Wis]) / 12.0;
1349 } 1355
1350 if (grace_tmp < 1.0) 1356 if (grace_tmp < 1.0)
1351 grace_tmp = 1.0; 1357 grace_tmp = 1.0;
1358
1352 sp_tmp += grace_tmp; 1359 sp_tmp += grace_tmp;
1353 } 1360 }
1361
1354 op->stats.maxgrace = (int) sp_tmp; 1362 stats.maxgrace = (int) sp_tmp;
1355 1363
1356 /* two grace points per level after 11 */ 1364 /* two grace points per level after 11 */
1357 for (i = 11; i <= grace_obj->level; i++) 1365 for (i = 11; i <= grace_obj->level; i++)
1358 op->stats.maxgrace += 2; 1366 stats.maxgrace += 2;
1359 } 1367 }
1360 /* No limit on grace vs maxgrace */ 1368 /* No limit on grace vs maxgrace */
1361 1369
1362 if (op->contr->braced) 1370 if (contr->braced)
1363 { 1371 {
1364 ac += 2; 1372 ac += 2;
1365 wc += 4; 1373 wc += 4;
1366 } 1374 }
1367 else 1375 else
1368 ac -= dex_bonus[op->stats.Dex]; 1376 ac -= dex_bonus[stats.Dex];
1369 1377
1370 /* In new exp/skills system, wc bonuses are related to 1378 /* In new exp/skills system, wc bonuses are related to
1371 * the players level in a relevant exp object (wc_obj) 1379 * the players level in a relevant exp object (wc_obj)
1372 * not the general player level -b.t. 1380 * not the general player level -b.t.
1373 * I changed this slightly so that wc bonuses are better 1381 * I changed this slightly so that wc bonuses are better
1377 * we give the player a bonus here in wc and dam 1385 * we give the player a bonus here in wc and dam
1378 * to make up for the change. Note that I left the 1386 * to make up for the change. Note that I left the
1379 * monster bonus the same as before. -b.t. 1387 * monster bonus the same as before. -b.t.
1380 */ 1388 */
1381 1389
1382 if (op->type == PLAYER && wc_obj && wc_obj->level > 1) 1390 if (type == PLAYER && wc_obj && wc_obj->level > 1)
1383 { 1391 {
1384 wc -= (wc_obj->level + thaco_bonus[op->stats.Str]); 1392 wc -= (wc_obj->level + thaco_bonus[stats.Str]);
1385 for (i = 1; i < wc_obj->level; i++) 1393 for (i = 1; i < wc_obj->level; i++)
1386 { 1394 {
1387 /* addtional wc every 6 levels */ 1395 /* addtional wc every 6 levels */
1388 if (!(i % 6)) 1396 if (!(i % 6))
1389 wc--; 1397 wc--;
1390 /* addtional dam every 4 levels. */ 1398 /* addtional dam every 4 levels. */
1391 if (!(i % 4) && (dam_bonus[op->stats.Str] >= 0)) 1399 if (!(i % 4) && (dam_bonus[stats.Str] >= 0))
1392 op->stats.dam += (1 + (dam_bonus[op->stats.Str] / 5)); 1400 stats.dam += (1 + (dam_bonus[stats.Str] / 5));
1393 } 1401 }
1394 } 1402 }
1395 else 1403 else
1396 wc -= (op->level + thaco_bonus[op->stats.Str]); 1404 wc -= (level + thaco_bonus[stats.Str]);
1397 1405
1398 op->stats.dam += dam_bonus[op->stats.Str]; 1406 stats.dam += dam_bonus[stats.Str];
1399 1407
1400 if (op->stats.dam < 1) 1408 if (stats.dam < 1)
1401 op->stats.dam = 1; 1409 stats.dam = 1;
1402 1410
1403 op->speed = 1.0 + speed_bonus[op->stats.Dex]; 1411 speed = 1.0 + speed_bonus[stats.Dex];
1412
1404 if (settings.search_items && op->contr->search_str[0]) 1413 if (settings.search_items && contr->search_str[0])
1405 op->speed -= 1; 1414 speed -= 1;
1415
1406 if (op->attacktype == 0) 1416 if (attacktype == 0)
1407 op->attacktype = op->arch->clone.attacktype; 1417 attacktype = arch->clone.attacktype;
1408 1418
1409 } /* End if player */ 1419 } /* End if player */
1410 1420
1411 if (added_speed >= 0) 1421 if (added_speed >= 0)
1412 op->speed += added_speed / 10.0; 1422 speed += added_speed / 10.0;
1413 else /* Something wrong here...: */ 1423 else /* Something wrong here...: */
1414 op->speed /= (float) (1.0 - added_speed); 1424 speed /= (float) (1.0 - added_speed);
1415 1425
1416 /* Max is determined by armour */ 1426 /* Max is determined by armour */
1417 if (op->speed > max) 1427 if (speed > max)
1418 op->speed = max; 1428 speed = max;
1419 1429
1420 if (op->type == PLAYER) 1430 if (type == PLAYER)
1421 { 1431 {
1422 /* f is a number the represents the number of kg above (positive num) 1432 /* f is a number the represents the number of kg above (positive num)
1423 * or below (negative number) that the player is carrying. If above 1433 * or below (negative number) that the player is carrying. If above
1424 * weight limit, then player suffers a speed reduction based on how 1434 * weight limit, then player suffers a speed reduction based on how
1425 * much above he is, and what is max carry is 1435 * much above he is, and what is max carry is
1426 */ 1436 */
1427 f = (op->carrying / 1000) - max_carry[op->stats.Str]; 1437 f = (carrying / 1000) - max_carry[stats.Str];
1428 if (f > 0) 1438 if (f > 0)
1429 op->speed = op->speed / (1.0 + f / max_carry[op->stats.Str]); 1439 speed = speed / (1.0 + f / max_carry[stats.Str]);
1430 } 1440 }
1431 1441
1432 op->speed += bonus_speed / 10.0; /* Not affected by limits */ 1442 speed += bonus_speed / 10.0; /* Not affected by limits */
1433 1443
1434 /* Put a lower limit on speed. Note with this speed, you move once every 1444 /* Put a lower limit on speed. Note with this speed, you move once every
1435 * 100 ticks or so. This amounts to once every 12 seconds of realtime. 1445 * 100 ticks or so. This amounts to once every 12 seconds of realtime.
1436 */ 1446 */
1437 op->speed = op->speed * speed_reduce_from_disease; 1447 speed = speed * speed_reduce_from_disease;
1438 1448
1439 if (op->speed < 0.01 && op->type == PLAYER) 1449 if (speed < 0.01 && type == PLAYER)
1440 op->speed = 0.01; 1450 speed = 0.01;
1441 1451
1442 if (op->type == PLAYER) 1452 if (type == PLAYER)
1443 { 1453 {
1444 float M, W, s, D, K, S, M2; 1454 float M, W, s, D, K, S, M2;
1445 1455
1446 /* (This formula was made by vidarl@ifi.uio.no) 1456 /* (This formula was made by vidarl@ifi.uio.no)
1447 * Note that we never used these values again - basically 1457 * Note that we never used these values again - basically
1448 * all of these could be subbed into one big equation, but 1458 * all of these could be subbed into one big equation, but
1449 * that would just be a real pain to read. 1459 * that would just be a real pain to read.
1450 */ 1460 */
1451 M = (max_carry[op->stats.Str] - 121) / 121.0; 1461 M = (max_carry[stats.Str] - 121) / 121.0;
1452 M2 = max_carry[op->stats.Str] / 100.0; 1462 M2 = max_carry[stats.Str] / 100.0;
1453 W = weapon_weight / 20000.0; 1463 W = weapon_weight / 20000.0;
1454 s = 2 - weapon_speed / 10.0; 1464 s = 2 - weapon_speed / 10.0;
1455 D = (op->stats.Dex - 14) / 14.0; 1465 D = (stats.Dex - 14) / 14.0;
1456 K = 1 + M / 3.0 - W / (3 * M2) + op->speed / 5.0 + D / 2.0; 1466 K = 1 + M / 3.0 - W / (3 * M2) + speed / 5.0 + D / 2.0;
1457 K *= (4 + op->level) / (float) (6 + op->level) * 1.2; 1467 K *= (4 + level) / (float) (6 + level) * 1.2;
1458 if (K <= 0) 1468 if (K <= 0)
1459 K = 0.01; 1469 K = 0.01;
1460 S = op->speed / (K * s); 1470 S = speed / (K * s);
1461 op->contr->weapon_sp = S; 1471 contr->weapon_sp = S;
1462 } 1472 }
1473
1463 /* I want to limit the power of small monsters with big weapons: */ 1474 /* I want to limit the power of small monsters with big weapons: */
1464 if (op->type != PLAYER && op->arch != NULL && op->stats.dam > op->arch->clone.stats.dam * 3) 1475 if (type != PLAYER && arch != NULL && stats.dam > arch->clone.stats.dam * 3)
1465 op->stats.dam = op->arch->clone.stats.dam * 3; 1476 stats.dam = arch->clone.stats.dam * 3;
1466 1477
1467 /* Prevent overflows of wc - best you can get is ABS(120) - this 1478 /* Prevent overflows of wc - best you can get is ABS(120) - this
1468 * should be more than enough - remember, AC is also in 8 bits, 1479 * should be more than enough - remember, AC is also in 8 bits,
1469 * so its value is the same. 1480 * so its value is the same.
1470 */ 1481 */
1471 if (wc > 120) 1482 if (wc > 120)
1472 wc = 120; 1483 wc = 120;
1473 else if (wc < -120) 1484 else if (wc < -120)
1474 wc = -120; 1485 wc = -120;
1486
1475 op->stats.wc = wc; 1487 stats.wc = wc;
1476 1488
1477 if (ac > 120) 1489 if (ac > 120)
1478 ac = 120; 1490 ac = 120;
1479 else if (ac < -120) 1491 else if (ac < -120)
1480 ac = -120; 1492 ac = -120;
1493
1481 op->stats.ac = ac; 1494 stats.ac = ac;
1482 1495
1483 /* if for some reason the creature doesn't have any move type, 1496 /* if for some reason the creature doesn't have any move type,
1484 * give them walking as a default. 1497 * give them walking as a default.
1485 * The second case is a special case - to more closely mimic the 1498 * The second case is a special case - to more closely mimic the
1486 * old behaviour - if your flying, your not walking - just 1499 * old behaviour - if your flying, your not walking - just
1487 * one or the other. 1500 * one or the other.
1488 */ 1501 */
1489 if (op->move_type == 0) 1502 if (move_type == 0)
1490 op->move_type = MOVE_WALK; 1503 move_type = MOVE_WALK;
1491 else if (op->move_type & (MOVE_FLY_LOW | MOVE_FLY_HIGH)) 1504 else if (move_type & (MOVE_FLY_LOW | MOVE_FLY_HIGH))
1492 op->move_type &= ~MOVE_WALK; 1505 move_type &= ~MOVE_WALK;
1493 1506
1494 update_ob_speed (op); 1507 update_ob_speed (this);
1495 1508
1496 /* It is quite possible that a player's spell costing might have changed, 1509 /* It is quite possible that a player's spell costing might have changed,
1497 * so we will check that now. 1510 * so we will check that now.
1498 */ 1511 */
1499 if (op->type == PLAYER) 1512 if (type == PLAYER)
1513 {
1514 esrv_update_stats (contr);
1500 esrv_update_spells (op->contr); 1515 esrv_update_spells (contr);
1516 }
1501} 1517}
1502 1518
1503/* 1519/*
1504 * Returns true if the given player is a legal class. 1520 * Returns true if the given player is a legal class.
1505 * The function to add and remove class-bonuses to the stats doesn't 1521 * The function to add and remove class-bonuses to the stats doesn't
1506 * check if the stat becomes negative, thus this function 1522 * check if the stat becomes negative, thus this function
1507 * merely checks that all stats are 1 or more, and returns 1523 * merely checks that all stats are 1 or more, and returns
1508 * false otherwise. 1524 * false otherwise.
1509 */ 1525 */
1510
1511int 1526int
1512allowed_class (const object *op) 1527allowed_class (const object *op)
1513{ 1528{
1514 return op->stats.Dex > 0 && op->stats.Str > 0 && op->stats.Con > 0 && 1529 return op->stats.Dex > 0 && op->stats.Str > 0 && op->stats.Con > 0 &&
1515 op->stats.Int > 0 && op->stats.Wis > 0 && op->stats.Pow > 0 && op->stats.Cha > 0; 1530 op->stats.Int > 0 && op->stats.Wis > 0 && op->stats.Pow > 0 && op->stats.Cha > 0;
1700 who->contr->levhp[who->level] = die_roll (2, 4, who, PREFER_HIGH) + 1; 1715 who->contr->levhp[who->level] = die_roll (2, 4, who, PREFER_HIGH) + 1;
1701 who->contr->levsp[who->level] = die_roll (2, 3, who, PREFER_HIGH); 1716 who->contr->levsp[who->level] = die_roll (2, 3, who, PREFER_HIGH);
1702 who->contr->levgrace[who->level] = die_roll (2, 2, who, PREFER_HIGH) - 1; 1717 who->contr->levgrace[who->level] = die_roll (2, 2, who, PREFER_HIGH) - 1;
1703 } 1718 }
1704 1719
1705 fix_player (who); 1720 who->update_stats ();
1706 if (op->level > 1) 1721 if (op->level > 1)
1707 { 1722 {
1708 if (op->type != PLAYER) 1723 if (op->type != PLAYER)
1709 sprintf (buf, "You are now level %d in the %s skill.", op->level, &op->name); 1724 sprintf (buf, "You are now level %d in the %s skill.", op->level, &op->name);
1710 else 1725 else
1715 player_lvl_adj (who, op); /* To increase more levels */ 1730 player_lvl_adj (who, op); /* To increase more levels */
1716 } 1731 }
1717 else if (op->level > 1 && op->stats.exp < level_exp (op->level, who->expmul)) 1732 else if (op->level > 1 && op->stats.exp < level_exp (op->level, who->expmul))
1718 { 1733 {
1719 op->level--; 1734 op->level--;
1720 fix_player (who); 1735 who->update_stats ();
1721 if (op->type != PLAYER) 1736 if (op->type != PLAYER)
1722 { 1737 {
1723 sprintf (buf, "You are now level %d in the %s skill.", op->level, &op->name); 1738 sprintf (buf, "You are now level %d in the %s skill.", op->level, &op->name);
1724 new_draw_info (NDI_UNIQUE | NDI_RED, 0, who, buf); 1739 new_draw_info (NDI_UNIQUE | NDI_RED, 0, who, buf);
1725 } 1740 }
1726 player_lvl_adj (who, op); /* To decrease more levels */ 1741 player_lvl_adj (who, op); /* To decrease more levels */
1727 } 1742 }
1743
1728 /* check if the spell data has changed */ 1744 /* check if the spell data has changed */
1745 esrv_update_stats (who->contr);
1729 esrv_update_spells (who->contr); 1746 esrv_update_spells (who->contr);
1730} 1747}
1731 1748
1732/* 1749/*
1733 * Returns how much experience is needed for a player to become 1750 * Returns how much experience is needed for a player to become
1767 op->perm_exp = 0; 1784 op->perm_exp = 0;
1768 else if (op->perm_exp > (sint64) MAX_EXPERIENCE) 1785 else if (op->perm_exp > (sint64) MAX_EXPERIENCE)
1769 op->perm_exp = MAX_EXPERIENCE; 1786 op->perm_exp = MAX_EXPERIENCE;
1770} 1787}
1771 1788
1772
1773/* Add experience to a player - exp should only be positive. 1789/* Add experience to a player - exp should only be positive.
1774 * Updates permanent exp for the skill we are adding to. 1790 * Updates permanent exp for the skill we are adding to.
1775 * skill_name is the skill to add exp to. Skill name can be 1791 * skill_name is the skill to add exp to. Skill name can be
1776 * NULL, in which case exp increases the players general 1792 * NULL, in which case exp increases the players general
1777 * total, but not any particular skill. 1793 * total, but not any particular skill.
1778 * flag is what to do if the player doesn't have the skill: 1794 * flag is what to do if the player doesn't have the skill:
1779 */ 1795 */
1780
1781static void 1796static void
1782add_player_exp (object *op, sint64 exp, const char *skill_name, int flag) 1797add_player_exp (object *op, sint64 exp, const char *skill_name, int flag)
1783{ 1798{
1784 object *skill_obj = NULL; 1799 object *skill_obj = NULL;
1785 sint64 limit, exp_to_add; 1800 sint64 limit, exp_to_add;
1955void 1970void
1956change_exp (object *op, sint64 exp, const char *skill_name, int flag) 1971change_exp (object *op, sint64 exp, const char *skill_name, int flag)
1957{ 1972{
1958 1973
1959#ifdef EXP_DEBUG 1974#ifdef EXP_DEBUG
1960# ifndef WIN32
1961 LOG (llevDebug, "change_exp() called for %s, exp = %lld\n", query_name (op), exp);
1962# else
1963 LOG (llevDebug, "change_exp() called for %s, exp = %I64d\n", query_name (op), exp); 1975 LOG (llevDebug, "change_exp() called for %s, exp = %" PRId64 "\n", query_name (op), exp);
1964# endif
1965#endif 1976#endif
1966 1977
1967 /* safety */ 1978 /* safety */
1968 if (!op) 1979 if (!op)
1969 { 1980 {
2072 if (level > MAX_SAVE_LEVEL) 2083 if (level > MAX_SAVE_LEVEL)
2073 level = MAX_SAVE_LEVEL; 2084 level = MAX_SAVE_LEVEL;
2074 2085
2075 if ((random_roll (1, 20, op, PREFER_HIGH) + bonus) < savethrow[level]) 2086 if ((random_roll (1, 20, op, PREFER_HIGH) + bonus) < savethrow[level])
2076 return 0; 2087 return 0;
2088
2077 return 1; 2089 return 1;
2078} 2090}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines