/*! * @briefアイテムの基礎能力値を調整する / Tweak an item * @param o_ptr 調整するアイテムの参照ポインタ * @return なし */ static void wiz_tweak_item(object_type *o_ptr) { cptr p; char tmp_val[80]; /* Hack -- leave artifacts alone */ if (object_is_artifact(o_ptr)) return; p = "Enter new 'pval' setting: "; sprintf(tmp_val, "%d", o_ptr->pval); if (!get_string(p, tmp_val, 5)) return; o_ptr->pval = atoi(tmp_val); wiz_display_item(o_ptr); p = "Enter new 'to_a' setting: "; sprintf(tmp_val, "%d", o_ptr->to_a); if (!get_string(p, tmp_val, 5)) return; o_ptr->to_a = atoi(tmp_val); wiz_display_item(o_ptr); p = "Enter new 'to_h' setting: "; sprintf(tmp_val, "%d", o_ptr->to_h); if (!get_string(p, tmp_val, 5)) return; o_ptr->to_h = atoi(tmp_val); wiz_display_item(o_ptr); p = "Enter new 'to_d' setting: "; sprintf(tmp_val, "%d", o_ptr->to_d); if (!get_string(p, tmp_val, 5)) return; o_ptr->to_d = atoi(tmp_val); wiz_display_item(o_ptr); }
/* * Check if an object is neither artifact, ego, nor 'smith' object */ bool object_is_nameless(object_type *o_ptr) { if (!object_is_artifact(o_ptr) && !object_is_ego(o_ptr) && !object_is_smith(o_ptr)) return TRUE; return FALSE; }
/*! * @brief 検査対象のアイテムの数を変更する / * Change the quantity of a the item * @param o_ptr 変更するアイテム情報構造体の参照ポインタ * @return なし */ static void wiz_quantity_item(object_type *o_ptr) { int tmp_int, tmp_qnt; char tmp_val[100]; /* Never duplicate artifacts */ if (object_is_artifact(o_ptr)) return; /* Store old quantity. -LM- */ tmp_qnt = o_ptr->number; /* Default */ sprintf(tmp_val, "%d", o_ptr->number); /* Query */ if (get_string("Quantity: ", tmp_val, 2)) { /* Extract */ tmp_int = atoi(tmp_val); /* Paranoia */ if (tmp_int < 1) tmp_int = 1; if (tmp_int > 99) tmp_int = 99; /* Accept modifications */ o_ptr->number = tmp_int; } if (o_ptr->tval == TV_ROD) { o_ptr->pval = o_ptr->pval * o_ptr->number / tmp_qnt; } }
static bool _detect_objects_ego(int range) { int i, y, x; bool detect = FALSE; if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range /= 3; /* Scan all objects */ for (i = 1; i < o_max; i++) { object_type *o_ptr = &o_list[i]; if (!o_ptr->k_idx) continue; if (o_ptr->held_m_idx) continue; y = o_ptr->iy; x = o_ptr->ix; if (distance(py, px, y, x) > range) continue; if (object_is_artifact(o_ptr) || object_is_ego(o_ptr) ) { o_ptr->marked |= OM_FOUND; lite_spot(y, x); detect = TRUE; } } if (detect) msg_print("You sense the presence of magic objects!"); return detect; }
static bool _fire_p(object_type *o_ptr) { u32b flgs[TR_FLAG_SIZE]; if (object_is_artifact(o_ptr)) return FALSE; if (o_ptr->tval != TV_SCROLL && o_ptr->tval != TV_STAFF) return FALSE; object_flags(o_ptr, flgs); if (have_flag(flgs, TR_IGNORE_FIRE)) return FALSE; return TRUE; }
static bool _air_p(object_type *o_ptr) { u32b flgs[TR_FLAG_SIZE]; if (object_is_artifact(o_ptr)) return FALSE; if ( o_ptr->tval != TV_RING && o_ptr->tval != TV_AMULET && o_ptr->tval != TV_WAND && o_ptr->tval != TV_ROD) { return FALSE; } object_flags(o_ptr, flgs); if (have_flag(flgs, TR_IGNORE_ELEC)) return FALSE; return TRUE; }
static bool _sense_great_discovery(int range) { int i, y, x; int range2 = range; bool detect = FALSE; if (d_info[dungeon_type].flags1 & DF1_DARKNESS) range2 /= 3; /* Scan objects */ for (i = 1; i < o_max; i++) { object_type *o_ptr = &o_list[i]; /* Skip dead objects */ if (!o_ptr->k_idx) continue; /* Skip held objects */ if (o_ptr->held_m_idx) continue; /* Only alert to great discoveries */ if (!object_is_artifact(o_ptr)) continue; /* Only alert to new discoveries */ if (object_is_known(o_ptr)) continue; /* Location */ y = o_ptr->iy; x = o_ptr->ix; /* Only detect nearby objects */ if (distance(py, px, y, x) > range2) continue; /* Hack -- memorize it */ o_ptr->marked |= OM_FOUND; p_ptr->window |= PW_OBJECT_LIST; /* Redraw */ lite_spot(y, x); /* Detect */ detect = TRUE; } return (detect); }
/*! * @brief アイテムの質を選択して再生成する / * Apply magic to an item or turn it into an artifact. -Bernd- * @param o_ptr 再生成の対象となるアイテム情報の参照ポインタ * @return なし */ static void wiz_reroll_item(object_type *o_ptr) { object_type forge; object_type *q_ptr; char ch; bool changed = FALSE; /* Hack -- leave artifacts alone */ if (object_is_artifact(o_ptr)) return; /* Get local object */ q_ptr = &forge; /* Copy the object */ object_copy(q_ptr, o_ptr); /* Main loop. Ask for magification and artifactification */ while (TRUE) { /* Display full item debug information */ wiz_display_item(q_ptr); /* Ask wizard what to do. */ if (!get_com("[a]ccept, [w]orthless, [c]ursed, [n]ormal, [g]ood, [e]xcellent, [s]pecial? ", &ch, FALSE)) { /* Preserve wizard-generated artifacts */ if (object_is_fixed_artifact(q_ptr)) { a_info[q_ptr->name1].cur_num = 0; q_ptr->name1 = 0; } changed = FALSE; break; } /* Create/change it! */ if (ch == 'A' || ch == 'a') { changed = TRUE; break; } /* Preserve wizard-generated artifacts */ if (object_is_fixed_artifact(q_ptr)) { a_info[q_ptr->name1].cur_num = 0; q_ptr->name1 = 0; } switch(ch) { /* Apply bad magic, but first clear object */ case 'w': case 'W': { object_prep(q_ptr, o_ptr->k_idx); apply_magic(q_ptr, dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT | AM_CURSED); break; } /* Apply bad magic, but first clear object */ case 'c': case 'C': { object_prep(q_ptr, o_ptr->k_idx); apply_magic(q_ptr, dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_CURSED); break; } /* Apply normal magic, but first clear object */ case 'n': case 'N': { object_prep(q_ptr, o_ptr->k_idx); apply_magic(q_ptr, dun_level, AM_NO_FIXED_ART); break; } /* Apply good magic, but first clear object */ case 'g': case 'G': { object_prep(q_ptr, o_ptr->k_idx); apply_magic(q_ptr, dun_level, AM_NO_FIXED_ART | AM_GOOD); break; } /* Apply great magic, but first clear object */ case 'e': case 'E': { object_prep(q_ptr, o_ptr->k_idx); apply_magic(q_ptr, dun_level, AM_NO_FIXED_ART | AM_GOOD | AM_GREAT); break; } /* Apply special magic, but first clear object */ case 's': case 'S': { object_prep(q_ptr, o_ptr->k_idx); apply_magic(q_ptr, dun_level, AM_GOOD | AM_GREAT | AM_SPECIAL); /* Failed to create artifact; make a random one */ if (!object_is_artifact(q_ptr)) create_artifact(q_ptr, FALSE); break; } } q_ptr->iy = o_ptr->iy; q_ptr->ix = o_ptr->ix; q_ptr->next_o_idx = o_ptr->next_o_idx; q_ptr->marked = o_ptr->marked; } /* Notice change */ if (changed) { /* Apply changes */ object_copy(o_ptr, q_ptr); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); /* Combine / Reorder the pack (later) */ p_ptr->notice |= (PN_COMBINE | PN_REORDER); /* Window stuff */ p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER); } }
static void _shooter_info_aux(doc_ptr doc, object_type *bow, object_type *arrow, int ct) { char o_name[MAX_NLEN]; u32b flgs[TR_FLAG_SIZE]; int mult; int to_h = 0; int to_d = 0; int to_h_bow = 0; int to_d_bow = 0; int to_h_xtra = p_ptr->shooter_info.dis_to_h; int to_d_xtra = p_ptr->shooter_info.dis_to_d; int dd = arrow->dd; int ds = arrow->ds; critical_t crit = {0}; int num_fire = 0; doc_ptr cols[2] = {0}; cols[0] = doc_alloc(60); cols[1] = doc_alloc(10); missile_flags_known(arrow, flgs); mult = bow_mult(bow); if (object_is_artifact(arrow)) num_fire = 100; else if (p_ptr->shooter_info.num_fire) num_fire = p_ptr->shooter_info.num_fire * 100 * 100 / bow_energy(bow->sval); if (object_is_known(bow)) { to_h_bow = bow->to_h; to_d_bow = bow->to_d; if (weaponmaster_is_(WEAPONMASTER_CROSSBOWS) && p_ptr->lev >= 15) to_d_bow += 1 + p_ptr->lev/10; } if (object_is_known(arrow)) { to_h = arrow->to_h; to_d = arrow->to_d; } if (p_ptr->big_shot) dd *= 2; { const int ct = 10 * 1000; int i; /* Compute Average Effects of Criticals by sampling */ for (i = 0; i < ct; i++) { critical_t tmp = critical_shot(arrow->weight, arrow->to_h); if (tmp.desc) { crit.mul += tmp.mul; crit.to_d += tmp.to_d; } else crit.mul += 100; } crit.mul = crit.mul / ct; crit.to_d = crit.to_d * 100 / ct; } /* First Column */ object_desc(o_name, arrow, OD_OMIT_INSCRIPTION | OD_COLOR_CODED); doc_printf(cols[0], "<color:u> Ammo #%-2d</color>: <indent><style:indent>%s</style></indent>\n", ct, o_name); doc_printf(cols[0], " %-8.8s: %d.%d lbs\n", "Weight", arrow->weight/10, arrow->weight%10); doc_printf(cols[0], " %-8.8s: %d + %d = %d\n", "To Hit", to_h, to_h_bow + to_h_xtra, to_h + to_h_bow + to_h_xtra); doc_printf(cols[0], " %-8.8s: %d + %d = %d (%s)\n", "To Dam", to_d, to_d_bow, to_d + to_d_bow, "Multiplier Applies"); doc_printf(cols[0], " <color:G>%-8.8s</color>\n", "Damage"); if (crit.to_d) { doc_printf(cols[0], " %-8.8s: %d.%02dx + %d.%02d\n", "Crits", crit.mul/100, crit.mul%100, crit.to_d/100, crit.to_d%100); } else { doc_printf(cols[0], " %-8.8s: %d.%02dx\n", "Crits", crit.mul/100, crit.mul%100); } to_d = to_d + to_d_bow; mult = mult * crit.mul / 100; to_d_xtra = to_d_xtra + crit.to_d/100; _display_missile_slay(mult, 100, num_fire, dd, ds, to_d, to_d_xtra, "Normal", TERM_WHITE, cols[0]); if (p_ptr->tim_force && p_ptr->csp > (p_ptr->msp / 30)) { mult = mult * 3 / 2; _display_missile_slay(mult, 100, num_fire, dd, ds, to_d, to_d_xtra, "Force", TERM_L_BLUE, cols[0]); } if (have_flag(flgs, TR_KILL_ANIMAL)) _display_missile_slay(mult, 270, num_fire, dd, ds, to_d, to_d_xtra, "Animals", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_ANIMAL)) _display_missile_slay(mult, 170, num_fire, dd, ds, to_d, to_d_xtra, "Animals", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_EVIL)) _display_missile_slay(mult, 250, num_fire, dd, ds, to_d, to_d_xtra, "Evil", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_EVIL)) _display_missile_slay(mult, 150, num_fire, dd, ds, to_d, to_d_xtra, "Evil", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_HUMAN)) _display_missile_slay(mult, 270, num_fire, dd, ds, to_d, to_d_xtra, "Human", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_HUMAN)) _display_missile_slay(mult, 170, num_fire, dd, ds, to_d, to_d_xtra, "Human", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_UNDEAD)) _display_missile_slay(mult, 300, num_fire, dd, ds, to_d, to_d_xtra, "Undead", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_UNDEAD)) _display_missile_slay(mult, 200, num_fire, dd, ds, to_d, to_d_xtra, "Undead", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_DEMON)) _display_missile_slay(mult, 300, num_fire, dd, ds, to_d, to_d_xtra, "Demons", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_DEMON)) _display_missile_slay(mult, 200, num_fire, dd, ds, to_d, to_d_xtra, "Demons", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_ORC)) _display_missile_slay(mult, 300, num_fire, dd, ds, to_d, to_d_xtra, "Orcs", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_ORC)) _display_missile_slay(mult, 200, num_fire, dd, ds, to_d, to_d_xtra, "Orcs", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_TROLL)) _display_missile_slay(mult, 300, num_fire, dd, ds, to_d, to_d_xtra, "Trolls", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_TROLL)) _display_missile_slay(mult, 200, num_fire, dd, ds, to_d, to_d_xtra, "Trolls", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_GIANT)) _display_missile_slay(mult, 300, num_fire, dd, ds, to_d, to_d_xtra, "Giants", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_GIANT)) _display_missile_slay(mult, 200, num_fire, dd, ds, to_d, to_d_xtra, "Giants", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_KILL_DRAGON)) _display_missile_slay(mult, 300, num_fire, dd, ds, to_d, to_d_xtra, "Dragons", TERM_YELLOW, cols[0]); else if (have_flag(flgs, TR_SLAY_DRAGON)) _display_missile_slay(mult, 200, num_fire, dd, ds, to_d, to_d_xtra, "Dragons", TERM_YELLOW, cols[0]); if (have_flag(flgs, TR_BRAND_ACID)) _display_missile_slay(mult, 170, num_fire, dd, ds, to_d, to_d_xtra, "Acid", TERM_RED, cols[0]); if (have_flag(flgs, TR_BRAND_ELEC)) _display_missile_slay(mult, 170, num_fire, dd, ds, to_d, to_d_xtra, "Elec", TERM_RED, cols[0]); if (have_flag(flgs, TR_BRAND_FIRE)) _display_missile_slay(mult, 170, num_fire, dd, ds, to_d, to_d_xtra, "Fire", TERM_RED, cols[0]); if (have_flag(flgs, TR_BRAND_COLD)) _display_missile_slay(mult, 170, num_fire, dd, ds, to_d, to_d_xtra, "Cold", TERM_RED, cols[0]); if (have_flag(flgs, TR_BRAND_POIS)) _display_missile_slay(mult, 170, num_fire, dd, ds, to_d, to_d_xtra, "Poison", TERM_RED, cols[0]); /* Second Column */ to_h = to_h + to_h_bow + to_h_xtra; doc_insert(cols[1], " <color:G>AC Hit</color>\n"); doc_printf(cols[1], "%3d %2d%%\n", 25, bow_hit_chance(bow->sval, to_h, 25)); doc_printf(cols[1], "%3d %2d%%\n", 50, bow_hit_chance(bow->sval, to_h, 50)); doc_printf(cols[1], "%3d %2d%%\n", 100, bow_hit_chance(bow->sval, to_h, 100)); doc_printf(cols[1], "%3d %2d%%\n", 150, bow_hit_chance(bow->sval, to_h, 150)); doc_printf(cols[1], "%3d %2d%%\n", 175, bow_hit_chance(bow->sval, to_h, 175)); doc_printf(cols[1], "%3d %2d%%\n", 200, bow_hit_chance(bow->sval, to_h, 200)); doc_insert_cols(doc, cols, 2, 1); doc_free(cols[0]); doc_free(cols[1]); }
static bool _earth_p(object_type *o_ptr) { if (object_is_artifact(o_ptr)) return FALSE; if (o_ptr->tval != TV_POTION) return FALSE; return TRUE; }