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;
67 OBJECT_IDX prev_o_idx = 0;
70 j_ptr = &o_list[o_idx];
73 if (j_ptr->held_m_idx)
78 m_ptr = &m_list[j_ptr->held_m_idx];
80 /* Scan all objects in the grid */
81 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
84 o_ptr = &o_list[this_o_idx];
86 /* Acquire next object */
87 next_o_idx = o_ptr->next_o_idx;
89 if (this_o_idx == o_idx)
94 /* Remove from list */
95 m_ptr->hold_o_idx = next_o_idx;
103 /* Previous object */
104 k_ptr = &o_list[prev_o_idx];
106 /* Remove from list */
107 k_ptr->next_o_idx = next_o_idx;
110 /* Forget next pointer */
111 o_ptr->next_o_idx = 0;
116 /* Save prev_o_idx */
117 prev_o_idx = this_o_idx;
126 POSITION y = j_ptr->iy;
127 POSITION x = j_ptr->ix;
132 /* Scan all objects in the grid */
133 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
136 o_ptr = &o_list[this_o_idx];
138 /* Acquire next object */
139 next_o_idx = o_ptr->next_o_idx;
141 if (this_o_idx == o_idx)
146 /* Remove from list */
147 c_ptr->o_idx = next_o_idx;
155 /* Previous object */
156 k_ptr = &o_list[prev_o_idx];
158 /* Remove from list */
159 k_ptr->next_o_idx = next_o_idx;
162 /* Forget next pointer */
163 o_ptr->next_o_idx = 0;
168 /* Save prev_o_idx */
169 prev_o_idx = this_o_idx;
175 * @brief オブジェクトを削除する /
176 * Delete a dungeon object
177 * @param o_idx 削除対象のオブジェクト構造体ポインタ
180 * Handle "stacks" of objects correctly.
182 void delete_object_idx(OBJECT_IDX o_idx)
187 excise_object_idx(o_idx);
190 j_ptr = &o_list[o_idx];
193 if (!(j_ptr->held_m_idx))
211 * @brief フロアにマスに落ちているオブジェクトを全て削除する / Deletes all objects at given location
212 * Delete a dungeon object
213 * @param y 削除したフロアマスのY座標
214 * @param x 削除したフロアマスのX座標
217 void delete_object(POSITION y, POSITION x)
220 OBJECT_IDX this_o_idx, next_o_idx = 0;
222 /* Refuse "illegal" locations */
223 if (!in_bounds(y, x)) return;
228 /* Scan all objects in the grid */
229 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
232 o_ptr = &o_list[this_o_idx];
234 /* Acquire next object */
235 next_o_idx = o_ptr->next_o_idx;
242 /* Objects are gone */
251 * @brief グローバルオブジェクト配列に対し指定範囲のオブジェクトを整理してIDの若い順に寄せる /
252 * Move an object from index i1 to index i2 in the object list
253 * @param i1 整理したい配列の始点
254 * @param i2 整理したい配列の終点
257 static void compact_objects_aux(OBJECT_IDX i1, OBJECT_IDX i2)
264 if (i1 == i2) return;
267 for (i = 1; i < o_max; i++)
271 /* Skip "dead" objects */
272 if (!o_ptr->k_idx) continue;
274 /* Repair "next" pointers */
275 if (o_ptr->next_o_idx == i1)
278 o_ptr->next_o_idx = i2;
284 if (o_ptr->held_m_idx)
288 /* Acquire monster */
289 m_ptr = &m_list[o_ptr->held_m_idx];
292 if (m_ptr->hold_o_idx == i1)
295 m_ptr->hold_o_idx = i2;
304 /* Acquire location */
312 if (c_ptr->o_idx == i1)
320 o_list[i2] = o_list[i1];
328 * @brief グローバルオブジェクト配列から優先度の低いものを削除し、データを圧縮する。 /
329 * Compact and Reorder the object list.
330 * @param size 最低でも減らしたいオブジェクト数の水準
334 * This function can be very dangerous, use with caution!\n
336 * When actually "compacting" objects, we base the saving throw on a\n
337 * combination of object level, distance from player, and current\n
340 * After "compacting" (if needed), we "reorder" the objects into a more\n
341 * compact order, and we reset the allocation info, and the "live" array.\n
343 void compact_objects(int size)
348 int cur_lev, cur_dis, chance;
354 msg_print(_("アイテム情報を圧縮しています...", "Compacting objects..."));
355 p_ptr->redraw |= (PR_MAP);
356 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
360 /* Compact at least 'size' objects */
361 for (num = 0, cnt = 1; num < size; cnt++)
363 /* Get more vicious each iteration */
366 /* Get closer each iteration */
367 cur_dis = 5 * (20 - cnt);
369 /* Examine the objects */
370 for (i = 1; i < o_max; i++)
374 /* Skip dead objects */
375 if (!o_ptr->k_idx) continue;
377 /* Hack -- High level objects start out "immune" */
378 if (k_info[o_ptr->k_idx].level > cur_lev) continue;
381 if (o_ptr->held_m_idx)
385 /* Acquire monster */
386 m_ptr = &m_list[o_ptr->held_m_idx];
388 /* Get the location */
392 /* Monsters protect their objects */
393 if (randint0(100) < 90) continue;
399 /* Get the location */
404 /* Nearby objects start out "immune" */
405 if ((cur_dis > 0) && (distance(p_ptr->y, p_ptr->x, y, x) < cur_dis)) continue;
410 /* Hack -- only compact artifacts in emergencies */
411 if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
412 (cnt < 1000)) chance = 100;
414 /* Apply the saving throw */
415 if (randint0(100) < chance) continue;
417 delete_object_idx(i);
425 /* Excise dead objects (backwards!) */
426 for (i = o_max - 1; i >= 1; i--)
430 /* Skip real objects */
431 if (o_ptr->k_idx) continue;
433 /* Move last object into open hole */
434 compact_objects_aux(o_max - 1, i);
436 /* Compress "o_max" */
443 * @brief グローバルオブジェクト配列を初期化する /
444 * Delete all the items when player leaves the level
445 * @note we do NOT visually reflect these (irrelevant) changes
447 * Hack -- we clear the "c_ptr->o_idx" field for every grid,
448 * and the "m_ptr->next_o_idx" field for every monster, since
449 * we know we are clearing every object. Technically, we only
450 * clear those fields for grids/monsters containing objects,
451 * and we clear it once for every such object.
454 void wipe_o_list(void)
458 /* Delete the existing objects */
459 for (i = 1; i < o_max; i++)
461 object_type *o_ptr = &o_list[i];
463 /* Skip dead objects */
464 if (!o_ptr->k_idx) continue;
466 /* Mega-Hack -- preserve artifacts */
467 if (!character_dungeon || preserve_mode)
469 /* Hack -- Preserve unknown artifacts */
470 if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
472 /* Mega-Hack -- Preserve the artifact */
473 a_info[o_ptr->name1].cur_num = 0;
478 if (o_ptr->held_m_idx)
483 m_ptr = &m_list[o_ptr->held_m_idx];
485 /* Hack -- see above */
486 m_ptr->hold_o_idx = 0;
494 /* Access location */
495 POSITION y = o_ptr->iy;
496 POSITION x = o_ptr->ix;
501 /* Hack -- see above */
516 * @brief グローバルオブジェクト配列から空きを取得する /
517 * Acquires and returns the index of a "free" object.
518 * @return 開いているオブジェクト要素のID
520 * This routine should almost never fail, but in case it does,
521 * we must be sure to handle "failure" of this routine.
523 OBJECT_IDX o_pop(void)
527 /* Initial allocation */
528 if (o_max < max_o_idx)
533 /* Expand object array */
539 /* Use this object */
544 /* Recycle dead objects */
545 for (i = 1; i < o_max; i++)
550 /* Skip live objects */
551 if (o_ptr->k_idx) continue;
556 /* Use this object */
561 /* Warn the player (except during dungeon creation) */
562 if (character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!"));
569 * @brief オブジェクト生成テーブルに生成制約を加える /
570 * Apply a "object restriction function" to the "object allocation table"
572 * @details 生成の制約はグローバルのget_obj_num_hook関数ポインタで加える
574 static errr get_obj_num_prep(void)
579 alloc_entry *table = alloc_kind_table;
581 /* Scan the allocation table */
582 for (i = 0; i < alloc_kind_size; i++)
584 /* Accept objects which pass the restriction, if any */
585 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
587 /* Accept this object */
588 table[i].prob2 = table[i].prob1;
591 /* Do not use this object */
594 /* Decline this object */
605 * @brief オブジェクト生成テーブルからアイテムを取得する /
606 * Choose an object kind that seems "appropriate" to the given level
608 * @return 選ばれたオブジェクトベースID
610 * This function uses the "prob2" field of the "object allocation table",\n
611 * and various local information, to calculate the "prob3" field of the\n
612 * same table, which is then used to choose an "appropriate" object, in\n
613 * a relatively efficient manner.\n
615 * It is (slightly) more likely to acquire an object of the given level\n
616 * than one of a lower level. This is done by choosing several objects\n
617 * appropriate to the given level and keeping the "hardest" one.\n
619 * Note that if no objects are "appropriate", then this function will\n
620 * fail, and return zero, but this should *almost* never happen.\n
622 OBJECT_IDX get_obj_num(DEPTH level)
625 KIND_OBJECT_IDX k_idx;
628 alloc_entry *table = alloc_kind_table;
630 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
633 if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER))
635 /* Occasional "boost" */
636 if (one_in_(GREAT_OBJ))
638 /* What a bizarre calculation */
639 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
646 /* Process probabilities */
647 for (i = 0; i < alloc_kind_size; i++)
649 /* Objects are sorted by depth */
650 if (table[i].level > level) break;
655 /* Access the index */
656 k_idx = table[i].index;
658 /* Access the actual kind */
659 k_ptr = &k_info[k_idx];
661 /* Hack -- prevent embedded chests */
662 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
665 table[i].prob3 = table[i].prob2;
668 total += table[i].prob3;
671 /* No legal objects */
672 if (total <= 0) return (0);
676 value = randint0(total);
678 /* Find the object */
679 for (i = 0; i < alloc_kind_size; i++)
681 /* Found the entry */
682 if (value < table[i].prob3) break;
685 value = value - table[i].prob3;
692 /* Try for a "better" object once (50%) or twice (10%) */
699 value = randint0(total);
701 /* Find the object */
702 for (i = 0; i < alloc_kind_size; i++)
704 /* Found the entry */
705 if (value < table[i].prob3) break;
708 value = value - table[i].prob3;
711 /* Keep the "best" one */
712 if (table[i].level < table[j].level) i = j;
715 /* Try for a "better" object twice (10%) */
722 value = randint0(total);
724 /* Find the object */
725 for (i = 0; i < alloc_kind_size; i++)
727 /* Found the entry */
728 if (value < table[i].prob3) break;
731 value = value - table[i].prob3;
734 /* Keep the "best" one */
735 if (table[i].level < table[j].level) i = j;
738 return (table[i].index);
743 * @brief オブジェクトを鑑定済にする /
744 * Known is true when the "attributes" of an object are "known".
745 * @param o_ptr 鑑定済にするオブジェクトの構造体参照ポインタ
747 * These include tohit, todam, toac, cost, and pval (charges).\n
749 * Note that "knowing" an object gives you everything that an "awareness"\n
750 * gives you, and much more. In fact, the player is always "aware" of any\n
751 * item of which he has full "knowledge".\n
753 * But having full knowledge of, say, one "wand of wonder", does not, by\n
754 * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
755 * It happens that most "identify" routines (including "buying from a shop")\n
756 * will make the player "aware" of the object as well as fully "know" it.\n
758 * This routine also removes any inscriptions generated by "feelings".\n
760 void object_known(object_type *o_ptr)
762 /* Remove "default inscriptions" */
763 o_ptr->feeling = FEEL_NONE;
765 /* Clear the "Felt" info */
766 o_ptr->ident &= ~(IDENT_SENSE);
768 /* Clear the "Empty" info */
769 o_ptr->ident &= ~(IDENT_EMPTY);
771 /* Now we know about the item */
772 o_ptr->ident |= (IDENT_KNOWN);
776 * @brief オブジェクトを*鑑定*済にする /
777 * The player is now aware of the effects of the given object.
778 * @param o_ptr *鑑定*済にするオブジェクトの構造体参照ポインタ
781 void object_aware(object_type *o_ptr)
783 bool mihanmei = !object_is_aware(o_ptr);
785 /* Fully aware of the effects */
786 k_info[o_ptr->k_idx].aware = TRUE;
788 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
789 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
793 char o_name[MAX_NLEN];
796 object_copy(q_ptr, o_ptr);
799 object_desc(o_name, q_ptr, OD_NAME_ONLY);
801 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
806 * @brief オブジェクトを試行済にする /
807 * Something has been "sampled"
808 * @param o_ptr 試行済にするオブジェクトの構造体参照ポインタ
811 void object_tried(object_type *o_ptr)
813 /* Mark it as tried (even if "aware") */
814 k_info[o_ptr->k_idx].tried = TRUE;
818 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
819 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
820 * @return 擬似鑑定結果のIDを返す。
822 byte value_check_aux1(object_type *o_ptr)
825 if (object_is_artifact(o_ptr))
828 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
835 if (object_is_ego(o_ptr))
838 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
841 return FEEL_EXCELLENT;
845 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
848 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
850 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
852 /* Good "armor" bonus */
853 if (o_ptr->to_a > 0) return FEEL_GOOD;
855 /* Good "weapon" bonus */
856 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
858 /* Default to "average" */
863 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 2 (Light).
864 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
865 * @return 擬似鑑定結果のIDを返す。
867 byte value_check_aux2(object_type *o_ptr)
869 /* Cursed items (all of them) */
870 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
872 /* Broken items (all of them) */
873 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
875 /* Artifacts -- except cursed/broken ones */
876 if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
878 /* Ego-Items -- except cursed/broken ones */
879 if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
881 /* Good armor bonus */
882 if (o_ptr->to_a > 0) return FEEL_UNCURSED;
884 /* Good weapon bonuses */
885 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
892 * @brief 未鑑定なベースアイテムの基本価格を返す /
893 * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
894 * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
895 * @return オブジェクトの未鑑定価格
897 static s32b object_value_base(object_type *o_ptr)
899 /* Aware item -- use template cost */
900 if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
902 /* Analyze the type */
907 case TV_FOOD: return (5L);
909 /* Un-aware Potions */
910 case TV_POTION: return (20L);
912 /* Un-aware Scrolls */
913 case TV_SCROLL: return (20L);
915 /* Un-aware Staffs */
916 case TV_STAFF: return (70L);
919 case TV_WAND: return (50L);
922 case TV_ROD: return (90L);
925 case TV_RING: return (45L);
927 /* Un-aware Amulets */
928 case TV_AMULET: return (45L);
930 /* Figurines, relative to monster level */
933 DEPTH level = r_info[o_ptr->pval].level;
934 if (level < 20) return level*50L;
935 else if (level < 30) return 1000+(level-20)*150L;
936 else if (level < 40) return 2500+(level-30)*350L;
937 else if (level < 50) return 6000+(level-40)*800L;
938 else return 14000+(level-50)*2000L;
942 if (!o_ptr->pval) return 1000L;
943 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
946 /* Paranoia -- Oops */
952 * @brief オブジェクトのフラグ類から価格を算出する /
953 * Return the value of the flags the object has...
954 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
955 * @param plusses フラグに与える価格の基本重み
956 * @return オブジェクトのフラグ価格
958 s32b flag_cost(object_type *o_ptr, int plusses)
961 BIT_FLAGS flgs[TR_FLAG_SIZE];
965 object_kind *k_ptr = &k_info[o_ptr->k_idx];
967 object_flags(o_ptr, flgs);
970 * Exclude fixed flags of the base item.
971 * pval bonuses of base item will be treated later.
973 for (i = 0; i < TR_FLAG_SIZE; i++)
974 flgs[i] &= ~(k_ptr->flags[i]);
976 /* Exclude fixed flags of the fixed artifact. */
977 if (object_is_fixed_artifact(o_ptr))
979 artifact_type *a_ptr = &a_info[o_ptr->name1];
981 for (i = 0; i < TR_FLAG_SIZE; i++)
982 flgs[i] &= ~(a_ptr->flags[i]);
985 /* Exclude fixed flags of the ego-item. */
986 else if (object_is_ego(o_ptr))
988 ego_item_type *e_ptr = &e_info[o_ptr->name2];
990 for (i = 0; i < TR_FLAG_SIZE; i++)
991 flgs[i] &= ~(e_ptr->flags[i]);
996 * Calucurate values of remaining flags
998 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
999 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
1000 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
1001 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
1002 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
1003 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
1004 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
1005 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
1006 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
1007 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
1008 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
1009 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
1010 total += (10000 + (2500 * plusses));
1011 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
1012 total += (10000 + (2500 * plusses));
1016 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
1017 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
1018 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
1019 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
1020 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
1021 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
1022 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
1023 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
1024 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
1025 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
1026 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
1027 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
1028 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
1029 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
1030 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
1031 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
1032 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
1033 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
1034 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
1035 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
1036 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
1038 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
1039 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
1040 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
1041 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
1042 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
1043 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
1044 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
1045 total += (tmp_cost * count);
1047 if (have_flag(flgs, TR_SUST_STR)) total += 850;
1048 if (have_flag(flgs, TR_SUST_INT)) total += 850;
1049 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
1050 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
1051 if (have_flag(flgs, TR_SUST_CON)) total += 850;
1052 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
1053 if (have_flag(flgs, TR_RIDING)) total += 0;
1054 if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
1055 if (have_flag(flgs, TR_THROW)) total += 5000;
1056 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
1057 if (have_flag(flgs, TR_HOLD_EXP)) total += 8500;
1061 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
1062 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
1063 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
1064 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
1065 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
1066 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
1067 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
1068 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
1069 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
1070 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
1071 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
1072 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
1073 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
1074 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
1075 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
1076 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
1077 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
1078 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
1079 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
1080 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
1081 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
1082 total += (tmp_cost * count);
1084 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
1085 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
1086 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1087 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1088 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1089 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1090 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1091 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1092 if (have_flag(flgs, TR_LEVITATION)) total += 1250;
1093 if (have_flag(flgs, TR_LITE_1)) total += 1500;
1094 if (have_flag(flgs, TR_LITE_2)) total += 2500;
1095 if (have_flag(flgs, TR_LITE_3)) total += 4000;
1096 if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
1097 if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
1098 if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
1099 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1100 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1101 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1102 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1103 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1104 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1105 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1106 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1107 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1108 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1109 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1110 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1111 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1112 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1113 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1114 if (have_flag(flgs, TR_REGEN)) total += 2500;
1115 if (have_flag(flgs, TR_WARNING)) total += 2000;
1116 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1117 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1118 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1119 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1120 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1121 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1122 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1123 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1124 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1125 if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
1126 if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
1127 if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
1128 if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
1129 if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
1130 if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
1131 if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
1132 if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
1133 if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
1134 if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
1135 if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
1136 if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
1137 if (have_flag(flgs, TR_TELEPORT))
1139 if (object_is_cursed(o_ptr))
1144 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1145 if (have_flag(flgs, TR_BLESSED)) total += 750;
1146 if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1147 if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1148 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1149 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1150 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1152 /* Also, give some extra for activatable powers... */
1153 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1155 const activation_type* const act_ptr = find_activation_info(o_ptr);
1157 total += act_ptr->value;
1166 * @brief オブジェクトの真の価格を算出する /
1167 * Return the value of the flags the object has...
1168 * @param o_ptr 本価格を確認したいオブジェクトの構造体参照ポインタ
1169 * @return オブジェクトの本価格
1171 * Return the "real" price of a "known" item, not including discounts\n
1173 * Wand and staffs get cost for each charge\n
1175 * Armor is worth an extra 100 gold per bonus point to armor class.\n
1177 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
1179 * Missiles are only worth 5 gold per bonus point, since they\n
1180 * usually appear in groups of 20, and we want the player to get\n
1181 * the same amount of cash for any "equivalent" item. Note that\n
1182 * missiles never have any of the "pval" flags, and in fact, they\n
1183 * only have a few of the available flags, primarily of the "slay"\n
1184 * and "brand" and "ignore" variety.\n
1186 * Armor with a negative armor bonus is worthless.\n
1187 * Weapons with negative hit+damage bonuses are worthless.\n
1189 * Every wearable item with a "pval" bonus is worth extra (see below).\n
1191 PRICE object_value_real(object_type *o_ptr)
1194 BIT_FLAGS flgs[TR_FLAG_SIZE];
1195 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1198 /* Hack -- "worthless" items */
1199 if (!k_info[o_ptr->k_idx].cost) return (0L);
1202 value = k_info[o_ptr->k_idx].cost;
1204 /* Extract some flags */
1205 object_flags(o_ptr, flgs);
1208 if (object_is_fixed_artifact(o_ptr))
1210 artifact_type *a_ptr = &a_info[o_ptr->name1];
1212 /* Hack -- "worthless" artifacts */
1213 if (!a_ptr->cost) return (0L);
1215 /* Hack -- Use the artifact cost instead */
1216 value = a_ptr->cost;
1217 value += flag_cost(o_ptr, o_ptr->pval);
1219 /* Don't add pval bonuses etc. */
1224 else if (object_is_ego(o_ptr))
1226 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1228 /* Hack -- "worthless" ego-items */
1229 if (!e_ptr->cost) return (0L);
1231 /* Hack -- Reward the ego-item with a bonus */
1232 value += e_ptr->cost;
1233 value += flag_cost(o_ptr, o_ptr->pval);
1241 for (i = 0; i < TR_FLAG_SIZE; i++)
1242 if (o_ptr->art_flags[i]) flag = TRUE;
1244 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1247 /* Analyze pval bonus for normal object */
1248 switch (o_ptr->tval)
1271 if (!o_ptr->pval) break;
1273 /* Hack -- Negative "pval" is always bad */
1274 if (o_ptr->pval < 0) return (0L);
1276 /* Give credit for stat bonuses */
1277 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1278 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1279 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1280 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1281 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1282 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1284 /* Give credit for stealth and searching */
1285 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1286 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1287 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1289 /* Give credit for infra-vision and tunneling */
1290 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1291 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1293 /* Give credit for extra attacks */
1294 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1296 /* Give credit for speed bonus */
1297 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1303 /* Analyze the item */
1304 switch (o_ptr->tval)
1309 /* Pay extra for charges, depending on standard number of
1310 * charges. Handle new-style wands correctly. -LM-
1312 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1318 /* Pay extra for charges, depending on standard number of
1321 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1330 /* Hack -- negative bonuses are bad */
1331 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1333 /* Give credit for bonuses */
1334 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1350 /* Hack -- negative armor bonus */
1351 if (o_ptr->to_a < 0) return (0L);
1353 /* Give credit for bonuses */
1354 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1366 /* Hack -- negative hit/damage bonuses */
1367 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1369 /* Factor in the bonuses */
1370 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1372 /* Hack -- Factor in extra damage dice and sides */
1373 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1374 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1384 /* Hack -- negative hit/damage bonuses */
1385 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1387 /* Factor in the bonuses */
1388 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1390 /* Hack -- Factor in extra damage dice and sides */
1391 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1392 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1397 /* Figurines, relative to monster level */
1400 DEPTH level = r_info[o_ptr->pval].level;
1401 if (level < 20) value = level*50L;
1402 else if (level < 30) value = 1000+(level-20)*150L;
1403 else if (level < 40) value = 2500+(level-30)*350L;
1404 else if (level < 50) value = 6000+(level-40)*800L;
1405 else value = 14000+(level-50)*2000L;
1411 if (!o_ptr->pval) value = 1000L;
1412 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1418 if (!o_ptr->pval) value = 0L;
1423 /* Worthless object */
1424 if (value < 0) return 0L;
1426 /* Return the value */
1432 * @brief オブジェクト価格算出のメインルーチン /
1433 * Return the price of an item including plusses (and charges)
1434 * @param o_ptr 判明している現価格を確認したいオブジェクトの構造体参照ポインタ
1435 * @return オブジェクトの判明している現価格
1437 * This function returns the "value" of the given item (qty one)\n
1439 * Never notice "unknown" bonuses or properties, including "curses",\n
1440 * since that would give the player information he did not have.\n
1442 * Note that discounted items stay discounted forever, even if\n
1443 * the discount is "forgotten" by the player via memory loss.\n
1445 PRICE object_value(object_type *o_ptr)
1449 /* Unknown items -- acquire a base value */
1450 if (object_is_known(o_ptr))
1452 /* Broken items -- worthless */
1453 if (object_is_broken(o_ptr)) return (0L);
1455 /* Cursed items -- worthless */
1456 if (object_is_cursed(o_ptr)) return (0L);
1458 /* Real value (see above) */
1459 value = object_value_real(o_ptr);
1462 /* Known items -- acquire the actual value */
1465 /* Hack -- Felt broken items */
1466 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1468 /* Hack -- Felt cursed items */
1469 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1471 /* Base value (see above) */
1472 value = object_value_base(o_ptr);
1476 /* Apply discount (if any) */
1477 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1480 /* Return the final value */
1487 * @brief 破壊可能なアイテムかを返す /
1488 * Determines whether an object can be destroyed, and makes fake inscription.
1489 * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
1490 * @return オブジェクトが破壊可能ならばTRUEを返す
1492 bool can_player_destroy_object(object_type *o_ptr)
1494 /* Artifacts cannot be destroyed */
1495 if (!object_is_artifact(o_ptr)) return TRUE;
1497 /* If object is unidentified, makes fake inscription */
1498 if (!object_is_known(o_ptr))
1500 byte feel = FEEL_SPECIAL;
1502 /* Hack -- Handle icky artifacts */
1503 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1505 /* Hack -- inscribe the artifact */
1506 o_ptr->feeling = feel;
1508 /* We have "felt" it (again) */
1509 o_ptr->ident |= (IDENT_SENSE);
1511 /* Combine the pack */
1512 p_ptr->notice |= (PN_COMBINE);
1514 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1519 /* Identified artifact -- Nothing to do */
1525 * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
1526 * Distribute charges of rods or wands.
1527 * @param o_ptr 分割元オブジェクトの構造体参照ポインタ source item
1528 * @param q_ptr 分割先オブジェクトの構造体参照ポインタ target item, must be of the same type as o_ptr
1529 * @param amt 分割したい回数量 number of items that are transfered
1532 * Hack -- If rods or wands are dropped, the total maximum timeout or\n
1533 * charges need to be allocated between the two stacks. If all the items\n
1534 * are being dropped, it makes for a neater message to leave the original\n
1535 * stack's pval alone. -LM-\n
1537 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1539 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1541 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1542 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1544 /* Hack -- Rods also need to have their timeouts distributed. The
1545 * dropped stack will accept all time remaining to charge up to its
1548 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1550 if (q_ptr->pval > o_ptr->timeout)
1551 q_ptr->timeout = o_ptr->timeout;
1553 q_ptr->timeout = q_ptr->pval;
1555 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1561 * @brief 魔法棒やロッドの使用回数を減らす /
1562 * @param o_ptr オブジェクトの構造体参照ポインタ source item
1563 * @param amt 減らしたい回数量 number of items that are transfered
1566 * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1567 * charges of the stack needs to be reduced, unless all the items are\n
1568 * being destroyed. -LM-\n
1570 void reduce_charges(object_type *o_ptr, int amt)
1572 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1573 (amt < o_ptr->number))
1575 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1580 * Determine if an item can "absorb" a second item
1582 * See "object_absorb()" for the actual "absorption" code.
1584 * If permitted, we allow staffs (if they are known to have equal charges
1585 * and both are either known or confirmed empty) and wands (if both are
1586 * either known or confirmed empty) and rods (in all cases) to combine.
1587 * Staffs will unstack (if necessary) when they are used, but wands and
1588 * rods will only unstack if one is dropped. -LM-
1590 * If permitted, we allow weapons/armor to stack, if fully "known".
1592 * Missiles will combine if both stacks have the same "known" status.
1593 * This is done to make unidentified stacks of missiles useful.
1595 * Food, potions, scrolls, and "easy know" items always stack.
1597 * Chests, and activatable items, never stack (for various reasons).
1601 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1603 #define MAX_STACK_SIZE 99
1607 * @brief 両オブジェクトをスロットに重ね合わせ可能な最大数を返す。
1608 * Determine if an item can partly absorb a second item. Return maximum number of stack.
1609 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1610 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1611 * @return 重ね合わせ可能なアイテム数
1613 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1617 /* Default maximum number of stack */
1618 int max_num = MAX_STACK_SIZE;
1620 /* Require identical object types */
1621 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1624 /* Analyze the items */
1625 switch (o_ptr->tval)
1627 /* Chests and Statues*/
1638 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1639 if (o_ptr->pval != j_ptr->pval) return 0;
1643 /* Figurines and Corpses*/
1648 if (o_ptr->pval != j_ptr->pval) return 0;
1654 /* Food and Potions and Scrolls */
1666 /* Require either knowledge or known empty for both staffs. */
1667 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1668 !object_is_known(o_ptr)) ||
1669 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1670 !object_is_known(j_ptr))) return 0;
1672 /* Require identical charges, since staffs are bulky. */
1673 if (o_ptr->pval != j_ptr->pval) return 0;
1682 /* Require either knowledge or known empty for both wands. */
1683 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1684 !object_is_known(o_ptr)) ||
1685 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1686 !object_is_known(j_ptr))) return 0;
1688 /* Wand charges combine in O&ZAngband. */
1694 /* Staffs and Wands and Rods */
1697 /* Prevent overflaw of timeout */
1698 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1704 /* Weapons and Armor */
1720 /* Rings, Amulets, Lites */
1726 /* Require full knowledge of both items */
1727 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1737 /* Require identical knowledge of both items */
1738 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1739 if (o_ptr->feeling != j_ptr->feeling) return 0;
1741 /* Require identical "bonuses" */
1742 if (o_ptr->to_h != j_ptr->to_h) return 0;
1743 if (o_ptr->to_d != j_ptr->to_d) return 0;
1744 if (o_ptr->to_a != j_ptr->to_a) return 0;
1746 /* Require identical "pval" code */
1747 if (o_ptr->pval != j_ptr->pval) return 0;
1749 /* Artifacts never stack */
1750 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1752 /* Require identical "ego-item" names */
1753 if (o_ptr->name2 != j_ptr->name2) return 0;
1755 /* Require identical added essence */
1756 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1757 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1759 /* Hack -- Never stack "powerful" items */
1760 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1762 /* Hack -- Never stack recharging items */
1763 if (o_ptr->timeout || j_ptr->timeout) return 0;
1765 /* Require identical "values" */
1766 if (o_ptr->ac != j_ptr->ac) return 0;
1767 if (o_ptr->dd != j_ptr->dd) return 0;
1768 if (o_ptr->ds != j_ptr->ds) return 0;
1777 /* Require knowledge */
1778 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1786 /* Hack -- Identical art_flags! */
1787 for (i = 0; i < TR_FLAG_SIZE; i++)
1788 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1790 /* Hack -- Require identical "cursed" status */
1791 if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1793 /* Hack -- Require identical "broken" status */
1794 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1797 /* Hack -- require semi-matching "inscriptions" */
1798 if (o_ptr->inscription && j_ptr->inscription &&
1799 (o_ptr->inscription != j_ptr->inscription))
1802 /* Hack -- normally require matching "inscriptions" */
1803 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1805 /* Hack -- normally require matching "discounts" */
1806 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1809 /* They match, so they must be similar */
1814 * @brief 両オブジェクトをスロットに重ねることができるかどうかを返す。
1815 * Determine if an item can absorb a second item.
1816 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1817 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1818 * @return 重ね合わせ可能ならばTRUEを返す。
1820 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1822 int total = o_ptr->number + j_ptr->number;
1825 /* Are these objects similar? */
1826 max_num = object_similar_part(o_ptr, j_ptr);
1828 /* Return if not similar */
1829 if (!max_num) return FALSE;
1831 /* Maximal "stacking" limit */
1832 if (total > max_num) return (0);
1835 /* They match, so they must be similar */
1841 * @brief 両オブジェクトをスロットに重ね合わせる。
1842 * Allow one item to "absorb" another, assuming they are similar
1843 * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
1844 * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
1847 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1849 int max_num = object_similar_part(o_ptr, j_ptr);
1850 int total = o_ptr->number + j_ptr->number;
1851 int diff = (total > max_num) ? total - max_num : 0;
1853 /* Combine quantity, lose excess items */
1854 o_ptr->number = (total > max_num) ? max_num : total;
1856 /* Hack -- blend "known" status */
1857 if (object_is_known(j_ptr)) object_known(o_ptr);
1859 /* Hack -- clear "storebought" if only one has it */
1860 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1861 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1863 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1864 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1867 /* Hack -- blend "mental" status */
1868 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1870 /* Hack -- blend "inscriptions" */
1871 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1873 /* Hack -- blend "feelings" */
1874 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1876 /* Hack -- could average discounts */
1877 /* Hack -- save largest discount */
1878 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1880 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1881 if (o_ptr->tval == TV_ROD)
1883 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1884 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1887 /* Hack -- if wands are stacking, combine the charges. -LM- */
1888 if (o_ptr->tval == TV_WAND)
1890 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1896 * @brief tvalとsvalに対応するベースアイテムのIDを返す。
1897 * Find the index of the object_kind with the given tval and sval
1898 * @param tval 検索したいベースアイテムのtval
1899 * @param sval 検索したいベースアイテムのsval
1902 IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval)
1909 for (k = 1; k < max_k_idx; k++)
1911 object_kind *k_ptr = &k_info[k];
1913 /* Require correct tval */
1914 if (k_ptr->tval != tval) continue;
1917 if (k_ptr->sval == sval) return (k);
1919 /* Ignore illegal items */
1920 if (sval != SV_ANY) continue;
1922 /* Apply the randomizer */
1923 if (!one_in_(++num)) continue;
1925 /* Use this value */
1929 /* Return this choice */
1936 msg_format(_("アイテムがない (%d,%d)", "No object (%d,%d)"), tval, sval);
1945 * @brief オブジェクトを初期化する
1946 * Wipe an object clean.
1947 * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
1950 void object_wipe(object_type *o_ptr)
1952 /* Wipe the structure */
1953 (void)WIPE(o_ptr, object_type);
1958 * @brief オブジェクトを複製する
1959 * Wipe an object clean.
1960 * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
1961 * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
1964 void object_copy(object_type *o_ptr, object_type *j_ptr)
1966 /* Copy the structure */
1967 (void)COPY(o_ptr, j_ptr, object_type);
1972 * @brief オブジェクト構造体にベースアイテムを作成する
1973 * Prepare an object based on an object kind.
1974 * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
1975 * @param k_idx 新たに作成したいベースアイテム情報のID
1978 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
1980 object_kind *k_ptr = &k_info[k_idx];
1982 /* Clear the record */
1985 /* Save the kind index */
1986 o_ptr->k_idx = k_idx;
1988 /* Efficiency -- tval/sval */
1989 o_ptr->tval = k_ptr->tval;
1990 o_ptr->sval = k_ptr->sval;
1992 /* Default "pval" */
1993 o_ptr->pval = k_ptr->pval;
1995 /* Default number */
1998 /* Default weight */
1999 o_ptr->weight = k_ptr->weight;
2002 o_ptr->to_h = k_ptr->to_h;
2003 o_ptr->to_d = k_ptr->to_d;
2004 o_ptr->to_a = k_ptr->to_a;
2007 o_ptr->ac = k_ptr->ac;
2008 o_ptr->dd = k_ptr->dd;
2009 o_ptr->ds = k_ptr->ds;
2011 /* Default activation */
2012 if (k_ptr->act_idx > 0) o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
2014 /* Hack -- worthless items are always "broken" */
2015 if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
2017 /* Hack -- cursed items are always "cursed" */
2018 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
2019 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2020 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
2021 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2022 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2023 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2028 * @brief 上質以上のオブジェクトに与えるための各種ボーナスを正規乱数も加えて算出する。
2029 * Help determine an "enchantment bonus" for an object.
2030 * @param max ボーナス値の限度
2031 * @param level ボーナス値に加味する基準生成階
2032 * @return 算出されたボーナス値
2034 * To avoid floating point but still provide a smooth distribution of bonuses,\n
2035 * we simply round the results of division in such a way as to "average" the\n
2036 * correct floating point value.\n
2038 * This function has been changed. It uses "randnor()" to choose values from\n
2039 * a normal distribution, whose mean moves from zero towards the max as the\n
2040 * level increases, and whose standard deviation is equal to 1/4 of the max,\n
2041 * and whose values are forced to lie between zero and the max, inclusive.\n
2043 * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
2044 * rare to get the "full" enchantment on an object, even a deep levels.\n
2046 * It is always possible (albeit unlikely) to get the "full" enchantment.\n
2048 * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
2050 * N 0 1 2 3 4 5 6 7 8 9 10\n
2051 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n
2052 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03\n
2053 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05\n
2054 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05\n
2055 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11\n
2056 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41\n
2057 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65\n
2058 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94\n
2059 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78\n
2060 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64\n
2061 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62\n
2062 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33\n
2063 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38\n
2064 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53\n
2065 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53\n
2066 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27\n
2067 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72\n
2068 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07\n
2070 int m_bonus(int max, DEPTH level)
2072 int bonus, stand, extra, value;
2075 /* Paranoia -- enforce maximal "level" */
2076 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
2079 /* The "bonus" moves towards the max */
2080 bonus = ((max * level) / MAX_DEPTH);
2082 /* Hack -- determine fraction of error */
2083 extra = ((max * level) % MAX_DEPTH);
2085 /* Hack -- simulate floating point computations */
2086 if (randint0(MAX_DEPTH) < extra) bonus++;
2089 /* The "stand" is equal to one quarter of the max */
2092 /* Hack -- determine fraction of error */
2095 /* Hack -- simulate floating point computations */
2096 if (randint0(4) < extra) stand++;
2099 /* Choose an "interesting" value */
2100 value = randnor(bonus, stand);
2102 /* Enforce the minimum value */
2103 if (value < 0) return (0);
2105 /* Enforce the maximum value */
2106 if (value > max) return (max);
2112 * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user
2113 * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ
2116 static void object_mention(object_type *o_ptr)
2118 char o_name[MAX_NLEN];
2120 object_aware(o_ptr);
2121 object_known(o_ptr);
2123 /* Mark the item as fully known */
2124 o_ptr->ident |= (IDENT_MENTAL);
2127 object_desc(o_name, o_ptr, 0);
2128 msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name);
2132 * @brief INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2133 * Mega-Hack -- Attempt to create one of the "Special Objects"
2134 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2135 * @return 生成に成功したらTRUEを返す。
2137 * We are only called from "make_object()", and we assume that\n
2138 * "apply_magic()" is called immediately after we return.\n
2140 * Note -- see "make_artifact()" and "apply_magic()"\n
2142 static bool make_artifact_special(object_type *o_ptr)
2145 KIND_OBJECT_IDX k_idx = 0;
2147 /*! @note 地上ではキャンセルする / No artifacts in the town */
2148 if (!dun_level) return (FALSE);
2150 /*! @note get_obj_num_hookによる指定がある場合は生成をキャンセルする / Themed object */
2151 if (get_obj_num_hook) return (FALSE);
2153 /*! @note 全固定アーティファクト中からIDの若い順に生成対象とその確率を走査する / Check the artifact list (just the "specials") */
2154 for (i = 0; i < max_a_idx; i++)
2156 artifact_type *a_ptr = &a_info[i];
2158 /*! @note アーティファクト名が空の不正なデータは除外する / Skip "empty" artifacts */
2159 if (!a_ptr->name) continue;
2161 /*! @note 既に生成回数がカウントされたアーティファクト、QUESTITEMと非INSTA_ARTは除外 / Cannot make an artifact twice */
2162 if (a_ptr->cur_num) continue;
2163 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2164 if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue;
2166 /*! @note アーティファクト生成階が現在に対して足りない場合は高確率で1/(不足階層*2)を満たさないと生成リストに加えられない /
2167 * XXX XXX Enforce minimum "depth" (loosely) */
2168 if (a_ptr->level > object_level)
2170 /* @note / Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2171 int d = (a_ptr->level - object_level) * 2;
2172 if (!one_in_(d)) continue;
2175 /*! @note 1/(レア度)の確率を満たさないと除外される / Artifact "rarity roll" */
2176 if (!one_in_(a_ptr->rarity)) continue;
2178 /*! @note INSTA_ART型固定アーティファクトのベースアイテムもチェック対象とする。ベースアイテムの生成階層が足りない場合1/(不足階層*5) を満たさないと除外される。 /
2179 * Find the base object. XXX XXX Enforce minimum "object" level (loosely). Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2180 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2181 if (k_info[k_idx].level > object_level)
2183 int d = (k_info[k_idx].level - object_level) * 5;
2184 if (!one_in_(d)) continue;
2187 /*! @note 前述の条件を満たしたら、後のIDのアーティファクトはチェックせずすぐ確定し生成処理に移す /
2188 * Assign the template. Mega-Hack -- mark the item as an artifact. Hack: Some artifacts get random extra powers. Success. */
2189 object_prep(o_ptr, k_idx);
2192 random_artifact_resistance(o_ptr, a_ptr);
2196 /*! @note 全INSTA_ART固定アーティファクトを試行しても決まらなかった場合 FALSEを返す / Failure */
2202 * @brief 非INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2203 * Mega-Hack -- Attempt to create one of the "Special Objects"
2204 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2205 * @return 生成に成功したらTRUEを返す。
2207 * Attempt to change an object into an artifact\n
2208 * This routine should only be called by "apply_magic()"\n
2209 * Note -- see "make_artifact_special()" and "apply_magic()"\n
2211 static bool make_artifact(object_type *o_ptr)
2216 /* No artifacts in the town */
2217 if (!dun_level) return (FALSE);
2219 /* Paranoia -- no "plural" artifacts */
2220 if (o_ptr->number != 1) return (FALSE);
2222 /* Check the artifact list (skip the "specials") */
2223 for (i = 0; i < max_a_idx; i++)
2225 artifact_type *a_ptr = &a_info[i];
2227 /* Skip "empty" items */
2228 if (!a_ptr->name) continue;
2230 /* Cannot make an artifact twice */
2231 if (a_ptr->cur_num) continue;
2233 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2235 if (a_ptr->gen_flags & TRG_INSTA_ART) continue;
2237 /* Must have the correct fields */
2238 if (a_ptr->tval != o_ptr->tval) continue;
2239 if (a_ptr->sval != o_ptr->sval) continue;
2241 /* XXX XXX Enforce minimum "depth" (loosely) */
2242 if (a_ptr->level > dun_level)
2244 /* Acquire the "out-of-depth factor" */
2245 int d = (a_ptr->level - dun_level) * 2;
2247 /* Roll for out-of-depth creation */
2248 if (!one_in_(d)) continue;
2251 /* We must make the "rarity roll" */
2252 if (!one_in_(a_ptr->rarity)) continue;
2254 /* Hack -- mark the item as an artifact */
2257 /* Hack: Some artifacts get random extra powers */
2258 random_artifact_resistance(o_ptr, a_ptr);
2270 * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
2271 * Choose random ego type
2272 * @param slot 取得したいエゴの装備部位
2273 * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
2274 * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
2276 static byte get_random_ego(byte slot, bool good)
2279 ego_item_type *e_ptr;
2283 for (i = 1; i < max_e_idx; i++)
2287 if (e_ptr->slot == slot
2288 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2291 total += (255 / e_ptr->rarity);
2295 value = randint1(total);
2297 for (i = 1; i < max_e_idx; i++)
2301 if (e_ptr->slot == slot
2302 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2305 value -= (255 / e_ptr->rarity);
2306 if (value <= 0L) break;
2314 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2315 * Apply magic to an item known to be a "weapon"
2316 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2317 * @param level 生成基準階
2318 * @param power 生成ランク
2321 * Hack -- note special base damage dice boosting\n
2322 * Hack -- note special processing for weapon/digger\n
2324 static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
2326 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
2327 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
2329 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
2330 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
2332 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2334 tohit2 = (tohit2+1)/2;
2335 todam2 = (todam2+1)/2;
2342 o_ptr->to_h += tohit1;
2343 o_ptr->to_d += todam1;
2349 o_ptr->to_h += tohit2;
2350 o_ptr->to_d += todam2;
2358 o_ptr->to_h -= tohit1;
2359 o_ptr->to_d -= todam1;
2364 /* Penalize again */
2365 o_ptr->to_h -= tohit2;
2366 o_ptr->to_d -= todam2;
2369 /* Cursed (if "bad") */
2370 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2373 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2376 switch (o_ptr->tval)
2383 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2384 create_artifact(o_ptr, FALSE);
2386 /* Special Ego-item */
2387 o_ptr->name2 = EGO_DIGGING;
2391 else if (power < -1)
2393 /* Hack -- Horrible digging bonus */
2394 o_ptr->pval = 0 - (5 + randint1(5));
2400 /* Hack -- Reverse digging bonus */
2401 o_ptr->pval = 0 - (o_ptr->pval);
2415 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2417 create_artifact(o_ptr, FALSE);
2422 /* Roll for an ego-item */
2423 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2424 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2426 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2428 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2433 switch (o_ptr->name2)
2436 if (one_in_(4) && (level > 40))
2437 add_flag(o_ptr->art_flags, TR_BLOWS);
2441 add_flag(o_ptr->art_flags, TR_RES_POIS);
2443 add_flag(o_ptr->art_flags, TR_WARNING);
2445 case EGO_KILL_DRAGON:
2447 add_flag(o_ptr->art_flags, TR_RES_POIS);
2451 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2453 case EGO_SLAYING_WEAPON:
2454 if (one_in_(3)) /* double damage */
2462 while (one_in_(o_ptr->dd));
2468 while (one_in_(o_ptr->ds));
2473 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2475 if (o_ptr->tval == TV_SWORD && one_in_(3))
2477 add_flag(o_ptr->art_flags, TR_VORPAL);
2482 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2488 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
2490 add_flag(o_ptr->art_flags, TR_DEX);
2492 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2495 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
2497 case EGO_EARTHQUAKES:
2498 if (one_in_(3) && (level > 60))
2499 add_flag(o_ptr->art_flags, TR_BLOWS);
2501 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
2505 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2509 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2511 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2513 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2514 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2517 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2518 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2519 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2520 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2524 if (!o_ptr->art_name)
2526 /* Hack -- Super-charge the damage dice */
2527 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2529 /* Hack -- Lower the damage dice */
2530 if (o_ptr->dd > 9) o_ptr->dd = 9;
2535 else if (power < -1)
2537 /* Roll for ego-item */
2538 if (randint0(MAX_DEPTH) < level)
2542 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2543 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2549 switch (o_ptr->name2)
2552 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2553 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2555 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2556 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2557 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2558 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2559 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2560 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2574 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2576 create_artifact(o_ptr, FALSE);
2579 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2593 if (power > 2) /* power > 2 is debug only */
2595 create_artifact(o_ptr, FALSE);
2599 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2601 switch (o_ptr->name2)
2603 case EGO_SLAYING_BOLT:
2608 /* Hack -- super-charge the damage dice */
2609 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2611 /* Hack -- restrict the damage dice */
2612 if (o_ptr->dd > 9) o_ptr->dd = 9;
2616 else if (power < -1)
2618 /* Roll for ego-item */
2619 if (randint0(MAX_DEPTH) < level)
2621 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2631 * @brief ドラゴン装備にランダムな耐性を与える
2632 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2635 static void dragon_resist(object_type * o_ptr)
2640 one_dragon_ele_resistance(o_ptr);
2642 one_high_resistance(o_ptr);
2648 * @brief オブジェクトにランダムな強いESPを与える
2649 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2652 static bool add_esp_strong(object_type *o_ptr)
2654 bool nonliv = FALSE;
2656 switch (randint1(3))
2658 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2659 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2660 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2667 * @brief オブジェクトにランダムな弱いESPを与える
2668 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2669 * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3)
2672 static void add_esp_weak(object_type *o_ptr, bool extra)
2675 u32b weak_esp_list[] = {
2687 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2688 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2690 /* Add unduplicated weak esp flags randomly */
2691 for (i = 0; i < add_count; ++ i)
2693 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2695 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2696 weak_esp_list[choice] = weak_esp_list[i];
2702 * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2703 * Apply magic to an item known to be "armor"
2704 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2705 * @param level 生成基準階
2706 * @param power 生成ランク
2709 * Hack -- note special processing for crown/helm\n
2710 * Hack -- note special processing for robe of permanence\n
2712 static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
2714 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
2715 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
2721 o_ptr->to_a += toac1;
2727 o_ptr->to_a += toac2;
2735 o_ptr->to_a -= toac1;
2740 /* Penalize again */
2741 o_ptr->to_a -= toac2;
2744 /* Cursed (if "bad") */
2745 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2750 switch (o_ptr->tval)
2754 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2755 create_artifact(o_ptr, FALSE);
2765 /* Hack -- Try for "Robes of the Magi" */
2766 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2767 (o_ptr->sval == SV_ROBE) &&
2768 (randint0(100) < 15))
2772 o_ptr->name2 = EGO_YOIYAMI;
2773 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2774 o_ptr->sval = SV_YOIYAMI_ROBE;
2780 o_ptr->name2 = EGO_PERMANENCE;
2785 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2787 create_artifact(o_ptr, FALSE);
2793 bool okay_flag = TRUE;
2795 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2797 switch (o_ptr->name2)
2800 if (o_ptr->tval != TV_HARD_ARMOR)
2806 if (o_ptr->tval != TV_SOFT_ARMOR)
2815 if (okay_flag) break;
2817 switch (o_ptr->name2)
2819 case EGO_RESISTANCE:
2821 add_flag(o_ptr->art_flags, TR_RES_POIS);
2824 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2825 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2829 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2831 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2833 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2834 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2836 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2837 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2838 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2839 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2840 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2841 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2842 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2843 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2846 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2847 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2848 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2849 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2850 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2851 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2864 if (o_ptr->sval == SV_DRAGON_SHIELD)
2866 dragon_resist(o_ptr);
2867 if (!one_in_(3)) break;
2873 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2875 create_artifact(o_ptr, FALSE);
2881 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2882 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
2883 && o_ptr->name2 == EGO_S_DWARVEN)
2890 switch (o_ptr->name2)
2893 if (!one_in_(3)) one_high_resistance(o_ptr);
2894 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2896 case EGO_REFLECTION:
2897 if (o_ptr->sval == SV_MIRROR_SHIELD)
2902 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2903 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2912 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2914 dragon_resist(o_ptr);
2915 if (!one_in_(3)) break;
2919 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2921 create_artifact(o_ptr, FALSE);
2924 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2928 else if (power < -1)
2930 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2938 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2940 dragon_resist(o_ptr);
2941 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_FEET, TRUE);
2953 switch (o_ptr->name2)
2955 case EGO_SLOW_DESCENT:
2958 one_high_resistance(o_ptr);
2964 else if (power < -1)
2966 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
2977 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2979 create_artifact(o_ptr, FALSE);
2984 bool ok_flag = TRUE;
2985 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
2987 switch (o_ptr->name2)
2990 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
2991 else add_esp_weak(o_ptr, FALSE);
2995 case EGO_REGENERATION:
2996 case EGO_LORDLINESS:
3002 if (one_in_(2)) add_esp_strong(o_ptr);
3003 else add_esp_weak(o_ptr, FALSE);
3006 default:/* not existing crown (wisdom,lite, etc...) */
3010 break; /* while (1) */
3016 else if (power < -1)
3020 bool ok_flag = TRUE;
3021 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3023 switch (o_ptr->name2)
3025 case EGO_ANCIENT_CURSE:
3026 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
3027 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
3028 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3029 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3030 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3031 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3035 break; /* while (1) */
3044 if (o_ptr->sval == SV_DRAGON_HELM)
3046 dragon_resist(o_ptr);
3047 if (!one_in_(3)) break;
3053 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3055 create_artifact(o_ptr, FALSE);
3060 bool ok_flag = TRUE;
3061 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3063 switch (o_ptr->name2)
3065 case EGO_BRILLIANCE:
3067 case EGO_INFRAVISION:
3068 case EGO_H_PROTECTION:
3073 if (one_in_(2)) add_esp_strong(o_ptr);
3074 else add_esp_weak(o_ptr, FALSE);
3078 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
3079 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
3082 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3084 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
3086 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
3087 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3089 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3090 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
3091 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
3092 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3093 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3094 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3095 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3096 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
3098 default:/* not existing helm (Magi, Might, etc...)*/
3102 break; /* while (1) */
3107 else if (power < -1)
3111 bool ok_flag = TRUE;
3112 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3114 switch (o_ptr->name2)
3116 case EGO_ANCIENT_CURSE:
3120 break; /* while (1) */
3131 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3133 create_artifact(o_ptr, FALSE);
3136 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
3138 switch (o_ptr->name2)
3147 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
3148 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
3149 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
3150 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3157 else if (power < -1)
3159 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3170 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
3171 * Apply magic to an item known to be a "ring" or "amulet"
3172 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3173 * @param level 生成基準階
3174 * @param power 生成ランク
3177 * Hack -- note special "pval boost" code for ring of speed\n
3178 * Hack -- note that some items must be cursed (or blessed)\n
3180 static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
3182 /* Apply magic (good or bad) according to type */
3183 switch (o_ptr->tval)
3188 switch (o_ptr->sval)
3190 case SV_RING_ATTACKS:
3193 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
3194 if (one_in_(15)) o_ptr->pval++;
3195 if (o_ptr->pval < 1) o_ptr->pval = 1;
3201 o_ptr->ident |= (IDENT_BROKEN);
3204 o_ptr->curse_flags |= TRC_CURSED;
3207 o_ptr->pval = 0 - (o_ptr->pval);
3218 /* Strength, Constitution, Dexterity, Intelligence */
3224 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3230 o_ptr->ident |= (IDENT_BROKEN);
3233 o_ptr->curse_flags |= TRC_CURSED;
3236 o_ptr->pval = 0 - (o_ptr->pval);
3242 /* Ring of Speed! */
3245 /* Base speed (1 to 10) */
3246 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3248 /* Super-charge the ring */
3249 while (randint0(100) < 50) o_ptr->pval++;
3255 o_ptr->ident |= (IDENT_BROKEN);
3258 o_ptr->curse_flags |= TRC_CURSED;
3261 o_ptr->pval = 0 - (o_ptr->pval);
3269 case SV_RING_LORDLY:
3273 one_lordly_high_resistance(o_ptr);
3277 /* Bonus to armor class */
3278 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3282 case SV_RING_WARNING:
3284 if (one_in_(3)) one_low_esp(o_ptr);
3289 case SV_RING_SEARCHING:
3291 /* Bonus to searching */
3292 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3298 o_ptr->ident |= (IDENT_BROKEN);
3301 o_ptr->curse_flags |= TRC_CURSED;
3304 o_ptr->pval = 0 - (o_ptr->pval);
3310 /* Flames, Acid, Ice */
3311 case SV_RING_FLAMES:
3316 /* Bonus to armor class */
3317 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3321 /* Weakness, Stupidity */
3322 case SV_RING_WEAKNESS:
3323 case SV_RING_STUPIDITY:
3326 o_ptr->ident |= (IDENT_BROKEN);
3329 o_ptr->curse_flags |= TRC_CURSED;
3332 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3333 if (power > 0) power = 0 - power;
3338 /* WOE, Stupidity */
3342 o_ptr->ident |= (IDENT_BROKEN);
3345 o_ptr->curse_flags |= TRC_CURSED;
3348 o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
3349 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3350 if (power > 0) power = 0 - power;
3355 /* Ring of damage */
3356 case SV_RING_DAMAGE:
3358 /* Bonus to damage */
3359 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
3365 o_ptr->ident |= (IDENT_BROKEN);
3368 o_ptr->curse_flags |= TRC_CURSED;
3371 o_ptr->to_d = 0 - o_ptr->to_d;
3377 /* Ring of Accuracy */
3378 case SV_RING_ACCURACY:
3381 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
3387 o_ptr->ident |= (IDENT_BROKEN);
3390 o_ptr->curse_flags |= TRC_CURSED;
3393 o_ptr->to_h = 0 - o_ptr->to_h;
3399 /* Ring of Protection */
3400 case SV_RING_PROTECTION:
3402 /* Bonus to armor class */
3403 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
3409 o_ptr->ident |= (IDENT_BROKEN);
3412 o_ptr->curse_flags |= TRC_CURSED;
3415 o_ptr->to_a = 0 - o_ptr->to_a;
3421 /* Ring of Slaying */
3422 case SV_RING_SLAYING:
3424 /* Bonus to damage and to hit */
3425 o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
3426 o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
3432 o_ptr->ident |= (IDENT_BROKEN);
3435 o_ptr->curse_flags |= TRC_CURSED;
3437 /* Reverse bonuses */
3438 o_ptr->to_h = 0 - o_ptr->to_h;
3439 o_ptr->to_d = 0 - o_ptr->to_d;
3445 case SV_RING_MUSCLE:
3447 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
3448 if (one_in_(4)) o_ptr->pval++;
3454 o_ptr->ident |= (IDENT_BROKEN);
3457 o_ptr->curse_flags |= TRC_CURSED;
3459 /* Reverse bonuses */
3460 o_ptr->pval = 0 - o_ptr->pval;
3465 case SV_RING_AGGRAVATION:
3468 o_ptr->ident |= (IDENT_BROKEN);
3471 o_ptr->curse_flags |= TRC_CURSED;
3473 if (power > 0) power = 0 - power;
3477 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3478 || (power > 2)) /* power > 2 is debug only */
3480 o_ptr->pval = MIN(o_ptr->pval, 4);
3481 /* Randart amulet */
3482 create_artifact(o_ptr, FALSE);
3484 else if ((power == 2) && one_in_(2))
3486 while(!o_ptr->name2)
3488 int tmp = m_bonus(10, level);
3489 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3490 switch(randint1(28))
3493 o_ptr->name2 = EGO_RING_THROW;
3496 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3497 o_ptr->name2 = EGO_RING_REGEN;
3500 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3501 o_ptr->name2 = EGO_RING_LITE;
3504 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3505 o_ptr->name2 = EGO_RING_TELEPORT;
3508 if (o_ptr->to_h) break;
3509 o_ptr->name2 = EGO_RING_TO_H;
3512 if (o_ptr->to_d) break;
3513 o_ptr->name2 = EGO_RING_TO_D;
3516 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3517 o_ptr->name2 = EGO_RING_SLAY;
3520 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3521 o_ptr->name2 = EGO_RING_WIZARD;
3524 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3525 o_ptr->name2 = EGO_RING_HERO;
3528 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3529 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3530 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3531 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3534 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3535 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;
3536 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3537 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3538 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3541 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3542 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;
3543 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3544 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3545 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3548 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3549 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;
3550 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3551 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3554 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3555 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;
3556 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3557 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3559 case 21: case 22: case 23: case 24: case 25: case 26:
3560 switch (o_ptr->sval)
3563 if (!one_in_(3)) break;
3564 o_ptr->name2 = EGO_RING_D_SPEED;
3566 case SV_RING_DAMAGE:
3567 case SV_RING_ACCURACY:
3568 case SV_RING_SLAYING:
3569 if (one_in_(2)) break;
3570 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3573 o_ptr->name2 = EGO_RING_BERSERKER;
3574 o_ptr->to_h -= 2+randint1(4);
3575 o_ptr->to_d += 2+randint1(4);
3578 case SV_RING_PROTECTION:
3579 o_ptr->name2 = EGO_RING_SUPER_AC;
3580 o_ptr->to_a += 7 + m_bonus(5, level);
3582 case SV_RING_RES_FEAR:
3583 o_ptr->name2 = EGO_RING_HERO;
3586 if (one_in_(2)) break;
3587 o_ptr->name2 = EGO_RING_HUNTER;
3589 case SV_RING_SEARCHING:
3590 o_ptr->name2 = EGO_RING_STEALTH;
3592 case SV_RING_TELEPORTATION:
3593 o_ptr->name2 = EGO_RING_TELE_AWAY;
3595 case SV_RING_RES_BLINDNESS:
3597 o_ptr->name2 = EGO_RING_RES_LITE;
3599 o_ptr->name2 = EGO_RING_RES_DARK;
3601 case SV_RING_LORDLY:
3602 if (!one_in_(20)) break;
3603 one_lordly_high_resistance(o_ptr);
3604 one_lordly_high_resistance(o_ptr);
3605 o_ptr->name2 = EGO_RING_TRUE;
3607 case SV_RING_SUSTAIN:
3608 if (!one_in_(4)) break;
3609 o_ptr->name2 = EGO_RING_RES_TIME;
3611 case SV_RING_FLAMES:
3612 if (!one_in_(2)) break;
3613 o_ptr->name2 = EGO_RING_DRAGON_F;
3616 if (!one_in_(2)) break;
3617 o_ptr->name2 = EGO_RING_DRAGON_C;
3619 case SV_RING_WARNING:
3620 if (!one_in_(2)) break;
3621 o_ptr->name2 = EGO_RING_M_DETECT;
3630 o_ptr->curse_flags = 0L;
3632 else if ((power == -2) && one_in_(2))
3634 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3635 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3636 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3637 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3638 o_ptr->art_flags[0] = 0;
3639 o_ptr->art_flags[1] = 0;
3640 while(!o_ptr->name2)
3642 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3646 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3647 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3650 o_ptr->name2 = EGO_RING_NO_MELEE;
3653 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3654 o_ptr->name2 = EGO_RING_AGGRAVATE;
3657 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3658 o_ptr->name2 = EGO_RING_TY_CURSE;
3661 o_ptr->name2 = EGO_RING_ALBINO;
3666 o_ptr->ident |= (IDENT_BROKEN);
3669 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3677 switch (o_ptr->sval)
3679 /* Amulet of wisdom/charisma */
3680 case SV_AMULET_INTELLIGENCE:
3681 case SV_AMULET_WISDOM:
3682 case SV_AMULET_CHARISMA:
3684 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3690 o_ptr->ident |= (IDENT_BROKEN);
3693 o_ptr->curse_flags |= (TRC_CURSED);
3695 /* Reverse bonuses */
3696 o_ptr->pval = 0 - o_ptr->pval;
3702 /* Amulet of brilliance */
3703 case SV_AMULET_BRILLIANCE:
3705 o_ptr->pval = 1 + m_bonus(3, level);
3706 if (one_in_(4)) o_ptr->pval++;
3712 o_ptr->ident |= (IDENT_BROKEN);
3715 o_ptr->curse_flags |= (TRC_CURSED);
3717 /* Reverse bonuses */
3718 o_ptr->pval = 0 - o_ptr->pval;
3724 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3728 o_ptr->curse_flags |= (TRC_CURSED);
3733 case SV_AMULET_RESISTANCE:
3735 if (one_in_(5)) one_high_resistance(o_ptr);
3736 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3740 /* Amulet of searching */
3741 case SV_AMULET_SEARCHING:
3743 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
3749 o_ptr->ident |= (IDENT_BROKEN);
3752 o_ptr->curse_flags |= (TRC_CURSED);
3754 /* Reverse bonuses */
3755 o_ptr->pval = 0 - (o_ptr->pval);
3761 /* Amulet of the Magi -- never cursed */
3762 case SV_AMULET_THE_MAGI:
3764 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3765 o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
3767 /* gain one low ESP */
3768 add_esp_weak(o_ptr, FALSE);
3773 /* Amulet of Doom -- always cursed */
3774 case SV_AMULET_DOOM:
3777 o_ptr->ident |= (IDENT_BROKEN);
3780 o_ptr->curse_flags |= (TRC_CURSED);
3783 o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
3784 o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
3785 if (power > 0) power = 0 - power;
3790 case SV_AMULET_MAGIC_MASTERY:
3792 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
3798 o_ptr->ident |= (IDENT_BROKEN);
3801 o_ptr->curse_flags |= (TRC_CURSED);
3803 /* Reverse bonuses */
3804 o_ptr->pval = 0 - o_ptr->pval;
3810 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3811 || (power > 2)) /* power > 2 is debug only */
3813 o_ptr->pval = MIN(o_ptr->pval, 4);
3814 /* Randart amulet */
3815 create_artifact(o_ptr, FALSE);
3817 else if ((power == 2) && one_in_(2))
3819 while(!o_ptr->name2)
3821 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3822 switch(randint1(21))
3825 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3826 o_ptr->name2 = EGO_AMU_SLOW_D;
3829 if (o_ptr->pval) break;
3830 o_ptr->name2 = EGO_AMU_INFRA;
3833 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3834 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3837 if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
3838 o_ptr->name2 = EGO_AMU_HOLD_EXP;
3841 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3842 o_ptr->name2 = EGO_AMU_LEVITATION;
3844 case 10: case 11: case 21:
3845 o_ptr->name2 = EGO_AMU_AC;
3848 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3849 if (m_bonus(10, level) > 8)
3850 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3852 o_ptr->name2 = EGO_AMU_RES_FIRE;
3855 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3856 if (m_bonus(10, level) > 8)
3857 o_ptr->name2 = EGO_AMU_RES_COLD_;
3859 o_ptr->name2 = EGO_AMU_RES_COLD;
3862 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3863 if (m_bonus(10, level) > 8)
3864 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3866 o_ptr->name2 = EGO_AMU_RES_ELEC;
3869 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3870 if (m_bonus(10, level) > 8)
3871 o_ptr->name2 = EGO_AMU_RES_ACID_;
3873 o_ptr->name2 = EGO_AMU_RES_ACID;
3875 case 16: case 17: case 18: case 19: case 20:
3876 switch (o_ptr->sval)
3878 case SV_AMULET_TELEPORT:
3879 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3880 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3881 else o_ptr->name2 = EGO_AMU_TELEPORT;
3883 case SV_AMULET_RESIST_ACID:
3884 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3886 case SV_AMULET_SEARCHING:
3887 o_ptr->name2 = EGO_AMU_STEALTH;
3889 case SV_AMULET_BRILLIANCE:
3890 if (!one_in_(3)) break;
3891 o_ptr->name2 = EGO_AMU_IDENT;
3893 case SV_AMULET_CHARISMA:
3894 if (!one_in_(3)) break;
3895 o_ptr->name2 = EGO_AMU_CHARM;
3897 case SV_AMULET_THE_MAGI:
3898 if (one_in_(2)) break;
3899 o_ptr->name2 = EGO_AMU_GREAT;
3901 case SV_AMULET_RESISTANCE:
3902 if (!one_in_(5)) break;
3903 o_ptr->name2 = EGO_AMU_DEFENDER;
3905 case SV_AMULET_TELEPATHY:
3906 if (!one_in_(3)) break;
3907 o_ptr->name2 = EGO_AMU_DETECTION;
3913 o_ptr->curse_flags = 0L;
3915 else if ((power == -2) && one_in_(2))
3917 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3918 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3919 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3920 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3921 o_ptr->art_flags[0] = 0;
3922 o_ptr->art_flags[1] = 0;
3923 while(!o_ptr->name2)
3925 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3929 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3930 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3933 o_ptr->name2 = EGO_AMU_FOOL;
3936 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3937 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3940 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3941 o_ptr->name2 = EGO_AMU_TY_CURSE;
3944 o_ptr->name2 = EGO_AMU_NAIVETY;
3949 o_ptr->ident |= (IDENT_BROKEN);
3952 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3960 * @brief モンスターが人形のベースにできるかを返す
3961 * @param r_idx チェックしたいモンスター種族のID
3962 * @return 人形にできるならTRUEを返す
3964 static bool item_monster_okay(MONRACE_IDX r_idx)
3966 monster_race *r_ptr = &r_info[r_idx];
3969 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
3970 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
3971 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
3972 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
3973 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
3974 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
3981 * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
3982 * Apply magic to an item known to be "boring"
3983 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3984 * @param level 生成基準階
3985 * @param power 生成ランク
3988 * Hack -- note the special code for various items
3990 static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
3992 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3997 /* Apply magic (good or bad) according to type */
3998 switch (o_ptr->tval)
4007 o_ptr->ident |= (IDENT_BROKEN);
4010 o_ptr->curse_flags |= (TRC_CURSED);
4017 o_ptr->xtra4 = o_ptr->pval;
4023 /* Hack -- Torches -- random fuel */
4024 if (o_ptr->sval == SV_LITE_TORCH)
4026 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4030 /* Hack -- Lanterns -- random fuel */
4031 if (o_ptr->sval == SV_LITE_LANTERN)
4033 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4037 if (power > 2) /* power > 2 is debug only */
4039 create_artifact(o_ptr, FALSE);
4041 else if ((power == 2) || ((power == 1) && one_in_(3)))
4043 while (!o_ptr->name2)
4047 bool okay_flag = TRUE;
4049 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
4051 switch (o_ptr->name2)
4054 if (o_ptr->sval == SV_LITE_FEANOR)
4062 else if (power == -2)
4064 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
4066 switch (o_ptr->name2)
4068 case EGO_LITE_DARKNESS:
4071 if (o_ptr->sval == SV_LITE_TORCH)
4073 add_flag(o_ptr->art_flags, TR_LITE_M1);
4075 else if (o_ptr->sval == SV_LITE_LANTERN)
4077 add_flag(o_ptr->art_flags, TR_LITE_M2);
4079 else if (o_ptr->sval == SV_LITE_FEANOR)
4081 add_flag(o_ptr->art_flags, TR_LITE_M3);
4093 /* The wand or staff gets a number of initial charges equal
4094 * to between 1/2 (+1) and the full object kind's pval. -LM-
4096 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
4102 /* Transfer the pval. -LM- */
4103 o_ptr->pval = k_ptr->pval;
4110 object_aware(o_ptr);
4111 object_known(o_ptr);
4117 PARAMETER_VALUE i = 1;
4120 monster_race *r_ptr;
4122 /* Pick a random non-unique monster race */
4125 i = randint1(max_r_idx - 1);
4127 if (!item_monster_okay(i)) continue;
4128 if (i == MON_TSUCHINOKO) continue;
4132 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4134 /* Ignore dead monsters */
4135 if (!r_ptr->rarity) continue;
4137 /* Ignore uncommon monsters */
4138 if (r_ptr->rarity > 100) continue;
4140 /* Prefer less out-of-depth monsters */
4141 if (randint0(check)) continue;
4148 /* Some figurines are cursed */
4149 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
4156 PARAMETER_VALUE i = 1;
4161 monster_race *r_ptr;
4163 if (o_ptr->sval == SV_SKELETON)
4165 match = RF9_DROP_SKELETON;
4167 else if (o_ptr->sval == SV_CORPSE)
4169 match = RF9_DROP_CORPSE;
4172 /* Hack -- Remove the monster restriction */
4173 get_mon_num_prep(item_monster_okay, NULL);
4175 /* Pick a random non-unique monster race */
4178 i = get_mon_num(dun_level);
4182 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4184 /* Ignore dead monsters */
4185 if (!r_ptr->rarity) continue;
4187 /* Ignore corpseless monsters */
4188 if (!(r_ptr->flags9 & match)) continue;
4190 /* Prefer less out-of-depth monsters */
4191 if (randint0(check)) continue;
4199 object_aware(o_ptr);
4200 object_known(o_ptr);
4206 PARAMETER_VALUE i = 1;
4208 monster_race *r_ptr;
4210 /* Pick a random monster race */
4213 i = randint1(max_r_idx - 1);
4217 /* Ignore dead monsters */
4218 if (!r_ptr->rarity) continue;
4227 msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
4229 object_aware(o_ptr);
4230 object_known(o_ptr);
4237 DEPTH obj_level = k_info[o_ptr->k_idx].level;
4239 /* Hack -- skip ruined chests */
4240 if (obj_level <= 0) break;
4242 /* Hack -- pick a "difficulty" */
4243 o_ptr->pval = randint1(obj_level);
4244 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4246 o_ptr->xtra3 = dun_level + 5;
4248 /* Never exceed "difficulty" of 55 to 59 */
4249 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4257 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
4258 * Complete the "creation" of an object by applying "magic" to the item
4259 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4261 * @param mode 生成オプション
4264 * This includes not only rolling for random bonuses, but also putting the\n
4265 * finishing touches on ego-items and artifacts, giving charges to wands and\n
4266 * staffs, giving fuel to lites, and placing traps on chests.\n
4268 * In particular, note that "Instant Artifacts", if "created" by an external\n
4269 * routine, must pass through this function to complete the actual creation.\n
4271 * The base "chance" of the item being "good" increases with the "level"\n
4272 * parameter, which is usually derived from the dungeon level, being equal\n
4273 * to the level plus 10, up to a maximum of 75. If "good" is true, then\n
4274 * the object is guaranteed to be "good". If an object is "good", then\n
4275 * the chance that the object will be "great" (ego-item or artifact), also\n
4276 * increases with the "level", being equal to half the level, plus 5, up to\n
4277 * a maximum of 20. If "great" is true, then the object is guaranteed to be\n
4278 * "great". At dungeon level 65 and below, 15/100 objects are "great".\n
4280 * If the object is not "good", there is a chance it will be "cursed", and\n
4281 * if it is "cursed", there is a chance it will be "broken". These chances\n
4282 * are related to the "good" / "great" chances above.\n
4284 * Otherwise "normal" rings and amulets will be "good" half the time and\n
4285 * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4287 * If "okay" is true, and the object is going to be "great", then there is\n
4288 * a chance that an artifact will be created. This is true even if both the\n
4289 * "good" and "great" arguments are false. As a total hack, if "great" is\n
4290 * true, then the item gets 3 extra "attempts" to become an artifact.\n
4292 void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
4294 int i, rolls, f1, f2, power;
4296 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4298 /* Maximum "level" for various things */
4299 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4301 /* Base chance of being "good" */
4304 /* Maximal chance of being "good" */
4305 if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4307 /* Base chance of being "great" */
4310 /* Maximal chance of being "great" */
4311 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4312 f2 = d_info[dungeon_type].obj_great;
4314 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4319 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4328 /* Roll for "good" */
4329 if ((mode & AM_GOOD) || magik(f1))
4334 /* Roll for "great" */
4335 if ((mode & AM_GREAT) || magik(f2))
4339 /* Roll for "special" */
4340 if (mode & AM_SPECIAL) power = 3;
4344 /* Roll for "cursed" */
4347 /* Assume "cursed" */
4350 /* Roll for "broken" */
4351 if (magik(f2)) power = -2;
4355 if (mode & AM_CURSED)
4357 /* Assume 'cursed' */
4362 /* Everything else gets more badly cursed */
4369 /* Assume no rolls */
4372 /* Get one roll if excellent */
4373 if (power >= 2) rolls = 1;
4375 /* Hack -- Get four rolls if forced great or special */
4376 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4378 /* Hack -- Get no rolls if not allowed */
4379 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4381 /* Roll for artifacts if allowed */
4382 for (i = 0; i < rolls; i++)
4384 /* Roll for an artifact */
4385 if (make_artifact(o_ptr)) break;
4386 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4388 if (make_artifact(o_ptr)) break;
4393 /* Hack -- analyze artifacts */
4394 if (object_is_fixed_artifact(o_ptr))
4396 artifact_type *a_ptr = &a_info[o_ptr->name1];
4398 /* Hack -- Mark the artifact as "created" */
4401 /* Hack -- Memorize location of artifact in saved floors */
4402 if (character_dungeon)
4403 a_ptr->floor_id = p_ptr->floor_id;
4405 /* Extract the other fields */
4406 o_ptr->pval = a_ptr->pval;
4407 o_ptr->ac = a_ptr->ac;
4408 o_ptr->dd = a_ptr->dd;
4409 o_ptr->ds = a_ptr->ds;
4410 o_ptr->to_a = a_ptr->to_a;
4411 o_ptr->to_h = a_ptr->to_h;
4412 o_ptr->to_d = a_ptr->to_d;
4413 o_ptr->weight = a_ptr->weight;
4414 o_ptr->xtra2 = a_ptr->act_idx;
4416 if (o_ptr->name1 == ART_MILIM)
4418 if(p_ptr->pseikaku == SEIKAKU_SEXY)
4424 /* Hack -- extract the "broken" flag */
4425 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4427 /* Hack -- extract the "cursed" flag */
4428 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4429 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4430 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4431 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4432 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4433 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4440 switch (o_ptr->tval)
4449 if (power) a_m_aux_1(o_ptr, lev, power);
4455 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4461 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4475 /* Elven Cloak and Black Clothes ... */
4476 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4477 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4478 o_ptr->pval = randint1(4);
4482 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4483 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4484 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4485 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4486 a_m_aux_2(o_ptr, lev, power);
4488 if (power) a_m_aux_2(o_ptr, lev, power);
4496 if (!power && (randint0(100) < 50)) power = -1;
4497 a_m_aux_3(o_ptr, lev, power);
4503 a_m_aux_4(o_ptr, lev, power);
4508 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4509 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4510 (p_ptr->pseikaku == SEIKAKU_SEXY))
4513 add_flag(o_ptr->art_flags, TR_STR);
4514 add_flag(o_ptr->art_flags, TR_INT);
4515 add_flag(o_ptr->art_flags, TR_WIS);
4516 add_flag(o_ptr->art_flags, TR_DEX);
4517 add_flag(o_ptr->art_flags, TR_CON);
4518 add_flag(o_ptr->art_flags, TR_CHR);
4521 /* Hack -- analyze ego-items */
4522 if (object_is_ego(o_ptr))
4524 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4526 /* Hack -- acquire "broken" flag */
4527 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4529 /* Hack -- acquire "cursed" flag */
4530 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4531 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4532 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4533 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4534 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4535 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4537 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4538 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4539 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4540 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4541 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4542 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4543 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4544 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4550 while (one_in_(o_ptr->dd));
4552 if (o_ptr->dd > 9) o_ptr->dd = 9;
4555 /* Hack -- apply activatin index if needed */
4556 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
4558 /* Hack -- apply extra penalties if needed */
4559 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4561 /* Hack -- obtain bonuses */
4562 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4563 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4564 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4566 /* Hack -- obtain pval */
4567 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4570 /* Hack -- apply extra bonuses if needed */
4573 /* Hack -- obtain bonuses */
4574 if (e_ptr->max_to_h)
4576 if (e_ptr->max_to_h > 127)
4577 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4578 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4580 if (e_ptr->max_to_d)
4582 if (e_ptr->max_to_d > 127)
4583 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4584 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4586 if (e_ptr->max_to_a)
4588 if (e_ptr->max_to_a > 127)
4589 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4590 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4593 /* Accuracy ego must have high to_h */
4594 if(o_ptr->name2 == EGO_ACCURACY)
4596 while(o_ptr->to_h < o_ptr->to_d + 10)
4601 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4604 /* Accuracy ego must have high to_h */
4605 if(o_ptr->name2 == EGO_VELOCITY)
4607 while(o_ptr->to_d < o_ptr->to_h + 10)
4612 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4615 /* Protection ego must have high to_a */
4616 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4618 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4621 /* Hack -- obtain pval */
4622 if (e_ptr->max_pval)
4624 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4627 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4629 else if (o_ptr->name2 == EGO_DEMON)
4631 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4633 o_ptr->pval += randint1(2);
4637 o_ptr->pval += randint1(e_ptr->max_pval);
4640 else if (o_ptr->name2 == EGO_ATTACKS)
4642 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4643 if (o_ptr->pval > 3) o_ptr->pval = 3;
4644 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4645 o_ptr->pval += randint1(2);
4647 else if (o_ptr->name2 == EGO_BAT)
4649 o_ptr->pval = randint1(e_ptr->max_pval);
4650 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4652 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4654 o_ptr->pval = randint1(e_ptr->max_pval);
4658 o_ptr->pval += randint1(e_ptr->max_pval);
4663 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4665 o_ptr->pval = randint1(o_ptr->pval);
4667 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4674 /* Examine real objects */
4677 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4679 /* Hack -- acquire "broken" flag */
4680 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4682 /* Hack -- acquire "cursed" flag */
4683 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4684 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4685 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4686 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4687 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4688 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4696 * @brief ベースアイテムが上質として扱われるかどうかを返す。
4697 * Hack -- determine if a template is "good"
4698 * @param k_idx 判定したいベースアイテムのID
4699 * @return ベースアイテムが上質ならばTRUEを返す。
4701 static bool kind_is_good(KIND_OBJECT_IDX k_idx)
4703 object_kind *k_ptr = &k_info[k_idx];
4705 /* Analyze the item type */
4706 switch (k_ptr->tval)
4708 /* Armor -- Good unless damaged */
4719 if (k_ptr->to_a < 0) return (FALSE);
4723 /* Weapons -- Good unless damaged */
4730 if (k_ptr->to_h < 0) return (FALSE);
4731 if (k_ptr->to_d < 0) return (FALSE);
4735 /* Ammo -- Arrows/Bolts are good */
4742 /* Books -- High level books are good (except Arcane books) */
4744 case TV_SORCERY_BOOK:
4745 case TV_NATURE_BOOK:
4750 case TV_DAEMON_BOOK:
4751 case TV_CRUSADE_BOOK:
4753 case TV_HISSATSU_BOOK:
4756 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4760 /* Rings -- Rings of Speed are good */
4763 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4764 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4768 /* Amulets -- Amulets of the Magi and Resistance are good */
4771 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4772 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4777 /* Assume not good */
4782 * @brief 生成階に応じたベースアイテムの生成を行う。
4783 * Attempt to make an object (normal or good/great)
4784 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4785 * @param mode オプションフラグ
4786 * @return 生成に成功したらTRUEを返す。
4788 * This routine plays nasty games to generate the "special artifacts".\n
4789 * This routine uses "object_level" for the "generation level".\n
4790 * We assume that the given object has been "wiped".\n
4792 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
4798 /* Chance of "special object" */
4799 prob = ((mode & AM_GOOD) ? 10 : 1000);
4801 /* Base level for the object */
4802 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4805 /* Generate a special object, or a normal object */
4806 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4808 KIND_OBJECT_IDX k_idx;
4811 if ((mode & AM_GOOD) && !get_obj_num_hook)
4813 /* Activate restriction (if already specified, use that) */
4814 get_obj_num_hook = kind_is_good;
4817 /* Restricted objects - prepare allocation table */
4818 if (get_obj_num_hook) get_obj_num_prep();
4820 /* Pick a random object */
4821 k_idx = get_obj_num(base);
4823 /* Restricted objects */
4824 if (get_obj_num_hook)
4826 /* Clear restriction */
4827 get_obj_num_hook = NULL;
4829 /* Reset allocation table to default */
4833 /* Handle failure */
4834 if (!k_idx) return (FALSE);
4836 /* Prepare the object */
4837 object_prep(j_ptr, k_idx);
4840 /* Apply magic (allow artifacts) */
4841 apply_magic(j_ptr, object_level, mode);
4843 /* Hack -- generate multiple spikes/missiles */
4844 switch (j_ptr->tval)
4852 j_ptr->number = (byte)damroll(6, 7);
4856 if (cheat_peek) object_mention(j_ptr);
4864 * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
4865 * Attempt to place an object (normal or good/great) at the given location.
4866 * @param y 配置したいフロアのY座標
4867 * @param x 配置したいフロアのX座標
4868 * @param mode オプションフラグ
4869 * @return 生成に成功したらTRUEを返す。
4871 * This routine plays nasty games to generate the "special artifacts".\n
4872 * This routine uses "object_level" for the "generation level".\n
4873 * This routine requires a clean floor grid destination.\n
4875 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
4880 cave_type *c_ptr = &cave[y][x];
4886 /* Paranoia -- check bounds */
4887 if (!in_bounds(y, x)) return;
4889 /* Require floor space */
4890 if (!cave_drop_bold(y, x)) return;
4892 /* Avoid stacking on other objects */
4893 if (c_ptr->o_idx) return;
4896 /* Get local object */
4900 /* Make an object (if possible) */
4901 if (!make_object(q_ptr, mode)) return;
4904 /* Make an object */
4911 o_ptr = &o_list[o_idx];
4913 /* Structure Copy */
4914 object_copy(o_ptr, q_ptr);
4920 o_ptr->next_o_idx = c_ptr->o_idx;
4922 /* Place the object */
4923 c_ptr->o_idx = o_idx;
4931 /* Hack -- Preserve artifacts */
4932 if (object_is_fixed_artifact(q_ptr))
4934 a_info[q_ptr->name1].cur_num = 0;
4941 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
4942 * Make a treasure object
4943 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4944 * @return 生成に成功したらTRUEを返す。
4946 * The location must be a legal, clean, floor grid.
4948 bool make_gold(object_type *j_ptr)
4953 /* Hack -- Pick a Treasure variety */
4954 i = ((randint1(object_level + 2) + 2) / 2) - 1;
4956 /* Apply "extra" magic */
4957 if (one_in_(GREAT_OBJ))
4959 i += randint1(object_level + 1);
4962 /* Hack -- Creeping Coins only generate "themselves" */
4963 if (coin_type) i = coin_type;
4965 /* Do not create "illegal" Treasure Types */
4966 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
4968 /* Prepare a gold object */
4969 object_prep(j_ptr, OBJ_GOLD_LIST + i);
4971 /* Hack -- Base coin cost */
4972 base = k_info[OBJ_GOLD_LIST + i].cost;
4974 /* Determine how much the treasure is "worth" */
4975 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
4983 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
4984 * Places a treasure (Gold or Gems) at given location
4985 * @param y 配置したいフロアのY座標
4986 * @param x 配置したいフロアのX座標
4987 * @return 生成に成功したらTRUEを返す。
4989 * The location must be a legal, clean, floor grid.
4991 void place_gold(POSITION y, POSITION x)
4996 cave_type *c_ptr = &cave[y][x];
5002 /* Paranoia -- check bounds */
5003 if (!in_bounds(y, x)) return;
5005 /* Require floor space */
5006 if (!cave_drop_bold(y, x)) return;
5008 /* Avoid stacking on other objects */
5009 if (c_ptr->o_idx) return;
5012 /* Get local object */
5016 /* Make some gold */
5017 if (!make_gold(q_ptr)) return;
5019 /* Make an object */
5026 o_ptr = &o_list[o_idx];
5028 /* Copy the object */
5029 object_copy(o_ptr, q_ptr);
5036 o_ptr->next_o_idx = c_ptr->o_idx;
5038 /* Place the object */
5039 c_ptr->o_idx = o_idx;
5049 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
5050 * Let an object fall to the ground at or near a location.
5051 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
5052 * @param chance ドロップの成功率(%)
5053 * @param y 配置したいフロアのY座標
5054 * @param x 配置したいフロアのX座標
5055 * @return 生成に成功したらオブジェクトのIDを返す。
5057 * The initial location is assumed to be "in_bounds()".\n
5059 * This function takes a parameter "chance". This is the percentage\n
5060 * chance that the item will "disappear" instead of drop. If the object\n
5061 * has been thrown, then this is the chance of disappearance on contact.\n
5063 * Hack -- this function uses "chance" to determine if it should produce\n
5064 * some form of "description" of the drop event (under the player).\n
5066 * We check several locations to see if we can find a location at which\n
5067 * the object can combine, stack, or be placed. Artifacts will try very\n
5068 * hard to be placed, including "teleporting" to a useful grid if needed.\n
5070 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
5077 POSITION ty, tx = 0;
5079 OBJECT_IDX o_idx = 0;
5080 OBJECT_IDX this_o_idx, next_o_idx = 0;
5084 char o_name[MAX_NLEN];
5090 /* Extract plural */
5091 bool plural = (j_ptr->number != 1);
5094 /* Describe object */
5095 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5098 /* Handle normal "breakage" */
5099 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
5102 msg_format("%sは消えた。", o_name);
5104 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5107 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
5124 /* Scan local grids */
5125 for (dy = -3; dy <= 3; dy++)
5127 /* Scan local grids */
5128 for (dx = -3; dx <= 3; dx++)
5132 /* Calculate actual distance */
5133 d = (dy * dy) + (dx * dx);
5135 /* Ignore distant grids */
5136 if (d > 10) continue;
5141 /* Skip illegal grids */
5142 if (!in_bounds(ty, tx)) continue;
5144 /* Require line of projection */
5145 if (!projectable(y, x, ty, tx)) continue;
5148 c_ptr = &cave[ty][tx];
5150 /* Require floor space */
5151 if (!cave_drop_bold(ty, tx)) continue;
5156 /* Scan objects in that grid */
5157 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5160 o_ptr = &o_list[this_o_idx];
5162 /* Acquire next object */
5163 next_o_idx = o_ptr->next_o_idx;
5165 /* Check for possible combination */
5166 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5172 /* Add new object */
5176 if (k > 99) continue;
5178 /* Calculate score */
5179 s = 1000 - (d + k * 5);
5181 /* Skip bad values */
5182 if (s < bs) continue;
5184 /* New best value */
5187 /* Apply the randomizer to equivalent values */
5188 if ((++bn >= 2) && !one_in_(bn)) continue;
5202 /* Handle lack of space */
5203 if (!flag && !object_is_artifact(j_ptr))
5206 msg_format("%sは消えた。", o_name);
5208 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5213 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5221 for (i = 0; !flag && (i < 1000); i++)
5224 ty = rand_spread(by, 1);
5225 tx = rand_spread(bx, 1);
5227 /* Verify location */
5228 if (!in_bounds(ty, tx)) continue;
5230 /* Bounce to that location */
5234 /* Require floor space */
5235 if (!cave_drop_bold(by, bx)) continue;
5243 int candidates = 0, pick;
5245 for (ty = 1; ty < cur_hgt - 1; ty++)
5247 for (tx = 1; tx < cur_wid - 1; tx++)
5249 /* A valid space found */
5250 if (cave_drop_bold(ty, tx)) candidates++;
5254 /* No valid place! */
5258 msg_format("%sは消えた。", o_name);
5260 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5264 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5266 /* Mega-Hack -- preserve artifacts */
5269 /* Hack -- Preserve unknown artifacts */
5270 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5272 /* Mega-Hack -- Preserve the artifact */
5273 a_info[j_ptr->name1].cur_num = 0;
5281 /* Choose a random one */
5282 pick = randint1(candidates);
5284 for (ty = 1; ty < cur_hgt - 1; ty++)
5286 for (tx = 1; tx < cur_wid - 1; tx++)
5288 if (cave_drop_bold(ty, tx))
5292 /* Is this a picked one? */
5306 c_ptr = &cave[by][bx];
5308 /* Scan objects in that grid for combination */
5309 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5312 o_ptr = &o_list[this_o_idx];
5314 /* Acquire next object */
5315 next_o_idx = o_ptr->next_o_idx;
5317 /* Check for combination */
5318 if (object_similar(o_ptr, j_ptr))
5320 /* Combine the items */
5321 object_absorb(o_ptr, j_ptr);
5330 /* Get new object */
5331 if (!done) o_idx = o_pop();
5334 if (!done && !o_idx)
5337 msg_format("%sは消えた。", o_name);
5339 msg_format("The %s disappear%s.",
5340 o_name, (plural ? "" : "s"));
5345 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5347 /* Hack -- Preserve artifacts */
5348 if (object_is_fixed_artifact(j_ptr))
5350 a_info[j_ptr->name1].cur_num = 0;
5360 /* Structure copy */
5361 object_copy(&o_list[o_idx], j_ptr);
5363 /* Access new object */
5364 j_ptr = &o_list[o_idx];
5371 j_ptr->held_m_idx = 0;
5374 j_ptr->next_o_idx = c_ptr->o_idx;
5376 /* Place the object */
5377 c_ptr->o_idx = o_idx;
5391 /* Mega-Hack -- no message if "dropped" by player */
5392 /* Message when an object falls under the player */
5393 if (chance && player_bold(by, bx))
5395 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5404 * Scatter some "great" objects near the player
5405 * @param y1 配置したいフロアのY座標
5406 * @param x1 配置したいフロアのX座標
5407 * @param num 獲得の処理回数
5408 * @param great TRUEならば必ず高級品以上を落とす
5409 * @param special TRUEならば必ず特別品を落とす
5410 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5413 void acquirement(POSITION y1, POSITION x1, int num, bool great, bool special, bool known)
5416 object_type object_type_body;
5417 BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ;
5422 /* Get local object */
5423 i_ptr = &object_type_body;
5426 /* Make a good (or great) object (if possible) */
5427 if (!make_object(i_ptr, mode)) continue;
5431 object_aware(i_ptr);
5432 object_known(i_ptr);
5435 /* Drop the object */
5436 (void)drop_near(i_ptr, -1, y1, x1);
5441 * Scatter some "amusing" objects near the player
5444 #define AMS_NOTHING 0x00 /* No restriction */
5445 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
5446 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
5447 #define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */
5448 #define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */
5452 OBJECT_TYPE_VALUE tval;
5453 OBJECT_SUBTYPE_VALUE sval;
5458 amuse_type amuse_info[] =
5460 { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
5461 { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
5462 { TV_SPIKE, SV_ANY, 10, AMS_PILE },
5463 { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
5464 { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
5465 { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
5466 { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
5467 { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
5468 { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
5469 { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
5470 { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
5471 { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
5472 { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
5479 * @param y1 配置したいフロアのY座標
5480 * @param x1 配置したいフロアのX座標
5481 * @param num 誰得の処理回数
5482 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5485 void amusement(POSITION y1, POSITION x1, int num, bool known)
5488 object_type object_type_body;
5491 for (n = 0; amuse_info[n].tval != 0; n++)
5493 t += amuse_info[n].prob;
5500 KIND_OBJECT_IDX k_idx;
5501 ARTIFACT_IDX a_idx = 0;
5502 int r = randint0(t);
5503 bool insta_art, fixed_art;
5507 r -= amuse_info[i].prob;
5511 /* Get local object */
5512 i_ptr = &object_type_body;
5514 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
5516 /* Paranoia - reroll if nothing */
5517 if (!k_idx) continue;
5519 /* Search an artifact index if need */
5520 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
5521 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
5523 if (insta_art || fixed_art)
5525 for (a_idx = 1; a_idx < max_a_idx; a_idx++)
5527 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
5528 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
5529 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
5530 if (a_info[a_idx].cur_num > 0) continue;
5534 if (a_idx >= max_a_idx) continue;
5537 /* Make an object (if possible) */
5538 object_prep(i_ptr, k_idx);
5539 if (a_idx) i_ptr->name1 = a_idx;
5540 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
5542 if (amuse_info[i].flag & AMS_NO_UNIQUE)
5544 if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
5547 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
5548 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
5552 object_aware(i_ptr);
5553 object_known(i_ptr);
5556 /* Paranoia - reroll if nothing */
5557 if (!(i_ptr->k_idx)) continue;
5559 /* Drop the object */
5560 (void)drop_near(i_ptr, -1, y1, x1);
5568 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5569 * Describe the charges on an item in the inventory.
5570 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5573 void inven_item_charges(INVENTORY_IDX item)
5575 object_type *o_ptr = &inventory[item];
5577 /* Require staff/wand */
5578 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5580 /* Require known item */
5581 if (!object_is_known(o_ptr)) return;
5584 if (o_ptr->pval <= 0)
5586 msg_print("もう魔力が残っていない。");
5590 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5593 /* Multiple charges */
5594 if (o_ptr->pval != 1)
5596 msg_format("You have %d charges remaining.", o_ptr->pval);
5602 msg_format("You have %d charge remaining.", o_ptr->pval);
5609 * @brief アイテムの残り所持数メッセージを表示する /
5610 * Describe an item in the inventory.
5611 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5614 void inven_item_describe(INVENTORY_IDX item)
5616 object_type *o_ptr = &inventory[item];
5617 char o_name[MAX_NLEN];
5619 object_desc(o_name, o_ptr, 0);
5622 /* "no more" の場合はこちらで表示する */
5623 if (o_ptr->number <= 0)
5625 /*FIRST*//*ここはもう通らないかも */
5626 msg_format("もう%sを持っていない。", o_name);
5630 /* アイテム名を英日切り替え機能対応 */
5631 msg_format("まだ %sを持っている。", o_name);
5634 msg_format("You have %s.", o_name);
5640 * @brief アイテムを増やし残り所持数メッセージを表示する /
5641 * Increase the "number" of an item in the inventory
5642 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5646 void inven_item_increase(INVENTORY_IDX item, int num)
5648 object_type *o_ptr = &inventory[item];
5651 num += o_ptr->number;
5654 if (num > 255) num = 255;
5655 else if (num < 0) num = 0;
5658 num -= (ITEM_NUMBER)o_ptr->number;
5660 /* Change the number and weight */
5663 /* Add the number */
5664 o_ptr->number += num;
5666 /* Add the weight */
5667 p_ptr->total_weight += (num * o_ptr->weight);
5669 /* Recalculate bonuses */
5670 p_ptr->update |= (PU_BONUS);
5672 /* Recalculate mana XXX */
5673 p_ptr->update |= (PU_MANA);
5675 /* Combine the pack */
5676 p_ptr->notice |= (PN_COMBINE);
5678 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5680 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5681 if (!o_ptr->number && p_ptr->ele_attack)
5683 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5685 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5687 /* Clear all temporary elemental brands */
5688 set_ele_attack(0, 0);
5696 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5697 * Erase an inventory slot if it has no more items
5698 * @param item 消去したいプレイヤーのアイテム所持スロット
5701 void inven_item_optimize(INVENTORY_IDX item)
5703 object_type *o_ptr = &inventory[item];
5705 /* Only optimize real items */
5706 if (!o_ptr->k_idx) return;
5708 /* Only optimize empty items */
5709 if (o_ptr->number) return;
5711 /* The item is in the pack */
5712 if (item < INVEN_RARM)
5719 /* Slide everything down */
5720 for (i = item; i < INVEN_PACK; i++)
5722 /* Structure copy */
5723 inventory[i] = inventory[i+1];
5726 /* Erase the "final" slot */
5727 object_wipe(&inventory[i]);
5729 p_ptr->window |= (PW_INVEN);
5732 /* The item is being wielded */
5738 /* Erase the empty slot */
5739 object_wipe(&inventory[item]);
5741 /* Recalculate bonuses */
5742 p_ptr->update |= (PU_BONUS);
5744 /* Recalculate torch */
5745 p_ptr->update |= (PU_TORCH);
5747 /* Recalculate mana XXX */
5748 p_ptr->update |= (PU_MANA);
5750 p_ptr->window |= (PW_EQUIP);
5753 p_ptr->window |= (PW_SPELL);
5757 * @brief 床上の魔道具の残り残量メッセージを表示する /
5758 * Describe the charges on an item on the floor.
5759 * @param item メッセージの対象にしたいアイテム所持スロット
5762 void floor_item_charges(INVENTORY_IDX item)
5764 object_type *o_ptr = &o_list[item];
5766 /* Require staff/wand */
5767 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5769 /* Require known item */
5770 if (!object_is_known(o_ptr)) return;
5773 if (o_ptr->pval <= 0)
5775 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5779 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5782 /* Multiple charges */
5783 if (o_ptr->pval != 1)
5785 msg_format("There are %d charges remaining.", o_ptr->pval);
5791 msg_format("There is %d charge remaining.", o_ptr->pval);
5798 * @brief 床上のアイテムの残り数メッセージを表示する /
5799 * Describe the charges on an item on the floor.
5800 * @param item メッセージの対象にしたいアイテム所持スロット
5803 void floor_item_describe(INVENTORY_IDX item)
5805 object_type *o_ptr = &o_list[item];
5806 char o_name[MAX_NLEN];
5808 object_desc(o_name, o_ptr, 0);
5811 /* "no more" の場合はこちらで表示を分ける */
5812 if (o_ptr->number <= 0)
5814 msg_format("床上には、もう%sはない。", o_name);
5818 msg_format("床上には、まだ %sがある。", o_name);
5821 msg_format("You see %s.", o_name);
5828 * @brief 床上のアイテムの数を増やす /
5829 * Increase the "number" of an item on the floor
5830 * @param item 増やしたいアイテムの所持スロット
5831 * @param num 増やしたいアイテムの数
5834 void floor_item_increase(INVENTORY_IDX item, int num)
5836 object_type *o_ptr = &o_list[item];
5839 num += o_ptr->number;
5842 if (num > 255) num = 255;
5843 else if (num < 0) num = 0;
5846 num -= (int)o_ptr->number;
5848 /* Change the number */
5849 o_ptr->number += (ITEM_NUMBER)num;
5854 * @brief 床上の数の無くなったアイテムスロットを消去する /
5855 * Optimize an item on the floor (destroy "empty" items)
5856 * @param item 消去したいアイテムの所持スロット
5859 void floor_item_optimize(INVENTORY_IDX item)
5861 object_type *o_ptr = &o_list[item];
5863 /* Paranoia -- be sure it exists */
5864 if (!o_ptr->k_idx) return;
5866 /* Only optimize empty items */
5867 if (o_ptr->number) return;
5869 delete_object_idx(item);
5874 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5875 * Check if we have space for an item in the pack without overflow
5876 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5877 * @return 溢れずに済むならTRUEを返す
5879 bool inven_carry_okay(object_type *o_ptr)
5884 if (inven_cnt < INVEN_PACK) return (TRUE);
5887 for (j = 0; j < INVEN_PACK; j++)
5889 object_type *j_ptr = &inventory[j];
5891 /* Skip non-objects */
5892 if (!j_ptr->k_idx) continue;
5894 /* Check if the two items can be combined */
5895 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5902 * @brief オブジェクトを定義された基準に従いソートするための関数 /
5903 * Check if we have space for an item in the pack without overflow
5904 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
5905 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
5906 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
5907 * @return o_ptrの方が上位ならばTRUEを返す。
5909 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5913 /* Use empty slots */
5914 if (!j_ptr->k_idx) return TRUE;
5916 /* Hack -- readable books always come first */
5917 if ((o_ptr->tval == REALM1_BOOK) &&
5918 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5919 if ((j_ptr->tval == REALM1_BOOK) &&
5920 (o_ptr->tval != REALM1_BOOK)) return FALSE;
5922 if ((o_ptr->tval == REALM2_BOOK) &&
5923 (j_ptr->tval != REALM2_BOOK)) return TRUE;
5924 if ((j_ptr->tval == REALM2_BOOK) &&
5925 (o_ptr->tval != REALM2_BOOK)) return FALSE;
5927 /* Objects sort by decreasing type */
5928 if (o_ptr->tval > j_ptr->tval) return TRUE;
5929 if (o_ptr->tval < j_ptr->tval) return FALSE;
5931 /* Non-aware (flavored) items always come last */
5932 /* Can happen in the home */
5933 if (!object_is_aware(o_ptr)) return FALSE;
5934 if (!object_is_aware(j_ptr)) return TRUE;
5936 /* Objects sort by increasing sval */
5937 if (o_ptr->sval < j_ptr->sval) return TRUE;
5938 if (o_ptr->sval > j_ptr->sval) return FALSE;
5940 /* Unidentified objects always come last */
5941 /* Objects in the home can be unknown */
5942 if (!object_is_known(o_ptr)) return FALSE;
5943 if (!object_is_known(j_ptr)) return TRUE;
5945 /* Fixed artifacts, random artifacts and ego items */
5946 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
5947 else if (o_ptr->art_name) o_type = 2;
5948 else if (object_is_ego(o_ptr)) o_type = 1;
5951 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
5952 else if (j_ptr->art_name) j_type = 2;
5953 else if (object_is_ego(j_ptr)) j_type = 1;
5956 if (o_type < j_type) return TRUE;
5957 if (o_type > j_type) return FALSE;
5959 switch (o_ptr->tval)
5965 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
5966 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
5972 /* Objects sort by increasing hit/damage bonuses */
5973 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
5974 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
5977 /* Hack: otherwise identical rods sort by
5978 increasing recharge time --dsb */
5980 if (o_ptr->pval < j_ptr->pval) return TRUE;
5981 if (o_ptr->pval > j_ptr->pval) return FALSE;
5985 /* Objects sort by decreasing value */
5986 return o_value > object_value(j_ptr);
5991 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
5992 * Add an item to the players inventory, and return the slot used.
5993 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
5994 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
5996 * If the new item can combine with an existing item in the inventory,\n
5997 * it will do so, using "object_similar()" and "object_absorb()", else,\n
5998 * the item will be placed into the "proper" location in the inventory.\n
6000 * This function can be used to "over-fill" the player's pack, but only\n
6001 * once, and such an action must trigger the "overflow" code immediately.\n
6002 * Note that when the pack is being "over-filled", the new item must be\n
6003 * placed into the "overflow" slot, and the "overflow" must take place\n
6004 * before the pack is reordered, but (optionally) after the pack is\n
6005 * combined. This may be tricky. See "dungeon.c" for info.\n
6007 * Note that this code must remove any location/stack information\n
6008 * from the object once it is placed into the inventory.\n
6010 s16b inven_carry(object_type *o_ptr)
6012 INVENTORY_IDX i, j, k;
6013 INVENTORY_IDX n = -1;
6018 /* Check for combining */
6019 for (j = 0; j < INVEN_PACK; j++)
6021 j_ptr = &inventory[j];
6023 /* Skip non-objects */
6024 if (!j_ptr->k_idx) continue;
6026 /* Hack -- track last item */
6029 /* Check if the two items can be combined */
6030 if (object_similar(j_ptr, o_ptr))
6032 /* Combine the items */
6033 object_absorb(j_ptr, o_ptr);
6035 /* Increase the weight */
6036 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6038 /* Recalculate bonuses */
6039 p_ptr->update |= (PU_BONUS);
6041 p_ptr->window |= (PW_INVEN);
6050 if (inven_cnt > INVEN_PACK) return (-1);
6052 /* Find an empty slot */
6053 for (j = 0; j <= INVEN_PACK; j++)
6055 j_ptr = &inventory[j];
6057 /* Use it if found */
6058 if (!j_ptr->k_idx) break;
6065 /* Reorder the pack */
6068 /* Get the "value" of the item */
6069 s32b o_value = object_value(o_ptr);
6071 /* Scan every occupied slot */
6072 for (j = 0; j < INVEN_PACK; j++)
6074 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6081 for (k = n; k >= i; k--)
6083 /* Hack -- Slide the item */
6084 object_copy(&inventory[k+1], &inventory[k]);
6087 /* Wipe the empty slot */
6088 object_wipe(&inventory[i]);
6093 object_copy(&inventory[i], o_ptr);
6095 /* Access new object */
6096 j_ptr = &inventory[i];
6099 j_ptr->next_o_idx = 0;
6101 /* Forget monster */
6102 j_ptr->held_m_idx = 0;
6104 /* Forget location */
6105 j_ptr->iy = j_ptr->ix = 0;
6107 /* Player touches it, and no longer marked */
6108 j_ptr->marked = OM_TOUCHED;
6110 /* Increase the weight */
6111 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6113 /* Count the items */
6116 /* Recalculate bonuses */
6117 p_ptr->update |= (PU_BONUS);
6119 /* Combine and Reorder pack */
6120 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
6122 p_ptr->window |= (PW_INVEN);
6124 /* Return the slot */
6130 * @brief 装備スロットからオブジェクトを外すメインルーチン /
6131 * Take off (some of) a non-cursed equipment item
6132 * @param item オブジェクトを外したい所持テーブルのID
6134 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6136 * Note that only one item at a time can be wielded per slot.\n
6137 * Note that taking off an item when "full" may cause that item\n
6138 * to fall to the ground.\n
6139 * Return the inventory slot into which the item is placed.\n
6141 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
6152 char o_name[MAX_NLEN];
6155 /* Get the item to take off */
6156 o_ptr = &inventory[item];
6159 if (amt <= 0) return (-1);
6162 if (amt > o_ptr->number) amt = o_ptr->number;
6164 /* Get local object */
6167 /* Obtain a local object */
6168 object_copy(q_ptr, o_ptr);
6170 /* Modify quantity */
6171 q_ptr->number = amt;
6173 object_desc(o_name, q_ptr, 0);
6175 /* Took off weapon */
6176 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
6177 object_is_melee_weapon(o_ptr))
6179 act = _("を装備からはずした", "You were wielding");
6183 else if (item == INVEN_BOW)
6185 act = _("を装備からはずした", "You were holding");
6188 /* Took off light */
6189 else if (item == INVEN_LITE)
6191 act = _("を光源からはずした", "You were holding");
6194 /* Took off something */
6197 act = _("を装備からはずした", "You were wearing");
6200 /* Modify, Optimize */
6201 inven_item_increase(item, -amt);
6202 inven_item_optimize(item);
6204 /* Carry the object */
6205 slot = inven_carry(q_ptr);
6208 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
6210 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6220 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
6221 * Drop (some of) a non-cursed inventory/equipment item
6222 * @param item 所持テーブルのID
6223 * @param amt 落としたい個数
6226 * The object will be dropped "near" the current location
6228 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
6234 char o_name[MAX_NLEN];
6237 /* Access original object */
6238 o_ptr = &inventory[item];
6241 if (amt <= 0) return;
6244 if (amt > o_ptr->number) amt = o_ptr->number;
6247 /* Take off equipment */
6248 if (item >= INVEN_RARM)
6250 /* Take off first */
6251 item = inven_takeoff(item, amt);
6253 /* Access original object */
6254 o_ptr = &inventory[item];
6258 /* Get local object */
6261 /* Obtain local object */
6262 object_copy(q_ptr, o_ptr);
6264 /* Distribute charges of wands or rods */
6265 distribute_charges(o_ptr, q_ptr, amt);
6267 /* Modify quantity */
6268 q_ptr->number = amt;
6270 /* Describe local object */
6271 object_desc(o_name, q_ptr, 0);
6273 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
6275 /* Drop it near the player */
6276 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
6278 /* Modify, Describe, Optimize */
6279 inven_item_increase(item, -amt);
6280 inven_item_describe(item);
6281 inven_item_optimize(item);
6286 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
6287 * Combine items in the pack
6290 * Note special handling of the "overflow" slot
6292 void combine_pack(void)
6297 bool flag = FALSE, combined;
6303 /* Combine the pack (backwards) */
6304 for (i = INVEN_PACK; i > 0; i--)
6306 o_ptr = &inventory[i];
6308 /* Skip empty items */
6309 if (!o_ptr->k_idx) continue;
6311 /* Scan the items above that item */
6312 for (j = 0; j < i; j++)
6316 j_ptr = &inventory[j];
6318 /* Skip empty items */
6319 if (!j_ptr->k_idx) continue;
6322 * Get maximum number of the stack if these
6323 * are similar, get zero otherwise.
6325 max_num = object_similar_part(j_ptr, o_ptr);
6327 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6328 if (max_num && j_ptr->number < max_num)
6330 if (o_ptr->number + j_ptr->number <= max_num)
6335 /* Add together the item counts */
6336 object_absorb(j_ptr, o_ptr);
6338 /* One object is gone */
6341 /* Slide everything down */
6342 for (k = i; k < INVEN_PACK; k++)
6344 /* Structure copy */
6345 inventory[k] = inventory[k+1];
6348 /* Erase the "final" slot */
6349 object_wipe(&inventory[k]);
6353 int old_num = o_ptr->number;
6354 int remain = j_ptr->number + o_ptr->number - max_num;
6356 o_ptr->number -= remain;
6358 /* Add together the item counts */
6359 object_absorb(j_ptr, o_ptr);
6361 o_ptr->number = remain;
6363 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6364 if (o_ptr->tval == TV_ROD)
6366 o_ptr->pval = o_ptr->pval * remain / old_num;
6367 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6370 /* Hack -- if wands are stacking, combine the charges. -LM- */
6371 if (o_ptr->tval == TV_WAND)
6373 o_ptr->pval = o_ptr->pval * remain / old_num;
6377 p_ptr->window |= (PW_INVEN);
6389 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6393 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6394 * Reorder items in the pack
6397 * Note special handling of the "overflow" slot
6399 void reorder_pack(void)
6409 /* Re-order the pack (forwards) */
6410 for (i = 0; i < INVEN_PACK; i++)
6412 /* Mega-Hack -- allow "proper" over-flow */
6413 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6415 o_ptr = &inventory[i];
6417 /* Skip empty slots */
6418 if (!o_ptr->k_idx) continue;
6420 /* Get the "value" of the item */
6421 o_value = object_value(o_ptr);
6423 /* Scan every occupied slot */
6424 for (j = 0; j < INVEN_PACK; j++)
6426 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6429 /* Never move down */
6430 if (j >= i) continue;
6435 /* Get local object */
6438 /* Save a copy of the moving item */
6439 object_copy(q_ptr, &inventory[i]);
6441 /* Slide the objects */
6442 for (k = i; k > j; k--)
6444 /* Slide the item */
6445 object_copy(&inventory[k], &inventory[k-1]);
6448 /* Insert the moving item */
6449 object_copy(&inventory[j], q_ptr);
6451 p_ptr->window |= (PW_INVEN);
6454 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6458 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6459 * Hack -- display an object kind in the current window
6460 * @param k_idx ベースアイテムの参照ID
6463 * Include list of usable spells for readible books
6465 void display_koff(KIND_OBJECT_IDX k_idx)
6472 REALM_IDX use_realm;
6474 char o_name[MAX_NLEN];
6477 /* Erase the window */
6478 for (y = 0; y < Term->hgt; y++)
6480 /* Erase the line */
6481 Term_erase(0, y, 255);
6487 /* Get local object */
6490 /* Prepare the object */
6491 object_prep(q_ptr, k_idx);
6492 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6494 /* Mention the object name */
6495 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6497 /* Access the item's sval */
6499 use_realm = tval2realm(q_ptr->tval);
6501 /* Warriors are illiterate */
6502 if (p_ptr->realm1 || p_ptr->realm2)
6504 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6508 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6509 if (!is_magic(use_realm)) return;
6510 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6513 /* Display spells in readible books */
6517 SPELL_IDX spells[64];
6519 /* Extract spells */
6520 for (spell = 0; spell < 32; spell++)
6522 /* Check for this spell */
6523 if (fake_spell_flags[sval] & (1L << spell))
6525 /* Collect this spell */
6526 spells[num++] = spell;
6531 print_spells(0, spells, num, 2, 0, use_realm);
6536 * @brief 警告を放つアイテムを選択する /
6537 * Choose one of items that have warning flag
6538 * Calculate spell damages
6541 object_type *choose_warning_item(void)
6544 int choices[INVEN_TOTAL - INVEN_RARM];
6547 /* Paranoia -- Player has no warning ability */
6548 if (!p_ptr->warning) return NULL;
6550 /* Search Inventory */
6551 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6553 BIT_FLAGS flgs[TR_FLAG_SIZE];
6554 object_type *o_ptr = &inventory[i];
6556 object_flags(o_ptr, flgs);
6557 if (have_flag(flgs, TR_WARNING))
6559 choices[number] = i;
6564 /* Choice one of them */
6565 return number ? &inventory[choices[randint0(number)]] : NULL;
6569 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6570 * Calculate spell damages
6571 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6572 * @param typ 効果属性のID
6574 * @param max 算出した最大ダメージを返すポインタ
6577 static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
6579 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6580 int rlev = r_ptr->level;
6581 bool ignore_wraith_form = FALSE;
6583 /* Vulnerability, resistance and immunity */
6587 if (p_ptr->immune_elec)
6590 ignore_wraith_form = TRUE;
6594 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6595 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6596 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6597 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6598 if (IS_OPPOSE_ELEC())
6599 dam = (dam + 2) / 3;
6604 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6605 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6609 if (p_ptr->immune_acid)
6612 ignore_wraith_form = TRUE;
6616 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6617 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6618 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6619 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6625 if (p_ptr->immune_cold)
6628 ignore_wraith_form = TRUE;
6632 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6633 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6634 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6635 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6640 if (p_ptr->immune_fire)
6643 ignore_wraith_form = TRUE;
6647 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6648 if (prace_is_(RACE_ENT)) dam += dam / 3;
6649 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6650 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6651 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6656 ignore_wraith_form = TRUE;
6660 if (!p_ptr->blind &&
6661 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6662 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6665 ignore_wraith_form = TRUE;
6670 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6671 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6672 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6675 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6676 * "dam *= 2;" for later "dam /= 2"
6678 if (p_ptr->wraith_form) dam *= 2;
6682 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6685 ignore_wraith_form = TRUE;
6687 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6691 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6695 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6699 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6703 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6707 if (prace_is_(RACE_SPECTRE))
6710 ignore_wraith_form = TRUE;
6712 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6716 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6720 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6724 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6728 if (p_ptr->levitation) dam = (dam * 2) / 3;
6732 if (p_ptr->resist_shard) dam /= 2;
6736 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6737 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6741 if (p_ptr->mimic_form)
6743 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6746 ignore_wraith_form = TRUE;
6751 switch (p_ptr->prace)
6760 ignore_wraith_form = TRUE;
6767 if (p_ptr->align > 10) dam /= 2;
6768 else if (p_ptr->align < -10) dam *= 2;
6772 if (p_ptr->align > 10) dam *= 2;
6776 case GF_BRAIN_SMASH:
6777 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6780 ignore_wraith_form = TRUE;
6788 if (100 + rlev / 2 <= p_ptr->skill_sav)
6791 ignore_wraith_form = TRUE;
6796 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6799 ignore_wraith_form = TRUE;
6804 if (p_ptr->wraith_form && !ignore_wraith_form)
6810 if (dam > *max) *max = dam;
6814 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6815 * Calculate spell damages
6816 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6817 * @param typ 効果属性のID
6818 * @param m_idx 魔法を行使するモンスターのID
6819 * @param max 算出した最大ダメージを返すポインタ
6822 void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
6824 monster_type *m_ptr = &m_list[m_idx];
6825 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6826 spell_damcalc(m_ptr, typ, dam, max);
6830 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6831 * Calculate blow damages
6832 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6833 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6834 * @return 算出された最大ダメージを返す。
6836 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6838 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6840 bool check_wraith_form = TRUE;
6842 if (blow_ptr->method != RBM_EXPLODE)
6844 ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
6846 switch (blow_ptr->effect)
6850 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6851 dam = MAX(dam, tmp_dam * 2);
6857 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6861 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6863 check_wraith_form = FALSE;
6867 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6869 check_wraith_form = FALSE;
6873 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6875 check_wraith_form = FALSE;
6879 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6881 check_wraith_form = FALSE;
6886 check_wraith_form = FALSE;
6890 if (check_wraith_form && p_ptr->wraith_form)
6898 dam = (dam + 1) / 2;
6899 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
6907 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
6908 * Examine the grid (xx,yy) and warn the player if there are any danger
6909 * @param xx 危険性を調査するマスのX座標
6910 * @param yy 危険性を調査するマスのY座標
6911 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
6913 bool process_warning(POSITION xx, POSITION yy)
6917 char o_name[MAX_NLEN];
6919 #define WARNING_AWARE_RANGE 12
6921 static int old_damage = 0;
6923 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
6925 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
6928 monster_type *m_ptr;
6929 monster_race *r_ptr;
6931 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
6933 c_ptr = &cave[my][mx];
6935 if (!c_ptr->m_idx) continue;
6937 m_ptr = &m_list[c_ptr->m_idx];
6939 if (MON_CSLEEP(m_ptr)) continue;
6940 if (!is_hostile(m_ptr)) continue;
6942 r_ptr = &r_info[m_ptr->r_idx];
6944 /* Monster spells (only powerful ones)*/
6945 if (projectable(my, mx, yy, xx))
6947 BIT_FLAGS f4 = r_ptr->flags4;
6948 BIT_FLAGS f5 = r_ptr->a_ability_flags1;
6949 BIT_FLAGS f6 = r_ptr->a_ability_flags2;
6951 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
6953 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
6954 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
6955 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
6956 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, c_ptr->m_idx, &dam_max0);
6957 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, c_ptr->m_idx, &dam_max0);
6958 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, c_ptr->m_idx, &dam_max0);
6960 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, c_ptr->m_idx, &dam_max0);
6961 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, c_ptr->m_idx, &dam_max0);
6962 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, c_ptr->m_idx, &dam_max0);
6963 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, c_ptr->m_idx, &dam_max0);
6964 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, c_ptr->m_idx, &dam_max0);
6965 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, c_ptr->m_idx, &dam_max0);
6966 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, c_ptr->m_idx, &dam_max0);
6967 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, c_ptr->m_idx, &dam_max0);
6968 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
6969 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, c_ptr->m_idx, &dam_max0);
6970 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, c_ptr->m_idx, &dam_max0);
6971 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
6972 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, c_ptr->m_idx, &dam_max0);
6973 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, c_ptr->m_idx, &dam_max0);
6974 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, c_ptr->m_idx, &dam_max0);
6975 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, c_ptr->m_idx, &dam_max0);
6976 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, c_ptr->m_idx, &dam_max0);
6977 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, c_ptr->m_idx, &dam_max0);
6978 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, c_ptr->m_idx, &dam_max0);
6979 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, c_ptr->m_idx, &dam_max0);
6980 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
6981 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, c_ptr->m_idx, &dam_max0);
6982 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, c_ptr->m_idx, &dam_max0);
6985 /* Monster melee attacks */
6986 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
6988 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
6992 for (m = 0; m < 4; m++)
6994 /* Skip non-attacks */
6995 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
6997 /* Extract the attack info */
6998 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
6999 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
7001 if (dam_melee > dam_max0) dam_max0 = dam_melee;
7005 /* Contribution from this monster */
7006 dam_max += dam_max0;
7010 /* Prevent excessive warning */
7011 if (dam_max > old_damage)
7013 old_damage = dam_max * 3 / 2;
7015 if (dam_max > p_ptr->chp / 2)
7017 object_type *o_ptr = choose_warning_item();
7020 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7022 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7023 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7025 disturb(FALSE, TRUE);
7026 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7029 else old_damage = old_damage / 2;
7031 c_ptr = &cave[yy][xx];
7032 if (((!easy_disarm && is_trap(c_ptr->feat))
7033 || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
7035 object_type *o_ptr = choose_warning_item();
7038 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7040 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7041 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7042 disturb(FALSE, TRUE);
7043 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7050 * エッセンス情報の構造体 / A structure for smithing
7053 int add; /* TR flag number or special essence id */
7054 cptr add_name; /* Name of this ability */
7055 ESSENCE_IDX type; /* Menu number */
7056 int essence; /* Index for carrying essences */
7057 int value; /* Needed value to add this ability */
7062 * エッセンス情報テーブル Smithing type data for Weapon smith
7065 static essence_type essence_info[] =
7067 {TR_STR, "腕力", 4, TR_STR, 20},
7068 {TR_INT, "知能", 4, TR_INT, 20},
7069 {TR_WIS, "賢さ", 4, TR_WIS, 20},
7070 {TR_DEX, "器用さ", 4, TR_DEX, 20},
7071 {TR_CON, "耐久力", 4, TR_CON, 20},
7072 {TR_CHR, "魅力", 4, TR_CHR, 20},
7073 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
7074 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
7075 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
7076 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
7077 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
7078 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
7079 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
7080 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
7081 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
7082 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
7083 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
7084 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
7085 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
7086 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
7087 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
7088 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
7089 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
7090 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
7091 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
7092 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
7093 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
7094 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
7095 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
7096 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
7097 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
7098 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
7099 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
7100 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
7101 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
7102 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
7103 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
7104 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
7105 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
7106 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
7107 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
7108 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
7109 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
7110 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
7111 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
7112 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
7113 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
7114 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
7115 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
7116 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
7117 {TR_SH_FIRE, "", 0, -2, 0},
7118 {TR_SH_ELEC, "", 0, -2, 0},
7119 {TR_SH_COLD, "", 0, -2, 0},
7120 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
7121 {TR_WARNING, "警告", 3, TR_WARNING, 20},
7122 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
7123 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
7124 {TR_LITE_2, "", 0, -2, 0},
7125 {TR_LITE_3, "", 0, -2, 0},
7126 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
7127 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
7128 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
7129 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
7130 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
7132 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
7133 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
7134 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
7135 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
7136 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
7137 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
7138 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
7139 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
7140 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
7141 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
7142 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
7143 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
7144 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
7145 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
7146 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
7147 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
7148 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
7149 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
7151 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
7152 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
7153 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
7154 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
7155 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
7156 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
7157 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
7158 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
7160 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
7161 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
7162 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
7163 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
7164 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
7165 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
7166 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
7167 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
7168 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
7169 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
7170 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
7171 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
7173 {-1, NULL, 0, -1, 0}
7176 static essence_type essence_info[] =
7178 {TR_STR, "strength", 4, TR_STR, 20},
7179 {TR_INT, "intelligence", 4, TR_INT, 20},
7180 {TR_WIS, "wisdom", 4, TR_WIS, 20},
7181 {TR_DEX, "dexterity", 4, TR_DEX, 20},
7182 {TR_CON, "constitution", 4, TR_CON, 20},
7183 {TR_CHR, "charisma", 4, TR_CHR, 20},
7184 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
7185 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
7186 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
7187 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
7188 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
7189 {TR_SPEED, "speed", 4, TR_SPEED, 12},
7190 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
7191 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
7192 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
7193 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
7194 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
7195 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
7196 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
7197 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
7198 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
7199 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
7200 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
7201 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
7202 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
7203 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
7204 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
7205 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
7206 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
7207 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
7208 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
7209 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
7210 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
7211 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
7212 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
7213 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
7214 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
7215 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
7216 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
7217 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
7218 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
7219 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
7220 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
7221 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
7222 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
7223 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
7224 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
7225 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
7226 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
7227 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
7228 {TR_SH_FIRE, "", 0, -2, 0},
7229 {TR_SH_ELEC, "", 0, -2, 0},
7230 {TR_SH_COLD, "", 0, -2, 0},
7231 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
7232 {TR_WARNING, "warning", 3, TR_WARNING, 20},
7233 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
7234 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
7235 {TR_LITE_2, "", 0, -2, 0},
7236 {TR_LITE_3, "", 0, -2, 0},
7237 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7238 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7239 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7240 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7241 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7243 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7244 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7245 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7246 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7247 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7248 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7249 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7250 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7251 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7252 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7253 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7254 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7255 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7256 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
7257 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7258 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7259 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7260 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7262 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7263 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
7264 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
7265 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
7266 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
7267 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
7268 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7269 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7271 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7272 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7273 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7274 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7275 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7276 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7277 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7278 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7279 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7280 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7281 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7282 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7284 {-1, NULL, 0, -1, 0}
7290 * エッセンス名テーブル / Essense names for Weapon smith
7293 cptr essence_name[] =
7396 cptr essence_name[] =
7499 * @brief 所持しているエッセンス一覧を表示する
7502 static void display_essence(void)
7507 for (i = 1; i < 22; i++)
7511 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7512 "Essence Num Essence Num Essence Num "), 1, 8);
7513 for (i = 0; essence_name[i]; i++)
7515 if (!essence_name[i][0]) continue;
7516 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7519 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7529 static void drain_essence(void)
7531 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7535 bool observe = FALSE;
7536 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7537 TIME_EFFECT old_timeout;
7538 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7544 OBJECT_IDX next_o_idx;
7547 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7550 item_tester_hook = object_is_weapon_armour_ammo;
7551 item_tester_no_ryoute = TRUE;
7553 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7554 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7556 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7558 /* Get the item (in the pack) */
7561 o_ptr = &inventory[item];
7564 /* Get the item (on the floor) */
7567 o_ptr = &o_list[0 - item];
7570 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7572 char o_name[MAX_NLEN];
7573 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7574 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7577 p_ptr->energy_use = 100;
7579 object_flags(o_ptr, old_flgs);
7580 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7581 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7582 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7583 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7584 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7585 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7586 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7587 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7588 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7590 old_to_a = o_ptr->to_a;
7592 old_to_h = o_ptr->to_h;
7593 old_to_d = o_ptr->to_d;
7596 old_pval = o_ptr->pval;
7597 old_name2 = o_ptr->name2;
7598 old_timeout = o_ptr->timeout;
7599 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7600 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7601 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7602 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7603 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7604 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7605 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7606 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7607 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7608 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7609 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7610 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7611 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7612 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7613 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7614 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7615 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7616 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7617 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7621 next_o_idx = o_ptr->next_o_idx;
7622 marked = o_ptr->marked;
7623 weight = o_ptr->weight;
7624 number = o_ptr->number;
7626 object_prep(o_ptr, o_ptr->k_idx);
7630 o_ptr->next_o_idx=next_o_idx;
7631 o_ptr->marked=marked;
7632 o_ptr->number = number;
7633 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7634 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7635 o_ptr->ident |= (IDENT_MENTAL);
7636 object_aware(o_ptr);
7637 object_known(o_ptr);
7639 object_flags(o_ptr, new_flgs);
7641 for (i = 0; essence_info[i].add_name; i++)
7643 essence_type *es_ptr = &essence_info[i];
7644 PARAMETER_VALUE pval = 0;
7646 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7647 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7649 if (es_ptr->add < TR_FLAG_MAX &&
7650 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7651 have_flag(old_flgs, es_ptr->add))
7655 drain_value[es_ptr->essence] += 10 * pval;
7657 else if (es_ptr->essence != -2)
7659 drain_value[es_ptr->essence] += 10;
7661 else if (es_ptr->add == TR_SH_FIRE)
7663 drain_value[TR_BRAND_FIRE] += 10;
7664 drain_value[TR_RES_FIRE] += 10;
7666 else if (es_ptr->add == TR_SH_ELEC)
7668 drain_value[TR_BRAND_ELEC] += 10;
7669 drain_value[TR_RES_ELEC] += 10;
7671 else if (es_ptr->add == TR_SH_COLD)
7673 drain_value[TR_BRAND_COLD] += 10;
7674 drain_value[TR_RES_COLD] += 10;
7676 else if (es_ptr->add == TR_LITE_2)
7678 drain_value[TR_LITE_1] += 20;
7680 else if (es_ptr->add == TR_LITE_3)
7682 drain_value[TR_LITE_1] += 30;
7687 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7689 drain_value[TR_INT] += 5;
7690 drain_value[TR_WIS] += 5;
7692 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7694 drain_value[TR_BRAND_POIS] += 5;
7695 drain_value[TR_BRAND_ACID] += 5;
7696 drain_value[TR_BRAND_ELEC] += 5;
7697 drain_value[TR_BRAND_FIRE] += 5;
7698 drain_value[TR_BRAND_COLD] += 5;
7700 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7702 drain_value[TR_INT] += 10;
7704 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7706 drain_value[TR_STR] += 10;
7708 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7710 drain_value[TR_DEX] += 10;
7712 if (old_name2 == EGO_2WEAPON)
7714 drain_value[TR_DEX] += 20;
7716 if (object_is_weapon_ammo(o_ptr))
7718 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7720 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7722 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7723 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7724 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7725 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7727 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7729 drain_value[i] *= number;
7730 drain_value[i] = drain_value[i] * dec / 4;
7731 drain_value[i] = MAX(drain_value[i], 0);
7732 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7740 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7744 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7746 for (i = 0; essence_name[i]; i++)
7748 if (!essence_name[i][0]) continue;
7749 if (!drain_value[i]) continue;
7751 p_ptr->magic_num1[i] += drain_value[i];
7752 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7754 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7758 /* Apply autodestroy/inscription to the drained item */
7759 autopick_alter_item(item, TRUE);
7761 /* Combine the pack */
7762 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
7764 p_ptr->window |= (PW_INVEN);
7768 * @brief 付加するエッセンスの大別を選択する
7769 * @return 選んだエッセンスの大別ID
7771 static COMMAND_CODE choose_essence(void)
7773 COMMAND_CODE mode = 0;
7775 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7778 cptr menu_name[] = {
7788 cptr menu_name[] = {
7798 const COMMAND_CODE mode_max = 7;
7800 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7810 for (i = 0; i < mode_max; i++)
7812 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7813 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7815 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7816 prt("Choose from menu.", 0, 0);
7835 menu_line += mode_max - 1;
7844 if (menu_line > mode_max) menu_line -= mode_max;
7855 for (i = 0; i < mode_max; i++)
7856 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7858 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7864 if (isupper(choice)) choice = (char)tolower(choice);
7866 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7867 mode = (int)choice - 'a' + 1;
7877 * @brief エッセンスを実際に付加する
7878 * @param mode エッセンスの大別ID
7881 static void add_essence(ESSENCE_IDX mode)
7893 char o_name[MAX_NLEN];
7895 essence_type *es_ptr;
7896 bool able[22] = { 0 };
7898 int menu_line = (use_menu ? 1 : 0);
7900 for (i = 0; essence_info[i].add_name; i++)
7902 es_ptr = &essence_info[i];
7904 if (es_ptr->type != mode) continue;
7908 if (!repeat_pull(&i) || i<0 || i>=max_num)
7911 /* Nothing chosen yet */
7917 /* Build a prompt */
7918 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
7919 if (use_menu) screen_save();
7921 /* Get a spell from the user */
7923 choice = (always_show_list || use_menu) ? ESCAPE:1;
7926 if( choice==ESCAPE ) choice = ' ';
7927 else if( !get_com(out_val, &choice, FALSE) )break;
7929 if (use_menu && choice != ' ')
7943 menu_line += (max_num-1);
7966 menu_line = max_num;
7980 if (menu_line > max_num) menu_line -= max_num;
7982 /* Request redraw */
7983 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
7986 if (!redraw || use_menu)
7990 char dummy[80], dummy2[80];
7998 /* Save the screen */
7999 if (!use_menu) screen_save();
8001 for (y = 1; y < 24; y++)
8004 /* Print header(s) */
8006 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
8009 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
8012 for (ctr = 0; ctr < max_num; ctr++)
8014 es_ptr = &essence_info[num[ctr]];
8018 if (ctr == (menu_line-1))
8019 strcpy(dummy, _("》 ", "> "));
8020 else strcpy(dummy, " ");
8023 /* letter/number for power selection */
8026 sprintf(dummy, "%c) ",I2A(ctr));
8029 strcat(dummy, es_ptr->add_name);
8034 if (es_ptr->essence != -1)
8036 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
8037 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
8043 case ESSENCE_SH_FIRE:
8044 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
8045 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
8046 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8048 case ESSENCE_SH_ELEC:
8049 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
8050 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
8051 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8053 case ESSENCE_SH_COLD:
8054 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
8055 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
8056 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8058 case ESSENCE_RESISTANCE:
8059 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8060 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8061 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8062 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8063 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8065 case ESSENCE_SUSTAIN:
8066 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8067 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8068 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8069 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8070 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8075 if (!able[ctr]) col = TERM_RED;
8077 if (es_ptr->essence != -1)
8079 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
8083 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
8086 c_prt(col, dummy2, ctr+2, x);
8096 /* Restore the screen */
8107 ask = (isupper(choice));
8110 if (ask) choice = (char)tolower(choice);
8112 /* Extract request */
8113 i = (islower(choice) ? A2I(choice) : -1);
8116 /* Totally Illegal */
8117 if ((i < 0) || (i >= max_num) || !able[i])
8129 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
8131 /* Belay that order */
8132 if (!get_check(tmp_val)) continue;
8139 /* Restore the screen */
8140 if (redraw) screen_load();
8146 es_ptr = &essence_info[num[i]];
8148 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8149 item_tester_tval = TV_GLOVES;
8150 else if (mode == 1 || mode == 5)
8151 item_tester_hook = item_tester_hook_melee_ammo;
8152 else if (es_ptr->add == ESSENCE_ATTACK)
8153 item_tester_hook = object_allow_enchant_weapon;
8154 else if (es_ptr->add == ESSENCE_AC)
8155 item_tester_hook = object_is_armour;
8157 item_tester_hook = object_is_weapon_armour_ammo;
8158 item_tester_no_ryoute = TRUE;
8160 q = _("どのアイテムを改良しますか?", "Improve which item? ");
8161 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
8163 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8165 /* Get the item (in the pack) */
8168 o_ptr = &inventory[item];
8171 /* Get the item (on the floor) */
8174 o_ptr = &o_list[0 - item];
8177 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
8179 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
8183 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8185 use_essence = es_ptr->value;
8186 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
8187 if (o_ptr->number > 1)
8189 use_essence *= o_ptr->number;
8190 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
8193 if (es_ptr->essence != -1)
8195 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8197 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8200 if (is_pval_flag(es_ptr->add))
8202 if (o_ptr->pval < 0)
8204 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
8207 else if (es_ptr->add == TR_BLOWS)
8209 if (o_ptr->pval > 1)
8211 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
8215 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8217 else if (o_ptr->pval > 0)
8219 use_essence *= o_ptr->pval;
8220 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8226 PARAMETER_VALUE pval;
8227 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8229 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
8230 strcpy(tmp_val, "1");
8232 if (!get_string(tmp, tmp_val, 1)) return;
8233 pval = (PARAMETER_VALUE)atoi(tmp_val);
8234 if (pval > limit) pval = limit;
8235 else if (pval < 1) pval = 1;
8236 o_ptr->pval += pval;
8237 use_essence *= pval;
8238 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8241 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8243 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8247 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8254 strcpy(tmp_val, "1");
8255 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
8256 val = atoi(tmp_val);
8257 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8258 else if (val < 1) val = 1;
8260 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8261 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8263 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8266 get_to_h = ((val+1)/2+randint0(val/2+1));
8267 get_to_d = ((val+1)/2+randint0(val/2+1));
8268 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8269 o_ptr->to_h += get_to_h;
8270 o_ptr->to_d += get_to_d;
8272 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8273 if (es_ptr->add == ESSENCE_ATTACK)
8275 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8277 msg_print(_("改良に失敗した。", "You failed to enchant."));
8278 p_ptr->energy_use = 100;
8283 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8284 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8287 else if (es_ptr->add == ESSENCE_AC)
8289 if (o_ptr->to_a >= p_ptr->lev/5+5)
8291 msg_print(_("改良に失敗した。", "You failed to enchant."));
8292 p_ptr->energy_use = 100;
8297 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8302 o_ptr->xtra3 = es_ptr->add + 1;
8307 bool success = TRUE;
8311 case ESSENCE_SH_FIRE:
8312 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8317 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8318 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8320 case ESSENCE_SH_ELEC:
8321 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8326 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8327 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8329 case ESSENCE_SH_COLD:
8330 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8335 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8336 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8338 case ESSENCE_RESISTANCE:
8339 case ESSENCE_SUSTAIN:
8340 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))
8345 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8346 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8347 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8348 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8353 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8356 if (es_ptr->add == ESSENCE_SUSTAIN)
8358 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8359 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8360 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8361 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8365 o_ptr->xtra3 = es_ptr->add + 1;
8369 p_ptr->energy_use = 100;
8372 msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name);
8374 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8377 /* Combine the pack */
8378 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8380 p_ptr->window |= (PW_INVEN);
8387 static void erase_essence(void)
8392 char o_name[MAX_NLEN];
8393 BIT_FLAGS flgs[TR_FLAG_SIZE];
8395 item_tester_hook = object_is_smith;
8397 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
8398 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
8400 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8402 /* Get the item (in the pack) */
8405 o_ptr = &inventory[item];
8408 /* Get the item (on the floor) */
8411 o_ptr = &o_list[0 - item];
8414 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8415 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
8417 p_ptr->energy_use = 100;
8419 if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE)
8421 o_ptr->to_h -= (o_ptr->xtra4>>8);
8422 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8424 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8425 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8428 object_flags(o_ptr, flgs);
8429 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8430 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8432 /* Combine the pack */
8433 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8435 p_ptr->window |= (PW_INVEN);
8439 * @brief 鍛冶コマンドのメインルーチン
8440 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8443 void do_cmd_kaji(bool only_browse)
8445 COMMAND_CODE mode = 0;
8448 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8452 if (p_ptr->confused)
8454 msg_print(_("混乱していて作業できない!", "You are too confused!"));
8459 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8464 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8469 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8471 if (only_browse) screen_save();
8473 if (!only_browse) screen_save();
8479 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8480 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8481 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8482 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8483 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8484 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8486 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8487 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8488 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8489 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8490 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8491 prt(format("Choose command from menu."), 0, 0);
8518 if (menu_line > 5) menu_line -= 5;
8526 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
8527 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
8528 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
8529 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
8530 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
8532 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8534 if (!get_com("Command :", &choice, TRUE))
8571 /* Clear lines, position cursor (really should use strlen here) */
8572 Term_erase(14, 21, 255);
8573 Term_erase(14, 20, 255);
8574 Term_erase(14, 19, 255);
8575 Term_erase(14, 18, 255);
8576 Term_erase(14, 17, 255);
8577 Term_erase(14, 16, 255);
8579 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8580 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8582 prt(&temp[j], line, 15);
8587 if (!only_browse) screen_load();
8588 } while (only_browse);
8593 case 1: display_essence();break;
8594 case 2: drain_essence();break;
8595 case 3: erase_essence();break;
8597 mode = choose_essence();
8602 case 5: add_essence(10);break;
8608 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8609 * Torches have special abilities when they are flaming.
8610 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8611 * @param flgs 特別に追加するフラグを返す参照ポインタ
8614 void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
8616 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8618 if (o_ptr->xtra4 > 0)
8620 add_flag(flgs, TR_BRAND_FIRE);
8621 add_flag(flgs, TR_KILL_UNDEAD);
8622 add_flag(flgs, TR_THROW);
8628 * @brief 投擲時たいまつにダイスを与える。
8629 * Torches have special abilities when they are flaming.
8630 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8631 * @param dd 特別なダイス数を返す参照ポインタ
8632 * @param ds 特別なダイス面数を返す参照ポインタ
8635 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
8637 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8639 if (o_ptr->xtra4 > 0)
8648 * @brief 投擲時命中したたいまつの寿命を縮める。
8649 * Torches have special abilities when they are flaming.
8650 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8653 void torch_lost_fuel(object_type *o_ptr)
8655 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8657 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8658 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;