/* * Apply magic to armour */ static void a_m_aux_2(object_type *o_ptr, int level, int power) { int toac1 = randint1(5) + m_bonus(5, level); int toac2 = m_bonus(10, level); if (power == -2) o_ptr->to_a -= toac1 + toac2; else if (power == -1) o_ptr->to_a -= toac1; else if (power == 1) o_ptr->to_a += toac1; else if (power == 2) o_ptr->to_a += toac1 + toac2; /* Analyze type */ switch (o_ptr->tval) { case TV_DRAG_ARMOR: { /* Rating boost */ rating += object_power(o_ptr, FALSE, NULL, TRUE) / 15; /* Mention the item */ if (OPT(cheat_peek)) object_mention(o_ptr); break; } } }
/** * Copy artifact data to a normal object, and set various slightly hacky * globals. */ static void copy_artifact_data(object_type *o_ptr, const artifact_type *a_ptr) { /* Extract the other fields */ o_ptr->pval = a_ptr->pval; o_ptr->ac = a_ptr->ac; o_ptr->dd = a_ptr->dd; o_ptr->ds = a_ptr->ds; o_ptr->to_a = a_ptr->to_a; o_ptr->to_h = a_ptr->to_h; o_ptr->to_d = a_ptr->to_d; o_ptr->weight = a_ptr->weight; /* Hack -- extract the "cursed" flags */ if (cursed_p(a_ptr)) { bitflag curse_flags[OF_SIZE]; of_copy(curse_flags, a_ptr->flags); flags_mask(curse_flags, OF_SIZE, OF_CURSE_MASK, FLAG_END); of_union(o_ptr->flags, curse_flags); } /* Mega-Hack -- increase the level rating * - a sizeable increase for any artifact (c.f. up to 30 for ego items) * - a bigger increase for more powerful artifacts */ rating += 30; rating += object_power(o_ptr, FALSE, NULL, TRUE) / 25; /* Set the good item flag */ good_item_flag = TRUE; /* Cheat -- peek at the item */ if (OPT(cheat_peek)) object_mention(o_ptr); }
/** * Try to find an affix for an object, setting o_ptr->affix[n] if successful * and checking for a theme for the object. */ static void obj_add_affix(object_type *o_ptr, int level, int max_lev, int min_lev) { int i, chosen; object_type object_type_body; object_type *j_ptr = &object_type_body; /* Cannot further improve artifacts or maxed items or themed items */ if (o_ptr->artifact || o_ptr->affix[MAX_AFFIXES - 1] || o_ptr->theme) return; /* Occasionally boost the generation level of an affix */ if (level > 0 && one_in_(GREAT_EGO)) level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH)); /* Make a copy of the object in case things go wrong */ object_copy(j_ptr, o_ptr); /* Use the first available affix slot */ for (i = 0; i < MAX_AFFIXES; i++) if (!o_ptr->affix[i]) { /* Try to get a legal affix for this item */ chosen = obj_find_affix(o_ptr, level, max_lev, min_lev); /* Actually apply the affix to the item */ if (chosen) { o_ptr->affix[i] = &e_info[chosen]; ego_apply_magic(o_ptr, level, chosen); } break; } /* Roll back if we've broken something, otherwise check for a theme */ if (object_power(o_ptr, FALSE, NULL, TRUE) >= INHIBIT_POWER) object_copy(o_ptr, j_ptr); else { chosen = obj_find_theme(o_ptr, level); if (chosen) { obj_apply_theme(o_ptr, level, chosen); if (object_power(o_ptr, FALSE, NULL, TRUE) >= INHIBIT_POWER) object_copy(o_ptr, j_ptr); } } return; }
/** * Return the real price of a known (or partly known) item. * * Wand and staffs get cost for each charge. * * Wearable items (weapons, launchers, jewelry, lights, armour) and ammo * are priced according to their power rating. All ammo, and normal (non-ego) * torches are scaled down by AMMO_RESCALER to reflect their impermanence. */ s32b object_value_real(const object_type *obj, int qty, int verbose, bool known) { s32b value, total_value; s32b power; int a = 1; int b = 5; static file_mode pricing_mode = MODE_WRITE; /* Wearables and ammo have prices that vary by individual item properties */ if (tval_has_variable_power(obj)) { char buf[1024]; ang_file *log_file = NULL; /* Logging */ if (verbose) { path_build(buf, sizeof(buf), ANGBAND_DIR_USER, "pricing.log"); log_file = file_open(buf, pricing_mode, FTYPE_TEXT); if (!log_file) { msg("Error - can't open pricing.log for writing."); exit(1); } pricing_mode = MODE_APPEND; } file_putf(log_file, "object is %s\n", obj->kind->name); /* Calculate power and value */ power = object_power(obj, verbose, log_file, known); value = SGN(power) * ((a * power * power) + (b * power)); /* Rescale for expendables */ if ((tval_is_light(obj) && of_has(obj->flags, OF_BURNS_OUT) && !obj->ego) || tval_is_ammo(obj)) { value = value / AMMO_RESCALER; if (value < 1) value = 1; } /* More logging */ file_putf(log_file, "a is %d and b is %d\n", a, b); file_putf(log_file, "value is %d\n", value); if (verbose) { if (!file_close(log_file)) { msg("Error - can't close pricing.log file."); exit(1); } } /* Get the total value */ total_value = value * qty; if (total_value < 0) total_value = 0; } else { /* Worthless items */ if (!obj->kind->cost) return (0L); /* Base cost */ value = obj->kind->cost; /* Analyze the item type and quantity */ if (tval_can_have_charges(obj)) { int charges; total_value = value * qty; /* Calculate number of charges, rounded up */ charges = obj->pval * qty / obj->number; if ((obj->pval * qty) % obj->number != 0) charges++; /* Pay extra for charges, depending on standard number of charges */ total_value += value * charges / 20; } else total_value = value * qty; /* No negative value */ if (total_value < 0) total_value = 0; } /* Return the value */ return (total_value); }
/* * Create a spoiler file for artifacts */ static void spoil_artifact(const char *fname) { int i, j; object_type *i_ptr; object_type object_type_body; char buf[1024]; /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); fh = file_open(buf, MODE_WRITE, FTYPE_TEXT); /* Oops */ if (!fh) { msg("Cannot create spoiler file."); return; } /* Dump to the spoiler file */ text_out_hook = text_out_to_file; text_out_file = fh; /* Dump the header */ spoiler_underline(format("Artifact Spoilers for %s", buildid), '='); /* List the artifacts by tval */ for (i = 0; group_artifact[i].tval; i++) { /* Write out the group title */ if (group_artifact[i].name) { spoiler_blanklines(2); spoiler_underline(group_artifact[i].name, '='); spoiler_blanklines(1); } /* Now search through all of the artifacts */ for (j = 1; j < z_info->a_max; ++j) { artifact_type *a_ptr = &a_info[j]; char buf[80]; /* We only want objects in the current group */ if (a_ptr->tval != group_artifact[i].tval) continue; /* Get local object */ i_ptr = &object_type_body; /* Wipe the object */ object_wipe(i_ptr); /* Attempt to "forge" the artifact */ if (!make_fake_artifact(i_ptr, a_ptr)) continue; /* Grab artifact name */ object_desc(buf, sizeof(buf), i_ptr, ODESC_PREFIX | ODESC_COMBAT | ODESC_EXTRA | ODESC_SPOIL); /* Print name and underline */ spoiler_underline(buf, '-'); /* Write out the artifact description to the spoiler file */ object_info_spoil(fh, i_ptr, 80); /* * Determine the minimum and maximum depths an * artifact can appear, its rarity, its weight, and * its power rating. */ text_out("\nMin Level %u, Max Level %u, Generation chance %u, Power %d, %d.%d lbs\n", a_ptr->alloc_min, a_ptr->alloc_max, a_ptr->alloc_prob, object_power(i_ptr, FALSE, NULL, TRUE), (a_ptr->weight / 10), (a_ptr->weight % 10)); /* Terminate the entry */ spoiler_blanklines(2); } } /* Check for errors */ if (!file_close(fh)) { msg("Cannot close spoiler file."); return; } /* Message */ msg("Successfully created a spoiler file."); }
/** * Create a spoiler file for artifacts */ static void spoil_artifact(const char *fname) { int i, j; char buf[1024]; /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); fh = file_open(buf, MODE_WRITE, FTYPE_TEXT); /* Oops */ if (!fh) { msg("Cannot create spoiler file."); return; } /* Dump to the spoiler file */ text_out_hook = text_out_to_file; text_out_file = fh; /* Dump the header */ spoiler_underline(format("Artifact Spoilers for %s", buildid), '='); text_out("\n Randart seed is %u\n", seed_randart); /* List the artifacts by tval */ for (i = 0; group_artifact[i].tval; i++) { /* Write out the group title */ if (group_artifact[i].name) { spoiler_blanklines(2); spoiler_underline(group_artifact[i].name, '='); spoiler_blanklines(1); } /* Now search through all of the artifacts */ for (j = 1; j < z_info->a_max; ++j) { struct artifact *art = &a_info[j]; char buf2[80]; char *temp; struct object *obj, *known_obj; /* We only want objects in the current group */ if (art->tval != group_artifact[i].tval) continue; /* Get local object */ obj = object_new(); known_obj = object_new(); /* Attempt to "forge" the artifact */ if (!make_fake_artifact(obj, art)) { object_delete(&known_obj); object_delete(&obj); continue; } /* Grab artifact name */ object_copy(known_obj, obj); obj->known = known_obj; object_desc(buf2, sizeof(buf2), obj, ODESC_PREFIX | ODESC_COMBAT | ODESC_EXTRA | ODESC_SPOIL); /* Print name and underline */ spoiler_underline(buf2, '-'); /* Temporarily blank the artifact flavour text - spoilers spoil the mechanics, not the atmosphere. */ temp = obj->artifact->text; obj->artifact->text = NULL; /* Write out the artifact description to the spoiler file */ object_info_spoil(fh, obj, 80); /* Put back the flavour */ obj->artifact->text = temp; /* * Determine the minimum and maximum depths an * artifact can appear, its rarity, its weight, and * its power rating. */ text_out("\nMin Level %u, Max Level %u, Generation chance %u, Power %d, %d.%d lbs\n", art->alloc_min, art->alloc_max, art->alloc_prob, object_power(obj, false, NULL), (art->weight / 10), (art->weight % 10)); if (OPT(birth_randarts)) text_out("%s.\n", art->text); /* Terminate the entry */ spoiler_blanklines(2); object_delete(&known_obj); object_delete(&obj); } } /* Check for errors */ if (!file_close(fh)) { msg("Cannot close spoiler file."); return; } /* Message */ msg("Successfully created a spoiler file."); }