--- deliantra/server/common/treasure.C 2007/01/20 22:09:51 1.34 +++ deliantra/server/common/treasure.C 2007/02/16 19:43:41 1.38 @@ -350,7 +350,8 @@ { tmp = arch_to_object (t->item); if (t->nrof && tmp->nrof <= 1) - tmp->nrof = RANDOM () % ((int) t->nrof) + 1; + tmp->nrof = rndm (t->nrof) + 1; + fix_generated_item (tmp, op, difficulty, t->magic, flag); change_treasure (t, tmp); put_treasure (tmp, op, flag); @@ -368,9 +369,9 @@ } void -create_one_treasure (treasurelist * tl, object *op, int flag, int difficulty, int tries) +create_one_treasure (treasurelist *tl, object *op, int flag, int difficulty, int tries) { - int value = RANDOM () % tl->total_chance; + int value = rndm (tl->total_chance); treasure *t; if (tries++ > 100) @@ -416,7 +417,7 @@ return; if (t->nrof && tmp->nrof <= 1) - tmp->nrof = RANDOM () % ((int) t->nrof) + 1; + tmp->nrof = rndm (t->nrof) + 1; fix_generated_item (tmp, op, difficulty, t->magic, flag); change_treasure (t, tmp); @@ -434,12 +435,12 @@ void create_treasure (treasurelist *tl, object *op, int flag, int difficulty, int tries) { - if (tries++ > 100) { LOG (llevDebug, "createtreasure: tries exceeded 100, returning without making treasure\n"); return; } + if (tl->total_chance) create_one_treasure (tl, op, flag, difficulty, tries); else @@ -660,7 +661,7 @@ set_ring_bonus (object *op, int bonus) { - int r = RANDOM () % (bonus > 0 ? 25 : 11); + int r = rndm (bonus > 0 ? 25 : 11); if (op->type == AMULET) { @@ -668,7 +669,7 @@ r = 20 + rndm (2); else { - if (RANDOM () & 2) + if (rndm (2)) r = 10; else r = 11 + rndm (9); @@ -729,7 +730,7 @@ * even values. */ if (bonus < 0) - val = 2 * -val - RANDOM () % b; + val = 2 * -val - rndm (b); if (val > 35) val = 35; /* Upper limit */ b = 0; @@ -792,7 +793,6 @@ * rings and amulets. * Another scheme is used to calculate the magic of weapons and armours. */ - int get_magic (int diff) { @@ -800,14 +800,16 @@ if (diff < 3) diff = 3; + for (i = 0; i < 4; i++) - if (RANDOM () % diff) + if (rndm (diff)) return i; + return 4; } #define DICE2 (get_magic(2)==2?2:1) -#define DICESPELL (rndm (3)+RANDOM()%3+RANDOM()%3+RANDOM()%3+RANDOM()%3) +#define DICESPELL (rndm (3) + rndm (3) + rndm (3) + rndm (3) + rndm (3)) /* * fix_generated_item(): This is called after an item is generated, in @@ -831,7 +833,6 @@ * a working object - don't change magic, value, etc, but set it material * type as appropriate, for objects that need spell objects, set those, etc */ - void fix_generated_item (object *op, object *creator, int difficulty, int max_magic, int flags) { @@ -878,7 +879,9 @@ num_enchantments = calc_item_power (op, 1); - if ((!was_magic && !(RANDOM () % CHANCE_FOR_ARTIFACT)) || op->type == HORN || difficulty >= settings.max_level) /* high difficulties always generate an artifact, + if ((!was_magic && !rndm (CHANCE_FOR_ARTIFACT)) + || op->type == HORN + || difficulty >= settings.max_level) /* high difficulties always generate an artifact, * used for shop_floors or treasures */ generate_artifact (op, difficulty); } @@ -951,7 +954,7 @@ break; case BRACERS: - if (!(RANDOM () % (QUERY_FLAG (op, FLAG_CURSED) ? 5 : 20))) + if (!rndm (QUERY_FLAG (op, FLAG_CURSED) ? 5 : 20)) { set_ring_bonus (op, QUERY_FLAG (op, FLAG_CURSED) ? -DICE2 : DICE2); if (!QUERY_FLAG (op, FLAG_CURSED)) @@ -987,7 +990,7 @@ { /* value multiplier is same as for scrolls */ op->value = (op->value * op->inv->value); - op->level = op->inv->level / 2 + RANDOM () % difficulty + RANDOM () % difficulty; + op->level = op->inv->level / 2 + rndm (difficulty) + rndm (difficulty); } else { @@ -1043,7 +1046,7 @@ } if (GET_ANIM_ID (op)) - SET_ANIMATION (op, RANDOM () % ((int) NUM_ANIMATIONS (op))); + SET_ANIMATION (op, rndm (NUM_ANIMATIONS (op))); break; @@ -1058,12 +1061,12 @@ if (creator->level == 0 || QUERY_FLAG (creator, FLAG_ALIVE)) { if (op->map && op->map->difficulty) - op->level = RANDOM () % (op->map->difficulty) + rndm (10) + 1; + op->level = rndm (op->map->difficulty) + rndm (10) + 1; else op->level = rndm (20) + 1; } else - op->level = RANDOM () % creator->level; + op->level = rndm (creator->level); tailor_readable_ob (op, (creator && creator->stats.sp) ? creator->stats.sp : -1); /* books w/ info are worth more! */ @@ -1172,7 +1175,6 @@ /* * Allocate and return the pointer to an empty artifactlist structure. */ - static artifactlist * get_empty_artifactlist (void) { @@ -1189,7 +1191,6 @@ /* * Allocate and return the pointer to an empty artifact structure. */ - static artifact * get_empty_artifact (void) { @@ -1197,6 +1198,7 @@ if (a == NULL) fatal (OUT_OF_MEMORY); + a->item = NULL; a->next = NULL; a->chance = 0; @@ -1209,22 +1211,21 @@ * Searches the artifact lists and returns one that has the same type * of objects on it. */ - artifactlist * find_artifactlist (int type) { artifactlist *al; - for (al = first_artifactlist; al != NULL; al = al->next) + for (al = first_artifactlist; al; al = al->next) if (al->type == type) return al; - return NULL; + + return 0; } /* * For debugging purposes. Dumps all tables. */ - void dump_artifacts (void) { @@ -1241,7 +1242,7 @@ fprintf (logfile, "Artifact %-30s Difficulty %3d Chance %5d\n", &art->item->name, art->difficulty, art->chance); if (art->allowed != NULL) { - fprintf (logfile, "\tAllowed combinations:"); + fprintf (logfile, "\tallowed combinations:"); for (next = art->allowed; next != NULL; next = next->next) fprintf (logfile, "%s,", &next->name); fprintf (logfile, "\n"); @@ -1319,6 +1320,7 @@ found = 0; fprintf (logfile, "\n"); + for (at = first_archetype; at != NULL; at = at->next) if (!strcasecmp (at->clone.name, name) && at->clone.title == NULL) { @@ -1327,9 +1329,11 @@ dump_monster_treasure_rec (at->clone.name, at->clone.randomitems->items, 1); else fprintf (logfile, "(nothing)\n"); + fprintf (logfile, "\n"); found++; } + if (found == 0) fprintf (logfile, "No objects have the name %s!\n\n", name); } @@ -1337,14 +1341,12 @@ /* * Builds up the lists of artifacts from the file in the libdir. */ - void init_artifacts (void) { static int has_been_inited = 0; char filename[MAX_BUF], buf[HUGE_BUF], *cp, *next; artifact *art = NULL; - linked_char *tmp; int value; artifactlist *al; @@ -1354,78 +1356,94 @@ has_been_inited = 1; sprintf (filename, "%s/artifacts", settings.datadir); - object_thawer thawer (filename); + object_thawer f (filename); - if (!thawer) + if (!f) return; - while (fgets (buf, HUGE_BUF, thawer) != NULL) - { - if (*buf == '#') - continue; - if ((cp = strchr (buf, '\n')) != NULL) - *cp = '\0'; - cp = buf; - while (*cp == ' ') /* Skip blanks */ - cp++; - if (*cp == '\0') - continue; + f.next (); - if (!strncmp (cp, "Allowed", 7)) + for (;;) + { + switch (f.kw) { - if (art == NULL) - { - art = get_empty_artifact (); - nrofartifacts++; - } - cp = strchr (cp, ' ') + 1; - if (!strcmp (cp, "all")) - continue; + case KW_allowed: + if (!art) + { + art = get_empty_artifact (); + nrofartifacts++; + } - do { - nrofallowedstr++; - if ((next = strchr (cp, ',')) != NULL) - *(next++) = '\0'; - tmp = new linked_char; - - tmp->name = cp; - tmp->next = art->allowed; - art->allowed = tmp; + if (!strcmp (f.get_str (), "all")) + break; + + char *next, *cp = f.get_str (); + + do + { + nrofallowedstr++; + + if ((next = strchr (cp, ','))) + *next++ = '\0'; + + linked_char *tmp = new linked_char; + + tmp->name = cp; + tmp->next = art->allowed; + art->allowed = tmp; + } + while ((cp = next)); } - while ((cp = next) != NULL); - } - else if (sscanf (cp, "chance %d", &value)) - art->chance = (uint16) value; - else if (sscanf (cp, "difficulty %d", &value)) - art->difficulty = (uint8) value; - else if (!strncmp (cp, "Object", 6)) - { - art->item = object::create (); + break; - if (!load_object (thawer, art->item, 0)) - LOG (llevError, "Init_Artifacts: Could not load object.\n"); + case KW_chance: + f.get (art->chance); + break; - art->item->name = strchr (cp, ' ') + 1; - al = find_artifactlist (art->item->type); - if (al == NULL) + case KW_difficulty: + f.get (art->difficulty); + break; + + case KW_object: { - al = get_empty_artifactlist (); - al->type = art->item->type; - al->next = first_artifactlist; - first_artifactlist = al; + art->item = object::create (); + + if (!art->item->parse_kv (f)) + LOG (llevError, "Init_Artifacts: Could not load object.\n"); + + al = find_artifactlist (art->item->type); + + if (!al) + { + al = get_empty_artifactlist (); + al->type = art->item->type; + al->next = first_artifactlist; + first_artifactlist = al; + } + + art->next = al->items; + al->items = art; + art = 0; } - art->next = al->items; - al->items = art; - art = NULL; + continue; + + case KW_EOF: + goto done; + + default: + if (!f.parse_error ("artifacts file")) + cleanup ("artifacts file required"); + break; } - else - LOG (llevError, "Unknown input in artifact file: %s\n", buf); + + f.next (); } - for (al = first_artifactlist; al != NULL; al = al->next) +done: + for (al = first_artifactlist; al; al = al->next) { - for (art = al->items; art != NULL; art = art->next) + for (art = al->items; art; art = art->next) { if (!art->chance) LOG (llevError, "Warning: artifact with no chance: %s\n", &art->item->name); @@ -1504,7 +1522,7 @@ } if (change->nrof) - op->nrof = RANDOM () % ((int) change->nrof) + 1; + op->nrof = rndm (change->nrof) + 1; op->stats.exp += change->stats.exp; /* Speed modifier */ op->stats.wc += change->stats.wc; @@ -1617,8 +1635,8 @@ op->value *= change->value; - if (change->material) - op->material = change->material; + if (change->materials) + op->materials = change->materials; if (change->materialname) op->materialname = change->materialname; @@ -1722,9 +1740,9 @@ for (i = 0; i < ARTIFACT_TRIES; i++) { - int roll = RANDOM () % al->total_chance; + int roll = rndm (al->total_chance); - for (art = al->items; art != NULL; art = art->next) + for (art = al->items; art; art = art->next) { roll -= art->chance; if (roll < 0)