3 * @brief オブジェクトの実装 / Object code, part 2
6 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
8 * This software may be copied and distributed for educational, research,\n
9 * and not for profit purposes provided that this copyright and statement\n
10 * are included in all such copies. Other copyrights may also apply.\n
11 * 2014 Deskull rearranged comment for Doxygen.\n
15 #include "object-hook.h"
16 #include "object-curse.h"
18 static void one_sustain(object_type *o_ptr);
21 static cptr const kaji_tips[5] =
24 "現在持っているエッセンスの一覧を表示する。",
25 "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。",
26 "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。",
27 "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。",
28 "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。",
30 "Display essences you have.",
31 "Extract essences from an item. The item become non magical.",
32 "Remove added essences from an equipment which was improved before. The removed essence will be ruined.",
33 "Add essences to an item. The improved items or artifacts cannot be reimprove.",
34 "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.",
39 * @brief 対象のオブジェクトにランダムな能力維持を一つ付加する。/ Choose one random sustain
41 * @param o_ptr 対象のオブジェクト構造体ポインタ
44 static void one_sustain(object_type *o_ptr)
48 case 0: add_flag(o_ptr->art_flags, TR_SUST_STR); break;
49 case 1: add_flag(o_ptr->art_flags, TR_SUST_INT); break;
50 case 2: add_flag(o_ptr->art_flags, TR_SUST_WIS); break;
51 case 3: add_flag(o_ptr->art_flags, TR_SUST_DEX); break;
52 case 4: add_flag(o_ptr->art_flags, TR_SUST_CON); break;
53 case 5: add_flag(o_ptr->art_flags, TR_SUST_CHR); break;
58 * @brief 床上、モンスター所持でスタックされたアイテムを削除しスタックを補完する / Excise a dungeon object from any stacks
59 * @param o_idx 削除対象のオブジェクト構造体ポインタ
62 void excise_object_idx(OBJECT_IDX o_idx)
66 OBJECT_IDX this_o_idx, next_o_idx = 0;
72 j_ptr = &o_list[o_idx];
75 if (j_ptr->held_m_idx)
80 m_ptr = &m_list[j_ptr->held_m_idx];
82 /* Scan all objects in the grid */
83 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
88 o_ptr = &o_list[this_o_idx];
90 /* Acquire next object */
91 next_o_idx = o_ptr->next_o_idx;
93 if (this_o_idx == o_idx)
98 /* Remove from list */
99 m_ptr->hold_o_idx = next_o_idx;
107 /* Previous object */
108 k_ptr = &o_list[prev_o_idx];
110 /* Remove from list */
111 k_ptr->next_o_idx = next_o_idx;
114 /* Forget next pointer */
115 o_ptr->next_o_idx = 0;
120 /* Save prev_o_idx */
121 prev_o_idx = this_o_idx;
130 POSITION y = j_ptr->iy;
131 POSITION x = j_ptr->ix;
136 /* Scan all objects in the grid */
137 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
142 o_ptr = &o_list[this_o_idx];
144 /* Acquire next object */
145 next_o_idx = o_ptr->next_o_idx;
147 if (this_o_idx == o_idx)
152 /* Remove from list */
153 c_ptr->o_idx = next_o_idx;
161 /* Previous object */
162 k_ptr = &o_list[prev_o_idx];
164 /* Remove from list */
165 k_ptr->next_o_idx = next_o_idx;
168 /* Forget next pointer */
169 o_ptr->next_o_idx = 0;
174 /* Save prev_o_idx */
175 prev_o_idx = this_o_idx;
181 * @brief オブジェクトを削除する /
182 * Delete a dungeon object
183 * @param o_idx 削除対象のオブジェクト構造体ポインタ
186 * Handle "stacks" of objects correctly.
188 void delete_object_idx(OBJECT_IDX o_idx)
193 excise_object_idx(o_idx);
196 j_ptr = &o_list[o_idx];
199 if (!(j_ptr->held_m_idx))
217 * @brief フロアにマスに落ちているオブジェクトを全て削除する / Deletes all objects at given location
218 * Delete a dungeon object
219 * @param y 削除したフロアマスのY座標
220 * @param x 削除したフロアマスのX座標
223 void delete_object(POSITION y, POSITION x)
226 OBJECT_IDX this_o_idx, next_o_idx = 0;
228 /* Refuse "illegal" locations */
229 if (!in_bounds(y, x)) return;
234 /* Scan all objects in the grid */
235 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
240 o_ptr = &o_list[this_o_idx];
242 /* Acquire next object */
243 next_o_idx = o_ptr->next_o_idx;
250 /* Objects are gone */
259 * @brief グローバルオブジェクト配列に対し指定範囲のオブジェクトを整理してIDの若い順に寄せる /
260 * Move an object from index i1 to index i2 in the object list
261 * @param i1 整理したい配列の始点
262 * @param i2 整理したい配列の終点
265 static void compact_objects_aux(IDX i1, IDX i2)
272 if (i1 == i2) return;
276 for (i = 1; i < o_max; i++)
281 /* Skip "dead" objects */
282 if (!o_ptr->k_idx) continue;
284 /* Repair "next" pointers */
285 if (o_ptr->next_o_idx == i1)
288 o_ptr->next_o_idx = i2;
298 if (o_ptr->held_m_idx)
302 /* Acquire monster */
303 m_ptr = &m_list[o_ptr->held_m_idx];
306 if (m_ptr->hold_o_idx == i1)
309 m_ptr->hold_o_idx = i2;
318 /* Acquire location */
326 if (c_ptr->o_idx == i1)
335 o_list[i2] = o_list[i1];
343 * @brief グローバルオブジェクト配列から優先度の低いものを削除し、データを圧縮する。 /
344 * Compact and Reorder the object list.
345 * @param size 最低でも減らしたいオブジェクト数の水準
349 * This function can be very dangerous, use with caution!\n
351 * When actually "compacting" objects, we base the saving throw on a\n
352 * combination of object level, distance from player, and current\n
355 * After "compacting" (if needed), we "reorder" the objects into a more\n
356 * compact order, and we reset the allocation info, and the "live" array.\n
358 void compact_objects(int size)
363 int cur_lev, cur_dis, chance;
370 msg_print(_("アイテム情報を圧縮しています...", "Compacting objects..."));
372 p_ptr->redraw |= (PR_MAP);
374 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
378 /* Compact at least 'size' objects */
379 for (num = 0, cnt = 1; num < size; cnt++)
381 /* Get more vicious each iteration */
384 /* Get closer each iteration */
385 cur_dis = 5 * (20 - cnt);
387 /* Examine the objects */
388 for (i = 1; i < o_max; i++)
392 /* Skip dead objects */
393 if (!o_ptr->k_idx) continue;
395 /* Hack -- High level objects start out "immune" */
396 if (k_info[o_ptr->k_idx].level > cur_lev) continue;
399 if (o_ptr->held_m_idx)
403 /* Acquire monster */
404 m_ptr = &m_list[o_ptr->held_m_idx];
406 /* Get the location */
410 /* Monsters protect their objects */
411 if (randint0(100) < 90) continue;
417 /* Get the location */
422 /* Nearby objects start out "immune" */
423 if ((cur_dis > 0) && (distance(p_ptr->y, p_ptr->x, y, x) < cur_dis)) continue;
428 /* Hack -- only compact artifacts in emergencies */
429 if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
430 (cnt < 1000)) chance = 100;
432 /* Apply the saving throw */
433 if (randint0(100) < chance) continue;
435 delete_object_idx(i);
443 /* Excise dead objects (backwards!) */
444 for (i = o_max - 1; i >= 1; i--)
448 /* Skip real objects */
449 if (o_ptr->k_idx) continue;
451 /* Move last object into open hole */
452 compact_objects_aux(o_max - 1, i);
454 /* Compress "o_max" */
461 * @brief グローバルオブジェクト配列を初期化する /
462 * Delete all the items when player leaves the level
463 * @note we do NOT visually reflect these (irrelevant) changes
465 * Hack -- we clear the "c_ptr->o_idx" field for every grid,
466 * and the "m_ptr->next_o_idx" field for every monster, since
467 * we know we are clearing every object. Technically, we only
468 * clear those fields for grids/monsters containing objects,
469 * and we clear it once for every such object.
472 void wipe_o_list(void)
476 /* Delete the existing objects */
477 for (i = 1; i < o_max; i++)
479 object_type *o_ptr = &o_list[i];
481 /* Skip dead objects */
482 if (!o_ptr->k_idx) continue;
484 /* Mega-Hack -- preserve artifacts */
485 if (!character_dungeon || preserve_mode)
487 /* Hack -- Preserve unknown artifacts */
488 if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
490 /* Mega-Hack -- Preserve the artifact */
491 a_info[o_ptr->name1].cur_num = 0;
496 if (o_ptr->held_m_idx)
501 m_ptr = &m_list[o_ptr->held_m_idx];
503 /* Hack -- see above */
504 m_ptr->hold_o_idx = 0;
512 /* Access location */
513 POSITION y = o_ptr->iy;
514 POSITION x = o_ptr->ix;
519 /* Hack -- see above */
534 * @brief グローバルオブジェクト配列から空きを取得する /
535 * Acquires and returns the index of a "free" object.
536 * @return 開いているオブジェクト要素のID
538 * This routine should almost never fail, but in case it does,
539 * we must be sure to handle "failure" of this routine.
541 OBJECT_IDX o_pop(void)
545 /* Initial allocation */
546 if (o_max < max_o_idx)
551 /* Expand object array */
557 /* Use this object */
562 /* Recycle dead objects */
563 for (i = 1; i < o_max; i++)
570 /* Skip live objects */
571 if (o_ptr->k_idx) continue;
576 /* Use this object */
581 /* Warn the player (except during dungeon creation) */
582 if (character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!"));
589 * @brief オブジェクト生成テーブルに生成制約を加える /
590 * Apply a "object restriction function" to the "object allocation table"
592 * @details 生成の制約はグローバルのget_obj_num_hook関数ポインタで加える
594 static errr get_obj_num_prep(void)
599 alloc_entry *table = alloc_kind_table;
601 /* Scan the allocation table */
602 for (i = 0; i < alloc_kind_size; i++)
604 /* Accept objects which pass the restriction, if any */
605 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
607 /* Accept this object */
608 table[i].prob2 = table[i].prob1;
611 /* Do not use this object */
614 /* Decline this object */
625 * @brief オブジェクト生成テーブルからアイテムを取得する /
626 * Choose an object kind that seems "appropriate" to the given level
628 * @return 選ばれたオブジェクトベースID
630 * This function uses the "prob2" field of the "object allocation table",\n
631 * and various local information, to calculate the "prob3" field of the\n
632 * same table, which is then used to choose an "appropriate" object, in\n
633 * a relatively efficient manner.\n
635 * It is (slightly) more likely to acquire an object of the given level\n
636 * than one of a lower level. This is done by choosing several objects\n
637 * appropriate to the given level and keeping the "hardest" one.\n
639 * Note that if no objects are "appropriate", then this function will\n
640 * fail, and return zero, but this should *almost* never happen.\n
642 OBJECT_IDX get_obj_num(DEPTH level)
645 KIND_OBJECT_IDX k_idx;
648 alloc_entry *table = alloc_kind_table;
650 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
653 if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER))
655 /* Occasional "boost" */
656 if (one_in_(GREAT_OBJ))
658 /* What a bizarre calculation */
659 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
666 /* Process probabilities */
667 for (i = 0; i < alloc_kind_size; i++)
669 /* Objects are sorted by depth */
670 if (table[i].level > level) break;
675 /* Access the index */
676 k_idx = table[i].index;
678 /* Access the actual kind */
679 k_ptr = &k_info[k_idx];
681 /* Hack -- prevent embedded chests */
682 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
685 table[i].prob3 = table[i].prob2;
688 total += table[i].prob3;
691 /* No legal objects */
692 if (total <= 0) return (0);
696 value = randint0(total);
698 /* Find the object */
699 for (i = 0; i < alloc_kind_size; i++)
701 /* Found the entry */
702 if (value < table[i].prob3) break;
705 value = value - table[i].prob3;
712 /* Try for a "better" object once (50%) or twice (10%) */
719 value = randint0(total);
721 /* Find the object */
722 for (i = 0; i < alloc_kind_size; i++)
724 /* Found the entry */
725 if (value < table[i].prob3) break;
728 value = value - table[i].prob3;
731 /* Keep the "best" one */
732 if (table[i].level < table[j].level) i = j;
735 /* Try for a "better" object twice (10%) */
742 value = randint0(total);
744 /* Find the object */
745 for (i = 0; i < alloc_kind_size; i++)
747 /* Found the entry */
748 if (value < table[i].prob3) break;
751 value = value - table[i].prob3;
754 /* Keep the "best" one */
755 if (table[i].level < table[j].level) i = j;
758 return (table[i].index);
763 * @brief オブジェクトを鑑定済にする /
764 * Known is true when the "attributes" of an object are "known".
765 * @param o_ptr 鑑定済にするオブジェクトの構造体参照ポインタ
767 * These include tohit, todam, toac, cost, and pval (charges).\n
769 * Note that "knowing" an object gives you everything that an "awareness"\n
770 * gives you, and much more. In fact, the player is always "aware" of any\n
771 * item of which he has full "knowledge".\n
773 * But having full knowledge of, say, one "wand of wonder", does not, by\n
774 * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
775 * It happens that most "identify" routines (including "buying from a shop")\n
776 * will make the player "aware" of the object as well as fully "know" it.\n
778 * This routine also removes any inscriptions generated by "feelings".\n
780 void object_known(object_type *o_ptr)
782 /* Remove "default inscriptions" */
783 o_ptr->feeling = FEEL_NONE;
785 /* Clear the "Felt" info */
786 o_ptr->ident &= ~(IDENT_SENSE);
788 /* Clear the "Empty" info */
789 o_ptr->ident &= ~(IDENT_EMPTY);
791 /* Now we know about the item */
792 o_ptr->ident |= (IDENT_KNOWN);
796 * @brief オブジェクトを*鑑定*済にする /
797 * The player is now aware of the effects of the given object.
798 * @param o_ptr *鑑定*済にするオブジェクトの構造体参照ポインタ
801 void object_aware(object_type *o_ptr)
803 bool mihanmei = !object_is_aware(o_ptr);
805 /* Fully aware of the effects */
806 k_info[o_ptr->k_idx].aware = TRUE;
808 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
809 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
813 char o_name[MAX_NLEN];
816 object_copy(q_ptr, o_ptr);
819 object_desc(o_name, q_ptr, OD_NAME_ONLY);
821 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
826 * @brief オブジェクトを試行済にする /
827 * Something has been "sampled"
828 * @param o_ptr 試行済にするオブジェクトの構造体参照ポインタ
831 void object_tried(object_type *o_ptr)
833 /* Mark it as tried (even if "aware") */
834 k_info[o_ptr->k_idx].tried = TRUE;
838 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
839 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
840 * @return 擬似鑑定結果のIDを返す。
842 byte value_check_aux1(object_type *o_ptr)
845 if (object_is_artifact(o_ptr))
848 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
855 if (object_is_ego(o_ptr))
858 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
861 return FEEL_EXCELLENT;
865 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
868 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
870 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
872 /* Good "armor" bonus */
873 if (o_ptr->to_a > 0) return FEEL_GOOD;
875 /* Good "weapon" bonus */
876 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
878 /* Default to "average" */
883 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 2 (Light).
884 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
885 * @return 擬似鑑定結果のIDを返す。
887 byte value_check_aux2(object_type *o_ptr)
889 /* Cursed items (all of them) */
890 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
892 /* Broken items (all of them) */
893 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
895 /* Artifacts -- except cursed/broken ones */
896 if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
898 /* Ego-Items -- except cursed/broken ones */
899 if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
901 /* Good armor bonus */
902 if (o_ptr->to_a > 0) return FEEL_UNCURSED;
904 /* Good weapon bonuses */
905 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
912 * @brief 未鑑定なベースアイテムの基本価格を返す /
913 * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
914 * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
915 * @return オブジェクトの未鑑定価格
917 static s32b object_value_base(object_type *o_ptr)
919 /* Aware item -- use template cost */
920 if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
922 /* Analyze the type */
927 case TV_FOOD: return (5L);
929 /* Un-aware Potions */
930 case TV_POTION: return (20L);
932 /* Un-aware Scrolls */
933 case TV_SCROLL: return (20L);
935 /* Un-aware Staffs */
936 case TV_STAFF: return (70L);
939 case TV_WAND: return (50L);
942 case TV_ROD: return (90L);
945 case TV_RING: return (45L);
947 /* Un-aware Amulets */
948 case TV_AMULET: return (45L);
950 /* Figurines, relative to monster level */
953 DEPTH level = r_info[o_ptr->pval].level;
954 if (level < 20) return level*50L;
955 else if (level < 30) return 1000+(level-20)*150L;
956 else if (level < 40) return 2500+(level-30)*350L;
957 else if (level < 50) return 6000+(level-40)*800L;
958 else return 14000+(level-50)*2000L;
962 if (!o_ptr->pval) return 1000L;
963 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
966 /* Paranoia -- Oops */
972 * @brief オブジェクトのフラグ類から価格を算出する /
973 * Return the value of the flags the object has...
974 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
975 * @param plusses フラグに与える価格の基本重み
976 * @return オブジェクトのフラグ価格
978 s32b flag_cost(object_type *o_ptr, int plusses)
981 BIT_FLAGS flgs[TR_FLAG_SIZE];
985 object_kind *k_ptr = &k_info[o_ptr->k_idx];
987 object_flags(o_ptr, flgs);
990 * Exclude fixed flags of the base item.
991 * pval bonuses of base item will be treated later.
993 for (i = 0; i < TR_FLAG_SIZE; i++)
994 flgs[i] &= ~(k_ptr->flags[i]);
996 /* Exclude fixed flags of the fixed artifact. */
997 if (object_is_fixed_artifact(o_ptr))
999 artifact_type *a_ptr = &a_info[o_ptr->name1];
1001 for (i = 0; i < TR_FLAG_SIZE; i++)
1002 flgs[i] &= ~(a_ptr->flags[i]);
1005 /* Exclude fixed flags of the ego-item. */
1006 else if (object_is_ego(o_ptr))
1008 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1010 for (i = 0; i < TR_FLAG_SIZE; i++)
1011 flgs[i] &= ~(e_ptr->flags[i]);
1016 * Calucurate values of remaining flags
1018 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
1019 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
1020 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
1021 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
1022 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
1023 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
1024 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
1025 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
1026 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
1027 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
1028 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
1029 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
1030 total += (10000 + (2500 * plusses));
1031 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
1032 total += (10000 + (2500 * plusses));
1036 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
1037 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
1038 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
1039 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
1040 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
1041 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
1042 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
1043 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
1044 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
1045 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
1046 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
1047 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
1048 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
1049 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
1050 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
1051 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
1052 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
1053 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
1054 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
1055 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
1056 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
1058 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
1059 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
1060 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
1061 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
1062 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
1063 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
1064 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
1065 total += (tmp_cost * count);
1067 if (have_flag(flgs, TR_SUST_STR)) total += 850;
1068 if (have_flag(flgs, TR_SUST_INT)) total += 850;
1069 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
1070 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
1071 if (have_flag(flgs, TR_SUST_CON)) total += 850;
1072 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
1073 if (have_flag(flgs, TR_RIDING)) total += 0;
1074 if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
1075 if (have_flag(flgs, TR_THROW)) total += 5000;
1076 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
1077 if (have_flag(flgs, TR_HOLD_EXP)) total += 8500;
1081 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
1082 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
1083 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
1084 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
1085 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
1086 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
1087 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
1088 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
1089 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
1090 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
1091 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
1092 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
1093 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
1094 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
1095 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
1096 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
1097 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
1098 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
1099 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
1100 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
1101 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
1102 total += (tmp_cost * count);
1104 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
1105 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
1106 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1107 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1108 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1109 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1110 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1111 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1112 if (have_flag(flgs, TR_LEVITATION)) total += 1250;
1113 if (have_flag(flgs, TR_LITE_1)) total += 1500;
1114 if (have_flag(flgs, TR_LITE_2)) total += 2500;
1115 if (have_flag(flgs, TR_LITE_3)) total += 4000;
1116 if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
1117 if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
1118 if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
1119 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1120 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1121 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1122 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1123 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1124 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1125 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1126 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1127 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1128 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1129 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1130 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1131 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1132 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1133 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1134 if (have_flag(flgs, TR_REGEN)) total += 2500;
1135 if (have_flag(flgs, TR_WARNING)) total += 2000;
1136 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1137 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1138 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1139 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1140 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1141 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1142 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1143 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1144 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1145 if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
1146 if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
1147 if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
1148 if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
1149 if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
1150 if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
1151 if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
1152 if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
1153 if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
1154 if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
1155 if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
1156 if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
1157 if (have_flag(flgs, TR_TELEPORT))
1159 if (object_is_cursed(o_ptr))
1164 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1165 if (have_flag(flgs, TR_BLESSED)) total += 750;
1166 if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1167 if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1168 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1169 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1170 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1172 /* Also, give some extra for activatable powers... */
1173 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1175 const activation_type* const act_ptr = find_activation_info(o_ptr);
1177 total += act_ptr->value;
1186 * @brief オブジェクトの真の価格を算出する /
1187 * Return the value of the flags the object has...
1188 * @param o_ptr 本価格を確認したいオブジェクトの構造体参照ポインタ
1189 * @return オブジェクトの本価格
1191 * Return the "real" price of a "known" item, not including discounts\n
1193 * Wand and staffs get cost for each charge\n
1195 * Armor is worth an extra 100 gold per bonus point to armor class.\n
1197 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
1199 * Missiles are only worth 5 gold per bonus point, since they\n
1200 * usually appear in groups of 20, and we want the player to get\n
1201 * the same amount of cash for any "equivalent" item. Note that\n
1202 * missiles never have any of the "pval" flags, and in fact, they\n
1203 * only have a few of the available flags, primarily of the "slay"\n
1204 * and "brand" and "ignore" variety.\n
1206 * Armor with a negative armor bonus is worthless.\n
1207 * Weapons with negative hit+damage bonuses are worthless.\n
1209 * Every wearable item with a "pval" bonus is worth extra (see below).\n
1211 PRICE object_value_real(object_type *o_ptr)
1214 BIT_FLAGS flgs[TR_FLAG_SIZE];
1215 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1218 /* Hack -- "worthless" items */
1219 if (!k_info[o_ptr->k_idx].cost) return (0L);
1222 value = k_info[o_ptr->k_idx].cost;
1224 /* Extract some flags */
1225 object_flags(o_ptr, flgs);
1228 if (object_is_fixed_artifact(o_ptr))
1230 artifact_type *a_ptr = &a_info[o_ptr->name1];
1232 /* Hack -- "worthless" artifacts */
1233 if (!a_ptr->cost) return (0L);
1235 /* Hack -- Use the artifact cost instead */
1236 value = a_ptr->cost;
1237 value += flag_cost(o_ptr, o_ptr->pval);
1239 /* Don't add pval bonuses etc. */
1244 else if (object_is_ego(o_ptr))
1246 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1248 /* Hack -- "worthless" ego-items */
1249 if (!e_ptr->cost) return (0L);
1251 /* Hack -- Reward the ego-item with a bonus */
1252 value += e_ptr->cost;
1253 value += flag_cost(o_ptr, o_ptr->pval);
1261 for (i = 0; i < TR_FLAG_SIZE; i++)
1262 if (o_ptr->art_flags[i]) flag = TRUE;
1264 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1267 /* Analyze pval bonus for normal object */
1268 switch (o_ptr->tval)
1291 if (!o_ptr->pval) break;
1293 /* Hack -- Negative "pval" is always bad */
1294 if (o_ptr->pval < 0) return (0L);
1296 /* Give credit for stat bonuses */
1297 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1298 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1299 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1300 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1301 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1302 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1304 /* Give credit for stealth and searching */
1305 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1306 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1307 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1309 /* Give credit for infra-vision and tunneling */
1310 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1311 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1313 /* Give credit for extra attacks */
1314 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1316 /* Give credit for speed bonus */
1317 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1323 /* Analyze the item */
1324 switch (o_ptr->tval)
1329 /* Pay extra for charges, depending on standard number of
1330 * charges. Handle new-style wands correctly. -LM-
1332 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1338 /* Pay extra for charges, depending on standard number of
1341 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1350 /* Hack -- negative bonuses are bad */
1351 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1353 /* Give credit for bonuses */
1354 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1370 /* Hack -- negative armor bonus */
1371 if (o_ptr->to_a < 0) return (0L);
1373 /* Give credit for bonuses */
1374 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1386 /* Hack -- negative hit/damage bonuses */
1387 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1389 /* Factor in the bonuses */
1390 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1392 /* Hack -- Factor in extra damage dice and sides */
1393 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1394 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1404 /* Hack -- negative hit/damage bonuses */
1405 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1407 /* Factor in the bonuses */
1408 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1410 /* Hack -- Factor in extra damage dice and sides */
1411 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1412 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1417 /* Figurines, relative to monster level */
1420 DEPTH level = r_info[o_ptr->pval].level;
1421 if (level < 20) value = level*50L;
1422 else if (level < 30) value = 1000+(level-20)*150L;
1423 else if (level < 40) value = 2500+(level-30)*350L;
1424 else if (level < 50) value = 6000+(level-40)*800L;
1425 else value = 14000+(level-50)*2000L;
1431 if (!o_ptr->pval) value = 1000L;
1432 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1438 if (!o_ptr->pval) value = 0L;
1443 /* Worthless object */
1444 if (value < 0) return 0L;
1446 /* Return the value */
1452 * @brief オブジェクト価格算出のメインルーチン /
1453 * Return the price of an item including plusses (and charges)
1454 * @param o_ptr 判明している現価格を確認したいオブジェクトの構造体参照ポインタ
1455 * @return オブジェクトの判明している現価格
1457 * This function returns the "value" of the given item (qty one)\n
1459 * Never notice "unknown" bonuses or properties, including "curses",\n
1460 * since that would give the player information he did not have.\n
1462 * Note that discounted items stay discounted forever, even if\n
1463 * the discount is "forgotten" by the player via memory loss.\n
1465 PRICE object_value(object_type *o_ptr)
1469 /* Unknown items -- acquire a base value */
1470 if (object_is_known(o_ptr))
1472 /* Broken items -- worthless */
1473 if (object_is_broken(o_ptr)) return (0L);
1475 /* Cursed items -- worthless */
1476 if (object_is_cursed(o_ptr)) return (0L);
1478 /* Real value (see above) */
1479 value = object_value_real(o_ptr);
1482 /* Known items -- acquire the actual value */
1485 /* Hack -- Felt broken items */
1486 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1488 /* Hack -- Felt cursed items */
1489 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1491 /* Base value (see above) */
1492 value = object_value_base(o_ptr);
1496 /* Apply discount (if any) */
1497 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1500 /* Return the final value */
1507 * @brief 破壊可能なアイテムかを返す /
1508 * Determines whether an object can be destroyed, and makes fake inscription.
1509 * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
1510 * @return オブジェクトが破壊可能ならばTRUEを返す
1512 bool can_player_destroy_object(object_type *o_ptr)
1514 /* Artifacts cannot be destroyed */
1515 if (!object_is_artifact(o_ptr)) return TRUE;
1517 /* If object is unidentified, makes fake inscription */
1518 if (!object_is_known(o_ptr))
1520 byte feel = FEEL_SPECIAL;
1522 /* Hack -- Handle icky artifacts */
1523 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1525 /* Hack -- inscribe the artifact */
1526 o_ptr->feeling = feel;
1528 /* We have "felt" it (again) */
1529 o_ptr->ident |= (IDENT_SENSE);
1531 /* Combine the pack */
1532 p_ptr->notice |= (PN_COMBINE);
1534 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1539 /* Identified artifact -- Nothing to do */
1545 * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
1546 * Distribute charges of rods or wands.
1547 * @param o_ptr 分割元オブジェクトの構造体参照ポインタ source item
1548 * @param q_ptr 分割先オブジェクトの構造体参照ポインタ target item, must be of the same type as o_ptr
1549 * @param amt 分割したい回数量 number of items that are transfered
1552 * Hack -- If rods or wands are dropped, the total maximum timeout or\n
1553 * charges need to be allocated between the two stacks. If all the items\n
1554 * are being dropped, it makes for a neater message to leave the original\n
1555 * stack's pval alone. -LM-\n
1557 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1559 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1561 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1562 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1564 /* Hack -- Rods also need to have their timeouts distributed. The
1565 * dropped stack will accept all time remaining to charge up to its
1568 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1570 if (q_ptr->pval > o_ptr->timeout)
1571 q_ptr->timeout = o_ptr->timeout;
1573 q_ptr->timeout = q_ptr->pval;
1575 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1581 * @brief 魔法棒やロッドの使用回数を減らす /
1582 * @param o_ptr オブジェクトの構造体参照ポインタ source item
1583 * @param amt 減らしたい回数量 number of items that are transfered
1586 * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1587 * charges of the stack needs to be reduced, unless all the items are\n
1588 * being destroyed. -LM-\n
1590 void reduce_charges(object_type *o_ptr, int amt)
1592 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1593 (amt < o_ptr->number))
1595 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1600 * Determine if an item can "absorb" a second item
1602 * See "object_absorb()" for the actual "absorption" code.
1604 * If permitted, we allow staffs (if they are known to have equal charges
1605 * and both are either known or confirmed empty) and wands (if both are
1606 * either known or confirmed empty) and rods (in all cases) to combine.
1607 * Staffs will unstack (if necessary) when they are used, but wands and
1608 * rods will only unstack if one is dropped. -LM-
1610 * If permitted, we allow weapons/armor to stack, if fully "known".
1612 * Missiles will combine if both stacks have the same "known" status.
1613 * This is done to make unidentified stacks of missiles useful.
1615 * Food, potions, scrolls, and "easy know" items always stack.
1617 * Chests, and activatable items, never stack (for various reasons).
1621 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1623 #define MAX_STACK_SIZE 99
1627 * @brief 両オブジェクトをスロットに重ね合わせ可能な最大数を返す。
1628 * Determine if an item can partly absorb a second item. Return maximum number of stack.
1629 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1630 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1631 * @return 重ね合わせ可能なアイテム数
1633 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1637 /* Default maximum number of stack */
1638 int max_num = MAX_STACK_SIZE;
1640 /* Require identical object types */
1641 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1644 /* Analyze the items */
1645 switch (o_ptr->tval)
1647 /* Chests and Statues*/
1658 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1659 if (o_ptr->pval != j_ptr->pval) return 0;
1663 /* Figurines and Corpses*/
1668 if (o_ptr->pval != j_ptr->pval) return 0;
1674 /* Food and Potions and Scrolls */
1686 /* Require either knowledge or known empty for both staffs. */
1687 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1688 !object_is_known(o_ptr)) ||
1689 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1690 !object_is_known(j_ptr))) return 0;
1692 /* Require identical charges, since staffs are bulky. */
1693 if (o_ptr->pval != j_ptr->pval) return 0;
1702 /* Require either knowledge or known empty for both wands. */
1703 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1704 !object_is_known(o_ptr)) ||
1705 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1706 !object_is_known(j_ptr))) return 0;
1708 /* Wand charges combine in O&ZAngband. */
1714 /* Staffs and Wands and Rods */
1717 /* Prevent overflaw of timeout */
1718 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1724 /* Weapons and Armor */
1740 /* Rings, Amulets, Lites */
1746 /* Require full knowledge of both items */
1747 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1757 /* Require identical knowledge of both items */
1758 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1759 if (o_ptr->feeling != j_ptr->feeling) return 0;
1761 /* Require identical "bonuses" */
1762 if (o_ptr->to_h != j_ptr->to_h) return 0;
1763 if (o_ptr->to_d != j_ptr->to_d) return 0;
1764 if (o_ptr->to_a != j_ptr->to_a) return 0;
1766 /* Require identical "pval" code */
1767 if (o_ptr->pval != j_ptr->pval) return 0;
1769 /* Artifacts never stack */
1770 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1772 /* Require identical "ego-item" names */
1773 if (o_ptr->name2 != j_ptr->name2) return 0;
1775 /* Require identical added essence */
1776 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1777 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1779 /* Hack -- Never stack "powerful" items */
1780 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1782 /* Hack -- Never stack recharging items */
1783 if (o_ptr->timeout || j_ptr->timeout) return 0;
1785 /* Require identical "values" */
1786 if (o_ptr->ac != j_ptr->ac) return 0;
1787 if (o_ptr->dd != j_ptr->dd) return 0;
1788 if (o_ptr->ds != j_ptr->ds) return 0;
1797 /* Require knowledge */
1798 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1806 /* Hack -- Identical art_flags! */
1807 for (i = 0; i < TR_FLAG_SIZE; i++)
1808 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1810 /* Hack -- Require identical "cursed" status */
1811 if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1813 /* Hack -- Require identical "broken" status */
1814 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1817 /* Hack -- require semi-matching "inscriptions" */
1818 if (o_ptr->inscription && j_ptr->inscription &&
1819 (o_ptr->inscription != j_ptr->inscription))
1822 /* Hack -- normally require matching "inscriptions" */
1823 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1825 /* Hack -- normally require matching "discounts" */
1826 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1829 /* They match, so they must be similar */
1834 * @brief 両オブジェクトをスロットに重ねることができるかどうかを返す。
1835 * Determine if an item can absorb a second item.
1836 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1837 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1838 * @return 重ね合わせ可能ならばTRUEを返す。
1840 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1842 int total = o_ptr->number + j_ptr->number;
1845 /* Are these objects similar? */
1846 max_num = object_similar_part(o_ptr, j_ptr);
1848 /* Return if not similar */
1849 if (!max_num) return FALSE;
1851 /* Maximal "stacking" limit */
1852 if (total > max_num) return (0);
1855 /* They match, so they must be similar */
1861 * @brief 両オブジェクトをスロットに重ね合わせる。
1862 * Allow one item to "absorb" another, assuming they are similar
1863 * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
1864 * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
1867 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1869 int max_num = object_similar_part(o_ptr, j_ptr);
1870 int total = o_ptr->number + j_ptr->number;
1871 int diff = (total > max_num) ? total - max_num : 0;
1873 /* Combine quantity, lose excess items */
1874 o_ptr->number = (total > max_num) ? max_num : total;
1876 /* Hack -- blend "known" status */
1877 if (object_is_known(j_ptr)) object_known(o_ptr);
1879 /* Hack -- clear "storebought" if only one has it */
1880 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1881 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1883 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1884 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1887 /* Hack -- blend "mental" status */
1888 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1890 /* Hack -- blend "inscriptions" */
1891 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1893 /* Hack -- blend "feelings" */
1894 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1896 /* Hack -- could average discounts */
1897 /* Hack -- save largest discount */
1898 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1900 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1901 if (o_ptr->tval == TV_ROD)
1903 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1904 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1907 /* Hack -- if wands are stacking, combine the charges. -LM- */
1908 if (o_ptr->tval == TV_WAND)
1910 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1916 * @brief tvalとsvalに対応するベースアイテムのIDを返す。
1917 * Find the index of the object_kind with the given tval and sval
1918 * @param tval 検索したいベースアイテムのtval
1919 * @param sval 検索したいベースアイテムのsval
1922 IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval)
1929 for (k = 1; k < max_k_idx; k++)
1931 object_kind *k_ptr = &k_info[k];
1933 /* Require correct tval */
1934 if (k_ptr->tval != tval) continue;
1937 if (k_ptr->sval == sval) return (k);
1939 /* Ignore illegal items */
1940 if (sval != SV_ANY) continue;
1942 /* Apply the randomizer */
1943 if (!one_in_(++num)) continue;
1945 /* Use this value */
1949 /* Return this choice */
1956 msg_format(_("アイテムがない (%d,%d)", "No object (%d,%d)"), tval, sval);
1965 * @brief オブジェクトを初期化する
1966 * Wipe an object clean.
1967 * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
1970 void object_wipe(object_type *o_ptr)
1972 /* Wipe the structure */
1973 (void)WIPE(o_ptr, object_type);
1978 * @brief オブジェクトを複製する
1979 * Wipe an object clean.
1980 * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
1981 * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
1984 void object_copy(object_type *o_ptr, object_type *j_ptr)
1986 /* Copy the structure */
1987 (void)COPY(o_ptr, j_ptr, object_type);
1992 * @brief オブジェクト構造体にベースアイテムを作成する
1993 * Prepare an object based on an object kind.
1994 * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
1995 * @param k_idx 新たに作成したいベースアイテム情報のID
1998 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
2000 object_kind *k_ptr = &k_info[k_idx];
2002 /* Clear the record */
2005 /* Save the kind index */
2006 o_ptr->k_idx = k_idx;
2008 /* Efficiency -- tval/sval */
2009 o_ptr->tval = k_ptr->tval;
2010 o_ptr->sval = k_ptr->sval;
2012 /* Default "pval" */
2013 o_ptr->pval = k_ptr->pval;
2015 /* Default number */
2018 /* Default weight */
2019 o_ptr->weight = k_ptr->weight;
2022 o_ptr->to_h = k_ptr->to_h;
2023 o_ptr->to_d = k_ptr->to_d;
2024 o_ptr->to_a = k_ptr->to_a;
2027 o_ptr->ac = k_ptr->ac;
2028 o_ptr->dd = k_ptr->dd;
2029 o_ptr->ds = k_ptr->ds;
2031 /* Default activation */
2032 if (k_ptr->act_idx > 0) o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
2034 /* Hack -- worthless items are always "broken" */
2035 if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
2037 /* Hack -- cursed items are always "cursed" */
2038 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
2039 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2040 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
2041 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2042 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2043 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2048 * @brief 上質以上のオブジェクトに与えるための各種ボーナスを正規乱数も加えて算出する。
2049 * Help determine an "enchantment bonus" for an object.
2050 * @param max ボーナス値の限度
2051 * @param level ボーナス値に加味する基準生成階
2052 * @return 算出されたボーナス値
2054 * To avoid floating point but still provide a smooth distribution of bonuses,\n
2055 * we simply round the results of division in such a way as to "average" the\n
2056 * correct floating point value.\n
2058 * This function has been changed. It uses "randnor()" to choose values from\n
2059 * a normal distribution, whose mean moves from zero towards the max as the\n
2060 * level increases, and whose standard deviation is equal to 1/4 of the max,\n
2061 * and whose values are forced to lie between zero and the max, inclusive.\n
2063 * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
2064 * rare to get the "full" enchantment on an object, even a deep levels.\n
2066 * It is always possible (albeit unlikely) to get the "full" enchantment.\n
2068 * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
2070 * N 0 1 2 3 4 5 6 7 8 9 10\n
2071 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n
2072 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03\n
2073 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05\n
2074 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05\n
2075 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11\n
2076 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41\n
2077 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65\n
2078 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94\n
2079 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78\n
2080 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64\n
2081 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62\n
2082 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33\n
2083 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38\n
2084 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53\n
2085 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53\n
2086 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27\n
2087 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72\n
2088 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07\n
2090 int m_bonus(int max, DEPTH level)
2092 int bonus, stand, extra, value;
2095 /* Paranoia -- enforce maximal "level" */
2096 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
2099 /* The "bonus" moves towards the max */
2100 bonus = ((max * level) / MAX_DEPTH);
2102 /* Hack -- determine fraction of error */
2103 extra = ((max * level) % MAX_DEPTH);
2105 /* Hack -- simulate floating point computations */
2106 if (randint0(MAX_DEPTH) < extra) bonus++;
2109 /* The "stand" is equal to one quarter of the max */
2112 /* Hack -- determine fraction of error */
2115 /* Hack -- simulate floating point computations */
2116 if (randint0(4) < extra) stand++;
2119 /* Choose an "interesting" value */
2120 value = randnor(bonus, stand);
2122 /* Enforce the minimum value */
2123 if (value < 0) return (0);
2125 /* Enforce the maximum value */
2126 if (value > max) return (max);
2132 * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user
2133 * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ
2136 static void object_mention(object_type *o_ptr)
2138 char o_name[MAX_NLEN];
2140 object_aware(o_ptr);
2141 object_known(o_ptr);
2143 /* Mark the item as fully known */
2144 o_ptr->ident |= (IDENT_MENTAL);
2147 object_desc(o_name, o_ptr, 0);
2148 msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name);
2152 * @brief INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2153 * Mega-Hack -- Attempt to create one of the "Special Objects"
2154 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2155 * @return 生成に成功したらTRUEを返す。
2157 * We are only called from "make_object()", and we assume that\n
2158 * "apply_magic()" is called immediately after we return.\n
2160 * Note -- see "make_artifact()" and "apply_magic()"\n
2162 static bool make_artifact_special(object_type *o_ptr)
2165 KIND_OBJECT_IDX k_idx = 0;
2167 /*! @note 地上ではキャンセルする / No artifacts in the town */
2168 if (!dun_level) return (FALSE);
2170 /*! @note get_obj_num_hookによる指定がある場合は生成をキャンセルする / Themed object */
2171 if (get_obj_num_hook) return (FALSE);
2173 /*! @note 全固定アーティファクト中からIDの若い順に生成対象とその確率を走査する / Check the artifact list (just the "specials") */
2174 for (i = 0; i < max_a_idx; i++)
2176 artifact_type *a_ptr = &a_info[i];
2178 /*! @note アーティファクト名が空の不正なデータは除外する / Skip "empty" artifacts */
2179 if (!a_ptr->name) continue;
2181 /*! @note 既に生成回数がカウントされたアーティファクト、QUESTITEMと非INSTA_ARTは除外 / Cannot make an artifact twice */
2182 if (a_ptr->cur_num) continue;
2183 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2184 if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue;
2186 /*! @note アーティファクト生成階が現在に対して足りない場合は高確率で1/(不足階層*2)を満たさないと生成リストに加えられない /
2187 * XXX XXX Enforce minimum "depth" (loosely) */
2188 if (a_ptr->level > object_level)
2190 /* @note / Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2191 int d = (a_ptr->level - object_level) * 2;
2192 if (!one_in_(d)) continue;
2195 /*! @note 1/(レア度)の確率を満たさないと除外される / Artifact "rarity roll" */
2196 if (!one_in_(a_ptr->rarity)) continue;
2198 /*! @note INSTA_ART型固定アーティファクトのベースアイテムもチェック対象とする。ベースアイテムの生成階層が足りない場合1/(不足階層*5) を満たさないと除外される。 /
2199 * Find the base object. XXX XXX Enforce minimum "object" level (loosely). Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2200 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2201 if (k_info[k_idx].level > object_level)
2203 int d = (k_info[k_idx].level - object_level) * 5;
2204 if (!one_in_(d)) continue;
2207 /*! @note 前述の条件を満たしたら、後のIDのアーティファクトはチェックせずすぐ確定し生成処理に移す /
2208 * Assign the template. Mega-Hack -- mark the item as an artifact. Hack: Some artifacts get random extra powers. Success. */
2209 object_prep(o_ptr, k_idx);
2212 random_artifact_resistance(o_ptr, a_ptr);
2216 /*! @note 全INSTA_ART固定アーティファクトを試行しても決まらなかった場合 FALSEを返す / Failure */
2222 * @brief 非INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2223 * Mega-Hack -- Attempt to create one of the "Special Objects"
2224 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2225 * @return 生成に成功したらTRUEを返す。
2227 * Attempt to change an object into an artifact\n
2228 * This routine should only be called by "apply_magic()"\n
2229 * Note -- see "make_artifact_special()" and "apply_magic()"\n
2231 static bool make_artifact(object_type *o_ptr)
2236 /* No artifacts in the town */
2237 if (!dun_level) return (FALSE);
2239 /* Paranoia -- no "plural" artifacts */
2240 if (o_ptr->number != 1) return (FALSE);
2242 /* Check the artifact list (skip the "specials") */
2243 for (i = 0; i < max_a_idx; i++)
2245 artifact_type *a_ptr = &a_info[i];
2247 /* Skip "empty" items */
2248 if (!a_ptr->name) continue;
2250 /* Cannot make an artifact twice */
2251 if (a_ptr->cur_num) continue;
2253 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2255 if (a_ptr->gen_flags & TRG_INSTA_ART) continue;
2257 /* Must have the correct fields */
2258 if (a_ptr->tval != o_ptr->tval) continue;
2259 if (a_ptr->sval != o_ptr->sval) continue;
2261 /* XXX XXX Enforce minimum "depth" (loosely) */
2262 if (a_ptr->level > dun_level)
2264 /* Acquire the "out-of-depth factor" */
2265 int d = (a_ptr->level - dun_level) * 2;
2267 /* Roll for out-of-depth creation */
2268 if (!one_in_(d)) continue;
2271 /* We must make the "rarity roll" */
2272 if (!one_in_(a_ptr->rarity)) continue;
2274 /* Hack -- mark the item as an artifact */
2277 /* Hack: Some artifacts get random extra powers */
2278 random_artifact_resistance(o_ptr, a_ptr);
2290 * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
2291 * Choose random ego type
2292 * @param slot 取得したいエゴの装備部位
2293 * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
2294 * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
2296 static byte get_random_ego(byte slot, bool good)
2299 ego_item_type *e_ptr;
2303 for (i = 1; i < max_e_idx; i++)
2307 if (e_ptr->slot == slot
2308 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2311 total += (255 / e_ptr->rarity);
2315 value = randint1(total);
2317 for (i = 1; i < max_e_idx; i++)
2321 if (e_ptr->slot == slot
2322 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2325 value -= (255 / e_ptr->rarity);
2326 if (value <= 0L) break;
2334 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2335 * Apply magic to an item known to be a "weapon"
2336 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2337 * @param level 生成基準階
2338 * @param power 生成ランク
2341 * Hack -- note special base damage dice boosting\n
2342 * Hack -- note special processing for weapon/digger\n
2344 static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
2346 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
2347 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
2349 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
2350 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
2352 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2354 tohit2 = (tohit2+1)/2;
2355 todam2 = (todam2+1)/2;
2362 o_ptr->to_h += tohit1;
2363 o_ptr->to_d += todam1;
2369 o_ptr->to_h += tohit2;
2370 o_ptr->to_d += todam2;
2378 o_ptr->to_h -= tohit1;
2379 o_ptr->to_d -= todam1;
2384 /* Penalize again */
2385 o_ptr->to_h -= tohit2;
2386 o_ptr->to_d -= todam2;
2389 /* Cursed (if "bad") */
2390 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2393 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2396 switch (o_ptr->tval)
2403 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2404 create_artifact(o_ptr, FALSE);
2406 /* Special Ego-item */
2407 o_ptr->name2 = EGO_DIGGING;
2411 else if (power < -1)
2413 /* Hack -- Horrible digging bonus */
2414 o_ptr->pval = 0 - (5 + randint1(5));
2420 /* Hack -- Reverse digging bonus */
2421 o_ptr->pval = 0 - (o_ptr->pval);
2435 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2437 create_artifact(o_ptr, FALSE);
2442 /* Roll for an ego-item */
2443 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2444 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2446 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2448 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2453 switch (o_ptr->name2)
2456 if (one_in_(4) && (level > 40))
2457 add_flag(o_ptr->art_flags, TR_BLOWS);
2461 add_flag(o_ptr->art_flags, TR_RES_POIS);
2463 add_flag(o_ptr->art_flags, TR_WARNING);
2465 case EGO_KILL_DRAGON:
2467 add_flag(o_ptr->art_flags, TR_RES_POIS);
2471 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2473 case EGO_SLAYING_WEAPON:
2474 if (one_in_(3)) /* double damage */
2482 while (one_in_(o_ptr->dd));
2488 while (one_in_(o_ptr->ds));
2493 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2495 if (o_ptr->tval == TV_SWORD && one_in_(3))
2497 add_flag(o_ptr->art_flags, TR_VORPAL);
2502 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2508 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
2510 add_flag(o_ptr->art_flags, TR_DEX);
2512 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2515 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
2517 case EGO_EARTHQUAKES:
2518 if (one_in_(3) && (level > 60))
2519 add_flag(o_ptr->art_flags, TR_BLOWS);
2521 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
2525 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2529 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2531 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2533 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2534 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2537 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2538 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2539 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2540 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2544 if (!o_ptr->art_name)
2546 /* Hack -- Super-charge the damage dice */
2547 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2549 /* Hack -- Lower the damage dice */
2550 if (o_ptr->dd > 9) o_ptr->dd = 9;
2555 else if (power < -1)
2557 /* Roll for ego-item */
2558 if (randint0(MAX_DEPTH) < level)
2562 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2563 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2569 switch (o_ptr->name2)
2572 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2573 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2575 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2576 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2577 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2578 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2579 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2580 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2594 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2596 create_artifact(o_ptr, FALSE);
2599 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2613 if (power > 2) /* power > 2 is debug only */
2615 create_artifact(o_ptr, FALSE);
2619 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2621 switch (o_ptr->name2)
2623 case EGO_SLAYING_BOLT:
2628 /* Hack -- super-charge the damage dice */
2629 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2631 /* Hack -- restrict the damage dice */
2632 if (o_ptr->dd > 9) o_ptr->dd = 9;
2636 else if (power < -1)
2638 /* Roll for ego-item */
2639 if (randint0(MAX_DEPTH) < level)
2641 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2651 * @brief ドラゴン装備にランダムな耐性を与える
2652 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2655 static void dragon_resist(object_type * o_ptr)
2660 one_dragon_ele_resistance(o_ptr);
2662 one_high_resistance(o_ptr);
2668 * @brief オブジェクトにランダムな強いESPを与える
2669 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2672 static bool add_esp_strong(object_type *o_ptr)
2674 bool nonliv = FALSE;
2676 switch (randint1(3))
2678 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2679 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2680 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2687 * @brief オブジェクトにランダムな弱いESPを与える
2688 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2689 * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3)
2692 static void add_esp_weak(object_type *o_ptr, bool extra)
2695 u32b weak_esp_list[] = {
2707 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2708 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2710 /* Add unduplicated weak esp flags randomly */
2711 for (i = 0; i < add_count; ++ i)
2713 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2715 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2716 weak_esp_list[choice] = weak_esp_list[i];
2722 * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2723 * Apply magic to an item known to be "armor"
2724 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2725 * @param level 生成基準階
2726 * @param power 生成ランク
2729 * Hack -- note special processing for crown/helm\n
2730 * Hack -- note special processing for robe of permanence\n
2732 static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
2734 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
2735 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
2741 o_ptr->to_a += toac1;
2747 o_ptr->to_a += toac2;
2755 o_ptr->to_a -= toac1;
2760 /* Penalize again */
2761 o_ptr->to_a -= toac2;
2764 /* Cursed (if "bad") */
2765 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2770 switch (o_ptr->tval)
2774 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2775 create_artifact(o_ptr, FALSE);
2785 /* Hack -- Try for "Robes of the Magi" */
2786 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2787 (o_ptr->sval == SV_ROBE) &&
2788 (randint0(100) < 15))
2792 o_ptr->name2 = EGO_YOIYAMI;
2793 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2794 o_ptr->sval = SV_YOIYAMI_ROBE;
2800 o_ptr->name2 = EGO_PERMANENCE;
2805 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2807 create_artifact(o_ptr, FALSE);
2813 bool okay_flag = TRUE;
2815 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2817 switch (o_ptr->name2)
2820 if (o_ptr->tval != TV_HARD_ARMOR)
2826 if (o_ptr->tval != TV_SOFT_ARMOR)
2835 if (okay_flag) break;
2837 switch (o_ptr->name2)
2839 case EGO_RESISTANCE:
2841 add_flag(o_ptr->art_flags, TR_RES_POIS);
2844 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2845 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2849 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2851 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2853 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2854 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2856 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2857 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2858 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2859 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2860 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2861 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2862 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2863 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2866 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2867 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2868 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2869 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2870 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2871 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2884 if (o_ptr->sval == SV_DRAGON_SHIELD)
2886 dragon_resist(o_ptr);
2887 if (!one_in_(3)) break;
2893 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2895 create_artifact(o_ptr, FALSE);
2901 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2902 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
2903 && o_ptr->name2 == EGO_S_DWARVEN)
2910 switch (o_ptr->name2)
2913 if (!one_in_(3)) one_high_resistance(o_ptr);
2914 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2916 case EGO_REFLECTION:
2917 if (o_ptr->sval == SV_MIRROR_SHIELD)
2922 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2923 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2932 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2934 dragon_resist(o_ptr);
2935 if (!one_in_(3)) break;
2939 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2941 create_artifact(o_ptr, FALSE);
2944 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2948 else if (power < -1)
2950 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2958 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2960 dragon_resist(o_ptr);
2961 if (!one_in_(3)) break;
2966 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2968 create_artifact(o_ptr, FALSE);
2971 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
2973 switch (o_ptr->name2)
2975 case EGO_SLOW_DESCENT:
2978 one_high_resistance(o_ptr);
2984 else if (power < -1)
2986 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
2997 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2999 create_artifact(o_ptr, FALSE);
3004 bool ok_flag = TRUE;
3005 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3007 switch (o_ptr->name2)
3010 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
3011 else add_esp_weak(o_ptr, FALSE);
3015 case EGO_REGENERATION:
3016 case EGO_LORDLINESS:
3022 if (one_in_(2)) add_esp_strong(o_ptr);
3023 else add_esp_weak(o_ptr, FALSE);
3026 default:/* not existing crown (wisdom,lite, etc...) */
3030 break; /* while (1) */
3036 else if (power < -1)
3040 bool ok_flag = TRUE;
3041 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3043 switch (o_ptr->name2)
3045 case EGO_ANCIENT_CURSE:
3046 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
3047 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
3048 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3049 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3050 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3051 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3055 break; /* while (1) */
3064 if (o_ptr->sval == SV_DRAGON_HELM)
3066 dragon_resist(o_ptr);
3067 if (!one_in_(3)) break;
3073 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3075 create_artifact(o_ptr, FALSE);
3080 bool ok_flag = TRUE;
3081 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3083 switch (o_ptr->name2)
3085 case EGO_BRILLIANCE:
3087 case EGO_INFRAVISION:
3088 case EGO_H_PROTECTION:
3093 if (one_in_(2)) add_esp_strong(o_ptr);
3094 else add_esp_weak(o_ptr, FALSE);
3098 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
3099 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
3102 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3104 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
3106 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
3107 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3109 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3110 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
3111 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
3112 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3113 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3114 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3115 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3116 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
3118 default:/* not existing helm (Magi, Might, etc...)*/
3122 break; /* while (1) */
3127 else if (power < -1)
3131 bool ok_flag = TRUE;
3132 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3134 switch (o_ptr->name2)
3136 case EGO_ANCIENT_CURSE:
3140 break; /* while (1) */
3151 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3153 create_artifact(o_ptr, FALSE);
3156 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
3158 switch (o_ptr->name2)
3167 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
3168 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
3169 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
3170 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3177 else if (power < -1)
3179 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3190 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
3191 * Apply magic to an item known to be a "ring" or "amulet"
3192 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3193 * @param level 生成基準階
3194 * @param power 生成ランク
3197 * Hack -- note special "pval boost" code for ring of speed\n
3198 * Hack -- note that some items must be cursed (or blessed)\n
3200 static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
3202 /* Apply magic (good or bad) according to type */
3203 switch (o_ptr->tval)
3208 switch (o_ptr->sval)
3210 case SV_RING_ATTACKS:
3213 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
3214 if (one_in_(15)) o_ptr->pval++;
3215 if (o_ptr->pval < 1) o_ptr->pval = 1;
3221 o_ptr->ident |= (IDENT_BROKEN);
3224 o_ptr->curse_flags |= TRC_CURSED;
3227 o_ptr->pval = 0 - (o_ptr->pval);
3238 /* Strength, Constitution, Dexterity, Intelligence */
3244 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3250 o_ptr->ident |= (IDENT_BROKEN);
3253 o_ptr->curse_flags |= TRC_CURSED;
3256 o_ptr->pval = 0 - (o_ptr->pval);
3262 /* Ring of Speed! */
3265 /* Base speed (1 to 10) */
3266 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3268 /* Super-charge the ring */
3269 while (randint0(100) < 50) o_ptr->pval++;
3275 o_ptr->ident |= (IDENT_BROKEN);
3278 o_ptr->curse_flags |= TRC_CURSED;
3281 o_ptr->pval = 0 - (o_ptr->pval);
3289 case SV_RING_LORDLY:
3293 one_lordly_high_resistance(o_ptr);
3297 /* Bonus to armor class */
3298 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3302 case SV_RING_WARNING:
3304 if (one_in_(3)) one_low_esp(o_ptr);
3309 case SV_RING_SEARCHING:
3311 /* Bonus to searching */
3312 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3318 o_ptr->ident |= (IDENT_BROKEN);
3321 o_ptr->curse_flags |= TRC_CURSED;
3324 o_ptr->pval = 0 - (o_ptr->pval);
3330 /* Flames, Acid, Ice */
3331 case SV_RING_FLAMES:
3336 /* Bonus to armor class */
3337 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3341 /* Weakness, Stupidity */
3342 case SV_RING_WEAKNESS:
3343 case SV_RING_STUPIDITY:
3346 o_ptr->ident |= (IDENT_BROKEN);
3349 o_ptr->curse_flags |= TRC_CURSED;
3352 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3353 if (power > 0) power = 0 - power;
3358 /* WOE, Stupidity */
3362 o_ptr->ident |= (IDENT_BROKEN);
3365 o_ptr->curse_flags |= TRC_CURSED;
3368 o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
3369 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3370 if (power > 0) power = 0 - power;
3375 /* Ring of damage */
3376 case SV_RING_DAMAGE:
3378 /* Bonus to damage */
3379 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
3385 o_ptr->ident |= (IDENT_BROKEN);
3388 o_ptr->curse_flags |= TRC_CURSED;
3391 o_ptr->to_d = 0 - o_ptr->to_d;
3397 /* Ring of Accuracy */
3398 case SV_RING_ACCURACY:
3401 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
3407 o_ptr->ident |= (IDENT_BROKEN);
3410 o_ptr->curse_flags |= TRC_CURSED;
3413 o_ptr->to_h = 0 - o_ptr->to_h;
3419 /* Ring of Protection */
3420 case SV_RING_PROTECTION:
3422 /* Bonus to armor class */
3423 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
3429 o_ptr->ident |= (IDENT_BROKEN);
3432 o_ptr->curse_flags |= TRC_CURSED;
3435 o_ptr->to_a = 0 - o_ptr->to_a;
3441 /* Ring of Slaying */
3442 case SV_RING_SLAYING:
3444 /* Bonus to damage and to hit */
3445 o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
3446 o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
3452 o_ptr->ident |= (IDENT_BROKEN);
3455 o_ptr->curse_flags |= TRC_CURSED;
3457 /* Reverse bonuses */
3458 o_ptr->to_h = 0 - o_ptr->to_h;
3459 o_ptr->to_d = 0 - o_ptr->to_d;
3465 case SV_RING_MUSCLE:
3467 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
3468 if (one_in_(4)) o_ptr->pval++;
3474 o_ptr->ident |= (IDENT_BROKEN);
3477 o_ptr->curse_flags |= TRC_CURSED;
3479 /* Reverse bonuses */
3480 o_ptr->pval = 0 - o_ptr->pval;
3485 case SV_RING_AGGRAVATION:
3488 o_ptr->ident |= (IDENT_BROKEN);
3491 o_ptr->curse_flags |= TRC_CURSED;
3493 if (power > 0) power = 0 - power;
3497 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3498 || (power > 2)) /* power > 2 is debug only */
3500 o_ptr->pval = MIN(o_ptr->pval, 4);
3501 /* Randart amulet */
3502 create_artifact(o_ptr, FALSE);
3504 else if ((power == 2) && one_in_(2))
3506 while(!o_ptr->name2)
3508 int tmp = m_bonus(10, level);
3509 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3510 switch(randint1(28))
3513 o_ptr->name2 = EGO_RING_THROW;
3516 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3517 o_ptr->name2 = EGO_RING_REGEN;
3520 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3521 o_ptr->name2 = EGO_RING_LITE;
3524 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3525 o_ptr->name2 = EGO_RING_TELEPORT;
3528 if (o_ptr->to_h) break;
3529 o_ptr->name2 = EGO_RING_TO_H;
3532 if (o_ptr->to_d) break;
3533 o_ptr->name2 = EGO_RING_TO_D;
3536 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3537 o_ptr->name2 = EGO_RING_SLAY;
3540 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3541 o_ptr->name2 = EGO_RING_WIZARD;
3544 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3545 o_ptr->name2 = EGO_RING_HERO;
3548 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3549 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3550 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3551 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3554 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3555 if (!(have_flag(k_ptr->flags, TR_RES_FIRE)) && (have_flag(k_ptr->flags, TR_RES_COLD) || have_flag(k_ptr->flags, TR_RES_ELEC) || have_flag(k_ptr->flags, TR_RES_ACID))) break;
3556 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3557 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3558 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3561 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3562 if (!(have_flag(k_ptr->flags, TR_RES_COLD)) && (have_flag(k_ptr->flags, TR_RES_FIRE) || have_flag(k_ptr->flags, TR_RES_ELEC) || have_flag(k_ptr->flags, TR_RES_ACID))) break;
3563 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3564 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3565 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3568 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3569 if (!(have_flag(k_ptr->flags, TR_RES_ELEC)) && (have_flag(k_ptr->flags, TR_RES_COLD) || have_flag(k_ptr->flags, TR_RES_FIRE) || have_flag(k_ptr->flags, TR_RES_ACID))) break;
3570 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3571 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3574 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3575 if (!(have_flag(k_ptr->flags, TR_RES_ACID)) && (have_flag(k_ptr->flags, TR_RES_COLD) || have_flag(k_ptr->flags, TR_RES_ELEC) || have_flag(k_ptr->flags, TR_RES_FIRE))) break;
3576 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3577 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3579 case 21: case 22: case 23: case 24: case 25: case 26:
3580 switch (o_ptr->sval)
3583 if (!one_in_(3)) break;
3584 o_ptr->name2 = EGO_RING_D_SPEED;
3586 case SV_RING_DAMAGE:
3587 case SV_RING_ACCURACY:
3588 case SV_RING_SLAYING:
3589 if (one_in_(2)) break;
3590 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3593 o_ptr->name2 = EGO_RING_BERSERKER;
3594 o_ptr->to_h -= 2+randint1(4);
3595 o_ptr->to_d += 2+randint1(4);
3598 case SV_RING_PROTECTION:
3599 o_ptr->name2 = EGO_RING_SUPER_AC;
3600 o_ptr->to_a += 7 + m_bonus(5, level);
3602 case SV_RING_RES_FEAR:
3603 o_ptr->name2 = EGO_RING_HERO;
3606 if (one_in_(2)) break;
3607 o_ptr->name2 = EGO_RING_HUNTER;
3609 case SV_RING_SEARCHING:
3610 o_ptr->name2 = EGO_RING_STEALTH;
3612 case SV_RING_TELEPORTATION:
3613 o_ptr->name2 = EGO_RING_TELE_AWAY;
3615 case SV_RING_RES_BLINDNESS:
3617 o_ptr->name2 = EGO_RING_RES_LITE;
3619 o_ptr->name2 = EGO_RING_RES_DARK;
3621 case SV_RING_LORDLY:
3622 if (!one_in_(20)) break;
3623 one_lordly_high_resistance(o_ptr);
3624 one_lordly_high_resistance(o_ptr);
3625 o_ptr->name2 = EGO_RING_TRUE;
3627 case SV_RING_SUSTAIN:
3628 if (!one_in_(4)) break;
3629 o_ptr->name2 = EGO_RING_RES_TIME;
3631 case SV_RING_FLAMES:
3632 if (!one_in_(2)) break;
3633 o_ptr->name2 = EGO_RING_DRAGON_F;
3636 if (!one_in_(2)) break;
3637 o_ptr->name2 = EGO_RING_DRAGON_C;
3639 case SV_RING_WARNING:
3640 if (!one_in_(2)) break;
3641 o_ptr->name2 = EGO_RING_M_DETECT;
3650 o_ptr->curse_flags = 0L;
3652 else if ((power == -2) && one_in_(2))
3654 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3655 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3656 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3657 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3658 o_ptr->art_flags[0] = 0;
3659 o_ptr->art_flags[1] = 0;
3660 while(!o_ptr->name2)
3662 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3666 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3667 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3670 o_ptr->name2 = EGO_RING_NO_MELEE;
3673 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3674 o_ptr->name2 = EGO_RING_AGGRAVATE;
3677 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3678 o_ptr->name2 = EGO_RING_TY_CURSE;
3681 o_ptr->name2 = EGO_RING_ALBINO;
3686 o_ptr->ident |= (IDENT_BROKEN);
3689 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3697 switch (o_ptr->sval)
3699 /* Amulet of wisdom/charisma */
3700 case SV_AMULET_INTELLIGENCE:
3701 case SV_AMULET_WISDOM:
3702 case SV_AMULET_CHARISMA:
3704 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3710 o_ptr->ident |= (IDENT_BROKEN);
3713 o_ptr->curse_flags |= (TRC_CURSED);
3715 /* Reverse bonuses */
3716 o_ptr->pval = 0 - o_ptr->pval;
3722 /* Amulet of brilliance */
3723 case SV_AMULET_BRILLIANCE:
3725 o_ptr->pval = 1 + m_bonus(3, level);
3726 if (one_in_(4)) o_ptr->pval++;
3732 o_ptr->ident |= (IDENT_BROKEN);
3735 o_ptr->curse_flags |= (TRC_CURSED);
3737 /* Reverse bonuses */
3738 o_ptr->pval = 0 - o_ptr->pval;
3744 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3748 o_ptr->curse_flags |= (TRC_CURSED);
3753 case SV_AMULET_RESISTANCE:
3755 if (one_in_(5)) one_high_resistance(o_ptr);
3756 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3760 /* Amulet of searching */
3761 case SV_AMULET_SEARCHING:
3763 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
3769 o_ptr->ident |= (IDENT_BROKEN);
3772 o_ptr->curse_flags |= (TRC_CURSED);
3774 /* Reverse bonuses */
3775 o_ptr->pval = 0 - (o_ptr->pval);
3781 /* Amulet of the Magi -- never cursed */
3782 case SV_AMULET_THE_MAGI:
3784 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3785 o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
3787 /* gain one low ESP */
3788 add_esp_weak(o_ptr, FALSE);
3793 /* Amulet of Doom -- always cursed */
3794 case SV_AMULET_DOOM:
3797 o_ptr->ident |= (IDENT_BROKEN);
3800 o_ptr->curse_flags |= (TRC_CURSED);
3803 o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
3804 o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
3805 if (power > 0) power = 0 - power;
3810 case SV_AMULET_MAGIC_MASTERY:
3812 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
3818 o_ptr->ident |= (IDENT_BROKEN);
3821 o_ptr->curse_flags |= (TRC_CURSED);
3823 /* Reverse bonuses */
3824 o_ptr->pval = 0 - o_ptr->pval;
3830 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3831 || (power > 2)) /* power > 2 is debug only */
3833 o_ptr->pval = MIN(o_ptr->pval, 4);
3834 /* Randart amulet */
3835 create_artifact(o_ptr, FALSE);
3837 else if ((power == 2) && one_in_(2))
3839 while(!o_ptr->name2)
3841 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3842 switch(randint1(21))
3845 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3846 o_ptr->name2 = EGO_AMU_SLOW_D;
3849 if (o_ptr->pval) break;
3850 o_ptr->name2 = EGO_AMU_INFRA;
3853 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3854 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3857 if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
3858 o_ptr->name2 = EGO_AMU_HOLD_EXP;
3861 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3862 o_ptr->name2 = EGO_AMU_LEVITATION;
3864 case 10: case 11: case 21:
3865 o_ptr->name2 = EGO_AMU_AC;
3868 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3869 if (m_bonus(10, level) > 8)
3870 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3872 o_ptr->name2 = EGO_AMU_RES_FIRE;
3875 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3876 if (m_bonus(10, level) > 8)
3877 o_ptr->name2 = EGO_AMU_RES_COLD_;
3879 o_ptr->name2 = EGO_AMU_RES_COLD;
3882 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3883 if (m_bonus(10, level) > 8)
3884 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3886 o_ptr->name2 = EGO_AMU_RES_ELEC;
3889 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3890 if (m_bonus(10, level) > 8)
3891 o_ptr->name2 = EGO_AMU_RES_ACID_;
3893 o_ptr->name2 = EGO_AMU_RES_ACID;
3895 case 16: case 17: case 18: case 19: case 20:
3896 switch (o_ptr->sval)
3898 case SV_AMULET_TELEPORT:
3899 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3900 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3901 else o_ptr->name2 = EGO_AMU_TELEPORT;
3903 case SV_AMULET_RESIST_ACID:
3904 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3906 case SV_AMULET_SEARCHING:
3907 o_ptr->name2 = EGO_AMU_STEALTH;
3909 case SV_AMULET_BRILLIANCE:
3910 if (!one_in_(3)) break;
3911 o_ptr->name2 = EGO_AMU_IDENT;
3913 case SV_AMULET_CHARISMA:
3914 if (!one_in_(3)) break;
3915 o_ptr->name2 = EGO_AMU_CHARM;
3917 case SV_AMULET_THE_MAGI:
3918 if (one_in_(2)) break;
3919 o_ptr->name2 = EGO_AMU_GREAT;
3921 case SV_AMULET_RESISTANCE:
3922 if (!one_in_(5)) break;
3923 o_ptr->name2 = EGO_AMU_DEFENDER;
3925 case SV_AMULET_TELEPATHY:
3926 if (!one_in_(3)) break;
3927 o_ptr->name2 = EGO_AMU_DETECTION;
3933 o_ptr->curse_flags = 0L;
3935 else if ((power == -2) && one_in_(2))
3937 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3938 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3939 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3940 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3941 o_ptr->art_flags[0] = 0;
3942 o_ptr->art_flags[1] = 0;
3943 while(!o_ptr->name2)
3945 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3949 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3950 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3953 o_ptr->name2 = EGO_AMU_FOOL;
3956 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3957 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3960 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3961 o_ptr->name2 = EGO_AMU_TY_CURSE;
3964 o_ptr->name2 = EGO_AMU_NAIVETY;
3969 o_ptr->ident |= (IDENT_BROKEN);
3972 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3980 * @brief モンスターが人形のベースにできるかを返す
3981 * @param r_idx チェックしたいモンスター種族のID
3982 * @return 人形にできるならTRUEを返す
3984 static bool item_monster_okay(MONRACE_IDX r_idx)
3986 monster_race *r_ptr = &r_info[r_idx];
3989 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
3990 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
3991 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
3992 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
3993 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
3994 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
4001 * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
4002 * Apply magic to an item known to be "boring"
4003 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4004 * @param level 生成基準階
4005 * @param power 生成ランク
4008 * Hack -- note the special code for various items
4010 static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
4012 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4017 /* Apply magic (good or bad) according to type */
4018 switch (o_ptr->tval)
4027 o_ptr->ident |= (IDENT_BROKEN);
4030 o_ptr->curse_flags |= (TRC_CURSED);
4037 o_ptr->xtra4 = o_ptr->pval;
4043 /* Hack -- Torches -- random fuel */
4044 if (o_ptr->sval == SV_LITE_TORCH)
4046 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4050 /* Hack -- Lanterns -- random fuel */
4051 if (o_ptr->sval == SV_LITE_LANTERN)
4053 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4057 if (power > 2) /* power > 2 is debug only */
4059 create_artifact(o_ptr, FALSE);
4061 else if ((power == 2) || ((power == 1) && one_in_(3)))
4063 while (!o_ptr->name2)
4067 bool okay_flag = TRUE;
4069 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
4071 switch (o_ptr->name2)
4074 if (o_ptr->sval == SV_LITE_FEANOR)
4082 else if (power == -2)
4084 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
4086 switch (o_ptr->name2)
4088 case EGO_LITE_DARKNESS:
4091 if (o_ptr->sval == SV_LITE_TORCH)
4093 add_flag(o_ptr->art_flags, TR_LITE_M1);
4095 else if (o_ptr->sval == SV_LITE_LANTERN)
4097 add_flag(o_ptr->art_flags, TR_LITE_M2);
4099 else if (o_ptr->sval == SV_LITE_FEANOR)
4101 add_flag(o_ptr->art_flags, TR_LITE_M3);
4113 /* The wand or staff gets a number of initial charges equal
4114 * to between 1/2 (+1) and the full object kind's pval. -LM-
4116 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
4122 /* Transfer the pval. -LM- */
4123 o_ptr->pval = k_ptr->pval;
4130 object_aware(o_ptr);
4131 object_known(o_ptr);
4137 PARAMETER_VALUE i = 1;
4140 monster_race *r_ptr;
4142 /* Pick a random non-unique monster race */
4145 i = randint1(max_r_idx - 1);
4147 if (!item_monster_okay(i)) continue;
4148 if (i == MON_TSUCHINOKO) continue;
4152 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4154 /* Ignore dead monsters */
4155 if (!r_ptr->rarity) continue;
4157 /* Ignore uncommon monsters */
4158 if (r_ptr->rarity > 100) continue;
4160 /* Prefer less out-of-depth monsters */
4161 if (randint0(check)) continue;
4168 /* Some figurines are cursed */
4169 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
4176 PARAMETER_VALUE i = 1;
4181 monster_race *r_ptr;
4183 if (o_ptr->sval == SV_SKELETON)
4185 match = RF9_DROP_SKELETON;
4187 else if (o_ptr->sval == SV_CORPSE)
4189 match = RF9_DROP_CORPSE;
4192 /* Hack -- Remove the monster restriction */
4193 get_mon_num_prep(item_monster_okay, NULL);
4195 /* Pick a random non-unique monster race */
4198 i = get_mon_num(dun_level);
4202 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4204 /* Ignore dead monsters */
4205 if (!r_ptr->rarity) continue;
4207 /* Ignore corpseless monsters */
4208 if (!(r_ptr->flags9 & match)) continue;
4210 /* Prefer less out-of-depth monsters */
4211 if (randint0(check)) continue;
4219 object_aware(o_ptr);
4220 object_known(o_ptr);
4226 PARAMETER_VALUE i = 1;
4228 monster_race *r_ptr;
4230 /* Pick a random monster race */
4233 i = randint1(max_r_idx - 1);
4237 /* Ignore dead monsters */
4238 if (!r_ptr->rarity) continue;
4247 msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
4249 object_aware(o_ptr);
4250 object_known(o_ptr);
4257 DEPTH obj_level = k_info[o_ptr->k_idx].level;
4259 /* Hack -- skip ruined chests */
4260 if (obj_level <= 0) break;
4262 /* Hack -- pick a "difficulty" */
4263 o_ptr->pval = randint1(obj_level);
4264 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4266 o_ptr->xtra3 = dun_level + 5;
4268 /* Never exceed "difficulty" of 55 to 59 */
4269 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4277 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
4278 * Complete the "creation" of an object by applying "magic" to the item
4279 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4281 * @param mode 生成オプション
4284 * This includes not only rolling for random bonuses, but also putting the\n
4285 * finishing touches on ego-items and artifacts, giving charges to wands and\n
4286 * staffs, giving fuel to lites, and placing traps on chests.\n
4288 * In particular, note that "Instant Artifacts", if "created" by an external\n
4289 * routine, must pass through this function to complete the actual creation.\n
4291 * The base "chance" of the item being "good" increases with the "level"\n
4292 * parameter, which is usually derived from the dungeon level, being equal\n
4293 * to the level plus 10, up to a maximum of 75. If "good" is true, then\n
4294 * the object is guaranteed to be "good". If an object is "good", then\n
4295 * the chance that the object will be "great" (ego-item or artifact), also\n
4296 * increases with the "level", being equal to half the level, plus 5, up to\n
4297 * a maximum of 20. If "great" is true, then the object is guaranteed to be\n
4298 * "great". At dungeon level 65 and below, 15/100 objects are "great".\n
4300 * If the object is not "good", there is a chance it will be "cursed", and\n
4301 * if it is "cursed", there is a chance it will be "broken". These chances\n
4302 * are related to the "good" / "great" chances above.\n
4304 * Otherwise "normal" rings and amulets will be "good" half the time and\n
4305 * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4307 * If "okay" is true, and the object is going to be "great", then there is\n
4308 * a chance that an artifact will be created. This is true even if both the\n
4309 * "good" and "great" arguments are false. As a total hack, if "great" is\n
4310 * true, then the item gets 3 extra "attempts" to become an artifact.\n
4312 void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
4314 int i, rolls, f1, f2, power;
4316 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4318 /* Maximum "level" for various things */
4319 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4321 /* Base chance of being "good" */
4324 /* Maximal chance of being "good" */
4325 if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4327 /* Base chance of being "great" */
4330 /* Maximal chance of being "great" */
4331 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4332 f2 = d_info[dungeon_type].obj_great;
4334 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4339 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4348 /* Roll for "good" */
4349 if ((mode & AM_GOOD) || magik(f1))
4354 /* Roll for "great" */
4355 if ((mode & AM_GREAT) || magik(f2))
4359 /* Roll for "special" */
4360 if (mode & AM_SPECIAL) power = 3;
4364 /* Roll for "cursed" */
4367 /* Assume "cursed" */
4370 /* Roll for "broken" */
4371 if (magik(f2)) power = -2;
4375 if (mode & AM_CURSED)
4377 /* Assume 'cursed' */
4382 /* Everything else gets more badly cursed */
4389 /* Assume no rolls */
4392 /* Get one roll if excellent */
4393 if (power >= 2) rolls = 1;
4395 /* Hack -- Get four rolls if forced great or special */
4396 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4398 /* Hack -- Get no rolls if not allowed */
4399 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4401 /* Roll for artifacts if allowed */
4402 for (i = 0; i < rolls; i++)
4404 /* Roll for an artifact */
4405 if (make_artifact(o_ptr)) break;
4406 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4408 if (make_artifact(o_ptr)) break;
4413 /* Hack -- analyze artifacts */
4414 if (object_is_fixed_artifact(o_ptr))
4416 artifact_type *a_ptr = &a_info[o_ptr->name1];
4418 /* Hack -- Mark the artifact as "created" */
4421 /* Hack -- Memorize location of artifact in saved floors */
4422 if (character_dungeon)
4423 a_ptr->floor_id = p_ptr->floor_id;
4425 /* Extract the other fields */
4426 o_ptr->pval = a_ptr->pval;
4427 o_ptr->ac = a_ptr->ac;
4428 o_ptr->dd = a_ptr->dd;
4429 o_ptr->ds = a_ptr->ds;
4430 o_ptr->to_a = a_ptr->to_a;
4431 o_ptr->to_h = a_ptr->to_h;
4432 o_ptr->to_d = a_ptr->to_d;
4433 o_ptr->weight = a_ptr->weight;
4434 o_ptr->xtra2 = a_ptr->act_idx;
4436 if (o_ptr->name1 == ART_MILIM)
4438 if(p_ptr->pseikaku == SEIKAKU_SEXY)
4444 /* Hack -- extract the "broken" flag */
4445 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4447 /* Hack -- extract the "cursed" flag */
4448 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4449 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4450 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4451 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4452 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4453 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4460 switch (o_ptr->tval)
4469 if (power) a_m_aux_1(o_ptr, lev, power);
4475 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4481 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4495 /* Elven Cloak and Black Clothes ... */
4496 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4497 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4498 o_ptr->pval = randint1(4);
4502 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4503 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4504 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4505 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4506 a_m_aux_2(o_ptr, lev, power);
4508 if (power) a_m_aux_2(o_ptr, lev, power);
4516 if (!power && (randint0(100) < 50)) power = -1;
4517 a_m_aux_3(o_ptr, lev, power);
4523 a_m_aux_4(o_ptr, lev, power);
4528 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4529 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4530 (p_ptr->pseikaku == SEIKAKU_SEXY))
4533 add_flag(o_ptr->art_flags, TR_STR);
4534 add_flag(o_ptr->art_flags, TR_INT);
4535 add_flag(o_ptr->art_flags, TR_WIS);
4536 add_flag(o_ptr->art_flags, TR_DEX);
4537 add_flag(o_ptr->art_flags, TR_CON);
4538 add_flag(o_ptr->art_flags, TR_CHR);
4541 /* Hack -- analyze ego-items */
4542 if (object_is_ego(o_ptr))
4544 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4546 /* Hack -- acquire "broken" flag */
4547 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4549 /* Hack -- acquire "cursed" flag */
4550 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4551 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4552 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4553 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4554 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4555 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4557 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4558 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4559 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4560 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4561 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4562 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4563 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4564 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4570 while (one_in_(o_ptr->dd));
4572 if (o_ptr->dd > 9) o_ptr->dd = 9;
4575 /* Hack -- apply activatin index if needed */
4576 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
4578 /* Hack -- apply extra penalties if needed */
4579 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4581 /* Hack -- obtain bonuses */
4582 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4583 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4584 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4586 /* Hack -- obtain pval */
4587 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4590 /* Hack -- apply extra bonuses if needed */
4593 /* Hack -- obtain bonuses */
4594 if (e_ptr->max_to_h)
4596 if (e_ptr->max_to_h > 127)
4597 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4598 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4600 if (e_ptr->max_to_d)
4602 if (e_ptr->max_to_d > 127)
4603 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4604 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4606 if (e_ptr->max_to_a)
4608 if (e_ptr->max_to_a > 127)
4609 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4610 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4613 /* Accuracy ego must have high to_h */
4614 if(o_ptr->name2 == EGO_ACCURACY)
4616 while(o_ptr->to_h < o_ptr->to_d + 10)
4621 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4624 /* Accuracy ego must have high to_h */
4625 if(o_ptr->name2 == EGO_VELOCITY)
4627 while(o_ptr->to_d < o_ptr->to_h + 10)
4632 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4635 /* Protection ego must have high to_a */
4636 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4638 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4641 /* Hack -- obtain pval */
4642 if (e_ptr->max_pval)
4644 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4647 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4649 else if (o_ptr->name2 == EGO_DEMON)
4651 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4653 o_ptr->pval += randint1(2);
4657 o_ptr->pval += randint1(e_ptr->max_pval);
4660 else if (o_ptr->name2 == EGO_ATTACKS)
4662 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4663 if (o_ptr->pval > 3) o_ptr->pval = 3;
4664 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4665 o_ptr->pval += randint1(2);
4667 else if (o_ptr->name2 == EGO_BAT)
4669 o_ptr->pval = randint1(e_ptr->max_pval);
4670 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4672 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4674 o_ptr->pval = randint1(e_ptr->max_pval);
4678 o_ptr->pval += randint1(e_ptr->max_pval);
4683 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4685 o_ptr->pval = randint1(o_ptr->pval);
4687 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4694 /* Examine real objects */
4697 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4699 /* Hack -- acquire "broken" flag */
4700 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4702 /* Hack -- acquire "cursed" flag */
4703 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4704 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4705 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4706 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4707 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4708 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4716 * @brief ベースアイテムが上質として扱われるかどうかを返す。
4717 * Hack -- determine if a template is "good"
4718 * @param k_idx 判定したいベースアイテムのID
4719 * @return ベースアイテムが上質ならばTRUEを返す。
4721 static bool kind_is_good(KIND_OBJECT_IDX k_idx)
4723 object_kind *k_ptr = &k_info[k_idx];
4725 /* Analyze the item type */
4726 switch (k_ptr->tval)
4728 /* Armor -- Good unless damaged */
4739 if (k_ptr->to_a < 0) return (FALSE);
4743 /* Weapons -- Good unless damaged */
4750 if (k_ptr->to_h < 0) return (FALSE);
4751 if (k_ptr->to_d < 0) return (FALSE);
4755 /* Ammo -- Arrows/Bolts are good */
4762 /* Books -- High level books are good (except Arcane books) */
4764 case TV_SORCERY_BOOK:
4765 case TV_NATURE_BOOK:
4770 case TV_DAEMON_BOOK:
4771 case TV_CRUSADE_BOOK:
4773 case TV_HISSATSU_BOOK:
4776 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4780 /* Rings -- Rings of Speed are good */
4783 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4784 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4788 /* Amulets -- Amulets of the Magi and Resistance are good */
4791 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4792 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4797 /* Assume not good */
4802 * @brief 生成階に応じたベースアイテムの生成を行う。
4803 * Attempt to make an object (normal or good/great)
4804 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4805 * @param mode オプションフラグ
4806 * @return 生成に成功したらTRUEを返す。
4808 * This routine plays nasty games to generate the "special artifacts".\n
4809 * This routine uses "object_level" for the "generation level".\n
4810 * We assume that the given object has been "wiped".\n
4812 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
4818 /* Chance of "special object" */
4819 prob = ((mode & AM_GOOD) ? 10 : 1000);
4821 /* Base level for the object */
4822 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4825 /* Generate a special object, or a normal object */
4826 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4828 KIND_OBJECT_IDX k_idx;
4831 if ((mode & AM_GOOD) && !get_obj_num_hook)
4833 /* Activate restriction (if already specified, use that) */
4834 get_obj_num_hook = kind_is_good;
4837 /* Restricted objects - prepare allocation table */
4838 if (get_obj_num_hook) get_obj_num_prep();
4840 /* Pick a random object */
4841 k_idx = get_obj_num(base);
4843 /* Restricted objects */
4844 if (get_obj_num_hook)
4846 /* Clear restriction */
4847 get_obj_num_hook = NULL;
4849 /* Reset allocation table to default */
4853 /* Handle failure */
4854 if (!k_idx) return (FALSE);
4856 /* Prepare the object */
4857 object_prep(j_ptr, k_idx);
4860 /* Apply magic (allow artifacts) */
4861 apply_magic(j_ptr, object_level, mode);
4863 /* Hack -- generate multiple spikes/missiles */
4864 switch (j_ptr->tval)
4872 j_ptr->number = (byte)damroll(6, 7);
4876 if (cheat_peek) object_mention(j_ptr);
4884 * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
4885 * Attempt to place an object (normal or good/great) at the given location.
4886 * @param y 配置したいフロアのY座標
4887 * @param x 配置したいフロアのX座標
4888 * @param mode オプションフラグ
4889 * @return 生成に成功したらTRUEを返す。
4891 * This routine plays nasty games to generate the "special artifacts".\n
4892 * This routine uses "object_level" for the "generation level".\n
4893 * This routine requires a clean floor grid destination.\n
4895 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
4900 cave_type *c_ptr = &cave[y][x];
4906 /* Paranoia -- check bounds */
4907 if (!in_bounds(y, x)) return;
4909 /* Require floor space */
4910 if (!cave_drop_bold(y, x)) return;
4912 /* Avoid stacking on other objects */
4913 if (c_ptr->o_idx) return;
4916 /* Get local object */
4920 /* Make an object (if possible) */
4921 if (!make_object(q_ptr, mode)) return;
4924 /* Make an object */
4932 /* Acquire object */
4933 o_ptr = &o_list[o_idx];
4935 /* Structure Copy */
4936 object_copy(o_ptr, q_ptr);
4942 o_ptr->next_o_idx = c_ptr->o_idx;
4944 /* Place the object */
4945 c_ptr->o_idx = o_idx;
4953 /* Hack -- Preserve artifacts */
4954 if (object_is_fixed_artifact(q_ptr))
4956 a_info[q_ptr->name1].cur_num = 0;
4963 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
4964 * Make a treasure object
4965 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4966 * @return 生成に成功したらTRUEを返す。
4968 * The location must be a legal, clean, floor grid.
4970 bool make_gold(object_type *j_ptr)
4975 /* Hack -- Pick a Treasure variety */
4976 i = ((randint1(object_level + 2) + 2) / 2) - 1;
4978 /* Apply "extra" magic */
4979 if (one_in_(GREAT_OBJ))
4981 i += randint1(object_level + 1);
4984 /* Hack -- Creeping Coins only generate "themselves" */
4985 if (coin_type) i = coin_type;
4987 /* Do not create "illegal" Treasure Types */
4988 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
4990 /* Prepare a gold object */
4991 object_prep(j_ptr, OBJ_GOLD_LIST + i);
4993 /* Hack -- Base coin cost */
4994 base = k_info[OBJ_GOLD_LIST + i].cost;
4996 /* Determine how much the treasure is "worth" */
4997 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
5005 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
5006 * Places a treasure (Gold or Gems) at given location
5007 * @param y 配置したいフロアのY座標
5008 * @param x 配置したいフロアのX座標
5009 * @return 生成に成功したらTRUEを返す。
5011 * The location must be a legal, clean, floor grid.
5013 void place_gold(POSITION y, POSITION x)
5018 cave_type *c_ptr = &cave[y][x];
5024 /* Paranoia -- check bounds */
5025 if (!in_bounds(y, x)) return;
5027 /* Require floor space */
5028 if (!cave_drop_bold(y, x)) return;
5030 /* Avoid stacking on other objects */
5031 if (c_ptr->o_idx) return;
5034 /* Get local object */
5038 /* Make some gold */
5039 if (!make_gold(q_ptr)) return;
5041 /* Make an object */
5049 /* Acquire object */
5050 o_ptr = &o_list[o_idx];
5052 /* Copy the object */
5053 object_copy(o_ptr, q_ptr);
5060 o_ptr->next_o_idx = c_ptr->o_idx;
5062 /* Place the object */
5063 c_ptr->o_idx = o_idx;
5073 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
5074 * Let an object fall to the ground at or near a location.
5075 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
5076 * @param chance ドロップの成功率(%)
5077 * @param y 配置したいフロアのY座標
5078 * @param x 配置したいフロアのX座標
5079 * @return 生成に成功したらオブジェクトのIDを返す。
5081 * The initial location is assumed to be "in_bounds()".\n
5083 * This function takes a parameter "chance". This is the percentage\n
5084 * chance that the item will "disappear" instead of drop. If the object\n
5085 * has been thrown, then this is the chance of disappearance on contact.\n
5087 * Hack -- this function uses "chance" to determine if it should produce\n
5088 * some form of "description" of the drop event (under the player).\n
5090 * We check several locations to see if we can find a location at which\n
5091 * the object can combine, stack, or be placed. Artifacts will try very\n
5092 * hard to be placed, including "teleporting" to a useful grid if needed.\n
5094 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
5101 POSITION ty, tx = 0;
5103 OBJECT_IDX o_idx = 0;
5104 OBJECT_IDX this_o_idx, next_o_idx = 0;
5108 char o_name[MAX_NLEN];
5114 /* Extract plural */
5115 bool plural = (j_ptr->number != 1);
5118 /* Describe object */
5119 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5122 /* Handle normal "breakage" */
5123 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
5126 msg_format("%sは消えた。", o_name);
5128 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5131 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
5148 /* Scan local grids */
5149 for (dy = -3; dy <= 3; dy++)
5151 /* Scan local grids */
5152 for (dx = -3; dx <= 3; dx++)
5156 /* Calculate actual distance */
5157 d = (dy * dy) + (dx * dx);
5159 /* Ignore distant grids */
5160 if (d > 10) continue;
5165 /* Skip illegal grids */
5166 if (!in_bounds(ty, tx)) continue;
5168 /* Require line of projection */
5169 if (!projectable(y, x, ty, tx)) continue;
5172 c_ptr = &cave[ty][tx];
5174 /* Require floor space */
5175 if (!cave_drop_bold(ty, tx)) continue;
5180 /* Scan objects in that grid */
5181 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5185 /* Acquire object */
5186 o_ptr = &o_list[this_o_idx];
5188 /* Acquire next object */
5189 next_o_idx = o_ptr->next_o_idx;
5191 /* Check for possible combination */
5192 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5198 /* Add new object */
5202 if (k > 99) continue;
5204 /* Calculate score */
5205 s = 1000 - (d + k * 5);
5207 /* Skip bad values */
5208 if (s < bs) continue;
5210 /* New best value */
5213 /* Apply the randomizer to equivalent values */
5214 if ((++bn >= 2) && !one_in_(bn)) continue;
5228 /* Handle lack of space */
5229 if (!flag && !object_is_artifact(j_ptr))
5232 msg_format("%sは消えた。", o_name);
5234 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5239 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5247 for (i = 0; !flag && (i < 1000); i++)
5250 ty = rand_spread(by, 1);
5251 tx = rand_spread(bx, 1);
5253 /* Verify location */
5254 if (!in_bounds(ty, tx)) continue;
5256 /* Bounce to that location */
5260 /* Require floor space */
5261 if (!cave_drop_bold(by, bx)) continue;
5269 int candidates = 0, pick;
5271 for (ty = 1; ty < cur_hgt - 1; ty++)
5273 for (tx = 1; tx < cur_wid - 1; tx++)
5275 /* A valid space found */
5276 if (cave_drop_bold(ty, tx)) candidates++;
5280 /* No valid place! */
5284 msg_format("%sは消えた。", o_name);
5286 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5290 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5292 /* Mega-Hack -- preserve artifacts */
5295 /* Hack -- Preserve unknown artifacts */
5296 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5298 /* Mega-Hack -- Preserve the artifact */
5299 a_info[j_ptr->name1].cur_num = 0;
5307 /* Choose a random one */
5308 pick = randint1(candidates);
5310 for (ty = 1; ty < cur_hgt - 1; ty++)
5312 for (tx = 1; tx < cur_wid - 1; tx++)
5314 if (cave_drop_bold(ty, tx))
5318 /* Is this a picked one? */
5332 c_ptr = &cave[by][bx];
5334 /* Scan objects in that grid for combination */
5335 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5339 /* Acquire object */
5340 o_ptr = &o_list[this_o_idx];
5342 /* Acquire next object */
5343 next_o_idx = o_ptr->next_o_idx;
5345 /* Check for combination */
5346 if (object_similar(o_ptr, j_ptr))
5348 /* Combine the items */
5349 object_absorb(o_ptr, j_ptr);
5358 /* Get new object */
5359 if (!done) o_idx = o_pop();
5362 if (!done && !o_idx)
5365 msg_format("%sは消えた。", o_name);
5367 msg_format("The %s disappear%s.",
5368 o_name, (plural ? "" : "s"));
5373 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5375 /* Hack -- Preserve artifacts */
5376 if (object_is_fixed_artifact(j_ptr))
5378 a_info[j_ptr->name1].cur_num = 0;
5388 /* Structure copy */
5389 object_copy(&o_list[o_idx], j_ptr);
5391 /* Access new object */
5392 j_ptr = &o_list[o_idx];
5399 j_ptr->held_m_idx = 0;
5402 j_ptr->next_o_idx = c_ptr->o_idx;
5404 /* Place the object */
5405 c_ptr->o_idx = o_idx;
5419 /* Mega-Hack -- no message if "dropped" by player */
5420 /* Message when an object falls under the player */
5421 if (chance && player_bold(by, bx))
5423 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5432 * Scatter some "great" objects near the player
5433 * @param y1 配置したいフロアのY座標
5434 * @param x1 配置したいフロアのX座標
5435 * @param num 獲得の処理回数
5436 * @param great TRUEならば必ず高級品以上を落とす
5437 * @param special TRUEならば必ず特別品を落とす
5438 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5441 void acquirement(POSITION y1, POSITION x1, int num, bool great, bool special, bool known)
5444 object_type object_type_body;
5445 BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ;
5450 /* Get local object */
5451 i_ptr = &object_type_body;
5454 /* Make a good (or great) object (if possible) */
5455 if (!make_object(i_ptr, mode)) continue;
5459 object_aware(i_ptr);
5460 object_known(i_ptr);
5463 /* Drop the object */
5464 (void)drop_near(i_ptr, -1, y1, x1);
5469 * Scatter some "amusing" objects near the player
5472 #define AMS_NOTHING 0x00 /* No restriction */
5473 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
5474 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
5475 #define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */
5476 #define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */
5480 OBJECT_TYPE_VALUE tval;
5481 OBJECT_SUBTYPE_VALUE sval;
5486 amuse_type amuse_info[] =
5488 { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
5489 { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
5490 { TV_SPIKE, SV_ANY, 10, AMS_PILE },
5491 { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
5492 { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
5493 { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
5494 { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
5495 { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
5496 { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
5497 { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
5498 { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
5499 { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
5500 { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
5507 * @param y1 配置したいフロアのY座標
5508 * @param x1 配置したいフロアのX座標
5509 * @param num 誰得の処理回数
5510 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5513 void amusement(POSITION y1, POSITION x1, int num, bool known)
5516 object_type object_type_body;
5519 for (n = 0; amuse_info[n].tval != 0; n++)
5521 t += amuse_info[n].prob;
5528 KIND_OBJECT_IDX k_idx;
5529 ARTIFACT_IDX a_idx = 0;
5530 int r = randint0(t);
5531 bool insta_art, fixed_art;
5535 r -= amuse_info[i].prob;
5539 /* Get local object */
5540 i_ptr = &object_type_body;
5542 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
5544 /* Paranoia - reroll if nothing */
5545 if (!k_idx) continue;
5547 /* Search an artifact index if need */
5548 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
5549 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
5551 if (insta_art || fixed_art)
5553 for (a_idx = 1; a_idx < max_a_idx; a_idx++)
5555 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
5556 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
5557 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
5558 if (a_info[a_idx].cur_num > 0) continue;
5562 if (a_idx >= max_a_idx) continue;
5565 /* Make an object (if possible) */
5566 object_prep(i_ptr, k_idx);
5567 if (a_idx) i_ptr->name1 = a_idx;
5568 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
5570 if (amuse_info[i].flag & AMS_NO_UNIQUE)
5572 if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
5575 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
5576 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
5580 object_aware(i_ptr);
5581 object_known(i_ptr);
5584 /* Paranoia - reroll if nothing */
5585 if (!(i_ptr->k_idx)) continue;
5587 /* Drop the object */
5588 (void)drop_near(i_ptr, -1, y1, x1);
5596 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5597 * Describe the charges on an item in the inventory.
5598 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5601 void inven_item_charges(INVENTORY_IDX item)
5603 object_type *o_ptr = &inventory[item];
5605 /* Require staff/wand */
5606 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5608 /* Require known item */
5609 if (!object_is_known(o_ptr)) return;
5612 if (o_ptr->pval <= 0)
5614 msg_print("もう魔力が残っていない。");
5618 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5621 /* Multiple charges */
5622 if (o_ptr->pval != 1)
5624 msg_format("You have %d charges remaining.", o_ptr->pval);
5630 msg_format("You have %d charge remaining.", o_ptr->pval);
5637 * @brief アイテムの残り所持数メッセージを表示する /
5638 * Describe an item in the inventory.
5639 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5642 void inven_item_describe(INVENTORY_IDX item)
5644 object_type *o_ptr = &inventory[item];
5645 char o_name[MAX_NLEN];
5647 object_desc(o_name, o_ptr, 0);
5650 /* "no more" の場合はこちらで表示する */
5651 if (o_ptr->number <= 0)
5653 /*FIRST*//*ここはもう通らないかも */
5654 msg_format("もう%sを持っていない。", o_name);
5658 /* アイテム名を英日切り替え機能対応 */
5659 msg_format("まだ %sを持っている。", o_name);
5662 msg_format("You have %s.", o_name);
5668 * @brief アイテムを増やし残り所持数メッセージを表示する /
5669 * Increase the "number" of an item in the inventory
5670 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5674 void inven_item_increase(INVENTORY_IDX item, int num)
5676 object_type *o_ptr = &inventory[item];
5679 num += o_ptr->number;
5682 if (num > 255) num = 255;
5683 else if (num < 0) num = 0;
5686 num -= (ITEM_NUMBER)o_ptr->number;
5688 /* Change the number and weight */
5691 /* Add the number */
5692 o_ptr->number += num;
5694 /* Add the weight */
5695 p_ptr->total_weight += (num * o_ptr->weight);
5697 /* Recalculate bonuses */
5698 p_ptr->update |= (PU_BONUS);
5700 /* Recalculate mana XXX */
5701 p_ptr->update |= (PU_MANA);
5703 /* Combine the pack */
5704 p_ptr->notice |= (PN_COMBINE);
5706 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5708 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5709 if (!o_ptr->number && p_ptr->ele_attack)
5711 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5713 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5715 /* Clear all temporary elemental brands */
5716 set_ele_attack(0, 0);
5724 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5725 * Erase an inventory slot if it has no more items
5726 * @param item 消去したいプレイヤーのアイテム所持スロット
5729 void inven_item_optimize(INVENTORY_IDX item)
5731 object_type *o_ptr = &inventory[item];
5733 /* Only optimize real items */
5734 if (!o_ptr->k_idx) return;
5736 /* Only optimize empty items */
5737 if (o_ptr->number) return;
5739 /* The item is in the pack */
5740 if (item < INVEN_RARM)
5747 /* Slide everything down */
5748 for (i = item; i < INVEN_PACK; i++)
5750 /* Structure copy */
5751 inventory[i] = inventory[i+1];
5754 /* Erase the "final" slot */
5755 object_wipe(&inventory[i]);
5757 p_ptr->window |= (PW_INVEN);
5760 /* The item is being wielded */
5766 /* Erase the empty slot */
5767 object_wipe(&inventory[item]);
5769 /* Recalculate bonuses */
5770 p_ptr->update |= (PU_BONUS);
5772 /* Recalculate torch */
5773 p_ptr->update |= (PU_TORCH);
5775 /* Recalculate mana XXX */
5776 p_ptr->update |= (PU_MANA);
5778 p_ptr->window |= (PW_EQUIP);
5781 p_ptr->window |= (PW_SPELL);
5785 * @brief 床上の魔道具の残り残量メッセージを表示する /
5786 * Describe the charges on an item on the floor.
5787 * @param item メッセージの対象にしたいアイテム所持スロット
5790 void floor_item_charges(INVENTORY_IDX item)
5792 object_type *o_ptr = &o_list[item];
5794 /* Require staff/wand */
5795 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5797 /* Require known item */
5798 if (!object_is_known(o_ptr)) return;
5801 if (o_ptr->pval <= 0)
5803 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5807 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5810 /* Multiple charges */
5811 if (o_ptr->pval != 1)
5813 msg_format("There are %d charges remaining.", o_ptr->pval);
5819 msg_format("There is %d charge remaining.", o_ptr->pval);
5826 * @brief 床上のアイテムの残り数メッセージを表示する /
5827 * Describe the charges on an item on the floor.
5828 * @param item メッセージの対象にしたいアイテム所持スロット
5831 void floor_item_describe(INVENTORY_IDX item)
5833 object_type *o_ptr = &o_list[item];
5834 char o_name[MAX_NLEN];
5836 object_desc(o_name, o_ptr, 0);
5839 /* "no more" の場合はこちらで表示を分ける */
5840 if (o_ptr->number <= 0)
5842 msg_format("床上には、もう%sはない。", o_name);
5846 msg_format("床上には、まだ %sがある。", o_name);
5849 msg_format("You see %s.", o_name);
5856 * @brief 床上のアイテムの数を増やす /
5857 * Increase the "number" of an item on the floor
5858 * @param item 増やしたいアイテムの所持スロット
5859 * @param num 増やしたいアイテムの数
5862 void floor_item_increase(INVENTORY_IDX item, int num)
5864 object_type *o_ptr = &o_list[item];
5867 num += o_ptr->number;
5870 if (num > 255) num = 255;
5871 else if (num < 0) num = 0;
5874 num -= (int)o_ptr->number;
5876 /* Change the number */
5877 o_ptr->number += (ITEM_NUMBER)num;
5882 * @brief 床上の数の無くなったアイテムスロットを消去する /
5883 * Optimize an item on the floor (destroy "empty" items)
5884 * @param item 消去したいアイテムの所持スロット
5887 void floor_item_optimize(INVENTORY_IDX item)
5889 object_type *o_ptr = &o_list[item];
5891 /* Paranoia -- be sure it exists */
5892 if (!o_ptr->k_idx) return;
5894 /* Only optimize empty items */
5895 if (o_ptr->number) return;
5897 delete_object_idx(item);
5902 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5903 * Check if we have space for an item in the pack without overflow
5904 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5905 * @return 溢れずに済むならTRUEを返す
5907 bool inven_carry_okay(object_type *o_ptr)
5912 if (inven_cnt < INVEN_PACK) return (TRUE);
5915 for (j = 0; j < INVEN_PACK; j++)
5917 object_type *j_ptr = &inventory[j];
5919 /* Skip non-objects */
5920 if (!j_ptr->k_idx) continue;
5922 /* Check if the two items can be combined */
5923 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5930 * @brief オブジェクトを定義された基準に従いソートするための関数 /
5931 * Check if we have space for an item in the pack without overflow
5932 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
5933 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
5934 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
5935 * @return o_ptrの方が上位ならばTRUEを返す。
5937 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5941 /* Use empty slots */
5942 if (!j_ptr->k_idx) return TRUE;
5944 /* Hack -- readable books always come first */
5945 if ((o_ptr->tval == REALM1_BOOK) &&
5946 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5947 if ((j_ptr->tval == REALM1_BOOK) &&
5948 (o_ptr->tval != REALM1_BOOK)) return FALSE;
5950 if ((o_ptr->tval == REALM2_BOOK) &&
5951 (j_ptr->tval != REALM2_BOOK)) return TRUE;
5952 if ((j_ptr->tval == REALM2_BOOK) &&
5953 (o_ptr->tval != REALM2_BOOK)) return FALSE;
5955 /* Objects sort by decreasing type */
5956 if (o_ptr->tval > j_ptr->tval) return TRUE;
5957 if (o_ptr->tval < j_ptr->tval) return FALSE;
5959 /* Non-aware (flavored) items always come last */
5960 /* Can happen in the home */
5961 if (!object_is_aware(o_ptr)) return FALSE;
5962 if (!object_is_aware(j_ptr)) return TRUE;
5964 /* Objects sort by increasing sval */
5965 if (o_ptr->sval < j_ptr->sval) return TRUE;
5966 if (o_ptr->sval > j_ptr->sval) return FALSE;
5968 /* Unidentified objects always come last */
5969 /* Objects in the home can be unknown */
5970 if (!object_is_known(o_ptr)) return FALSE;
5971 if (!object_is_known(j_ptr)) return TRUE;
5973 /* Fixed artifacts, random artifacts and ego items */
5974 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
5975 else if (o_ptr->art_name) o_type = 2;
5976 else if (object_is_ego(o_ptr)) o_type = 1;
5979 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
5980 else if (j_ptr->art_name) j_type = 2;
5981 else if (object_is_ego(j_ptr)) j_type = 1;
5984 if (o_type < j_type) return TRUE;
5985 if (o_type > j_type) return FALSE;
5987 switch (o_ptr->tval)
5993 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
5994 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
6000 /* Objects sort by increasing hit/damage bonuses */
6001 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
6002 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
6005 /* Hack: otherwise identical rods sort by
6006 increasing recharge time --dsb */
6008 if (o_ptr->pval < j_ptr->pval) return TRUE;
6009 if (o_ptr->pval > j_ptr->pval) return FALSE;
6013 /* Objects sort by decreasing value */
6014 return o_value > object_value(j_ptr);
6019 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
6020 * Add an item to the players inventory, and return the slot used.
6021 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
6022 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6024 * If the new item can combine with an existing item in the inventory,\n
6025 * it will do so, using "object_similar()" and "object_absorb()", else,\n
6026 * the item will be placed into the "proper" location in the inventory.\n
6028 * This function can be used to "over-fill" the player's pack, but only\n
6029 * once, and such an action must trigger the "overflow" code immediately.\n
6030 * Note that when the pack is being "over-filled", the new item must be\n
6031 * placed into the "overflow" slot, and the "overflow" must take place\n
6032 * before the pack is reordered, but (optionally) after the pack is\n
6033 * combined. This may be tricky. See "dungeon.c" for info.\n
6035 * Note that this code must remove any location/stack information\n
6036 * from the object once it is placed into the inventory.\n
6038 s16b inven_carry(object_type *o_ptr)
6040 INVENTORY_IDX i, j, k;
6041 INVENTORY_IDX n = -1;
6046 /* Check for combining */
6047 for (j = 0; j < INVEN_PACK; j++)
6049 j_ptr = &inventory[j];
6051 /* Skip non-objects */
6052 if (!j_ptr->k_idx) continue;
6054 /* Hack -- track last item */
6057 /* Check if the two items can be combined */
6058 if (object_similar(j_ptr, o_ptr))
6060 /* Combine the items */
6061 object_absorb(j_ptr, o_ptr);
6063 /* Increase the weight */
6064 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6066 /* Recalculate bonuses */
6067 p_ptr->update |= (PU_BONUS);
6069 p_ptr->window |= (PW_INVEN);
6078 if (inven_cnt > INVEN_PACK) return (-1);
6080 /* Find an empty slot */
6081 for (j = 0; j <= INVEN_PACK; j++)
6083 j_ptr = &inventory[j];
6085 /* Use it if found */
6086 if (!j_ptr->k_idx) break;
6093 /* Reorder the pack */
6096 /* Get the "value" of the item */
6097 s32b o_value = object_value(o_ptr);
6099 /* Scan every occupied slot */
6100 for (j = 0; j < INVEN_PACK; j++)
6102 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6109 for (k = n; k >= i; k--)
6111 /* Hack -- Slide the item */
6112 object_copy(&inventory[k+1], &inventory[k]);
6115 /* Wipe the empty slot */
6116 object_wipe(&inventory[i]);
6121 object_copy(&inventory[i], o_ptr);
6123 /* Access new object */
6124 j_ptr = &inventory[i];
6127 j_ptr->next_o_idx = 0;
6129 /* Forget monster */
6130 j_ptr->held_m_idx = 0;
6132 /* Forget location */
6133 j_ptr->iy = j_ptr->ix = 0;
6135 /* Player touches it, and no longer marked */
6136 j_ptr->marked = OM_TOUCHED;
6138 /* Increase the weight */
6139 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6141 /* Count the items */
6144 /* Recalculate bonuses */
6145 p_ptr->update |= (PU_BONUS);
6147 /* Combine and Reorder pack */
6148 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
6150 p_ptr->window |= (PW_INVEN);
6152 /* Return the slot */
6158 * @brief 装備スロットからオブジェクトを外すメインルーチン /
6159 * Take off (some of) a non-cursed equipment item
6160 * @param item オブジェクトを外したい所持テーブルのID
6162 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6164 * Note that only one item at a time can be wielded per slot.\n
6165 * Note that taking off an item when "full" may cause that item\n
6166 * to fall to the ground.\n
6167 * Return the inventory slot into which the item is placed.\n
6169 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
6180 char o_name[MAX_NLEN];
6183 /* Get the item to take off */
6184 o_ptr = &inventory[item];
6187 if (amt <= 0) return (-1);
6190 if (amt > o_ptr->number) amt = o_ptr->number;
6192 /* Get local object */
6195 /* Obtain a local object */
6196 object_copy(q_ptr, o_ptr);
6198 /* Modify quantity */
6199 q_ptr->number = amt;
6201 object_desc(o_name, q_ptr, 0);
6203 /* Took off weapon */
6204 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
6205 object_is_melee_weapon(o_ptr))
6207 act = _("を装備からはずした", "You were wielding");
6211 else if (item == INVEN_BOW)
6213 act = _("を装備からはずした", "You were holding");
6216 /* Took off light */
6217 else if (item == INVEN_LITE)
6219 act = _("を光源からはずした", "You were holding");
6222 /* Took off something */
6225 act = _("を装備からはずした", "You were wearing");
6228 /* Modify, Optimize */
6229 inven_item_increase(item, -amt);
6230 inven_item_optimize(item);
6232 /* Carry the object */
6233 slot = inven_carry(q_ptr);
6236 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
6238 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6248 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
6249 * Drop (some of) a non-cursed inventory/equipment item
6250 * @param item 所持テーブルのID
6251 * @param amt 落としたい個数
6254 * The object will be dropped "near" the current location
6256 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
6262 char o_name[MAX_NLEN];
6265 /* Access original object */
6266 o_ptr = &inventory[item];
6269 if (amt <= 0) return;
6272 if (amt > o_ptr->number) amt = o_ptr->number;
6275 /* Take off equipment */
6276 if (item >= INVEN_RARM)
6278 /* Take off first */
6279 item = inven_takeoff(item, amt);
6281 /* Access original object */
6282 o_ptr = &inventory[item];
6286 /* Get local object */
6289 /* Obtain local object */
6290 object_copy(q_ptr, o_ptr);
6292 /* Distribute charges of wands or rods */
6293 distribute_charges(o_ptr, q_ptr, amt);
6295 /* Modify quantity */
6296 q_ptr->number = amt;
6298 /* Describe local object */
6299 object_desc(o_name, q_ptr, 0);
6301 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
6303 /* Drop it near the player */
6304 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
6306 /* Modify, Describe, Optimize */
6307 inven_item_increase(item, -amt);
6308 inven_item_describe(item);
6309 inven_item_optimize(item);
6314 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
6315 * Combine items in the pack
6318 * Note special handling of the "overflow" slot
6320 void combine_pack(void)
6325 bool flag = FALSE, combined;
6331 /* Combine the pack (backwards) */
6332 for (i = INVEN_PACK; i > 0; i--)
6334 o_ptr = &inventory[i];
6336 /* Skip empty items */
6337 if (!o_ptr->k_idx) continue;
6339 /* Scan the items above that item */
6340 for (j = 0; j < i; j++)
6344 j_ptr = &inventory[j];
6346 /* Skip empty items */
6347 if (!j_ptr->k_idx) continue;
6350 * Get maximum number of the stack if these
6351 * are similar, get zero otherwise.
6353 max_num = object_similar_part(j_ptr, o_ptr);
6355 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6356 if (max_num && j_ptr->number < max_num)
6358 if (o_ptr->number + j_ptr->number <= max_num)
6363 /* Add together the item counts */
6364 object_absorb(j_ptr, o_ptr);
6366 /* One object is gone */
6369 /* Slide everything down */
6370 for (k = i; k < INVEN_PACK; k++)
6372 /* Structure copy */
6373 inventory[k] = inventory[k+1];
6376 /* Erase the "final" slot */
6377 object_wipe(&inventory[k]);
6381 int old_num = o_ptr->number;
6382 int remain = j_ptr->number + o_ptr->number - max_num;
6384 o_ptr->number -= remain;
6386 /* Add together the item counts */
6387 object_absorb(j_ptr, o_ptr);
6389 o_ptr->number = remain;
6391 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6392 if (o_ptr->tval == TV_ROD)
6394 o_ptr->pval = o_ptr->pval * remain / old_num;
6395 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6398 /* Hack -- if wands are stacking, combine the charges. -LM- */
6399 if (o_ptr->tval == TV_WAND)
6401 o_ptr->pval = o_ptr->pval * remain / old_num;
6405 p_ptr->window |= (PW_INVEN);
6417 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6421 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6422 * Reorder items in the pack
6425 * Note special handling of the "overflow" slot
6427 void reorder_pack(void)
6437 /* Re-order the pack (forwards) */
6438 for (i = 0; i < INVEN_PACK; i++)
6440 /* Mega-Hack -- allow "proper" over-flow */
6441 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6443 o_ptr = &inventory[i];
6445 /* Skip empty slots */
6446 if (!o_ptr->k_idx) continue;
6448 /* Get the "value" of the item */
6449 o_value = object_value(o_ptr);
6451 /* Scan every occupied slot */
6452 for (j = 0; j < INVEN_PACK; j++)
6454 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6457 /* Never move down */
6458 if (j >= i) continue;
6463 /* Get local object */
6466 /* Save a copy of the moving item */
6467 object_copy(q_ptr, &inventory[i]);
6469 /* Slide the objects */
6470 for (k = i; k > j; k--)
6472 /* Slide the item */
6473 object_copy(&inventory[k], &inventory[k-1]);
6476 /* Insert the moving item */
6477 object_copy(&inventory[j], q_ptr);
6479 p_ptr->window |= (PW_INVEN);
6482 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6486 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6487 * Hack -- display an object kind in the current window
6488 * @param k_idx ベースアイテムの参照ID
6491 * Include list of usable spells for readible books
6493 void display_koff(KIND_OBJECT_IDX k_idx)
6500 REALM_IDX use_realm;
6502 char o_name[MAX_NLEN];
6505 /* Erase the window */
6506 for (y = 0; y < Term->hgt; y++)
6508 /* Erase the line */
6509 Term_erase(0, y, 255);
6515 /* Get local object */
6518 /* Prepare the object */
6519 object_prep(q_ptr, k_idx);
6520 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6522 /* Mention the object name */
6523 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6525 /* Access the item's sval */
6527 use_realm = tval2realm(q_ptr->tval);
6529 /* Warriors are illiterate */
6530 if (p_ptr->realm1 || p_ptr->realm2)
6532 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6536 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6537 if (!is_magic(use_realm)) return;
6538 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6541 /* Display spells in readible books */
6545 SPELL_IDX spells[64];
6547 /* Extract spells */
6548 for (spell = 0; spell < 32; spell++)
6550 /* Check for this spell */
6551 if (fake_spell_flags[sval] & (1L << spell))
6553 /* Collect this spell */
6554 spells[num++] = spell;
6559 print_spells(0, spells, num, 2, 0, use_realm);
6564 * @brief 警告を放つアイテムを選択する /
6565 * Choose one of items that have warning flag
6566 * Calculate spell damages
6569 object_type *choose_warning_item(void)
6572 int choices[INVEN_TOTAL - INVEN_RARM];
6575 /* Paranoia -- Player has no warning ability */
6576 if (!p_ptr->warning) return NULL;
6578 /* Search Inventory */
6579 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6581 BIT_FLAGS flgs[TR_FLAG_SIZE];
6582 object_type *o_ptr = &inventory[i];
6584 object_flags(o_ptr, flgs);
6585 if (have_flag(flgs, TR_WARNING))
6587 choices[number] = i;
6592 /* Choice one of them */
6593 return number ? &inventory[choices[randint0(number)]] : NULL;
6597 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6598 * Calculate spell damages
6599 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6600 * @param typ 効果属性のID
6602 * @param max 算出した最大ダメージを返すポインタ
6605 static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
6607 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6608 int rlev = r_ptr->level;
6609 bool ignore_wraith_form = FALSE;
6611 /* Vulnerability, resistance and immunity */
6615 if (p_ptr->immune_elec)
6618 ignore_wraith_form = TRUE;
6622 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6623 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6624 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6625 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6626 if (IS_OPPOSE_ELEC())
6627 dam = (dam + 2) / 3;
6632 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6633 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6637 if (p_ptr->immune_acid)
6640 ignore_wraith_form = TRUE;
6644 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6645 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6646 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6647 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6653 if (p_ptr->immune_cold)
6656 ignore_wraith_form = TRUE;
6660 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6661 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6662 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6663 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6668 if (p_ptr->immune_fire)
6671 ignore_wraith_form = TRUE;
6675 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6676 if (prace_is_(RACE_ENT)) dam += dam / 3;
6677 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6678 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6679 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6684 ignore_wraith_form = TRUE;
6688 if (!p_ptr->blind &&
6689 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6690 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6693 ignore_wraith_form = TRUE;
6698 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6699 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6700 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6703 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6704 * "dam *= 2;" for later "dam /= 2"
6706 if (p_ptr->wraith_form) dam *= 2;
6710 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6713 ignore_wraith_form = TRUE;
6715 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6719 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6723 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6727 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6731 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6735 if (prace_is_(RACE_SPECTRE))
6738 ignore_wraith_form = TRUE;
6740 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6744 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6748 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6752 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6756 if (p_ptr->levitation) dam = (dam * 2) / 3;
6760 if (p_ptr->resist_shard) dam /= 2;
6764 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6765 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6769 if (p_ptr->mimic_form)
6771 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6774 ignore_wraith_form = TRUE;
6779 switch (p_ptr->prace)
6788 ignore_wraith_form = TRUE;
6795 if (p_ptr->align > 10) dam /= 2;
6796 else if (p_ptr->align < -10) dam *= 2;
6800 if (p_ptr->align > 10) dam *= 2;
6804 case GF_BRAIN_SMASH:
6805 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6808 ignore_wraith_form = TRUE;
6816 if (100 + rlev / 2 <= p_ptr->skill_sav)
6819 ignore_wraith_form = TRUE;
6824 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6827 ignore_wraith_form = TRUE;
6832 if (p_ptr->wraith_form && !ignore_wraith_form)
6838 if (dam > *max) *max = dam;
6842 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6843 * Calculate spell damages
6844 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6845 * @param typ 効果属性のID
6846 * @param m_idx 魔法を行使するモンスターのID
6847 * @param max 算出した最大ダメージを返すポインタ
6850 void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
6852 monster_type *m_ptr = &m_list[m_idx];
6853 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6854 spell_damcalc(m_ptr, typ, dam, max);
6858 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6859 * Calculate blow damages
6860 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6861 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6862 * @return 算出された最大ダメージを返す。
6864 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6866 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6868 bool check_wraith_form = TRUE;
6870 if (blow_ptr->method != RBM_EXPLODE)
6872 ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
6874 switch (blow_ptr->effect)
6878 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6879 dam = MAX(dam, tmp_dam * 2);
6885 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6889 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6891 check_wraith_form = FALSE;
6895 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6897 check_wraith_form = FALSE;
6901 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6903 check_wraith_form = FALSE;
6907 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6909 check_wraith_form = FALSE;
6914 check_wraith_form = FALSE;
6918 if (check_wraith_form && p_ptr->wraith_form)
6926 dam = (dam + 1) / 2;
6927 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
6935 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
6936 * Examine the grid (xx,yy) and warn the player if there are any danger
6937 * @param xx 危険性を調査するマスのX座標
6938 * @param yy 危険性を調査するマスのY座標
6939 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
6941 bool process_warning(POSITION xx, POSITION yy)
6945 char o_name[MAX_NLEN];
6947 #define WARNING_AWARE_RANGE 12
6949 static int old_damage = 0;
6951 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
6953 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
6956 monster_type *m_ptr;
6957 monster_race *r_ptr;
6959 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
6961 c_ptr = &cave[my][mx];
6963 if (!c_ptr->m_idx) continue;
6965 m_ptr = &m_list[c_ptr->m_idx];
6967 if (MON_CSLEEP(m_ptr)) continue;
6968 if (!is_hostile(m_ptr)) continue;
6970 r_ptr = &r_info[m_ptr->r_idx];
6972 /* Monster spells (only powerful ones)*/
6973 if (projectable(my, mx, yy, xx))
6975 BIT_FLAGS f4 = r_ptr->flags4;
6976 BIT_FLAGS f5 = r_ptr->a_ability_flags1;
6977 BIT_FLAGS f6 = r_ptr->a_ability_flags2;
6979 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
6981 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
6982 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
6983 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
6984 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, c_ptr->m_idx, &dam_max0);
6985 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, c_ptr->m_idx, &dam_max0);
6986 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, c_ptr->m_idx, &dam_max0);
6988 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, c_ptr->m_idx, &dam_max0);
6989 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, c_ptr->m_idx, &dam_max0);
6990 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, c_ptr->m_idx, &dam_max0);
6991 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, c_ptr->m_idx, &dam_max0);
6992 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, c_ptr->m_idx, &dam_max0);
6993 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, c_ptr->m_idx, &dam_max0);
6994 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, c_ptr->m_idx, &dam_max0);
6995 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, c_ptr->m_idx, &dam_max0);
6996 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
6997 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, c_ptr->m_idx, &dam_max0);
6998 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, c_ptr->m_idx, &dam_max0);
6999 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
7000 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, c_ptr->m_idx, &dam_max0);
7001 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, c_ptr->m_idx, &dam_max0);
7002 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, c_ptr->m_idx, &dam_max0);
7003 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, c_ptr->m_idx, &dam_max0);
7004 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, c_ptr->m_idx, &dam_max0);
7005 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, c_ptr->m_idx, &dam_max0);
7006 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, c_ptr->m_idx, &dam_max0);
7007 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, c_ptr->m_idx, &dam_max0);
7008 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
7009 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, c_ptr->m_idx, &dam_max0);
7010 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, c_ptr->m_idx, &dam_max0);
7013 /* Monster melee attacks */
7014 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
7016 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
7020 for (m = 0; m < 4; m++)
7022 /* Skip non-attacks */
7023 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
7025 /* Extract the attack info */
7026 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
7027 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
7029 if (dam_melee > dam_max0) dam_max0 = dam_melee;
7033 /* Contribution from this monster */
7034 dam_max += dam_max0;
7038 /* Prevent excessive warning */
7039 if (dam_max > old_damage)
7041 old_damage = dam_max * 3 / 2;
7043 if (dam_max > p_ptr->chp / 2)
7045 object_type *o_ptr = choose_warning_item();
7048 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7050 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7051 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7053 disturb(FALSE, TRUE);
7054 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7057 else old_damage = old_damage / 2;
7059 c_ptr = &cave[yy][xx];
7060 if (((!easy_disarm && is_trap(c_ptr->feat))
7061 || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
7063 object_type *o_ptr = choose_warning_item();
7066 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7068 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7069 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7070 disturb(FALSE, TRUE);
7071 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7078 * エッセンス情報の構造体 / A structure for smithing
7081 int add; /* TR flag number or special essence id */
7082 cptr add_name; /* Name of this ability */
7083 ESSENCE_IDX type; /* Menu number */
7084 int essence; /* Index for carrying essences */
7085 int value; /* Needed value to add this ability */
7090 * エッセンス情報テーブル Smithing type data for Weapon smith
7093 static essence_type essence_info[] =
7095 {TR_STR, "腕力", 4, TR_STR, 20},
7096 {TR_INT, "知能", 4, TR_INT, 20},
7097 {TR_WIS, "賢さ", 4, TR_WIS, 20},
7098 {TR_DEX, "器用さ", 4, TR_DEX, 20},
7099 {TR_CON, "耐久力", 4, TR_CON, 20},
7100 {TR_CHR, "魅力", 4, TR_CHR, 20},
7101 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
7102 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
7103 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
7104 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
7105 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
7106 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
7107 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
7108 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
7109 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
7110 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
7111 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
7112 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
7113 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
7114 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
7115 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
7116 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
7117 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
7118 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
7119 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
7120 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
7121 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
7122 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
7123 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
7124 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
7125 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
7126 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
7127 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
7128 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
7129 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
7130 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
7131 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
7132 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
7133 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
7134 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
7135 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
7136 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
7137 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
7138 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
7139 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
7140 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
7141 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
7142 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
7143 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
7144 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
7145 {TR_SH_FIRE, "", 0, -2, 0},
7146 {TR_SH_ELEC, "", 0, -2, 0},
7147 {TR_SH_COLD, "", 0, -2, 0},
7148 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
7149 {TR_WARNING, "警告", 3, TR_WARNING, 20},
7150 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
7151 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
7152 {TR_LITE_2, "", 0, -2, 0},
7153 {TR_LITE_3, "", 0, -2, 0},
7154 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
7155 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
7156 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
7157 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
7158 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
7160 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
7161 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
7162 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
7163 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
7164 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
7165 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
7166 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
7167 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
7168 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
7169 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
7170 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
7171 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
7172 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
7173 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
7174 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
7175 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
7176 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
7177 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
7179 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
7180 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
7181 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
7182 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
7183 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
7184 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
7185 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
7186 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
7188 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
7189 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
7190 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
7191 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
7192 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
7193 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
7194 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
7195 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
7196 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
7197 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
7198 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
7199 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
7201 {-1, NULL, 0, -1, 0}
7204 static essence_type essence_info[] =
7206 {TR_STR, "strength", 4, TR_STR, 20},
7207 {TR_INT, "intelligence", 4, TR_INT, 20},
7208 {TR_WIS, "wisdom", 4, TR_WIS, 20},
7209 {TR_DEX, "dexterity", 4, TR_DEX, 20},
7210 {TR_CON, "constitution", 4, TR_CON, 20},
7211 {TR_CHR, "charisma", 4, TR_CHR, 20},
7212 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
7213 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
7214 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
7215 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
7216 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
7217 {TR_SPEED, "speed", 4, TR_SPEED, 12},
7218 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
7219 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
7220 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
7221 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
7222 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
7223 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
7224 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
7225 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
7226 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
7227 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
7228 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
7229 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
7230 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
7231 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
7232 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
7233 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
7234 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
7235 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
7236 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
7237 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
7238 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
7239 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
7240 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
7241 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
7242 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
7243 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
7244 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
7245 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
7246 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
7247 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
7248 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
7249 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
7250 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
7251 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
7252 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
7253 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
7254 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
7255 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
7256 {TR_SH_FIRE, "", 0, -2, 0},
7257 {TR_SH_ELEC, "", 0, -2, 0},
7258 {TR_SH_COLD, "", 0, -2, 0},
7259 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
7260 {TR_WARNING, "warning", 3, TR_WARNING, 20},
7261 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
7262 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
7263 {TR_LITE_2, "", 0, -2, 0},
7264 {TR_LITE_3, "", 0, -2, 0},
7265 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7266 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7267 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7268 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7269 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7271 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7272 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7273 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7274 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7275 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7276 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7277 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7278 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7279 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7280 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7281 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7282 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7283 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7284 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
7285 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7286 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7287 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7288 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7290 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7291 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
7292 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
7293 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
7294 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
7295 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
7296 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7297 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7299 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7300 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7301 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7302 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7303 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7304 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7305 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7306 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7307 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7308 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7309 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7310 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7312 {-1, NULL, 0, -1, 0}
7318 * エッセンス名テーブル / Essense names for Weapon smith
7321 cptr essence_name[] =
7424 cptr essence_name[] =
7527 * @brief 所持しているエッセンス一覧を表示する
7530 static void display_essence(void)
7535 for (i = 1; i < 22; i++)
7539 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7540 "Essence Num Essence Num Essence Num "), 1, 8);
7541 for (i = 0; essence_name[i]; i++)
7543 if (!essence_name[i][0]) continue;
7544 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7547 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7557 static void drain_essence(void)
7559 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7563 bool observe = FALSE;
7564 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7565 TIME_EFFECT old_timeout;
7566 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7572 OBJECT_IDX next_o_idx;
7575 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7578 item_tester_hook = object_is_weapon_armour_ammo;
7579 item_tester_no_ryoute = TRUE;
7581 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7582 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7584 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7586 /* Get the item (in the pack) */
7589 o_ptr = &inventory[item];
7592 /* Get the item (on the floor) */
7595 o_ptr = &o_list[0 - item];
7598 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7600 char o_name[MAX_NLEN];
7601 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7602 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7605 p_ptr->energy_use = 100;
7607 object_flags(o_ptr, old_flgs);
7608 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7609 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7610 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7611 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7612 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7613 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7614 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7615 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7616 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7618 old_to_a = o_ptr->to_a;
7620 old_to_h = o_ptr->to_h;
7621 old_to_d = o_ptr->to_d;
7624 old_pval = o_ptr->pval;
7625 old_name2 = o_ptr->name2;
7626 old_timeout = o_ptr->timeout;
7627 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7628 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7629 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7630 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7631 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7632 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7633 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7634 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7635 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7636 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7637 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7638 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7639 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7640 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7641 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7642 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7643 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7644 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7645 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7649 next_o_idx = o_ptr->next_o_idx;
7650 marked = o_ptr->marked;
7651 weight = o_ptr->weight;
7652 number = o_ptr->number;
7654 object_prep(o_ptr, o_ptr->k_idx);
7658 o_ptr->next_o_idx=next_o_idx;
7659 o_ptr->marked=marked;
7660 o_ptr->number = number;
7661 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7662 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7663 o_ptr->ident |= (IDENT_MENTAL);
7664 object_aware(o_ptr);
7665 object_known(o_ptr);
7667 object_flags(o_ptr, new_flgs);
7669 for (i = 0; essence_info[i].add_name; i++)
7671 essence_type *es_ptr = &essence_info[i];
7672 PARAMETER_VALUE pval = 0;
7674 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7675 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7677 if (es_ptr->add < TR_FLAG_MAX &&
7678 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7679 have_flag(old_flgs, es_ptr->add))
7683 drain_value[es_ptr->essence] += 10 * pval;
7685 else if (es_ptr->essence != -2)
7687 drain_value[es_ptr->essence] += 10;
7689 else if (es_ptr->add == TR_SH_FIRE)
7691 drain_value[TR_BRAND_FIRE] += 10;
7692 drain_value[TR_RES_FIRE] += 10;
7694 else if (es_ptr->add == TR_SH_ELEC)
7696 drain_value[TR_BRAND_ELEC] += 10;
7697 drain_value[TR_RES_ELEC] += 10;
7699 else if (es_ptr->add == TR_SH_COLD)
7701 drain_value[TR_BRAND_COLD] += 10;
7702 drain_value[TR_RES_COLD] += 10;
7704 else if (es_ptr->add == TR_LITE_2)
7706 drain_value[TR_LITE_1] += 20;
7708 else if (es_ptr->add == TR_LITE_3)
7710 drain_value[TR_LITE_1] += 30;
7715 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7717 drain_value[TR_INT] += 5;
7718 drain_value[TR_WIS] += 5;
7720 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7722 drain_value[TR_BRAND_POIS] += 5;
7723 drain_value[TR_BRAND_ACID] += 5;
7724 drain_value[TR_BRAND_ELEC] += 5;
7725 drain_value[TR_BRAND_FIRE] += 5;
7726 drain_value[TR_BRAND_COLD] += 5;
7728 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7730 drain_value[TR_INT] += 10;
7732 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7734 drain_value[TR_STR] += 10;
7736 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7738 drain_value[TR_DEX] += 10;
7740 if (old_name2 == EGO_2WEAPON)
7742 drain_value[TR_DEX] += 20;
7744 if (object_is_weapon_ammo(o_ptr))
7746 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7748 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7750 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7751 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7752 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7753 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7755 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7757 drain_value[i] *= number;
7758 drain_value[i] = drain_value[i] * dec / 4;
7759 drain_value[i] = MAX(drain_value[i], 0);
7760 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7768 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7772 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7774 for (i = 0; essence_name[i]; i++)
7776 if (!essence_name[i][0]) continue;
7777 if (!drain_value[i]) continue;
7779 p_ptr->magic_num1[i] += drain_value[i];
7780 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7782 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7786 /* Apply autodestroy/inscription to the drained item */
7787 autopick_alter_item(item, TRUE);
7789 /* Combine the pack */
7790 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
7792 p_ptr->window |= (PW_INVEN);
7796 * @brief 付加するエッセンスの大別を選択する
7797 * @return 選んだエッセンスの大別ID
7799 static COMMAND_CODE choose_essence(void)
7801 COMMAND_CODE mode = 0;
7803 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7806 cptr menu_name[] = {
7816 cptr menu_name[] = {
7826 const COMMAND_CODE mode_max = 7;
7828 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7838 for (i = 0; i < mode_max; i++)
7840 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7841 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7843 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7844 prt("Choose from menu.", 0, 0);
7863 menu_line += mode_max - 1;
7872 if (menu_line > mode_max) menu_line -= mode_max;
7883 for (i = 0; i < mode_max; i++)
7884 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7886 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7892 if (isupper(choice)) choice = (char)tolower(choice);
7894 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7895 mode = (int)choice - 'a' + 1;
7905 * @brief エッセンスを実際に付加する
7906 * @param mode エッセンスの大別ID
7909 static void add_essence(ESSENCE_IDX mode)
7921 char o_name[MAX_NLEN];
7923 essence_type *es_ptr;
7924 bool able[22] = { 0 };
7926 int menu_line = (use_menu ? 1 : 0);
7928 for (i = 0; essence_info[i].add_name; i++)
7930 es_ptr = &essence_info[i];
7932 if (es_ptr->type != mode) continue;
7936 if (!repeat_pull(&i) || i<0 || i>=max_num)
7939 /* Nothing chosen yet */
7945 /* Build a prompt */
7946 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
7947 if (use_menu) screen_save();
7949 /* Get a spell from the user */
7951 choice = (always_show_list || use_menu) ? ESCAPE:1;
7954 if( choice==ESCAPE ) choice = ' ';
7955 else if( !get_com(out_val, &choice, FALSE) )break;
7957 if (use_menu && choice != ' ')
7971 menu_line += (max_num-1);
7994 menu_line = max_num;
8008 if (menu_line > max_num) menu_line -= max_num;
8010 /* Request redraw */
8011 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
8014 if (!redraw || use_menu)
8018 char dummy[80], dummy2[80];
8026 /* Save the screen */
8027 if (!use_menu) screen_save();
8029 for (y = 1; y < 24; y++)
8032 /* Print header(s) */
8034 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
8037 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
8040 for (ctr = 0; ctr < max_num; ctr++)
8042 es_ptr = &essence_info[num[ctr]];
8046 if (ctr == (menu_line-1))
8047 strcpy(dummy, _("》 ", "> "));
8048 else strcpy(dummy, " ");
8051 /* letter/number for power selection */
8054 sprintf(dummy, "%c) ",I2A(ctr));
8057 strcat(dummy, es_ptr->add_name);
8062 if (es_ptr->essence != -1)
8064 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
8065 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
8071 case ESSENCE_SH_FIRE:
8072 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
8073 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
8074 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8076 case ESSENCE_SH_ELEC:
8077 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
8078 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
8079 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8081 case ESSENCE_SH_COLD:
8082 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
8083 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
8084 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8086 case ESSENCE_RESISTANCE:
8087 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8088 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8089 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8090 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8091 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8093 case ESSENCE_SUSTAIN:
8094 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8095 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8096 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8097 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8098 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8103 if (!able[ctr]) col = TERM_RED;
8105 if (es_ptr->essence != -1)
8107 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
8111 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
8114 c_prt(col, dummy2, ctr+2, x);
8124 /* Restore the screen */
8135 ask = (isupper(choice));
8138 if (ask) choice = (char)tolower(choice);
8140 /* Extract request */
8141 i = (islower(choice) ? A2I(choice) : -1);
8144 /* Totally Illegal */
8145 if ((i < 0) || (i >= max_num) || !able[i])
8157 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
8159 /* Belay that order */
8160 if (!get_check(tmp_val)) continue;
8167 /* Restore the screen */
8168 if (redraw) screen_load();
8174 es_ptr = &essence_info[num[i]];
8176 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8177 item_tester_tval = TV_GLOVES;
8178 else if (mode == 1 || mode == 5)
8179 item_tester_hook = item_tester_hook_melee_ammo;
8180 else if (es_ptr->add == ESSENCE_ATTACK)
8181 item_tester_hook = object_allow_enchant_weapon;
8182 else if (es_ptr->add == ESSENCE_AC)
8183 item_tester_hook = object_is_armour;
8185 item_tester_hook = object_is_weapon_armour_ammo;
8186 item_tester_no_ryoute = TRUE;
8188 q = _("どのアイテムを改良しますか?", "Improve which item? ");
8189 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
8191 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8193 /* Get the item (in the pack) */
8196 o_ptr = &inventory[item];
8199 /* Get the item (on the floor) */
8202 o_ptr = &o_list[0 - item];
8205 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
8207 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
8211 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8213 use_essence = es_ptr->value;
8214 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
8215 if (o_ptr->number > 1)
8217 use_essence *= o_ptr->number;
8218 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
8221 if (es_ptr->essence != -1)
8223 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8225 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8228 if (is_pval_flag(es_ptr->add))
8230 if (o_ptr->pval < 0)
8232 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
8235 else if (es_ptr->add == TR_BLOWS)
8237 if (o_ptr->pval > 1)
8239 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
8243 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8245 else if (o_ptr->pval > 0)
8247 use_essence *= o_ptr->pval;
8248 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8254 PARAMETER_VALUE pval;
8255 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8257 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
8258 strcpy(tmp_val, "1");
8260 if (!get_string(tmp, tmp_val, 1)) return;
8261 pval = (PARAMETER_VALUE)atoi(tmp_val);
8262 if (pval > limit) pval = limit;
8263 else if (pval < 1) pval = 1;
8264 o_ptr->pval += pval;
8265 use_essence *= pval;
8266 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8269 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8271 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8275 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8282 strcpy(tmp_val, "1");
8283 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
8284 val = atoi(tmp_val);
8285 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8286 else if (val < 1) val = 1;
8288 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8289 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8291 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8294 get_to_h = ((val+1)/2+randint0(val/2+1));
8295 get_to_d = ((val+1)/2+randint0(val/2+1));
8296 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8297 o_ptr->to_h += get_to_h;
8298 o_ptr->to_d += get_to_d;
8300 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8301 if (es_ptr->add == ESSENCE_ATTACK)
8303 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8305 msg_print(_("改良に失敗した。", "You failed to enchant."));
8306 p_ptr->energy_use = 100;
8311 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8312 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8315 else if (es_ptr->add == ESSENCE_AC)
8317 if (o_ptr->to_a >= p_ptr->lev/5+5)
8319 msg_print(_("改良に失敗した。", "You failed to enchant."));
8320 p_ptr->energy_use = 100;
8325 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8330 o_ptr->xtra3 = es_ptr->add + 1;
8335 bool success = TRUE;
8339 case ESSENCE_SH_FIRE:
8340 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8345 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8346 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8348 case ESSENCE_SH_ELEC:
8349 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8354 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8355 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8357 case ESSENCE_SH_COLD:
8358 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8363 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8364 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8366 case ESSENCE_RESISTANCE:
8367 case ESSENCE_SUSTAIN:
8368 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))
8373 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8374 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8375 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8376 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8381 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8384 if (es_ptr->add == ESSENCE_SUSTAIN)
8386 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8387 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8388 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8389 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8393 o_ptr->xtra3 = es_ptr->add + 1;
8397 p_ptr->energy_use = 100;
8400 msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name);
8402 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8405 /* Combine the pack */
8406 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8408 p_ptr->window |= (PW_INVEN);
8415 static void erase_essence(void)
8420 char o_name[MAX_NLEN];
8421 BIT_FLAGS flgs[TR_FLAG_SIZE];
8423 item_tester_hook = object_is_smith;
8425 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
8426 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
8428 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8430 /* Get the item (in the pack) */
8433 o_ptr = &inventory[item];
8436 /* Get the item (on the floor) */
8439 o_ptr = &o_list[0 - item];
8442 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8443 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
8445 p_ptr->energy_use = 100;
8447 if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE)
8449 o_ptr->to_h -= (o_ptr->xtra4>>8);
8450 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8452 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8453 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8456 object_flags(o_ptr, flgs);
8457 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8458 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8460 /* Combine the pack */
8461 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8463 p_ptr->window |= (PW_INVEN);
8467 * @brief 鍛冶コマンドのメインルーチン
8468 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8471 void do_cmd_kaji(bool only_browse)
8473 COMMAND_CODE mode = 0;
8476 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8480 if (p_ptr->confused)
8482 msg_print(_("混乱していて作業できない!", "You are too confused!"));
8487 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8492 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8497 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8499 if (only_browse) screen_save();
8501 if (!only_browse) screen_save();
8507 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8508 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8509 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8510 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8511 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8512 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8514 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8515 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8516 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8517 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8518 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8519 prt(format("Choose command from menu."), 0, 0);
8546 if (menu_line > 5) menu_line -= 5;
8554 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
8555 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
8556 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
8557 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
8558 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
8560 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8562 if (!get_com("Command :", &choice, TRUE))
8599 /* Clear lines, position cursor (really should use strlen here) */
8600 Term_erase(14, 21, 255);
8601 Term_erase(14, 20, 255);
8602 Term_erase(14, 19, 255);
8603 Term_erase(14, 18, 255);
8604 Term_erase(14, 17, 255);
8605 Term_erase(14, 16, 255);
8607 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8608 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8610 prt(&temp[j], line, 15);
8615 if (!only_browse) screen_load();
8616 } while (only_browse);
8621 case 1: display_essence();break;
8622 case 2: drain_essence();break;
8623 case 3: erase_essence();break;
8625 mode = choose_essence();
8630 case 5: add_essence(10);break;
8636 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8637 * Torches have special abilities when they are flaming.
8638 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8639 * @param flgs 特別に追加するフラグを返す参照ポインタ
8642 void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
8644 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8646 if (o_ptr->xtra4 > 0)
8648 add_flag(flgs, TR_BRAND_FIRE);
8649 add_flag(flgs, TR_KILL_UNDEAD);
8650 add_flag(flgs, TR_THROW);
8656 * @brief 投擲時たいまつにダイスを与える。
8657 * Torches have special abilities when they are flaming.
8658 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8659 * @param dd 特別なダイス数を返す参照ポインタ
8660 * @param ds 特別なダイス面数を返す参照ポインタ
8663 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
8665 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8667 if (o_ptr->xtra4 > 0)
8676 * @brief 投擲時命中したたいまつの寿命を縮める。
8677 * Torches have special abilities when they are flaming.
8678 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8681 void torch_lost_fuel(object_type *o_ptr)
8683 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8685 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8686 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;