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))
210 /* Wipe the object */
219 * @brief フロアにマスに落ちているオブジェクトを全て削除する / Deletes all objects at given location
220 * Delete a dungeon object
221 * @param y 削除したフロアマスのY座標
222 * @param x 削除したフロアマスのX座標
225 void delete_object(POSITION y, POSITION x)
228 OBJECT_IDX this_o_idx, next_o_idx = 0;
230 /* Refuse "illegal" locations */
231 if (!in_bounds(y, x)) return;
236 /* Scan all objects in the grid */
237 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
242 o_ptr = &o_list[this_o_idx];
244 /* Acquire next object */
245 next_o_idx = o_ptr->next_o_idx;
247 /* Wipe the object */
254 /* Objects are gone */
263 * @brief グローバルオブジェクト配列に対し指定範囲のオブジェクトを整理してIDの若い順に寄せる /
264 * Move an object from index i1 to index i2 in the object list
265 * @param i1 整理したい配列の始点
266 * @param i2 整理したい配列の終点
269 static void compact_objects_aux(IDX i1, IDX i2)
276 if (i1 == i2) return;
280 for (i = 1; i < o_max; i++)
285 /* Skip "dead" objects */
286 if (!o_ptr->k_idx) continue;
288 /* Repair "next" pointers */
289 if (o_ptr->next_o_idx == i1)
292 o_ptr->next_o_idx = i2;
302 if (o_ptr->held_m_idx)
306 /* Acquire monster */
307 m_ptr = &m_list[o_ptr->held_m_idx];
310 if (m_ptr->hold_o_idx == i1)
313 m_ptr->hold_o_idx = i2;
322 /* Acquire location */
330 if (c_ptr->o_idx == i1)
339 o_list[i2] = o_list[i1];
347 * @brief グローバルオブジェクト配列から優先度の低いものを削除し、データを圧縮する。 /
348 * Compact and Reorder the object list.
349 * @param size 最低でも減らしたいオブジェクト数の水準
353 * This function can be very dangerous, use with caution!\n
355 * When actually "compacting" objects, we base the saving throw on a\n
356 * combination of object level, distance from player, and current\n
359 * After "compacting" (if needed), we "reorder" the objects into a more\n
360 * compact order, and we reset the allocation info, and the "live" array.\n
362 void compact_objects(int size)
367 int cur_lev, cur_dis, chance;
374 msg_print(_("アイテム情報を圧縮しています...", "Compacting objects..."));
377 p_ptr->redraw |= (PR_MAP);
379 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
383 /* Compact at least 'size' objects */
384 for (num = 0, cnt = 1; num < size; cnt++)
386 /* Get more vicious each iteration */
389 /* Get closer each iteration */
390 cur_dis = 5 * (20 - cnt);
392 /* Examine the objects */
393 for (i = 1; i < o_max; i++)
397 /* Skip dead objects */
398 if (!o_ptr->k_idx) continue;
400 /* Hack -- High level objects start out "immune" */
401 if (k_info[o_ptr->k_idx].level > cur_lev) continue;
404 if (o_ptr->held_m_idx)
408 /* Acquire monster */
409 m_ptr = &m_list[o_ptr->held_m_idx];
411 /* Get the location */
415 /* Monsters protect their objects */
416 if (randint0(100) < 90) continue;
422 /* Get the location */
427 /* Nearby objects start out "immune" */
428 if ((cur_dis > 0) && (distance(p_ptr->y, p_ptr->x, y, x) < cur_dis)) continue;
433 /* Hack -- only compact artifacts in emergencies */
434 if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
435 (cnt < 1000)) chance = 100;
437 /* Apply the saving throw */
438 if (randint0(100) < chance) continue;
440 delete_object_idx(i);
448 /* Excise dead objects (backwards!) */
449 for (i = o_max - 1; i >= 1; i--)
453 /* Skip real objects */
454 if (o_ptr->k_idx) continue;
456 /* Move last object into open hole */
457 compact_objects_aux(o_max - 1, i);
459 /* Compress "o_max" */
466 * @brief グローバルオブジェクト配列を初期化する /
467 * Delete all the items when player leaves the level
468 * @note we do NOT visually reflect these (irrelevant) changes
470 * Hack -- we clear the "c_ptr->o_idx" field for every grid,
471 * and the "m_ptr->next_o_idx" field for every monster, since
472 * we know we are clearing every object. Technically, we only
473 * clear those fields for grids/monsters containing objects,
474 * and we clear it once for every such object.
477 void wipe_o_list(void)
481 /* Delete the existing objects */
482 for (i = 1; i < o_max; i++)
484 object_type *o_ptr = &o_list[i];
486 /* Skip dead objects */
487 if (!o_ptr->k_idx) continue;
489 /* Mega-Hack -- preserve artifacts */
490 if (!character_dungeon || preserve_mode)
492 /* Hack -- Preserve unknown artifacts */
493 if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
495 /* Mega-Hack -- Preserve the artifact */
496 a_info[o_ptr->name1].cur_num = 0;
501 if (o_ptr->held_m_idx)
506 m_ptr = &m_list[o_ptr->held_m_idx];
508 /* Hack -- see above */
509 m_ptr->hold_o_idx = 0;
517 /* Access location */
518 POSITION y = o_ptr->iy;
519 POSITION x = o_ptr->ix;
524 /* Hack -- see above */
528 /* Wipe the object */
541 * @brief グローバルオブジェクト配列から空きを取得する /
542 * Acquires and returns the index of a "free" object.
543 * @return 開いているオブジェクト要素のID
545 * This routine should almost never fail, but in case it does,
546 * we must be sure to handle "failure" of this routine.
548 OBJECT_IDX o_pop(void)
552 /* Initial allocation */
553 if (o_max < max_o_idx)
558 /* Expand object array */
564 /* Use this object */
569 /* Recycle dead objects */
570 for (i = 1; i < o_max; i++)
577 /* Skip live objects */
578 if (o_ptr->k_idx) continue;
583 /* Use this object */
588 /* Warn the player (except during dungeon creation) */
589 if (character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!"));
596 * @brief オブジェクト生成テーブルに生成制約を加える /
597 * Apply a "object restriction function" to the "object allocation table"
599 * @details 生成の制約はグローバルのget_obj_num_hook関数ポインタで加える
601 static errr get_obj_num_prep(void)
606 alloc_entry *table = alloc_kind_table;
608 /* Scan the allocation table */
609 for (i = 0; i < alloc_kind_size; i++)
611 /* Accept objects which pass the restriction, if any */
612 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
614 /* Accept this object */
615 table[i].prob2 = table[i].prob1;
618 /* Do not use this object */
621 /* Decline this object */
632 * @brief オブジェクト生成テーブルからアイテムを取得する /
633 * Choose an object kind that seems "appropriate" to the given level
635 * @return 選ばれたオブジェクトベースID
637 * This function uses the "prob2" field of the "object allocation table",\n
638 * and various local information, to calculate the "prob3" field of the\n
639 * same table, which is then used to choose an "appropriate" object, in\n
640 * a relatively efficient manner.\n
642 * It is (slightly) more likely to acquire an object of the given level\n
643 * than one of a lower level. This is done by choosing several objects\n
644 * appropriate to the given level and keeping the "hardest" one.\n
646 * Note that if no objects are "appropriate", then this function will\n
647 * fail, and return zero, but this should *almost* never happen.\n
649 OBJECT_IDX get_obj_num(DEPTH level)
652 KIND_OBJECT_IDX k_idx;
655 alloc_entry *table = alloc_kind_table;
657 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
660 if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER))
662 /* Occasional "boost" */
663 if (one_in_(GREAT_OBJ))
665 /* What a bizarre calculation */
666 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
673 /* Process probabilities */
674 for (i = 0; i < alloc_kind_size; i++)
676 /* Objects are sorted by depth */
677 if (table[i].level > level) break;
682 /* Access the index */
683 k_idx = table[i].index;
685 /* Access the actual kind */
686 k_ptr = &k_info[k_idx];
688 /* Hack -- prevent embedded chests */
689 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
692 table[i].prob3 = table[i].prob2;
695 total += table[i].prob3;
698 /* No legal objects */
699 if (total <= 0) return (0);
703 value = randint0(total);
705 /* Find the object */
706 for (i = 0; i < alloc_kind_size; i++)
708 /* Found the entry */
709 if (value < table[i].prob3) break;
712 value = value - table[i].prob3;
719 /* Try for a "better" object once (50%) or twice (10%) */
726 value = randint0(total);
728 /* Find the object */
729 for (i = 0; i < alloc_kind_size; i++)
731 /* Found the entry */
732 if (value < table[i].prob3) break;
735 value = value - table[i].prob3;
738 /* Keep the "best" one */
739 if (table[i].level < table[j].level) i = j;
742 /* Try for a "better" object twice (10%) */
749 value = randint0(total);
751 /* Find the object */
752 for (i = 0; i < alloc_kind_size; i++)
754 /* Found the entry */
755 if (value < table[i].prob3) break;
758 value = value - table[i].prob3;
761 /* Keep the "best" one */
762 if (table[i].level < table[j].level) i = j;
765 return (table[i].index);
770 * @brief オブジェクトを鑑定済にする /
771 * Known is true when the "attributes" of an object are "known".
772 * @param o_ptr 鑑定済にするオブジェクトの構造体参照ポインタ
774 * These include tohit, todam, toac, cost, and pval (charges).\n
776 * Note that "knowing" an object gives you everything that an "awareness"\n
777 * gives you, and much more. In fact, the player is always "aware" of any\n
778 * item of which he has full "knowledge".\n
780 * But having full knowledge of, say, one "wand of wonder", does not, by\n
781 * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
782 * It happens that most "identify" routines (including "buying from a shop")\n
783 * will make the player "aware" of the object as well as fully "know" it.\n
785 * This routine also removes any inscriptions generated by "feelings".\n
787 void object_known(object_type *o_ptr)
789 /* Remove "default inscriptions" */
790 o_ptr->feeling = FEEL_NONE;
792 /* Clear the "Felt" info */
793 o_ptr->ident &= ~(IDENT_SENSE);
795 /* Clear the "Empty" info */
796 o_ptr->ident &= ~(IDENT_EMPTY);
798 /* Now we know about the item */
799 o_ptr->ident |= (IDENT_KNOWN);
803 * @brief オブジェクトを*鑑定*済にする /
804 * The player is now aware of the effects of the given object.
805 * @param o_ptr *鑑定*済にするオブジェクトの構造体参照ポインタ
808 void object_aware(object_type *o_ptr)
810 bool mihanmei = !object_is_aware(o_ptr);
812 /* Fully aware of the effects */
813 k_info[o_ptr->k_idx].aware = TRUE;
815 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
816 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
820 char o_name[MAX_NLEN];
823 object_copy(q_ptr, o_ptr);
826 object_desc(o_name, q_ptr, OD_NAME_ONLY);
828 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
833 * @brief オブジェクトを試行済にする /
834 * Something has been "sampled"
835 * @param o_ptr 試行済にするオブジェクトの構造体参照ポインタ
838 void object_tried(object_type *o_ptr)
840 /* Mark it as tried (even if "aware") */
841 k_info[o_ptr->k_idx].tried = TRUE;
845 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
846 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
847 * @return 擬似鑑定結果のIDを返す。
849 byte value_check_aux1(object_type *o_ptr)
852 if (object_is_artifact(o_ptr))
855 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
862 if (object_is_ego(o_ptr))
865 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
868 return FEEL_EXCELLENT;
872 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
875 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
877 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
879 /* Good "armor" bonus */
880 if (o_ptr->to_a > 0) return FEEL_GOOD;
882 /* Good "weapon" bonus */
883 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
885 /* Default to "average" */
890 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 2 (Light).
891 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
892 * @return 擬似鑑定結果のIDを返す。
894 byte value_check_aux2(object_type *o_ptr)
896 /* Cursed items (all of them) */
897 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
899 /* Broken items (all of them) */
900 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
902 /* Artifacts -- except cursed/broken ones */
903 if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
905 /* Ego-Items -- except cursed/broken ones */
906 if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
908 /* Good armor bonus */
909 if (o_ptr->to_a > 0) return FEEL_UNCURSED;
911 /* Good weapon bonuses */
912 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
919 * @brief 未鑑定なベースアイテムの基本価格を返す /
920 * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
921 * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
922 * @return オブジェクトの未鑑定価格
924 static s32b object_value_base(object_type *o_ptr)
926 /* Aware item -- use template cost */
927 if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
929 /* Analyze the type */
934 case TV_FOOD: return (5L);
936 /* Un-aware Potions */
937 case TV_POTION: return (20L);
939 /* Un-aware Scrolls */
940 case TV_SCROLL: return (20L);
942 /* Un-aware Staffs */
943 case TV_STAFF: return (70L);
946 case TV_WAND: return (50L);
949 case TV_ROD: return (90L);
952 case TV_RING: return (45L);
954 /* Un-aware Amulets */
955 case TV_AMULET: return (45L);
957 /* Figurines, relative to monster level */
960 DEPTH level = r_info[o_ptr->pval].level;
961 if (level < 20) return level*50L;
962 else if (level < 30) return 1000+(level-20)*150L;
963 else if (level < 40) return 2500+(level-30)*350L;
964 else if (level < 50) return 6000+(level-40)*800L;
965 else return 14000+(level-50)*2000L;
969 if (!o_ptr->pval) return 1000L;
970 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
973 /* Paranoia -- Oops */
979 * @brief オブジェクトのフラグ類から価格を算出する /
980 * Return the value of the flags the object has...
981 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
982 * @param plusses フラグに与える価格の基本重み
983 * @return オブジェクトのフラグ価格
985 s32b flag_cost(object_type *o_ptr, int plusses)
988 BIT_FLAGS flgs[TR_FLAG_SIZE];
992 object_kind *k_ptr = &k_info[o_ptr->k_idx];
994 object_flags(o_ptr, flgs);
997 * Exclude fixed flags of the base item.
998 * pval bonuses of base item will be treated later.
1000 for (i = 0; i < TR_FLAG_SIZE; i++)
1001 flgs[i] &= ~(k_ptr->flags[i]);
1003 /* Exclude fixed flags of the fixed artifact. */
1004 if (object_is_fixed_artifact(o_ptr))
1006 artifact_type *a_ptr = &a_info[o_ptr->name1];
1008 for (i = 0; i < TR_FLAG_SIZE; i++)
1009 flgs[i] &= ~(a_ptr->flags[i]);
1012 /* Exclude fixed flags of the ego-item. */
1013 else if (object_is_ego(o_ptr))
1015 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1017 for (i = 0; i < TR_FLAG_SIZE; i++)
1018 flgs[i] &= ~(e_ptr->flags[i]);
1023 * Calucurate values of remaining flags
1025 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
1026 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
1027 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
1028 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
1029 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
1030 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
1031 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
1032 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
1033 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
1034 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
1035 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
1036 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
1037 total += (10000 + (2500 * plusses));
1038 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
1039 total += (10000 + (2500 * plusses));
1043 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
1044 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
1045 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
1046 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
1047 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
1048 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
1049 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
1050 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
1051 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
1052 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
1053 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
1054 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
1055 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
1056 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
1057 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
1058 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
1059 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
1060 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
1061 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
1062 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
1063 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
1065 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
1066 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
1067 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
1068 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
1069 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
1070 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
1071 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
1072 total += (tmp_cost * count);
1074 if (have_flag(flgs, TR_SUST_STR)) total += 850;
1075 if (have_flag(flgs, TR_SUST_INT)) total += 850;
1076 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
1077 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
1078 if (have_flag(flgs, TR_SUST_CON)) total += 850;
1079 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
1080 if (have_flag(flgs, TR_RIDING)) total += 0;
1081 if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
1082 if (have_flag(flgs, TR_THROW)) total += 5000;
1083 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
1084 if (have_flag(flgs, TR_HOLD_EXP)) total += 8500;
1088 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
1089 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
1090 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
1091 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
1092 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
1093 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
1094 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
1095 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
1096 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
1097 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
1098 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
1099 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
1100 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
1101 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
1102 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
1103 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
1104 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
1105 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
1106 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
1107 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
1108 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
1109 total += (tmp_cost * count);
1111 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
1112 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
1113 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1114 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1115 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1116 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1117 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1118 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1119 if (have_flag(flgs, TR_LEVITATION)) total += 1250;
1120 if (have_flag(flgs, TR_LITE_1)) total += 1500;
1121 if (have_flag(flgs, TR_LITE_2)) total += 2500;
1122 if (have_flag(flgs, TR_LITE_3)) total += 4000;
1123 if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
1124 if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
1125 if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
1126 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1127 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1128 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1129 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1130 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1131 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1132 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1133 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1134 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1135 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1136 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1137 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1138 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1139 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1140 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1141 if (have_flag(flgs, TR_REGEN)) total += 2500;
1142 if (have_flag(flgs, TR_WARNING)) total += 2000;
1143 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1144 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1145 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1146 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1147 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1148 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1149 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1150 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1151 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1152 if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
1153 if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
1154 if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
1155 if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
1156 if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
1157 if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
1158 if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
1159 if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
1160 if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
1161 if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
1162 if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
1163 if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
1164 if (have_flag(flgs, TR_TELEPORT))
1166 if (object_is_cursed(o_ptr))
1171 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1172 if (have_flag(flgs, TR_BLESSED)) total += 750;
1173 if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1174 if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1175 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1176 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1177 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1179 /* Also, give some extra for activatable powers... */
1180 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1182 const activation_type* const act_ptr = find_activation_info(o_ptr);
1184 total += act_ptr->value;
1193 * @brief オブジェクトの真の価格を算出する /
1194 * Return the value of the flags the object has...
1195 * @param o_ptr 本価格を確認したいオブジェクトの構造体参照ポインタ
1196 * @return オブジェクトの本価格
1198 * Return the "real" price of a "known" item, not including discounts\n
1200 * Wand and staffs get cost for each charge\n
1202 * Armor is worth an extra 100 gold per bonus point to armor class.\n
1204 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
1206 * Missiles are only worth 5 gold per bonus point, since they\n
1207 * usually appear in groups of 20, and we want the player to get\n
1208 * the same amount of cash for any "equivalent" item. Note that\n
1209 * missiles never have any of the "pval" flags, and in fact, they\n
1210 * only have a few of the available flags, primarily of the "slay"\n
1211 * and "brand" and "ignore" variety.\n
1213 * Armor with a negative armor bonus is worthless.\n
1214 * Weapons with negative hit+damage bonuses are worthless.\n
1216 * Every wearable item with a "pval" bonus is worth extra (see below).\n
1218 PRICE object_value_real(object_type *o_ptr)
1221 BIT_FLAGS flgs[TR_FLAG_SIZE];
1222 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1225 /* Hack -- "worthless" items */
1226 if (!k_info[o_ptr->k_idx].cost) return (0L);
1229 value = k_info[o_ptr->k_idx].cost;
1231 /* Extract some flags */
1232 object_flags(o_ptr, flgs);
1235 if (object_is_fixed_artifact(o_ptr))
1237 artifact_type *a_ptr = &a_info[o_ptr->name1];
1239 /* Hack -- "worthless" artifacts */
1240 if (!a_ptr->cost) return (0L);
1242 /* Hack -- Use the artifact cost instead */
1243 value = a_ptr->cost;
1244 value += flag_cost(o_ptr, o_ptr->pval);
1246 /* Don't add pval bonuses etc. */
1251 else if (object_is_ego(o_ptr))
1253 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1255 /* Hack -- "worthless" ego-items */
1256 if (!e_ptr->cost) return (0L);
1258 /* Hack -- Reward the ego-item with a bonus */
1259 value += e_ptr->cost;
1260 value += flag_cost(o_ptr, o_ptr->pval);
1268 for (i = 0; i < TR_FLAG_SIZE; i++)
1269 if (o_ptr->art_flags[i]) flag = TRUE;
1271 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1274 /* Analyze pval bonus for normal object */
1275 switch (o_ptr->tval)
1298 if (!o_ptr->pval) break;
1300 /* Hack -- Negative "pval" is always bad */
1301 if (o_ptr->pval < 0) return (0L);
1303 /* Give credit for stat bonuses */
1304 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1305 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1306 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1307 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1308 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1309 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1311 /* Give credit for stealth and searching */
1312 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1313 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1314 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1316 /* Give credit for infra-vision and tunneling */
1317 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1318 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1320 /* Give credit for extra attacks */
1321 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1323 /* Give credit for speed bonus */
1324 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1330 /* Analyze the item */
1331 switch (o_ptr->tval)
1336 /* Pay extra for charges, depending on standard number of
1337 * charges. Handle new-style wands correctly. -LM-
1339 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1345 /* Pay extra for charges, depending on standard number of
1348 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1357 /* Hack -- negative bonuses are bad */
1358 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1360 /* Give credit for bonuses */
1361 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1377 /* Hack -- negative armor bonus */
1378 if (o_ptr->to_a < 0) return (0L);
1380 /* Give credit for bonuses */
1381 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1393 /* Hack -- negative hit/damage bonuses */
1394 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1396 /* Factor in the bonuses */
1397 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1399 /* Hack -- Factor in extra damage dice and sides */
1400 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1401 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1411 /* Hack -- negative hit/damage bonuses */
1412 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1414 /* Factor in the bonuses */
1415 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1417 /* Hack -- Factor in extra damage dice and sides */
1418 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1419 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1424 /* Figurines, relative to monster level */
1427 DEPTH level = r_info[o_ptr->pval].level;
1428 if (level < 20) value = level*50L;
1429 else if (level < 30) value = 1000+(level-20)*150L;
1430 else if (level < 40) value = 2500+(level-30)*350L;
1431 else if (level < 50) value = 6000+(level-40)*800L;
1432 else value = 14000+(level-50)*2000L;
1438 if (!o_ptr->pval) value = 1000L;
1439 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1445 if (!o_ptr->pval) value = 0L;
1450 /* Worthless object */
1451 if (value < 0) return 0L;
1453 /* Return the value */
1459 * @brief オブジェクト価格算出のメインルーチン /
1460 * Return the price of an item including plusses (and charges)
1461 * @param o_ptr 判明している現価格を確認したいオブジェクトの構造体参照ポインタ
1462 * @return オブジェクトの判明している現価格
1464 * This function returns the "value" of the given item (qty one)\n
1466 * Never notice "unknown" bonuses or properties, including "curses",\n
1467 * since that would give the player information he did not have.\n
1469 * Note that discounted items stay discounted forever, even if\n
1470 * the discount is "forgotten" by the player via memory loss.\n
1472 PRICE object_value(object_type *o_ptr)
1476 /* Unknown items -- acquire a base value */
1477 if (object_is_known(o_ptr))
1479 /* Broken items -- worthless */
1480 if (object_is_broken(o_ptr)) return (0L);
1482 /* Cursed items -- worthless */
1483 if (object_is_cursed(o_ptr)) return (0L);
1485 /* Real value (see above) */
1486 value = object_value_real(o_ptr);
1489 /* Known items -- acquire the actual value */
1492 /* Hack -- Felt broken items */
1493 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1495 /* Hack -- Felt cursed items */
1496 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1498 /* Base value (see above) */
1499 value = object_value_base(o_ptr);
1503 /* Apply discount (if any) */
1504 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1507 /* Return the final value */
1514 * @brief 破壊可能なアイテムかを返す /
1515 * Determines whether an object can be destroyed, and makes fake inscription.
1516 * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
1517 * @return オブジェクトが破壊可能ならばTRUEを返す
1519 bool can_player_destroy_object(object_type *o_ptr)
1521 /* Artifacts cannot be destroyed */
1522 if (!object_is_artifact(o_ptr)) return TRUE;
1524 /* If object is unidentified, makes fake inscription */
1525 if (!object_is_known(o_ptr))
1527 byte feel = FEEL_SPECIAL;
1529 /* Hack -- Handle icky artifacts */
1530 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1532 /* Hack -- inscribe the artifact */
1533 o_ptr->feeling = feel;
1535 /* We have "felt" it (again) */
1536 o_ptr->ident |= (IDENT_SENSE);
1538 /* Combine the pack */
1539 p_ptr->notice |= (PN_COMBINE);
1541 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1546 /* Identified artifact -- Nothing to do */
1552 * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
1553 * Distribute charges of rods or wands.
1554 * @param o_ptr 分割元オブジェクトの構造体参照ポインタ source item
1555 * @param q_ptr 分割先オブジェクトの構造体参照ポインタ target item, must be of the same type as o_ptr
1556 * @param amt 分割したい回数量 number of items that are transfered
1559 * Hack -- If rods or wands are dropped, the total maximum timeout or\n
1560 * charges need to be allocated between the two stacks. If all the items\n
1561 * are being dropped, it makes for a neater message to leave the original\n
1562 * stack's pval alone. -LM-\n
1564 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1566 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1568 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1569 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1571 /* Hack -- Rods also need to have their timeouts distributed. The
1572 * dropped stack will accept all time remaining to charge up to its
1575 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1577 if (q_ptr->pval > o_ptr->timeout)
1578 q_ptr->timeout = o_ptr->timeout;
1580 q_ptr->timeout = q_ptr->pval;
1582 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1588 * @brief 魔法棒やロッドの使用回数を減らす /
1589 * @param o_ptr オブジェクトの構造体参照ポインタ source item
1590 * @param amt 減らしたい回数量 number of items that are transfered
1593 * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1594 * charges of the stack needs to be reduced, unless all the items are\n
1595 * being destroyed. -LM-\n
1597 void reduce_charges(object_type *o_ptr, int amt)
1599 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1600 (amt < o_ptr->number))
1602 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1607 * Determine if an item can "absorb" a second item
1609 * See "object_absorb()" for the actual "absorption" code.
1611 * If permitted, we allow staffs (if they are known to have equal charges
1612 * and both are either known or confirmed empty) and wands (if both are
1613 * either known or confirmed empty) and rods (in all cases) to combine.
1614 * Staffs will unstack (if necessary) when they are used, but wands and
1615 * rods will only unstack if one is dropped. -LM-
1617 * If permitted, we allow weapons/armor to stack, if fully "known".
1619 * Missiles will combine if both stacks have the same "known" status.
1620 * This is done to make unidentified stacks of missiles useful.
1622 * Food, potions, scrolls, and "easy know" items always stack.
1624 * Chests, and activatable items, never stack (for various reasons).
1628 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1630 #define MAX_STACK_SIZE 99
1634 * @brief 両オブジェクトをスロットに重ね合わせ可能な最大数を返す。
1635 * Determine if an item can partly absorb a second item. Return maximum number of stack.
1636 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1637 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1638 * @return 重ね合わせ可能なアイテム数
1640 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1644 /* Default maximum number of stack */
1645 int max_num = MAX_STACK_SIZE;
1647 /* Require identical object types */
1648 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1651 /* Analyze the items */
1652 switch (o_ptr->tval)
1654 /* Chests and Statues*/
1665 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1666 if (o_ptr->pval != j_ptr->pval) return 0;
1670 /* Figurines and Corpses*/
1675 if (o_ptr->pval != j_ptr->pval) return 0;
1681 /* Food and Potions and Scrolls */
1693 /* Require either knowledge or known empty for both staffs. */
1694 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1695 !object_is_known(o_ptr)) ||
1696 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1697 !object_is_known(j_ptr))) return 0;
1699 /* Require identical charges, since staffs are bulky. */
1700 if (o_ptr->pval != j_ptr->pval) return 0;
1709 /* Require either knowledge or known empty for both wands. */
1710 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1711 !object_is_known(o_ptr)) ||
1712 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1713 !object_is_known(j_ptr))) return 0;
1715 /* Wand charges combine in O&ZAngband. */
1721 /* Staffs and Wands and Rods */
1724 /* Prevent overflaw of timeout */
1725 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1731 /* Weapons and Armor */
1747 /* Rings, Amulets, Lites */
1753 /* Require full knowledge of both items */
1754 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1764 /* Require identical knowledge of both items */
1765 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1766 if (o_ptr->feeling != j_ptr->feeling) return 0;
1768 /* Require identical "bonuses" */
1769 if (o_ptr->to_h != j_ptr->to_h) return 0;
1770 if (o_ptr->to_d != j_ptr->to_d) return 0;
1771 if (o_ptr->to_a != j_ptr->to_a) return 0;
1773 /* Require identical "pval" code */
1774 if (o_ptr->pval != j_ptr->pval) return 0;
1776 /* Artifacts never stack */
1777 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1779 /* Require identical "ego-item" names */
1780 if (o_ptr->name2 != j_ptr->name2) return 0;
1782 /* Require identical added essence */
1783 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1784 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1786 /* Hack -- Never stack "powerful" items */
1787 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1789 /* Hack -- Never stack recharging items */
1790 if (o_ptr->timeout || j_ptr->timeout) return 0;
1792 /* Require identical "values" */
1793 if (o_ptr->ac != j_ptr->ac) return 0;
1794 if (o_ptr->dd != j_ptr->dd) return 0;
1795 if (o_ptr->ds != j_ptr->ds) return 0;
1804 /* Require knowledge */
1805 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1813 /* Hack -- Identical art_flags! */
1814 for (i = 0; i < TR_FLAG_SIZE; i++)
1815 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1817 /* Hack -- Require identical "cursed" status */
1818 if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1820 /* Hack -- Require identical "broken" status */
1821 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1824 /* Hack -- require semi-matching "inscriptions" */
1825 if (o_ptr->inscription && j_ptr->inscription &&
1826 (o_ptr->inscription != j_ptr->inscription))
1829 /* Hack -- normally require matching "inscriptions" */
1830 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1832 /* Hack -- normally require matching "discounts" */
1833 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1836 /* They match, so they must be similar */
1841 * @brief 両オブジェクトをスロットに重ねることができるかどうかを返す。
1842 * Determine if an item can absorb a second item.
1843 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1844 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1845 * @return 重ね合わせ可能ならばTRUEを返す。
1847 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1849 int total = o_ptr->number + j_ptr->number;
1852 /* Are these objects similar? */
1853 max_num = object_similar_part(o_ptr, j_ptr);
1855 /* Return if not similar */
1856 if (!max_num) return FALSE;
1858 /* Maximal "stacking" limit */
1859 if (total > max_num) return (0);
1862 /* They match, so they must be similar */
1868 * @brief 両オブジェクトをスロットに重ね合わせる。
1869 * Allow one item to "absorb" another, assuming they are similar
1870 * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
1871 * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
1874 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1876 int max_num = object_similar_part(o_ptr, j_ptr);
1877 int total = o_ptr->number + j_ptr->number;
1878 int diff = (total > max_num) ? total - max_num : 0;
1880 /* Combine quantity, lose excess items */
1881 o_ptr->number = (total > max_num) ? max_num : total;
1883 /* Hack -- blend "known" status */
1884 if (object_is_known(j_ptr)) object_known(o_ptr);
1886 /* Hack -- clear "storebought" if only one has it */
1887 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1888 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1890 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1891 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1894 /* Hack -- blend "mental" status */
1895 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1897 /* Hack -- blend "inscriptions" */
1898 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1900 /* Hack -- blend "feelings" */
1901 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1903 /* Hack -- could average discounts */
1904 /* Hack -- save largest discount */
1905 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1907 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1908 if (o_ptr->tval == TV_ROD)
1910 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1911 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1914 /* Hack -- if wands are stacking, combine the charges. -LM- */
1915 if (o_ptr->tval == TV_WAND)
1917 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1923 * @brief tvalとsvalに対応するベースアイテムのIDを返す。
1924 * Find the index of the object_kind with the given tval and sval
1925 * @param tval 検索したいベースアイテムのtval
1926 * @param sval 検索したいベースアイテムのsval
1929 IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval)
1936 for (k = 1; k < max_k_idx; k++)
1938 object_kind *k_ptr = &k_info[k];
1940 /* Require correct tval */
1941 if (k_ptr->tval != tval) continue;
1944 if (k_ptr->sval == sval) return (k);
1946 /* Ignore illegal items */
1947 if (sval != SV_ANY) continue;
1949 /* Apply the randomizer */
1950 if (!one_in_(++num)) continue;
1952 /* Use this value */
1956 /* Return this choice */
1963 msg_format(_("アイテムがない (%d,%d)", "No object (%d,%d)"), tval, sval);
1972 * @brief オブジェクトを初期化する
1973 * Wipe an object clean.
1974 * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
1977 void object_wipe(object_type *o_ptr)
1979 /* Wipe the structure */
1980 (void)WIPE(o_ptr, object_type);
1985 * @brief オブジェクトを複製する
1986 * Wipe an object clean.
1987 * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
1988 * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
1991 void object_copy(object_type *o_ptr, object_type *j_ptr)
1993 /* Copy the structure */
1994 (void)COPY(o_ptr, j_ptr, object_type);
1999 * @brief オブジェクト構造体にベースアイテムを作成する
2000 * Prepare an object based on an object kind.
2001 * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
2002 * @param k_idx 新たに作成したいベースアイテム情報のID
2005 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
2007 object_kind *k_ptr = &k_info[k_idx];
2009 /* Clear the record */
2012 /* Save the kind index */
2013 o_ptr->k_idx = k_idx;
2015 /* Efficiency -- tval/sval */
2016 o_ptr->tval = k_ptr->tval;
2017 o_ptr->sval = k_ptr->sval;
2019 /* Default "pval" */
2020 o_ptr->pval = k_ptr->pval;
2022 /* Default number */
2025 /* Default weight */
2026 o_ptr->weight = k_ptr->weight;
2029 o_ptr->to_h = k_ptr->to_h;
2030 o_ptr->to_d = k_ptr->to_d;
2031 o_ptr->to_a = k_ptr->to_a;
2034 o_ptr->ac = k_ptr->ac;
2035 o_ptr->dd = k_ptr->dd;
2036 o_ptr->ds = k_ptr->ds;
2038 /* Default activation */
2039 if (k_ptr->act_idx > 0) o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
2041 /* Hack -- worthless items are always "broken" */
2042 if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
2044 /* Hack -- cursed items are always "cursed" */
2045 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
2046 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2047 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
2048 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2049 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2050 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2055 * @brief 上質以上のオブジェクトに与えるための各種ボーナスを正規乱数も加えて算出する。
2056 * Help determine an "enchantment bonus" for an object.
2057 * @param max ボーナス値の限度
2058 * @param level ボーナス値に加味する基準生成階
2059 * @return 算出されたボーナス値
2061 * To avoid floating point but still provide a smooth distribution of bonuses,\n
2062 * we simply round the results of division in such a way as to "average" the\n
2063 * correct floating point value.\n
2065 * This function has been changed. It uses "randnor()" to choose values from\n
2066 * a normal distribution, whose mean moves from zero towards the max as the\n
2067 * level increases, and whose standard deviation is equal to 1/4 of the max,\n
2068 * and whose values are forced to lie between zero and the max, inclusive.\n
2070 * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
2071 * rare to get the "full" enchantment on an object, even a deep levels.\n
2073 * It is always possible (albeit unlikely) to get the "full" enchantment.\n
2075 * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
2077 * N 0 1 2 3 4 5 6 7 8 9 10\n
2078 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n
2079 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03\n
2080 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05\n
2081 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05\n
2082 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11\n
2083 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41\n
2084 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65\n
2085 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94\n
2086 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78\n
2087 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64\n
2088 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62\n
2089 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33\n
2090 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38\n
2091 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53\n
2092 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53\n
2093 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27\n
2094 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72\n
2095 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07\n
2097 int m_bonus(int max, DEPTH level)
2099 int bonus, stand, extra, value;
2102 /* Paranoia -- enforce maximal "level" */
2103 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
2106 /* The "bonus" moves towards the max */
2107 bonus = ((max * level) / MAX_DEPTH);
2109 /* Hack -- determine fraction of error */
2110 extra = ((max * level) % MAX_DEPTH);
2112 /* Hack -- simulate floating point computations */
2113 if (randint0(MAX_DEPTH) < extra) bonus++;
2116 /* The "stand" is equal to one quarter of the max */
2119 /* Hack -- determine fraction of error */
2122 /* Hack -- simulate floating point computations */
2123 if (randint0(4) < extra) stand++;
2126 /* Choose an "interesting" value */
2127 value = randnor(bonus, stand);
2129 /* Enforce the minimum value */
2130 if (value < 0) return (0);
2132 /* Enforce the maximum value */
2133 if (value > max) return (max);
2139 * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user
2140 * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ
2143 static void object_mention(object_type *o_ptr)
2145 char o_name[MAX_NLEN];
2147 object_aware(o_ptr);
2148 object_known(o_ptr);
2150 /* Mark the item as fully known */
2151 o_ptr->ident |= (IDENT_MENTAL);
2154 object_desc(o_name, o_ptr, 0);
2155 msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name);
2159 * @brief INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2160 * Mega-Hack -- Attempt to create one of the "Special Objects"
2161 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2162 * @return 生成に成功したらTRUEを返す。
2164 * We are only called from "make_object()", and we assume that\n
2165 * "apply_magic()" is called immediately after we return.\n
2167 * Note -- see "make_artifact()" and "apply_magic()"\n
2169 static bool make_artifact_special(object_type *o_ptr)
2172 KIND_OBJECT_IDX k_idx = 0;
2174 /*! @note 地上ではキャンセルする / No artifacts in the town */
2175 if (!dun_level) return (FALSE);
2177 /*! @note get_obj_num_hookによる指定がある場合は生成をキャンセルする / Themed object */
2178 if (get_obj_num_hook) return (FALSE);
2180 /*! @note 全固定アーティファクト中からIDの若い順に生成対象とその確率を走査する / Check the artifact list (just the "specials") */
2181 for (i = 0; i < max_a_idx; i++)
2183 artifact_type *a_ptr = &a_info[i];
2185 /*! @note アーティファクト名が空の不正なデータは除外する / Skip "empty" artifacts */
2186 if (!a_ptr->name) continue;
2188 /*! @note 既に生成回数がカウントされたアーティファクト、QUESTITEMと非INSTA_ARTは除外 / Cannot make an artifact twice */
2189 if (a_ptr->cur_num) continue;
2190 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2191 if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue;
2193 /*! @note アーティファクト生成階が現在に対して足りない場合は高確率で1/(不足階層*2)を満たさないと生成リストに加えられない /
2194 * XXX XXX Enforce minimum "depth" (loosely) */
2195 if (a_ptr->level > object_level)
2197 /* @note / Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2198 int d = (a_ptr->level - object_level) * 2;
2199 if (!one_in_(d)) continue;
2202 /*! @note 1/(レア度)の確率を満たさないと除外される / Artifact "rarity roll" */
2203 if (!one_in_(a_ptr->rarity)) continue;
2205 /*! @note INSTA_ART型固定アーティファクトのベースアイテムもチェック対象とする。ベースアイテムの生成階層が足りない場合1/(不足階層*5) を満たさないと除外される。 /
2206 * Find the base object. XXX XXX Enforce minimum "object" level (loosely). Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2207 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2208 if (k_info[k_idx].level > object_level)
2210 int d = (k_info[k_idx].level - object_level) * 5;
2211 if (!one_in_(d)) continue;
2214 /*! @note 前述の条件を満たしたら、後のIDのアーティファクトはチェックせずすぐ確定し生成処理に移す /
2215 * Assign the template. Mega-Hack -- mark the item as an artifact. Hack: Some artifacts get random extra powers. Success. */
2216 object_prep(o_ptr, k_idx);
2219 random_artifact_resistance(o_ptr, a_ptr);
2223 /*! @note 全INSTA_ART固定アーティファクトを試行しても決まらなかった場合 FALSEを返す / Failure */
2229 * @brief 非INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2230 * Mega-Hack -- Attempt to create one of the "Special Objects"
2231 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2232 * @return 生成に成功したらTRUEを返す。
2234 * Attempt to change an object into an artifact\n
2235 * This routine should only be called by "apply_magic()"\n
2236 * Note -- see "make_artifact_special()" and "apply_magic()"\n
2238 static bool make_artifact(object_type *o_ptr)
2243 /* No artifacts in the town */
2244 if (!dun_level) return (FALSE);
2246 /* Paranoia -- no "plural" artifacts */
2247 if (o_ptr->number != 1) return (FALSE);
2249 /* Check the artifact list (skip the "specials") */
2250 for (i = 0; i < max_a_idx; i++)
2252 artifact_type *a_ptr = &a_info[i];
2254 /* Skip "empty" items */
2255 if (!a_ptr->name) continue;
2257 /* Cannot make an artifact twice */
2258 if (a_ptr->cur_num) continue;
2260 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2262 if (a_ptr->gen_flags & TRG_INSTA_ART) continue;
2264 /* Must have the correct fields */
2265 if (a_ptr->tval != o_ptr->tval) continue;
2266 if (a_ptr->sval != o_ptr->sval) continue;
2268 /* XXX XXX Enforce minimum "depth" (loosely) */
2269 if (a_ptr->level > dun_level)
2271 /* Acquire the "out-of-depth factor" */
2272 int d = (a_ptr->level - dun_level) * 2;
2274 /* Roll for out-of-depth creation */
2275 if (!one_in_(d)) continue;
2278 /* We must make the "rarity roll" */
2279 if (!one_in_(a_ptr->rarity)) continue;
2281 /* Hack -- mark the item as an artifact */
2284 /* Hack: Some artifacts get random extra powers */
2285 random_artifact_resistance(o_ptr, a_ptr);
2297 * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
2298 * Choose random ego type
2299 * @param slot 取得したいエゴの装備部位
2300 * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
2301 * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
2303 static byte get_random_ego(byte slot, bool good)
2306 ego_item_type *e_ptr;
2310 for (i = 1; i < max_e_idx; i++)
2314 if (e_ptr->slot == slot
2315 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2318 total += (255 / e_ptr->rarity);
2322 value = randint1(total);
2324 for (i = 1; i < max_e_idx; i++)
2328 if (e_ptr->slot == slot
2329 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2332 value -= (255 / e_ptr->rarity);
2333 if (value <= 0L) break;
2341 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2342 * Apply magic to an item known to be a "weapon"
2343 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2344 * @param level 生成基準階
2345 * @param power 生成ランク
2348 * Hack -- note special base damage dice boosting\n
2349 * Hack -- note special processing for weapon/digger\n
2351 static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
2353 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
2354 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
2356 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
2357 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
2359 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2361 tohit2 = (tohit2+1)/2;
2362 todam2 = (todam2+1)/2;
2369 o_ptr->to_h += tohit1;
2370 o_ptr->to_d += todam1;
2376 o_ptr->to_h += tohit2;
2377 o_ptr->to_d += todam2;
2385 o_ptr->to_h -= tohit1;
2386 o_ptr->to_d -= todam1;
2391 /* Penalize again */
2392 o_ptr->to_h -= tohit2;
2393 o_ptr->to_d -= todam2;
2396 /* Cursed (if "bad") */
2397 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2400 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2403 switch (o_ptr->tval)
2410 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2411 create_artifact(o_ptr, FALSE);
2413 /* Special Ego-item */
2414 o_ptr->name2 = EGO_DIGGING;
2418 else if (power < -1)
2420 /* Hack -- Horrible digging bonus */
2421 o_ptr->pval = 0 - (5 + randint1(5));
2427 /* Hack -- Reverse digging bonus */
2428 o_ptr->pval = 0 - (o_ptr->pval);
2442 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2444 create_artifact(o_ptr, FALSE);
2449 /* Roll for an ego-item */
2450 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2451 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2453 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2455 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2460 switch (o_ptr->name2)
2463 if (one_in_(4) && (level > 40))
2464 add_flag(o_ptr->art_flags, TR_BLOWS);
2468 add_flag(o_ptr->art_flags, TR_RES_POIS);
2470 add_flag(o_ptr->art_flags, TR_WARNING);
2472 case EGO_KILL_DRAGON:
2474 add_flag(o_ptr->art_flags, TR_RES_POIS);
2478 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2480 case EGO_SLAYING_WEAPON:
2481 if (one_in_(3)) /* double damage */
2489 while (one_in_(o_ptr->dd));
2495 while (one_in_(o_ptr->ds));
2500 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2502 if (o_ptr->tval == TV_SWORD && one_in_(3))
2504 add_flag(o_ptr->art_flags, TR_VORPAL);
2509 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2515 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
2517 add_flag(o_ptr->art_flags, TR_DEX);
2519 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2522 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
2524 case EGO_EARTHQUAKES:
2525 if (one_in_(3) && (level > 60))
2526 add_flag(o_ptr->art_flags, TR_BLOWS);
2528 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
2532 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2536 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2538 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2540 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2541 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2544 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2545 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2546 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2547 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2551 if (!o_ptr->art_name)
2553 /* Hack -- Super-charge the damage dice */
2554 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2556 /* Hack -- Lower the damage dice */
2557 if (o_ptr->dd > 9) o_ptr->dd = 9;
2562 else if (power < -1)
2564 /* Roll for ego-item */
2565 if (randint0(MAX_DEPTH) < level)
2569 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2570 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2576 switch (o_ptr->name2)
2579 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2580 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2582 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2583 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2584 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2585 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2586 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2587 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2601 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2603 create_artifact(o_ptr, FALSE);
2606 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2620 if (power > 2) /* power > 2 is debug only */
2622 create_artifact(o_ptr, FALSE);
2626 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2628 switch (o_ptr->name2)
2630 case EGO_SLAYING_BOLT:
2635 /* Hack -- super-charge the damage dice */
2636 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2638 /* Hack -- restrict the damage dice */
2639 if (o_ptr->dd > 9) o_ptr->dd = 9;
2643 else if (power < -1)
2645 /* Roll for ego-item */
2646 if (randint0(MAX_DEPTH) < level)
2648 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2658 * @brief ドラゴン装備にランダムな耐性を与える
2659 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2662 static void dragon_resist(object_type * o_ptr)
2667 one_dragon_ele_resistance(o_ptr);
2669 one_high_resistance(o_ptr);
2675 * @brief オブジェクトにランダムな強いESPを与える
2676 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2679 static bool add_esp_strong(object_type *o_ptr)
2681 bool nonliv = FALSE;
2683 switch (randint1(3))
2685 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2686 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2687 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2694 * @brief オブジェクトにランダムな弱いESPを与える
2695 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2696 * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3)
2699 static void add_esp_weak(object_type *o_ptr, bool extra)
2702 u32b weak_esp_list[] = {
2714 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2715 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2717 /* Add unduplicated weak esp flags randomly */
2718 for (i = 0; i < add_count; ++ i)
2720 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2722 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2723 weak_esp_list[choice] = weak_esp_list[i];
2729 * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2730 * Apply magic to an item known to be "armor"
2731 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2732 * @param level 生成基準階
2733 * @param power 生成ランク
2736 * Hack -- note special processing for crown/helm\n
2737 * Hack -- note special processing for robe of permanence\n
2739 static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
2741 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
2742 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
2748 o_ptr->to_a += toac1;
2754 o_ptr->to_a += toac2;
2762 o_ptr->to_a -= toac1;
2767 /* Penalize again */
2768 o_ptr->to_a -= toac2;
2771 /* Cursed (if "bad") */
2772 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2777 switch (o_ptr->tval)
2781 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2782 create_artifact(o_ptr, FALSE);
2792 /* Hack -- Try for "Robes of the Magi" */
2793 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2794 (o_ptr->sval == SV_ROBE) &&
2795 (randint0(100) < 15))
2799 o_ptr->name2 = EGO_YOIYAMI;
2800 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2801 o_ptr->sval = SV_YOIYAMI_ROBE;
2807 o_ptr->name2 = EGO_PERMANENCE;
2812 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2814 create_artifact(o_ptr, FALSE);
2820 bool okay_flag = TRUE;
2822 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2824 switch (o_ptr->name2)
2827 if (o_ptr->tval != TV_HARD_ARMOR)
2833 if (o_ptr->tval != TV_SOFT_ARMOR)
2842 if (okay_flag) break;
2844 switch (o_ptr->name2)
2846 case EGO_RESISTANCE:
2848 add_flag(o_ptr->art_flags, TR_RES_POIS);
2851 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2852 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2856 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2858 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2860 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2861 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2863 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2864 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2865 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2866 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2867 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2868 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2869 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2870 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2873 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2874 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2875 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2876 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2877 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2878 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2891 if (o_ptr->sval == SV_DRAGON_SHIELD)
2893 dragon_resist(o_ptr);
2894 if (!one_in_(3)) break;
2900 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2902 create_artifact(o_ptr, FALSE);
2908 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2909 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
2910 && o_ptr->name2 == EGO_S_DWARVEN)
2917 switch (o_ptr->name2)
2920 if (!one_in_(3)) one_high_resistance(o_ptr);
2921 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2923 case EGO_REFLECTION:
2924 if (o_ptr->sval == SV_MIRROR_SHIELD)
2929 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2930 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2939 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2941 dragon_resist(o_ptr);
2942 if (!one_in_(3)) break;
2946 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2948 create_artifact(o_ptr, FALSE);
2951 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2955 else if (power < -1)
2957 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2965 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2967 dragon_resist(o_ptr);
2968 if (!one_in_(3)) break;
2973 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2975 create_artifact(o_ptr, FALSE);
2978 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
2980 switch (o_ptr->name2)
2982 case EGO_SLOW_DESCENT:
2985 one_high_resistance(o_ptr);
2991 else if (power < -1)
2993 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
3004 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3006 create_artifact(o_ptr, FALSE);
3011 bool ok_flag = TRUE;
3012 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3014 switch (o_ptr->name2)
3017 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
3018 else add_esp_weak(o_ptr, FALSE);
3022 case EGO_REGENERATION:
3023 case EGO_LORDLINESS:
3029 if (one_in_(2)) add_esp_strong(o_ptr);
3030 else add_esp_weak(o_ptr, FALSE);
3033 default:/* not existing crown (wisdom,lite, etc...) */
3037 break; /* while (1) */
3043 else if (power < -1)
3047 bool ok_flag = TRUE;
3048 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3050 switch (o_ptr->name2)
3052 case EGO_ANCIENT_CURSE:
3053 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
3054 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
3055 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3056 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3057 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3058 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3062 break; /* while (1) */
3071 if (o_ptr->sval == SV_DRAGON_HELM)
3073 dragon_resist(o_ptr);
3074 if (!one_in_(3)) break;
3080 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3082 create_artifact(o_ptr, FALSE);
3087 bool ok_flag = TRUE;
3088 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3090 switch (o_ptr->name2)
3092 case EGO_BRILLIANCE:
3094 case EGO_INFRAVISION:
3095 case EGO_H_PROTECTION:
3100 if (one_in_(2)) add_esp_strong(o_ptr);
3101 else add_esp_weak(o_ptr, FALSE);
3105 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
3106 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
3109 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3111 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
3113 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
3114 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3116 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3117 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
3118 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
3119 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3120 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3121 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3122 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3123 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
3125 default:/* not existing helm (Magi, Might, etc...)*/
3129 break; /* while (1) */
3134 else if (power < -1)
3138 bool ok_flag = TRUE;
3139 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3141 switch (o_ptr->name2)
3143 case EGO_ANCIENT_CURSE:
3147 break; /* while (1) */
3158 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3160 create_artifact(o_ptr, FALSE);
3163 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
3165 switch (o_ptr->name2)
3174 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
3175 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
3176 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
3177 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3184 else if (power < -1)
3186 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3197 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
3198 * Apply magic to an item known to be a "ring" or "amulet"
3199 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3200 * @param level 生成基準階
3201 * @param power 生成ランク
3204 * Hack -- note special "pval boost" code for ring of speed\n
3205 * Hack -- note that some items must be cursed (or blessed)\n
3207 static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
3209 /* Apply magic (good or bad) according to type */
3210 switch (o_ptr->tval)
3215 switch (o_ptr->sval)
3217 case SV_RING_ATTACKS:
3220 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
3221 if (one_in_(15)) o_ptr->pval++;
3222 if (o_ptr->pval < 1) o_ptr->pval = 1;
3228 o_ptr->ident |= (IDENT_BROKEN);
3231 o_ptr->curse_flags |= TRC_CURSED;
3234 o_ptr->pval = 0 - (o_ptr->pval);
3245 /* Strength, Constitution, Dexterity, Intelligence */
3251 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3257 o_ptr->ident |= (IDENT_BROKEN);
3260 o_ptr->curse_flags |= TRC_CURSED;
3263 o_ptr->pval = 0 - (o_ptr->pval);
3269 /* Ring of Speed! */
3272 /* Base speed (1 to 10) */
3273 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3275 /* Super-charge the ring */
3276 while (randint0(100) < 50) o_ptr->pval++;
3282 o_ptr->ident |= (IDENT_BROKEN);
3285 o_ptr->curse_flags |= TRC_CURSED;
3288 o_ptr->pval = 0 - (o_ptr->pval);
3296 case SV_RING_LORDLY:
3300 one_lordly_high_resistance(o_ptr);
3304 /* Bonus to armor class */
3305 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3309 case SV_RING_WARNING:
3311 if (one_in_(3)) one_low_esp(o_ptr);
3316 case SV_RING_SEARCHING:
3318 /* Bonus to searching */
3319 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3325 o_ptr->ident |= (IDENT_BROKEN);
3328 o_ptr->curse_flags |= TRC_CURSED;
3331 o_ptr->pval = 0 - (o_ptr->pval);
3337 /* Flames, Acid, Ice */
3338 case SV_RING_FLAMES:
3343 /* Bonus to armor class */
3344 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3348 /* Weakness, Stupidity */
3349 case SV_RING_WEAKNESS:
3350 case SV_RING_STUPIDITY:
3353 o_ptr->ident |= (IDENT_BROKEN);
3356 o_ptr->curse_flags |= TRC_CURSED;
3359 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3360 if (power > 0) power = 0 - power;
3365 /* WOE, Stupidity */
3369 o_ptr->ident |= (IDENT_BROKEN);
3372 o_ptr->curse_flags |= TRC_CURSED;
3375 o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
3376 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3377 if (power > 0) power = 0 - power;
3382 /* Ring of damage */
3383 case SV_RING_DAMAGE:
3385 /* Bonus to damage */
3386 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
3392 o_ptr->ident |= (IDENT_BROKEN);
3395 o_ptr->curse_flags |= TRC_CURSED;
3398 o_ptr->to_d = 0 - o_ptr->to_d;
3404 /* Ring of Accuracy */
3405 case SV_RING_ACCURACY:
3408 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
3414 o_ptr->ident |= (IDENT_BROKEN);
3417 o_ptr->curse_flags |= TRC_CURSED;
3420 o_ptr->to_h = 0 - o_ptr->to_h;
3426 /* Ring of Protection */
3427 case SV_RING_PROTECTION:
3429 /* Bonus to armor class */
3430 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
3436 o_ptr->ident |= (IDENT_BROKEN);
3439 o_ptr->curse_flags |= TRC_CURSED;
3442 o_ptr->to_a = 0 - o_ptr->to_a;
3448 /* Ring of Slaying */
3449 case SV_RING_SLAYING:
3451 /* Bonus to damage and to hit */
3452 o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
3453 o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
3459 o_ptr->ident |= (IDENT_BROKEN);
3462 o_ptr->curse_flags |= TRC_CURSED;
3464 /* Reverse bonuses */
3465 o_ptr->to_h = 0 - o_ptr->to_h;
3466 o_ptr->to_d = 0 - o_ptr->to_d;
3472 case SV_RING_MUSCLE:
3474 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
3475 if (one_in_(4)) o_ptr->pval++;
3481 o_ptr->ident |= (IDENT_BROKEN);
3484 o_ptr->curse_flags |= TRC_CURSED;
3486 /* Reverse bonuses */
3487 o_ptr->pval = 0 - o_ptr->pval;
3492 case SV_RING_AGGRAVATION:
3495 o_ptr->ident |= (IDENT_BROKEN);
3498 o_ptr->curse_flags |= TRC_CURSED;
3500 if (power > 0) power = 0 - power;
3504 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3505 || (power > 2)) /* power > 2 is debug only */
3507 o_ptr->pval = MIN(o_ptr->pval, 4);
3508 /* Randart amulet */
3509 create_artifact(o_ptr, FALSE);
3511 else if ((power == 2) && one_in_(2))
3513 while(!o_ptr->name2)
3515 int tmp = m_bonus(10, level);
3516 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3517 switch(randint1(28))
3520 o_ptr->name2 = EGO_RING_THROW;
3523 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3524 o_ptr->name2 = EGO_RING_REGEN;
3527 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3528 o_ptr->name2 = EGO_RING_LITE;
3531 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3532 o_ptr->name2 = EGO_RING_TELEPORT;
3535 if (o_ptr->to_h) break;
3536 o_ptr->name2 = EGO_RING_TO_H;
3539 if (o_ptr->to_d) break;
3540 o_ptr->name2 = EGO_RING_TO_D;
3543 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3544 o_ptr->name2 = EGO_RING_SLAY;
3547 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3548 o_ptr->name2 = EGO_RING_WIZARD;
3551 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3552 o_ptr->name2 = EGO_RING_HERO;
3555 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3556 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3557 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3558 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3561 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3562 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;
3563 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3564 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3565 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3568 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3569 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;
3570 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3571 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3572 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3575 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3576 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;
3577 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3578 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3581 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3582 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;
3583 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3584 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3586 case 21: case 22: case 23: case 24: case 25: case 26:
3587 switch (o_ptr->sval)
3590 if (!one_in_(3)) break;
3591 o_ptr->name2 = EGO_RING_D_SPEED;
3593 case SV_RING_DAMAGE:
3594 case SV_RING_ACCURACY:
3595 case SV_RING_SLAYING:
3596 if (one_in_(2)) break;
3597 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3600 o_ptr->name2 = EGO_RING_BERSERKER;
3601 o_ptr->to_h -= 2+randint1(4);
3602 o_ptr->to_d += 2+randint1(4);
3605 case SV_RING_PROTECTION:
3606 o_ptr->name2 = EGO_RING_SUPER_AC;
3607 o_ptr->to_a += 7 + m_bonus(5, level);
3609 case SV_RING_RES_FEAR:
3610 o_ptr->name2 = EGO_RING_HERO;
3613 if (one_in_(2)) break;
3614 o_ptr->name2 = EGO_RING_HUNTER;
3616 case SV_RING_SEARCHING:
3617 o_ptr->name2 = EGO_RING_STEALTH;
3619 case SV_RING_TELEPORTATION:
3620 o_ptr->name2 = EGO_RING_TELE_AWAY;
3622 case SV_RING_RES_BLINDNESS:
3624 o_ptr->name2 = EGO_RING_RES_LITE;
3626 o_ptr->name2 = EGO_RING_RES_DARK;
3628 case SV_RING_LORDLY:
3629 if (!one_in_(20)) break;
3630 one_lordly_high_resistance(o_ptr);
3631 one_lordly_high_resistance(o_ptr);
3632 o_ptr->name2 = EGO_RING_TRUE;
3634 case SV_RING_SUSTAIN:
3635 if (!one_in_(4)) break;
3636 o_ptr->name2 = EGO_RING_RES_TIME;
3638 case SV_RING_FLAMES:
3639 if (!one_in_(2)) break;
3640 o_ptr->name2 = EGO_RING_DRAGON_F;
3643 if (!one_in_(2)) break;
3644 o_ptr->name2 = EGO_RING_DRAGON_C;
3646 case SV_RING_WARNING:
3647 if (!one_in_(2)) break;
3648 o_ptr->name2 = EGO_RING_M_DETECT;
3657 o_ptr->curse_flags = 0L;
3659 else if ((power == -2) && one_in_(2))
3661 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3662 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3663 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3664 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3665 o_ptr->art_flags[0] = 0;
3666 o_ptr->art_flags[1] = 0;
3667 while(!o_ptr->name2)
3669 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3673 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3674 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3677 o_ptr->name2 = EGO_RING_NO_MELEE;
3680 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3681 o_ptr->name2 = EGO_RING_AGGRAVATE;
3684 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3685 o_ptr->name2 = EGO_RING_TY_CURSE;
3688 o_ptr->name2 = EGO_RING_ALBINO;
3693 o_ptr->ident |= (IDENT_BROKEN);
3696 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3704 switch (o_ptr->sval)
3706 /* Amulet of wisdom/charisma */
3707 case SV_AMULET_INTELLIGENCE:
3708 case SV_AMULET_WISDOM:
3709 case SV_AMULET_CHARISMA:
3711 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3717 o_ptr->ident |= (IDENT_BROKEN);
3720 o_ptr->curse_flags |= (TRC_CURSED);
3722 /* Reverse bonuses */
3723 o_ptr->pval = 0 - o_ptr->pval;
3729 /* Amulet of brilliance */
3730 case SV_AMULET_BRILLIANCE:
3732 o_ptr->pval = 1 + m_bonus(3, level);
3733 if (one_in_(4)) o_ptr->pval++;
3739 o_ptr->ident |= (IDENT_BROKEN);
3742 o_ptr->curse_flags |= (TRC_CURSED);
3744 /* Reverse bonuses */
3745 o_ptr->pval = 0 - o_ptr->pval;
3751 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3755 o_ptr->curse_flags |= (TRC_CURSED);
3760 case SV_AMULET_RESISTANCE:
3762 if (one_in_(5)) one_high_resistance(o_ptr);
3763 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3767 /* Amulet of searching */
3768 case SV_AMULET_SEARCHING:
3770 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
3776 o_ptr->ident |= (IDENT_BROKEN);
3779 o_ptr->curse_flags |= (TRC_CURSED);
3781 /* Reverse bonuses */
3782 o_ptr->pval = 0 - (o_ptr->pval);
3788 /* Amulet of the Magi -- never cursed */
3789 case SV_AMULET_THE_MAGI:
3791 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3792 o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
3794 /* gain one low ESP */
3795 add_esp_weak(o_ptr, FALSE);
3800 /* Amulet of Doom -- always cursed */
3801 case SV_AMULET_DOOM:
3804 o_ptr->ident |= (IDENT_BROKEN);
3807 o_ptr->curse_flags |= (TRC_CURSED);
3810 o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
3811 o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
3812 if (power > 0) power = 0 - power;
3817 case SV_AMULET_MAGIC_MASTERY:
3819 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
3825 o_ptr->ident |= (IDENT_BROKEN);
3828 o_ptr->curse_flags |= (TRC_CURSED);
3830 /* Reverse bonuses */
3831 o_ptr->pval = 0 - o_ptr->pval;
3837 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3838 || (power > 2)) /* power > 2 is debug only */
3840 o_ptr->pval = MIN(o_ptr->pval, 4);
3841 /* Randart amulet */
3842 create_artifact(o_ptr, FALSE);
3844 else if ((power == 2) && one_in_(2))
3846 while(!o_ptr->name2)
3848 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3849 switch(randint1(21))
3852 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3853 o_ptr->name2 = EGO_AMU_SLOW_D;
3856 if (o_ptr->pval) break;
3857 o_ptr->name2 = EGO_AMU_INFRA;
3860 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3861 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3864 if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
3865 o_ptr->name2 = EGO_AMU_HOLD_EXP;
3868 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3869 o_ptr->name2 = EGO_AMU_LEVITATION;
3871 case 10: case 11: case 21:
3872 o_ptr->name2 = EGO_AMU_AC;
3875 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3876 if (m_bonus(10, level) > 8)
3877 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3879 o_ptr->name2 = EGO_AMU_RES_FIRE;
3882 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3883 if (m_bonus(10, level) > 8)
3884 o_ptr->name2 = EGO_AMU_RES_COLD_;
3886 o_ptr->name2 = EGO_AMU_RES_COLD;
3889 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3890 if (m_bonus(10, level) > 8)
3891 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3893 o_ptr->name2 = EGO_AMU_RES_ELEC;
3896 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3897 if (m_bonus(10, level) > 8)
3898 o_ptr->name2 = EGO_AMU_RES_ACID_;
3900 o_ptr->name2 = EGO_AMU_RES_ACID;
3902 case 16: case 17: case 18: case 19: case 20:
3903 switch (o_ptr->sval)
3905 case SV_AMULET_TELEPORT:
3906 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3907 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3908 else o_ptr->name2 = EGO_AMU_TELEPORT;
3910 case SV_AMULET_RESIST_ACID:
3911 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3913 case SV_AMULET_SEARCHING:
3914 o_ptr->name2 = EGO_AMU_STEALTH;
3916 case SV_AMULET_BRILLIANCE:
3917 if (!one_in_(3)) break;
3918 o_ptr->name2 = EGO_AMU_IDENT;
3920 case SV_AMULET_CHARISMA:
3921 if (!one_in_(3)) break;
3922 o_ptr->name2 = EGO_AMU_CHARM;
3924 case SV_AMULET_THE_MAGI:
3925 if (one_in_(2)) break;
3926 o_ptr->name2 = EGO_AMU_GREAT;
3928 case SV_AMULET_RESISTANCE:
3929 if (!one_in_(5)) break;
3930 o_ptr->name2 = EGO_AMU_DEFENDER;
3932 case SV_AMULET_TELEPATHY:
3933 if (!one_in_(3)) break;
3934 o_ptr->name2 = EGO_AMU_DETECTION;
3940 o_ptr->curse_flags = 0L;
3942 else if ((power == -2) && one_in_(2))
3944 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3945 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3946 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3947 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3948 o_ptr->art_flags[0] = 0;
3949 o_ptr->art_flags[1] = 0;
3950 while(!o_ptr->name2)
3952 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3956 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3957 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3960 o_ptr->name2 = EGO_AMU_FOOL;
3963 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3964 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3967 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3968 o_ptr->name2 = EGO_AMU_TY_CURSE;
3971 o_ptr->name2 = EGO_AMU_NAIVETY;
3976 o_ptr->ident |= (IDENT_BROKEN);
3979 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3987 * @brief モンスターが人形のベースにできるかを返す
3988 * @param r_idx チェックしたいモンスター種族のID
3989 * @return 人形にできるならTRUEを返す
3991 static bool item_monster_okay(MONRACE_IDX r_idx)
3993 monster_race *r_ptr = &r_info[r_idx];
3996 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
3997 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
3998 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
3999 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
4000 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
4001 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
4008 * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
4009 * Apply magic to an item known to be "boring"
4010 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4011 * @param level 生成基準階
4012 * @param power 生成ランク
4015 * Hack -- note the special code for various items
4017 static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
4019 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4024 /* Apply magic (good or bad) according to type */
4025 switch (o_ptr->tval)
4034 o_ptr->ident |= (IDENT_BROKEN);
4037 o_ptr->curse_flags |= (TRC_CURSED);
4044 o_ptr->xtra4 = o_ptr->pval;
4050 /* Hack -- Torches -- random fuel */
4051 if (o_ptr->sval == SV_LITE_TORCH)
4053 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4057 /* Hack -- Lanterns -- random fuel */
4058 if (o_ptr->sval == SV_LITE_LANTERN)
4060 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4064 if (power > 2) /* power > 2 is debug only */
4066 create_artifact(o_ptr, FALSE);
4068 else if ((power == 2) || ((power == 1) && one_in_(3)))
4070 while (!o_ptr->name2)
4074 bool okay_flag = TRUE;
4076 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
4078 switch (o_ptr->name2)
4081 if (o_ptr->sval == SV_LITE_FEANOR)
4089 else if (power == -2)
4091 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
4093 switch (o_ptr->name2)
4095 case EGO_LITE_DARKNESS:
4098 if (o_ptr->sval == SV_LITE_TORCH)
4100 add_flag(o_ptr->art_flags, TR_LITE_M1);
4102 else if (o_ptr->sval == SV_LITE_LANTERN)
4104 add_flag(o_ptr->art_flags, TR_LITE_M2);
4106 else if (o_ptr->sval == SV_LITE_FEANOR)
4108 add_flag(o_ptr->art_flags, TR_LITE_M3);
4120 /* The wand or staff gets a number of initial charges equal
4121 * to between 1/2 (+1) and the full object kind's pval. -LM-
4123 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
4129 /* Transfer the pval. -LM- */
4130 o_ptr->pval = k_ptr->pval;
4137 object_aware(o_ptr);
4138 object_known(o_ptr);
4144 PARAMETER_VALUE i = 1;
4147 monster_race *r_ptr;
4149 /* Pick a random non-unique monster race */
4152 i = randint1(max_r_idx - 1);
4154 if (!item_monster_okay(i)) continue;
4155 if (i == MON_TSUCHINOKO) continue;
4159 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4161 /* Ignore dead monsters */
4162 if (!r_ptr->rarity) continue;
4164 /* Ignore uncommon monsters */
4165 if (r_ptr->rarity > 100) continue;
4167 /* Prefer less out-of-depth monsters */
4168 if (randint0(check)) continue;
4175 /* Some figurines are cursed */
4176 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
4183 PARAMETER_VALUE i = 1;
4188 monster_race *r_ptr;
4190 if (o_ptr->sval == SV_SKELETON)
4192 match = RF9_DROP_SKELETON;
4194 else if (o_ptr->sval == SV_CORPSE)
4196 match = RF9_DROP_CORPSE;
4199 /* Hack -- Remove the monster restriction */
4200 get_mon_num_prep(item_monster_okay, NULL);
4202 /* Pick a random non-unique monster race */
4205 i = get_mon_num(dun_level);
4209 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4211 /* Ignore dead monsters */
4212 if (!r_ptr->rarity) continue;
4214 /* Ignore corpseless monsters */
4215 if (!(r_ptr->flags9 & match)) continue;
4217 /* Prefer less out-of-depth monsters */
4218 if (randint0(check)) continue;
4226 object_aware(o_ptr);
4227 object_known(o_ptr);
4233 PARAMETER_VALUE i = 1;
4235 monster_race *r_ptr;
4237 /* Pick a random monster race */
4240 i = randint1(max_r_idx - 1);
4244 /* Ignore dead monsters */
4245 if (!r_ptr->rarity) continue;
4254 msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
4256 object_aware(o_ptr);
4257 object_known(o_ptr);
4264 DEPTH obj_level = k_info[o_ptr->k_idx].level;
4266 /* Hack -- skip ruined chests */
4267 if (obj_level <= 0) break;
4269 /* Hack -- pick a "difficulty" */
4270 o_ptr->pval = randint1(obj_level);
4271 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4273 o_ptr->xtra3 = dun_level + 5;
4275 /* Never exceed "difficulty" of 55 to 59 */
4276 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4284 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
4285 * Complete the "creation" of an object by applying "magic" to the item
4286 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4288 * @param mode 生成オプション
4291 * This includes not only rolling for random bonuses, but also putting the\n
4292 * finishing touches on ego-items and artifacts, giving charges to wands and\n
4293 * staffs, giving fuel to lites, and placing traps on chests.\n
4295 * In particular, note that "Instant Artifacts", if "created" by an external\n
4296 * routine, must pass through this function to complete the actual creation.\n
4298 * The base "chance" of the item being "good" increases with the "level"\n
4299 * parameter, which is usually derived from the dungeon level, being equal\n
4300 * to the level plus 10, up to a maximum of 75. If "good" is true, then\n
4301 * the object is guaranteed to be "good". If an object is "good", then\n
4302 * the chance that the object will be "great" (ego-item or artifact), also\n
4303 * increases with the "level", being equal to half the level, plus 5, up to\n
4304 * a maximum of 20. If "great" is true, then the object is guaranteed to be\n
4305 * "great". At dungeon level 65 and below, 15/100 objects are "great".\n
4307 * If the object is not "good", there is a chance it will be "cursed", and\n
4308 * if it is "cursed", there is a chance it will be "broken". These chances\n
4309 * are related to the "good" / "great" chances above.\n
4311 * Otherwise "normal" rings and amulets will be "good" half the time and\n
4312 * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4314 * If "okay" is true, and the object is going to be "great", then there is\n
4315 * a chance that an artifact will be created. This is true even if both the\n
4316 * "good" and "great" arguments are false. As a total hack, if "great" is\n
4317 * true, then the item gets 3 extra "attempts" to become an artifact.\n
4319 void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
4321 int i, rolls, f1, f2, power;
4323 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4325 /* Maximum "level" for various things */
4326 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4328 /* Base chance of being "good" */
4331 /* Maximal chance of being "good" */
4332 if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4334 /* Base chance of being "great" */
4337 /* Maximal chance of being "great" */
4338 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4339 f2 = d_info[dungeon_type].obj_great;
4341 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4346 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4355 /* Roll for "good" */
4356 if ((mode & AM_GOOD) || magik(f1))
4361 /* Roll for "great" */
4362 if ((mode & AM_GREAT) || magik(f2))
4366 /* Roll for "special" */
4367 if (mode & AM_SPECIAL) power = 3;
4371 /* Roll for "cursed" */
4374 /* Assume "cursed" */
4377 /* Roll for "broken" */
4378 if (magik(f2)) power = -2;
4382 if (mode & AM_CURSED)
4384 /* Assume 'cursed' */
4389 /* Everything else gets more badly cursed */
4396 /* Assume no rolls */
4399 /* Get one roll if excellent */
4400 if (power >= 2) rolls = 1;
4402 /* Hack -- Get four rolls if forced great or special */
4403 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4405 /* Hack -- Get no rolls if not allowed */
4406 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4408 /* Roll for artifacts if allowed */
4409 for (i = 0; i < rolls; i++)
4411 /* Roll for an artifact */
4412 if (make_artifact(o_ptr)) break;
4413 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4415 if (make_artifact(o_ptr)) break;
4420 /* Hack -- analyze artifacts */
4421 if (object_is_fixed_artifact(o_ptr))
4423 artifact_type *a_ptr = &a_info[o_ptr->name1];
4425 /* Hack -- Mark the artifact as "created" */
4428 /* Hack -- Memorize location of artifact in saved floors */
4429 if (character_dungeon)
4430 a_ptr->floor_id = p_ptr->floor_id;
4432 /* Extract the other fields */
4433 o_ptr->pval = a_ptr->pval;
4434 o_ptr->ac = a_ptr->ac;
4435 o_ptr->dd = a_ptr->dd;
4436 o_ptr->ds = a_ptr->ds;
4437 o_ptr->to_a = a_ptr->to_a;
4438 o_ptr->to_h = a_ptr->to_h;
4439 o_ptr->to_d = a_ptr->to_d;
4440 o_ptr->weight = a_ptr->weight;
4441 o_ptr->xtra2 = a_ptr->act_idx;
4443 if (o_ptr->name1 == ART_MILIM)
4445 if(p_ptr->pseikaku == SEIKAKU_SEXY)
4451 /* Hack -- extract the "broken" flag */
4452 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4454 /* Hack -- extract the "cursed" flag */
4455 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4456 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4457 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4458 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4459 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4460 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4467 switch (o_ptr->tval)
4476 if (power) a_m_aux_1(o_ptr, lev, power);
4482 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4488 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4502 /* Elven Cloak and Black Clothes ... */
4503 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4504 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4505 o_ptr->pval = randint1(4);
4509 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4510 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4511 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4512 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4513 a_m_aux_2(o_ptr, lev, power);
4515 if (power) a_m_aux_2(o_ptr, lev, power);
4523 if (!power && (randint0(100) < 50)) power = -1;
4524 a_m_aux_3(o_ptr, lev, power);
4530 a_m_aux_4(o_ptr, lev, power);
4535 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4536 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4537 (p_ptr->pseikaku == SEIKAKU_SEXY))
4540 add_flag(o_ptr->art_flags, TR_STR);
4541 add_flag(o_ptr->art_flags, TR_INT);
4542 add_flag(o_ptr->art_flags, TR_WIS);
4543 add_flag(o_ptr->art_flags, TR_DEX);
4544 add_flag(o_ptr->art_flags, TR_CON);
4545 add_flag(o_ptr->art_flags, TR_CHR);
4548 /* Hack -- analyze ego-items */
4549 if (object_is_ego(o_ptr))
4551 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4553 /* Hack -- acquire "broken" flag */
4554 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4556 /* Hack -- acquire "cursed" flag */
4557 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4558 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4559 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4560 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4561 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4562 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4564 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4565 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4566 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4567 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4568 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4569 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4570 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4571 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4577 while (one_in_(o_ptr->dd));
4579 if (o_ptr->dd > 9) o_ptr->dd = 9;
4582 /* Hack -- apply activatin index if needed */
4583 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
4585 /* Hack -- apply extra penalties if needed */
4586 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4588 /* Hack -- obtain bonuses */
4589 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4590 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4591 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4593 /* Hack -- obtain pval */
4594 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4597 /* Hack -- apply extra bonuses if needed */
4600 /* Hack -- obtain bonuses */
4601 if (e_ptr->max_to_h)
4603 if (e_ptr->max_to_h > 127)
4604 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4605 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4607 if (e_ptr->max_to_d)
4609 if (e_ptr->max_to_d > 127)
4610 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4611 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4613 if (e_ptr->max_to_a)
4615 if (e_ptr->max_to_a > 127)
4616 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4617 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4620 /* Accuracy ego must have high to_h */
4621 if(o_ptr->name2 == EGO_ACCURACY)
4623 while(o_ptr->to_h < o_ptr->to_d + 10)
4628 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4631 /* Accuracy ego must have high to_h */
4632 if(o_ptr->name2 == EGO_VELOCITY)
4634 while(o_ptr->to_d < o_ptr->to_h + 10)
4639 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4642 /* Protection ego must have high to_a */
4643 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4645 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4648 /* Hack -- obtain pval */
4649 if (e_ptr->max_pval)
4651 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4654 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4656 else if (o_ptr->name2 == EGO_DEMON)
4658 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4660 o_ptr->pval += randint1(2);
4664 o_ptr->pval += randint1(e_ptr->max_pval);
4667 else if (o_ptr->name2 == EGO_ATTACKS)
4669 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4670 if (o_ptr->pval > 3) o_ptr->pval = 3;
4671 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4672 o_ptr->pval += randint1(2);
4674 else if (o_ptr->name2 == EGO_BAT)
4676 o_ptr->pval = randint1(e_ptr->max_pval);
4677 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4679 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4681 o_ptr->pval = randint1(e_ptr->max_pval);
4685 o_ptr->pval += randint1(e_ptr->max_pval);
4690 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4692 o_ptr->pval = randint1(o_ptr->pval);
4694 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4701 /* Examine real objects */
4704 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4706 /* Hack -- acquire "broken" flag */
4707 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4709 /* Hack -- acquire "cursed" flag */
4710 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4711 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4712 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4713 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4714 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4715 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4723 * @brief ベースアイテムが上質として扱われるかどうかを返す。
4724 * Hack -- determine if a template is "good"
4725 * @param k_idx 判定したいベースアイテムのID
4726 * @return ベースアイテムが上質ならばTRUEを返す。
4728 static bool kind_is_good(KIND_OBJECT_IDX k_idx)
4730 object_kind *k_ptr = &k_info[k_idx];
4732 /* Analyze the item type */
4733 switch (k_ptr->tval)
4735 /* Armor -- Good unless damaged */
4746 if (k_ptr->to_a < 0) return (FALSE);
4750 /* Weapons -- Good unless damaged */
4757 if (k_ptr->to_h < 0) return (FALSE);
4758 if (k_ptr->to_d < 0) return (FALSE);
4762 /* Ammo -- Arrows/Bolts are good */
4769 /* Books -- High level books are good (except Arcane books) */
4771 case TV_SORCERY_BOOK:
4772 case TV_NATURE_BOOK:
4777 case TV_DAEMON_BOOK:
4778 case TV_CRUSADE_BOOK:
4780 case TV_HISSATSU_BOOK:
4783 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4787 /* Rings -- Rings of Speed are good */
4790 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4791 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4795 /* Amulets -- Amulets of the Magi and Resistance are good */
4798 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4799 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4804 /* Assume not good */
4809 * @brief 生成階に応じたベースアイテムの生成を行う。
4810 * Attempt to make an object (normal or good/great)
4811 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4812 * @param mode オプションフラグ
4813 * @return 生成に成功したらTRUEを返す。
4815 * This routine plays nasty games to generate the "special artifacts".\n
4816 * This routine uses "object_level" for the "generation level".\n
4817 * We assume that the given object has been "wiped".\n
4819 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
4825 /* Chance of "special object" */
4826 prob = ((mode & AM_GOOD) ? 10 : 1000);
4828 /* Base level for the object */
4829 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4832 /* Generate a special object, or a normal object */
4833 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4835 KIND_OBJECT_IDX k_idx;
4838 if ((mode & AM_GOOD) && !get_obj_num_hook)
4840 /* Activate restriction (if already specified, use that) */
4841 get_obj_num_hook = kind_is_good;
4844 /* Restricted objects - prepare allocation table */
4845 if (get_obj_num_hook) get_obj_num_prep();
4847 /* Pick a random object */
4848 k_idx = get_obj_num(base);
4850 /* Restricted objects */
4851 if (get_obj_num_hook)
4853 /* Clear restriction */
4854 get_obj_num_hook = NULL;
4856 /* Reset allocation table to default */
4860 /* Handle failure */
4861 if (!k_idx) return (FALSE);
4863 /* Prepare the object */
4864 object_prep(j_ptr, k_idx);
4867 /* Apply magic (allow artifacts) */
4868 apply_magic(j_ptr, object_level, mode);
4870 /* Hack -- generate multiple spikes/missiles */
4871 switch (j_ptr->tval)
4879 j_ptr->number = (byte)damroll(6, 7);
4883 if (cheat_peek) object_mention(j_ptr);
4891 * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
4892 * Attempt to place an object (normal or good/great) at the given location.
4893 * @param y 配置したいフロアのY座標
4894 * @param x 配置したいフロアのX座標
4895 * @param mode オプションフラグ
4896 * @return 生成に成功したらTRUEを返す。
4898 * This routine plays nasty games to generate the "special artifacts".\n
4899 * This routine uses "object_level" for the "generation level".\n
4900 * This routine requires a clean floor grid destination.\n
4902 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
4907 cave_type *c_ptr = &cave[y][x];
4913 /* Paranoia -- check bounds */
4914 if (!in_bounds(y, x)) return;
4916 /* Require floor space */
4917 if (!cave_drop_bold(y, x)) return;
4919 /* Avoid stacking on other objects */
4920 if (c_ptr->o_idx) return;
4923 /* Get local object */
4926 /* Wipe the object */
4929 /* Make an object (if possible) */
4930 if (!make_object(q_ptr, mode)) return;
4933 /* Make an object */
4941 /* Acquire object */
4942 o_ptr = &o_list[o_idx];
4944 /* Structure Copy */
4945 object_copy(o_ptr, q_ptr);
4951 o_ptr->next_o_idx = c_ptr->o_idx;
4953 /* Place the object */
4954 c_ptr->o_idx = o_idx;
4963 /* Hack -- Preserve artifacts */
4964 if (object_is_fixed_artifact(q_ptr))
4966 a_info[q_ptr->name1].cur_num = 0;
4973 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
4974 * Make a treasure object
4975 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4976 * @return 生成に成功したらTRUEを返す。
4978 * The location must be a legal, clean, floor grid.
4980 bool make_gold(object_type *j_ptr)
4985 /* Hack -- Pick a Treasure variety */
4986 i = ((randint1(object_level + 2) + 2) / 2) - 1;
4988 /* Apply "extra" magic */
4989 if (one_in_(GREAT_OBJ))
4991 i += randint1(object_level + 1);
4994 /* Hack -- Creeping Coins only generate "themselves" */
4995 if (coin_type) i = coin_type;
4997 /* Do not create "illegal" Treasure Types */
4998 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
5000 /* Prepare a gold object */
5001 object_prep(j_ptr, OBJ_GOLD_LIST + i);
5003 /* Hack -- Base coin cost */
5004 base = k_info[OBJ_GOLD_LIST + i].cost;
5006 /* Determine how much the treasure is "worth" */
5007 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
5015 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
5016 * Places a treasure (Gold or Gems) at given location
5017 * @param y 配置したいフロアのY座標
5018 * @param x 配置したいフロアのX座標
5019 * @return 生成に成功したらTRUEを返す。
5021 * The location must be a legal, clean, floor grid.
5023 void place_gold(POSITION y, POSITION x)
5028 cave_type *c_ptr = &cave[y][x];
5034 /* Paranoia -- check bounds */
5035 if (!in_bounds(y, x)) return;
5037 /* Require floor space */
5038 if (!cave_drop_bold(y, x)) return;
5040 /* Avoid stacking on other objects */
5041 if (c_ptr->o_idx) return;
5044 /* Get local object */
5047 /* Wipe the object */
5050 /* Make some gold */
5051 if (!make_gold(q_ptr)) return;
5053 /* Make an object */
5061 /* Acquire object */
5062 o_ptr = &o_list[o_idx];
5064 /* Copy the object */
5065 object_copy(o_ptr, q_ptr);
5072 o_ptr->next_o_idx = c_ptr->o_idx;
5074 /* Place the object */
5075 c_ptr->o_idx = o_idx;
5086 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
5087 * Let an object fall to the ground at or near a location.
5088 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
5089 * @param chance ドロップの成功率(%)
5090 * @param y 配置したいフロアのY座標
5091 * @param x 配置したいフロアのX座標
5092 * @return 生成に成功したらオブジェクトのIDを返す。
5094 * The initial location is assumed to be "in_bounds()".\n
5096 * This function takes a parameter "chance". This is the percentage\n
5097 * chance that the item will "disappear" instead of drop. If the object\n
5098 * has been thrown, then this is the chance of disappearance on contact.\n
5100 * Hack -- this function uses "chance" to determine if it should produce\n
5101 * some form of "description" of the drop event (under the player).\n
5103 * We check several locations to see if we can find a location at which\n
5104 * the object can combine, stack, or be placed. Artifacts will try very\n
5105 * hard to be placed, including "teleporting" to a useful grid if needed.\n
5107 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
5114 POSITION ty, tx = 0;
5116 OBJECT_IDX o_idx = 0;
5117 OBJECT_IDX this_o_idx, next_o_idx = 0;
5121 char o_name[MAX_NLEN];
5127 /* Extract plural */
5128 bool plural = (j_ptr->number != 1);
5131 /* Describe object */
5132 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5135 /* Handle normal "breakage" */
5136 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
5139 msg_format("%sは消えた。", o_name);
5141 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5144 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
5161 /* Scan local grids */
5162 for (dy = -3; dy <= 3; dy++)
5164 /* Scan local grids */
5165 for (dx = -3; dx <= 3; dx++)
5169 /* Calculate actual distance */
5170 d = (dy * dy) + (dx * dx);
5172 /* Ignore distant grids */
5173 if (d > 10) continue;
5178 /* Skip illegal grids */
5179 if (!in_bounds(ty, tx)) continue;
5181 /* Require line of projection */
5182 if (!projectable(y, x, ty, tx)) continue;
5185 c_ptr = &cave[ty][tx];
5187 /* Require floor space */
5188 if (!cave_drop_bold(ty, tx)) continue;
5193 /* Scan objects in that grid */
5194 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5198 /* Acquire object */
5199 o_ptr = &o_list[this_o_idx];
5201 /* Acquire next object */
5202 next_o_idx = o_ptr->next_o_idx;
5204 /* Check for possible combination */
5205 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5211 /* Add new object */
5215 if (k > 99) continue;
5217 /* Calculate score */
5218 s = 1000 - (d + k * 5);
5220 /* Skip bad values */
5221 if (s < bs) continue;
5223 /* New best value */
5226 /* Apply the randomizer to equivalent values */
5227 if ((++bn >= 2) && !one_in_(bn)) continue;
5241 /* Handle lack of space */
5242 if (!flag && !object_is_artifact(j_ptr))
5245 msg_format("%sは消えた。", o_name);
5247 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5252 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5260 for (i = 0; !flag && (i < 1000); i++)
5263 ty = rand_spread(by, 1);
5264 tx = rand_spread(bx, 1);
5266 /* Verify location */
5267 if (!in_bounds(ty, tx)) continue;
5269 /* Bounce to that location */
5273 /* Require floor space */
5274 if (!cave_drop_bold(by, bx)) continue;
5282 int candidates = 0, pick;
5284 for (ty = 1; ty < cur_hgt - 1; ty++)
5286 for (tx = 1; tx < cur_wid - 1; tx++)
5288 /* A valid space found */
5289 if (cave_drop_bold(ty, tx)) candidates++;
5293 /* No valid place! */
5297 msg_format("%sは消えた。", o_name);
5299 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5303 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5305 /* Mega-Hack -- preserve artifacts */
5308 /* Hack -- Preserve unknown artifacts */
5309 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5311 /* Mega-Hack -- Preserve the artifact */
5312 a_info[j_ptr->name1].cur_num = 0;
5320 /* Choose a random one */
5321 pick = randint1(candidates);
5323 for (ty = 1; ty < cur_hgt - 1; ty++)
5325 for (tx = 1; tx < cur_wid - 1; tx++)
5327 if (cave_drop_bold(ty, tx))
5331 /* Is this a picked one? */
5345 c_ptr = &cave[by][bx];
5347 /* Scan objects in that grid for combination */
5348 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5352 /* Acquire object */
5353 o_ptr = &o_list[this_o_idx];
5355 /* Acquire next object */
5356 next_o_idx = o_ptr->next_o_idx;
5358 /* Check for combination */
5359 if (object_similar(o_ptr, j_ptr))
5361 /* Combine the items */
5362 object_absorb(o_ptr, j_ptr);
5371 /* Get new object */
5372 if (!done) o_idx = o_pop();
5375 if (!done && !o_idx)
5378 msg_format("%sは消えた。", o_name);
5380 msg_format("The %s disappear%s.",
5381 o_name, (plural ? "" : "s"));
5386 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5388 /* Hack -- Preserve artifacts */
5389 if (object_is_fixed_artifact(j_ptr))
5391 a_info[j_ptr->name1].cur_num = 0;
5401 /* Structure copy */
5402 object_copy(&o_list[o_idx], j_ptr);
5404 /* Access new object */
5405 j_ptr = &o_list[o_idx];
5412 j_ptr->held_m_idx = 0;
5415 j_ptr->next_o_idx = c_ptr->o_idx;
5417 /* Place the object */
5418 c_ptr->o_idx = o_idx;
5432 /* Mega-Hack -- no message if "dropped" by player */
5433 /* Message when an object falls under the player */
5434 if (chance && player_bold(by, bx))
5436 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5445 * Scatter some "great" objects near the player
5446 * @param y1 配置したいフロアのY座標
5447 * @param x1 配置したいフロアのX座標
5448 * @param num 獲得の処理回数
5449 * @param great TRUEならば必ず高級品以上を落とす
5450 * @param special TRUEならば必ず特別品を落とす
5451 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5454 void acquirement(POSITION y1, POSITION x1, int num, bool great, bool special, bool known)
5457 object_type object_type_body;
5458 BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ;
5463 /* Get local object */
5464 i_ptr = &object_type_body;
5466 /* Wipe the object */
5469 /* Make a good (or great) object (if possible) */
5470 if (!make_object(i_ptr, mode)) continue;
5474 object_aware(i_ptr);
5475 object_known(i_ptr);
5478 /* Drop the object */
5479 (void)drop_near(i_ptr, -1, y1, x1);
5484 * Scatter some "amusing" objects near the player
5487 #define AMS_NOTHING 0x00 /* No restriction */
5488 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
5489 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
5490 #define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */
5491 #define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */
5495 OBJECT_TYPE_VALUE tval;
5496 OBJECT_SUBTYPE_VALUE sval;
5501 amuse_type amuse_info[] =
5503 { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
5504 { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
5505 { TV_SPIKE, SV_ANY, 10, AMS_PILE },
5506 { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
5507 { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
5508 { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
5509 { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
5510 { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
5511 { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
5512 { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
5513 { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
5514 { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
5515 { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
5522 * @param y1 配置したいフロアのY座標
5523 * @param x1 配置したいフロアのX座標
5524 * @param num 誰得の処理回数
5525 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5528 void amusement(POSITION y1, POSITION x1, int num, bool known)
5531 object_type object_type_body;
5534 for (n = 0; amuse_info[n].tval != 0; n++)
5536 t += amuse_info[n].prob;
5543 KIND_OBJECT_IDX k_idx;
5544 ARTIFACT_IDX a_idx = 0;
5545 int r = randint0(t);
5546 bool insta_art, fixed_art;
5550 r -= amuse_info[i].prob;
5554 /* Get local object */
5555 i_ptr = &object_type_body;
5557 /* Wipe the object */
5560 /* Wipe the object */
5561 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
5563 /* Paranoia - reroll if nothing */
5564 if (!k_idx) continue;
5566 /* Search an artifact index if need */
5567 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
5568 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
5570 if (insta_art || fixed_art)
5572 for (a_idx = 1; a_idx < max_a_idx; a_idx++)
5574 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
5575 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
5576 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
5577 if (a_info[a_idx].cur_num > 0) continue;
5581 if (a_idx >= max_a_idx) continue;
5584 /* Make an object (if possible) */
5585 object_prep(i_ptr, k_idx);
5586 if (a_idx) i_ptr->name1 = a_idx;
5587 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
5589 if (amuse_info[i].flag & AMS_NO_UNIQUE)
5591 if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
5594 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
5595 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
5599 object_aware(i_ptr);
5600 object_known(i_ptr);
5603 /* Paranoia - reroll if nothing */
5604 if (!(i_ptr->k_idx)) continue;
5606 /* Drop the object */
5607 (void)drop_near(i_ptr, -1, y1, x1);
5615 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5616 * Describe the charges on an item in the inventory.
5617 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5620 void inven_item_charges(INVENTORY_IDX item)
5622 object_type *o_ptr = &inventory[item];
5624 /* Require staff/wand */
5625 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5627 /* Require known item */
5628 if (!object_is_known(o_ptr)) return;
5631 if (o_ptr->pval <= 0)
5633 msg_print("もう魔力が残っていない。");
5637 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5640 /* Multiple charges */
5641 if (o_ptr->pval != 1)
5643 msg_format("You have %d charges remaining.", o_ptr->pval);
5649 msg_format("You have %d charge remaining.", o_ptr->pval);
5656 * @brief アイテムの残り所持数メッセージを表示する /
5657 * Describe an item in the inventory.
5658 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5661 void inven_item_describe(INVENTORY_IDX item)
5663 object_type *o_ptr = &inventory[item];
5664 char o_name[MAX_NLEN];
5666 object_desc(o_name, o_ptr, 0);
5669 /* "no more" の場合はこちらで表示する */
5670 if (o_ptr->number <= 0)
5672 /*FIRST*//*ここはもう通らないかも */
5673 msg_format("もう%sを持っていない。", o_name);
5677 /* アイテム名を英日切り替え機能対応 */
5678 msg_format("まだ %sを持っている。", o_name);
5681 msg_format("You have %s.", o_name);
5687 * @brief アイテムを増やし残り所持数メッセージを表示する /
5688 * Increase the "number" of an item in the inventory
5689 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5693 void inven_item_increase(INVENTORY_IDX item, int num)
5695 object_type *o_ptr = &inventory[item];
5698 num += o_ptr->number;
5701 if (num > 255) num = 255;
5702 else if (num < 0) num = 0;
5705 num -= (ITEM_NUMBER)o_ptr->number;
5707 /* Change the number and weight */
5710 /* Add the number */
5711 o_ptr->number += num;
5713 /* Add the weight */
5714 p_ptr->total_weight += (num * o_ptr->weight);
5716 /* Recalculate bonuses */
5717 p_ptr->update |= (PU_BONUS);
5719 /* Recalculate mana XXX */
5720 p_ptr->update |= (PU_MANA);
5722 /* Combine the pack */
5723 p_ptr->notice |= (PN_COMBINE);
5725 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5727 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5728 if (!o_ptr->number && p_ptr->ele_attack)
5730 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5732 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5734 /* Clear all temporary elemental brands */
5735 set_ele_attack(0, 0);
5743 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5744 * Erase an inventory slot if it has no more items
5745 * @param item 消去したいプレイヤーのアイテム所持スロット
5748 void inven_item_optimize(INVENTORY_IDX item)
5750 object_type *o_ptr = &inventory[item];
5752 /* Only optimize real items */
5753 if (!o_ptr->k_idx) return;
5755 /* Only optimize empty items */
5756 if (o_ptr->number) return;
5758 /* The item is in the pack */
5759 if (item < INVEN_RARM)
5766 /* Slide everything down */
5767 for (i = item; i < INVEN_PACK; i++)
5769 /* Structure copy */
5770 inventory[i] = inventory[i+1];
5773 /* Erase the "final" slot */
5774 object_wipe(&inventory[i]);
5776 p_ptr->window |= (PW_INVEN);
5779 /* The item is being wielded */
5785 /* Erase the empty slot */
5786 object_wipe(&inventory[item]);
5788 /* Recalculate bonuses */
5789 p_ptr->update |= (PU_BONUS);
5791 /* Recalculate torch */
5792 p_ptr->update |= (PU_TORCH);
5794 /* Recalculate mana XXX */
5795 p_ptr->update |= (PU_MANA);
5797 p_ptr->window |= (PW_EQUIP);
5800 p_ptr->window |= (PW_SPELL);
5804 * @brief 床上の魔道具の残り残量メッセージを表示する /
5805 * Describe the charges on an item on the floor.
5806 * @param item メッセージの対象にしたいアイテム所持スロット
5809 void floor_item_charges(INVENTORY_IDX item)
5811 object_type *o_ptr = &o_list[item];
5813 /* Require staff/wand */
5814 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5816 /* Require known item */
5817 if (!object_is_known(o_ptr)) return;
5820 if (o_ptr->pval <= 0)
5822 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5826 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5829 /* Multiple charges */
5830 if (o_ptr->pval != 1)
5832 msg_format("There are %d charges remaining.", o_ptr->pval);
5838 msg_format("There is %d charge remaining.", o_ptr->pval);
5845 * @brief 床上のアイテムの残り数メッセージを表示する /
5846 * Describe the charges on an item on the floor.
5847 * @param item メッセージの対象にしたいアイテム所持スロット
5850 void floor_item_describe(INVENTORY_IDX item)
5852 object_type *o_ptr = &o_list[item];
5853 char o_name[MAX_NLEN];
5855 object_desc(o_name, o_ptr, 0);
5858 /* "no more" の場合はこちらで表示を分ける */
5859 if (o_ptr->number <= 0)
5861 msg_format("床上には、もう%sはない。", o_name);
5865 msg_format("床上には、まだ %sがある。", o_name);
5868 msg_format("You see %s.", o_name);
5875 * @brief 床上のアイテムの数を増やす /
5876 * Increase the "number" of an item on the floor
5877 * @param item 増やしたいアイテムの所持スロット
5878 * @param num 増やしたいアイテムの数
5881 void floor_item_increase(INVENTORY_IDX item, int num)
5883 object_type *o_ptr = &o_list[item];
5886 num += o_ptr->number;
5889 if (num > 255) num = 255;
5890 else if (num < 0) num = 0;
5893 num -= (int)o_ptr->number;
5895 /* Change the number */
5896 o_ptr->number += (ITEM_NUMBER)num;
5901 * @brief 床上の数の無くなったアイテムスロットを消去する /
5902 * Optimize an item on the floor (destroy "empty" items)
5903 * @param item 消去したいアイテムの所持スロット
5906 void floor_item_optimize(INVENTORY_IDX item)
5908 object_type *o_ptr = &o_list[item];
5910 /* Paranoia -- be sure it exists */
5911 if (!o_ptr->k_idx) return;
5913 /* Only optimize empty items */
5914 if (o_ptr->number) return;
5916 delete_object_idx(item);
5921 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5922 * Check if we have space for an item in the pack without overflow
5923 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5924 * @return 溢れずに済むならTRUEを返す
5926 bool inven_carry_okay(object_type *o_ptr)
5931 if (inven_cnt < INVEN_PACK) return (TRUE);
5934 for (j = 0; j < INVEN_PACK; j++)
5936 object_type *j_ptr = &inventory[j];
5938 /* Skip non-objects */
5939 if (!j_ptr->k_idx) continue;
5941 /* Check if the two items can be combined */
5942 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5949 * @brief オブジェクトを定義された基準に従いソートするための関数 /
5950 * Check if we have space for an item in the pack without overflow
5951 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
5952 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
5953 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
5954 * @return o_ptrの方が上位ならばTRUEを返す。
5956 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5960 /* Use empty slots */
5961 if (!j_ptr->k_idx) return TRUE;
5963 /* Hack -- readable books always come first */
5964 if ((o_ptr->tval == REALM1_BOOK) &&
5965 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5966 if ((j_ptr->tval == REALM1_BOOK) &&
5967 (o_ptr->tval != REALM1_BOOK)) return FALSE;
5969 if ((o_ptr->tval == REALM2_BOOK) &&
5970 (j_ptr->tval != REALM2_BOOK)) return TRUE;
5971 if ((j_ptr->tval == REALM2_BOOK) &&
5972 (o_ptr->tval != REALM2_BOOK)) return FALSE;
5974 /* Objects sort by decreasing type */
5975 if (o_ptr->tval > j_ptr->tval) return TRUE;
5976 if (o_ptr->tval < j_ptr->tval) return FALSE;
5978 /* Non-aware (flavored) items always come last */
5979 /* Can happen in the home */
5980 if (!object_is_aware(o_ptr)) return FALSE;
5981 if (!object_is_aware(j_ptr)) return TRUE;
5983 /* Objects sort by increasing sval */
5984 if (o_ptr->sval < j_ptr->sval) return TRUE;
5985 if (o_ptr->sval > j_ptr->sval) return FALSE;
5987 /* Unidentified objects always come last */
5988 /* Objects in the home can be unknown */
5989 if (!object_is_known(o_ptr)) return FALSE;
5990 if (!object_is_known(j_ptr)) return TRUE;
5992 /* Fixed artifacts, random artifacts and ego items */
5993 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
5994 else if (o_ptr->art_name) o_type = 2;
5995 else if (object_is_ego(o_ptr)) o_type = 1;
5998 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
5999 else if (j_ptr->art_name) j_type = 2;
6000 else if (object_is_ego(j_ptr)) j_type = 1;
6003 if (o_type < j_type) return TRUE;
6004 if (o_type > j_type) return FALSE;
6006 switch (o_ptr->tval)
6012 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
6013 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
6019 /* Objects sort by increasing hit/damage bonuses */
6020 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
6021 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
6024 /* Hack: otherwise identical rods sort by
6025 increasing recharge time --dsb */
6027 if (o_ptr->pval < j_ptr->pval) return TRUE;
6028 if (o_ptr->pval > j_ptr->pval) return FALSE;
6032 /* Objects sort by decreasing value */
6033 return o_value > object_value(j_ptr);
6038 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
6039 * Add an item to the players inventory, and return the slot used.
6040 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
6041 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6043 * If the new item can combine with an existing item in the inventory,\n
6044 * it will do so, using "object_similar()" and "object_absorb()", else,\n
6045 * the item will be placed into the "proper" location in the inventory.\n
6047 * This function can be used to "over-fill" the player's pack, but only\n
6048 * once, and such an action must trigger the "overflow" code immediately.\n
6049 * Note that when the pack is being "over-filled", the new item must be\n
6050 * placed into the "overflow" slot, and the "overflow" must take place\n
6051 * before the pack is reordered, but (optionally) after the pack is\n
6052 * combined. This may be tricky. See "dungeon.c" for info.\n
6054 * Note that this code must remove any location/stack information\n
6055 * from the object once it is placed into the inventory.\n
6057 s16b inven_carry(object_type *o_ptr)
6059 INVENTORY_IDX i, j, k;
6060 INVENTORY_IDX n = -1;
6065 /* Check for combining */
6066 for (j = 0; j < INVEN_PACK; j++)
6068 j_ptr = &inventory[j];
6070 /* Skip non-objects */
6071 if (!j_ptr->k_idx) continue;
6073 /* Hack -- track last item */
6076 /* Check if the two items can be combined */
6077 if (object_similar(j_ptr, o_ptr))
6079 /* Combine the items */
6080 object_absorb(j_ptr, o_ptr);
6082 /* Increase the weight */
6083 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6085 /* Recalculate bonuses */
6086 p_ptr->update |= (PU_BONUS);
6088 p_ptr->window |= (PW_INVEN);
6097 if (inven_cnt > INVEN_PACK) return (-1);
6099 /* Find an empty slot */
6100 for (j = 0; j <= INVEN_PACK; j++)
6102 j_ptr = &inventory[j];
6104 /* Use it if found */
6105 if (!j_ptr->k_idx) break;
6112 /* Reorder the pack */
6115 /* Get the "value" of the item */
6116 s32b o_value = object_value(o_ptr);
6118 /* Scan every occupied slot */
6119 for (j = 0; j < INVEN_PACK; j++)
6121 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6128 for (k = n; k >= i; k--)
6130 /* Hack -- Slide the item */
6131 object_copy(&inventory[k+1], &inventory[k]);
6134 /* Wipe the empty slot */
6135 object_wipe(&inventory[i]);
6140 object_copy(&inventory[i], o_ptr);
6142 /* Access new object */
6143 j_ptr = &inventory[i];
6146 j_ptr->next_o_idx = 0;
6148 /* Forget monster */
6149 j_ptr->held_m_idx = 0;
6151 /* Forget location */
6152 j_ptr->iy = j_ptr->ix = 0;
6154 /* Player touches it, and no longer marked */
6155 j_ptr->marked = OM_TOUCHED;
6157 /* Increase the weight */
6158 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6160 /* Count the items */
6163 /* Recalculate bonuses */
6164 p_ptr->update |= (PU_BONUS);
6166 /* Combine and Reorder pack */
6167 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
6169 p_ptr->window |= (PW_INVEN);
6171 /* Return the slot */
6177 * @brief 装備スロットからオブジェクトを外すメインルーチン /
6178 * Take off (some of) a non-cursed equipment item
6179 * @param item オブジェクトを外したい所持テーブルのID
6181 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6183 * Note that only one item at a time can be wielded per slot.\n
6184 * Note that taking off an item when "full" may cause that item\n
6185 * to fall to the ground.\n
6186 * Return the inventory slot into which the item is placed.\n
6188 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
6199 char o_name[MAX_NLEN];
6202 /* Get the item to take off */
6203 o_ptr = &inventory[item];
6206 if (amt <= 0) return (-1);
6209 if (amt > o_ptr->number) amt = o_ptr->number;
6211 /* Get local object */
6214 /* Obtain a local object */
6215 object_copy(q_ptr, o_ptr);
6217 /* Modify quantity */
6218 q_ptr->number = amt;
6220 object_desc(o_name, q_ptr, 0);
6222 /* Took off weapon */
6223 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
6224 object_is_melee_weapon(o_ptr))
6226 act = _("を装備からはずした", "You were wielding");
6230 else if (item == INVEN_BOW)
6232 act = _("を装備からはずした", "You were holding");
6235 /* Took off light */
6236 else if (item == INVEN_LITE)
6238 act = _("を光源からはずした", "You were holding");
6241 /* Took off something */
6244 act = _("を装備からはずした", "You were wearing");
6247 /* Modify, Optimize */
6248 inven_item_increase(item, -amt);
6249 inven_item_optimize(item);
6251 /* Carry the object */
6252 slot = inven_carry(q_ptr);
6255 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
6257 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6267 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
6268 * Drop (some of) a non-cursed inventory/equipment item
6269 * @param item 所持テーブルのID
6270 * @param amt 落としたい個数
6273 * The object will be dropped "near" the current location
6275 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
6281 char o_name[MAX_NLEN];
6284 /* Access original object */
6285 o_ptr = &inventory[item];
6288 if (amt <= 0) return;
6291 if (amt > o_ptr->number) amt = o_ptr->number;
6294 /* Take off equipment */
6295 if (item >= INVEN_RARM)
6297 /* Take off first */
6298 item = inven_takeoff(item, amt);
6300 /* Access original object */
6301 o_ptr = &inventory[item];
6305 /* Get local object */
6308 /* Obtain local object */
6309 object_copy(q_ptr, o_ptr);
6311 /* Distribute charges of wands or rods */
6312 distribute_charges(o_ptr, q_ptr, amt);
6314 /* Modify quantity */
6315 q_ptr->number = amt;
6317 /* Describe local object */
6318 object_desc(o_name, q_ptr, 0);
6320 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
6322 /* Drop it near the player */
6323 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
6325 /* Modify, Describe, Optimize */
6326 inven_item_increase(item, -amt);
6327 inven_item_describe(item);
6328 inven_item_optimize(item);
6333 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
6334 * Combine items in the pack
6337 * Note special handling of the "overflow" slot
6339 void combine_pack(void)
6344 bool flag = FALSE, combined;
6350 /* Combine the pack (backwards) */
6351 for (i = INVEN_PACK; i > 0; i--)
6353 o_ptr = &inventory[i];
6355 /* Skip empty items */
6356 if (!o_ptr->k_idx) continue;
6358 /* Scan the items above that item */
6359 for (j = 0; j < i; j++)
6363 j_ptr = &inventory[j];
6365 /* Skip empty items */
6366 if (!j_ptr->k_idx) continue;
6369 * Get maximum number of the stack if these
6370 * are similar, get zero otherwise.
6372 max_num = object_similar_part(j_ptr, o_ptr);
6374 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6375 if (max_num && j_ptr->number < max_num)
6377 if (o_ptr->number + j_ptr->number <= max_num)
6382 /* Add together the item counts */
6383 object_absorb(j_ptr, o_ptr);
6385 /* One object is gone */
6388 /* Slide everything down */
6389 for (k = i; k < INVEN_PACK; k++)
6391 /* Structure copy */
6392 inventory[k] = inventory[k+1];
6395 /* Erase the "final" slot */
6396 object_wipe(&inventory[k]);
6400 int old_num = o_ptr->number;
6401 int remain = j_ptr->number + o_ptr->number - max_num;
6403 o_ptr->number -= remain;
6405 /* Add together the item counts */
6406 object_absorb(j_ptr, o_ptr);
6408 o_ptr->number = remain;
6410 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6411 if (o_ptr->tval == TV_ROD)
6413 o_ptr->pval = o_ptr->pval * remain / old_num;
6414 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6417 /* Hack -- if wands are stacking, combine the charges. -LM- */
6418 if (o_ptr->tval == TV_WAND)
6420 o_ptr->pval = o_ptr->pval * remain / old_num;
6424 p_ptr->window |= (PW_INVEN);
6436 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6440 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6441 * Reorder items in the pack
6444 * Note special handling of the "overflow" slot
6446 void reorder_pack(void)
6456 /* Re-order the pack (forwards) */
6457 for (i = 0; i < INVEN_PACK; i++)
6459 /* Mega-Hack -- allow "proper" over-flow */
6460 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6462 o_ptr = &inventory[i];
6464 /* Skip empty slots */
6465 if (!o_ptr->k_idx) continue;
6467 /* Get the "value" of the item */
6468 o_value = object_value(o_ptr);
6470 /* Scan every occupied slot */
6471 for (j = 0; j < INVEN_PACK; j++)
6473 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6476 /* Never move down */
6477 if (j >= i) continue;
6482 /* Get local object */
6485 /* Save a copy of the moving item */
6486 object_copy(q_ptr, &inventory[i]);
6488 /* Slide the objects */
6489 for (k = i; k > j; k--)
6491 /* Slide the item */
6492 object_copy(&inventory[k], &inventory[k-1]);
6495 /* Insert the moving item */
6496 object_copy(&inventory[j], q_ptr);
6498 p_ptr->window |= (PW_INVEN);
6501 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6505 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6506 * Hack -- display an object kind in the current window
6507 * @param k_idx ベースアイテムの参照ID
6510 * Include list of usable spells for readible books
6512 void display_koff(KIND_OBJECT_IDX k_idx)
6519 REALM_IDX use_realm;
6521 char o_name[MAX_NLEN];
6524 /* Erase the window */
6525 for (y = 0; y < Term->hgt; y++)
6527 /* Erase the line */
6528 Term_erase(0, y, 255);
6534 /* Get local object */
6537 /* Prepare the object */
6538 object_prep(q_ptr, k_idx);
6539 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6541 /* Mention the object name */
6542 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6544 /* Access the item's sval */
6546 use_realm = tval2realm(q_ptr->tval);
6548 /* Warriors are illiterate */
6549 if (p_ptr->realm1 || p_ptr->realm2)
6551 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6555 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6556 if (!is_magic(use_realm)) return;
6557 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6560 /* Display spells in readible books */
6564 SPELL_IDX spells[64];
6566 /* Extract spells */
6567 for (spell = 0; spell < 32; spell++)
6569 /* Check for this spell */
6570 if (fake_spell_flags[sval] & (1L << spell))
6572 /* Collect this spell */
6573 spells[num++] = spell;
6578 print_spells(0, spells, num, 2, 0, use_realm);
6583 * @brief 警告を放つアイテムを選択する /
6584 * Choose one of items that have warning flag
6585 * Calculate spell damages
6588 object_type *choose_warning_item(void)
6591 int choices[INVEN_TOTAL - INVEN_RARM];
6594 /* Paranoia -- Player has no warning ability */
6595 if (!p_ptr->warning) return NULL;
6597 /* Search Inventory */
6598 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6600 BIT_FLAGS flgs[TR_FLAG_SIZE];
6601 object_type *o_ptr = &inventory[i];
6603 object_flags(o_ptr, flgs);
6604 if (have_flag(flgs, TR_WARNING))
6606 choices[number] = i;
6611 /* Choice one of them */
6612 return number ? &inventory[choices[randint0(number)]] : NULL;
6616 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6617 * Calculate spell damages
6618 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6619 * @param typ 効果属性のID
6621 * @param max 算出した最大ダメージを返すポインタ
6624 static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
6626 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6627 int rlev = r_ptr->level;
6628 bool ignore_wraith_form = FALSE;
6630 /* Vulnerability, resistance and immunity */
6634 if (p_ptr->immune_elec)
6637 ignore_wraith_form = TRUE;
6641 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6642 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6643 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6644 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6645 if (IS_OPPOSE_ELEC())
6646 dam = (dam + 2) / 3;
6651 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6652 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6656 if (p_ptr->immune_acid)
6659 ignore_wraith_form = TRUE;
6663 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6664 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6665 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6666 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6672 if (p_ptr->immune_cold)
6675 ignore_wraith_form = TRUE;
6679 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6680 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6681 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6682 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6687 if (p_ptr->immune_fire)
6690 ignore_wraith_form = TRUE;
6694 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6695 if (prace_is_(RACE_ENT)) dam += dam / 3;
6696 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6697 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6698 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6703 ignore_wraith_form = TRUE;
6707 if (!p_ptr->blind &&
6708 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6709 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6712 ignore_wraith_form = TRUE;
6717 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6718 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6719 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6722 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6723 * "dam *= 2;" for later "dam /= 2"
6725 if (p_ptr->wraith_form) dam *= 2;
6729 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6732 ignore_wraith_form = TRUE;
6734 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6738 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6742 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6746 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6750 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6754 if (prace_is_(RACE_SPECTRE))
6757 ignore_wraith_form = TRUE;
6759 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6763 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6767 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6771 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6775 if (p_ptr->levitation) dam = (dam * 2) / 3;
6779 if (p_ptr->resist_shard) dam /= 2;
6783 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6784 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6788 if (p_ptr->mimic_form)
6790 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6793 ignore_wraith_form = TRUE;
6798 switch (p_ptr->prace)
6807 ignore_wraith_form = TRUE;
6814 if (p_ptr->align > 10) dam /= 2;
6815 else if (p_ptr->align < -10) dam *= 2;
6819 if (p_ptr->align > 10) dam *= 2;
6823 case GF_BRAIN_SMASH:
6824 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6827 ignore_wraith_form = TRUE;
6835 if (100 + rlev / 2 <= p_ptr->skill_sav)
6838 ignore_wraith_form = TRUE;
6843 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6846 ignore_wraith_form = TRUE;
6851 if (p_ptr->wraith_form && !ignore_wraith_form)
6857 if (dam > *max) *max = dam;
6861 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6862 * Calculate spell damages
6863 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6864 * @param typ 効果属性のID
6865 * @param m_idx 魔法を行使するモンスターのID
6866 * @param max 算出した最大ダメージを返すポインタ
6869 void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
6871 monster_type *m_ptr = &m_list[m_idx];
6872 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6873 spell_damcalc(m_ptr, typ, dam, max);
6877 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6878 * Calculate blow damages
6879 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6880 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6881 * @return 算出された最大ダメージを返す。
6883 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6885 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6887 bool check_wraith_form = TRUE;
6889 if (blow_ptr->method != RBM_EXPLODE)
6891 ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
6893 switch (blow_ptr->effect)
6897 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6898 dam = MAX(dam, tmp_dam * 2);
6904 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6908 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6910 check_wraith_form = FALSE;
6914 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6916 check_wraith_form = FALSE;
6920 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6922 check_wraith_form = FALSE;
6926 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6928 check_wraith_form = FALSE;
6933 check_wraith_form = FALSE;
6937 if (check_wraith_form && p_ptr->wraith_form)
6945 dam = (dam + 1) / 2;
6946 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
6954 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
6955 * Examine the grid (xx,yy) and warn the player if there are any danger
6956 * @param xx 危険性を調査するマスのX座標
6957 * @param yy 危険性を調査するマスのY座標
6958 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
6960 bool process_warning(POSITION xx, POSITION yy)
6964 char o_name[MAX_NLEN];
6966 #define WARNING_AWARE_RANGE 12
6968 static int old_damage = 0;
6970 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
6972 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
6975 monster_type *m_ptr;
6976 monster_race *r_ptr;
6978 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
6980 c_ptr = &cave[my][mx];
6982 if (!c_ptr->m_idx) continue;
6984 m_ptr = &m_list[c_ptr->m_idx];
6986 if (MON_CSLEEP(m_ptr)) continue;
6987 if (!is_hostile(m_ptr)) continue;
6989 r_ptr = &r_info[m_ptr->r_idx];
6991 /* Monster spells (only powerful ones)*/
6992 if (projectable(my, mx, yy, xx))
6994 BIT_FLAGS f4 = r_ptr->flags4;
6995 BIT_FLAGS f5 = r_ptr->a_ability_flags1;
6996 BIT_FLAGS f6 = r_ptr->a_ability_flags2;
6998 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
7000 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
7001 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
7002 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
7003 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, c_ptr->m_idx, &dam_max0);
7004 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, c_ptr->m_idx, &dam_max0);
7005 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, c_ptr->m_idx, &dam_max0);
7007 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, c_ptr->m_idx, &dam_max0);
7008 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, c_ptr->m_idx, &dam_max0);
7009 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, c_ptr->m_idx, &dam_max0);
7010 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, c_ptr->m_idx, &dam_max0);
7011 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, c_ptr->m_idx, &dam_max0);
7012 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, c_ptr->m_idx, &dam_max0);
7013 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, c_ptr->m_idx, &dam_max0);
7014 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, c_ptr->m_idx, &dam_max0);
7015 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
7016 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, c_ptr->m_idx, &dam_max0);
7017 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, c_ptr->m_idx, &dam_max0);
7018 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
7019 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, c_ptr->m_idx, &dam_max0);
7020 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, c_ptr->m_idx, &dam_max0);
7021 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, c_ptr->m_idx, &dam_max0);
7022 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, c_ptr->m_idx, &dam_max0);
7023 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, c_ptr->m_idx, &dam_max0);
7024 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, c_ptr->m_idx, &dam_max0);
7025 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, c_ptr->m_idx, &dam_max0);
7026 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, c_ptr->m_idx, &dam_max0);
7027 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
7028 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, c_ptr->m_idx, &dam_max0);
7029 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, c_ptr->m_idx, &dam_max0);
7032 /* Monster melee attacks */
7033 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
7035 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
7039 for (m = 0; m < 4; m++)
7041 /* Skip non-attacks */
7042 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
7044 /* Extract the attack info */
7045 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
7046 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
7048 if (dam_melee > dam_max0) dam_max0 = dam_melee;
7052 /* Contribution from this monster */
7053 dam_max += dam_max0;
7057 /* Prevent excessive warning */
7058 if (dam_max > old_damage)
7060 old_damage = dam_max * 3 / 2;
7062 if (dam_max > p_ptr->chp / 2)
7064 object_type *o_ptr = choose_warning_item();
7067 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7069 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7070 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7072 disturb(FALSE, TRUE);
7073 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7076 else old_damage = old_damage / 2;
7078 c_ptr = &cave[yy][xx];
7079 if (((!easy_disarm && is_trap(c_ptr->feat))
7080 || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
7082 object_type *o_ptr = choose_warning_item();
7085 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7087 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7088 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7089 disturb(FALSE, TRUE);
7090 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7097 * エッセンス情報の構造体 / A structure for smithing
7100 int add; /* TR flag number or special essence id */
7101 cptr add_name; /* Name of this ability */
7102 ESSENCE_IDX type; /* Menu number */
7103 int essence; /* Index for carrying essences */
7104 int value; /* Needed value to add this ability */
7109 * エッセンス情報テーブル Smithing type data for Weapon smith
7112 static essence_type essence_info[] =
7114 {TR_STR, "腕力", 4, TR_STR, 20},
7115 {TR_INT, "知能", 4, TR_INT, 20},
7116 {TR_WIS, "賢さ", 4, TR_WIS, 20},
7117 {TR_DEX, "器用さ", 4, TR_DEX, 20},
7118 {TR_CON, "耐久力", 4, TR_CON, 20},
7119 {TR_CHR, "魅力", 4, TR_CHR, 20},
7120 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
7121 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
7122 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
7123 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
7124 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
7125 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
7126 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
7127 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
7128 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
7129 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
7130 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
7131 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
7132 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
7133 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
7134 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
7135 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
7136 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
7137 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
7138 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
7139 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
7140 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
7141 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
7142 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
7143 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
7144 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
7145 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
7146 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
7147 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
7148 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
7149 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
7150 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
7151 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
7152 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
7153 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
7154 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
7155 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
7156 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
7157 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
7158 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
7159 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
7160 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
7161 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
7162 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
7163 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
7164 {TR_SH_FIRE, "", 0, -2, 0},
7165 {TR_SH_ELEC, "", 0, -2, 0},
7166 {TR_SH_COLD, "", 0, -2, 0},
7167 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
7168 {TR_WARNING, "警告", 3, TR_WARNING, 20},
7169 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
7170 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
7171 {TR_LITE_2, "", 0, -2, 0},
7172 {TR_LITE_3, "", 0, -2, 0},
7173 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
7174 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
7175 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
7176 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
7177 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
7179 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
7180 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
7181 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
7182 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
7183 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
7184 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
7185 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
7186 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
7187 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
7188 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
7189 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
7190 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
7191 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
7192 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
7193 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
7194 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
7195 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
7196 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
7198 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
7199 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
7200 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
7201 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
7202 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
7203 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
7204 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
7205 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
7207 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
7208 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
7209 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
7210 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
7211 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
7212 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
7213 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
7214 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
7215 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
7216 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
7217 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
7218 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
7220 {-1, NULL, 0, -1, 0}
7223 static essence_type essence_info[] =
7225 {TR_STR, "strength", 4, TR_STR, 20},
7226 {TR_INT, "intelligence", 4, TR_INT, 20},
7227 {TR_WIS, "wisdom", 4, TR_WIS, 20},
7228 {TR_DEX, "dexterity", 4, TR_DEX, 20},
7229 {TR_CON, "constitution", 4, TR_CON, 20},
7230 {TR_CHR, "charisma", 4, TR_CHR, 20},
7231 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
7232 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
7233 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
7234 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
7235 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
7236 {TR_SPEED, "speed", 4, TR_SPEED, 12},
7237 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
7238 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
7239 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
7240 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
7241 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
7242 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
7243 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
7244 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
7245 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
7246 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
7247 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
7248 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
7249 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
7250 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
7251 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
7252 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
7253 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
7254 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
7255 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
7256 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
7257 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
7258 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
7259 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
7260 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
7261 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
7262 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
7263 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
7264 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
7265 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
7266 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
7267 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
7268 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
7269 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
7270 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
7271 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
7272 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
7273 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
7274 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
7275 {TR_SH_FIRE, "", 0, -2, 0},
7276 {TR_SH_ELEC, "", 0, -2, 0},
7277 {TR_SH_COLD, "", 0, -2, 0},
7278 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
7279 {TR_WARNING, "warning", 3, TR_WARNING, 20},
7280 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
7281 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
7282 {TR_LITE_2, "", 0, -2, 0},
7283 {TR_LITE_3, "", 0, -2, 0},
7284 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7285 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7286 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7287 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7288 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7290 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7291 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7292 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7293 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7294 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7295 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7296 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7297 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7298 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7299 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7300 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7301 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7302 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7303 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
7304 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7305 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7306 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7307 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7309 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7310 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
7311 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
7312 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
7313 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
7314 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
7315 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7316 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7318 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7319 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7320 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7321 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7322 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7323 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7324 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7325 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7326 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7327 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7328 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7329 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7331 {-1, NULL, 0, -1, 0}
7337 * エッセンス名テーブル / Essense names for Weapon smith
7340 cptr essence_name[] =
7443 cptr essence_name[] =
7546 * @brief 所持しているエッセンス一覧を表示する
7549 static void display_essence(void)
7554 for (i = 1; i < 22; i++)
7558 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7559 "Essence Num Essence Num Essence Num "), 1, 8);
7560 for (i = 0; essence_name[i]; i++)
7562 if (!essence_name[i][0]) continue;
7563 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7566 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7576 static void drain_essence(void)
7578 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7582 bool observe = FALSE;
7583 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7584 TIME_EFFECT old_timeout;
7585 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7591 OBJECT_IDX next_o_idx;
7594 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7597 item_tester_hook = object_is_weapon_armour_ammo;
7598 item_tester_no_ryoute = TRUE;
7600 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7601 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7603 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7605 /* Get the item (in the pack) */
7608 o_ptr = &inventory[item];
7611 /* Get the item (on the floor) */
7614 o_ptr = &o_list[0 - item];
7617 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7619 char o_name[MAX_NLEN];
7620 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7621 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7624 p_ptr->energy_use = 100;
7626 object_flags(o_ptr, old_flgs);
7627 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7628 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7629 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7630 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7631 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7632 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7633 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7634 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7635 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7637 old_to_a = o_ptr->to_a;
7639 old_to_h = o_ptr->to_h;
7640 old_to_d = o_ptr->to_d;
7643 old_pval = o_ptr->pval;
7644 old_name2 = o_ptr->name2;
7645 old_timeout = o_ptr->timeout;
7646 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7647 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7648 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7649 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7650 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7651 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7652 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7653 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7654 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7655 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7656 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7657 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7658 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7659 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7660 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7661 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7662 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7663 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7664 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7668 next_o_idx = o_ptr->next_o_idx;
7669 marked = o_ptr->marked;
7670 weight = o_ptr->weight;
7671 number = o_ptr->number;
7673 object_prep(o_ptr, o_ptr->k_idx);
7677 o_ptr->next_o_idx=next_o_idx;
7678 o_ptr->marked=marked;
7679 o_ptr->number = number;
7680 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7681 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7682 o_ptr->ident |= (IDENT_MENTAL);
7683 object_aware(o_ptr);
7684 object_known(o_ptr);
7686 object_flags(o_ptr, new_flgs);
7688 for (i = 0; essence_info[i].add_name; i++)
7690 essence_type *es_ptr = &essence_info[i];
7691 PARAMETER_VALUE pval = 0;
7693 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7694 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7696 if (es_ptr->add < TR_FLAG_MAX &&
7697 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7698 have_flag(old_flgs, es_ptr->add))
7702 drain_value[es_ptr->essence] += 10 * pval;
7704 else if (es_ptr->essence != -2)
7706 drain_value[es_ptr->essence] += 10;
7708 else if (es_ptr->add == TR_SH_FIRE)
7710 drain_value[TR_BRAND_FIRE] += 10;
7711 drain_value[TR_RES_FIRE] += 10;
7713 else if (es_ptr->add == TR_SH_ELEC)
7715 drain_value[TR_BRAND_ELEC] += 10;
7716 drain_value[TR_RES_ELEC] += 10;
7718 else if (es_ptr->add == TR_SH_COLD)
7720 drain_value[TR_BRAND_COLD] += 10;
7721 drain_value[TR_RES_COLD] += 10;
7723 else if (es_ptr->add == TR_LITE_2)
7725 drain_value[TR_LITE_1] += 20;
7727 else if (es_ptr->add == TR_LITE_3)
7729 drain_value[TR_LITE_1] += 30;
7734 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7736 drain_value[TR_INT] += 5;
7737 drain_value[TR_WIS] += 5;
7739 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7741 drain_value[TR_BRAND_POIS] += 5;
7742 drain_value[TR_BRAND_ACID] += 5;
7743 drain_value[TR_BRAND_ELEC] += 5;
7744 drain_value[TR_BRAND_FIRE] += 5;
7745 drain_value[TR_BRAND_COLD] += 5;
7747 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7749 drain_value[TR_INT] += 10;
7751 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7753 drain_value[TR_STR] += 10;
7755 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7757 drain_value[TR_DEX] += 10;
7759 if (old_name2 == EGO_2WEAPON)
7761 drain_value[TR_DEX] += 20;
7763 if (object_is_weapon_ammo(o_ptr))
7765 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7767 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7769 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7770 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7771 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7772 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7774 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7776 drain_value[i] *= number;
7777 drain_value[i] = drain_value[i] * dec / 4;
7778 drain_value[i] = MAX(drain_value[i], 0);
7779 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7787 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7791 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7793 for (i = 0; essence_name[i]; i++)
7795 if (!essence_name[i][0]) continue;
7796 if (!drain_value[i]) continue;
7798 p_ptr->magic_num1[i] += drain_value[i];
7799 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7801 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7805 /* Apply autodestroy/inscription to the drained item */
7806 autopick_alter_item(item, TRUE);
7808 /* Combine the pack */
7809 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
7811 p_ptr->window |= (PW_INVEN);
7815 * @brief 付加するエッセンスの大別を選択する
7816 * @return 選んだエッセンスの大別ID
7818 static COMMAND_CODE choose_essence(void)
7820 COMMAND_CODE mode = 0;
7822 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7825 cptr menu_name[] = {
7835 cptr menu_name[] = {
7845 const COMMAND_CODE mode_max = 7;
7847 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7857 for (i = 0; i < mode_max; i++)
7859 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7860 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7862 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7863 prt("Choose from menu.", 0, 0);
7882 menu_line += mode_max - 1;
7891 if (menu_line > mode_max) menu_line -= mode_max;
7902 for (i = 0; i < mode_max; i++)
7903 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7905 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7911 if (isupper(choice)) choice = (char)tolower(choice);
7913 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7914 mode = (int)choice - 'a' + 1;
7924 * @brief エッセンスを実際に付加する
7925 * @param mode エッセンスの大別ID
7928 static void add_essence(ESSENCE_IDX mode)
7940 char o_name[MAX_NLEN];
7942 essence_type *es_ptr;
7943 bool able[22] = { 0 };
7945 int menu_line = (use_menu ? 1 : 0);
7947 for (i = 0; essence_info[i].add_name; i++)
7949 es_ptr = &essence_info[i];
7951 if (es_ptr->type != mode) continue;
7955 if (!repeat_pull(&i) || i<0 || i>=max_num)
7958 /* Nothing chosen yet */
7964 /* Build a prompt */
7965 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
7966 if (use_menu) screen_save();
7968 /* Get a spell from the user */
7970 choice = (always_show_list || use_menu) ? ESCAPE:1;
7973 if( choice==ESCAPE ) choice = ' ';
7974 else if( !get_com(out_val, &choice, FALSE) )break;
7976 if (use_menu && choice != ' ')
7990 menu_line += (max_num-1);
8013 menu_line = max_num;
8027 if (menu_line > max_num) menu_line -= max_num;
8029 /* Request redraw */
8030 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
8033 if (!redraw || use_menu)
8037 char dummy[80], dummy2[80];
8045 /* Save the screen */
8046 if (!use_menu) screen_save();
8048 for (y = 1; y < 24; y++)
8051 /* Print header(s) */
8053 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
8056 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
8059 for (ctr = 0; ctr < max_num; ctr++)
8061 es_ptr = &essence_info[num[ctr]];
8065 if (ctr == (menu_line-1))
8066 strcpy(dummy, _("》 ", "> "));
8067 else strcpy(dummy, " ");
8070 /* letter/number for power selection */
8073 sprintf(dummy, "%c) ",I2A(ctr));
8076 strcat(dummy, es_ptr->add_name);
8081 if (es_ptr->essence != -1)
8083 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
8084 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
8090 case ESSENCE_SH_FIRE:
8091 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
8092 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
8093 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8095 case ESSENCE_SH_ELEC:
8096 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
8097 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
8098 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8100 case ESSENCE_SH_COLD:
8101 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
8102 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
8103 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8105 case ESSENCE_RESISTANCE:
8106 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8107 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8108 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8109 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8110 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8112 case ESSENCE_SUSTAIN:
8113 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8114 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8115 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8116 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8117 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8122 if (!able[ctr]) col = TERM_RED;
8124 if (es_ptr->essence != -1)
8126 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
8130 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
8133 c_prt(col, dummy2, ctr+2, x);
8143 /* Restore the screen */
8154 ask = (isupper(choice));
8157 if (ask) choice = (char)tolower(choice);
8159 /* Extract request */
8160 i = (islower(choice) ? A2I(choice) : -1);
8163 /* Totally Illegal */
8164 if ((i < 0) || (i >= max_num) || !able[i])
8176 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
8178 /* Belay that order */
8179 if (!get_check(tmp_val)) continue;
8186 /* Restore the screen */
8187 if (redraw) screen_load();
8193 es_ptr = &essence_info[num[i]];
8195 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8196 item_tester_tval = TV_GLOVES;
8197 else if (mode == 1 || mode == 5)
8198 item_tester_hook = item_tester_hook_melee_ammo;
8199 else if (es_ptr->add == ESSENCE_ATTACK)
8200 item_tester_hook = object_allow_enchant_weapon;
8201 else if (es_ptr->add == ESSENCE_AC)
8202 item_tester_hook = object_is_armour;
8204 item_tester_hook = object_is_weapon_armour_ammo;
8205 item_tester_no_ryoute = TRUE;
8207 q = _("どのアイテムを改良しますか?", "Improve which item? ");
8208 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
8210 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8212 /* Get the item (in the pack) */
8215 o_ptr = &inventory[item];
8218 /* Get the item (on the floor) */
8221 o_ptr = &o_list[0 - item];
8224 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
8226 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
8230 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8232 use_essence = es_ptr->value;
8233 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
8234 if (o_ptr->number > 1)
8236 use_essence *= o_ptr->number;
8237 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
8240 if (es_ptr->essence != -1)
8242 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8244 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8247 if (is_pval_flag(es_ptr->add))
8249 if (o_ptr->pval < 0)
8251 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
8254 else if (es_ptr->add == TR_BLOWS)
8256 if (o_ptr->pval > 1)
8258 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
8262 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8264 else if (o_ptr->pval > 0)
8266 use_essence *= o_ptr->pval;
8267 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8273 PARAMETER_VALUE pval;
8274 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8276 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
8277 strcpy(tmp_val, "1");
8279 if (!get_string(tmp, tmp_val, 1)) return;
8280 pval = (PARAMETER_VALUE)atoi(tmp_val);
8281 if (pval > limit) pval = limit;
8282 else if (pval < 1) pval = 1;
8283 o_ptr->pval += pval;
8284 use_essence *= pval;
8285 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8288 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8290 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8294 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8301 strcpy(tmp_val, "1");
8302 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
8303 val = atoi(tmp_val);
8304 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8305 else if (val < 1) val = 1;
8307 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8308 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8310 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8313 get_to_h = ((val+1)/2+randint0(val/2+1));
8314 get_to_d = ((val+1)/2+randint0(val/2+1));
8315 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8316 o_ptr->to_h += get_to_h;
8317 o_ptr->to_d += get_to_d;
8319 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8320 if (es_ptr->add == ESSENCE_ATTACK)
8322 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8324 msg_print(_("改良に失敗した。", "You failed to enchant."));
8325 p_ptr->energy_use = 100;
8330 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8331 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8334 else if (es_ptr->add == ESSENCE_AC)
8336 if (o_ptr->to_a >= p_ptr->lev/5+5)
8338 msg_print(_("改良に失敗した。", "You failed to enchant."));
8339 p_ptr->energy_use = 100;
8344 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8349 o_ptr->xtra3 = es_ptr->add + 1;
8354 bool success = TRUE;
8358 case ESSENCE_SH_FIRE:
8359 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8364 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8365 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8367 case ESSENCE_SH_ELEC:
8368 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8373 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8374 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8376 case ESSENCE_SH_COLD:
8377 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8382 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8383 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8385 case ESSENCE_RESISTANCE:
8386 case ESSENCE_SUSTAIN:
8387 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))
8392 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8393 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8394 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8395 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8400 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8403 if (es_ptr->add == ESSENCE_SUSTAIN)
8405 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8406 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8407 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8408 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8412 o_ptr->xtra3 = es_ptr->add + 1;
8416 p_ptr->energy_use = 100;
8419 msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name);
8421 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8424 /* Combine the pack */
8425 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8427 p_ptr->window |= (PW_INVEN);
8434 static void erase_essence(void)
8439 char o_name[MAX_NLEN];
8440 BIT_FLAGS flgs[TR_FLAG_SIZE];
8442 item_tester_hook = object_is_smith;
8444 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
8445 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
8447 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8449 /* Get the item (in the pack) */
8452 o_ptr = &inventory[item];
8455 /* Get the item (on the floor) */
8458 o_ptr = &o_list[0 - item];
8461 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8462 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
8464 p_ptr->energy_use = 100;
8466 if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE)
8468 o_ptr->to_h -= (o_ptr->xtra4>>8);
8469 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8471 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8472 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8475 object_flags(o_ptr, flgs);
8476 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8477 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8479 /* Combine the pack */
8480 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8482 p_ptr->window |= (PW_INVEN);
8486 * @brief 鍛冶コマンドのメインルーチン
8487 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8490 void do_cmd_kaji(bool only_browse)
8492 COMMAND_CODE mode = 0;
8495 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8499 if (p_ptr->confused)
8501 msg_print(_("混乱していて作業できない!", "You are too confused!"));
8506 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8511 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8516 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8518 if (only_browse) screen_save();
8520 if (!only_browse) screen_save();
8526 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8527 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8528 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8529 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8530 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8531 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8533 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8534 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8535 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8536 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8537 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8538 prt(format("Choose command from menu."), 0, 0);
8565 if (menu_line > 5) menu_line -= 5;
8573 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
8574 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
8575 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
8576 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
8577 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
8579 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8581 if (!get_com("Command :", &choice, TRUE))
8618 /* Clear lines, position cursor (really should use strlen here) */
8619 Term_erase(14, 21, 255);
8620 Term_erase(14, 20, 255);
8621 Term_erase(14, 19, 255);
8622 Term_erase(14, 18, 255);
8623 Term_erase(14, 17, 255);
8624 Term_erase(14, 16, 255);
8626 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8627 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8629 prt(&temp[j], line, 15);
8634 if (!only_browse) screen_load();
8635 } while (only_browse);
8640 case 1: display_essence();break;
8641 case 2: drain_essence();break;
8642 case 3: erase_essence();break;
8644 mode = choose_essence();
8649 case 5: add_essence(10);break;
8655 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8656 * Torches have special abilities when they are flaming.
8657 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8658 * @param flgs 特別に追加するフラグを返す参照ポインタ
8661 void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
8663 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8665 if (o_ptr->xtra4 > 0)
8667 add_flag(flgs, TR_BRAND_FIRE);
8668 add_flag(flgs, TR_KILL_UNDEAD);
8669 add_flag(flgs, TR_THROW);
8675 * @brief 投擲時たいまつにダイスを与える。
8676 * Torches have special abilities when they are flaming.
8677 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8678 * @param dd 特別なダイス数を返す参照ポインタ
8679 * @param ds 特別なダイス面数を返す参照ポインタ
8682 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
8684 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8686 if (o_ptr->xtra4 > 0)
8695 * @brief 投擲時命中したたいまつの寿命を縮める。
8696 * Torches have special abilities when they are flaming.
8697 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8700 void torch_lost_fuel(object_type *o_ptr)
8702 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8704 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8705 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;