… | |
… | |
194 | return; |
194 | return; |
195 | } |
195 | } |
196 | while (fgets (buf, MAX_BUF, fp) != NULL) |
196 | while (fgets (buf, MAX_BUF, fp) != NULL) |
197 | { |
197 | { |
198 | line++; |
198 | line++; |
199 | if (*buf == '#') |
199 | if (*buf == '#' || *buf == '\n') |
200 | continue; |
200 | ; // ignore |
201 | |
|
|
202 | if (sscanf (buf, "treasureone %s\n", name) || sscanf (buf, "treasure %s\n", name)) |
201 | else if (sscanf (buf, "treasureone %s\n", name) || sscanf (buf, "treasure %s\n", name)) |
203 | { |
202 | { |
204 | treasurelist *tl = get_empty_treasurelist (); |
203 | treasurelist *tl = get_empty_treasurelist (); |
205 | |
204 | |
206 | tl->name = name; |
205 | tl->name = name; |
207 | if (previous == NULL) |
206 | if (previous == NULL) |
208 | first_treasurelist = tl; |
207 | first_treasurelist = tl; |
209 | else |
208 | else |
210 | previous->next = tl; |
209 | previous->next = tl; |
|
|
210 | |
211 | previous = tl; |
211 | previous = tl; |
212 | tl->items = load_treasure (fp, &line); |
212 | tl->items = load_treasure (fp, &line); |
213 | |
213 | |
214 | /* This is a one of the many items on the list should be generated. |
214 | /* This is a one of the many items on the list should be generated. |
215 | * Add up the chance total, and check to make sure the yes & no |
215 | * Add up the chance total, and check to make sure the yes & no |
… | |
… | |
348 | { |
348 | { |
349 | if (t->item && (t->item->clone.invisible != 0 || !(flag & GT_INVISIBLE))) |
349 | if (t->item && (t->item->clone.invisible != 0 || !(flag & GT_INVISIBLE))) |
350 | { |
350 | { |
351 | tmp = arch_to_object (t->item); |
351 | tmp = arch_to_object (t->item); |
352 | if (t->nrof && tmp->nrof <= 1) |
352 | if (t->nrof && tmp->nrof <= 1) |
353 | tmp->nrof = RANDOM () % ((int) t->nrof) + 1; |
353 | tmp->nrof = rndm (t->nrof) + 1; |
|
|
354 | |
354 | fix_generated_item (tmp, op, difficulty, t->magic, flag); |
355 | fix_generated_item (tmp, op, difficulty, t->magic, flag); |
355 | change_treasure (t, tmp); |
356 | change_treasure (t, tmp); |
356 | put_treasure (tmp, op, flag); |
357 | put_treasure (tmp, op, flag); |
357 | } |
358 | } |
358 | } |
359 | } |
… | |
… | |
366 | if (t->next != NULL) |
367 | if (t->next != NULL) |
367 | create_all_treasures (t->next, op, flag, difficulty, tries); |
368 | create_all_treasures (t->next, op, flag, difficulty, tries); |
368 | } |
369 | } |
369 | |
370 | |
370 | void |
371 | void |
371 | create_one_treasure (treasurelist * tl, object *op, int flag, int difficulty, int tries) |
372 | create_one_treasure (treasurelist *tl, object *op, int flag, int difficulty, int tries) |
372 | { |
373 | { |
373 | int value = RANDOM () % tl->total_chance; |
374 | int value = rndm (tl->total_chance); |
374 | treasure *t; |
375 | treasure *t; |
375 | |
376 | |
376 | if (tries++ > 100) |
377 | if (tries++ > 100) |
377 | { |
378 | { |
378 | LOG (llevDebug, "create_one_treasure: tries exceeded 100, returning without making treasure\n"); |
379 | LOG (llevDebug, "create_one_treasure: tries exceeded 100, returning without making treasure\n"); |
… | |
… | |
414 | |
415 | |
415 | if (!tmp) |
416 | if (!tmp) |
416 | return; |
417 | return; |
417 | |
418 | |
418 | if (t->nrof && tmp->nrof <= 1) |
419 | if (t->nrof && tmp->nrof <= 1) |
419 | tmp->nrof = RANDOM () % ((int) t->nrof) + 1; |
420 | tmp->nrof = rndm (t->nrof) + 1; |
420 | |
421 | |
421 | fix_generated_item (tmp, op, difficulty, t->magic, flag); |
422 | fix_generated_item (tmp, op, difficulty, t->magic, flag); |
422 | change_treasure (t, tmp); |
423 | change_treasure (t, tmp); |
423 | put_treasure (tmp, op, flag); |
424 | put_treasure (tmp, op, flag); |
424 | } |
425 | } |
… | |
… | |
432 | * to do that. |
433 | * to do that. |
433 | */ |
434 | */ |
434 | void |
435 | void |
435 | create_treasure (treasurelist *tl, object *op, int flag, int difficulty, int tries) |
436 | create_treasure (treasurelist *tl, object *op, int flag, int difficulty, int tries) |
436 | { |
437 | { |
437 | |
|
|
438 | if (tries++ > 100) |
438 | if (tries++ > 100) |
439 | { |
439 | { |
440 | LOG (llevDebug, "createtreasure: tries exceeded 100, returning without making treasure\n"); |
440 | LOG (llevDebug, "createtreasure: tries exceeded 100, returning without making treasure\n"); |
441 | return; |
441 | return; |
442 | } |
442 | } |
|
|
443 | |
443 | if (tl->total_chance) |
444 | if (tl->total_chance) |
444 | create_one_treasure (tl, op, flag, difficulty, tries); |
445 | create_one_treasure (tl, op, flag, difficulty, tries); |
445 | else |
446 | else |
446 | create_all_treasures (tl->items, op, flag, difficulty, tries); |
447 | create_all_treasures (tl->items, op, flag, difficulty, tries); |
447 | } |
448 | } |
… | |
… | |
658 | |
659 | |
659 | void |
660 | void |
660 | set_ring_bonus (object *op, int bonus) |
661 | set_ring_bonus (object *op, int bonus) |
661 | { |
662 | { |
662 | |
663 | |
663 | int r = RANDOM () % (bonus > 0 ? 25 : 11); |
664 | int r = rndm (bonus > 0 ? 25 : 11); |
664 | |
665 | |
665 | if (op->type == AMULET) |
666 | if (op->type == AMULET) |
666 | { |
667 | { |
667 | if (!(rndm (21))) |
668 | if (!(rndm (21))) |
668 | r = 20 + rndm (2); |
669 | r = 20 + rndm (2); |
669 | else |
670 | else |
670 | { |
671 | { |
671 | if (RANDOM () & 2) |
672 | if (rndm (2)) |
672 | r = 10; |
673 | r = 10; |
673 | else |
674 | else |
674 | r = 11 + rndm (9); |
675 | r = 11 + rndm (9); |
675 | } |
676 | } |
676 | } |
677 | } |
… | |
… | |
727 | * positive values for how protections work out. Put another |
728 | * positive values for how protections work out. Put another |
728 | * little random element in since that they don't always end up with |
729 | * little random element in since that they don't always end up with |
729 | * even values. |
730 | * even values. |
730 | */ |
731 | */ |
731 | if (bonus < 0) |
732 | if (bonus < 0) |
732 | val = 2 * -val - RANDOM () % b; |
733 | val = 2 * -val - rndm (b); |
733 | if (val > 35) |
734 | if (val > 35) |
734 | val = 35; /* Upper limit */ |
735 | val = 35; /* Upper limit */ |
735 | b = 0; |
736 | b = 0; |
736 | |
737 | |
737 | while (op->resist[resist_table[resist]] != 0 && b < 4) |
738 | while (op->resist[resist_table[resist]] != 0 && b < 4) |
… | |
… | |
790 | * higher is the chance of returning a low number. |
791 | * higher is the chance of returning a low number. |
791 | * It is only used in fix_generated_treasure() to set bonuses on |
792 | * It is only used in fix_generated_treasure() to set bonuses on |
792 | * rings and amulets. |
793 | * rings and amulets. |
793 | * Another scheme is used to calculate the magic of weapons and armours. |
794 | * Another scheme is used to calculate the magic of weapons and armours. |
794 | */ |
795 | */ |
795 | |
|
|
796 | int |
796 | int |
797 | get_magic (int diff) |
797 | get_magic (int diff) |
798 | { |
798 | { |
799 | int i; |
799 | int i; |
800 | |
800 | |
801 | if (diff < 3) |
801 | if (diff < 3) |
802 | diff = 3; |
802 | diff = 3; |
|
|
803 | |
803 | for (i = 0; i < 4; i++) |
804 | for (i = 0; i < 4; i++) |
804 | if (RANDOM () % diff) |
805 | if (rndm (diff)) |
805 | return i; |
806 | return i; |
|
|
807 | |
806 | return 4; |
808 | return 4; |
807 | } |
809 | } |
808 | |
810 | |
809 | #define DICE2 (get_magic(2)==2?2:1) |
811 | #define DICE2 (get_magic(2)==2?2:1) |
810 | #define DICESPELL (rndm (3)+RANDOM()%3+RANDOM()%3+RANDOM()%3+RANDOM()%3) |
812 | #define DICESPELL (rndm (3) + rndm (3) + rndm (3) + rndm (3) + rndm (3)) |
811 | |
813 | |
812 | /* |
814 | /* |
813 | * fix_generated_item(): This is called after an item is generated, in |
815 | * fix_generated_item(): This is called after an item is generated, in |
814 | * order to set it up right. This produced magical bonuses, puts spells |
816 | * order to set it up right. This produced magical bonuses, puts spells |
815 | * into scrolls/books/wands, makes it unidentified, hides the value, etc. |
817 | * into scrolls/books/wands, makes it unidentified, hides the value, etc. |
… | |
… | |
829 | * value. |
831 | * value. |
830 | * GT_MINIMAL: Does minimal processing on the object - just enough to make it |
832 | * GT_MINIMAL: Does minimal processing on the object - just enough to make it |
831 | * a working object - don't change magic, value, etc, but set it material |
833 | * a working object - don't change magic, value, etc, but set it material |
832 | * type as appropriate, for objects that need spell objects, set those, etc |
834 | * type as appropriate, for objects that need spell objects, set those, etc |
833 | */ |
835 | */ |
834 | |
|
|
835 | void |
836 | void |
836 | fix_generated_item (object *op, object *creator, int difficulty, int max_magic, int flags) |
837 | fix_generated_item (object *op, object *creator, int difficulty, int max_magic, int flags) |
837 | { |
838 | { |
838 | int was_magic = op->magic, num_enchantments = 0, save_item_power = 0; |
839 | int was_magic = op->magic, num_enchantments = 0, save_item_power = 0; |
839 | |
840 | |
… | |
… | |
876 | if (!op->magic && max_magic) |
877 | if (!op->magic && max_magic) |
877 | set_magic (difficulty, op, max_magic, flags); |
878 | set_magic (difficulty, op, max_magic, flags); |
878 | |
879 | |
879 | num_enchantments = calc_item_power (op, 1); |
880 | num_enchantments = calc_item_power (op, 1); |
880 | |
881 | |
881 | if ((!was_magic && !(RANDOM () % CHANCE_FOR_ARTIFACT)) || op->type == HORN || difficulty >= settings.max_level) /* high difficulties always generate an artifact, |
882 | if ((!was_magic && !rndm (CHANCE_FOR_ARTIFACT)) |
|
|
883 | || op->type == HORN |
|
|
884 | || difficulty >= settings.max_level) /* high difficulties always generate an artifact, |
882 | * used for shop_floors or treasures */ |
885 | * used for shop_floors or treasures */ |
883 | generate_artifact (op, difficulty); |
886 | generate_artifact (op, difficulty); |
884 | } |
887 | } |
885 | |
888 | |
886 | /* Object was made an artifact. Calculate its item_power rating. |
889 | /* Object was made an artifact. Calculate its item_power rating. |
… | |
… | |
949 | if (QUERY_FLAG (op, FLAG_CURSED) && !(rndm (4))) |
952 | if (QUERY_FLAG (op, FLAG_CURSED) && !(rndm (4))) |
950 | set_ring_bonus (op, -DICE2); |
953 | set_ring_bonus (op, -DICE2); |
951 | break; |
954 | break; |
952 | |
955 | |
953 | case BRACERS: |
956 | case BRACERS: |
954 | if (!(RANDOM () % (QUERY_FLAG (op, FLAG_CURSED) ? 5 : 20))) |
957 | if (!rndm (QUERY_FLAG (op, FLAG_CURSED) ? 5 : 20)) |
955 | { |
958 | { |
956 | set_ring_bonus (op, QUERY_FLAG (op, FLAG_CURSED) ? -DICE2 : DICE2); |
959 | set_ring_bonus (op, QUERY_FLAG (op, FLAG_CURSED) ? -DICE2 : DICE2); |
957 | if (!QUERY_FLAG (op, FLAG_CURSED)) |
960 | if (!QUERY_FLAG (op, FLAG_CURSED)) |
958 | op->value *= 3; |
961 | op->value *= 3; |
959 | } |
962 | } |
… | |
… | |
985 | */ |
988 | */ |
986 | if (op->inv && op->randomitems) |
989 | if (op->inv && op->randomitems) |
987 | { |
990 | { |
988 | /* value multiplier is same as for scrolls */ |
991 | /* value multiplier is same as for scrolls */ |
989 | op->value = (op->value * op->inv->value); |
992 | op->value = (op->value * op->inv->value); |
990 | op->level = op->inv->level / 2 + RANDOM () % difficulty + RANDOM () % difficulty; |
993 | op->level = op->inv->level / 2 + rndm (difficulty) + rndm (difficulty); |
991 | } |
994 | } |
992 | else |
995 | else |
993 | { |
996 | { |
994 | op->name = "potion"; |
997 | op->name = "potion"; |
995 | op->name_pl = "potions"; |
998 | op->name_pl = "potions"; |
… | |
… | |
1041 | set_ring_bonus (op, d); |
1044 | set_ring_bonus (op, d); |
1042 | } |
1045 | } |
1043 | } |
1046 | } |
1044 | |
1047 | |
1045 | if (GET_ANIM_ID (op)) |
1048 | if (GET_ANIM_ID (op)) |
1046 | SET_ANIMATION (op, RANDOM () % ((int) NUM_ANIMATIONS (op))); |
1049 | SET_ANIMATION (op, rndm (NUM_ANIMATIONS (op))); |
1047 | |
1050 | |
1048 | break; |
1051 | break; |
1049 | |
1052 | |
1050 | case BOOK: |
1053 | case BOOK: |
1051 | /* Is it an empty book?, if yes lets make a specialĀ· |
1054 | /* Is it an empty book?, if yes lets make a specialĀ· |
… | |
… | |
1056 | { |
1059 | { |
1057 | /* set the book level properly */ |
1060 | /* set the book level properly */ |
1058 | if (creator->level == 0 || QUERY_FLAG (creator, FLAG_ALIVE)) |
1061 | if (creator->level == 0 || QUERY_FLAG (creator, FLAG_ALIVE)) |
1059 | { |
1062 | { |
1060 | if (op->map && op->map->difficulty) |
1063 | if (op->map && op->map->difficulty) |
1061 | op->level = RANDOM () % (op->map->difficulty) + rndm (10) + 1; |
1064 | op->level = rndm (op->map->difficulty) + rndm (10) + 1; |
1062 | else |
1065 | else |
1063 | op->level = rndm (20) + 1; |
1066 | op->level = rndm (20) + 1; |
1064 | } |
1067 | } |
1065 | else |
1068 | else |
1066 | op->level = RANDOM () % creator->level; |
1069 | op->level = rndm (creator->level); |
1067 | |
1070 | |
1068 | tailor_readable_ob (op, (creator && creator->stats.sp) ? creator->stats.sp : -1); |
1071 | tailor_readable_ob (op, (creator && creator->stats.sp) ? creator->stats.sp : -1); |
1069 | /* books w/ info are worth more! */ |
1072 | /* books w/ info are worth more! */ |
1070 | op->value *= ((op->level > 10 ? op->level : (op->level + 1) / 2) * ((strlen (op->msg) / 250) + 1)); |
1073 | op->value *= ((op->level > 10 ? op->level : (op->level + 1) / 2) * ((strlen (op->msg) / 250) + 1)); |
1071 | /* creator related stuff */ |
1074 | /* creator related stuff */ |
… | |
… | |
1170 | */ |
1173 | */ |
1171 | |
1174 | |
1172 | /* |
1175 | /* |
1173 | * Allocate and return the pointer to an empty artifactlist structure. |
1176 | * Allocate and return the pointer to an empty artifactlist structure. |
1174 | */ |
1177 | */ |
1175 | |
|
|
1176 | static artifactlist * |
1178 | static artifactlist * |
1177 | get_empty_artifactlist (void) |
1179 | get_empty_artifactlist (void) |
1178 | { |
1180 | { |
1179 | artifactlist *al = (artifactlist *) malloc (sizeof (artifactlist)); |
1181 | artifactlist *al = (artifactlist *) malloc (sizeof (artifactlist)); |
1180 | |
1182 | |
… | |
… | |
1187 | } |
1189 | } |
1188 | |
1190 | |
1189 | /* |
1191 | /* |
1190 | * Allocate and return the pointer to an empty artifact structure. |
1192 | * Allocate and return the pointer to an empty artifact structure. |
1191 | */ |
1193 | */ |
1192 | |
|
|
1193 | static artifact * |
1194 | static artifact * |
1194 | get_empty_artifact (void) |
1195 | get_empty_artifact (void) |
1195 | { |
1196 | { |
1196 | artifact *a = (artifact *) malloc (sizeof (artifact)); |
1197 | artifact *a = (artifact *) malloc (sizeof (artifact)); |
1197 | |
1198 | |
1198 | if (a == NULL) |
1199 | if (a == NULL) |
1199 | fatal (OUT_OF_MEMORY); |
1200 | fatal (OUT_OF_MEMORY); |
|
|
1201 | |
1200 | a->item = NULL; |
1202 | a->item = NULL; |
1201 | a->next = NULL; |
1203 | a->next = NULL; |
1202 | a->chance = 0; |
1204 | a->chance = 0; |
1203 | a->difficulty = 0; |
1205 | a->difficulty = 0; |
1204 | a->allowed = NULL; |
1206 | a->allowed = NULL; |
… | |
… | |
1207 | |
1209 | |
1208 | /* |
1210 | /* |
1209 | * Searches the artifact lists and returns one that has the same type |
1211 | * Searches the artifact lists and returns one that has the same type |
1210 | * of objects on it. |
1212 | * of objects on it. |
1211 | */ |
1213 | */ |
1212 | |
|
|
1213 | artifactlist * |
1214 | artifactlist * |
1214 | find_artifactlist (int type) |
1215 | find_artifactlist (int type) |
1215 | { |
1216 | { |
1216 | artifactlist *al; |
1217 | artifactlist *al; |
1217 | |
1218 | |
1218 | for (al = first_artifactlist; al != NULL; al = al->next) |
1219 | for (al = first_artifactlist; al; al = al->next) |
1219 | if (al->type == type) |
1220 | if (al->type == type) |
1220 | return al; |
1221 | return al; |
|
|
1222 | |
1221 | return NULL; |
1223 | return 0; |
1222 | } |
1224 | } |
1223 | |
1225 | |
1224 | /* |
1226 | /* |
1225 | * For debugging purposes. Dumps all tables. |
1227 | * For debugging purposes. Dumps all tables. |
1226 | */ |
1228 | */ |
1227 | |
|
|
1228 | void |
1229 | void |
1229 | dump_artifacts (void) |
1230 | dump_artifacts (void) |
1230 | { |
1231 | { |
1231 | artifactlist *al; |
1232 | artifactlist *al; |
1232 | artifact *art; |
1233 | artifact *art; |
… | |
… | |
1239 | for (art = al->items; art != NULL; art = art->next) |
1240 | for (art = al->items; art != NULL; art = art->next) |
1240 | { |
1241 | { |
1241 | fprintf (logfile, "Artifact %-30s Difficulty %3d Chance %5d\n", &art->item->name, art->difficulty, art->chance); |
1242 | fprintf (logfile, "Artifact %-30s Difficulty %3d Chance %5d\n", &art->item->name, art->difficulty, art->chance); |
1242 | if (art->allowed != NULL) |
1243 | if (art->allowed != NULL) |
1243 | { |
1244 | { |
1244 | fprintf (logfile, "\tAllowed combinations:"); |
1245 | fprintf (logfile, "\tallowed combinations:"); |
1245 | for (next = art->allowed; next != NULL; next = next->next) |
1246 | for (next = art->allowed; next != NULL; next = next->next) |
1246 | fprintf (logfile, "%s,", &next->name); |
1247 | fprintf (logfile, "%s,", &next->name); |
1247 | fprintf (logfile, "\n"); |
1248 | fprintf (logfile, "\n"); |
1248 | } |
1249 | } |
1249 | } |
1250 | } |
… | |
… | |
1317 | archetype *at; |
1318 | archetype *at; |
1318 | int found; |
1319 | int found; |
1319 | |
1320 | |
1320 | found = 0; |
1321 | found = 0; |
1321 | fprintf (logfile, "\n"); |
1322 | fprintf (logfile, "\n"); |
|
|
1323 | |
1322 | for (at = first_archetype; at != NULL; at = at->next) |
1324 | for (at = first_archetype; at != NULL; at = at->next) |
1323 | if (!strcasecmp (at->clone.name, name) && at->clone.title == NULL) |
1325 | if (!strcasecmp (at->clone.name, name) && at->clone.title == NULL) |
1324 | { |
1326 | { |
1325 | fprintf (logfile, "treasures for %s (arch: %s)\n", &at->clone.name, &at->name); |
1327 | fprintf (logfile, "treasures for %s (arch: %s)\n", &at->clone.name, &at->name); |
1326 | if (at->clone.randomitems != NULL) |
1328 | if (at->clone.randomitems != NULL) |
1327 | dump_monster_treasure_rec (at->clone.name, at->clone.randomitems->items, 1); |
1329 | dump_monster_treasure_rec (at->clone.name, at->clone.randomitems->items, 1); |
1328 | else |
1330 | else |
1329 | fprintf (logfile, "(nothing)\n"); |
1331 | fprintf (logfile, "(nothing)\n"); |
|
|
1332 | |
1330 | fprintf (logfile, "\n"); |
1333 | fprintf (logfile, "\n"); |
1331 | found++; |
1334 | found++; |
1332 | } |
1335 | } |
|
|
1336 | |
1333 | if (found == 0) |
1337 | if (found == 0) |
1334 | fprintf (logfile, "No objects have the name %s!\n\n", name); |
1338 | fprintf (logfile, "No objects have the name %s!\n\n", name); |
1335 | } |
1339 | } |
1336 | |
1340 | |
1337 | /* |
1341 | /* |
1338 | * Builds up the lists of artifacts from the file in the libdir. |
1342 | * Builds up the lists of artifacts from the file in the libdir. |
1339 | */ |
1343 | */ |
1340 | |
|
|
1341 | void |
1344 | void |
1342 | init_artifacts (void) |
1345 | init_artifacts (void) |
1343 | { |
1346 | { |
1344 | static int has_been_inited = 0; |
1347 | static int has_been_inited = 0; |
1345 | char filename[MAX_BUF], buf[HUGE_BUF], *cp, *next; |
1348 | char filename[MAX_BUF]; |
1346 | artifact *art = NULL; |
1349 | artifact *art = NULL; |
1347 | linked_char *tmp; |
|
|
1348 | int value; |
|
|
1349 | artifactlist *al; |
1350 | artifactlist *al; |
1350 | |
1351 | |
1351 | if (has_been_inited) |
1352 | if (has_been_inited) |
1352 | return; |
1353 | return; |
1353 | else |
1354 | else |
1354 | has_been_inited = 1; |
1355 | has_been_inited = 1; |
1355 | |
1356 | |
1356 | sprintf (filename, "%s/artifacts", settings.datadir); |
1357 | sprintf (filename, "%s/artifacts", settings.datadir); |
1357 | object_thawer thawer (filename); |
1358 | object_thawer f (filename); |
1358 | |
1359 | |
1359 | if (!thawer) |
1360 | if (!f) |
1360 | return; |
1361 | return; |
1361 | |
1362 | |
1362 | while (fgets (buf, HUGE_BUF, thawer) != NULL) |
1363 | f.next (); |
1363 | { |
|
|
1364 | if (*buf == '#') |
|
|
1365 | continue; |
|
|
1366 | if ((cp = strchr (buf, '\n')) != NULL) |
|
|
1367 | *cp = '\0'; |
|
|
1368 | cp = buf; |
|
|
1369 | while (*cp == ' ') /* Skip blanks */ |
|
|
1370 | cp++; |
|
|
1371 | if (*cp == '\0') |
|
|
1372 | continue; |
|
|
1373 | |
1364 | |
1374 | if (!strncmp (cp, "Allowed", 7)) |
1365 | for (;;) |
|
|
1366 | { |
|
|
1367 | switch (f.kw) |
1375 | { |
1368 | { |
|
|
1369 | case KW_allowed: |
1376 | if (art == NULL) |
1370 | if (!art) |
|
|
1371 | { |
|
|
1372 | art = get_empty_artifact (); |
|
|
1373 | nrofartifacts++; |
|
|
1374 | } |
|
|
1375 | |
1377 | { |
1376 | { |
1378 | art = get_empty_artifact (); |
1377 | if (!strcmp (f.get_str (), "all")) |
1379 | nrofartifacts++; |
1378 | break; |
|
|
1379 | |
|
|
1380 | char *next, *cp = f.get_str (); |
|
|
1381 | |
|
|
1382 | do |
|
|
1383 | { |
|
|
1384 | nrofallowedstr++; |
|
|
1385 | |
|
|
1386 | if ((next = strchr (cp, ','))) |
|
|
1387 | *next++ = '\0'; |
|
|
1388 | |
|
|
1389 | linked_char *tmp = new linked_char; |
|
|
1390 | |
|
|
1391 | tmp->name = cp; |
|
|
1392 | tmp->next = art->allowed; |
|
|
1393 | art->allowed = tmp; |
|
|
1394 | } |
|
|
1395 | while ((cp = next)); |
1380 | } |
1396 | } |
1381 | cp = strchr (cp, ' ') + 1; |
1397 | break; |
1382 | if (!strcmp (cp, "all")) |
1398 | |
|
|
1399 | case KW_chance: |
|
|
1400 | f.get (art->chance); |
|
|
1401 | break; |
|
|
1402 | |
|
|
1403 | case KW_difficulty: |
|
|
1404 | f.get (art->difficulty); |
|
|
1405 | break; |
|
|
1406 | |
|
|
1407 | case KW_object: |
|
|
1408 | { |
|
|
1409 | art->item = object::create (); |
|
|
1410 | |
|
|
1411 | if (!art->item->parse_kv (f)) |
|
|
1412 | LOG (llevError, "Init_Artifacts: Could not load object.\n"); |
|
|
1413 | |
|
|
1414 | al = find_artifactlist (art->item->type); |
|
|
1415 | |
|
|
1416 | if (!al) |
|
|
1417 | { |
|
|
1418 | al = get_empty_artifactlist (); |
|
|
1419 | al->type = art->item->type; |
|
|
1420 | al->next = first_artifactlist; |
|
|
1421 | first_artifactlist = al; |
|
|
1422 | } |
|
|
1423 | |
|
|
1424 | art->next = al->items; |
|
|
1425 | al->items = art; |
|
|
1426 | art = 0; |
|
|
1427 | } |
1383 | continue; |
1428 | continue; |
1384 | |
1429 | |
1385 | do |
1430 | case KW_EOF: |
|
|
1431 | goto done; |
|
|
1432 | |
|
|
1433 | default: |
|
|
1434 | if (!f.parse_error ("artifacts file")) |
|
|
1435 | cleanup ("artifacts file required"); |
1386 | { |
1436 | break; |
1387 | nrofallowedstr++; |
|
|
1388 | if ((next = strchr (cp, ',')) != NULL) |
|
|
1389 | *(next++) = '\0'; |
|
|
1390 | tmp = new linked_char; |
|
|
1391 | |
|
|
1392 | tmp->name = cp; |
|
|
1393 | tmp->next = art->allowed; |
|
|
1394 | art->allowed = tmp; |
|
|
1395 | } |
|
|
1396 | while ((cp = next) != NULL); |
|
|
1397 | } |
|
|
1398 | else if (sscanf (cp, "chance %d", &value)) |
|
|
1399 | art->chance = (uint16) value; |
|
|
1400 | else if (sscanf (cp, "difficulty %d", &value)) |
|
|
1401 | art->difficulty = (uint8) value; |
|
|
1402 | else if (!strncmp (cp, "Object", 6)) |
|
|
1403 | { |
1437 | } |
1404 | art->item = object::create (); |
|
|
1405 | |
1438 | |
1406 | if (!load_object (thawer, art->item, 0)) |
1439 | f.next (); |
1407 | LOG (llevError, "Init_Artifacts: Could not load object.\n"); |
|
|
1408 | |
|
|
1409 | art->item->name = strchr (cp, ' ') + 1; |
|
|
1410 | al = find_artifactlist (art->item->type); |
|
|
1411 | if (al == NULL) |
|
|
1412 | { |
|
|
1413 | al = get_empty_artifactlist (); |
|
|
1414 | al->type = art->item->type; |
|
|
1415 | al->next = first_artifactlist; |
|
|
1416 | first_artifactlist = al; |
|
|
1417 | } |
|
|
1418 | art->next = al->items; |
|
|
1419 | al->items = art; |
|
|
1420 | art = NULL; |
|
|
1421 | } |
|
|
1422 | else |
|
|
1423 | LOG (llevError, "Unknown input in artifact file: %s\n", buf); |
|
|
1424 | } |
1440 | } |
1425 | |
1441 | |
|
|
1442 | done: |
1426 | for (al = first_artifactlist; al != NULL; al = al->next) |
1443 | for (al = first_artifactlist; al; al = al->next) |
1427 | { |
1444 | { |
1428 | for (art = al->items; art != NULL; art = art->next) |
1445 | for (art = al->items; art; art = art->next) |
1429 | { |
1446 | { |
1430 | if (!art->chance) |
1447 | if (!art->chance) |
1431 | LOG (llevError, "Warning: artifact with no chance: %s\n", &art->item->name); |
1448 | LOG (llevError, "Warning: artifact with no chance: %s\n", &art->item->name); |
1432 | else |
1449 | else |
1433 | al->total_chance += art->chance; |
1450 | al->total_chance += art->chance; |
… | |
… | |
1502 | |
1519 | |
1503 | op->set_speed (op->speed); |
1520 | op->set_speed (op->speed); |
1504 | } |
1521 | } |
1505 | |
1522 | |
1506 | if (change->nrof) |
1523 | if (change->nrof) |
1507 | op->nrof = RANDOM () % ((int) change->nrof) + 1; |
1524 | op->nrof = rndm (change->nrof) + 1; |
1508 | |
1525 | |
1509 | op->stats.exp += change->stats.exp; /* Speed modifier */ |
1526 | op->stats.exp += change->stats.exp; /* Speed modifier */ |
1510 | op->stats.wc += change->stats.wc; |
1527 | op->stats.wc += change->stats.wc; |
1511 | op->stats.ac += change->stats.ac; |
1528 | op->stats.ac += change->stats.ac; |
1512 | |
1529 | |
… | |
… | |
1615 | op->gen_sp_armour = (signed char) (((int) op->gen_sp_armour * ((int) change->gen_sp_armour)) / (int) 100); |
1632 | op->gen_sp_armour = (signed char) (((int) op->gen_sp_armour * ((int) change->gen_sp_armour)) / (int) 100); |
1616 | } |
1633 | } |
1617 | |
1634 | |
1618 | op->value *= change->value; |
1635 | op->value *= change->value; |
1619 | |
1636 | |
1620 | if (change->material) |
1637 | if (change->materials) |
1621 | op->material = change->material; |
1638 | op->materials = change->materials; |
1622 | |
1639 | |
1623 | if (change->materialname) |
1640 | if (change->materialname) |
1624 | op->materialname = change->materialname; |
1641 | op->materialname = change->materialname; |
1625 | |
1642 | |
1626 | if (change->slaying) |
1643 | if (change->slaying) |
… | |
… | |
1720 | return; |
1737 | return; |
1721 | } |
1738 | } |
1722 | |
1739 | |
1723 | for (i = 0; i < ARTIFACT_TRIES; i++) |
1740 | for (i = 0; i < ARTIFACT_TRIES; i++) |
1724 | { |
1741 | { |
1725 | int roll = RANDOM () % al->total_chance; |
1742 | int roll = rndm (al->total_chance); |
1726 | |
1743 | |
1727 | for (art = al->items; art != NULL; art = art->next) |
1744 | for (art = al->items; art; art = art->next) |
1728 | { |
1745 | { |
1729 | roll -= art->chance; |
1746 | roll -= art->chance; |
1730 | if (roll < 0) |
1747 | if (roll < 0) |
1731 | break; |
1748 | break; |
1732 | } |
1749 | } |