1 | |
1 | |
2 | /* |
2 | /* |
3 | * static char *rcs_treasure_c = |
3 | * static char *rcs_treasure_c = |
4 | * "$Id: treasure.c,v 1.1.1.1 2006/02/03 07:11:41 root Exp $"; |
4 | * "$Id: treasure.c,v 1.3.2.3 2006/08/10 19:33:32 elmex Exp $"; |
5 | */ |
5 | */ |
6 | |
6 | |
7 | /* |
7 | /* |
8 | CrossFire, A Multiplayer game for X-windows |
8 | CrossFire, A Multiplayer game for X-windows |
9 | |
9 | |
… | |
… | |
155 | |
155 | |
156 | #ifdef TREASURE_DEBUG |
156 | #ifdef TREASURE_DEBUG |
157 | /* recursived checks the linked list. Treasurelist is passed only |
157 | /* recursived checks the linked list. Treasurelist is passed only |
158 | * so that the treasure name can be printed out |
158 | * so that the treasure name can be printed out |
159 | */ |
159 | */ |
160 | static void check_treasurelist(treasure *t, treasurelist *tl) |
160 | static void check_treasurelist(const treasure *t, const treasurelist *tl) |
161 | { |
161 | { |
162 | if (t->item==NULL && t->name==NULL) |
162 | if (t->item==NULL && t->name==NULL) |
163 | LOG(llevError,"Treasurelist %s has element with no name or archetype\n", tl->name); |
163 | LOG(llevError,"Treasurelist %s has element with no name or archetype\n", tl->name); |
164 | if (t->chance>=100 && t->next_yes && (t->next || t->next_no)) |
164 | if (t->chance>=100 && t->next_yes && (t->next || t->next_no)) |
165 | LOG(llevError,"Treasurelist %s has element that has 100%% generation, next_yes field as well as next or next_no\n", |
165 | LOG(llevError,"Treasurelist %s has element that has 100%% generation, next_yes field as well as next or next_no\n", |
… | |
… | |
220 | #endif |
220 | #endif |
221 | tl->total_chance += t->chance; |
221 | tl->total_chance += t->chance; |
222 | } |
222 | } |
223 | } |
223 | } |
224 | } else |
224 | } else |
225 | LOG(llevError,"Treasure-list didn't understand: %s, line %d\n",buf, line); |
225 | LOG(llevError,"Treasure-list %s didn't understand: %s, line %d\n", filename, buf, line); |
226 | } |
226 | } |
227 | close_and_delete(fp, comp); |
227 | close_and_delete(fp, comp); |
228 | |
228 | |
229 | #ifdef TREASURE_DEBUG |
229 | #ifdef TREASURE_DEBUG |
230 | /* Perform some checks on how valid the treasure data actually is. |
230 | /* Perform some checks on how valid the treasure data actually is. |
… | |
… | |
331 | |
331 | |
332 | |
332 | |
333 | if((int)t->chance >= 100 || (RANDOM()%100 + 1) < (int) t->chance) { |
333 | if((int)t->chance >= 100 || (RANDOM()%100 + 1) < (int) t->chance) { |
334 | if (t->name) { |
334 | if (t->name) { |
335 | if (strcmp(t->name,"NONE") && difficulty>=t->magic) |
335 | if (strcmp(t->name,"NONE") && difficulty>=t->magic) |
|
|
336 | { |
336 | create_treasure(find_treasurelist(t->name), op, flag, difficulty, tries); |
337 | create_treasure(find_treasurelist(t->name), op, flag, difficulty, tries); |
|
|
338 | } |
337 | } |
339 | } |
338 | else { |
340 | else { |
339 | if(t->item->clone.invisible != 0 || ! (flag & GT_INVISIBLE)) { |
341 | if(t->item->clone.invisible != 0 || ! (flag & GT_INVISIBLE)) { |
340 | tmp=arch_to_object(t->item); |
342 | tmp=arch_to_object(t->item); |
341 | if(t->nrof&&tmp->nrof<=1) |
343 | if(t->nrof&&tmp->nrof<=1) |
… | |
… | |
478 | { 0, 0, 0, 0,100}, /*30*/ |
480 | { 0, 0, 0, 0,100}, /*30*/ |
479 | { 0, 0, 0, 0,100}, /*31*/ |
481 | { 0, 0, 0, 0,100}, /*31*/ |
480 | }; |
482 | }; |
481 | |
483 | |
482 | |
484 | |
483 | /* calculate the appropriate level for wands staves and scrolls. If |
485 | /* calculate the appropriate level for wands staves and scrolls. |
484 | * retmult is 1, return the multiplier, not the level, for computing value |
|
|
485 | * This code presumes that op has had its spell object created (in op->inv) |
486 | * This code presumes that op has had its spell object created (in op->inv) |
486 | */ |
487 | * |
|
|
488 | * elmex Wed Aug 9 17:44:59 CEST 2006: |
|
|
489 | * Removed multiplicator, too many high-level items were generated on low-difficulty maps. |
|
|
490 | */ |
487 | |
491 | |
488 | int level_for_item(object *op, int difficulty, int retmult) |
492 | int level_for_item (const object *op, int difficulty) |
489 | { |
493 | { |
490 | int level, mult, olevel; |
494 | int mult = 0, olevel = 0; |
491 | |
495 | |
492 | mult = 0; |
|
|
493 | if (!op->inv) { |
496 | if (!op->inv) |
|
|
497 | { |
494 | LOG(llevError,"level_for_item: Object %s has no inventory!\n", op->name); |
498 | LOG(llevError,"level_for_item: Object %s has no inventory!\n", op->name); |
495 | return 0; |
499 | return 0; |
496 | } |
500 | } |
497 | level = op->inv->level; |
|
|
498 | |
501 | |
499 | /* Basically, we set mult to the lowest spell increase attribute that is |
502 | olevel = op->inv->level + (double) difficulty * (1 - drand48 () * drand48 () * 2); |
500 | * not zero - zero's mean no modification is done, so we don't want those. |
|
|
501 | * given we want non zero results, we can't just use a few MIN's here. |
|
|
502 | */ |
|
|
503 | mult = op->inv->dam_modifier; |
|
|
504 | if (op->inv->range_modifier && (op->inv->range_modifier<mult || mult == 0)) |
|
|
505 | mult = op->inv->range_modifier; |
|
|
506 | if (op->inv->duration_modifier && (op->inv->duration_modifier < mult || mult==0)) |
|
|
507 | mult = op->inv->duration_modifier; |
|
|
508 | |
503 | |
509 | if (mult == 0) |
504 | if (olevel <= 0) |
510 | mult = 5; |
505 | olevel = rndm (1, MIN (op->inv->level, 1)); |
511 | |
506 | |
512 | if (retmult) |
507 | if (olevel > MAXLEVEL) |
513 | return mult; |
508 | olevel = MAXLEVEL; |
514 | |
509 | |
515 | olevel = mult * rndm(0, difficulty) + level; |
|
|
516 | if (olevel > MAXLEVEL) olevel = MAXLEVEL; |
|
|
517 | |
|
|
518 | return olevel; |
510 | return olevel; |
519 | } |
511 | } |
520 | |
512 | |
521 | /* |
513 | /* |
522 | * Based upon the specified difficulty and upon the difftomagic_list array, |
514 | * Based upon the specified difficulty and upon the difftomagic_list array, |
523 | * a random magical bonus is returned. This is used when determine |
515 | * a random magical bonus is returned. This is used when determine |
524 | * the magical bonus created on specific maps. |
516 | * the magical bonus created on specific maps. |
|
|
517 | * |
|
|
518 | * elmex Thu Aug 10 18:45:44 CEST 2006: |
|
|
519 | * Scaling difficulty by max_level, as difficulty is a level and not some |
|
|
520 | * weird integer between 1-31. |
|
|
521 | * |
525 | */ |
522 | */ |
526 | |
523 | |
527 | int magic_from_difficulty(int difficulty) |
524 | int magic_from_difficulty(int difficulty) |
528 | { |
525 | { |
529 | int percent,loop; |
526 | int percent = 0, magic = 0; |
|
|
527 | int scaled_diff = ((double) difficulty / settings.max_level) * DIFFLEVELS; |
530 | |
528 | |
531 | difficulty--; |
529 | scaled_diff--; |
532 | if(difficulty<0) |
|
|
533 | difficulty=0; |
|
|
534 | |
530 | |
|
|
531 | if(scaled_diff < 0) |
|
|
532 | scaled_diff = 0; |
|
|
533 | |
535 | if (difficulty>=DIFFLEVELS) |
534 | if (scaled_diff >= DIFFLEVELS) |
536 | difficulty=DIFFLEVELS-1; |
535 | scaled_diff = DIFFLEVELS-1; |
537 | |
536 | |
538 | percent = RANDOM()%100; |
537 | percent = RANDOM()%100; |
539 | |
538 | |
540 | for(loop=0;loop<(MAXMAGIC+1);++loop) { |
539 | for(magic = 0; magic < (MAXMAGIC + 1); magic++) |
|
|
540 | { |
541 | percent -= difftomagic_list[difficulty][loop]; |
541 | percent -= difftomagic_list[scaled_diff][magic]; |
|
|
542 | |
542 | if (percent<0) |
543 | if (percent < 0) |
543 | break; |
544 | break; |
544 | } |
545 | } |
545 | if (loop==(MAXMAGIC+1)) { |
546 | |
|
|
547 | if (magic == (MAXMAGIC + 1)) |
|
|
548 | { |
546 | LOG(llevError,"Warning, table for difficulty %d bad.\n",difficulty); |
549 | LOG(llevError,"Warning, table for difficulty (scaled %d) %d bad.\n", scaled_diff, difficulty); |
547 | loop=0; |
550 | magic = 0; |
548 | } |
551 | } |
|
|
552 | |
|
|
553 | magic = (RANDOM() % 3) ? magic : -magic; |
|
|
554 | |
549 | /* LOG(llevDebug, "Chose magic %d for difficulty %d\n", loop, difficulty);*/ |
555 | /* LOG(llevDebug, "Chose magic %d for difficulty (scaled %d) %d\n", magic, scaled_diff, difficulty); */ |
550 | return (RANDOM()%3)?loop:-loop; |
556 | |
|
|
557 | return magic; |
551 | } |
558 | } |
552 | |
559 | |
553 | /* |
560 | /* |
554 | * Sets magical bonus in an object, and recalculates the effect on |
561 | * Sets magical bonus in an object, and recalculates the effect on |
555 | * the armour variable, and the effect on speed of armour. |
562 | * the armour variable, and the effect on speed of armour. |
… | |
… | |
755 | * value. |
762 | * value. |
756 | * GT_MINIMAL: Does minimal processing on the object - just enough to make it |
763 | * GT_MINIMAL: Does minimal processing on the object - just enough to make it |
757 | * a working object - don't change magic, value, etc, but set it material |
764 | * a working object - don't change magic, value, etc, but set it material |
758 | * type as appropriate, for objects that need spell objects, set those, etc |
765 | * type as appropriate, for objects that need spell objects, set those, etc |
759 | */ |
766 | */ |
|
|
767 | |
760 | void fix_generated_item (object *op, object *creator, int difficulty, |
768 | void fix_generated_item (object * op, object * creator, int difficulty, |
761 | int max_magic, int flags) |
769 | int max_magic, int flags) |
762 | { |
770 | { |
763 | int was_magic = op->magic, num_enchantments=0, save_item_power; |
771 | int was_magic = op->magic, num_enchantments = 0, save_item_power = 0; |
764 | |
772 | |
765 | if(!creator||creator->type==op->type) creator=op; /*safety & to prevent polymorphed |
773 | if (!creator || creator->type == op->type) |
766 | * objects giving attributes */ |
774 | creator = op; /*safety & to prevent polymorphed objects giving attributes */ |
767 | |
775 | |
768 | /* If we make an artifact, this information will be destroyed */ |
776 | /* If we make an artifact, this information will be destroyed */ |
769 | save_item_power = op->item_power; |
777 | save_item_power = op->item_power; |
770 | op->item_power = 0; |
778 | op->item_power = 0; |
771 | |
779 | |
772 | if (op->randomitems && op->type != SPELL) { |
780 | if (op->randomitems && op->type != SPELL) |
|
|
781 | { |
773 | create_treasure(op->randomitems, op,flags ,difficulty, 0); |
782 | create_treasure (op->randomitems, op, flags, difficulty, 0); |
774 | if (!op->inv) LOG(llevDebug,"fix_generated_item: Unable to generate treasure for %s\n", |
783 | if (!op->inv) |
775 | op->name); |
784 | LOG (llevDebug, |
|
|
785 | "fix_generated_item: Unable to generate treasure for %s\n", |
|
|
786 | op->name); |
|
|
787 | |
776 | /* So the treasure doesn't get created again */ |
788 | /* So the treasure doesn't get created again */ |
777 | op->randomitems = NULL; |
789 | op->randomitems = NULL; |
778 | } |
790 | } |
779 | |
791 | |
780 | if (difficulty<1) difficulty=1; |
792 | if (difficulty < 1) |
|
|
793 | difficulty = 1; |
|
|
794 | |
781 | if (!(flags & GT_MINIMAL)) { |
795 | if (!(flags & GT_MINIMAL)) |
|
|
796 | { |
782 | if (op->arch == crown_arch) { |
797 | if (op->arch == crown_arch) |
|
|
798 | { |
783 | set_magic(difficulty>25?30:difficulty+5, op, max_magic, flags); |
799 | set_magic (difficulty, op, max_magic, flags); |
784 | num_enchantments = calc_item_power(op, 1); |
800 | num_enchantments = calc_item_power (op, 1); |
785 | generate_artifact(op,difficulty); |
801 | generate_artifact (op, difficulty); |
786 | } else { |
802 | } |
|
|
803 | else |
|
|
804 | { |
787 | if(!op->magic && max_magic) |
805 | if (!op->magic && max_magic) |
788 | set_magic(difficulty,op,max_magic, flags); |
806 | set_magic (difficulty, op, max_magic, flags); |
|
|
807 | |
789 | num_enchantments = calc_item_power(op, 1); |
808 | num_enchantments = calc_item_power (op, 1); |
|
|
809 | |
790 | if ((!was_magic && !(RANDOM()%CHANCE_FOR_ARTIFACT)) || op->type == HORN || |
810 | if ((!was_magic && !(RANDOM () % CHANCE_FOR_ARTIFACT)) |
791 | difficulty >= 999 ) |
811 | || op->type == HORN |
|
|
812 | || difficulty >= settings.max_level) /* high difficulties always generate an artifact, |
|
|
813 | * used for shop_floors or treasures */ |
792 | generate_artifact(op, difficulty); |
814 | generate_artifact (op, difficulty); |
793 | } |
815 | } |
794 | |
816 | |
795 | /* Object was made an artifact. Calculate its item_power rating. |
817 | /* Object was made an artifact. Calculate its item_power rating. |
796 | * the item_power in the object is what the artfiact adds. |
818 | * the item_power in the object is what the artfiact adds. |
797 | */ |
819 | */ |
798 | if (op->title) { |
820 | if (op->title) |
|
|
821 | { |
799 | /* if save_item_power is set, then most likely we started with an |
822 | /* if save_item_power is set, then most likely we started with an |
800 | * artifact and have added new abilities to it - this is rare, but |
823 | * artifact and have added new abilities to it - this is rare, but |
801 | * but I have seen things like 'strange rings of fire'. So just figure |
824 | * but I have seen things like 'strange rings of fire'. So just figure |
802 | * out the power from the base power plus what this one adds. Note |
825 | * out the power from the base power plus what this one adds. Note |
803 | * that since item_power is not quite linear, this actually ends up |
826 | * that since item_power is not quite linear, this actually ends up |
804 | * being somewhat of a bonus |
827 | * being somewhat of a bonus |
805 | */ |
828 | */ |
806 | if (save_item_power) { |
829 | if (save_item_power) |
|
|
830 | op->item_power = |
807 | op->item_power = save_item_power + get_power_from_ench(op->item_power); |
831 | save_item_power + get_power_from_ench (op->item_power); |
808 | } else { |
832 | else |
|
|
833 | op->item_power = |
809 | op->item_power = get_power_from_ench(op->item_power + num_enchantments); |
834 | get_power_from_ench (op->item_power + num_enchantments); |
810 | } |
835 | } |
811 | } else if (save_item_power) { |
836 | else if (save_item_power) |
|
|
837 | { |
812 | /* restore the item_power field to the object if we haven't changed it. |
838 | /* restore the item_power field to the object if we haven't changed it. |
813 | * we don't care about num_enchantments - that will basically just |
839 | * we don't care about num_enchantments - that will basically just |
814 | * have calculated some value from the base attributes of the archetype. |
840 | * have calculated some value from the base attributes of the archetype. |
815 | */ |
841 | */ |
816 | op->item_power = save_item_power; |
842 | op->item_power = save_item_power; |
817 | } |
843 | } |
818 | } |
844 | } |
819 | |
845 | |
820 | /* materialtype modifications. Note we allow this on artifacts. */ |
846 | /* materialtype modifications. Note we allow this on artifacts. */ |
821 | |
|
|
822 | set_materialname(op, difficulty, NULL); |
847 | set_materialname (op, difficulty, NULL); |
823 | |
848 | |
824 | if (flags & GT_MINIMAL) { |
849 | if (flags & GT_MINIMAL) |
|
|
850 | { |
825 | if (op->type == POTION) |
851 | if (op->type == POTION) |
826 | /* Handle healing and magic power potions */ |
852 | /* Handle healing and magic power potions */ |
827 | if (op->stats.sp && !op->randomitems) { |
853 | if (op->stats.sp && !op->randomitems) |
828 | object *tmp; |
854 | { |
|
|
855 | object *tmp; |
829 | |
856 | |
830 | tmp = get_archetype(spell_mapping[op->stats.sp]); |
857 | tmp = get_archetype (spell_mapping[op->stats.sp]); |
831 | insert_ob_in_ob(tmp, op); |
858 | insert_ob_in_ob (tmp, op); |
832 | op->stats.sp=0; |
859 | op->stats.sp = 0; |
|
|
860 | } |
833 | } |
861 | } |
834 | } |
|
|
835 | else if (!op->title) /* Only modify object if not special */ |
862 | else if (!op->title) /* Only modify object if not special */ |
836 | switch(op->type) { |
863 | switch (op->type) |
|
|
864 | { |
837 | case WEAPON: |
865 | case WEAPON: |
838 | case ARMOUR: |
866 | case ARMOUR: |
839 | case SHIELD: |
867 | case SHIELD: |
840 | case HELMET: |
868 | case HELMET: |
841 | case CLOAK: |
869 | case CLOAK: |
842 | if (QUERY_FLAG(op, FLAG_CURSED) && !(RANDOM()%4)) |
870 | if (QUERY_FLAG (op, FLAG_CURSED) && !(RANDOM () % 4)) |
843 | set_ring_bonus(op, -DICE2); |
871 | set_ring_bonus (op, -DICE2); |
844 | break; |
872 | break; |
845 | |
873 | |
846 | case BRACERS: |
874 | case BRACERS: |
847 | if (!(RANDOM()%(QUERY_FLAG(op, FLAG_CURSED)?5:20))) { |
875 | if (!(RANDOM () % (QUERY_FLAG (op, FLAG_CURSED) ? 5 : 20))) |
|
|
876 | { |
848 | set_ring_bonus(op,QUERY_FLAG(op, FLAG_CURSED)?-DICE2:DICE2); |
877 | set_ring_bonus (op, QUERY_FLAG (op, FLAG_CURSED) ? -DICE2 : DICE2); |
849 | if (!QUERY_FLAG(op, FLAG_CURSED)) |
878 | if (!QUERY_FLAG (op, FLAG_CURSED)) |
850 | op->value*=3; |
879 | op->value *= 3; |
851 | } |
880 | } |
852 | break; |
881 | break; |
853 | |
882 | |
854 | case POTION: { |
883 | case POTION: |
|
|
884 | { |
855 | int too_many_tries=0,is_special=0; |
885 | int too_many_tries = 0, is_special = 0; |
856 | |
886 | |
857 | /* Handle healing and magic power potions */ |
887 | /* Handle healing and magic power potions */ |
858 | if (op->stats.sp && !op->randomitems) { |
888 | if (op->stats.sp && !op->randomitems) |
859 | object *tmp; |
889 | { |
|
|
890 | object *tmp; |
860 | |
891 | |
861 | tmp = get_archetype(spell_mapping[op->stats.sp]); |
892 | tmp = get_archetype (spell_mapping[op->stats.sp]); |
862 | insert_ob_in_ob(tmp, op); |
893 | insert_ob_in_ob (tmp, op); |
863 | op->stats.sp=0; |
894 | op->stats.sp = 0; |
864 | } |
895 | } |
865 | |
896 | |
866 | while(!(is_special=special_potion(op)) && !op->inv) { |
897 | while (!(is_special = special_potion (op)) && !op->inv) |
|
|
898 | { |
867 | generate_artifact(op,difficulty); |
899 | generate_artifact (op, difficulty); |
868 | if(too_many_tries++ > 10) break; |
900 | if (too_many_tries++ > 10) |
869 | } |
901 | break; |
|
|
902 | } |
|
|
903 | |
870 | /* don't want to change value for healing/magic power potions, |
904 | /* don't want to change value for healing/magic power potions, |
871 | * since the value set on those is already correct. |
905 | * since the value set on those is already correct. |
872 | */ |
906 | */ |
873 | if (op->inv && op->randomitems) { |
907 | if (op->inv && op->randomitems) |
|
|
908 | { |
874 | /* value multiplier is same as for scrolls */ |
909 | /* value multiplier is same as for scrolls */ |
875 | op->value=(op->value*op->inv->value); |
910 | op->value = (op->value * op->inv->value); |
876 | op->level = op->inv->level/2+ RANDOM()%difficulty + RANDOM()%difficulty; |
911 | op->level = |
877 | } else { |
912 | op->inv->level / 2 + RANDOM () % difficulty |
|
|
913 | + RANDOM () % difficulty; |
|
|
914 | } |
|
|
915 | else |
|
|
916 | { |
878 | FREE_AND_COPY(op->name, "potion"); |
917 | FREE_AND_COPY (op->name, "potion"); |
879 | FREE_AND_COPY(op->name_pl, "potions"); |
918 | FREE_AND_COPY (op->name_pl, "potions"); |
880 | } |
919 | } |
881 | if ( ! (flags & GT_ONLY_GOOD) && RANDOM() % 2) |
920 | if (!(flags & GT_ONLY_GOOD) && RANDOM () % 2) |
882 | SET_FLAG(op, FLAG_CURSED); |
921 | SET_FLAG (op, FLAG_CURSED); |
883 | break; |
922 | break; |
884 | } |
923 | } |
885 | |
924 | |
886 | case AMULET: |
925 | case AMULET: |
887 | if(op->arch==amulet_arch) |
926 | if (op->arch == amulet_arch) |
888 | op->value*=5; /* Since it's not just decoration */ |
927 | op->value *= 5; /* Since it's not just decoration */ |
889 | |
928 | |
890 | case RING: |
929 | case RING: |
891 | if(op->arch==NULL) { |
930 | if (op->arch == NULL) |
|
|
931 | { |
892 | remove_ob(op); |
932 | remove_ob (op); |
893 | free_object(op); |
933 | free_object (op); |
894 | op=NULL; |
934 | op = NULL; |
895 | break; |
935 | break; |
896 | } |
936 | } |
|
|
937 | |
897 | if(op->arch!=ring_arch&&op->arch!=amulet_arch) /* It's a special artifact!*/ |
938 | if (op->arch != ring_arch && op->arch != amulet_arch) /* It's a special artifact! */ |
898 | break; |
939 | break; |
899 | |
940 | |
900 | if ( ! (flags & GT_ONLY_GOOD) && ! (RANDOM() % 3)) |
941 | if (!(flags & GT_ONLY_GOOD) && !(RANDOM () % 3)) |
901 | SET_FLAG(op, FLAG_CURSED); |
942 | SET_FLAG (op, FLAG_CURSED); |
|
|
943 | |
902 | set_ring_bonus(op,QUERY_FLAG(op, FLAG_CURSED)?-DICE2:DICE2); |
944 | set_ring_bonus (op, QUERY_FLAG (op, FLAG_CURSED) ? -DICE2 : DICE2); |
|
|
945 | |
903 | if(op->type!=RING) /* Amulets have only one ability */ |
946 | if (op->type != RING) /* Amulets have only one ability */ |
904 | break; |
947 | break; |
905 | if(!(RANDOM()%4)) { |
948 | |
906 | int d=(RANDOM()%2 || QUERY_FLAG(op, FLAG_CURSED))?-DICE2:DICE2; |
949 | if (!(RANDOM () % 4)) |
907 | if(d>0) |
950 | { |
908 | op->value*=3; |
951 | int d = (RANDOM () % 2 |
|
|
952 | || QUERY_FLAG (op, FLAG_CURSED)) ? -DICE2 : DICE2; |
|
|
953 | |
|
|
954 | if (d > 0) |
|
|
955 | op->value *= 3; |
|
|
956 | |
909 | set_ring_bonus(op,d); |
957 | set_ring_bonus (op, d); |
910 | if(!(RANDOM()%4)) { |
958 | |
911 | int d=(RANDOM()%3 || QUERY_FLAG(op, FLAG_CURSED))?-DICE2:DICE2; |
959 | if (!(RANDOM () % 4)) |
912 | if(d>0) |
960 | { |
913 | op->value*=5; |
961 | int d = (RANDOM () % 3 |
914 | set_ring_bonus(op,d); |
962 | || QUERY_FLAG (op, FLAG_CURSED)) ? -DICE2 : DICE2; |
915 | } |
963 | if (d > 0) |
916 | } |
964 | op->value *= 5; |
|
|
965 | set_ring_bonus (op, d); |
|
|
966 | } |
|
|
967 | } |
|
|
968 | |
917 | if(GET_ANIM_ID(op)) |
969 | if (GET_ANIM_ID (op)) |
918 | SET_ANIMATION(op, RANDOM()%((int) NUM_ANIMATIONS(op))); |
970 | SET_ANIMATION (op, RANDOM () % ((int) NUM_ANIMATIONS (op))); |
919 | break; |
|
|
920 | |
971 | |
|
|
972 | break; |
|
|
973 | |
921 | case BOOK: |
974 | case BOOK: |
922 | /* Is it an empty book?, if yes lets make a special |
975 | /* Is it an empty book?, if yes lets make a special |
923 | * msg for it, and tailor its properties based on the |
976 | * msg for it, and tailor its properties based on the |
924 | * creator and/or map level we found it on. |
977 | * creator and/or map level we found it on. |
925 | */ |
978 | */ |
926 | if(!op->msg&&RANDOM()%10) { |
979 | if (!op->msg && RANDOM () % 10) |
|
|
980 | { |
927 | /* set the book level properly */ |
981 | /* set the book level properly */ |
928 | if(creator->level==0 || QUERY_FLAG(creator,FLAG_ALIVE)) { |
982 | if (creator->level == 0 || QUERY_FLAG (creator, FLAG_ALIVE)) |
929 | if(op->map&&op->map->difficulty) |
983 | { |
930 | op->level=RANDOM()%(op->map->difficulty)+RANDOM()%10+1; |
984 | if (op->map && op->map->difficulty) |
931 | else |
985 | op->level = |
932 | op->level=RANDOM()%20+1; |
986 | RANDOM () % (op->map->difficulty) + RANDOM () % 10 + 1; |
933 | } else |
987 | else |
|
|
988 | op->level = RANDOM () % 20 + 1; |
|
|
989 | } |
|
|
990 | else |
934 | op->level=RANDOM()%creator->level; |
991 | op->level = RANDOM () % creator->level; |
935 | |
992 | |
936 | tailor_readable_ob(op,(creator&&creator->stats.sp)?creator->stats.sp:-1); |
993 | tailor_readable_ob (op, |
|
|
994 | (creator |
|
|
995 | && creator->stats.sp) ? creator->stats. |
|
|
996 | sp : -1); |
937 | /* books w/ info are worth more! */ |
997 | /* books w/ info are worth more! */ |
938 | op->value*=((op->level>10?op->level:(op->level+1)/2)*((strlen(op->msg)/250)+1)); |
998 | op->value *= |
|
|
999 | ((op->level > |
|
|
1000 | 10 ? op->level : (op->level + |
|
|
1001 | 1) / 2) * ((strlen (op->msg) / 250) + 1)); |
939 | /* creator related stuff */ |
1002 | /* creator related stuff */ |
940 | |
1003 | |
941 | /* for library, chained books. Note that some monsters have no_pick |
1004 | /* for library, chained books. Note that some monsters have no_pick |
942 | * set - we don't want to set no pick in that case. |
1005 | * set - we don't want to set no pick in that case. |
943 | */ |
1006 | */ |
944 | if(QUERY_FLAG(creator,FLAG_NO_PICK) && |
1007 | if (QUERY_FLAG (creator, FLAG_NO_PICK) && |
945 | !QUERY_FLAG(creator, FLAG_MONSTER)) |
1008 | !QUERY_FLAG (creator, FLAG_MONSTER)) |
946 | SET_FLAG(op,FLAG_NO_PICK); |
1009 | SET_FLAG (op, FLAG_NO_PICK); |
947 | if(creator->slaying&&!op->slaying) /* for check_inv floors */ |
1010 | if (creator->slaying && !op->slaying) /* for check_inv floors */ |
948 | op->slaying = add_string(creator->slaying); |
1011 | op->slaying = add_string (creator->slaying); |
949 | |
1012 | |
950 | /* add exp so reading it gives xp (once)*/ |
1013 | /* add exp so reading it gives xp (once) */ |
951 | op->stats.exp = op->value>10000?op->value/5:op->value/10; |
1014 | op->stats.exp = |
952 | } |
1015 | op->value > 10000 ? op->value / 5 : op->value / 10; |
953 | break; |
1016 | } |
|
|
1017 | break; |
954 | |
1018 | |
955 | case SPELLBOOK: |
1019 | case SPELLBOOK: |
956 | op->value=op->value* op->inv->value; |
|
|
957 | /* add exp so learning gives xp */ |
|
|
958 | op->level = op->inv->level; |
|
|
959 | op->stats.exp = op->value; |
|
|
960 | break; |
|
|
961 | |
|
|
962 | case WAND: |
|
|
963 | /* nrof in the treasure list is number of charges, |
|
|
964 | * not number of wands. So copy that into food (charges), |
|
|
965 | * and reset nrof. |
|
|
966 | */ |
|
|
967 | op->stats.food=op->inv->nrof; |
|
|
968 | op->nrof=1; |
|
|
969 | /* If the spell changes by level, choose a random level |
|
|
970 | * for it, and adjust price. If the spell doesn't |
|
|
971 | * change by level, just set the wand to the level of |
|
|
972 | * the spell, and value calculation is simpler. |
|
|
973 | */ |
|
|
974 | if (op->inv->duration_modifier || op->inv->dam_modifier || |
|
|
975 | op->inv->range_modifier) { |
|
|
976 | op->level = level_for_item(op, difficulty, 0); |
|
|
977 | op->value= op->value* op->inv->value * (op->level +50)/ |
|
|
978 | (op->inv->level + 50); |
|
|
979 | } |
|
|
980 | else { |
|
|
981 | op->level = op->inv->level; |
|
|
982 | op->value = op->value * op->inv->value; |
1020 | op->value = op->value * op->inv->value; |
983 | } |
1021 | /* add exp so learning gives xp */ |
984 | break; |
1022 | op->level = op->inv->level; |
|
|
1023 | op->stats.exp = op->value; |
|
|
1024 | break; |
985 | |
1025 | |
|
|
1026 | case WAND: |
|
|
1027 | /* nrof in the treasure list is number of charges, |
|
|
1028 | * not number of wands. So copy that into food (charges), |
|
|
1029 | * and reset nrof. |
|
|
1030 | */ |
|
|
1031 | op->stats.food = op->inv->nrof; |
|
|
1032 | op->nrof = 1; |
|
|
1033 | /* If the spell changes by level, choose a random level |
|
|
1034 | * for it, and adjust price. If the spell doesn't |
|
|
1035 | * change by level, just set the wand to the level of |
|
|
1036 | * the spell, and value calculation is simpler. |
|
|
1037 | */ |
|
|
1038 | if (op->inv->duration_modifier || op->inv->dam_modifier || |
|
|
1039 | op->inv->range_modifier) |
|
|
1040 | { |
|
|
1041 | op->level = level_for_item (op, difficulty); |
|
|
1042 | op->value = op->value * op->inv->value * (op->level + 50) / |
|
|
1043 | (op->inv->level + 50); |
|
|
1044 | } |
|
|
1045 | else |
|
|
1046 | { |
|
|
1047 | op->level = op->inv->level; |
|
|
1048 | op->value = op->value * op->inv->value; |
|
|
1049 | } |
|
|
1050 | break; |
|
|
1051 | |
986 | case ROD: |
1052 | case ROD: |
987 | op->level = level_for_item(op, difficulty, 0); |
1053 | op->level = level_for_item (op, difficulty); |
988 | /* Add 50 to both level an divisor to keep prices a little more |
1054 | /* Add 50 to both level an divisor to keep prices a little more |
989 | * reasonable. Otherwise, a high level version of a low level |
1055 | * reasonable. Otherwise, a high level version of a low level |
990 | * spell can be worth tons a money (eg, level 20 rod, level 2 spell = |
1056 | * spell can be worth tons a money (eg, level 20 rod, level 2 spell = |
991 | * 10 time multiplier). This way, the value are a bit more reasonable. |
1057 | * 10 time multiplier). This way, the value are a bit more reasonable. |
992 | */ |
1058 | */ |
|
|
1059 | op->value = |
993 | op->value= op->value * op->inv->value * (op->level +50) / (op->inv->level + 50); |
1060 | op->value * op->inv->value * (op->level + 50) / (op->inv->level + |
|
|
1061 | 50); |
994 | /* maxhp is used to denote how many 'charges' the rod holds before */ |
1062 | /* maxhp is used to denote how many 'charges' the rod holds before */ |
995 | if (op->stats.maxhp) |
1063 | if (op->stats.maxhp) |
996 | op->stats.maxhp *= MAX(op->inv->stats.sp, op->inv->stats.grace); |
1064 | op->stats.maxhp *= MAX (op->inv->stats.sp, op->inv->stats.grace); |
997 | else |
1065 | else |
998 | op->stats.maxhp = 2 * MAX(op->inv->stats.sp, op->inv->stats.grace); |
1066 | op->stats.maxhp = 2 * MAX (op->inv->stats.sp, op->inv->stats.grace); |
999 | |
1067 | |
1000 | op->stats.hp = op->stats.maxhp; |
1068 | op->stats.hp = op->stats.maxhp; |
1001 | break; |
1069 | break; |
1002 | |
1070 | |
1003 | case SCROLL: |
1071 | case SCROLL: |
1004 | op->level = level_for_item(op, difficulty, 0); |
1072 | op->level = level_for_item (op, difficulty); |
1005 | op->value= op->value * op->inv->value * (op->level +50) / (op->inv->level + 50); |
1073 | op->value = |
|
|
1074 | op->value * op->inv->value |
|
|
1075 | * (op->level + 50) / (op->inv->level + 50); |
|
|
1076 | |
1006 | /* add exp so reading them properly gives xp */ |
1077 | /* add exp so reading them properly gives xp */ |
1007 | op->stats.exp = op->value/5; |
1078 | op->stats.exp = op->value / 5; |
1008 | op->nrof = op->inv->nrof; |
1079 | op->nrof = op->inv->nrof; |
1009 | break; |
1080 | break; |
1010 | |
1081 | |
1011 | case RUNE: |
1082 | case RUNE: |
1012 | trap_adjust(op,difficulty); |
1083 | trap_adjust (op, difficulty); |
1013 | break; |
1084 | break; |
1014 | |
1085 | |
1015 | case TRAP: |
1086 | case TRAP: |
1016 | trap_adjust(op,difficulty); |
1087 | trap_adjust (op, difficulty); |
1017 | break; |
1088 | break; |
1018 | } /* switch type */ |
1089 | } /* switch type */ |
1019 | |
1090 | |
1020 | if (flags & GT_STARTEQUIP) { |
1091 | if (flags & GT_STARTEQUIP) |
|
|
1092 | { |
1021 | if (op->nrof < 2 && op->type != CONTAINER |
1093 | if (op->nrof < 2 && op->type != CONTAINER |
1022 | && op->type != MONEY && ! QUERY_FLAG (op, FLAG_IS_THROWN)) |
1094 | && op->type != MONEY && !QUERY_FLAG (op, FLAG_IS_THROWN)) |
1023 | SET_FLAG (op, FLAG_STARTEQUIP); |
1095 | SET_FLAG (op, FLAG_STARTEQUIP); |
1024 | else if (op->type != MONEY) |
1096 | else if (op->type != MONEY) |
1025 | op->value = 0; |
1097 | op->value = 0; |
1026 | } |
1098 | } |
1027 | |
1099 | |
1028 | if ( ! (flags & GT_ENVIRONMENT)) |
1100 | if (!(flags & GT_ENVIRONMENT)) |
1029 | fix_flesh_item (op, creator); |
1101 | fix_flesh_item (op, creator); |
1030 | } |
1102 | } |
1031 | |
1103 | |
1032 | /* |
1104 | /* |
1033 | * |
1105 | * |
1034 | * |
1106 | * |