X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fobject2.c;h=13c42c75c2a720e0d0a031489a13f3e3d90109f6;hb=c671e94ac8bb56e6a7a75927492e8e654118a069;hp=93acb50c6a74b702be064b35e28f49882ba982ec;hpb=35831b37978388f943e7c7ec80351080f4941ab0;p=hengbandforosx%2Fhengbandosx.git diff --git a/src/object2.c b/src/object2.c index 93acb50c6..13c42c75c 100644 --- a/src/object2.c +++ b/src/object2.c @@ -12,47 +12,16 @@ */ #include "angband.h" +#include "object-boost.h" #include "object-hook.h" #include "object-curse.h" +#include "objectkind-hook.h" +#include "artifact.h" +#include "player-status.h" +#include "feature.h" +#include "player-move.h" -static void one_sustain(object_type *o_ptr); - - -static cptr const kaji_tips[5] = -{ -#ifdef JP - "現在持っているエッセンスの一覧を表示する。", - "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。", - "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。", - "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。", - "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。", -#else - "Display essences you have.", - "Extract essences from an item. The item become non magical.", - "Remove added essences from an equipment which was improved before. The removed essence will be ruined.", - "Add essences to an item. The improved items or artifacts cannot be reimprove.", - "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.", -#endif -}; - -/*! - * @brief 対象のオブジェクトにランダムな能力維持を一つ付加する。/ Choose one random sustain - * @details 重複の抑止はない。 - * @param o_ptr 対象のオブジェクト構造体ポインタ - * @return なし - */ -static void one_sustain(object_type *o_ptr) -{ - switch (randint0(6)) - { - case 0: add_flag(o_ptr->art_flags, TR_SUST_STR); break; - case 1: add_flag(o_ptr->art_flags, TR_SUST_INT); break; - case 2: add_flag(o_ptr->art_flags, TR_SUST_WIS); break; - case 3: add_flag(o_ptr->art_flags, TR_SUST_DEX); break; - case 4: add_flag(o_ptr->art_flags, TR_SUST_CON); break; - case 5: add_flag(o_ptr->art_flags, TR_SUST_CHR); break; - } -} +#include "monsterrace-hook.h" /*! * @brief 床上、モンスター所持でスタックされたアイテムを削除しスタックを補完する / Excise a dungeon object from any stacks @@ -64,30 +33,21 @@ void excise_object_idx(OBJECT_IDX o_idx) object_type *j_ptr; OBJECT_IDX this_o_idx, next_o_idx = 0; - - s16b prev_o_idx = 0; - + OBJECT_IDX prev_o_idx = 0; /* Object */ - j_ptr = &o_list[o_idx]; + j_ptr = ¤t_floor_ptr->o_list[o_idx]; - /* Monster */ if (j_ptr->held_m_idx) { monster_type *m_ptr; - - /* Monster */ - m_ptr = &m_list[j_ptr->held_m_idx]; + m_ptr = ¤t_floor_ptr->m_list[j_ptr->held_m_idx]; /* Scan all objects in the grid */ for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; - - /* Acquire object */ - o_ptr = &o_list[this_o_idx]; - - /* Acquire next object */ + o_ptr = ¤t_floor_ptr->o_list[this_o_idx]; next_o_idx = o_ptr->next_o_idx; if (this_o_idx == o_idx) @@ -105,7 +65,7 @@ void excise_object_idx(OBJECT_IDX o_idx) object_type *k_ptr; /* Previous object */ - k_ptr = &o_list[prev_o_idx]; + k_ptr = ¤t_floor_ptr->o_list[prev_o_idx]; /* Remove from list */ k_ptr->next_o_idx = next_o_idx; @@ -125,23 +85,18 @@ void excise_object_idx(OBJECT_IDX o_idx) /* Dungeon */ else { - cave_type *c_ptr; + grid_type *g_ptr; POSITION y = j_ptr->iy; POSITION x = j_ptr->ix; - /* Grid */ - c_ptr = &cave[y][x]; + g_ptr = ¤t_floor_ptr->grid_array[y][x]; /* Scan all objects in the grid */ - for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) + for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; - - /* Acquire object */ - o_ptr = &o_list[this_o_idx]; - - /* Acquire next object */ + o_ptr = ¤t_floor_ptr->o_list[this_o_idx]; next_o_idx = o_ptr->next_o_idx; if (this_o_idx == o_idx) @@ -150,7 +105,7 @@ void excise_object_idx(OBJECT_IDX o_idx) if (prev_o_idx == 0) { /* Remove from list */ - c_ptr->o_idx = next_o_idx; + g_ptr->o_idx = next_o_idx; } /* Real previous */ @@ -159,7 +114,7 @@ void excise_object_idx(OBJECT_IDX o_idx) object_type *k_ptr; /* Previous object */ - k_ptr = &o_list[prev_o_idx]; + k_ptr = ¤t_floor_ptr->o_list[prev_o_idx]; /* Remove from list */ k_ptr->next_o_idx = next_o_idx; @@ -193,21 +148,16 @@ void delete_object_idx(OBJECT_IDX o_idx) excise_object_idx(o_idx); /* Object */ - j_ptr = &o_list[o_idx]; + j_ptr = ¤t_floor_ptr->o_list[o_idx]; /* Dungeon floor */ if (!(j_ptr->held_m_idx)) { POSITION y, x; - y = j_ptr->iy; x = j_ptr->ix; - - /* Visual update */ lite_spot(y, x); } - - /* Wipe the object */ object_wipe(j_ptr); /* Count objects */ @@ -224,27 +174,20 @@ void delete_object_idx(OBJECT_IDX o_idx) */ void delete_object(POSITION y, POSITION x) { - cave_type *c_ptr; + grid_type *g_ptr; OBJECT_IDX this_o_idx, next_o_idx = 0; /* Refuse "illegal" locations */ if (!in_bounds(y, x)) return; - /* Grid */ - c_ptr = &cave[y][x]; + g_ptr = ¤t_floor_ptr->grid_array[y][x]; /* Scan all objects in the grid */ - for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) + for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; - - /* Acquire object */ - o_ptr = &o_list[this_o_idx]; - - /* Acquire next object */ + o_ptr = ¤t_floor_ptr->o_list[this_o_idx]; next_o_idx = o_ptr->next_o_idx; - - /* Wipe the object */ object_wipe(o_ptr); /* Count objects */ @@ -252,9 +195,8 @@ void delete_object(POSITION y, POSITION x) } /* Objects are gone */ - c_ptr->o_idx = 0; + g_ptr->o_idx = 0; - /* Visual update */ lite_spot(y, x); } @@ -266,21 +208,19 @@ void delete_object(POSITION y, POSITION x) * @param i2 整理したい配列の終点 * @return なし */ -static void compact_objects_aux(IDX i1, IDX i2) +static void compact_objects_aux(OBJECT_IDX i1, OBJECT_IDX i2) { - IDX i; - cave_type *c_ptr; + OBJECT_IDX i; + grid_type *g_ptr; object_type *o_ptr; /* Do nothing */ if (i1 == i2) return; - /* Repair objects */ for (i = 1; i < o_max; i++) { - /* Acquire object */ - o_ptr = &o_list[i]; + o_ptr = ¤t_floor_ptr->o_list[i]; /* Skip "dead" objects */ if (!o_ptr->k_idx) continue; @@ -292,19 +232,14 @@ static void compact_objects_aux(IDX i1, IDX i2) o_ptr->next_o_idx = i2; } } + o_ptr = ¤t_floor_ptr->o_list[i1]; - - /* Acquire object */ - o_ptr = &o_list[i1]; - - - /* Monster */ if (o_ptr->held_m_idx) { monster_type *m_ptr; /* Acquire monster */ - m_ptr = &m_list[o_ptr->held_m_idx]; + m_ptr = ¤t_floor_ptr->m_list[o_ptr->held_m_idx]; /* Repair monster */ if (m_ptr->hold_o_idx == i1) @@ -324,19 +259,18 @@ static void compact_objects_aux(IDX i1, IDX i2) x = o_ptr->ix; /* Acquire grid */ - c_ptr = &cave[y][x]; + g_ptr = ¤t_floor_ptr->grid_array[y][x]; /* Repair grid */ - if (c_ptr->o_idx == i1) + if (g_ptr->o_idx == i1) { /* Repair */ - c_ptr->o_idx = i2; + g_ptr->o_idx = i2; } } - /* Structure copy */ - o_list[i2] = o_list[i1]; + current_floor_ptr->o_list[i2] = current_floor_ptr->o_list[i1]; /* Wipe the hole */ object_wipe(o_ptr); @@ -367,16 +301,11 @@ void compact_objects(int size) int cur_lev, cur_dis, chance; object_type *o_ptr; - /* Compact */ if (size) { msg_print(_("アイテム情報を圧縮しています...", "Compacting objects...")); - - /* Redraw map */ p_ptr->redraw |= (PR_MAP); - - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); } @@ -393,7 +322,7 @@ void compact_objects(int size) /* Examine the objects */ for (i = 1; i < o_max; i++) { - o_ptr = &o_list[i]; + o_ptr = ¤t_floor_ptr->o_list[i]; /* Skip dead objects */ if (!o_ptr->k_idx) continue; @@ -401,15 +330,13 @@ void compact_objects(int size) /* Hack -- High level objects start out "immune" */ if (k_info[o_ptr->k_idx].level > cur_lev) continue; - /* Monster */ if (o_ptr->held_m_idx) { monster_type *m_ptr; /* Acquire monster */ - m_ptr = &m_list[o_ptr->held_m_idx]; + m_ptr = ¤t_floor_ptr->m_list[o_ptr->held_m_idx]; - /* Get the location */ y = m_ptr->fy; x = m_ptr->fx; @@ -420,7 +347,6 @@ void compact_objects(int size) /* Dungeon */ else { - /* Get the location */ y = o_ptr->iy; x = o_ptr->ix; } @@ -438,7 +364,6 @@ void compact_objects(int size) /* Apply the saving throw */ if (randint0(100) < chance) continue; - /* Delete the object */ delete_object_idx(i); /* Count it */ @@ -450,7 +375,7 @@ void compact_objects(int size) /* Excise dead objects (backwards!) */ for (i = o_max - 1; i >= 1; i--) { - o_ptr = &o_list[i]; + o_ptr = ¤t_floor_ptr->o_list[i]; /* Skip real objects */ if (o_ptr->k_idx) continue; @@ -469,7 +394,7 @@ void compact_objects(int size) * Delete all the items when player leaves the level * @note we do NOT visually reflect these (irrelevant) changes * @details - * Hack -- we clear the "c_ptr->o_idx" field for every grid, + * Hack -- we clear the "g_ptr->o_idx" field for every grid, * and the "m_ptr->next_o_idx" field for every monster, since * we know we are clearing every object. Technically, we only * clear those fields for grids/monsters containing objects, @@ -483,7 +408,7 @@ void wipe_o_list(void) /* Delete the existing objects */ for (i = 1; i < o_max; i++) { - object_type *o_ptr = &o_list[i]; + object_type *o_ptr = ¤t_floor_ptr->o_list[i]; /* Skip dead objects */ if (!o_ptr->k_idx) continue; @@ -499,13 +424,10 @@ void wipe_o_list(void) } } - /* Monster */ if (o_ptr->held_m_idx) { monster_type *m_ptr; - - /* Monster */ - m_ptr = &m_list[o_ptr->held_m_idx]; + m_ptr = ¤t_floor_ptr->m_list[o_ptr->held_m_idx]; /* Hack -- see above */ m_ptr->hold_o_idx = 0; @@ -514,20 +436,18 @@ void wipe_o_list(void) /* Dungeon */ else { - cave_type *c_ptr; + grid_type *g_ptr; /* Access location */ POSITION y = o_ptr->iy; POSITION x = o_ptr->ix; /* Access grid */ - c_ptr = &cave[y][x]; + g_ptr = ¤t_floor_ptr->grid_array[y][x]; /* Hack -- see above */ - c_ptr->o_idx = 0; + g_ptr->o_idx = 0; } - - /* Wipe the object */ object_wipe(o_ptr); } @@ -552,7 +472,7 @@ OBJECT_IDX o_pop(void) OBJECT_IDX i; /* Initial allocation */ - if (o_max < max_o_idx) + if (o_max < current_floor_ptr->max_o_idx) { /* Get next space */ i = o_max; @@ -572,9 +492,7 @@ OBJECT_IDX o_pop(void) for (i = 1; i < o_max; i++) { object_type *o_ptr; - - /* Acquire object */ - o_ptr = &o_list[i]; + o_ptr = ¤t_floor_ptr->o_list[i]; /* Skip live objects */ if (o_ptr->k_idx) continue; @@ -590,7 +508,6 @@ OBJECT_IDX o_pop(void) /* Warn the player (except during dungeon creation) */ if (character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!")); - /* Oops */ return (0); } @@ -660,7 +577,7 @@ OBJECT_IDX get_obj_num(DEPTH level) if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1; /* Boost level */ - if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER)) + if ((level > 0) && !(d_info[p_ptr->dungeon_idx].flags1 & DF1_BEGINNER)) { /* Occasional "boost" */ if (one_in_(GREAT_OBJ)) @@ -682,7 +599,6 @@ OBJECT_IDX get_obj_num(DEPTH level) /* Default */ table[i].prob3 = 0; - /* Access the index */ k_idx = table[i].index; /* Access the actual kind */ @@ -765,8 +681,6 @@ OBJECT_IDX get_obj_num(DEPTH level) if (table[i].level < table[j].level) i = j; } - - /* Result */ return (table[i].index); } @@ -822,7 +736,7 @@ void object_aware(object_type *o_ptr) { object_type forge; object_type *q_ptr; - char o_name[MAX_NLEN]; + GAME_TEXT o_name[MAX_NLEN]; q_ptr = &forge; object_copy(q_ptr, o_ptr); @@ -926,7 +840,7 @@ byte value_check_aux2(object_type *o_ptr) * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ * @return オブジェクトの未鑑定価格 */ -static s32b object_value_base(object_type *o_ptr) +static PRICE object_value_base(object_type *o_ptr) { /* Aware item -- use template cost */ if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost); @@ -987,11 +901,11 @@ static s32b object_value_base(object_type *o_ptr) * @param plusses フラグに与える価格の基本重み * @return オブジェクトのフラグ価格 */ -s32b flag_cost(object_type *o_ptr, int plusses) +PRICE flag_cost(object_type *o_ptr, int plusses) { - s32b total = 0; + PRICE total = 0; BIT_FLAGS flgs[TR_FLAG_SIZE]; - s32b tmp_cost; + PRICE tmp_cost; int count; int i; object_kind *k_ptr = &k_info[o_ptr->k_idx]; @@ -1504,55 +1418,15 @@ PRICE object_value(object_type *o_ptr) value = object_value_base(o_ptr); } - /* Apply discount (if any) */ if (o_ptr->discount) value -= (value * o_ptr->discount / 100L); - /* Return the final value */ return (value); } -/*! - * @brief 破壊可能なアイテムかを返す / - * Determines whether an object can be destroyed, and makes fake inscription. - * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ - * @return オブジェクトが破壊可能ならばTRUEを返す - */ -bool can_player_destroy_object(object_type *o_ptr) -{ - /* Artifacts cannot be destroyed */ - if (!object_is_artifact(o_ptr)) return TRUE; - - /* If object is unidentified, makes fake inscription */ - if (!object_is_known(o_ptr)) - { - byte feel = FEEL_SPECIAL; - - /* Hack -- Handle icky artifacts */ - if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE; - - /* Hack -- inscribe the artifact */ - o_ptr->feeling = feel; - - /* We have "felt" it (again) */ - o_ptr->ident |= (IDENT_SENSE); - - /* Combine the pack */ - p_ptr->notice |= (PN_COMBINE); - - /* Window stuff */ - p_ptr->window |= (PW_INVEN | PW_EQUIP); - - return FALSE; - } - - /* Identified artifact -- Nothing to do */ - return FALSE; -} - /*! * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する / @@ -1906,8 +1780,8 @@ void object_absorb(object_type *o_ptr, object_type *j_ptr) /* Hack -- blend "feelings" */ if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling; - /* Hack -- could average discounts XXX XXX XXX */ - /* Hack -- save largest discount XXX XXX XXX */ + /* Hack -- could average discounts */ + /* Hack -- save largest discount */ if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount; /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */ @@ -1932,11 +1806,11 @@ void object_absorb(object_type *o_ptr, object_type *j_ptr) * @param sval 検索したいベースアイテムのsval * @return なし */ -IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval) +KIND_OBJECT_IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval) { - IDX k; + KIND_OBJECT_IDX k; int num = 0; - IDX bk = 0; + KIND_OBJECT_IDX bk = 0; /* Look for it */ for (k = 1; k < max_k_idx; k++) @@ -1966,12 +1840,10 @@ IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval) } #if 0 - /* Oops */ msg_format(_("アイテムがない (%d,%d)", "No object (%d,%d)"), tval, sval); #endif - /* Oops */ return (0); } @@ -2060,248 +1932,23 @@ void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx) /*! - * @brief 上質以上のオブジェクトに与えるための各種ボーナスを正規乱数も加えて算出する。 - * Help determine an "enchantment bonus" for an object. - * @param max ボーナス値の限度 - * @param level ボーナス値に加味する基準生成階 - * @return 算出されたボーナス値 - * @details - * To avoid floating point but still provide a smooth distribution of bonuses,\n - * we simply round the results of division in such a way as to "average" the\n - * correct floating point value.\n - *\n - * This function has been changed. It uses "randnor()" to choose values from\n - * a normal distribution, whose mean moves from zero towards the max as the\n - * level increases, and whose standard deviation is equal to 1/4 of the max,\n - * and whose values are forced to lie between zero and the max, inclusive.\n - *\n - * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n - * rare to get the "full" enchantment on an object, even a deep levels.\n - *\n - * It is always possible (albeit unlikely) to get the "full" enchantment.\n - *\n - * A sample distribution of values from "m_bonus(10, N)" is shown below:\n - *\n - * N 0 1 2 3 4 5 6 7 8 9 10\n - * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n - * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03\n - * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05\n - * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05\n - * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11\n - * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41\n - * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65\n - * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94\n - * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78\n - * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64\n - * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62\n - * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33\n - * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38\n - * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53\n - * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53\n - * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27\n - * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72\n - * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07\n - */ -int m_bonus(int max, DEPTH level) -{ - int bonus, stand, extra, value; - - - /* Paranoia -- enforce maximal "level" */ - if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1; - - - /* The "bonus" moves towards the max */ - bonus = ((max * level) / MAX_DEPTH); - - /* Hack -- determine fraction of error */ - extra = ((max * level) % MAX_DEPTH); - - /* Hack -- simulate floating point computations */ - if (randint0(MAX_DEPTH) < extra) bonus++; - - - /* The "stand" is equal to one quarter of the max */ - stand = (max / 4); - - /* Hack -- determine fraction of error */ - extra = (max % 4); - - /* Hack -- simulate floating point computations */ - if (randint0(4) < extra) stand++; - - - /* Choose an "interesting" value */ - value = randnor(bonus, stand); - - /* Enforce the minimum value */ - if (value < 0) return (0); - - /* Enforce the maximum value */ - if (value > max) return (max); - - /* Result */ - return (value); -} - - -/*! * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ * @return なし */ static void object_mention(object_type *o_ptr) { - char o_name[MAX_NLEN]; + GAME_TEXT o_name[MAX_NLEN]; object_aware(o_ptr); object_known(o_ptr); /* Mark the item as fully known */ o_ptr->ident |= (IDENT_MENTAL); - - /* Description */ object_desc(o_name, o_ptr, 0); msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name); } -/*! - * @brief INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。 - * Mega-Hack -- Attempt to create one of the "Special Objects" - * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ - * @return 生成に成功したらTRUEを返す。 - * @details - * We are only called from "make_object()", and we assume that\n - * "apply_magic()" is called immediately after we return.\n - *\n - * Note -- see "make_artifact()" and "apply_magic()"\n - */ -static bool make_artifact_special(object_type *o_ptr) -{ - IDX i; - KIND_OBJECT_IDX k_idx = 0; - - /*! @note 地上ではキャンセルする / No artifacts in the town */ - if (!dun_level) return (FALSE); - - /*! @note get_obj_num_hookによる指定がある場合は生成をキャンセルする / Themed object */ - if (get_obj_num_hook) return (FALSE); - - /*! @note 全固定アーティファクト中からIDの若い順に生成対象とその確率を走査する / Check the artifact list (just the "specials") */ - for (i = 0; i < max_a_idx; i++) - { - artifact_type *a_ptr = &a_info[i]; - - /*! @note アーティファクト名が空の不正なデータは除外する / Skip "empty" artifacts */ - if (!a_ptr->name) continue; - - /*! @note 既に生成回数がカウントされたアーティファクト、QUESTITEMと非INSTA_ARTは除外 / Cannot make an artifact twice */ - if (a_ptr->cur_num) continue; - if (a_ptr->gen_flags & TRG_QUESTITEM) continue; - if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue; - - /*! @note アーティファクト生成階が現在に対して足りない場合は高確率で1/(不足階層*2)を満たさないと生成リストに加えられない / - * XXX XXX Enforce minimum "depth" (loosely) */ - if (a_ptr->level > object_level) - { - /* @note / Acquire the "out-of-depth factor". Roll for out-of-depth creation. */ - int d = (a_ptr->level - object_level) * 2; - if (!one_in_(d)) continue; - } - - /*! @note 1/(レア度)の確率を満たさないと除外される / Artifact "rarity roll" */ - if (!one_in_(a_ptr->rarity)) continue; - - /*! @note INSTA_ART型固定アーティファクトのベースアイテムもチェック対象とする。ベースアイテムの生成階層が足りない場合1/(不足階層*5) を満たさないと除外される。 / - * Find the base object. XXX XXX Enforce minimum "object" level (loosely). Acquire the "out-of-depth factor". Roll for out-of-depth creation. */ - k_idx = lookup_kind(a_ptr->tval, a_ptr->sval); - if (k_info[k_idx].level > object_level) - { - int d = (k_info[k_idx].level - object_level) * 5; - if (!one_in_(d)) continue; - } - - /*! @note 前述の条件を満たしたら、後のIDのアーティファクトはチェックせずすぐ確定し生成処理に移す / - * Assign the template. Mega-Hack -- mark the item as an artifact. Hack: Some artifacts get random extra powers. Success. */ - object_prep(o_ptr, k_idx); - - o_ptr->name1 = i; - random_artifact_resistance(o_ptr, a_ptr); - return (TRUE); - } - - /*! @note 全INSTA_ART固定アーティファクトを試行しても決まらなかった場合 FALSEを返す / Failure */ - return (FALSE); -} - - -/*! - * @brief 非INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。 - * Mega-Hack -- Attempt to create one of the "Special Objects" - * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ - * @return 生成に成功したらTRUEを返す。 - * @details - * Attempt to change an object into an artifact\n - * This routine should only be called by "apply_magic()"\n - * Note -- see "make_artifact_special()" and "apply_magic()"\n - */ -static bool make_artifact(object_type *o_ptr) -{ - IDX i; - - - /* No artifacts in the town */ - if (!dun_level) return (FALSE); - - /* Paranoia -- no "plural" artifacts */ - if (o_ptr->number != 1) return (FALSE); - - /* Check the artifact list (skip the "specials") */ - for (i = 0; i < max_a_idx; i++) - { - artifact_type *a_ptr = &a_info[i]; - - /* Skip "empty" items */ - if (!a_ptr->name) continue; - - /* Cannot make an artifact twice */ - if (a_ptr->cur_num) continue; - - if (a_ptr->gen_flags & TRG_QUESTITEM) continue; - - if (a_ptr->gen_flags & TRG_INSTA_ART) continue; - - /* Must have the correct fields */ - if (a_ptr->tval != o_ptr->tval) continue; - if (a_ptr->sval != o_ptr->sval) continue; - - /* XXX XXX Enforce minimum "depth" (loosely) */ - if (a_ptr->level > dun_level) - { - /* Acquire the "out-of-depth factor" */ - int d = (a_ptr->level - dun_level) * 2; - - /* Roll for out-of-depth creation */ - if (!one_in_(d)) continue; - } - - /* We must make the "rarity roll" */ - if (!one_in_(a_ptr->rarity)) continue; - - /* Hack -- mark the item as an artifact */ - o_ptr->name1 = i; - - /* Hack: Some artifacts get random extra powers */ - random_artifact_resistance(o_ptr, a_ptr); - - /* Success */ - return (TRUE); - } - - /* Failure */ - return (FALSE); -} - /*! * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する @@ -2358,7 +2005,7 @@ static byte get_random_ego(byte slot, bool good) * Hack -- note special base damage dice boosting\n * Hack -- note special processing for weapon/digger\n */ -static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power) +void apply_magic_weapon(object_type *o_ptr, DEPTH level, int power) { HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level); HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level); @@ -2368,8 +2015,8 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power) if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT)) { - tohit2 = (tohit2+1)/2; - todam2 = (todam2+1)/2; + tohit2 = (tohit2 + 1) / 2; + todam2 = (todam2 + 1) / 2; } /* Good */ @@ -2409,7 +2056,6 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power) if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return; - /* Analyze type */ switch (o_ptr->tval) { case TV_DIGGING: @@ -2441,7 +2087,6 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power) break; } - case TV_HAFTED: case TV_POLEARM: case TV_SWORD: @@ -2495,16 +2140,14 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power) do { o_ptr->dd++; - } - while (one_in_(o_ptr->dd)); - + } while (one_in_(o_ptr->dd)); + do { o_ptr->ds++; - } - while (one_in_(o_ptr->ds)); + } while (one_in_(o_ptr->ds)); } - + if (one_in_(5)) { add_flag(o_ptr->art_flags, TR_BRAND_POIS); @@ -2542,15 +2185,15 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power) add_flag(o_ptr->art_flags, TR_SLAY_HUMAN); break; case EGO_DEMON: - - if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE); - one_in_(3) ? + + if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE); + one_in_(3) ? add_flag(o_ptr->art_flags, TR_DRAIN_EXP) : one_in_(2) ? - add_flag(o_ptr->art_flags, TR_DRAIN_HP) : - add_flag(o_ptr->art_flags, TR_DRAIN_MANA); - - + add_flag(o_ptr->art_flags, TR_DRAIN_HP) : + add_flag(o_ptr->art_flags, TR_DRAIN_MANA); + + if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC); if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS); if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE); @@ -2574,7 +2217,7 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power) /* Roll for ego-item */ if (randint0(MAX_DEPTH) < level) { - while(1) + while (1) { o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE); if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD) @@ -2585,16 +2228,18 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power) } switch (o_ptr->name2) { - case EGO_MORGUL: - if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE); - if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE); - case EGO_WEIRD: - if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS); - if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER); - if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC); - if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE); - if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE); - if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE); + case EGO_MORGUL: + if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE); + if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE); + break; + case EGO_WEIRD: + if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS); + if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER); + if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC); + if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE); + if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE); + if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE); + break; } } } @@ -2665,77 +2310,6 @@ static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power) } /*! - * @brief ドラゴン装備にランダムな耐性を与える - * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ - * @return なし - */ -static void dragon_resist(object_type * o_ptr) -{ - do - { - if (one_in_(4)) - one_dragon_ele_resistance(o_ptr); - else - one_high_resistance(o_ptr); - } - while (one_in_(2)); -} - -/*! - * @brief オブジェクトにランダムな強いESPを与える - * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ - * @return なし - */ -static bool add_esp_strong(object_type *o_ptr) -{ - bool nonliv = FALSE; - - switch (randint1(3)) - { - case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break; - case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break; - case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break; - } - - return nonliv; -} - -/*! - * @brief オブジェクトにランダムな弱いESPを与える - * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ - * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3) - * @return なし - */ -static void add_esp_weak(object_type *o_ptr, bool extra) -{ - int i; - u32b weak_esp_list[] = { - TR_ESP_ANIMAL, - TR_ESP_UNDEAD, - TR_ESP_DEMON, - TR_ESP_ORC, - TR_ESP_TROLL, - TR_ESP_GIANT, - TR_ESP_DRAGON, - TR_ESP_HUMAN, - TR_ESP_GOOD, - TR_ESP_UNIQUE, - }; - const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]); - const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3)); - - /* Add unduplicated weak esp flags randomly */ - for (i = 0; i < add_count; ++ i) - { - int choice = rand_range(i, MAX_ESP_WEAK - 1); - - add_flag(o_ptr->art_flags, weak_esp_list[choice]); - weak_esp_list[choice] = weak_esp_list[i]; - } -} - - -/*! * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン * Apply magic to an item known to be "armor" * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ @@ -2782,8 +2356,6 @@ static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power) if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED; } - - /* Analyze type */ switch (o_ptr->tval) { case TV_DRAG_ARMOR: @@ -3663,7 +3235,6 @@ static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power) break; } } - /* Uncurse it */ o_ptr->curse_flags = 0L; } else if ((power == -2) && one_in_(2)) @@ -3946,7 +3517,6 @@ static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power) } } } - /* Uncurse it */ o_ptr->curse_flags = 0L; } else if ((power == -2) && one_in_(2)) @@ -3993,27 +3563,6 @@ static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power) } } -/*! - * @brief モンスターが人形のベースにできるかを返す - * @param r_idx チェックしたいモンスター種族のID - * @return 人形にできるならTRUEを返す - */ -static bool item_monster_okay(MONRACE_IDX r_idx) -{ - monster_race *r_ptr = &r_info[r_idx]; - - /* No uniques */ - if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); - if (r_ptr->flags7 & RF7_KAGE) return (FALSE); - if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE); - if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE); - if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE); - if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE); - - /* Okay */ - return (TRUE); -} - /*! * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン @@ -4167,7 +3716,7 @@ static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power) r_ptr = &r_info[i]; - check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0; + check = (current_floor_ptr->dun_level < r_ptr->level) ? (r_ptr->level - current_floor_ptr->dun_level) : 0; /* Ignore dead monsters */ if (!r_ptr->rarity) continue; @@ -4213,11 +3762,11 @@ static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power) /* Pick a random non-unique monster race */ while (1) { - i = get_mon_num(dun_level); + i = get_mon_num(current_floor_ptr->dun_level); r_ptr = &r_info[i]; - check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0; + check = (current_floor_ptr->dun_level < r_ptr->level) ? (r_ptr->level - current_floor_ptr->dun_level) : 0; /* Ignore dead monsters */ if (!r_ptr->rarity) continue; @@ -4281,7 +3830,7 @@ static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power) o_ptr->pval = randint1(obj_level); if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6; - o_ptr->xtra3 = dun_level + 5; + o_ptr->xtra3 = current_floor_ptr->dun_level + 5; /* Never exceed "difficulty" of 55 to 59 */ if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5); @@ -4340,14 +3889,14 @@ void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode) f1 = lev + 10; /* Maximal chance of being "good" */ - if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good; + if (f1 > d_info[p_ptr->dungeon_idx].obj_good) f1 = d_info[p_ptr->dungeon_idx].obj_good; /* Base chance of being "great" */ f2 = f1 * 2 / 3; /* Maximal chance of being "great" */ - if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great)) - f2 = d_info[dungeon_type].obj_great; + if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[p_ptr->dungeon_idx].obj_great)) + f2 = d_info[p_ptr->dungeon_idx].obj_great; if (p_ptr->muta3 & MUT3_GOOD_LUCK) { @@ -4473,8 +4022,6 @@ void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode) return; } - - /* Apply magic */ switch (o_ptr->tval) { case TV_DIGGING: @@ -4484,19 +4031,19 @@ void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode) case TV_ARROW: case TV_BOLT: { - if (power) a_m_aux_1(o_ptr, lev, power); + if (power) apply_magic_weapon(o_ptr, lev, power); break; } case TV_POLEARM: { - if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power); + if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) apply_magic_weapon(o_ptr, lev, power); break; } case TV_SWORD: { - if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power); + if (power && !(o_ptr->sval == SV_DOKUBARI)) apply_magic_weapon(o_ptr, lev, power); break; } @@ -4731,125 +4278,39 @@ void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode) /*! - * @brief ベースアイテムが上質として扱われるかどうかを返す。 - * Hack -- determine if a template is "good" - * @param k_idx 判定したいベースアイテムのID - * @return ベースアイテムが上質ならばTRUEを返す。 + * @brief 生成階に応じたベースアイテムの生成を行う。 + * Attempt to make an object (normal or good/great) + * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ + * @param mode オプションフラグ + * @return 生成に成功したらTRUEを返す。 + * @details + * This routine plays nasty games to generate the "special artifacts".\n + * This routine uses "current_floor_ptr->object_level" for the "generation level".\n + * We assume that the given object has been "wiped".\n */ -static bool kind_is_good(KIND_OBJECT_IDX k_idx) +bool make_object(object_type *j_ptr, BIT_FLAGS mode) { - object_kind *k_ptr = &k_info[k_idx]; + PERCENTAGE prob; + DEPTH base; - /* Analyze the item type */ - switch (k_ptr->tval) + + /* Chance of "special object" */ + prob = ((mode & AM_GOOD) ? 10 : 1000); + + /* Base level for the object */ + base = ((mode & AM_GOOD) ? (current_floor_ptr->object_level + 10) : current_floor_ptr->object_level); + + + /* Generate a special object, or a normal object */ + if (!one_in_(prob) || !make_artifact_special(j_ptr)) { - /* Armor -- Good unless damaged */ - case TV_HARD_ARMOR: - case TV_SOFT_ARMOR: - case TV_DRAG_ARMOR: - case TV_SHIELD: - case TV_CLOAK: - case TV_BOOTS: - case TV_GLOVES: - case TV_HELM: - case TV_CROWN: - { - if (k_ptr->to_a < 0) return (FALSE); - return (TRUE); - } + KIND_OBJECT_IDX k_idx; - /* Weapons -- Good unless damaged */ - case TV_BOW: - case TV_SWORD: - case TV_HAFTED: - case TV_POLEARM: - case TV_DIGGING: + /* Good objects */ + if ((mode & AM_GOOD) && !get_obj_num_hook) { - if (k_ptr->to_h < 0) return (FALSE); - if (k_ptr->to_d < 0) return (FALSE); - return (TRUE); - } - - /* Ammo -- Arrows/Bolts are good */ - case TV_BOLT: - case TV_ARROW: - { - return (TRUE); - } - - /* Books -- High level books are good (except Arcane books) */ - case TV_LIFE_BOOK: - case TV_SORCERY_BOOK: - case TV_NATURE_BOOK: - case TV_CHAOS_BOOK: - case TV_DEATH_BOOK: - case TV_TRUMP_BOOK: - case TV_CRAFT_BOOK: - case TV_DAEMON_BOOK: - case TV_CRUSADE_BOOK: - case TV_MUSIC_BOOK: - case TV_HISSATSU_BOOK: - case TV_HEX_BOOK: - { - if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE); - return (FALSE); - } - - /* Rings -- Rings of Speed are good */ - case TV_RING: - { - if (k_ptr->sval == SV_RING_SPEED) return (TRUE); - if (k_ptr->sval == SV_RING_LORDLY) return (TRUE); - return (FALSE); - } - - /* Amulets -- Amulets of the Magi and Resistance are good */ - case TV_AMULET: - { - if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE); - if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE); - return (FALSE); - } - } - - /* Assume not good */ - return (FALSE); -} - -/*! - * @brief 生成階に応じたベースアイテムの生成を行う。 - * Attempt to make an object (normal or good/great) - * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ - * @param mode オプションフラグ - * @return 生成に成功したらTRUEを返す。 - * @details - * This routine plays nasty games to generate the "special artifacts".\n - * This routine uses "object_level" for the "generation level".\n - * We assume that the given object has been "wiped".\n - */ -bool make_object(object_type *j_ptr, BIT_FLAGS mode) -{ - PERCENTAGE prob; - DEPTH base; - - - /* Chance of "special object" */ - prob = ((mode & AM_GOOD) ? 10 : 1000); - - /* Base level for the object */ - base = ((mode & AM_GOOD) ? (object_level + 10) : object_level); - - - /* Generate a special object, or a normal object */ - if (!one_in_(prob) || !make_artifact_special(j_ptr)) - { - KIND_OBJECT_IDX k_idx; - - /* Good objects */ - if ((mode & AM_GOOD) && !get_obj_num_hook) - { - /* Activate restriction (if already specified, use that) */ - get_obj_num_hook = kind_is_good; + /* Activate restriction (if already specified, use that) */ + get_obj_num_hook = kind_is_good; } /* Restricted objects - prepare allocation table */ @@ -4876,7 +4337,7 @@ bool make_object(object_type *j_ptr, BIT_FLAGS mode) } /* Apply magic (allow artifacts) */ - apply_magic(j_ptr, object_level, mode); + apply_magic(j_ptr, current_floor_ptr->object_level, mode); /* Hack -- generate multiple spikes/missiles */ switch (j_ptr->tval) @@ -4907,7 +4368,7 @@ bool make_object(object_type *j_ptr, BIT_FLAGS mode) * @return 生成に成功したらTRUEを返す。 * @details * This routine plays nasty games to generate the "special artifacts".\n - * This routine uses "object_level" for the "generation level".\n + * This routine uses "current_floor_ptr->object_level" for the "generation level".\n * This routine requires a clean floor grid destination.\n */ void place_object(POSITION y, POSITION x, BIT_FLAGS mode) @@ -4915,7 +4376,7 @@ void place_object(POSITION y, POSITION x, BIT_FLAGS mode) OBJECT_IDX o_idx; /* Acquire grid */ - cave_type *c_ptr = &cave[y][x]; + grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x]; object_type forge; object_type *q_ptr; @@ -4928,13 +4389,9 @@ void place_object(POSITION y, POSITION x, BIT_FLAGS mode) if (!cave_drop_bold(y, x)) return; /* Avoid stacking on other objects */ - if (c_ptr->o_idx) return; + if (g_ptr->o_idx) return; - - /* Get local object */ q_ptr = &forge; - - /* Wipe the object */ object_wipe(q_ptr); /* Make an object (if possible) */ @@ -4948,9 +4405,7 @@ void place_object(POSITION y, POSITION x, BIT_FLAGS mode) if (o_idx) { object_type *o_ptr; - - /* Acquire object */ - o_ptr = &o_list[o_idx]; + o_ptr = ¤t_floor_ptr->o_list[o_idx]; /* Structure Copy */ object_copy(o_ptr, q_ptr); @@ -4959,15 +4414,10 @@ void place_object(POSITION y, POSITION x, BIT_FLAGS mode) o_ptr->ix = x; /* Build a stack */ - o_ptr->next_o_idx = c_ptr->o_idx; - - /* Place the object */ - c_ptr->o_idx = o_idx; + o_ptr->next_o_idx = g_ptr->o_idx; - /* Notice */ + g_ptr->o_idx = o_idx; note_spot(y, x); - - /* Redraw */ lite_spot(y, x); } else @@ -4995,12 +4445,12 @@ bool make_gold(object_type *j_ptr) s32b base; /* Hack -- Pick a Treasure variety */ - i = ((randint1(object_level + 2) + 2) / 2) - 1; + i = ((randint1(current_floor_ptr->object_level + 2) + 2) / 2) - 1; /* Apply "extra" magic */ if (one_in_(GREAT_OBJ)) { - i += randint1(object_level + 1); + i += randint1(current_floor_ptr->object_level + 1); } /* Hack -- Creeping Coins only generate "themselves" */ @@ -5037,7 +4487,7 @@ void place_gold(POSITION y, POSITION x) OBJECT_IDX o_idx; /* Acquire grid */ - cave_type *c_ptr = &cave[y][x]; + grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x]; object_type forge; object_type *q_ptr; @@ -5050,13 +4500,9 @@ void place_gold(POSITION y, POSITION x) if (!cave_drop_bold(y, x)) return; /* Avoid stacking on other objects */ - if (c_ptr->o_idx) return; - + if (g_ptr->o_idx) return; - /* Get local object */ q_ptr = &forge; - - /* Wipe the object */ object_wipe(q_ptr); /* Make some gold */ @@ -5069,9 +4515,7 @@ void place_gold(POSITION y, POSITION x) if (o_idx) { object_type *o_ptr; - - /* Acquire object */ - o_ptr = &o_list[o_idx]; + o_ptr = ¤t_floor_ptr->o_list[o_idx]; /* Copy the object */ object_copy(o_ptr, q_ptr); @@ -5081,15 +4525,10 @@ void place_gold(POSITION y, POSITION x) o_ptr->ix = x; /* Build a stack */ - o_ptr->next_o_idx = c_ptr->o_idx; + o_ptr->next_o_idx = g_ptr->o_idx; - /* Place the object */ - c_ptr->o_idx = o_idx; - - /* Notice */ + g_ptr->o_idx = o_idx; note_spot(y, x); - - /* Redraw */ lite_spot(y, x); } } @@ -5129,9 +4568,9 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION OBJECT_IDX o_idx = 0; OBJECT_IDX this_o_idx, next_o_idx = 0; - cave_type *c_ptr; + grid_type *g_ptr; - char o_name[MAX_NLEN]; + GAME_TEXT o_name[MAX_NLEN]; bool flag = FALSE; bool done = FALSE; @@ -5153,7 +4592,6 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION #else msg_format("The %s disappear%s.", o_name, (plural ? "" : "s")); #endif - /* Debug */ if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)")); /* Failure */ @@ -5195,7 +4633,7 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION if (!projectable(y, x, ty, tx)) continue; /* Obtain grid */ - c_ptr = &cave[ty][tx]; + g_ptr = ¤t_floor_ptr->grid_array[ty][tx]; /* Require floor space */ if (!cave_drop_bold(ty, tx)) continue; @@ -5204,14 +4642,10 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION k = 0; /* Scan objects in that grid */ - for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) + for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; - - /* Acquire object */ - o_ptr = &o_list[this_o_idx]; - - /* Acquire next object */ + o_ptr = ¤t_floor_ptr->o_list[this_o_idx]; next_o_idx = o_ptr->next_o_idx; /* Check for possible combination */ @@ -5223,8 +4657,6 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION /* Add new object */ if (!comb) k++; - - /* Paranoia */ if (k > 99) continue; /* Calculate score */ @@ -5246,7 +4678,6 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION by = ty; bx = tx; - /* Okay */ flag = TRUE; } } @@ -5261,8 +4692,6 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION msg_format("The %s disappear%s.", o_name, (plural ? "" : "s")); #endif - - /* Debug */ if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)")); /* Failure */ @@ -5287,7 +4716,6 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION /* Require floor space */ if (!cave_drop_bold(by, bx)) continue; - /* Okay */ flag = TRUE; } @@ -5296,9 +4724,9 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION { int candidates = 0, pick; - for (ty = 1; ty < cur_hgt - 1; ty++) + for (ty = 1; ty < current_floor_ptr->height - 1; ty++) { - for (tx = 1; tx < cur_wid - 1; tx++) + for (tx = 1; tx < current_floor_ptr->width - 1; tx++) { /* A valid space found */ if (cave_drop_bold(ty, tx)) candidates++; @@ -5314,7 +4742,6 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION msg_format("The %s disappear%s.", o_name, (plural ? "" : "s")); #endif - /* Debug */ if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)")); /* Mega-Hack -- preserve artifacts */ @@ -5335,9 +4762,9 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION /* Choose a random one */ pick = randint1(candidates); - for (ty = 1; ty < cur_hgt - 1; ty++) + for (ty = 1; ty < current_floor_ptr->height - 1; ty++) { - for (tx = 1; tx < cur_wid - 1; tx++) + for (tx = 1; tx < current_floor_ptr->width - 1; tx++) { if (cave_drop_bold(ty, tx)) { @@ -5356,24 +4783,18 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION } - /* Grid */ - c_ptr = &cave[by][bx]; + g_ptr = ¤t_floor_ptr->grid_array[by][bx]; /* Scan objects in that grid for combination */ - for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) + for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx) { object_type *o_ptr; - - /* Acquire object */ - o_ptr = &o_list[this_o_idx]; - - /* Acquire next object */ + o_ptr = ¤t_floor_ptr->o_list[this_o_idx]; next_o_idx = o_ptr->next_o_idx; /* Check for combination */ if (object_similar(o_ptr, j_ptr)) { - /* Combine the items */ object_absorb(o_ptr, j_ptr); /* Success */ @@ -5383,7 +4804,6 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION } } - /* Get new object */ if (!done) o_idx = o_pop(); /* Failure */ @@ -5392,12 +4812,9 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION #ifdef JP msg_format("%sは消えた。", o_name); #else - msg_format("The %s disappear%s.", - o_name, (plural ? "" : "s")); + msg_format("The %s disappear%s.", o_name, (plural ? "" : "s")); #endif - - /* Debug */ if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)")); /* Hack -- Preserve artifacts */ @@ -5414,10 +4831,10 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION if (!done) { /* Structure copy */ - object_copy(&o_list[o_idx], j_ptr); + object_copy(¤t_floor_ptr->o_list[o_idx], j_ptr); /* Access new object */ - j_ptr = &o_list[o_idx]; + j_ptr = ¤t_floor_ptr->o_list[o_idx]; /* Locate */ j_ptr->iy = by; @@ -5427,21 +4844,16 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION j_ptr->held_m_idx = 0; /* Build a stack */ - j_ptr->next_o_idx = c_ptr->o_idx; + j_ptr->next_o_idx = g_ptr->o_idx; - /* Place the object */ - c_ptr->o_idx = o_idx; + g_ptr->o_idx = o_idx; /* Success */ done = TRUE; } - /* Note the spot */ note_spot(by, bx); - - /* Draw the spot */ lite_spot(by, bx); - sound(SOUND_DROP); /* Mega-Hack -- no message if "dropped" by player */ @@ -5451,184 +4863,9 @@ OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet.")); } - /* XXX XXX XXX */ - - /* Result */ return (o_idx); } - -/*! - * @brief 獲得ドロップを行う。 - * Scatter some "great" objects near the player - * @param y1 配置したいフロアのY座標 - * @param x1 配置したいフロアのX座標 - * @param num 獲得の処理回数 - * @param great TRUEならば必ず高級品以上を落とす - * @param special TRUEならば必ず特別品を落とす - * @param known TRUEならばオブジェクトが必ず*鑑定*済になる - * @return なし - */ -void acquirement(POSITION y1, POSITION x1, int num, bool great, bool special, bool known) -{ - object_type *i_ptr; - object_type object_type_body; - BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ; - - /* Acquirement */ - while (num--) - { - /* Get local object */ - i_ptr = &object_type_body; - - /* Wipe the object */ - object_wipe(i_ptr); - - /* Make a good (or great) object (if possible) */ - if (!make_object(i_ptr, mode)) continue; - - if (known) - { - object_aware(i_ptr); - object_known(i_ptr); - } - - /* Drop the object */ - (void)drop_near(i_ptr, -1, y1, x1); - } -} - -/* - * Scatter some "amusing" objects near the player - */ - -#define AMS_NOTHING 0x00 /* No restriction */ -#define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */ -#define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */ -#define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */ -#define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */ - -typedef struct -{ - OBJECT_TYPE_VALUE tval; - OBJECT_SUBTYPE_VALUE sval; - PERCENTAGE prob; - byte flag; -} amuse_type; - -amuse_type amuse_info[] = -{ - { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING }, - { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE }, - { TV_SPIKE, SV_ANY, 10, AMS_PILE }, - { TV_STATUE, SV_ANY, 15, AMS_NOTHING }, - { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE }, - { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE }, - { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE }, - { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING }, - { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo - { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician - { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING }, - { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING }, - { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING }, - - { 0, 0, 0 } -}; - -/*! - * @brief 誰得ドロップを行う。 - * @param y1 配置したいフロアのY座標 - * @param x1 配置したいフロアのX座標 - * @param num 誰得の処理回数 - * @param known TRUEならばオブジェクトが必ず*鑑定*済になる - * @return なし - */ -void amusement(POSITION y1, POSITION x1, int num, bool known) -{ - object_type *i_ptr; - object_type object_type_body; - int n, t = 0; - - for (n = 0; amuse_info[n].tval != 0; n++) - { - t += amuse_info[n].prob; - } - - /* Acquirement */ - while (num) - { - int i; - KIND_OBJECT_IDX k_idx; - ARTIFACT_IDX a_idx = 0; - int r = randint0(t); - bool insta_art, fixed_art; - - for (i = 0; ; i++) - { - r -= amuse_info[i].prob; - if (r <= 0) break; - } - - /* Get local object */ - i_ptr = &object_type_body; - - /* Wipe the object */ - object_wipe(i_ptr); - - /* Wipe the object */ - k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval); - - /* Paranoia - reroll if nothing */ - if (!k_idx) continue; - - /* Search an artifact index if need */ - insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART); - fixed_art = (amuse_info[i].flag & AMS_FIXED_ART); - - if (insta_art || fixed_art) - { - for (a_idx = 1; a_idx < max_a_idx; a_idx++) - { - if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue; - if (a_info[a_idx].tval != k_info[k_idx].tval) continue; - if (a_info[a_idx].sval != k_info[k_idx].sval) continue; - if (a_info[a_idx].cur_num > 0) continue; - break; - } - - if (a_idx >= max_a_idx) continue; - } - - /* Make an object (if possible) */ - object_prep(i_ptr, k_idx); - if (a_idx) i_ptr->name1 = a_idx; - apply_magic(i_ptr, 1, AM_NO_FIXED_ART); - - if (amuse_info[i].flag & AMS_NO_UNIQUE) - { - if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue; - } - - if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3); - if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99); - - if (known) - { - object_aware(i_ptr); - object_known(i_ptr); - } - - /* Paranoia - reroll if nothing */ - if (!(i_ptr->k_idx)) continue; - - /* Drop the object */ - (void)drop_near(i_ptr, -1, y1, x1); - - num--; - } -} - - /*! * @brief 魔道具の使用回数の残量を示すメッセージを表示する / * Describe the charges on an item in the inventory. @@ -5658,14 +4895,12 @@ void inven_item_charges(INVENTORY_IDX item) /* Multiple charges */ if (o_ptr->pval != 1) { - /* Print a message */ msg_format("You have %d charges remaining.", o_ptr->pval); } /* Single charge */ else { - /* Print a message */ msg_format("You have %d charge remaining.", o_ptr->pval); } #endif @@ -5681,12 +4916,10 @@ void inven_item_charges(INVENTORY_IDX item) void inven_item_describe(INVENTORY_IDX item) { object_type *o_ptr = &inventory[item]; - char o_name[MAX_NLEN]; + GAME_TEXT o_name[MAX_NLEN]; - /* Get a description */ object_desc(o_name, o_ptr, 0); - /* Print a message */ #ifdef JP /* "no more" の場合はこちらで表示する */ if (o_ptr->number <= 0) @@ -5706,13 +4939,13 @@ void inven_item_describe(INVENTORY_IDX item) } /*! - * @brief アイテムの残り所持数メッセージを表示する / + * @brief アイテムを増減させ残り所持数メッセージを表示する / * Increase the "number" of an item in the inventory * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット * @param num 増やしたい量 * @return なし */ -void inven_item_increase(INVENTORY_IDX item, int num) +void inven_item_increase(INVENTORY_IDX item, ITEM_NUMBER num) { object_type *o_ptr = &inventory[item]; @@ -5724,7 +4957,7 @@ void inven_item_increase(INVENTORY_IDX item, int num) else if (num < 0) num = 0; /* Un-apply */ - num -= (ITEM_NUMBER)o_ptr->number; + num -= o_ptr->number; /* Change the number and weight */ if (num) @@ -5734,17 +4967,9 @@ void inven_item_increase(INVENTORY_IDX item, int num) /* Add the weight */ p_ptr->total_weight += (num * o_ptr->weight); - - /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); - - /* Recalculate mana XXX */ p_ptr->update |= (PU_MANA); - - /* Combine the pack */ - p_ptr->notice |= (PN_COMBINE); - - /* Window stuff */ + p_ptr->update |= (PU_COMBINE); p_ptr->window |= (PW_INVEN | PW_EQUIP); /* Hack -- Clear temporary elemental brands if player takes off weapons */ @@ -5752,7 +4977,7 @@ void inven_item_increase(INVENTORY_IDX item, int num) { if ((item == INVEN_RARM) || (item == INVEN_LARM)) { - if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item)) + if (!has_melee_weapon(INVEN_RARM + INVEN_LARM - item)) { /* Clear all temporary elemental brands */ set_ele_attack(0, 0); @@ -5796,7 +5021,6 @@ void inven_item_optimize(INVENTORY_IDX item) /* Erase the "final" slot */ object_wipe(&inventory[i]); - /* Window stuff */ p_ptr->window |= (PW_INVEN); } @@ -5808,21 +5032,13 @@ void inven_item_optimize(INVENTORY_IDX item) /* Erase the empty slot */ object_wipe(&inventory[item]); - - /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); - - /* Recalculate torch */ p_ptr->update |= (PU_TORCH); - - /* Recalculate mana XXX */ p_ptr->update |= (PU_MANA); - /* Window stuff */ p_ptr->window |= (PW_EQUIP); } - /* Window stuff */ p_ptr->window |= (PW_SPELL); } @@ -5834,7 +5050,7 @@ void inven_item_optimize(INVENTORY_IDX item) */ void floor_item_charges(INVENTORY_IDX item) { - object_type *o_ptr = &o_list[item]; + object_type *o_ptr = ¤t_floor_ptr->o_list[item]; /* Require staff/wand */ if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return; @@ -5855,14 +5071,12 @@ void floor_item_charges(INVENTORY_IDX item) /* Multiple charges */ if (o_ptr->pval != 1) { - /* Print a message */ msg_format("There are %d charges remaining.", o_ptr->pval); } /* Single charge */ else { - /* Print a message */ msg_format("There is %d charge remaining.", o_ptr->pval); } #endif @@ -5877,13 +5091,11 @@ void floor_item_charges(INVENTORY_IDX item) */ void floor_item_describe(INVENTORY_IDX item) { - object_type *o_ptr = &o_list[item]; - char o_name[MAX_NLEN]; + object_type *o_ptr = ¤t_floor_ptr->o_list[item]; + GAME_TEXT o_name[MAX_NLEN]; - /* Get a description */ object_desc(o_name, o_ptr, 0); - /* Print a message */ #ifdef JP /* "no more" の場合はこちらで表示を分ける */ if (o_ptr->number <= 0) @@ -5908,9 +5120,9 @@ void floor_item_describe(INVENTORY_IDX item) * @param num 増やしたいアイテムの数 * @return なし */ -void floor_item_increase(INVENTORY_IDX item, int num) +void floor_item_increase(INVENTORY_IDX item, ITEM_NUMBER num) { - object_type *o_ptr = &o_list[item]; + object_type *o_ptr = ¤t_floor_ptr->o_list[item]; /* Apply */ num += o_ptr->number; @@ -5920,10 +5132,10 @@ void floor_item_increase(INVENTORY_IDX item, int num) else if (num < 0) num = 0; /* Un-apply */ - num -= (int)o_ptr->number; + num -= o_ptr->number; /* Change the number */ - o_ptr->number += (ITEM_NUMBER)num; + o_ptr->number += num; } @@ -5935,7 +5147,7 @@ void floor_item_increase(INVENTORY_IDX item, int num) */ void floor_item_optimize(INVENTORY_IDX item) { - object_type *o_ptr = &o_list[item]; + object_type *o_ptr = ¤t_floor_ptr->o_list[item]; /* Paranoia -- be sure it exists */ if (!o_ptr->k_idx) return; @@ -5943,7 +5155,6 @@ void floor_item_optimize(INVENTORY_IDX item) /* Only optimize empty items */ if (o_ptr->number) return; - /* Delete the object */ delete_object_idx(item); } @@ -5973,7 +5184,6 @@ bool inven_carry_okay(object_type *o_ptr) if (object_similar(j_ptr, o_ptr)) return (TRUE); } - /* Nope */ return (FALSE); } @@ -6108,16 +5318,10 @@ s16b inven_carry(object_type *o_ptr) /* Check if the two items can be combined */ if (object_similar(j_ptr, o_ptr)) { - /* Combine the items */ object_absorb(j_ptr, o_ptr); - /* Increase the weight */ p_ptr->total_weight += (o_ptr->number * o_ptr->weight); - - /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); - - /* Window stuff */ p_ptr->window |= (PW_INVEN); /* Success */ @@ -6125,8 +5329,6 @@ s16b inven_carry(object_type *o_ptr) } } - - /* Paranoia */ if (inven_cnt > INVEN_PACK) return (-1); /* Find an empty slot */ @@ -6187,19 +5389,11 @@ s16b inven_carry(object_type *o_ptr) /* Player touches it, and no longer marked */ j_ptr->marked = OM_TOUCHED; - /* Increase the weight */ p_ptr->total_weight += (j_ptr->number * j_ptr->weight); /* Count the items */ inven_cnt++; - - /* Recalculate bonuses */ - p_ptr->update |= (PU_BONUS); - - /* Combine and Reorder pack */ - p_ptr->notice |= (PN_COMBINE | PN_REORDER); - - /* Window stuff */ + p_ptr->update |= (PU_BONUS | PU_COMBINE | PU_REORDER); p_ptr->window |= (PW_INVEN); /* Return the slot */ @@ -6228,21 +5422,17 @@ INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt) object_type *o_ptr; - cptr act; + concptr act; - char o_name[MAX_NLEN]; + GAME_TEXT o_name[MAX_NLEN]; /* Get the item to take off */ o_ptr = &inventory[item]; - - /* Paranoia */ if (amt <= 0) return (-1); /* Verify */ if (amt > o_ptr->number) amt = o_ptr->number; - - /* Get local object */ q_ptr = &forge; /* Obtain a local object */ @@ -6251,7 +5441,6 @@ INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt) /* Modify quantity */ q_ptr->number = amt; - /* Describe the object */ object_desc(o_name, q_ptr, 0); /* Took off weapon */ @@ -6313,8 +5502,7 @@ void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt) object_type *q_ptr; object_type *o_ptr; - char o_name[MAX_NLEN]; - + GAME_TEXT o_name[MAX_NLEN]; /* Access original object */ o_ptr = &inventory[item]; @@ -6325,7 +5513,6 @@ void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt) /* Not too many */ if (amt > o_ptr->number) amt = o_ptr->number; - /* Take off equipment */ if (item >= INVEN_RARM) { @@ -6336,8 +5523,6 @@ void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt) o_ptr = &inventory[item]; } - - /* Get local object */ q_ptr = &forge; /* Obtain local object */ @@ -6374,7 +5559,7 @@ void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt) void combine_pack(void) { int i, j, k; - object_type *o_ptr; + object_type *o_ptr; object_type *j_ptr; bool flag = FALSE, combined; @@ -6385,7 +5570,6 @@ void combine_pack(void) /* Combine the pack (backwards) */ for (i = INVEN_PACK; i > 0; i--) { - /* Get the item */ o_ptr = &inventory[i]; /* Skip empty items */ @@ -6396,7 +5580,6 @@ void combine_pack(void) { int max_num; - /* Get the item */ j_ptr = &inventory[j]; /* Skip empty items */ @@ -6458,7 +5641,6 @@ void combine_pack(void) } } - /* Window stuff */ p_ptr->window |= (PW_INVEN); /* Take note */ @@ -6487,7 +5669,7 @@ void reorder_pack(void) s32b o_value; object_type forge; object_type *q_ptr; - object_type *o_ptr; + object_type *o_ptr; bool flag = FALSE; @@ -6497,7 +5679,6 @@ void reorder_pack(void) /* Mega-Hack -- allow "proper" over-flow */ if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break; - /* Get the item */ o_ptr = &inventory[i]; /* Skip empty slots */ @@ -6517,8 +5698,6 @@ void reorder_pack(void) /* Take note */ flag = TRUE; - - /* Get local object */ q_ptr = &forge; /* Save a copy of the moving item */ @@ -6534,7 +5713,6 @@ void reorder_pack(void) /* Insert the moving item */ object_copy(&inventory[j], q_ptr); - /* Window stuff */ p_ptr->window |= (PW_INVEN); } @@ -6558,7 +5736,7 @@ void display_koff(KIND_OBJECT_IDX k_idx) int sval; REALM_IDX use_realm; - char o_name[MAX_NLEN]; + GAME_TEXT o_name[MAX_NLEN]; /* Erase the window */ @@ -6570,14 +5748,10 @@ void display_koff(KIND_OBJECT_IDX k_idx) /* No info */ if (!k_idx) return; - - /* Get local object */ q_ptr = &forge; /* Prepare the object */ object_prep(q_ptr, k_idx); - - /* Describe */ object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE)); /* Mention the object name */ @@ -6621,2105 +5795,6 @@ void display_koff(KIND_OBJECT_IDX k_idx) } } -/*! - * @brief 警告を放つアイテムを選択する / - * Choose one of items that have warning flag - * Calculate spell damages - * @return 警告を行う - */ -object_type *choose_warning_item(void) -{ - int i; - int choices[INVEN_TOTAL - INVEN_RARM]; - int number = 0; - - /* Paranoia -- Player has no warning ability */ - if (!p_ptr->warning) return NULL; - - /* Search Inventory */ - for (i = INVEN_RARM; i < INVEN_TOTAL; i++) - { - BIT_FLAGS flgs[TR_FLAG_SIZE]; - object_type *o_ptr = &inventory[i]; - - object_flags(o_ptr, flgs); - if (have_flag(flgs, TR_WARNING)) - { - choices[number] = i; - number++; - } - } - - /* Choice one of them */ - return number ? &inventory[choices[randint0(number)]] : NULL; -} - -/*! - * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する / - * Calculate spell damages - * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ - * @param typ 効果属性のID - * @param dam 基本ダメージ - * @param max 算出した最大ダメージを返すポインタ - * @return なし - */ -static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max) -{ - monster_race *r_ptr = &r_info[m_ptr->r_idx]; - int rlev = r_ptr->level; - bool ignore_wraith_form = FALSE; - - /* Vulnerability, resistance and immunity */ - switch (typ) - { - case GF_ELEC: - if (p_ptr->immune_elec) - { - dam = 0; - ignore_wraith_form = TRUE; - } - else - { - if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2; - if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3; - if (prace_is_(RACE_ANDROID)) dam += dam / 3; - if (p_ptr->resist_elec) dam = (dam + 2) / 3; - if (IS_OPPOSE_ELEC()) - dam = (dam + 2) / 3; - } - break; - - case GF_POIS: - if (p_ptr->resist_pois) dam = (dam + 2) / 3; - if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3; - break; - - case GF_ACID: - if (p_ptr->immune_acid) - { - dam = 0; - ignore_wraith_form = TRUE; - } - else - { - if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2; - if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3; - if (p_ptr->resist_acid) dam = (dam + 2) / 3; - if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3; - } - break; - - case GF_COLD: - case GF_ICE: - if (p_ptr->immune_cold) - { - dam = 0; - ignore_wraith_form = TRUE; - } - else - { - if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2; - if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3; - if (p_ptr->resist_cold) dam = (dam + 2) / 3; - if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3; - } - break; - - case GF_FIRE: - if (p_ptr->immune_fire) - { - dam = 0; - ignore_wraith_form = TRUE; - } - else - { - if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2; - if (prace_is_(RACE_ENT)) dam += dam / 3; - if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3; - if (p_ptr->resist_fire) dam = (dam + 2) / 3; - if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3; - } - break; - - case GF_PSY_SPEAR: - ignore_wraith_form = TRUE; - break; - - case GF_ARROW: - if (!p_ptr->blind && - ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) || - (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU)))) - { - dam = 0; - ignore_wraith_form = TRUE; - } - break; - - case GF_LITE: - if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */ - if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2; - else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3; - - /* - * Cannot use "ignore_wraith_form" strictly (for "random one damage") - * "dam *= 2;" for later "dam /= 2" - */ - if (p_ptr->wraith_form) dam *= 2; - break; - - case GF_DARK: - if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form) - { - dam = 0; - ignore_wraith_form = TRUE; - } - else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */ - break; - - case GF_SHARDS: - if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ - break; - - case GF_SOUND: - if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */ - break; - - case GF_CONFUSION: - if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */ - break; - - case GF_CHAOS: - if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ - break; - - case GF_NETHER: - if (prace_is_(RACE_SPECTRE)) - { - dam = 0; - ignore_wraith_form = TRUE; - } - else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ - break; - - case GF_DISENCHANT: - if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ - break; - - case GF_NEXUS: - if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */ - break; - - case GF_TIME: - if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */ - break; - - case GF_GRAVITY: - if (p_ptr->levitation) dam = (dam * 2) / 3; - break; - - case GF_ROCKET: - if (p_ptr->resist_shard) dam /= 2; - break; - - case GF_NUKE: - if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5; - if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5; - break; - - case GF_DEATH_RAY: - if (p_ptr->mimic_form) - { - if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING) - { - dam = 0; - ignore_wraith_form = TRUE; - } - } - else - { - switch (p_ptr->prace) - { - case RACE_GOLEM: - case RACE_SKELETON: - case RACE_ZOMBIE: - case RACE_VAMPIRE: - case RACE_DEMON: - case RACE_SPECTRE: - dam = 0; - ignore_wraith_form = TRUE; - break; - } - } - break; - - case GF_HOLY_FIRE: - if (p_ptr->align > 10) dam /= 2; - else if (p_ptr->align < -10) dam *= 2; - break; - - case GF_HELL_FIRE: - if (p_ptr->align > 10) dam *= 2; - break; - - case GF_MIND_BLAST: - case GF_BRAIN_SMASH: - if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav)) - { - dam = 0; - ignore_wraith_form = TRUE; - } - break; - - case GF_CAUSE_1: - case GF_CAUSE_2: - case GF_CAUSE_3: - case GF_HAND_DOOM: - if (100 + rlev / 2 <= p_ptr->skill_sav) - { - dam = 0; - ignore_wraith_form = TRUE; - } - break; - - case GF_CAUSE_4: - if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU)) - { - dam = 0; - ignore_wraith_form = TRUE; - } - break; - } - - if (p_ptr->wraith_form && !ignore_wraith_form) - { - dam /= 2; - if (!dam) dam = 1; - } - - if (dam > *max) *max = dam; -} - -/*! -* @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 / -* Calculate spell damages -* @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値 -* @param typ 効果属性のID -* @param m_idx 魔法を行使するモンスターのID -* @param max 算出した最大ダメージを返すポインタ -* @return なし -*/ -void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max) -{ - monster_type *m_ptr = &m_list[m_idx]; - HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX); - spell_damcalc(m_ptr, typ, dam, max); -} - -/*! - * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する / - * Calculate blow damages - * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ - * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ - * @return 算出された最大ダメージを返す。 - */ -static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr) -{ - int dam = blow_ptr->d_dice * blow_ptr->d_side; - int dummy_max = 0; - bool check_wraith_form = TRUE; - - if (blow_ptr->method != RBM_EXPLODE) - { - ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a; - - switch (blow_ptr->effect) - { - case RBE_SUPERHURT: - { - int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250); - dam = MAX(dam, tmp_dam * 2); - break; - } - - case RBE_HURT: - case RBE_SHATTER: - dam -= (dam * ((ac < 150) ? ac : 150) / 250); - break; - - case RBE_ACID: - spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max); - dam = dummy_max; - check_wraith_form = FALSE; - break; - - case RBE_ELEC: - spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max); - dam = dummy_max; - check_wraith_form = FALSE; - break; - - case RBE_FIRE: - spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max); - dam = dummy_max; - check_wraith_form = FALSE; - break; - - case RBE_COLD: - spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max); - dam = dummy_max; - check_wraith_form = FALSE; - break; - - case RBE_DR_MANA: - dam = 0; - check_wraith_form = FALSE; - break; - } - - if (check_wraith_form && p_ptr->wraith_form) - { - dam /= 2; - if (!dam) dam = 1; - } - } - else - { - dam = (dam + 1) / 2; - spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max); - dam = dummy_max; - } - - return dam; -} - -/*! - * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 / - * Examine the grid (xx,yy) and warn the player if there are any danger - * @param xx 危険性を調査するマスのX座標 - * @param yy 危険性を調査するマスのY座標 - * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。 - */ -bool process_warning(int xx, int yy) -{ - int mx, my; - cave_type *c_ptr; - char o_name[MAX_NLEN]; - -#define WARNING_AWARE_RANGE 12 - int dam_max = 0; - static int old_damage = 0; - - for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++) - { - for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++) - { - int dam_max0 = 0; - monster_type *m_ptr; - monster_race *r_ptr; - - if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue; - - c_ptr = &cave[my][mx]; - - if (!c_ptr->m_idx) continue; - - m_ptr = &m_list[c_ptr->m_idx]; - - if (MON_CSLEEP(m_ptr)) continue; - if (!is_hostile(m_ptr)) continue; - - r_ptr = &r_info[m_ptr->r_idx]; - - /* Monster spells (only powerful ones)*/ - if (projectable(my, mx, yy, xx)) - { - u32b f4 = r_ptr->flags4; - u32b f5 = r_ptr->a_ability_flags1; - u32b f6 = r_ptr->a_ability_flags2; - - if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC)) - { - if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0); - if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, c_ptr->m_idx, &dam_max0); - if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, c_ptr->m_idx, &dam_max0); - if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, c_ptr->m_idx, &dam_max0); - if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, c_ptr->m_idx, &dam_max0); - if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, c_ptr->m_idx, &dam_max0); - } - if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, c_ptr->m_idx, &dam_max0); - if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, c_ptr->m_idx, &dam_max0); - } - - /* Monster melee attacks */ - if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE)) - { - if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1) - { - int m; - int dam_melee = 0; - for (m = 0; m < 4; m++) - { - /* Skip non-attacks */ - if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue; - - /* Extract the attack info */ - dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]); - if (r_ptr->blow[m].method == RBM_EXPLODE) break; - } - if (dam_melee > dam_max0) dam_max0 = dam_melee; - } - } - - /* Contribution from this monster */ - dam_max += dam_max0; - } - } - - /* Prevent excessive warning */ - if (dam_max > old_damage) - { - old_damage = dam_max * 3 / 2; - - if (dam_max > p_ptr->chp / 2) - { - object_type *o_ptr = choose_warning_item(); - - if (o_ptr) - object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - else - strcpy(o_name, _("体", "body")); /* Warning ability without item */ - msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name); - - disturb(0, 1); - return get_check(_("本当にこのまま進むか?", "Really want to go ahead? ")); - } - } - else old_damage = old_damage / 2; - - c_ptr = &cave[yy][xx]; - if (((!easy_disarm && is_trap(c_ptr->feat)) - || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13)) - { - object_type *o_ptr = choose_warning_item(); - - if (o_ptr) - object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - else - strcpy(o_name, _("体", "body")); /* Warning ability without item */ - msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name); - disturb(0, 1); - return get_check(_("本当にこのまま進むか?", "Really want to go ahead? ")); - } - - return TRUE; -} - -/*! - * エッセンス情報の構造体 / A structure for smithing - */ -typedef struct { - int add; /* TR flag number or special essence id */ - cptr add_name; /* Name of this ability */ - ESSENCE_IDX type; /* Menu number */ - int essence; /* Index for carrying essences */ - int value; /* Needed value to add this ability */ -} essence_type; - - -/*! - * エッセンス情報テーブル Smithing type data for Weapon smith - */ -#ifdef JP -static essence_type essence_info[] = -{ - {TR_STR, "腕力", 4, TR_STR, 20}, - {TR_INT, "知能", 4, TR_INT, 20}, - {TR_WIS, "賢さ", 4, TR_WIS, 20}, - {TR_DEX, "器用さ", 4, TR_DEX, 20}, - {TR_CON, "耐久力", 4, TR_CON, 20}, - {TR_CHR, "魅力", 4, TR_CHR, 20}, - {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20}, - {TR_STEALTH, "隠密", 4, TR_STEALTH, 40}, - {TR_SEARCH, "探索", 4, TR_SEARCH, 15}, - {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15}, - {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15}, - {TR_SPEED, "スピード", 4, TR_SPEED, 12}, - {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20}, - {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15}, - {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60}, - {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15}, - {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20}, - {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20}, - {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20}, - {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20}, - {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20}, - {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15}, - {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15}, - {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15}, - {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15}, - {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15}, - {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15}, - {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20}, - {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20}, - {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20}, - {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20}, - {TR_REFLECT, "反射", 2, TR_REFLECT, 20}, - {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20}, - {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20}, - {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15}, - {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15}, - {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15}, - {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15}, - {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25}, - {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20}, - {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20}, - {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20}, - {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20}, - {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20}, - {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20}, - {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20}, - {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20}, - {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20}, - {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20}, - {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20}, - {TR_SH_FIRE, "", 0, -2, 0}, - {TR_SH_ELEC, "", 0, -2, 0}, - {TR_SH_COLD, "", 0, -2, 0}, - {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15}, - {TR_WARNING, "警告", 3, TR_WARNING, 20}, - {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20}, - {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15}, - {TR_LITE_2, "", 0, -2, 0}, - {TR_LITE_3, "", 0, -2, 0}, - {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20}, - {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15}, - {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15}, - {TR_REGEN, "急速回復", 3, TR_REGEN, 20}, - {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25}, - - {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100}, - {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60}, - {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20}, - {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60}, - {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20}, - {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60}, - {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20}, - {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60}, - {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15}, - {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60}, - {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15}, - {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60}, - {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20}, - {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60}, - {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20}, - {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60}, - {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20}, - {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60}, - - {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40}, - {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40}, - {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40}, - {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40}, - {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40}, - {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40}, - {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40}, - {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40}, - - {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30}, - {ESSENCE_AC, "防御", 10, TR_ES_AC, 15}, - {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50}, - {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50}, - {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50}, - {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50}, - {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50}, - {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50}, - {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50}, - {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150}, - {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10}, - {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200}, - - {-1, NULL, 0, -1, 0} -}; -#else -static essence_type essence_info[] = -{ - {TR_STR, "strength", 4, TR_STR, 20}, - {TR_INT, "intelligence", 4, TR_INT, 20}, - {TR_WIS, "wisdom", 4, TR_WIS, 20}, - {TR_DEX, "dexterity", 4, TR_DEX, 20}, - {TR_CON, "constitution", 4, TR_CON, 20}, - {TR_CHR, "charisma", 4, TR_CHR, 20}, - {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20}, - {TR_STEALTH, "stealth", 4, TR_STEALTH, 40}, - {TR_SEARCH, "serching", 4, TR_SEARCH, 15}, - {TR_INFRA, "infravision", 4, TR_INFRA, 15}, - {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15}, - {TR_SPEED, "speed", 4, TR_SPEED, 12}, - {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20}, - {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15}, - {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60}, - {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15}, - {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20}, - {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20}, - {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20}, - {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20}, - {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20}, - {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15}, - {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15}, - {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15}, - {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15}, - {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15}, - {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15}, - {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20}, - {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20}, - {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20}, - {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20}, - {TR_REFLECT, "reflection", 2, TR_REFLECT, 20}, - {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20}, - {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20}, - {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15}, - {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15}, - {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15}, - {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15}, - {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25}, - {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20}, - {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20}, - {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20}, - {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20}, - {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20}, - {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20}, - {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20}, - {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20}, - {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20}, - {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20}, - {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20}, - {TR_SH_FIRE, "", 0, -2, 0}, - {TR_SH_ELEC, "", 0, -2, 0}, - {TR_SH_COLD, "", 0, -2, 0}, - {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15}, - {TR_WARNING, "warning", 3, TR_WARNING, 20}, - {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20}, - {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15}, - {TR_LITE_2, "", 0, -2, 0}, - {TR_LITE_3, "", 0, -2, 0}, - {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20}, - {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15}, - {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15}, - {TR_REGEN, "regeneration", 3, TR_REGEN, 20}, - {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25}, - - {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100}, - {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20}, - {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60}, - {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60}, - {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20}, - {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60}, - {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20}, - {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60}, - {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15}, - {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60}, - {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15}, - {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60}, - {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20}, - {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60}, - {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20}, - {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60}, - {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20}, - {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60}, - - {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40}, - {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40}, - {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40}, - {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40}, - {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40}, - {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40}, - {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40}, - {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40}, - - {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30}, - {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15}, - {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50}, - {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50}, - {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50}, - {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50}, - {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50}, - {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50}, - {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50}, - {ESSENCE_RESISTANCE, "resistance", 2, -1, 150}, - {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10}, - {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200}, - - {-1, NULL, 0, -1, 0} -}; -#endif - - -/*! - * エッセンス名テーブル / Essense names for Weapon smith - */ -#ifdef JP -cptr essence_name[] = -{ - "腕力", - "知能", - "賢さ", - "器用さ", - "耐久力", - "魅力", - "魔力支配", - "", - "隠密", - "探索", - "赤外線視力", - "採掘", - "スピード", - "追加攻撃", - "カオス攻撃", - "吸血攻撃", - "動物倍打", - "邪悪倍打", - "不死倍打", - "悪魔倍打", - "オーク倍打", - "トロル倍打", - "巨人倍打", - "竜倍打", - "", - "", - "地震", - "毒殺", - "溶解", - "電撃", - "焼棄", - "凍結", - "能力維持", - "", - "", - "", - "", - "", - "", - "", - "免疫", - "", - "", - "", - "", - "反射", - "麻痺知らず", - "経験値維持", - "耐酸", - "耐電撃", - "耐火炎", - "耐冷気", - "耐毒", - "耐恐怖", - "耐閃光", - "耐暗黒", - "耐盲目", - "耐混乱", - "耐轟音", - "耐破片", - "耐地獄", - "耐因果混乱", - "耐カオス", - "耐劣化", - "", - "", - "人間倍打", - "", - "", - "反魔法", - "", - "", - "警告", - "", - "", - "", - "浮遊", - "永久光源", - "可視透明", - "テレパシー", - "遅消化", - "急速回復", - "", - "", - "", - "", - "", - "", - "", - "", - "テレポート", - "", - "", - "攻撃", - "防御", - - NULL -}; - -#else - -cptr essence_name[] = -{ - "strength", - "intelligen.", - "wisdom", - "dexterity", - "constitut.", - "charisma", - "magic mast.", - "", - "stealth", - "serching", - "infravision", - "digging", - "speed", - "extra atk", - "chaos brand", - "vampiric", - "slay animal", - "slay evil", - "slay undead", - "slay demon", - "slay orc", - "slay troll", - "slay giant", - "slay dragon", - "", - "", - "quake", - "pois. brand", - "acid brand", - "elec. brand", - "fire brand", - "cold brand", - "sustain", - "", - "", - "", - "", - "", - "", - "", - "immunity", - "", - "", - "", - "", - "reflection", - "free action", - "hold exp", - "res. acid", - "res. elec.", - "res. fire", - "res. cold", - "res. poison", - "res. fear", - "res. light", - "res. dark", - "res. blind", - "res.confuse", - "res. sound", - "res. shard", - "res. nether", - "res. nexus", - "res. chaos", - "res. disen.", - "", - "", - "slay human", - "", - "", - "anti magic", - "", - "", - "warning", - "", - "", - "", - "levitation", - "perm. light", - "see invis.", - "telepathy", - "slow dige.", - "regen.", - "", - "", - "", - "", - "", - "", - "", - "", - "teleport", - "", - "", - "weapon enc.", - "armor enc.", - - NULL -}; -#endif - -/*! - * @brief 所持しているエッセンス一覧を表示する - * @return なし - */ -static void display_essence(void) -{ - int i, num = 0; - - screen_save(); - for (i = 1; i < 22; i++) - { - prt("",i,0); - } - prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数", - "Essence Num Essence Num Essence Num "), 1, 8); - for (i = 0; essence_name[i]; i++) - { - if (!essence_name[i][0]) continue; - prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22); - num++; - } - prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0); - (void)inkey(); - screen_load(); - return; -} - -/*! - * @brief エッセンスの抽出処理 - * @return なし - */ -static void drain_essence(void) -{ - int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)]; - int i; - OBJECT_IDX item; - int dec = 4; - bool observe = FALSE; - int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2; - TIME_EFFECT old_timeout; - BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE]; - object_type *o_ptr; - cptr q, s; - POSITION iy, ix; - byte_hack marked; - ITEM_NUMBER number; - OBJECT_IDX next_o_idx; - WEIGHT weight; - - for (i = 0; i < sizeof(drain_value) / sizeof(int); i++) - drain_value[i] = 0; - - item_tester_hook = object_is_weapon_armour_ammo; - item_tester_no_ryoute = TRUE; - - /* Get an item */ - q = _("どのアイテムから抽出しますか?", "Extract from which item? "); - s = _("抽出できるアイテムがありません。", "You have nothing you can extract from."); - - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return; - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } - - if (object_is_known(o_ptr) && !object_is_nameless(o_ptr)) - { - char o_name[MAX_NLEN]; - object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return; - } - - p_ptr->energy_use = 100; - - object_flags(o_ptr, old_flgs); - if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON); - if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL); - if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL); - if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD); - if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON); - if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC); - if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL); - if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT); - if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN); - - old_to_a = o_ptr->to_a; - old_ac = o_ptr->ac; - old_to_h = o_ptr->to_h; - old_to_d = o_ptr->to_d; - old_ds = o_ptr->ds; - old_dd = o_ptr->dd; - old_pval = o_ptr->pval; - old_name2 = o_ptr->name2; - old_timeout = o_ptr->timeout; - if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--; - if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--; - if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--; - if (have_flag(old_flgs, TR_AGGRAVATE)) dec--; - if (have_flag(old_flgs, TR_NO_TELE)) dec--; - if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--; - if (have_flag(old_flgs, TR_DRAIN_HP)) dec--; - if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--; - if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--; - if (have_flag(old_flgs, TR_CALL_DEMON)) dec--; - if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--; - if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--; - if (have_flag(old_flgs, TR_COWARDICE)) dec--; - if (have_flag(old_flgs, TR_LOW_MELEE)) dec--; - if (have_flag(old_flgs, TR_LOW_AC)) dec--; - if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--; - if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--; - if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--; - if (have_flag(old_flgs, TR_TY_CURSE)) dec--; - - iy = o_ptr->iy; - ix = o_ptr->ix; - next_o_idx = o_ptr->next_o_idx; - marked = o_ptr->marked; - weight = o_ptr->weight; - number = o_ptr->number; - - object_prep(o_ptr, o_ptr->k_idx); - - o_ptr->iy=iy; - o_ptr->ix=ix; - o_ptr->next_o_idx=next_o_idx; - o_ptr->marked=marked; - o_ptr->number = number; - if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout; - if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number); - o_ptr->ident |= (IDENT_MENTAL); - object_aware(o_ptr); - object_known(o_ptr); - - object_flags(o_ptr, new_flgs); - - for (i = 0; essence_info[i].add_name; i++) - { - essence_type *es_ptr = &essence_info[i]; - PARAMETER_VALUE pval = 0; - - if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval) - pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval; - - if (es_ptr->add < TR_FLAG_MAX && - (!have_flag(new_flgs, es_ptr->add) || pval) && - have_flag(old_flgs, es_ptr->add)) - { - if (pval) - { - drain_value[es_ptr->essence] += 10 * pval; - } - else if (es_ptr->essence != -2) - { - drain_value[es_ptr->essence] += 10; - } - else if (es_ptr->add == TR_SH_FIRE) - { - drain_value[TR_BRAND_FIRE] += 10; - drain_value[TR_RES_FIRE] += 10; - } - else if (es_ptr->add == TR_SH_ELEC) - { - drain_value[TR_BRAND_ELEC] += 10; - drain_value[TR_RES_ELEC] += 10; - } - else if (es_ptr->add == TR_SH_COLD) - { - drain_value[TR_BRAND_COLD] += 10; - drain_value[TR_RES_COLD] += 10; - } - else if (es_ptr->add == TR_LITE_2) - { - drain_value[TR_LITE_1] += 20; - } - else if (es_ptr->add == TR_LITE_3) - { - drain_value[TR_LITE_1] += 30; - } - } - } - - if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON))) - { - drain_value[TR_INT] += 5; - drain_value[TR_WIS] += 5; - } - if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL))) - { - drain_value[TR_BRAND_POIS] += 5; - drain_value[TR_BRAND_ACID] += 5; - drain_value[TR_BRAND_ELEC] += 5; - drain_value[TR_BRAND_FIRE] += 5; - drain_value[TR_BRAND_COLD] += 5; - } - if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA))) - { - drain_value[TR_INT] += 10; - } - if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT))) - { - drain_value[TR_STR] += 10; - } - if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS))) - { - drain_value[TR_DEX] += 10; - } - if (old_name2 == EGO_2WEAPON) - { - drain_value[TR_DEX] += 20; - } - if (object_is_weapon_ammo(o_ptr)) - { - if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10; - - if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10; - } - if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10; - if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10; - if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10; - if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10; - - for (i = 0; i < sizeof(drain_value) / sizeof(int); i++) - { - drain_value[i] *= number; - drain_value[i] = drain_value[i] * dec / 4; - drain_value[i] = MAX(drain_value[i], 0); - if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10; - if (drain_value[i]) - { - observe = TRUE; - } - } - if (!observe) - { - msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence.")); - } - else - { - msg_print(_("抽出したエッセンス:", "Extracted essences:")); - - for (i = 0; essence_name[i]; i++) - { - if (!essence_name[i][0]) continue; - if (!drain_value[i]) continue; - - p_ptr->magic_num1[i] += drain_value[i]; - p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]); - msg_print(NULL); - msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". ")); - } - } - - /* Apply autodestroy/inscription to the drained item */ - autopick_alter_item(item, TRUE); - - /* Combine the pack */ - p_ptr->notice |= (PN_COMBINE | PN_REORDER); - - /* Window stuff */ - p_ptr->window |= (PW_INVEN); -} - -/*! - * @brief 付加するエッセンスの大別を選択する - * @return 選んだエッセンスの大別ID - */ -static COMMAND_CODE choose_essence(void) -{ - COMMAND_CODE mode = 0; - char choice; - COMMAND_CODE menu_line = (use_menu ? 1 : 0); - -#ifdef JP - cptr menu_name[] = { - "武器属性", - "耐性", - "能力", - "数値", - "スレイ", - "ESP", - "その他" - }; -#else - cptr menu_name[] = { - "Brand weapon", - "Resistance", - "Ability", - "Magic number", - "Slay", - "ESP", - "Others" - }; -#endif - const COMMAND_CODE mode_max = 7; - -#ifdef ALLOW_REPEAT - if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max) - return mode; - mode = 0; -#endif /* ALLOW_REPEAT */ - - if (use_menu) - { - screen_save(); - - while(!mode) - { - int i; - for (i = 0; i < mode_max; i++) -#ifdef JP - prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14); - prt("どの種類のエッセンス付加を行いますか?", 0, 0); -#else - prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14); - prt("Choose from menu.", 0, 0); -#endif - - choice = inkey(); - switch(choice) - { - case ESCAPE: - case 'z': - case 'Z': - screen_load(); - return 0; - case '2': - case 'j': - case 'J': - menu_line++; - break; - case '8': - case 'k': - case 'K': - menu_line += mode_max - 1; - break; - case '\r': - case '\n': - case 'x': - case 'X': - mode = menu_line; - break; - } - if (menu_line > mode_max) menu_line -= mode_max; - } - screen_load(); - } - else - { - screen_save(); - while (!mode) - { - int i; - - for (i = 0; i < mode_max; i++) - prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14); - - if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE)) - { - screen_load(); - return 0; - } - - if (isupper(choice)) choice = (char)tolower(choice); - - if ('a' <= choice && choice <= 'a' + (char)mode_max - 1) - mode = (int)choice - 'a' + 1; - } - screen_load(); - } - -#ifdef ALLOW_REPEAT - repeat_push(mode); -#endif /* ALLOW_REPEAT */ - return mode; -} - -/*! - * @brief エッセンスを実際に付加する - * @param mode エッセンスの大別ID - * @return なし - */ -static void add_essence(ESSENCE_IDX mode) -{ - OBJECT_IDX item; - int max_num = 0; - COMMAND_CODE i; - bool flag,redraw; - char choice; - cptr q, s; - object_type *o_ptr; - int ask = TRUE; - char out_val[160]; - int num[22]; - char o_name[MAX_NLEN]; - int use_essence; - essence_type *es_ptr; - bool able[22] = { 0 }; - - int menu_line = (use_menu ? 1 : 0); - - for (i = 0; essence_info[i].add_name; i++) - { - es_ptr = &essence_info[i]; - - if (es_ptr->type != mode) continue; - num[max_num++] = i; - } - -#ifdef ALLOW_REPEAT - if (!repeat_pull(&i) || i<0 || i>=max_num) - { -#endif /* ALLOW_REPEAT */ - - - /* Nothing chosen yet */ - flag = FALSE; - - /* No redraw yet */ - redraw = FALSE; - - /* Build a prompt */ - (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? ")); - if (use_menu) screen_save(); - - /* Get a spell from the user */ - - choice = (always_show_list || use_menu) ? ESCAPE:1; - while (!flag) - { - if( choice==ESCAPE ) choice = ' '; - else if( !get_com(out_val, &choice, FALSE) )break; - - if (use_menu && choice != ' ') - { - switch(choice) - { - case '0': - { - screen_load(); - return; - } - - case '8': - case 'k': - case 'K': - { - menu_line += (max_num-1); - break; - } - - case '2': - case 'j': - case 'J': - { - menu_line++; - break; - } - - case '4': - case 'h': - case 'H': - { - menu_line = 1; - break; - } - case '6': - case 'l': - case 'L': - { - menu_line = max_num; - break; - } - - case 'x': - case 'X': - case '\r': - case '\n': - { - i = menu_line - 1; - ask = FALSE; - break; - } - } - if (menu_line > max_num) menu_line -= max_num; - } - /* Request redraw */ - if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask)) - { - /* Show the list */ - if (!redraw || use_menu) - { - byte y, x = 10; - int ctr; - char dummy[80], dummy2[80]; - byte col; - - strcpy(dummy, ""); - - /* Show list */ - redraw = TRUE; - - /* Save the screen */ - if (!use_menu) screen_save(); - - for (y = 1; y < 24; y++) - prt("", y, x); - - /* Print header(s) */ -#ifdef JP - prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x); - -#else - prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x); -#endif - /* Print list */ - for (ctr = 0; ctr < max_num; ctr++) - { - es_ptr = &essence_info[num[ctr]]; - - if (use_menu) - { - if (ctr == (menu_line-1)) - strcpy(dummy, _("》 ", "> ")); - else strcpy(dummy, " "); - - } - /* letter/number for power selection */ - else - { - sprintf(dummy, "%c) ",I2A(ctr)); - } - - strcat(dummy, es_ptr->add_name); - - col = TERM_WHITE; - able[ctr] = TRUE; - - if (es_ptr->essence != -1) - { - strcat(dummy, format("(%s)", essence_name[es_ptr->essence])); - if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE; - } - else - { - switch(es_ptr->add) - { - case ESSENCE_SH_FIRE: - strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)")); - if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE; - if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE; - break; - case ESSENCE_SH_ELEC: - strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)")); - if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE; - if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE; - break; - case ESSENCE_SH_COLD: - strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)")); - if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE; - if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE; - break; - case ESSENCE_RESISTANCE: - strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)")); - if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE; - if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE; - if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE; - if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE; - break; - case ESSENCE_SUSTAIN: - strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)")); - if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE; - if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE; - if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE; - if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE; - break; - } - } - - if (!able[ctr]) col = TERM_RED; - - if (es_ptr->essence != -1) - { - sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]); - } - else - { - sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value); - } - - c_prt(col, dummy2, ctr+2, x); - } - } - - /* Hide the list */ - else - { - /* Hide list */ - redraw = FALSE; - - /* Restore the screen */ - screen_load(); - } - - /* Redo asking */ - continue; - } - - if (!use_menu) - { - /* Note verify */ - ask = (isupper(choice)); - - /* Lowercase */ - if (ask) choice = (char)tolower(choice); - - /* Extract request */ - i = (islower(choice) ? A2I(choice) : -1); - } - - /* Totally Illegal */ - if ((i < 0) || (i >= max_num) || !able[i]) - { - bell(); - continue; - } - - /* Verify it */ - if (ask) - { - char tmp_val[160]; - - /* Prompt */ - (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name); - - /* Belay that order */ - if (!get_check(tmp_val)) continue; - } - - /* Stop the loop */ - flag = TRUE; - } - - /* Restore the screen */ - if (redraw) screen_load(); - - if (!flag) return; - -#ifdef ALLOW_REPEAT - repeat_push(i); - } -#endif /* ALLOW_REPEAT */ - - es_ptr = &essence_info[num[i]]; - - if (es_ptr->add == ESSENCE_SLAY_GLOVE) - item_tester_tval = TV_GLOVES; - else if (mode == 1 || mode == 5) - item_tester_hook = item_tester_hook_melee_ammo; - else if (es_ptr->add == ESSENCE_ATTACK) - item_tester_hook = object_allow_enchant_weapon; - else if (es_ptr->add == ESSENCE_AC) - item_tester_hook = object_is_armour; - else - item_tester_hook = object_is_weapon_armour_ammo; - item_tester_no_ryoute = TRUE; - - /* Get an item */ - q = _("どのアイテムを改良しますか?", "Improve which item? "); - s = _("改良できるアイテムがありません。", "You have nothing to improve."); - - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return; - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } - - if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr))) - { - msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved.")); - return; - } - - object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - - use_essence = es_ptr->value; - if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10; - if (o_ptr->number > 1) - { - use_essence *= o_ptr->number; - msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence); - } - - if (es_ptr->essence != -1) - { - if (p_ptr->magic_num1[es_ptr->essence] < use_essence) - { - msg_print(_("エッセンスが足りない。", "You don't have enough essences.")); - return; - } - if (is_pval_flag(es_ptr->add)) - { - if (o_ptr->pval < 0) - { - msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item.")); - return; - } - else if (es_ptr->add == TR_BLOWS) - { - if (o_ptr->pval > 1) - { - if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return; - } - - o_ptr->pval = 1; - msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence); - } - else if (o_ptr->pval > 0) - { - use_essence *= o_ptr->pval; - msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence); - } - else - { - char tmp[80]; - char tmp_val[160]; - PARAMETER_VALUE pval; - PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value); - - sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit); - strcpy(tmp_val, "1"); - - if (!get_string(tmp, tmp_val, 1)) return; - pval = (PARAMETER_VALUE)atoi(tmp_val); - if (pval > limit) pval = limit; - else if (pval < 1) pval = 1; - o_ptr->pval += pval; - use_essence *= pval; - msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence); - } - - if (p_ptr->magic_num1[es_ptr->essence] < use_essence) - { - msg_print(_("エッセンスが足りない。", "You don't have enough essences.")); - return; - } - } - else if (es_ptr->add == ESSENCE_SLAY_GLOVE) - { - char tmp_val[160]; - int val; - HIT_PROB get_to_h; - HIT_POINT get_to_d; - - strcpy(tmp_val, "1"); - if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return; - val = atoi(tmp_val); - if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3; - else if (val < 1) val = 1; - use_essence *= val; - msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence); - if (p_ptr->magic_num1[es_ptr->essence] < use_essence) - { - msg_print(_("エッセンスが足りない。", "You don't have enough essences.")); - return; - } - get_to_h = ((val+1)/2+randint0(val/2+1)); - get_to_d = ((val+1)/2+randint0(val/2+1)); - o_ptr->xtra4 = (get_to_h<<8)+get_to_d; - o_ptr->to_h += get_to_h; - o_ptr->to_d += get_to_d; - } - p_ptr->magic_num1[es_ptr->essence] -= use_essence; - if (es_ptr->add == ESSENCE_ATTACK) - { - if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5)) - { - msg_print(_("改良に失敗した。", "You failed to enchant.")); - p_ptr->energy_use = 100; - return; - } - else - { - if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++; - if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++; - } - } - else if (es_ptr->add == ESSENCE_AC) - { - if (o_ptr->to_a >= p_ptr->lev/5+5) - { - msg_print(_("改良に失敗した。", "You failed to enchant.")); - p_ptr->energy_use = 100; - return; - } - else - { - if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++; - } - } - else - { - o_ptr->xtra3 = es_ptr->add + 1; - } - } - else - { - bool success = TRUE; - - switch(es_ptr->add) - { - case ESSENCE_SH_FIRE: - if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence)) - { - success = FALSE; - break; - } - p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence; - p_ptr->magic_num1[TR_RES_FIRE] -= use_essence; - break; - case ESSENCE_SH_ELEC: - if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence)) - { - success = FALSE; - break; - } - p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence; - p_ptr->magic_num1[TR_RES_ELEC] -= use_essence; - break; - case ESSENCE_SH_COLD: - if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence)) - { - success = FALSE; - break; - } - p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence; - p_ptr->magic_num1[TR_RES_COLD] -= use_essence; - break; - case ESSENCE_RESISTANCE: - case ESSENCE_SUSTAIN: - if ((p_ptr->magic_num1[TR_RES_ACID] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence)) - { - success = FALSE; - break; - } - p_ptr->magic_num1[TR_RES_ACID] -= use_essence; - p_ptr->magic_num1[TR_RES_ELEC] -= use_essence; - p_ptr->magic_num1[TR_RES_FIRE] -= use_essence; - p_ptr->magic_num1[TR_RES_COLD] -= use_essence; - break; - } - if (!success) - { - msg_print(_("エッセンスが足りない。", "You don't have enough essences.")); - return; - } - if (es_ptr->add == ESSENCE_SUSTAIN) - { - add_flag(o_ptr->art_flags, TR_IGNORE_ACID); - add_flag(o_ptr->art_flags, TR_IGNORE_ELEC); - add_flag(o_ptr->art_flags, TR_IGNORE_FIRE); - add_flag(o_ptr->art_flags, TR_IGNORE_COLD); - } - else - { - o_ptr->xtra3 = es_ptr->add + 1; - } - } - - p_ptr->energy_use = 100; - -#ifdef JP - msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name); -#else - msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name); -#endif - - /* Combine the pack */ - p_ptr->notice |= (PN_COMBINE | PN_REORDER); - - /* Window stuff */ - p_ptr->window |= (PW_INVEN); -} - -/*! - * @brief エッセンスを消去する - * @return なし - */ -static void erase_essence(void) -{ - OBJECT_IDX item; - cptr q, s; - object_type *o_ptr; - char o_name[MAX_NLEN]; - BIT_FLAGS flgs[TR_FLAG_SIZE]; - - item_tester_hook = object_is_smith; - - /* Get an item */ - q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? "); - s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence."); - - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return; - - /* Get the item (in the pack) */ - if (item >= 0) - { - o_ptr = &inventory[item]; - } - - /* Get the item (on the floor) */ - else - { - o_ptr = &o_list[0 - item]; - } - - object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY)); - if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return; - - p_ptr->energy_use = 100; - - if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE) - { - o_ptr->to_h -= (o_ptr->xtra4>>8); - o_ptr->to_d -= (o_ptr->xtra4 & 0x000f); - o_ptr->xtra4 = 0; - if (o_ptr->to_h < 0) o_ptr->to_h = 0; - if (o_ptr->to_d < 0) o_ptr->to_d = 0; - } - o_ptr->xtra3 = 0; - object_flags(o_ptr, flgs); - if (!(have_pval_flags(flgs))) o_ptr->pval = 0; - msg_print(_("エッセンスを取り去った。", "You removed all essence you have added.")); - - /* Combine the pack */ - p_ptr->notice |= (PN_COMBINE | PN_REORDER); - - /* Window stuff */ - p_ptr->window |= (PW_INVEN); -} - -/*! - * @brief 鍛冶コマンドのメインルーチン - * @param only_browse TRUEならばエッセンス一覧の表示のみを行う - * @return なし - */ -void do_cmd_kaji(bool only_browse) -{ - COMMAND_CODE mode = 0; - char choice; - - COMMAND_CODE menu_line = (use_menu ? 1 : 0); - - if (!only_browse) - { - if (p_ptr->confused) - { - msg_print(_("混乱していて作業できない!", "You are too confused!")); - return; - } - if (p_ptr->blind) - { - msg_print(_("目が見えなくて作業できない!", "You are blind!")); - return; - } - if (p_ptr->image) - { - msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!")); - return; - } - } - -#ifdef ALLOW_REPEAT - if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5)) - { -#endif /* ALLOW_REPEAT */ - - if (only_browse) screen_save(); - do { - if (!only_browse) screen_save(); - if (use_menu) - { - while(!mode) - { -#ifdef JP - prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14); - prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14); - prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14); - prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14); - prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14); - prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0); -#else - prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14); - prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14); - prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14); - prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14); - prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14); - prt(format("Choose command from menu."), 0, 0); -#endif - choice = inkey(); - switch(choice) - { - case ESCAPE: - case 'z': - case 'Z': - screen_load(); - return; - case '2': - case 'j': - case 'J': - menu_line++; - break; - case '8': - case 'k': - case 'K': - menu_line+= 4; - break; - case '\r': - case '\n': - case 'x': - case 'X': - mode = menu_line; - break; - } - if (menu_line > 5) menu_line -= 5; - } - } - - else - { - while (!mode) - { -#ifdef JP - prt(" a) エッセンス一覧", 2, 14); - prt(" b) エッセンス抽出", 3, 14); - prt(" c) エッセンス消去", 4, 14); - prt(" d) エッセンス付加", 5, 14); - prt(" e) 武器/防具強化", 6, 14); - if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE)) -#else - prt(" a) List essences", 2, 14); - prt(" b) Extract essence", 3, 14); - prt(" c) Remove essence", 4, 14); - prt(" d) Add essence", 5, 14); - prt(" e) Enchant weapon/armor", 6, 14); - if (!get_com("Command :", &choice, TRUE)) -#endif - { - screen_load(); - return; - } - switch (choice) - { - case 'A': - case 'a': - mode = 1; - break; - case 'B': - case 'b': - mode = 2; - break; - case 'C': - case 'c': - mode = 3; - break; - case 'D': - case 'd': - mode = 4; - break; - case 'E': - case 'e': - mode = 5; - break; - } - } - } - - if (only_browse) - { - char temp[62*5]; - int line, j; - - /* Clear lines, position cursor (really should use strlen here) */ - Term_erase(14, 21, 255); - Term_erase(14, 20, 255); - Term_erase(14, 19, 255); - Term_erase(14, 18, 255); - Term_erase(14, 17, 255); - Term_erase(14, 16, 255); - - roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp)); - for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j]))) - { - prt(&temp[j], line, 15); - line++; - } - mode = 0; - } - if (!only_browse) screen_load(); - } while (only_browse); -#ifdef ALLOW_REPEAT - repeat_push(mode); - } -#endif /* ALLOW_REPEAT */ - - switch(mode) - { - case 1: display_essence();break; - case 2: drain_essence();break; - case 3: erase_essence();break; - case 4: - mode = choose_essence(); - if (mode == 0) - break; - add_essence(mode); - break; - case 5: add_essence(10);break; - } -} - /*! * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。 @@ -8728,7 +5803,7 @@ void do_cmd_kaji(bool only_browse) * @param flgs 特別に追加するフラグを返す参照ポインタ * @return なし */ -void torch_flags(object_type *o_ptr, u32b *flgs) +void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs) { if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH)) { @@ -8749,7 +5824,7 @@ void torch_flags(object_type *o_ptr, u32b *flgs) * @param ds 特別なダイス面数を返す参照ポインタ * @return なし */ -void torch_dice(object_type *o_ptr, int *dd, int *ds) +void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds) { if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH)) {