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;
4954 /* Hack -- Preserve artifacts */
4955 if (object_is_fixed_artifact(q_ptr))
4957 a_info[q_ptr->name1].cur_num = 0;
4964 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
4965 * Make a treasure object
4966 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4967 * @return 生成に成功したらTRUEを返す。
4969 * The location must be a legal, clean, floor grid.
4971 bool make_gold(object_type *j_ptr)
4976 /* Hack -- Pick a Treasure variety */
4977 i = ((randint1(object_level + 2) + 2) / 2) - 1;
4979 /* Apply "extra" magic */
4980 if (one_in_(GREAT_OBJ))
4982 i += randint1(object_level + 1);
4985 /* Hack -- Creeping Coins only generate "themselves" */
4986 if (coin_type) i = coin_type;
4988 /* Do not create "illegal" Treasure Types */
4989 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
4991 /* Prepare a gold object */
4992 object_prep(j_ptr, OBJ_GOLD_LIST + i);
4994 /* Hack -- Base coin cost */
4995 base = k_info[OBJ_GOLD_LIST + i].cost;
4997 /* Determine how much the treasure is "worth" */
4998 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
5006 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
5007 * Places a treasure (Gold or Gems) at given location
5008 * @param y 配置したいフロアのY座標
5009 * @param x 配置したいフロアのX座標
5010 * @return 生成に成功したらTRUEを返す。
5012 * The location must be a legal, clean, floor grid.
5014 void place_gold(POSITION y, POSITION x)
5019 cave_type *c_ptr = &cave[y][x];
5025 /* Paranoia -- check bounds */
5026 if (!in_bounds(y, x)) return;
5028 /* Require floor space */
5029 if (!cave_drop_bold(y, x)) return;
5031 /* Avoid stacking on other objects */
5032 if (c_ptr->o_idx) return;
5035 /* Get local object */
5039 /* Make some gold */
5040 if (!make_gold(q_ptr)) return;
5042 /* Make an object */
5050 /* Acquire object */
5051 o_ptr = &o_list[o_idx];
5053 /* Copy the object */
5054 object_copy(o_ptr, q_ptr);
5061 o_ptr->next_o_idx = c_ptr->o_idx;
5063 /* Place the object */
5064 c_ptr->o_idx = o_idx;
5075 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
5076 * Let an object fall to the ground at or near a location.
5077 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
5078 * @param chance ドロップの成功率(%)
5079 * @param y 配置したいフロアのY座標
5080 * @param x 配置したいフロアのX座標
5081 * @return 生成に成功したらオブジェクトのIDを返す。
5083 * The initial location is assumed to be "in_bounds()".\n
5085 * This function takes a parameter "chance". This is the percentage\n
5086 * chance that the item will "disappear" instead of drop. If the object\n
5087 * has been thrown, then this is the chance of disappearance on contact.\n
5089 * Hack -- this function uses "chance" to determine if it should produce\n
5090 * some form of "description" of the drop event (under the player).\n
5092 * We check several locations to see if we can find a location at which\n
5093 * the object can combine, stack, or be placed. Artifacts will try very\n
5094 * hard to be placed, including "teleporting" to a useful grid if needed.\n
5096 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
5103 POSITION ty, tx = 0;
5105 OBJECT_IDX o_idx = 0;
5106 OBJECT_IDX this_o_idx, next_o_idx = 0;
5110 char o_name[MAX_NLEN];
5116 /* Extract plural */
5117 bool plural = (j_ptr->number != 1);
5120 /* Describe object */
5121 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5124 /* Handle normal "breakage" */
5125 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
5128 msg_format("%sは消えた。", o_name);
5130 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5133 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
5150 /* Scan local grids */
5151 for (dy = -3; dy <= 3; dy++)
5153 /* Scan local grids */
5154 for (dx = -3; dx <= 3; dx++)
5158 /* Calculate actual distance */
5159 d = (dy * dy) + (dx * dx);
5161 /* Ignore distant grids */
5162 if (d > 10) continue;
5167 /* Skip illegal grids */
5168 if (!in_bounds(ty, tx)) continue;
5170 /* Require line of projection */
5171 if (!projectable(y, x, ty, tx)) continue;
5174 c_ptr = &cave[ty][tx];
5176 /* Require floor space */
5177 if (!cave_drop_bold(ty, tx)) continue;
5182 /* Scan objects in that grid */
5183 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5187 /* Acquire object */
5188 o_ptr = &o_list[this_o_idx];
5190 /* Acquire next object */
5191 next_o_idx = o_ptr->next_o_idx;
5193 /* Check for possible combination */
5194 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5200 /* Add new object */
5204 if (k > 99) continue;
5206 /* Calculate score */
5207 s = 1000 - (d + k * 5);
5209 /* Skip bad values */
5210 if (s < bs) continue;
5212 /* New best value */
5215 /* Apply the randomizer to equivalent values */
5216 if ((++bn >= 2) && !one_in_(bn)) continue;
5230 /* Handle lack of space */
5231 if (!flag && !object_is_artifact(j_ptr))
5234 msg_format("%sは消えた。", o_name);
5236 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5241 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5249 for (i = 0; !flag && (i < 1000); i++)
5252 ty = rand_spread(by, 1);
5253 tx = rand_spread(bx, 1);
5255 /* Verify location */
5256 if (!in_bounds(ty, tx)) continue;
5258 /* Bounce to that location */
5262 /* Require floor space */
5263 if (!cave_drop_bold(by, bx)) continue;
5271 int candidates = 0, pick;
5273 for (ty = 1; ty < cur_hgt - 1; ty++)
5275 for (tx = 1; tx < cur_wid - 1; tx++)
5277 /* A valid space found */
5278 if (cave_drop_bold(ty, tx)) candidates++;
5282 /* No valid place! */
5286 msg_format("%sは消えた。", o_name);
5288 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5292 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5294 /* Mega-Hack -- preserve artifacts */
5297 /* Hack -- Preserve unknown artifacts */
5298 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5300 /* Mega-Hack -- Preserve the artifact */
5301 a_info[j_ptr->name1].cur_num = 0;
5309 /* Choose a random one */
5310 pick = randint1(candidates);
5312 for (ty = 1; ty < cur_hgt - 1; ty++)
5314 for (tx = 1; tx < cur_wid - 1; tx++)
5316 if (cave_drop_bold(ty, tx))
5320 /* Is this a picked one? */
5334 c_ptr = &cave[by][bx];
5336 /* Scan objects in that grid for combination */
5337 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5341 /* Acquire object */
5342 o_ptr = &o_list[this_o_idx];
5344 /* Acquire next object */
5345 next_o_idx = o_ptr->next_o_idx;
5347 /* Check for combination */
5348 if (object_similar(o_ptr, j_ptr))
5350 /* Combine the items */
5351 object_absorb(o_ptr, j_ptr);
5360 /* Get new object */
5361 if (!done) o_idx = o_pop();
5364 if (!done && !o_idx)
5367 msg_format("%sは消えた。", o_name);
5369 msg_format("The %s disappear%s.",
5370 o_name, (plural ? "" : "s"));
5375 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5377 /* Hack -- Preserve artifacts */
5378 if (object_is_fixed_artifact(j_ptr))
5380 a_info[j_ptr->name1].cur_num = 0;
5390 /* Structure copy */
5391 object_copy(&o_list[o_idx], j_ptr);
5393 /* Access new object */
5394 j_ptr = &o_list[o_idx];
5401 j_ptr->held_m_idx = 0;
5404 j_ptr->next_o_idx = c_ptr->o_idx;
5406 /* Place the object */
5407 c_ptr->o_idx = o_idx;
5421 /* Mega-Hack -- no message if "dropped" by player */
5422 /* Message when an object falls under the player */
5423 if (chance && player_bold(by, bx))
5425 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5434 * Scatter some "great" objects near the player
5435 * @param y1 配置したいフロアのY座標
5436 * @param x1 配置したいフロアのX座標
5437 * @param num 獲得の処理回数
5438 * @param great TRUEならば必ず高級品以上を落とす
5439 * @param special TRUEならば必ず特別品を落とす
5440 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5443 void acquirement(POSITION y1, POSITION x1, int num, bool great, bool special, bool known)
5446 object_type object_type_body;
5447 BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ;
5452 /* Get local object */
5453 i_ptr = &object_type_body;
5456 /* Make a good (or great) object (if possible) */
5457 if (!make_object(i_ptr, mode)) continue;
5461 object_aware(i_ptr);
5462 object_known(i_ptr);
5465 /* Drop the object */
5466 (void)drop_near(i_ptr, -1, y1, x1);
5471 * Scatter some "amusing" objects near the player
5474 #define AMS_NOTHING 0x00 /* No restriction */
5475 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
5476 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
5477 #define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */
5478 #define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */
5482 OBJECT_TYPE_VALUE tval;
5483 OBJECT_SUBTYPE_VALUE sval;
5488 amuse_type amuse_info[] =
5490 { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
5491 { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
5492 { TV_SPIKE, SV_ANY, 10, AMS_PILE },
5493 { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
5494 { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
5495 { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
5496 { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
5497 { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
5498 { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
5499 { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
5500 { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
5501 { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
5502 { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
5509 * @param y1 配置したいフロアのY座標
5510 * @param x1 配置したいフロアのX座標
5511 * @param num 誰得の処理回数
5512 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5515 void amusement(POSITION y1, POSITION x1, int num, bool known)
5518 object_type object_type_body;
5521 for (n = 0; amuse_info[n].tval != 0; n++)
5523 t += amuse_info[n].prob;
5530 KIND_OBJECT_IDX k_idx;
5531 ARTIFACT_IDX a_idx = 0;
5532 int r = randint0(t);
5533 bool insta_art, fixed_art;
5537 r -= amuse_info[i].prob;
5541 /* Get local object */
5542 i_ptr = &object_type_body;
5544 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
5546 /* Paranoia - reroll if nothing */
5547 if (!k_idx) continue;
5549 /* Search an artifact index if need */
5550 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
5551 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
5553 if (insta_art || fixed_art)
5555 for (a_idx = 1; a_idx < max_a_idx; a_idx++)
5557 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
5558 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
5559 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
5560 if (a_info[a_idx].cur_num > 0) continue;
5564 if (a_idx >= max_a_idx) continue;
5567 /* Make an object (if possible) */
5568 object_prep(i_ptr, k_idx);
5569 if (a_idx) i_ptr->name1 = a_idx;
5570 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
5572 if (amuse_info[i].flag & AMS_NO_UNIQUE)
5574 if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
5577 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
5578 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
5582 object_aware(i_ptr);
5583 object_known(i_ptr);
5586 /* Paranoia - reroll if nothing */
5587 if (!(i_ptr->k_idx)) continue;
5589 /* Drop the object */
5590 (void)drop_near(i_ptr, -1, y1, x1);
5598 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5599 * Describe the charges on an item in the inventory.
5600 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5603 void inven_item_charges(INVENTORY_IDX item)
5605 object_type *o_ptr = &inventory[item];
5607 /* Require staff/wand */
5608 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5610 /* Require known item */
5611 if (!object_is_known(o_ptr)) return;
5614 if (o_ptr->pval <= 0)
5616 msg_print("もう魔力が残っていない。");
5620 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5623 /* Multiple charges */
5624 if (o_ptr->pval != 1)
5626 msg_format("You have %d charges remaining.", o_ptr->pval);
5632 msg_format("You have %d charge remaining.", o_ptr->pval);
5639 * @brief アイテムの残り所持数メッセージを表示する /
5640 * Describe an item in the inventory.
5641 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5644 void inven_item_describe(INVENTORY_IDX item)
5646 object_type *o_ptr = &inventory[item];
5647 char o_name[MAX_NLEN];
5649 object_desc(o_name, o_ptr, 0);
5652 /* "no more" の場合はこちらで表示する */
5653 if (o_ptr->number <= 0)
5655 /*FIRST*//*ここはもう通らないかも */
5656 msg_format("もう%sを持っていない。", o_name);
5660 /* アイテム名を英日切り替え機能対応 */
5661 msg_format("まだ %sを持っている。", o_name);
5664 msg_format("You have %s.", o_name);
5670 * @brief アイテムを増やし残り所持数メッセージを表示する /
5671 * Increase the "number" of an item in the inventory
5672 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5676 void inven_item_increase(INVENTORY_IDX item, int num)
5678 object_type *o_ptr = &inventory[item];
5681 num += o_ptr->number;
5684 if (num > 255) num = 255;
5685 else if (num < 0) num = 0;
5688 num -= (ITEM_NUMBER)o_ptr->number;
5690 /* Change the number and weight */
5693 /* Add the number */
5694 o_ptr->number += num;
5696 /* Add the weight */
5697 p_ptr->total_weight += (num * o_ptr->weight);
5699 /* Recalculate bonuses */
5700 p_ptr->update |= (PU_BONUS);
5702 /* Recalculate mana XXX */
5703 p_ptr->update |= (PU_MANA);
5705 /* Combine the pack */
5706 p_ptr->notice |= (PN_COMBINE);
5708 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5710 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5711 if (!o_ptr->number && p_ptr->ele_attack)
5713 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5715 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5717 /* Clear all temporary elemental brands */
5718 set_ele_attack(0, 0);
5726 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5727 * Erase an inventory slot if it has no more items
5728 * @param item 消去したいプレイヤーのアイテム所持スロット
5731 void inven_item_optimize(INVENTORY_IDX item)
5733 object_type *o_ptr = &inventory[item];
5735 /* Only optimize real items */
5736 if (!o_ptr->k_idx) return;
5738 /* Only optimize empty items */
5739 if (o_ptr->number) return;
5741 /* The item is in the pack */
5742 if (item < INVEN_RARM)
5749 /* Slide everything down */
5750 for (i = item; i < INVEN_PACK; i++)
5752 /* Structure copy */
5753 inventory[i] = inventory[i+1];
5756 /* Erase the "final" slot */
5757 object_wipe(&inventory[i]);
5759 p_ptr->window |= (PW_INVEN);
5762 /* The item is being wielded */
5768 /* Erase the empty slot */
5769 object_wipe(&inventory[item]);
5771 /* Recalculate bonuses */
5772 p_ptr->update |= (PU_BONUS);
5774 /* Recalculate torch */
5775 p_ptr->update |= (PU_TORCH);
5777 /* Recalculate mana XXX */
5778 p_ptr->update |= (PU_MANA);
5780 p_ptr->window |= (PW_EQUIP);
5783 p_ptr->window |= (PW_SPELL);
5787 * @brief 床上の魔道具の残り残量メッセージを表示する /
5788 * Describe the charges on an item on the floor.
5789 * @param item メッセージの対象にしたいアイテム所持スロット
5792 void floor_item_charges(INVENTORY_IDX item)
5794 object_type *o_ptr = &o_list[item];
5796 /* Require staff/wand */
5797 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5799 /* Require known item */
5800 if (!object_is_known(o_ptr)) return;
5803 if (o_ptr->pval <= 0)
5805 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5809 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5812 /* Multiple charges */
5813 if (o_ptr->pval != 1)
5815 msg_format("There are %d charges remaining.", o_ptr->pval);
5821 msg_format("There is %d charge remaining.", o_ptr->pval);
5828 * @brief 床上のアイテムの残り数メッセージを表示する /
5829 * Describe the charges on an item on the floor.
5830 * @param item メッセージの対象にしたいアイテム所持スロット
5833 void floor_item_describe(INVENTORY_IDX item)
5835 object_type *o_ptr = &o_list[item];
5836 char o_name[MAX_NLEN];
5838 object_desc(o_name, o_ptr, 0);
5841 /* "no more" の場合はこちらで表示を分ける */
5842 if (o_ptr->number <= 0)
5844 msg_format("床上には、もう%sはない。", o_name);
5848 msg_format("床上には、まだ %sがある。", o_name);
5851 msg_format("You see %s.", o_name);
5858 * @brief 床上のアイテムの数を増やす /
5859 * Increase the "number" of an item on the floor
5860 * @param item 増やしたいアイテムの所持スロット
5861 * @param num 増やしたいアイテムの数
5864 void floor_item_increase(INVENTORY_IDX item, int num)
5866 object_type *o_ptr = &o_list[item];
5869 num += o_ptr->number;
5872 if (num > 255) num = 255;
5873 else if (num < 0) num = 0;
5876 num -= (int)o_ptr->number;
5878 /* Change the number */
5879 o_ptr->number += (ITEM_NUMBER)num;
5884 * @brief 床上の数の無くなったアイテムスロットを消去する /
5885 * Optimize an item on the floor (destroy "empty" items)
5886 * @param item 消去したいアイテムの所持スロット
5889 void floor_item_optimize(INVENTORY_IDX item)
5891 object_type *o_ptr = &o_list[item];
5893 /* Paranoia -- be sure it exists */
5894 if (!o_ptr->k_idx) return;
5896 /* Only optimize empty items */
5897 if (o_ptr->number) return;
5899 delete_object_idx(item);
5904 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5905 * Check if we have space for an item in the pack without overflow
5906 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5907 * @return 溢れずに済むならTRUEを返す
5909 bool inven_carry_okay(object_type *o_ptr)
5914 if (inven_cnt < INVEN_PACK) return (TRUE);
5917 for (j = 0; j < INVEN_PACK; j++)
5919 object_type *j_ptr = &inventory[j];
5921 /* Skip non-objects */
5922 if (!j_ptr->k_idx) continue;
5924 /* Check if the two items can be combined */
5925 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5932 * @brief オブジェクトを定義された基準に従いソートするための関数 /
5933 * Check if we have space for an item in the pack without overflow
5934 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
5935 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
5936 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
5937 * @return o_ptrの方が上位ならばTRUEを返す。
5939 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5943 /* Use empty slots */
5944 if (!j_ptr->k_idx) return TRUE;
5946 /* Hack -- readable books always come first */
5947 if ((o_ptr->tval == REALM1_BOOK) &&
5948 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5949 if ((j_ptr->tval == REALM1_BOOK) &&
5950 (o_ptr->tval != REALM1_BOOK)) return FALSE;
5952 if ((o_ptr->tval == REALM2_BOOK) &&
5953 (j_ptr->tval != REALM2_BOOK)) return TRUE;
5954 if ((j_ptr->tval == REALM2_BOOK) &&
5955 (o_ptr->tval != REALM2_BOOK)) return FALSE;
5957 /* Objects sort by decreasing type */
5958 if (o_ptr->tval > j_ptr->tval) return TRUE;
5959 if (o_ptr->tval < j_ptr->tval) return FALSE;
5961 /* Non-aware (flavored) items always come last */
5962 /* Can happen in the home */
5963 if (!object_is_aware(o_ptr)) return FALSE;
5964 if (!object_is_aware(j_ptr)) return TRUE;
5966 /* Objects sort by increasing sval */
5967 if (o_ptr->sval < j_ptr->sval) return TRUE;
5968 if (o_ptr->sval > j_ptr->sval) return FALSE;
5970 /* Unidentified objects always come last */
5971 /* Objects in the home can be unknown */
5972 if (!object_is_known(o_ptr)) return FALSE;
5973 if (!object_is_known(j_ptr)) return TRUE;
5975 /* Fixed artifacts, random artifacts and ego items */
5976 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
5977 else if (o_ptr->art_name) o_type = 2;
5978 else if (object_is_ego(o_ptr)) o_type = 1;
5981 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
5982 else if (j_ptr->art_name) j_type = 2;
5983 else if (object_is_ego(j_ptr)) j_type = 1;
5986 if (o_type < j_type) return TRUE;
5987 if (o_type > j_type) return FALSE;
5989 switch (o_ptr->tval)
5995 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
5996 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
6002 /* Objects sort by increasing hit/damage bonuses */
6003 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
6004 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
6007 /* Hack: otherwise identical rods sort by
6008 increasing recharge time --dsb */
6010 if (o_ptr->pval < j_ptr->pval) return TRUE;
6011 if (o_ptr->pval > j_ptr->pval) return FALSE;
6015 /* Objects sort by decreasing value */
6016 return o_value > object_value(j_ptr);
6021 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
6022 * Add an item to the players inventory, and return the slot used.
6023 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
6024 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6026 * If the new item can combine with an existing item in the inventory,\n
6027 * it will do so, using "object_similar()" and "object_absorb()", else,\n
6028 * the item will be placed into the "proper" location in the inventory.\n
6030 * This function can be used to "over-fill" the player's pack, but only\n
6031 * once, and such an action must trigger the "overflow" code immediately.\n
6032 * Note that when the pack is being "over-filled", the new item must be\n
6033 * placed into the "overflow" slot, and the "overflow" must take place\n
6034 * before the pack is reordered, but (optionally) after the pack is\n
6035 * combined. This may be tricky. See "dungeon.c" for info.\n
6037 * Note that this code must remove any location/stack information\n
6038 * from the object once it is placed into the inventory.\n
6040 s16b inven_carry(object_type *o_ptr)
6042 INVENTORY_IDX i, j, k;
6043 INVENTORY_IDX n = -1;
6048 /* Check for combining */
6049 for (j = 0; j < INVEN_PACK; j++)
6051 j_ptr = &inventory[j];
6053 /* Skip non-objects */
6054 if (!j_ptr->k_idx) continue;
6056 /* Hack -- track last item */
6059 /* Check if the two items can be combined */
6060 if (object_similar(j_ptr, o_ptr))
6062 /* Combine the items */
6063 object_absorb(j_ptr, o_ptr);
6065 /* Increase the weight */
6066 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6068 /* Recalculate bonuses */
6069 p_ptr->update |= (PU_BONUS);
6071 p_ptr->window |= (PW_INVEN);
6080 if (inven_cnt > INVEN_PACK) return (-1);
6082 /* Find an empty slot */
6083 for (j = 0; j <= INVEN_PACK; j++)
6085 j_ptr = &inventory[j];
6087 /* Use it if found */
6088 if (!j_ptr->k_idx) break;
6095 /* Reorder the pack */
6098 /* Get the "value" of the item */
6099 s32b o_value = object_value(o_ptr);
6101 /* Scan every occupied slot */
6102 for (j = 0; j < INVEN_PACK; j++)
6104 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6111 for (k = n; k >= i; k--)
6113 /* Hack -- Slide the item */
6114 object_copy(&inventory[k+1], &inventory[k]);
6117 /* Wipe the empty slot */
6118 object_wipe(&inventory[i]);
6123 object_copy(&inventory[i], o_ptr);
6125 /* Access new object */
6126 j_ptr = &inventory[i];
6129 j_ptr->next_o_idx = 0;
6131 /* Forget monster */
6132 j_ptr->held_m_idx = 0;
6134 /* Forget location */
6135 j_ptr->iy = j_ptr->ix = 0;
6137 /* Player touches it, and no longer marked */
6138 j_ptr->marked = OM_TOUCHED;
6140 /* Increase the weight */
6141 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6143 /* Count the items */
6146 /* Recalculate bonuses */
6147 p_ptr->update |= (PU_BONUS);
6149 /* Combine and Reorder pack */
6150 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
6152 p_ptr->window |= (PW_INVEN);
6154 /* Return the slot */
6160 * @brief 装備スロットからオブジェクトを外すメインルーチン /
6161 * Take off (some of) a non-cursed equipment item
6162 * @param item オブジェクトを外したい所持テーブルのID
6164 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6166 * Note that only one item at a time can be wielded per slot.\n
6167 * Note that taking off an item when "full" may cause that item\n
6168 * to fall to the ground.\n
6169 * Return the inventory slot into which the item is placed.\n
6171 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
6182 char o_name[MAX_NLEN];
6185 /* Get the item to take off */
6186 o_ptr = &inventory[item];
6189 if (amt <= 0) return (-1);
6192 if (amt > o_ptr->number) amt = o_ptr->number;
6194 /* Get local object */
6197 /* Obtain a local object */
6198 object_copy(q_ptr, o_ptr);
6200 /* Modify quantity */
6201 q_ptr->number = amt;
6203 object_desc(o_name, q_ptr, 0);
6205 /* Took off weapon */
6206 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
6207 object_is_melee_weapon(o_ptr))
6209 act = _("を装備からはずした", "You were wielding");
6213 else if (item == INVEN_BOW)
6215 act = _("を装備からはずした", "You were holding");
6218 /* Took off light */
6219 else if (item == INVEN_LITE)
6221 act = _("を光源からはずした", "You were holding");
6224 /* Took off something */
6227 act = _("を装備からはずした", "You were wearing");
6230 /* Modify, Optimize */
6231 inven_item_increase(item, -amt);
6232 inven_item_optimize(item);
6234 /* Carry the object */
6235 slot = inven_carry(q_ptr);
6238 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
6240 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6250 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
6251 * Drop (some of) a non-cursed inventory/equipment item
6252 * @param item 所持テーブルのID
6253 * @param amt 落としたい個数
6256 * The object will be dropped "near" the current location
6258 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
6264 char o_name[MAX_NLEN];
6267 /* Access original object */
6268 o_ptr = &inventory[item];
6271 if (amt <= 0) return;
6274 if (amt > o_ptr->number) amt = o_ptr->number;
6277 /* Take off equipment */
6278 if (item >= INVEN_RARM)
6280 /* Take off first */
6281 item = inven_takeoff(item, amt);
6283 /* Access original object */
6284 o_ptr = &inventory[item];
6288 /* Get local object */
6291 /* Obtain local object */
6292 object_copy(q_ptr, o_ptr);
6294 /* Distribute charges of wands or rods */
6295 distribute_charges(o_ptr, q_ptr, amt);
6297 /* Modify quantity */
6298 q_ptr->number = amt;
6300 /* Describe local object */
6301 object_desc(o_name, q_ptr, 0);
6303 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
6305 /* Drop it near the player */
6306 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
6308 /* Modify, Describe, Optimize */
6309 inven_item_increase(item, -amt);
6310 inven_item_describe(item);
6311 inven_item_optimize(item);
6316 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
6317 * Combine items in the pack
6320 * Note special handling of the "overflow" slot
6322 void combine_pack(void)
6327 bool flag = FALSE, combined;
6333 /* Combine the pack (backwards) */
6334 for (i = INVEN_PACK; i > 0; i--)
6336 o_ptr = &inventory[i];
6338 /* Skip empty items */
6339 if (!o_ptr->k_idx) continue;
6341 /* Scan the items above that item */
6342 for (j = 0; j < i; j++)
6346 j_ptr = &inventory[j];
6348 /* Skip empty items */
6349 if (!j_ptr->k_idx) continue;
6352 * Get maximum number of the stack if these
6353 * are similar, get zero otherwise.
6355 max_num = object_similar_part(j_ptr, o_ptr);
6357 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6358 if (max_num && j_ptr->number < max_num)
6360 if (o_ptr->number + j_ptr->number <= max_num)
6365 /* Add together the item counts */
6366 object_absorb(j_ptr, o_ptr);
6368 /* One object is gone */
6371 /* Slide everything down */
6372 for (k = i; k < INVEN_PACK; k++)
6374 /* Structure copy */
6375 inventory[k] = inventory[k+1];
6378 /* Erase the "final" slot */
6379 object_wipe(&inventory[k]);
6383 int old_num = o_ptr->number;
6384 int remain = j_ptr->number + o_ptr->number - max_num;
6386 o_ptr->number -= remain;
6388 /* Add together the item counts */
6389 object_absorb(j_ptr, o_ptr);
6391 o_ptr->number = remain;
6393 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6394 if (o_ptr->tval == TV_ROD)
6396 o_ptr->pval = o_ptr->pval * remain / old_num;
6397 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6400 /* Hack -- if wands are stacking, combine the charges. -LM- */
6401 if (o_ptr->tval == TV_WAND)
6403 o_ptr->pval = o_ptr->pval * remain / old_num;
6407 p_ptr->window |= (PW_INVEN);
6419 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6423 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6424 * Reorder items in the pack
6427 * Note special handling of the "overflow" slot
6429 void reorder_pack(void)
6439 /* Re-order the pack (forwards) */
6440 for (i = 0; i < INVEN_PACK; i++)
6442 /* Mega-Hack -- allow "proper" over-flow */
6443 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6445 o_ptr = &inventory[i];
6447 /* Skip empty slots */
6448 if (!o_ptr->k_idx) continue;
6450 /* Get the "value" of the item */
6451 o_value = object_value(o_ptr);
6453 /* Scan every occupied slot */
6454 for (j = 0; j < INVEN_PACK; j++)
6456 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6459 /* Never move down */
6460 if (j >= i) continue;
6465 /* Get local object */
6468 /* Save a copy of the moving item */
6469 object_copy(q_ptr, &inventory[i]);
6471 /* Slide the objects */
6472 for (k = i; k > j; k--)
6474 /* Slide the item */
6475 object_copy(&inventory[k], &inventory[k-1]);
6478 /* Insert the moving item */
6479 object_copy(&inventory[j], q_ptr);
6481 p_ptr->window |= (PW_INVEN);
6484 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6488 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6489 * Hack -- display an object kind in the current window
6490 * @param k_idx ベースアイテムの参照ID
6493 * Include list of usable spells for readible books
6495 void display_koff(KIND_OBJECT_IDX k_idx)
6502 REALM_IDX use_realm;
6504 char o_name[MAX_NLEN];
6507 /* Erase the window */
6508 for (y = 0; y < Term->hgt; y++)
6510 /* Erase the line */
6511 Term_erase(0, y, 255);
6517 /* Get local object */
6520 /* Prepare the object */
6521 object_prep(q_ptr, k_idx);
6522 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6524 /* Mention the object name */
6525 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6527 /* Access the item's sval */
6529 use_realm = tval2realm(q_ptr->tval);
6531 /* Warriors are illiterate */
6532 if (p_ptr->realm1 || p_ptr->realm2)
6534 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6538 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6539 if (!is_magic(use_realm)) return;
6540 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6543 /* Display spells in readible books */
6547 SPELL_IDX spells[64];
6549 /* Extract spells */
6550 for (spell = 0; spell < 32; spell++)
6552 /* Check for this spell */
6553 if (fake_spell_flags[sval] & (1L << spell))
6555 /* Collect this spell */
6556 spells[num++] = spell;
6561 print_spells(0, spells, num, 2, 0, use_realm);
6566 * @brief 警告を放つアイテムを選択する /
6567 * Choose one of items that have warning flag
6568 * Calculate spell damages
6571 object_type *choose_warning_item(void)
6574 int choices[INVEN_TOTAL - INVEN_RARM];
6577 /* Paranoia -- Player has no warning ability */
6578 if (!p_ptr->warning) return NULL;
6580 /* Search Inventory */
6581 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6583 BIT_FLAGS flgs[TR_FLAG_SIZE];
6584 object_type *o_ptr = &inventory[i];
6586 object_flags(o_ptr, flgs);
6587 if (have_flag(flgs, TR_WARNING))
6589 choices[number] = i;
6594 /* Choice one of them */
6595 return number ? &inventory[choices[randint0(number)]] : NULL;
6599 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6600 * Calculate spell damages
6601 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6602 * @param typ 効果属性のID
6604 * @param max 算出した最大ダメージを返すポインタ
6607 static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
6609 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6610 int rlev = r_ptr->level;
6611 bool ignore_wraith_form = FALSE;
6613 /* Vulnerability, resistance and immunity */
6617 if (p_ptr->immune_elec)
6620 ignore_wraith_form = TRUE;
6624 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6625 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6626 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6627 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6628 if (IS_OPPOSE_ELEC())
6629 dam = (dam + 2) / 3;
6634 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6635 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6639 if (p_ptr->immune_acid)
6642 ignore_wraith_form = TRUE;
6646 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6647 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6648 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6649 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6655 if (p_ptr->immune_cold)
6658 ignore_wraith_form = TRUE;
6662 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6663 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6664 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6665 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6670 if (p_ptr->immune_fire)
6673 ignore_wraith_form = TRUE;
6677 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6678 if (prace_is_(RACE_ENT)) dam += dam / 3;
6679 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6680 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6681 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6686 ignore_wraith_form = TRUE;
6690 if (!p_ptr->blind &&
6691 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6692 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6695 ignore_wraith_form = TRUE;
6700 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6701 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6702 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6705 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6706 * "dam *= 2;" for later "dam /= 2"
6708 if (p_ptr->wraith_form) dam *= 2;
6712 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6715 ignore_wraith_form = TRUE;
6717 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6721 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6725 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6729 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6733 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6737 if (prace_is_(RACE_SPECTRE))
6740 ignore_wraith_form = TRUE;
6742 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6746 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6750 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6754 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6758 if (p_ptr->levitation) dam = (dam * 2) / 3;
6762 if (p_ptr->resist_shard) dam /= 2;
6766 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6767 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6771 if (p_ptr->mimic_form)
6773 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6776 ignore_wraith_form = TRUE;
6781 switch (p_ptr->prace)
6790 ignore_wraith_form = TRUE;
6797 if (p_ptr->align > 10) dam /= 2;
6798 else if (p_ptr->align < -10) dam *= 2;
6802 if (p_ptr->align > 10) dam *= 2;
6806 case GF_BRAIN_SMASH:
6807 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6810 ignore_wraith_form = TRUE;
6818 if (100 + rlev / 2 <= p_ptr->skill_sav)
6821 ignore_wraith_form = TRUE;
6826 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6829 ignore_wraith_form = TRUE;
6834 if (p_ptr->wraith_form && !ignore_wraith_form)
6840 if (dam > *max) *max = dam;
6844 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6845 * Calculate spell damages
6846 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6847 * @param typ 効果属性のID
6848 * @param m_idx 魔法を行使するモンスターのID
6849 * @param max 算出した最大ダメージを返すポインタ
6852 void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
6854 monster_type *m_ptr = &m_list[m_idx];
6855 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6856 spell_damcalc(m_ptr, typ, dam, max);
6860 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6861 * Calculate blow damages
6862 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6863 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6864 * @return 算出された最大ダメージを返す。
6866 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6868 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6870 bool check_wraith_form = TRUE;
6872 if (blow_ptr->method != RBM_EXPLODE)
6874 ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
6876 switch (blow_ptr->effect)
6880 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6881 dam = MAX(dam, tmp_dam * 2);
6887 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6891 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6893 check_wraith_form = FALSE;
6897 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6899 check_wraith_form = FALSE;
6903 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6905 check_wraith_form = FALSE;
6909 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6911 check_wraith_form = FALSE;
6916 check_wraith_form = FALSE;
6920 if (check_wraith_form && p_ptr->wraith_form)
6928 dam = (dam + 1) / 2;
6929 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
6937 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
6938 * Examine the grid (xx,yy) and warn the player if there are any danger
6939 * @param xx 危険性を調査するマスのX座標
6940 * @param yy 危険性を調査するマスのY座標
6941 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
6943 bool process_warning(POSITION xx, POSITION yy)
6947 char o_name[MAX_NLEN];
6949 #define WARNING_AWARE_RANGE 12
6951 static int old_damage = 0;
6953 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
6955 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
6958 monster_type *m_ptr;
6959 monster_race *r_ptr;
6961 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
6963 c_ptr = &cave[my][mx];
6965 if (!c_ptr->m_idx) continue;
6967 m_ptr = &m_list[c_ptr->m_idx];
6969 if (MON_CSLEEP(m_ptr)) continue;
6970 if (!is_hostile(m_ptr)) continue;
6972 r_ptr = &r_info[m_ptr->r_idx];
6974 /* Monster spells (only powerful ones)*/
6975 if (projectable(my, mx, yy, xx))
6977 BIT_FLAGS f4 = r_ptr->flags4;
6978 BIT_FLAGS f5 = r_ptr->a_ability_flags1;
6979 BIT_FLAGS f6 = r_ptr->a_ability_flags2;
6981 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
6983 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
6984 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
6985 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
6986 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, c_ptr->m_idx, &dam_max0);
6987 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, c_ptr->m_idx, &dam_max0);
6988 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, c_ptr->m_idx, &dam_max0);
6990 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, c_ptr->m_idx, &dam_max0);
6991 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, c_ptr->m_idx, &dam_max0);
6992 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, c_ptr->m_idx, &dam_max0);
6993 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, c_ptr->m_idx, &dam_max0);
6994 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, c_ptr->m_idx, &dam_max0);
6995 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, c_ptr->m_idx, &dam_max0);
6996 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, c_ptr->m_idx, &dam_max0);
6997 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, c_ptr->m_idx, &dam_max0);
6998 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
6999 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, c_ptr->m_idx, &dam_max0);
7000 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, c_ptr->m_idx, &dam_max0);
7001 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
7002 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, c_ptr->m_idx, &dam_max0);
7003 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, c_ptr->m_idx, &dam_max0);
7004 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, c_ptr->m_idx, &dam_max0);
7005 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, c_ptr->m_idx, &dam_max0);
7006 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, c_ptr->m_idx, &dam_max0);
7007 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, c_ptr->m_idx, &dam_max0);
7008 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, c_ptr->m_idx, &dam_max0);
7009 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, c_ptr->m_idx, &dam_max0);
7010 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
7011 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, c_ptr->m_idx, &dam_max0);
7012 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, c_ptr->m_idx, &dam_max0);
7015 /* Monster melee attacks */
7016 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
7018 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
7022 for (m = 0; m < 4; m++)
7024 /* Skip non-attacks */
7025 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
7027 /* Extract the attack info */
7028 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
7029 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
7031 if (dam_melee > dam_max0) dam_max0 = dam_melee;
7035 /* Contribution from this monster */
7036 dam_max += dam_max0;
7040 /* Prevent excessive warning */
7041 if (dam_max > old_damage)
7043 old_damage = dam_max * 3 / 2;
7045 if (dam_max > p_ptr->chp / 2)
7047 object_type *o_ptr = choose_warning_item();
7050 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7052 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7053 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7055 disturb(FALSE, TRUE);
7056 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7059 else old_damage = old_damage / 2;
7061 c_ptr = &cave[yy][xx];
7062 if (((!easy_disarm && is_trap(c_ptr->feat))
7063 || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
7065 object_type *o_ptr = choose_warning_item();
7068 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7070 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7071 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7072 disturb(FALSE, TRUE);
7073 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7080 * エッセンス情報の構造体 / A structure for smithing
7083 int add; /* TR flag number or special essence id */
7084 cptr add_name; /* Name of this ability */
7085 ESSENCE_IDX type; /* Menu number */
7086 int essence; /* Index for carrying essences */
7087 int value; /* Needed value to add this ability */
7092 * エッセンス情報テーブル Smithing type data for Weapon smith
7095 static essence_type essence_info[] =
7097 {TR_STR, "腕力", 4, TR_STR, 20},
7098 {TR_INT, "知能", 4, TR_INT, 20},
7099 {TR_WIS, "賢さ", 4, TR_WIS, 20},
7100 {TR_DEX, "器用さ", 4, TR_DEX, 20},
7101 {TR_CON, "耐久力", 4, TR_CON, 20},
7102 {TR_CHR, "魅力", 4, TR_CHR, 20},
7103 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
7104 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
7105 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
7106 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
7107 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
7108 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
7109 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
7110 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
7111 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
7112 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
7113 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
7114 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
7115 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
7116 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
7117 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
7118 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
7119 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
7120 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
7121 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
7122 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
7123 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
7124 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
7125 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
7126 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
7127 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
7128 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
7129 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
7130 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
7131 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
7132 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
7133 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
7134 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
7135 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
7136 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
7137 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
7138 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
7139 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
7140 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
7141 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
7142 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
7143 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
7144 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
7145 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
7146 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
7147 {TR_SH_FIRE, "", 0, -2, 0},
7148 {TR_SH_ELEC, "", 0, -2, 0},
7149 {TR_SH_COLD, "", 0, -2, 0},
7150 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
7151 {TR_WARNING, "警告", 3, TR_WARNING, 20},
7152 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
7153 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
7154 {TR_LITE_2, "", 0, -2, 0},
7155 {TR_LITE_3, "", 0, -2, 0},
7156 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
7157 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
7158 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
7159 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
7160 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
7162 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
7163 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
7164 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
7165 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
7166 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
7167 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
7168 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
7169 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
7170 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
7171 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
7172 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
7173 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
7174 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
7175 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
7176 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
7177 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
7178 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
7179 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
7181 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
7182 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
7183 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
7184 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
7185 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
7186 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
7187 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
7188 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
7190 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
7191 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
7192 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
7193 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
7194 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
7195 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
7196 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
7197 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
7198 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
7199 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
7200 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
7201 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
7203 {-1, NULL, 0, -1, 0}
7206 static essence_type essence_info[] =
7208 {TR_STR, "strength", 4, TR_STR, 20},
7209 {TR_INT, "intelligence", 4, TR_INT, 20},
7210 {TR_WIS, "wisdom", 4, TR_WIS, 20},
7211 {TR_DEX, "dexterity", 4, TR_DEX, 20},
7212 {TR_CON, "constitution", 4, TR_CON, 20},
7213 {TR_CHR, "charisma", 4, TR_CHR, 20},
7214 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
7215 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
7216 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
7217 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
7218 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
7219 {TR_SPEED, "speed", 4, TR_SPEED, 12},
7220 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
7221 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
7222 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
7223 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
7224 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
7225 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
7226 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
7227 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
7228 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
7229 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
7230 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
7231 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
7232 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
7233 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
7234 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
7235 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
7236 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
7237 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
7238 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
7239 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
7240 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
7241 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
7242 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
7243 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
7244 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
7245 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
7246 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
7247 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
7248 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
7249 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
7250 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
7251 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
7252 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
7253 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
7254 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
7255 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
7256 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
7257 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
7258 {TR_SH_FIRE, "", 0, -2, 0},
7259 {TR_SH_ELEC, "", 0, -2, 0},
7260 {TR_SH_COLD, "", 0, -2, 0},
7261 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
7262 {TR_WARNING, "warning", 3, TR_WARNING, 20},
7263 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
7264 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
7265 {TR_LITE_2, "", 0, -2, 0},
7266 {TR_LITE_3, "", 0, -2, 0},
7267 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7268 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7269 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7270 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7271 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7273 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7274 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7275 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7276 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7277 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7278 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7279 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7280 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7281 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7282 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7283 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7284 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7285 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7286 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
7287 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7288 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7289 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7290 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7292 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7293 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
7294 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
7295 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
7296 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
7297 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
7298 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7299 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7301 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7302 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7303 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7304 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7305 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7306 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7307 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7308 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7309 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7310 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7311 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7312 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7314 {-1, NULL, 0, -1, 0}
7320 * エッセンス名テーブル / Essense names for Weapon smith
7323 cptr essence_name[] =
7426 cptr essence_name[] =
7529 * @brief 所持しているエッセンス一覧を表示する
7532 static void display_essence(void)
7537 for (i = 1; i < 22; i++)
7541 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7542 "Essence Num Essence Num Essence Num "), 1, 8);
7543 for (i = 0; essence_name[i]; i++)
7545 if (!essence_name[i][0]) continue;
7546 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7549 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7559 static void drain_essence(void)
7561 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7565 bool observe = FALSE;
7566 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7567 TIME_EFFECT old_timeout;
7568 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7574 OBJECT_IDX next_o_idx;
7577 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7580 item_tester_hook = object_is_weapon_armour_ammo;
7581 item_tester_no_ryoute = TRUE;
7583 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7584 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7586 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7588 /* Get the item (in the pack) */
7591 o_ptr = &inventory[item];
7594 /* Get the item (on the floor) */
7597 o_ptr = &o_list[0 - item];
7600 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7602 char o_name[MAX_NLEN];
7603 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7604 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7607 p_ptr->energy_use = 100;
7609 object_flags(o_ptr, old_flgs);
7610 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7611 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7612 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7613 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7614 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7615 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7616 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7617 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7618 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7620 old_to_a = o_ptr->to_a;
7622 old_to_h = o_ptr->to_h;
7623 old_to_d = o_ptr->to_d;
7626 old_pval = o_ptr->pval;
7627 old_name2 = o_ptr->name2;
7628 old_timeout = o_ptr->timeout;
7629 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7630 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7631 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7632 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7633 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7634 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7635 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7636 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7637 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7638 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7639 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7640 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7641 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7642 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7643 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7644 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7645 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7646 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7647 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7651 next_o_idx = o_ptr->next_o_idx;
7652 marked = o_ptr->marked;
7653 weight = o_ptr->weight;
7654 number = o_ptr->number;
7656 object_prep(o_ptr, o_ptr->k_idx);
7660 o_ptr->next_o_idx=next_o_idx;
7661 o_ptr->marked=marked;
7662 o_ptr->number = number;
7663 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7664 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7665 o_ptr->ident |= (IDENT_MENTAL);
7666 object_aware(o_ptr);
7667 object_known(o_ptr);
7669 object_flags(o_ptr, new_flgs);
7671 for (i = 0; essence_info[i].add_name; i++)
7673 essence_type *es_ptr = &essence_info[i];
7674 PARAMETER_VALUE pval = 0;
7676 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7677 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7679 if (es_ptr->add < TR_FLAG_MAX &&
7680 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7681 have_flag(old_flgs, es_ptr->add))
7685 drain_value[es_ptr->essence] += 10 * pval;
7687 else if (es_ptr->essence != -2)
7689 drain_value[es_ptr->essence] += 10;
7691 else if (es_ptr->add == TR_SH_FIRE)
7693 drain_value[TR_BRAND_FIRE] += 10;
7694 drain_value[TR_RES_FIRE] += 10;
7696 else if (es_ptr->add == TR_SH_ELEC)
7698 drain_value[TR_BRAND_ELEC] += 10;
7699 drain_value[TR_RES_ELEC] += 10;
7701 else if (es_ptr->add == TR_SH_COLD)
7703 drain_value[TR_BRAND_COLD] += 10;
7704 drain_value[TR_RES_COLD] += 10;
7706 else if (es_ptr->add == TR_LITE_2)
7708 drain_value[TR_LITE_1] += 20;
7710 else if (es_ptr->add == TR_LITE_3)
7712 drain_value[TR_LITE_1] += 30;
7717 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7719 drain_value[TR_INT] += 5;
7720 drain_value[TR_WIS] += 5;
7722 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7724 drain_value[TR_BRAND_POIS] += 5;
7725 drain_value[TR_BRAND_ACID] += 5;
7726 drain_value[TR_BRAND_ELEC] += 5;
7727 drain_value[TR_BRAND_FIRE] += 5;
7728 drain_value[TR_BRAND_COLD] += 5;
7730 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7732 drain_value[TR_INT] += 10;
7734 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7736 drain_value[TR_STR] += 10;
7738 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7740 drain_value[TR_DEX] += 10;
7742 if (old_name2 == EGO_2WEAPON)
7744 drain_value[TR_DEX] += 20;
7746 if (object_is_weapon_ammo(o_ptr))
7748 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7750 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7752 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7753 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7754 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7755 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7757 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7759 drain_value[i] *= number;
7760 drain_value[i] = drain_value[i] * dec / 4;
7761 drain_value[i] = MAX(drain_value[i], 0);
7762 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7770 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7774 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7776 for (i = 0; essence_name[i]; i++)
7778 if (!essence_name[i][0]) continue;
7779 if (!drain_value[i]) continue;
7781 p_ptr->magic_num1[i] += drain_value[i];
7782 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7784 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7788 /* Apply autodestroy/inscription to the drained item */
7789 autopick_alter_item(item, TRUE);
7791 /* Combine the pack */
7792 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
7794 p_ptr->window |= (PW_INVEN);
7798 * @brief 付加するエッセンスの大別を選択する
7799 * @return 選んだエッセンスの大別ID
7801 static COMMAND_CODE choose_essence(void)
7803 COMMAND_CODE mode = 0;
7805 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7808 cptr menu_name[] = {
7818 cptr menu_name[] = {
7828 const COMMAND_CODE mode_max = 7;
7830 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7840 for (i = 0; i < mode_max; i++)
7842 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7843 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7845 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7846 prt("Choose from menu.", 0, 0);
7865 menu_line += mode_max - 1;
7874 if (menu_line > mode_max) menu_line -= mode_max;
7885 for (i = 0; i < mode_max; i++)
7886 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7888 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7894 if (isupper(choice)) choice = (char)tolower(choice);
7896 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7897 mode = (int)choice - 'a' + 1;
7907 * @brief エッセンスを実際に付加する
7908 * @param mode エッセンスの大別ID
7911 static void add_essence(ESSENCE_IDX mode)
7923 char o_name[MAX_NLEN];
7925 essence_type *es_ptr;
7926 bool able[22] = { 0 };
7928 int menu_line = (use_menu ? 1 : 0);
7930 for (i = 0; essence_info[i].add_name; i++)
7932 es_ptr = &essence_info[i];
7934 if (es_ptr->type != mode) continue;
7938 if (!repeat_pull(&i) || i<0 || i>=max_num)
7941 /* Nothing chosen yet */
7947 /* Build a prompt */
7948 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
7949 if (use_menu) screen_save();
7951 /* Get a spell from the user */
7953 choice = (always_show_list || use_menu) ? ESCAPE:1;
7956 if( choice==ESCAPE ) choice = ' ';
7957 else if( !get_com(out_val, &choice, FALSE) )break;
7959 if (use_menu && choice != ' ')
7973 menu_line += (max_num-1);
7996 menu_line = max_num;
8010 if (menu_line > max_num) menu_line -= max_num;
8012 /* Request redraw */
8013 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
8016 if (!redraw || use_menu)
8020 char dummy[80], dummy2[80];
8028 /* Save the screen */
8029 if (!use_menu) screen_save();
8031 for (y = 1; y < 24; y++)
8034 /* Print header(s) */
8036 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
8039 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
8042 for (ctr = 0; ctr < max_num; ctr++)
8044 es_ptr = &essence_info[num[ctr]];
8048 if (ctr == (menu_line-1))
8049 strcpy(dummy, _("》 ", "> "));
8050 else strcpy(dummy, " ");
8053 /* letter/number for power selection */
8056 sprintf(dummy, "%c) ",I2A(ctr));
8059 strcat(dummy, es_ptr->add_name);
8064 if (es_ptr->essence != -1)
8066 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
8067 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
8073 case ESSENCE_SH_FIRE:
8074 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
8075 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
8076 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8078 case ESSENCE_SH_ELEC:
8079 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
8080 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
8081 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8083 case ESSENCE_SH_COLD:
8084 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
8085 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
8086 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8088 case ESSENCE_RESISTANCE:
8089 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8090 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8091 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8092 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8093 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8095 case ESSENCE_SUSTAIN:
8096 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8097 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8098 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8099 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8100 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8105 if (!able[ctr]) col = TERM_RED;
8107 if (es_ptr->essence != -1)
8109 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
8113 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
8116 c_prt(col, dummy2, ctr+2, x);
8126 /* Restore the screen */
8137 ask = (isupper(choice));
8140 if (ask) choice = (char)tolower(choice);
8142 /* Extract request */
8143 i = (islower(choice) ? A2I(choice) : -1);
8146 /* Totally Illegal */
8147 if ((i < 0) || (i >= max_num) || !able[i])
8159 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
8161 /* Belay that order */
8162 if (!get_check(tmp_val)) continue;
8169 /* Restore the screen */
8170 if (redraw) screen_load();
8176 es_ptr = &essence_info[num[i]];
8178 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8179 item_tester_tval = TV_GLOVES;
8180 else if (mode == 1 || mode == 5)
8181 item_tester_hook = item_tester_hook_melee_ammo;
8182 else if (es_ptr->add == ESSENCE_ATTACK)
8183 item_tester_hook = object_allow_enchant_weapon;
8184 else if (es_ptr->add == ESSENCE_AC)
8185 item_tester_hook = object_is_armour;
8187 item_tester_hook = object_is_weapon_armour_ammo;
8188 item_tester_no_ryoute = TRUE;
8190 q = _("どのアイテムを改良しますか?", "Improve which item? ");
8191 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
8193 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8195 /* Get the item (in the pack) */
8198 o_ptr = &inventory[item];
8201 /* Get the item (on the floor) */
8204 o_ptr = &o_list[0 - item];
8207 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
8209 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
8213 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8215 use_essence = es_ptr->value;
8216 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
8217 if (o_ptr->number > 1)
8219 use_essence *= o_ptr->number;
8220 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
8223 if (es_ptr->essence != -1)
8225 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8227 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8230 if (is_pval_flag(es_ptr->add))
8232 if (o_ptr->pval < 0)
8234 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
8237 else if (es_ptr->add == TR_BLOWS)
8239 if (o_ptr->pval > 1)
8241 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
8245 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8247 else if (o_ptr->pval > 0)
8249 use_essence *= o_ptr->pval;
8250 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8256 PARAMETER_VALUE pval;
8257 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8259 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
8260 strcpy(tmp_val, "1");
8262 if (!get_string(tmp, tmp_val, 1)) return;
8263 pval = (PARAMETER_VALUE)atoi(tmp_val);
8264 if (pval > limit) pval = limit;
8265 else if (pval < 1) pval = 1;
8266 o_ptr->pval += pval;
8267 use_essence *= pval;
8268 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8271 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8273 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8277 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8284 strcpy(tmp_val, "1");
8285 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
8286 val = atoi(tmp_val);
8287 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8288 else if (val < 1) val = 1;
8290 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8291 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8293 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8296 get_to_h = ((val+1)/2+randint0(val/2+1));
8297 get_to_d = ((val+1)/2+randint0(val/2+1));
8298 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8299 o_ptr->to_h += get_to_h;
8300 o_ptr->to_d += get_to_d;
8302 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8303 if (es_ptr->add == ESSENCE_ATTACK)
8305 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8307 msg_print(_("改良に失敗した。", "You failed to enchant."));
8308 p_ptr->energy_use = 100;
8313 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8314 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8317 else if (es_ptr->add == ESSENCE_AC)
8319 if (o_ptr->to_a >= p_ptr->lev/5+5)
8321 msg_print(_("改良に失敗した。", "You failed to enchant."));
8322 p_ptr->energy_use = 100;
8327 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8332 o_ptr->xtra3 = es_ptr->add + 1;
8337 bool success = TRUE;
8341 case ESSENCE_SH_FIRE:
8342 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8347 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8348 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8350 case ESSENCE_SH_ELEC:
8351 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8356 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8357 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8359 case ESSENCE_SH_COLD:
8360 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8365 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8366 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8368 case ESSENCE_RESISTANCE:
8369 case ESSENCE_SUSTAIN:
8370 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))
8375 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8376 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8377 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8378 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8383 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8386 if (es_ptr->add == ESSENCE_SUSTAIN)
8388 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8389 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8390 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8391 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8395 o_ptr->xtra3 = es_ptr->add + 1;
8399 p_ptr->energy_use = 100;
8402 msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name);
8404 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8407 /* Combine the pack */
8408 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8410 p_ptr->window |= (PW_INVEN);
8417 static void erase_essence(void)
8422 char o_name[MAX_NLEN];
8423 BIT_FLAGS flgs[TR_FLAG_SIZE];
8425 item_tester_hook = object_is_smith;
8427 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
8428 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
8430 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8432 /* Get the item (in the pack) */
8435 o_ptr = &inventory[item];
8438 /* Get the item (on the floor) */
8441 o_ptr = &o_list[0 - item];
8444 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8445 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
8447 p_ptr->energy_use = 100;
8449 if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE)
8451 o_ptr->to_h -= (o_ptr->xtra4>>8);
8452 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8454 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8455 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8458 object_flags(o_ptr, flgs);
8459 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8460 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8462 /* Combine the pack */
8463 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8465 p_ptr->window |= (PW_INVEN);
8469 * @brief 鍛冶コマンドのメインルーチン
8470 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8473 void do_cmd_kaji(bool only_browse)
8475 COMMAND_CODE mode = 0;
8478 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8482 if (p_ptr->confused)
8484 msg_print(_("混乱していて作業できない!", "You are too confused!"));
8489 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8494 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8499 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8501 if (only_browse) screen_save();
8503 if (!only_browse) screen_save();
8509 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8510 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8511 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8512 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8513 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8514 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8516 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8517 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8518 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8519 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8520 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8521 prt(format("Choose command from menu."), 0, 0);
8548 if (menu_line > 5) menu_line -= 5;
8556 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
8557 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
8558 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
8559 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
8560 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
8562 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8564 if (!get_com("Command :", &choice, TRUE))
8601 /* Clear lines, position cursor (really should use strlen here) */
8602 Term_erase(14, 21, 255);
8603 Term_erase(14, 20, 255);
8604 Term_erase(14, 19, 255);
8605 Term_erase(14, 18, 255);
8606 Term_erase(14, 17, 255);
8607 Term_erase(14, 16, 255);
8609 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8610 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8612 prt(&temp[j], line, 15);
8617 if (!only_browse) screen_load();
8618 } while (only_browse);
8623 case 1: display_essence();break;
8624 case 2: drain_essence();break;
8625 case 3: erase_essence();break;
8627 mode = choose_essence();
8632 case 5: add_essence(10);break;
8638 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8639 * Torches have special abilities when they are flaming.
8640 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8641 * @param flgs 特別に追加するフラグを返す参照ポインタ
8644 void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
8646 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8648 if (o_ptr->xtra4 > 0)
8650 add_flag(flgs, TR_BRAND_FIRE);
8651 add_flag(flgs, TR_KILL_UNDEAD);
8652 add_flag(flgs, TR_THROW);
8658 * @brief 投擲時たいまつにダイスを与える。
8659 * Torches have special abilities when they are flaming.
8660 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8661 * @param dd 特別なダイス数を返す参照ポインタ
8662 * @param ds 特別なダイス面数を返す参照ポインタ
8665 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
8667 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8669 if (o_ptr->xtra4 > 0)
8678 * @brief 投擲時命中したたいまつの寿命を縮める。
8679 * Torches have special abilities when they are flaming.
8680 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8683 void torch_lost_fuel(object_type *o_ptr)
8685 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8687 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8688 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;