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 #include "player-status.h"
20 static void one_sustain(object_type *o_ptr);
23 static concptr const kaji_tips[5] =
26 "現在持っているエッセンスの一覧を表示する。",
27 "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。",
28 "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。",
29 "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。",
30 "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。",
32 "Display essences you have.",
33 "Extract essences from an item. The item become non magical.",
34 "Remove added essences from an equipment which was improved before. The removed essence will be ruined.",
35 "Add essences to an item. The improved items or artifacts cannot be reimprove.",
36 "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.",
41 * @brief 対象のオブジェクトにランダムな能力維持を一つ付加する。/ Choose one random sustain
43 * @param o_ptr 対象のオブジェクト構造体ポインタ
46 static void one_sustain(object_type *o_ptr)
48 switch (randint0(A_MAX))
50 case 0: add_flag(o_ptr->art_flags, TR_SUST_STR); break;
51 case 1: add_flag(o_ptr->art_flags, TR_SUST_INT); break;
52 case 2: add_flag(o_ptr->art_flags, TR_SUST_WIS); break;
53 case 3: add_flag(o_ptr->art_flags, TR_SUST_DEX); break;
54 case 4: add_flag(o_ptr->art_flags, TR_SUST_CON); break;
55 case 5: add_flag(o_ptr->art_flags, TR_SUST_CHR); break;
60 * @brief 床上、モンスター所持でスタックされたアイテムを削除しスタックを補完する / Excise a dungeon object from any stacks
61 * @param o_idx 削除対象のオブジェクト構造体ポインタ
64 void excise_object_idx(OBJECT_IDX o_idx)
68 OBJECT_IDX this_o_idx, next_o_idx = 0;
69 OBJECT_IDX prev_o_idx = 0;
72 j_ptr = &o_list[o_idx];
75 if (j_ptr->held_m_idx)
80 m_ptr = &m_list[j_ptr->held_m_idx];
82 /* Scan all objects in the grid */
83 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
86 o_ptr = &o_list[this_o_idx];
88 /* Acquire next object */
89 next_o_idx = o_ptr->next_o_idx;
91 if (this_o_idx == o_idx)
96 /* Remove from list */
97 m_ptr->hold_o_idx = next_o_idx;
105 /* Previous object */
106 k_ptr = &o_list[prev_o_idx];
108 /* Remove from list */
109 k_ptr->next_o_idx = next_o_idx;
112 /* Forget next pointer */
113 o_ptr->next_o_idx = 0;
118 /* Save prev_o_idx */
119 prev_o_idx = this_o_idx;
128 POSITION y = j_ptr->iy;
129 POSITION x = j_ptr->ix;
131 g_ptr = &grid_array[y][x];
133 /* Scan all objects in the grid */
134 for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
137 o_ptr = &o_list[this_o_idx];
139 /* Acquire next object */
140 next_o_idx = o_ptr->next_o_idx;
142 if (this_o_idx == o_idx)
147 /* Remove from list */
148 g_ptr->o_idx = next_o_idx;
156 /* Previous object */
157 k_ptr = &o_list[prev_o_idx];
159 /* Remove from list */
160 k_ptr->next_o_idx = next_o_idx;
163 /* Forget next pointer */
164 o_ptr->next_o_idx = 0;
169 /* Save prev_o_idx */
170 prev_o_idx = this_o_idx;
176 * @brief オブジェクトを削除する /
177 * Delete a dungeon object
178 * @param o_idx 削除対象のオブジェクト構造体ポインタ
181 * Handle "stacks" of objects correctly.
183 void delete_object_idx(OBJECT_IDX o_idx)
188 excise_object_idx(o_idx);
191 j_ptr = &o_list[o_idx];
194 if (!(j_ptr->held_m_idx))
212 * @brief フロアにマスに落ちているオブジェクトを全て削除する / Deletes all objects at given location
213 * Delete a dungeon object
214 * @param y 削除したフロアマスのY座標
215 * @param x 削除したフロアマスのX座標
218 void delete_object(POSITION y, POSITION x)
221 OBJECT_IDX this_o_idx, next_o_idx = 0;
223 /* Refuse "illegal" locations */
224 if (!in_bounds(y, x)) return;
226 g_ptr = &grid_array[y][x];
228 /* Scan all objects in the grid */
229 for (this_o_idx = g_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 */
309 g_ptr = &grid_array[y][x];
312 if (g_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];
391 /* Monsters protect their objects */
392 if (randint0(100) < 90) continue;
402 /* Nearby objects start out "immune" */
403 if ((cur_dis > 0) && (distance(p_ptr->y, p_ptr->x, y, x) < cur_dis)) continue;
408 /* Hack -- only compact artifacts in emergencies */
409 if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
410 (cnt < 1000)) chance = 100;
412 /* Apply the saving throw */
413 if (randint0(100) < chance) continue;
415 delete_object_idx(i);
423 /* Excise dead objects (backwards!) */
424 for (i = o_max - 1; i >= 1; i--)
428 /* Skip real objects */
429 if (o_ptr->k_idx) continue;
431 /* Move last object into open hole */
432 compact_objects_aux(o_max - 1, i);
434 /* Compress "o_max" */
441 * @brief グローバルオブジェクト配列を初期化する /
442 * Delete all the items when player leaves the level
443 * @note we do NOT visually reflect these (irrelevant) changes
445 * Hack -- we clear the "g_ptr->o_idx" field for every grid,
446 * and the "m_ptr->next_o_idx" field for every monster, since
447 * we know we are clearing every object. Technically, we only
448 * clear those fields for grids/monsters containing objects,
449 * and we clear it once for every such object.
452 void wipe_o_list(void)
456 /* Delete the existing objects */
457 for (i = 1; i < o_max; i++)
459 object_type *o_ptr = &o_list[i];
461 /* Skip dead objects */
462 if (!o_ptr->k_idx) continue;
464 /* Mega-Hack -- preserve artifacts */
465 if (!character_dungeon || preserve_mode)
467 /* Hack -- Preserve unknown artifacts */
468 if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
470 /* Mega-Hack -- Preserve the artifact */
471 a_info[o_ptr->name1].cur_num = 0;
476 if (o_ptr->held_m_idx)
481 m_ptr = &m_list[o_ptr->held_m_idx];
483 /* Hack -- see above */
484 m_ptr->hold_o_idx = 0;
492 /* Access location */
493 POSITION y = o_ptr->iy;
494 POSITION x = o_ptr->ix;
497 g_ptr = &grid_array[y][x];
499 /* Hack -- see above */
514 * @brief グローバルオブジェクト配列から空きを取得する /
515 * Acquires and returns the index of a "free" object.
516 * @return 開いているオブジェクト要素のID
518 * This routine should almost never fail, but in case it does,
519 * we must be sure to handle "failure" of this routine.
521 OBJECT_IDX o_pop(void)
525 /* Initial allocation */
526 if (o_max < max_o_idx)
531 /* Expand object array */
537 /* Use this object */
542 /* Recycle dead objects */
543 for (i = 1; i < o_max; i++)
548 /* Skip live objects */
549 if (o_ptr->k_idx) continue;
554 /* Use this object */
559 /* Warn the player (except during dungeon creation) */
560 if (character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!"));
567 * @brief オブジェクト生成テーブルに生成制約を加える /
568 * Apply a "object restriction function" to the "object allocation table"
570 * @details 生成の制約はグローバルのget_obj_num_hook関数ポインタで加える
572 static errr get_obj_num_prep(void)
577 alloc_entry *table = alloc_kind_table;
579 /* Scan the allocation table */
580 for (i = 0; i < alloc_kind_size; i++)
582 /* Accept objects which pass the restriction, if any */
583 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
585 /* Accept this object */
586 table[i].prob2 = table[i].prob1;
589 /* Do not use this object */
592 /* Decline this object */
603 * @brief オブジェクト生成テーブルからアイテムを取得する /
604 * Choose an object kind that seems "appropriate" to the given level
606 * @return 選ばれたオブジェクトベースID
608 * This function uses the "prob2" field of the "object allocation table",\n
609 * and various local information, to calculate the "prob3" field of the\n
610 * same table, which is then used to choose an "appropriate" object, in\n
611 * a relatively efficient manner.\n
613 * It is (slightly) more likely to acquire an object of the given level\n
614 * than one of a lower level. This is done by choosing several objects\n
615 * appropriate to the given level and keeping the "hardest" one.\n
617 * Note that if no objects are "appropriate", then this function will\n
618 * fail, and return zero, but this should *almost* never happen.\n
620 OBJECT_IDX get_obj_num(DEPTH level)
623 KIND_OBJECT_IDX k_idx;
626 alloc_entry *table = alloc_kind_table;
628 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
631 if ((level > 0) && !(d_info[p_ptr->dungeon_idx].flags1 & DF1_BEGINNER))
633 /* Occasional "boost" */
634 if (one_in_(GREAT_OBJ))
636 /* What a bizarre calculation */
637 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
644 /* Process probabilities */
645 for (i = 0; i < alloc_kind_size; i++)
647 /* Objects are sorted by depth */
648 if (table[i].level > level) break;
653 /* Access the index */
654 k_idx = table[i].index;
656 /* Access the actual kind */
657 k_ptr = &k_info[k_idx];
659 /* Hack -- prevent embedded chests */
660 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
663 table[i].prob3 = table[i].prob2;
666 total += table[i].prob3;
669 /* No legal objects */
670 if (total <= 0) return (0);
674 value = randint0(total);
676 /* Find the object */
677 for (i = 0; i < alloc_kind_size; i++)
679 /* Found the entry */
680 if (value < table[i].prob3) break;
683 value = value - table[i].prob3;
690 /* Try for a "better" object once (50%) or twice (10%) */
697 value = randint0(total);
699 /* Find the object */
700 for (i = 0; i < alloc_kind_size; i++)
702 /* Found the entry */
703 if (value < table[i].prob3) break;
706 value = value - table[i].prob3;
709 /* Keep the "best" one */
710 if (table[i].level < table[j].level) i = j;
713 /* Try for a "better" object twice (10%) */
720 value = randint0(total);
722 /* Find the object */
723 for (i = 0; i < alloc_kind_size; i++)
725 /* Found the entry */
726 if (value < table[i].prob3) break;
729 value = value - table[i].prob3;
732 /* Keep the "best" one */
733 if (table[i].level < table[j].level) i = j;
736 return (table[i].index);
741 * @brief オブジェクトを鑑定済にする /
742 * Known is true when the "attributes" of an object are "known".
743 * @param o_ptr 鑑定済にするオブジェクトの構造体参照ポインタ
745 * These include tohit, todam, toac, cost, and pval (charges).\n
747 * Note that "knowing" an object gives you everything that an "awareness"\n
748 * gives you, and much more. In fact, the player is always "aware" of any\n
749 * item of which he has full "knowledge".\n
751 * But having full knowledge of, say, one "wand of wonder", does not, by\n
752 * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
753 * It happens that most "identify" routines (including "buying from a shop")\n
754 * will make the player "aware" of the object as well as fully "know" it.\n
756 * This routine also removes any inscriptions generated by "feelings".\n
758 void object_known(object_type *o_ptr)
760 /* Remove "default inscriptions" */
761 o_ptr->feeling = FEEL_NONE;
763 /* Clear the "Felt" info */
764 o_ptr->ident &= ~(IDENT_SENSE);
766 /* Clear the "Empty" info */
767 o_ptr->ident &= ~(IDENT_EMPTY);
769 /* Now we know about the item */
770 o_ptr->ident |= (IDENT_KNOWN);
774 * @brief オブジェクトを*鑑定*済にする /
775 * The player is now aware of the effects of the given object.
776 * @param o_ptr *鑑定*済にするオブジェクトの構造体参照ポインタ
779 void object_aware(object_type *o_ptr)
781 bool mihanmei = !object_is_aware(o_ptr);
783 /* Fully aware of the effects */
784 k_info[o_ptr->k_idx].aware = TRUE;
786 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
787 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
791 GAME_TEXT o_name[MAX_NLEN];
794 object_copy(q_ptr, o_ptr);
797 object_desc(o_name, q_ptr, OD_NAME_ONLY);
799 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
804 * @brief オブジェクトを試行済にする /
805 * Something has been "sampled"
806 * @param o_ptr 試行済にするオブジェクトの構造体参照ポインタ
809 void object_tried(object_type *o_ptr)
811 /* Mark it as tried (even if "aware") */
812 k_info[o_ptr->k_idx].tried = TRUE;
816 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
817 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
818 * @return 擬似鑑定結果のIDを返す。
820 byte value_check_aux1(object_type *o_ptr)
823 if (object_is_artifact(o_ptr))
826 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
833 if (object_is_ego(o_ptr))
836 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
839 return FEEL_EXCELLENT;
843 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
846 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
848 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
850 /* Good "armor" bonus */
851 if (o_ptr->to_a > 0) return FEEL_GOOD;
853 /* Good "weapon" bonus */
854 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
856 /* Default to "average" */
861 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 2 (Light).
862 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
863 * @return 擬似鑑定結果のIDを返す。
865 byte value_check_aux2(object_type *o_ptr)
867 /* Cursed items (all of them) */
868 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
870 /* Broken items (all of them) */
871 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
873 /* Artifacts -- except cursed/broken ones */
874 if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
876 /* Ego-Items -- except cursed/broken ones */
877 if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
879 /* Good armor bonus */
880 if (o_ptr->to_a > 0) return FEEL_UNCURSED;
882 /* Good weapon bonuses */
883 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
890 * @brief 未鑑定なベースアイテムの基本価格を返す /
891 * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
892 * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
893 * @return オブジェクトの未鑑定価格
895 static PRICE object_value_base(object_type *o_ptr)
897 /* Aware item -- use template cost */
898 if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
900 /* Analyze the type */
905 case TV_FOOD: return (5L);
907 /* Un-aware Potions */
908 case TV_POTION: return (20L);
910 /* Un-aware Scrolls */
911 case TV_SCROLL: return (20L);
913 /* Un-aware Staffs */
914 case TV_STAFF: return (70L);
917 case TV_WAND: return (50L);
920 case TV_ROD: return (90L);
923 case TV_RING: return (45L);
925 /* Un-aware Amulets */
926 case TV_AMULET: return (45L);
928 /* Figurines, relative to monster level */
931 DEPTH level = r_info[o_ptr->pval].level;
932 if (level < 20) return level*50L;
933 else if (level < 30) return 1000+(level-20)*150L;
934 else if (level < 40) return 2500+(level-30)*350L;
935 else if (level < 50) return 6000+(level-40)*800L;
936 else return 14000+(level-50)*2000L;
940 if (!o_ptr->pval) return 1000L;
941 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
944 /* Paranoia -- Oops */
950 * @brief オブジェクトのフラグ類から価格を算出する /
951 * Return the value of the flags the object has...
952 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
953 * @param plusses フラグに与える価格の基本重み
954 * @return オブジェクトのフラグ価格
956 PRICE flag_cost(object_type *o_ptr, int plusses)
959 BIT_FLAGS flgs[TR_FLAG_SIZE];
963 object_kind *k_ptr = &k_info[o_ptr->k_idx];
965 object_flags(o_ptr, flgs);
968 * Exclude fixed flags of the base item.
969 * pval bonuses of base item will be treated later.
971 for (i = 0; i < TR_FLAG_SIZE; i++)
972 flgs[i] &= ~(k_ptr->flags[i]);
974 /* Exclude fixed flags of the fixed artifact. */
975 if (object_is_fixed_artifact(o_ptr))
977 artifact_type *a_ptr = &a_info[o_ptr->name1];
979 for (i = 0; i < TR_FLAG_SIZE; i++)
980 flgs[i] &= ~(a_ptr->flags[i]);
983 /* Exclude fixed flags of the ego-item. */
984 else if (object_is_ego(o_ptr))
986 ego_item_type *e_ptr = &e_info[o_ptr->name2];
988 for (i = 0; i < TR_FLAG_SIZE; i++)
989 flgs[i] &= ~(e_ptr->flags[i]);
994 * Calucurate values of remaining flags
996 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
997 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
998 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
999 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
1000 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
1001 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
1002 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
1003 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
1004 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
1005 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
1006 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
1007 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
1008 total += (10000 + (2500 * plusses));
1009 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
1010 total += (10000 + (2500 * plusses));
1014 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
1015 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
1016 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
1017 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
1018 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
1019 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
1020 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
1021 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
1022 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
1023 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
1024 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
1025 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
1026 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
1027 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
1028 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
1029 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
1030 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
1031 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
1032 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
1033 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
1034 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
1036 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
1037 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
1038 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
1039 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
1040 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
1041 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
1042 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
1043 total += (tmp_cost * count);
1045 if (have_flag(flgs, TR_SUST_STR)) total += 850;
1046 if (have_flag(flgs, TR_SUST_INT)) total += 850;
1047 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
1048 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
1049 if (have_flag(flgs, TR_SUST_CON)) total += 850;
1050 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
1051 if (have_flag(flgs, TR_RIDING)) total += 0;
1052 if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
1053 if (have_flag(flgs, TR_THROW)) total += 5000;
1054 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
1055 if (have_flag(flgs, TR_HOLD_EXP)) total += 8500;
1059 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
1060 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
1061 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
1062 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
1063 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
1064 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
1065 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
1066 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
1067 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
1068 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
1069 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
1070 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
1071 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
1072 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
1073 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
1074 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
1075 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
1076 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
1077 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
1078 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
1079 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
1080 total += (tmp_cost * count);
1082 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
1083 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
1084 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1085 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1086 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1087 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1088 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1089 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1090 if (have_flag(flgs, TR_LEVITATION)) total += 1250;
1091 if (have_flag(flgs, TR_LITE_1)) total += 1500;
1092 if (have_flag(flgs, TR_LITE_2)) total += 2500;
1093 if (have_flag(flgs, TR_LITE_3)) total += 4000;
1094 if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
1095 if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
1096 if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
1097 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1098 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1099 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1100 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1101 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1102 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1103 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1104 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1105 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1106 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1107 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1108 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1109 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1110 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1111 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1112 if (have_flag(flgs, TR_REGEN)) total += 2500;
1113 if (have_flag(flgs, TR_WARNING)) total += 2000;
1114 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1115 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1116 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1117 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1118 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1119 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1120 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1121 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1122 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1123 if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
1124 if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
1125 if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
1126 if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
1127 if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
1128 if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
1129 if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
1130 if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
1131 if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
1132 if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
1133 if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
1134 if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
1135 if (have_flag(flgs, TR_TELEPORT))
1137 if (object_is_cursed(o_ptr))
1142 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1143 if (have_flag(flgs, TR_BLESSED)) total += 750;
1144 if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1145 if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1146 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1147 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1148 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1150 /* Also, give some extra for activatable powers... */
1151 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1153 const activation_type* const act_ptr = find_activation_info(o_ptr);
1155 total += act_ptr->value;
1164 * @brief オブジェクトの真の価格を算出する /
1165 * Return the value of the flags the object has...
1166 * @param o_ptr 本価格を確認したいオブジェクトの構造体参照ポインタ
1167 * @return オブジェクトの本価格
1169 * Return the "real" price of a "known" item, not including discounts\n
1171 * Wand and staffs get cost for each charge\n
1173 * Armor is worth an extra 100 gold per bonus point to armor class.\n
1175 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
1177 * Missiles are only worth 5 gold per bonus point, since they\n
1178 * usually appear in groups of 20, and we want the player to get\n
1179 * the same amount of cash for any "equivalent" item. Note that\n
1180 * missiles never have any of the "pval" flags, and in fact, they\n
1181 * only have a few of the available flags, primarily of the "slay"\n
1182 * and "brand" and "ignore" variety.\n
1184 * Armor with a negative armor bonus is worthless.\n
1185 * Weapons with negative hit+damage bonuses are worthless.\n
1187 * Every wearable item with a "pval" bonus is worth extra (see below).\n
1189 PRICE object_value_real(object_type *o_ptr)
1192 BIT_FLAGS flgs[TR_FLAG_SIZE];
1193 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1196 /* Hack -- "worthless" items */
1197 if (!k_info[o_ptr->k_idx].cost) return (0L);
1200 value = k_info[o_ptr->k_idx].cost;
1202 /* Extract some flags */
1203 object_flags(o_ptr, flgs);
1206 if (object_is_fixed_artifact(o_ptr))
1208 artifact_type *a_ptr = &a_info[o_ptr->name1];
1210 /* Hack -- "worthless" artifacts */
1211 if (!a_ptr->cost) return (0L);
1213 /* Hack -- Use the artifact cost instead */
1214 value = a_ptr->cost;
1215 value += flag_cost(o_ptr, o_ptr->pval);
1217 /* Don't add pval bonuses etc. */
1222 else if (object_is_ego(o_ptr))
1224 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1226 /* Hack -- "worthless" ego-items */
1227 if (!e_ptr->cost) return (0L);
1229 /* Hack -- Reward the ego-item with a bonus */
1230 value += e_ptr->cost;
1231 value += flag_cost(o_ptr, o_ptr->pval);
1239 for (i = 0; i < TR_FLAG_SIZE; i++)
1240 if (o_ptr->art_flags[i]) flag = TRUE;
1242 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1245 /* Analyze pval bonus for normal object */
1246 switch (o_ptr->tval)
1269 if (!o_ptr->pval) break;
1271 /* Hack -- Negative "pval" is always bad */
1272 if (o_ptr->pval < 0) return (0L);
1274 /* Give credit for stat bonuses */
1275 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1276 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1277 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1278 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1279 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1280 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1282 /* Give credit for stealth and searching */
1283 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1284 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1285 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1287 /* Give credit for infra-vision and tunneling */
1288 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1289 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1291 /* Give credit for extra attacks */
1292 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1294 /* Give credit for speed bonus */
1295 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1301 /* Analyze the item */
1302 switch (o_ptr->tval)
1307 /* Pay extra for charges, depending on standard number of
1308 * charges. Handle new-style wands correctly. -LM-
1310 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1316 /* Pay extra for charges, depending on standard number of
1319 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1328 /* Hack -- negative bonuses are bad */
1329 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1331 /* Give credit for bonuses */
1332 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1348 /* Hack -- negative armor bonus */
1349 if (o_ptr->to_a < 0) return (0L);
1351 /* Give credit for bonuses */
1352 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1364 /* Hack -- negative hit/damage bonuses */
1365 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1367 /* Factor in the bonuses */
1368 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1370 /* Hack -- Factor in extra damage dice and sides */
1371 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1372 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1382 /* Hack -- negative hit/damage bonuses */
1383 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1385 /* Factor in the bonuses */
1386 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1388 /* Hack -- Factor in extra damage dice and sides */
1389 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1390 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1395 /* Figurines, relative to monster level */
1398 DEPTH level = r_info[o_ptr->pval].level;
1399 if (level < 20) value = level*50L;
1400 else if (level < 30) value = 1000+(level-20)*150L;
1401 else if (level < 40) value = 2500+(level-30)*350L;
1402 else if (level < 50) value = 6000+(level-40)*800L;
1403 else value = 14000+(level-50)*2000L;
1409 if (!o_ptr->pval) value = 1000L;
1410 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1416 if (!o_ptr->pval) value = 0L;
1421 /* Worthless object */
1422 if (value < 0) return 0L;
1424 /* Return the value */
1430 * @brief オブジェクト価格算出のメインルーチン /
1431 * Return the price of an item including plusses (and charges)
1432 * @param o_ptr 判明している現価格を確認したいオブジェクトの構造体参照ポインタ
1433 * @return オブジェクトの判明している現価格
1435 * This function returns the "value" of the given item (qty one)\n
1437 * Never notice "unknown" bonuses or properties, including "curses",\n
1438 * since that would give the player information he did not have.\n
1440 * Note that discounted items stay discounted forever, even if\n
1441 * the discount is "forgotten" by the player via memory loss.\n
1443 PRICE object_value(object_type *o_ptr)
1447 /* Unknown items -- acquire a base value */
1448 if (object_is_known(o_ptr))
1450 /* Broken items -- worthless */
1451 if (object_is_broken(o_ptr)) return (0L);
1453 /* Cursed items -- worthless */
1454 if (object_is_cursed(o_ptr)) return (0L);
1456 /* Real value (see above) */
1457 value = object_value_real(o_ptr);
1460 /* Known items -- acquire the actual value */
1463 /* Hack -- Felt broken items */
1464 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1466 /* Hack -- Felt cursed items */
1467 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1469 /* Base value (see above) */
1470 value = object_value_base(o_ptr);
1473 /* Apply discount (if any) */
1474 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1476 /* Return the final value */
1483 * @brief 破壊可能なアイテムかを返す /
1484 * Determines whether an object can be destroyed, and makes fake inscription.
1485 * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
1486 * @return オブジェクトが破壊可能ならばTRUEを返す
1488 bool can_player_destroy_object(object_type *o_ptr)
1490 /* Artifacts cannot be destroyed */
1491 if (!object_is_artifact(o_ptr)) return TRUE;
1493 /* If object is unidentified, makes fake inscription */
1494 if (!object_is_known(o_ptr))
1496 byte feel = FEEL_SPECIAL;
1498 /* Hack -- Handle icky artifacts */
1499 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1501 /* Hack -- inscribe the artifact */
1502 o_ptr->feeling = feel;
1504 /* We have "felt" it (again) */
1505 o_ptr->ident |= (IDENT_SENSE);
1506 p_ptr->update |= (PU_COMBINE);
1507 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1512 /* Identified artifact -- Nothing to do */
1518 * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
1519 * Distribute charges of rods or wands.
1520 * @param o_ptr 分割元オブジェクトの構造体参照ポインタ source item
1521 * @param q_ptr 分割先オブジェクトの構造体参照ポインタ target item, must be of the same type as o_ptr
1522 * @param amt 分割したい回数量 number of items that are transfered
1525 * Hack -- If rods or wands are dropped, the total maximum timeout or\n
1526 * charges need to be allocated between the two stacks. If all the items\n
1527 * are being dropped, it makes for a neater message to leave the original\n
1528 * stack's pval alone. -LM-\n
1530 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1532 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1534 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1535 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1537 /* Hack -- Rods also need to have their timeouts distributed. The
1538 * dropped stack will accept all time remaining to charge up to its
1541 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1543 if (q_ptr->pval > o_ptr->timeout)
1544 q_ptr->timeout = o_ptr->timeout;
1546 q_ptr->timeout = q_ptr->pval;
1548 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1554 * @brief 魔法棒やロッドの使用回数を減らす /
1555 * @param o_ptr オブジェクトの構造体参照ポインタ source item
1556 * @param amt 減らしたい回数量 number of items that are transfered
1559 * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1560 * charges of the stack needs to be reduced, unless all the items are\n
1561 * being destroyed. -LM-\n
1563 void reduce_charges(object_type *o_ptr, int amt)
1565 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1566 (amt < o_ptr->number))
1568 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1573 * Determine if an item can "absorb" a second item
1575 * See "object_absorb()" for the actual "absorption" code.
1577 * If permitted, we allow staffs (if they are known to have equal charges
1578 * and both are either known or confirmed empty) and wands (if both are
1579 * either known or confirmed empty) and rods (in all cases) to combine.
1580 * Staffs will unstack (if necessary) when they are used, but wands and
1581 * rods will only unstack if one is dropped. -LM-
1583 * If permitted, we allow weapons/armor to stack, if fully "known".
1585 * Missiles will combine if both stacks have the same "known" status.
1586 * This is done to make unidentified stacks of missiles useful.
1588 * Food, potions, scrolls, and "easy know" items always stack.
1590 * Chests, and activatable items, never stack (for various reasons).
1594 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1596 #define MAX_STACK_SIZE 99
1600 * @brief 両オブジェクトをスロットに重ね合わせ可能な最大数を返す。
1601 * Determine if an item can partly absorb a second item. Return maximum number of stack.
1602 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1603 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1604 * @return 重ね合わせ可能なアイテム数
1606 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1610 /* Default maximum number of stack */
1611 int max_num = MAX_STACK_SIZE;
1613 /* Require identical object types */
1614 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1617 /* Analyze the items */
1618 switch (o_ptr->tval)
1620 /* Chests and Statues*/
1631 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1632 if (o_ptr->pval != j_ptr->pval) return 0;
1636 /* Figurines and Corpses*/
1641 if (o_ptr->pval != j_ptr->pval) return 0;
1647 /* Food and Potions and Scrolls */
1659 /* Require either knowledge or known empty for both staffs. */
1660 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1661 !object_is_known(o_ptr)) ||
1662 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1663 !object_is_known(j_ptr))) return 0;
1665 /* Require identical charges, since staffs are bulky. */
1666 if (o_ptr->pval != j_ptr->pval) return 0;
1675 /* Require either knowledge or known empty for both wands. */
1676 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1677 !object_is_known(o_ptr)) ||
1678 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1679 !object_is_known(j_ptr))) return 0;
1681 /* Wand charges combine in O&ZAngband. */
1687 /* Staffs and Wands and Rods */
1690 /* Prevent overflaw of timeout */
1691 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1697 /* Weapons and Armor */
1713 /* Rings, Amulets, Lites */
1719 /* Require full knowledge of both items */
1720 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1730 /* Require identical knowledge of both items */
1731 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1732 if (o_ptr->feeling != j_ptr->feeling) return 0;
1734 /* Require identical "bonuses" */
1735 if (o_ptr->to_h != j_ptr->to_h) return 0;
1736 if (o_ptr->to_d != j_ptr->to_d) return 0;
1737 if (o_ptr->to_a != j_ptr->to_a) return 0;
1739 /* Require identical "pval" code */
1740 if (o_ptr->pval != j_ptr->pval) return 0;
1742 /* Artifacts never stack */
1743 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1745 /* Require identical "ego-item" names */
1746 if (o_ptr->name2 != j_ptr->name2) return 0;
1748 /* Require identical added essence */
1749 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1750 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1752 /* Hack -- Never stack "powerful" items */
1753 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1755 /* Hack -- Never stack recharging items */
1756 if (o_ptr->timeout || j_ptr->timeout) return 0;
1758 /* Require identical "values" */
1759 if (o_ptr->ac != j_ptr->ac) return 0;
1760 if (o_ptr->dd != j_ptr->dd) return 0;
1761 if (o_ptr->ds != j_ptr->ds) return 0;
1770 /* Require knowledge */
1771 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1779 /* Hack -- Identical art_flags! */
1780 for (i = 0; i < TR_FLAG_SIZE; i++)
1781 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1783 /* Hack -- Require identical "cursed" status */
1784 if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1786 /* Hack -- Require identical "broken" status */
1787 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1790 /* Hack -- require semi-matching "inscriptions" */
1791 if (o_ptr->inscription && j_ptr->inscription &&
1792 (o_ptr->inscription != j_ptr->inscription))
1795 /* Hack -- normally require matching "inscriptions" */
1796 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1798 /* Hack -- normally require matching "discounts" */
1799 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1802 /* They match, so they must be similar */
1807 * @brief 両オブジェクトをスロットに重ねることができるかどうかを返す。
1808 * Determine if an item can absorb a second item.
1809 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1810 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1811 * @return 重ね合わせ可能ならばTRUEを返す。
1813 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1815 int total = o_ptr->number + j_ptr->number;
1818 /* Are these objects similar? */
1819 max_num = object_similar_part(o_ptr, j_ptr);
1821 /* Return if not similar */
1822 if (!max_num) return FALSE;
1824 /* Maximal "stacking" limit */
1825 if (total > max_num) return (0);
1828 /* They match, so they must be similar */
1834 * @brief 両オブジェクトをスロットに重ね合わせる。
1835 * Allow one item to "absorb" another, assuming they are similar
1836 * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
1837 * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
1840 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1842 int max_num = object_similar_part(o_ptr, j_ptr);
1843 int total = o_ptr->number + j_ptr->number;
1844 int diff = (total > max_num) ? total - max_num : 0;
1846 /* Combine quantity, lose excess items */
1847 o_ptr->number = (total > max_num) ? max_num : total;
1849 /* Hack -- blend "known" status */
1850 if (object_is_known(j_ptr)) object_known(o_ptr);
1852 /* Hack -- clear "storebought" if only one has it */
1853 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1854 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1856 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1857 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1860 /* Hack -- blend "mental" status */
1861 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1863 /* Hack -- blend "inscriptions" */
1864 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1866 /* Hack -- blend "feelings" */
1867 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1869 /* Hack -- could average discounts */
1870 /* Hack -- save largest discount */
1871 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1873 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1874 if (o_ptr->tval == TV_ROD)
1876 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1877 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1880 /* Hack -- if wands are stacking, combine the charges. -LM- */
1881 if (o_ptr->tval == TV_WAND)
1883 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1889 * @brief tvalとsvalに対応するベースアイテムのIDを返す。
1890 * Find the index of the object_kind with the given tval and sval
1891 * @param tval 検索したいベースアイテムのtval
1892 * @param sval 検索したいベースアイテムのsval
1895 KIND_OBJECT_IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval)
1899 KIND_OBJECT_IDX bk = 0;
1902 for (k = 1; k < max_k_idx; k++)
1904 object_kind *k_ptr = &k_info[k];
1906 /* Require correct tval */
1907 if (k_ptr->tval != tval) continue;
1910 if (k_ptr->sval == sval) return (k);
1912 /* Ignore illegal items */
1913 if (sval != SV_ANY) continue;
1915 /* Apply the randomizer */
1916 if (!one_in_(++num)) continue;
1918 /* Use this value */
1922 /* Return this choice */
1929 msg_format(_("アイテムがない (%d,%d)", "No object (%d,%d)"), tval, sval);
1938 * @brief オブジェクトを初期化する
1939 * Wipe an object clean.
1940 * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
1943 void object_wipe(object_type *o_ptr)
1945 /* Wipe the structure */
1946 (void)WIPE(o_ptr, object_type);
1951 * @brief オブジェクトを複製する
1952 * Wipe an object clean.
1953 * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
1954 * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
1957 void object_copy(object_type *o_ptr, object_type *j_ptr)
1959 /* Copy the structure */
1960 (void)COPY(o_ptr, j_ptr, object_type);
1965 * @brief オブジェクト構造体にベースアイテムを作成する
1966 * Prepare an object based on an object kind.
1967 * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
1968 * @param k_idx 新たに作成したいベースアイテム情報のID
1971 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
1973 object_kind *k_ptr = &k_info[k_idx];
1975 /* Clear the record */
1978 /* Save the kind index */
1979 o_ptr->k_idx = k_idx;
1981 /* Efficiency -- tval/sval */
1982 o_ptr->tval = k_ptr->tval;
1983 o_ptr->sval = k_ptr->sval;
1985 /* Default "pval" */
1986 o_ptr->pval = k_ptr->pval;
1988 /* Default number */
1991 /* Default weight */
1992 o_ptr->weight = k_ptr->weight;
1995 o_ptr->to_h = k_ptr->to_h;
1996 o_ptr->to_d = k_ptr->to_d;
1997 o_ptr->to_a = k_ptr->to_a;
2000 o_ptr->ac = k_ptr->ac;
2001 o_ptr->dd = k_ptr->dd;
2002 o_ptr->ds = k_ptr->ds;
2004 /* Default activation */
2005 if (k_ptr->act_idx > 0) o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
2007 /* Hack -- worthless items are always "broken" */
2008 if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
2010 /* Hack -- cursed items are always "cursed" */
2011 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
2012 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2013 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
2014 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2015 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2016 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2021 * @brief 上質以上のオブジェクトに与えるための各種ボーナスを正規乱数も加えて算出する。
2022 * Help determine an "enchantment bonus" for an object.
2023 * @param max ボーナス値の限度
2024 * @param level ボーナス値に加味する基準生成階
2025 * @return 算出されたボーナス値
2027 * To avoid floating point but still provide a smooth distribution of bonuses,\n
2028 * we simply round the results of division in such a way as to "average" the\n
2029 * correct floating point value.\n
2031 * This function has been changed. It uses "randnor()" to choose values from\n
2032 * a normal distribution, whose mean moves from zero towards the max as the\n
2033 * level increases, and whose standard deviation is equal to 1/4 of the max,\n
2034 * and whose values are forced to lie between zero and the max, inclusive.\n
2036 * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
2037 * rare to get the "full" enchantment on an object, even a deep levels.\n
2039 * It is always possible (albeit unlikely) to get the "full" enchantment.\n
2041 * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
2043 * N 0 1 2 3 4 5 6 7 8 9 10\n
2044 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n
2045 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03\n
2046 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05\n
2047 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05\n
2048 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11\n
2049 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41\n
2050 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65\n
2051 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94\n
2052 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78\n
2053 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64\n
2054 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62\n
2055 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33\n
2056 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38\n
2057 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53\n
2058 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53\n
2059 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27\n
2060 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72\n
2061 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07\n
2063 int m_bonus(int max, DEPTH level)
2065 int bonus, stand, extra, value;
2068 /* Paranoia -- enforce maximal "level" */
2069 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
2072 /* The "bonus" moves towards the max */
2073 bonus = ((max * level) / MAX_DEPTH);
2075 /* Hack -- determine fraction of error */
2076 extra = ((max * level) % MAX_DEPTH);
2078 /* Hack -- simulate floating point computations */
2079 if (randint0(MAX_DEPTH) < extra) bonus++;
2082 /* The "stand" is equal to one quarter of the max */
2085 /* Hack -- determine fraction of error */
2088 /* Hack -- simulate floating point computations */
2089 if (randint0(4) < extra) stand++;
2092 /* Choose an "interesting" value */
2093 value = randnor(bonus, stand);
2095 /* Enforce the minimum value */
2096 if (value < 0) return (0);
2098 /* Enforce the maximum value */
2099 if (value > max) return (max);
2105 * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user
2106 * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ
2109 static void object_mention(object_type *o_ptr)
2111 GAME_TEXT o_name[MAX_NLEN];
2113 object_aware(o_ptr);
2114 object_known(o_ptr);
2116 /* Mark the item as fully known */
2117 o_ptr->ident |= (IDENT_MENTAL);
2118 object_desc(o_name, o_ptr, 0);
2119 msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name);
2124 * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
2125 * Choose random ego type
2126 * @param slot 取得したいエゴの装備部位
2127 * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
2128 * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
2130 static byte get_random_ego(byte slot, bool good)
2133 ego_item_type *e_ptr;
2137 for (i = 1; i < max_e_idx; i++)
2141 if (e_ptr->slot == slot
2142 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2145 total += (255 / e_ptr->rarity);
2149 value = randint1(total);
2151 for (i = 1; i < max_e_idx; i++)
2155 if (e_ptr->slot == slot
2156 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2159 value -= (255 / e_ptr->rarity);
2160 if (value <= 0L) break;
2168 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2169 * Apply magic to an item known to be a "weapon"
2170 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2171 * @param level 生成基準階
2172 * @param power 生成ランク
2175 * Hack -- note special base damage dice boosting\n
2176 * Hack -- note special processing for weapon/digger\n
2178 static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
2180 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
2181 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
2183 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
2184 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
2186 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2188 tohit2 = (tohit2+1)/2;
2189 todam2 = (todam2+1)/2;
2196 o_ptr->to_h += tohit1;
2197 o_ptr->to_d += todam1;
2203 o_ptr->to_h += tohit2;
2204 o_ptr->to_d += todam2;
2212 o_ptr->to_h -= tohit1;
2213 o_ptr->to_d -= todam1;
2218 /* Penalize again */
2219 o_ptr->to_h -= tohit2;
2220 o_ptr->to_d -= todam2;
2223 /* Cursed (if "bad") */
2224 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2227 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2230 switch (o_ptr->tval)
2237 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2238 create_artifact(o_ptr, FALSE);
2240 /* Special Ego-item */
2241 o_ptr->name2 = EGO_DIGGING;
2245 else if (power < -1)
2247 /* Hack -- Horrible digging bonus */
2248 o_ptr->pval = 0 - (5 + randint1(5));
2254 /* Hack -- Reverse digging bonus */
2255 o_ptr->pval = 0 - (o_ptr->pval);
2269 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2271 create_artifact(o_ptr, FALSE);
2276 /* Roll for an ego-item */
2277 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2278 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2280 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2282 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2287 switch (o_ptr->name2)
2290 if (one_in_(4) && (level > 40))
2291 add_flag(o_ptr->art_flags, TR_BLOWS);
2295 add_flag(o_ptr->art_flags, TR_RES_POIS);
2297 add_flag(o_ptr->art_flags, TR_WARNING);
2299 case EGO_KILL_DRAGON:
2301 add_flag(o_ptr->art_flags, TR_RES_POIS);
2305 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2307 case EGO_SLAYING_WEAPON:
2308 if (one_in_(3)) /* double damage */
2316 while (one_in_(o_ptr->dd));
2322 while (one_in_(o_ptr->ds));
2327 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2329 if (o_ptr->tval == TV_SWORD && one_in_(3))
2331 add_flag(o_ptr->art_flags, TR_VORPAL);
2336 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2342 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
2344 add_flag(o_ptr->art_flags, TR_DEX);
2346 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2349 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
2351 case EGO_EARTHQUAKES:
2352 if (one_in_(3) && (level > 60))
2353 add_flag(o_ptr->art_flags, TR_BLOWS);
2355 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
2359 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2363 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2365 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2367 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2368 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2371 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2372 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2373 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2374 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2378 if (!o_ptr->art_name)
2380 /* Hack -- Super-charge the damage dice */
2381 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2383 /* Hack -- Lower the damage dice */
2384 if (o_ptr->dd > 9) o_ptr->dd = 9;
2389 else if (power < -1)
2391 /* Roll for ego-item */
2392 if (randint0(MAX_DEPTH) < level)
2396 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2397 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2403 switch (o_ptr->name2)
2406 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2407 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2409 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2410 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2411 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2412 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2413 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2414 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2428 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2430 create_artifact(o_ptr, FALSE);
2433 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2447 if (power > 2) /* power > 2 is debug only */
2449 create_artifact(o_ptr, FALSE);
2453 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2455 switch (o_ptr->name2)
2457 case EGO_SLAYING_BOLT:
2462 /* Hack -- super-charge the damage dice */
2463 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2465 /* Hack -- restrict the damage dice */
2466 if (o_ptr->dd > 9) o_ptr->dd = 9;
2470 else if (power < -1)
2472 /* Roll for ego-item */
2473 if (randint0(MAX_DEPTH) < level)
2475 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2485 * @brief ドラゴン装備にランダムな耐性を与える
2486 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2489 static void dragon_resist(object_type * o_ptr)
2494 one_dragon_ele_resistance(o_ptr);
2496 one_high_resistance(o_ptr);
2502 * @brief オブジェクトにランダムな強いESPを与える
2503 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2506 static bool add_esp_strong(object_type *o_ptr)
2508 bool nonliv = FALSE;
2510 switch (randint1(3))
2512 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2513 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2514 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2521 * @brief オブジェクトにランダムな弱いESPを与える
2522 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2523 * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3)
2526 static void add_esp_weak(object_type *o_ptr, bool extra)
2529 u32b weak_esp_list[] = {
2541 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2542 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2544 /* Add unduplicated weak esp flags randomly */
2545 for (i = 0; i < add_count; ++ i)
2547 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2549 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2550 weak_esp_list[choice] = weak_esp_list[i];
2556 * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2557 * Apply magic to an item known to be "armor"
2558 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2559 * @param level 生成基準階
2560 * @param power 生成ランク
2563 * Hack -- note special processing for crown/helm\n
2564 * Hack -- note special processing for robe of permanence\n
2566 static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
2568 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
2569 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
2575 o_ptr->to_a += toac1;
2581 o_ptr->to_a += toac2;
2589 o_ptr->to_a -= toac1;
2594 /* Penalize again */
2595 o_ptr->to_a -= toac2;
2598 /* Cursed (if "bad") */
2599 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2604 switch (o_ptr->tval)
2608 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2609 create_artifact(o_ptr, FALSE);
2619 /* Hack -- Try for "Robes of the Magi" */
2620 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2621 (o_ptr->sval == SV_ROBE) &&
2622 (randint0(100) < 15))
2626 o_ptr->name2 = EGO_YOIYAMI;
2627 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2628 o_ptr->sval = SV_YOIYAMI_ROBE;
2634 o_ptr->name2 = EGO_PERMANENCE;
2639 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2641 create_artifact(o_ptr, FALSE);
2647 bool okay_flag = TRUE;
2649 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2651 switch (o_ptr->name2)
2654 if (o_ptr->tval != TV_HARD_ARMOR)
2660 if (o_ptr->tval != TV_SOFT_ARMOR)
2669 if (okay_flag) break;
2671 switch (o_ptr->name2)
2673 case EGO_RESISTANCE:
2675 add_flag(o_ptr->art_flags, TR_RES_POIS);
2678 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2679 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2683 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2685 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2687 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2688 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2690 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2691 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2692 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2693 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2694 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2695 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2696 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2697 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2700 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2701 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2702 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2703 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2704 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2705 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2718 if (o_ptr->sval == SV_DRAGON_SHIELD)
2720 dragon_resist(o_ptr);
2721 if (!one_in_(3)) break;
2727 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2729 create_artifact(o_ptr, FALSE);
2735 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2736 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
2737 && o_ptr->name2 == EGO_S_DWARVEN)
2744 switch (o_ptr->name2)
2747 if (!one_in_(3)) one_high_resistance(o_ptr);
2748 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2750 case EGO_REFLECTION:
2751 if (o_ptr->sval == SV_MIRROR_SHIELD)
2756 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2757 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2766 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2768 dragon_resist(o_ptr);
2769 if (!one_in_(3)) break;
2773 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2775 create_artifact(o_ptr, FALSE);
2778 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2782 else if (power < -1)
2784 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2792 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2794 dragon_resist(o_ptr);
2795 if (!one_in_(3)) break;
2800 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2802 create_artifact(o_ptr, FALSE);
2805 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
2807 switch (o_ptr->name2)
2809 case EGO_SLOW_DESCENT:
2812 one_high_resistance(o_ptr);
2818 else if (power < -1)
2820 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
2831 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2833 create_artifact(o_ptr, FALSE);
2838 bool ok_flag = TRUE;
2839 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
2841 switch (o_ptr->name2)
2844 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
2845 else add_esp_weak(o_ptr, FALSE);
2849 case EGO_REGENERATION:
2850 case EGO_LORDLINESS:
2856 if (one_in_(2)) add_esp_strong(o_ptr);
2857 else add_esp_weak(o_ptr, FALSE);
2860 default:/* not existing crown (wisdom,lite, etc...) */
2864 break; /* while (1) */
2870 else if (power < -1)
2874 bool ok_flag = TRUE;
2875 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
2877 switch (o_ptr->name2)
2879 case EGO_ANCIENT_CURSE:
2880 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2881 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2882 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2883 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2884 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2885 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2889 break; /* while (1) */
2898 if (o_ptr->sval == SV_DRAGON_HELM)
2900 dragon_resist(o_ptr);
2901 if (!one_in_(3)) break;
2907 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2909 create_artifact(o_ptr, FALSE);
2914 bool ok_flag = TRUE;
2915 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
2917 switch (o_ptr->name2)
2919 case EGO_BRILLIANCE:
2921 case EGO_INFRAVISION:
2922 case EGO_H_PROTECTION:
2927 if (one_in_(2)) add_esp_strong(o_ptr);
2928 else add_esp_weak(o_ptr, FALSE);
2932 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
2933 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
2936 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2938 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2940 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2941 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2943 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2944 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2945 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2946 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2947 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2948 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2949 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2950 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2952 default:/* not existing helm (Magi, Might, etc...)*/
2956 break; /* while (1) */
2961 else if (power < -1)
2965 bool ok_flag = TRUE;
2966 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
2968 switch (o_ptr->name2)
2970 case EGO_ANCIENT_CURSE:
2974 break; /* while (1) */
2985 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2987 create_artifact(o_ptr, FALSE);
2990 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
2992 switch (o_ptr->name2)
3001 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
3002 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
3003 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
3004 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3011 else if (power < -1)
3013 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3024 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
3025 * Apply magic to an item known to be a "ring" or "amulet"
3026 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3027 * @param level 生成基準階
3028 * @param power 生成ランク
3031 * Hack -- note special "pval boost" code for ring of speed\n
3032 * Hack -- note that some items must be cursed (or blessed)\n
3034 static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
3036 /* Apply magic (good or bad) according to type */
3037 switch (o_ptr->tval)
3042 switch (o_ptr->sval)
3044 case SV_RING_ATTACKS:
3047 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
3048 if (one_in_(15)) o_ptr->pval++;
3049 if (o_ptr->pval < 1) o_ptr->pval = 1;
3055 o_ptr->ident |= (IDENT_BROKEN);
3058 o_ptr->curse_flags |= TRC_CURSED;
3061 o_ptr->pval = 0 - (o_ptr->pval);
3072 /* Strength, Constitution, Dexterity, Intelligence */
3078 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3084 o_ptr->ident |= (IDENT_BROKEN);
3087 o_ptr->curse_flags |= TRC_CURSED;
3090 o_ptr->pval = 0 - (o_ptr->pval);
3096 /* Ring of Speed! */
3099 /* Base speed (1 to 10) */
3100 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3102 /* Super-charge the ring */
3103 while (randint0(100) < 50) o_ptr->pval++;
3109 o_ptr->ident |= (IDENT_BROKEN);
3112 o_ptr->curse_flags |= TRC_CURSED;
3115 o_ptr->pval = 0 - (o_ptr->pval);
3123 case SV_RING_LORDLY:
3127 one_lordly_high_resistance(o_ptr);
3131 /* Bonus to armor class */
3132 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3136 case SV_RING_WARNING:
3138 if (one_in_(3)) one_low_esp(o_ptr);
3143 case SV_RING_SEARCHING:
3145 /* Bonus to searching */
3146 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3152 o_ptr->ident |= (IDENT_BROKEN);
3155 o_ptr->curse_flags |= TRC_CURSED;
3158 o_ptr->pval = 0 - (o_ptr->pval);
3164 /* Flames, Acid, Ice */
3165 case SV_RING_FLAMES:
3170 /* Bonus to armor class */
3171 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3175 /* Weakness, Stupidity */
3176 case SV_RING_WEAKNESS:
3177 case SV_RING_STUPIDITY:
3180 o_ptr->ident |= (IDENT_BROKEN);
3183 o_ptr->curse_flags |= TRC_CURSED;
3186 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3187 if (power > 0) power = 0 - power;
3192 /* WOE, Stupidity */
3196 o_ptr->ident |= (IDENT_BROKEN);
3199 o_ptr->curse_flags |= TRC_CURSED;
3202 o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
3203 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3204 if (power > 0) power = 0 - power;
3209 /* Ring of damage */
3210 case SV_RING_DAMAGE:
3212 /* Bonus to damage */
3213 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
3219 o_ptr->ident |= (IDENT_BROKEN);
3222 o_ptr->curse_flags |= TRC_CURSED;
3225 o_ptr->to_d = 0 - o_ptr->to_d;
3231 /* Ring of Accuracy */
3232 case SV_RING_ACCURACY:
3235 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
3241 o_ptr->ident |= (IDENT_BROKEN);
3244 o_ptr->curse_flags |= TRC_CURSED;
3247 o_ptr->to_h = 0 - o_ptr->to_h;
3253 /* Ring of Protection */
3254 case SV_RING_PROTECTION:
3256 /* Bonus to armor class */
3257 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
3263 o_ptr->ident |= (IDENT_BROKEN);
3266 o_ptr->curse_flags |= TRC_CURSED;
3269 o_ptr->to_a = 0 - o_ptr->to_a;
3275 /* Ring of Slaying */
3276 case SV_RING_SLAYING:
3278 /* Bonus to damage and to hit */
3279 o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
3280 o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
3286 o_ptr->ident |= (IDENT_BROKEN);
3289 o_ptr->curse_flags |= TRC_CURSED;
3291 /* Reverse bonuses */
3292 o_ptr->to_h = 0 - o_ptr->to_h;
3293 o_ptr->to_d = 0 - o_ptr->to_d;
3299 case SV_RING_MUSCLE:
3301 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
3302 if (one_in_(4)) o_ptr->pval++;
3308 o_ptr->ident |= (IDENT_BROKEN);
3311 o_ptr->curse_flags |= TRC_CURSED;
3313 /* Reverse bonuses */
3314 o_ptr->pval = 0 - o_ptr->pval;
3319 case SV_RING_AGGRAVATION:
3322 o_ptr->ident |= (IDENT_BROKEN);
3325 o_ptr->curse_flags |= TRC_CURSED;
3327 if (power > 0) power = 0 - power;
3331 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3332 || (power > 2)) /* power > 2 is debug only */
3334 o_ptr->pval = MIN(o_ptr->pval, 4);
3335 /* Randart amulet */
3336 create_artifact(o_ptr, FALSE);
3338 else if ((power == 2) && one_in_(2))
3340 while(!o_ptr->name2)
3342 int tmp = m_bonus(10, level);
3343 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3344 switch(randint1(28))
3347 o_ptr->name2 = EGO_RING_THROW;
3350 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3351 o_ptr->name2 = EGO_RING_REGEN;
3354 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3355 o_ptr->name2 = EGO_RING_LITE;
3358 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3359 o_ptr->name2 = EGO_RING_TELEPORT;
3362 if (o_ptr->to_h) break;
3363 o_ptr->name2 = EGO_RING_TO_H;
3366 if (o_ptr->to_d) break;
3367 o_ptr->name2 = EGO_RING_TO_D;
3370 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3371 o_ptr->name2 = EGO_RING_SLAY;
3374 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3375 o_ptr->name2 = EGO_RING_WIZARD;
3378 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3379 o_ptr->name2 = EGO_RING_HERO;
3382 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3383 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3384 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3385 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3388 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3389 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;
3390 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3391 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3392 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3395 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3396 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;
3397 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3398 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3399 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3402 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3403 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;
3404 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3405 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3408 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3409 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;
3410 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3411 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3413 case 21: case 22: case 23: case 24: case 25: case 26:
3414 switch (o_ptr->sval)
3417 if (!one_in_(3)) break;
3418 o_ptr->name2 = EGO_RING_D_SPEED;
3420 case SV_RING_DAMAGE:
3421 case SV_RING_ACCURACY:
3422 case SV_RING_SLAYING:
3423 if (one_in_(2)) break;
3424 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3427 o_ptr->name2 = EGO_RING_BERSERKER;
3428 o_ptr->to_h -= 2+randint1(4);
3429 o_ptr->to_d += 2+randint1(4);
3432 case SV_RING_PROTECTION:
3433 o_ptr->name2 = EGO_RING_SUPER_AC;
3434 o_ptr->to_a += 7 + m_bonus(5, level);
3436 case SV_RING_RES_FEAR:
3437 o_ptr->name2 = EGO_RING_HERO;
3440 if (one_in_(2)) break;
3441 o_ptr->name2 = EGO_RING_HUNTER;
3443 case SV_RING_SEARCHING:
3444 o_ptr->name2 = EGO_RING_STEALTH;
3446 case SV_RING_TELEPORTATION:
3447 o_ptr->name2 = EGO_RING_TELE_AWAY;
3449 case SV_RING_RES_BLINDNESS:
3451 o_ptr->name2 = EGO_RING_RES_LITE;
3453 o_ptr->name2 = EGO_RING_RES_DARK;
3455 case SV_RING_LORDLY:
3456 if (!one_in_(20)) break;
3457 one_lordly_high_resistance(o_ptr);
3458 one_lordly_high_resistance(o_ptr);
3459 o_ptr->name2 = EGO_RING_TRUE;
3461 case SV_RING_SUSTAIN:
3462 if (!one_in_(4)) break;
3463 o_ptr->name2 = EGO_RING_RES_TIME;
3465 case SV_RING_FLAMES:
3466 if (!one_in_(2)) break;
3467 o_ptr->name2 = EGO_RING_DRAGON_F;
3470 if (!one_in_(2)) break;
3471 o_ptr->name2 = EGO_RING_DRAGON_C;
3473 case SV_RING_WARNING:
3474 if (!one_in_(2)) break;
3475 o_ptr->name2 = EGO_RING_M_DETECT;
3483 o_ptr->curse_flags = 0L;
3485 else if ((power == -2) && one_in_(2))
3487 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3488 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3489 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3490 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3491 o_ptr->art_flags[0] = 0;
3492 o_ptr->art_flags[1] = 0;
3493 while(!o_ptr->name2)
3495 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3499 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3500 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3503 o_ptr->name2 = EGO_RING_NO_MELEE;
3506 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3507 o_ptr->name2 = EGO_RING_AGGRAVATE;
3510 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3511 o_ptr->name2 = EGO_RING_TY_CURSE;
3514 o_ptr->name2 = EGO_RING_ALBINO;
3519 o_ptr->ident |= (IDENT_BROKEN);
3522 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3530 switch (o_ptr->sval)
3532 /* Amulet of wisdom/charisma */
3533 case SV_AMULET_INTELLIGENCE:
3534 case SV_AMULET_WISDOM:
3535 case SV_AMULET_CHARISMA:
3537 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3543 o_ptr->ident |= (IDENT_BROKEN);
3546 o_ptr->curse_flags |= (TRC_CURSED);
3548 /* Reverse bonuses */
3549 o_ptr->pval = 0 - o_ptr->pval;
3555 /* Amulet of brilliance */
3556 case SV_AMULET_BRILLIANCE:
3558 o_ptr->pval = 1 + m_bonus(3, level);
3559 if (one_in_(4)) o_ptr->pval++;
3565 o_ptr->ident |= (IDENT_BROKEN);
3568 o_ptr->curse_flags |= (TRC_CURSED);
3570 /* Reverse bonuses */
3571 o_ptr->pval = 0 - o_ptr->pval;
3577 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3581 o_ptr->curse_flags |= (TRC_CURSED);
3586 case SV_AMULET_RESISTANCE:
3588 if (one_in_(5)) one_high_resistance(o_ptr);
3589 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3593 /* Amulet of searching */
3594 case SV_AMULET_SEARCHING:
3596 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
3602 o_ptr->ident |= (IDENT_BROKEN);
3605 o_ptr->curse_flags |= (TRC_CURSED);
3607 /* Reverse bonuses */
3608 o_ptr->pval = 0 - (o_ptr->pval);
3614 /* Amulet of the Magi -- never cursed */
3615 case SV_AMULET_THE_MAGI:
3617 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3618 o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
3620 /* gain one low ESP */
3621 add_esp_weak(o_ptr, FALSE);
3626 /* Amulet of Doom -- always cursed */
3627 case SV_AMULET_DOOM:
3630 o_ptr->ident |= (IDENT_BROKEN);
3633 o_ptr->curse_flags |= (TRC_CURSED);
3636 o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
3637 o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
3638 if (power > 0) power = 0 - power;
3643 case SV_AMULET_MAGIC_MASTERY:
3645 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
3651 o_ptr->ident |= (IDENT_BROKEN);
3654 o_ptr->curse_flags |= (TRC_CURSED);
3656 /* Reverse bonuses */
3657 o_ptr->pval = 0 - o_ptr->pval;
3663 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3664 || (power > 2)) /* power > 2 is debug only */
3666 o_ptr->pval = MIN(o_ptr->pval, 4);
3667 /* Randart amulet */
3668 create_artifact(o_ptr, FALSE);
3670 else if ((power == 2) && one_in_(2))
3672 while(!o_ptr->name2)
3674 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3675 switch(randint1(21))
3678 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3679 o_ptr->name2 = EGO_AMU_SLOW_D;
3682 if (o_ptr->pval) break;
3683 o_ptr->name2 = EGO_AMU_INFRA;
3686 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3687 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3690 if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
3691 o_ptr->name2 = EGO_AMU_HOLD_EXP;
3694 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3695 o_ptr->name2 = EGO_AMU_LEVITATION;
3697 case 10: case 11: case 21:
3698 o_ptr->name2 = EGO_AMU_AC;
3701 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3702 if (m_bonus(10, level) > 8)
3703 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3705 o_ptr->name2 = EGO_AMU_RES_FIRE;
3708 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3709 if (m_bonus(10, level) > 8)
3710 o_ptr->name2 = EGO_AMU_RES_COLD_;
3712 o_ptr->name2 = EGO_AMU_RES_COLD;
3715 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3716 if (m_bonus(10, level) > 8)
3717 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3719 o_ptr->name2 = EGO_AMU_RES_ELEC;
3722 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3723 if (m_bonus(10, level) > 8)
3724 o_ptr->name2 = EGO_AMU_RES_ACID_;
3726 o_ptr->name2 = EGO_AMU_RES_ACID;
3728 case 16: case 17: case 18: case 19: case 20:
3729 switch (o_ptr->sval)
3731 case SV_AMULET_TELEPORT:
3732 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3733 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3734 else o_ptr->name2 = EGO_AMU_TELEPORT;
3736 case SV_AMULET_RESIST_ACID:
3737 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3739 case SV_AMULET_SEARCHING:
3740 o_ptr->name2 = EGO_AMU_STEALTH;
3742 case SV_AMULET_BRILLIANCE:
3743 if (!one_in_(3)) break;
3744 o_ptr->name2 = EGO_AMU_IDENT;
3746 case SV_AMULET_CHARISMA:
3747 if (!one_in_(3)) break;
3748 o_ptr->name2 = EGO_AMU_CHARM;
3750 case SV_AMULET_THE_MAGI:
3751 if (one_in_(2)) break;
3752 o_ptr->name2 = EGO_AMU_GREAT;
3754 case SV_AMULET_RESISTANCE:
3755 if (!one_in_(5)) break;
3756 o_ptr->name2 = EGO_AMU_DEFENDER;
3758 case SV_AMULET_TELEPATHY:
3759 if (!one_in_(3)) break;
3760 o_ptr->name2 = EGO_AMU_DETECTION;
3765 o_ptr->curse_flags = 0L;
3767 else if ((power == -2) && one_in_(2))
3769 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3770 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3771 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3772 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3773 o_ptr->art_flags[0] = 0;
3774 o_ptr->art_flags[1] = 0;
3775 while(!o_ptr->name2)
3777 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3781 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3782 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3785 o_ptr->name2 = EGO_AMU_FOOL;
3788 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3789 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3792 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3793 o_ptr->name2 = EGO_AMU_TY_CURSE;
3796 o_ptr->name2 = EGO_AMU_NAIVETY;
3801 o_ptr->ident |= (IDENT_BROKEN);
3804 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3812 * @brief モンスターが人形のベースにできるかを返す
3813 * @param r_idx チェックしたいモンスター種族のID
3814 * @return 人形にできるならTRUEを返す
3816 static bool item_monster_okay(MONRACE_IDX r_idx)
3818 monster_race *r_ptr = &r_info[r_idx];
3821 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
3822 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
3823 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
3824 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
3825 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
3826 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
3833 * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
3834 * Apply magic to an item known to be "boring"
3835 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3836 * @param level 生成基準階
3837 * @param power 生成ランク
3840 * Hack -- note the special code for various items
3842 static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
3844 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3849 /* Apply magic (good or bad) according to type */
3850 switch (o_ptr->tval)
3859 o_ptr->ident |= (IDENT_BROKEN);
3862 o_ptr->curse_flags |= (TRC_CURSED);
3869 o_ptr->xtra4 = o_ptr->pval;
3875 /* Hack -- Torches -- random fuel */
3876 if (o_ptr->sval == SV_LITE_TORCH)
3878 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
3882 /* Hack -- Lanterns -- random fuel */
3883 if (o_ptr->sval == SV_LITE_LANTERN)
3885 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
3889 if (power > 2) /* power > 2 is debug only */
3891 create_artifact(o_ptr, FALSE);
3893 else if ((power == 2) || ((power == 1) && one_in_(3)))
3895 while (!o_ptr->name2)
3899 bool okay_flag = TRUE;
3901 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
3903 switch (o_ptr->name2)
3906 if (o_ptr->sval == SV_LITE_FEANOR)
3914 else if (power == -2)
3916 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
3918 switch (o_ptr->name2)
3920 case EGO_LITE_DARKNESS:
3923 if (o_ptr->sval == SV_LITE_TORCH)
3925 add_flag(o_ptr->art_flags, TR_LITE_M1);
3927 else if (o_ptr->sval == SV_LITE_LANTERN)
3929 add_flag(o_ptr->art_flags, TR_LITE_M2);
3931 else if (o_ptr->sval == SV_LITE_FEANOR)
3933 add_flag(o_ptr->art_flags, TR_LITE_M3);
3945 /* The wand or staff gets a number of initial charges equal
3946 * to between 1/2 (+1) and the full object kind's pval. -LM-
3948 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
3954 /* Transfer the pval. -LM- */
3955 o_ptr->pval = k_ptr->pval;
3962 object_aware(o_ptr);
3963 object_known(o_ptr);
3969 PARAMETER_VALUE i = 1;
3972 monster_race *r_ptr;
3974 /* Pick a random non-unique monster race */
3977 i = randint1(max_r_idx - 1);
3979 if (!item_monster_okay(i)) continue;
3980 if (i == MON_TSUCHINOKO) continue;
3984 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
3986 /* Ignore dead monsters */
3987 if (!r_ptr->rarity) continue;
3989 /* Ignore uncommon monsters */
3990 if (r_ptr->rarity > 100) continue;
3992 /* Prefer less out-of-depth monsters */
3993 if (randint0(check)) continue;
4000 /* Some figurines are cursed */
4001 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
4008 PARAMETER_VALUE i = 1;
4013 monster_race *r_ptr;
4015 if (o_ptr->sval == SV_SKELETON)
4017 match = RF9_DROP_SKELETON;
4019 else if (o_ptr->sval == SV_CORPSE)
4021 match = RF9_DROP_CORPSE;
4024 /* Hack -- Remove the monster restriction */
4025 get_mon_num_prep(item_monster_okay, NULL);
4027 /* Pick a random non-unique monster race */
4030 i = get_mon_num(dun_level);
4034 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4036 /* Ignore dead monsters */
4037 if (!r_ptr->rarity) continue;
4039 /* Ignore corpseless monsters */
4040 if (!(r_ptr->flags9 & match)) continue;
4042 /* Prefer less out-of-depth monsters */
4043 if (randint0(check)) continue;
4051 object_aware(o_ptr);
4052 object_known(o_ptr);
4058 PARAMETER_VALUE i = 1;
4060 monster_race *r_ptr;
4062 /* Pick a random monster race */
4065 i = randint1(max_r_idx - 1);
4069 /* Ignore dead monsters */
4070 if (!r_ptr->rarity) continue;
4079 msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
4081 object_aware(o_ptr);
4082 object_known(o_ptr);
4089 DEPTH obj_level = k_info[o_ptr->k_idx].level;
4091 /* Hack -- skip ruined chests */
4092 if (obj_level <= 0) break;
4094 /* Hack -- pick a "difficulty" */
4095 o_ptr->pval = randint1(obj_level);
4096 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4098 o_ptr->xtra3 = dun_level + 5;
4100 /* Never exceed "difficulty" of 55 to 59 */
4101 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4109 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
4110 * Complete the "creation" of an object by applying "magic" to the item
4111 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4113 * @param mode 生成オプション
4116 * This includes not only rolling for random bonuses, but also putting the\n
4117 * finishing touches on ego-items and artifacts, giving charges to wands and\n
4118 * staffs, giving fuel to lites, and placing traps on chests.\n
4120 * In particular, note that "Instant Artifacts", if "created" by an external\n
4121 * routine, must pass through this function to complete the actual creation.\n
4123 * The base "chance" of the item being "good" increases with the "level"\n
4124 * parameter, which is usually derived from the dungeon level, being equal\n
4125 * to the level plus 10, up to a maximum of 75. If "good" is true, then\n
4126 * the object is guaranteed to be "good". If an object is "good", then\n
4127 * the chance that the object will be "great" (ego-item or artifact), also\n
4128 * increases with the "level", being equal to half the level, plus 5, up to\n
4129 * a maximum of 20. If "great" is true, then the object is guaranteed to be\n
4130 * "great". At dungeon level 65 and below, 15/100 objects are "great".\n
4132 * If the object is not "good", there is a chance it will be "cursed", and\n
4133 * if it is "cursed", there is a chance it will be "broken". These chances\n
4134 * are related to the "good" / "great" chances above.\n
4136 * Otherwise "normal" rings and amulets will be "good" half the time and\n
4137 * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4139 * If "okay" is true, and the object is going to be "great", then there is\n
4140 * a chance that an artifact will be created. This is true even if both the\n
4141 * "good" and "great" arguments are false. As a total hack, if "great" is\n
4142 * true, then the item gets 3 extra "attempts" to become an artifact.\n
4144 void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
4146 int i, rolls, f1, f2, power;
4148 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4150 /* Maximum "level" for various things */
4151 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4153 /* Base chance of being "good" */
4156 /* Maximal chance of being "good" */
4157 if (f1 > d_info[p_ptr->dungeon_idx].obj_good) f1 = d_info[p_ptr->dungeon_idx].obj_good;
4159 /* Base chance of being "great" */
4162 /* Maximal chance of being "great" */
4163 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[p_ptr->dungeon_idx].obj_great))
4164 f2 = d_info[p_ptr->dungeon_idx].obj_great;
4166 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4171 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4180 /* Roll for "good" */
4181 if ((mode & AM_GOOD) || magik(f1))
4186 /* Roll for "great" */
4187 if ((mode & AM_GREAT) || magik(f2))
4191 /* Roll for "special" */
4192 if (mode & AM_SPECIAL) power = 3;
4196 /* Roll for "cursed" */
4199 /* Assume "cursed" */
4202 /* Roll for "broken" */
4203 if (magik(f2)) power = -2;
4207 if (mode & AM_CURSED)
4209 /* Assume 'cursed' */
4214 /* Everything else gets more badly cursed */
4221 /* Assume no rolls */
4224 /* Get one roll if excellent */
4225 if (power >= 2) rolls = 1;
4227 /* Hack -- Get four rolls if forced great or special */
4228 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4230 /* Hack -- Get no rolls if not allowed */
4231 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4233 /* Roll for artifacts if allowed */
4234 for (i = 0; i < rolls; i++)
4236 /* Roll for an artifact */
4237 if (make_artifact(o_ptr)) break;
4238 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4240 if (make_artifact(o_ptr)) break;
4245 /* Hack -- analyze artifacts */
4246 if (object_is_fixed_artifact(o_ptr))
4248 artifact_type *a_ptr = &a_info[o_ptr->name1];
4250 /* Hack -- Mark the artifact as "created" */
4253 /* Hack -- Memorize location of artifact in saved floors */
4254 if (character_dungeon)
4255 a_ptr->floor_id = p_ptr->floor_id;
4257 /* Extract the other fields */
4258 o_ptr->pval = a_ptr->pval;
4259 o_ptr->ac = a_ptr->ac;
4260 o_ptr->dd = a_ptr->dd;
4261 o_ptr->ds = a_ptr->ds;
4262 o_ptr->to_a = a_ptr->to_a;
4263 o_ptr->to_h = a_ptr->to_h;
4264 o_ptr->to_d = a_ptr->to_d;
4265 o_ptr->weight = a_ptr->weight;
4266 o_ptr->xtra2 = a_ptr->act_idx;
4268 if (o_ptr->name1 == ART_MILIM)
4270 if(p_ptr->pseikaku == SEIKAKU_SEXY)
4276 /* Hack -- extract the "broken" flag */
4277 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4279 /* Hack -- extract the "cursed" flag */
4280 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4281 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4282 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4283 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4284 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4285 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4290 switch (o_ptr->tval)
4299 if (power) a_m_aux_1(o_ptr, lev, power);
4305 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4311 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4325 /* Elven Cloak and Black Clothes ... */
4326 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4327 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4328 o_ptr->pval = randint1(4);
4332 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4333 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4334 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4335 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4336 a_m_aux_2(o_ptr, lev, power);
4338 if (power) a_m_aux_2(o_ptr, lev, power);
4346 if (!power && (randint0(100) < 50)) power = -1;
4347 a_m_aux_3(o_ptr, lev, power);
4353 a_m_aux_4(o_ptr, lev, power);
4358 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4359 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4360 (p_ptr->pseikaku == SEIKAKU_SEXY))
4363 add_flag(o_ptr->art_flags, TR_STR);
4364 add_flag(o_ptr->art_flags, TR_INT);
4365 add_flag(o_ptr->art_flags, TR_WIS);
4366 add_flag(o_ptr->art_flags, TR_DEX);
4367 add_flag(o_ptr->art_flags, TR_CON);
4368 add_flag(o_ptr->art_flags, TR_CHR);
4371 /* Hack -- analyze ego-items */
4372 if (object_is_ego(o_ptr))
4374 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4376 /* Hack -- acquire "broken" flag */
4377 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4379 /* Hack -- acquire "cursed" flag */
4380 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4381 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4382 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4383 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4384 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4385 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4387 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4388 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4389 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4390 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4391 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4392 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4393 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4394 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4400 while (one_in_(o_ptr->dd));
4402 if (o_ptr->dd > 9) o_ptr->dd = 9;
4405 /* Hack -- apply activatin index if needed */
4406 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
4408 /* Hack -- apply extra penalties if needed */
4409 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4411 /* Hack -- obtain bonuses */
4412 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4413 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4414 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4416 /* Hack -- obtain pval */
4417 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4420 /* Hack -- apply extra bonuses if needed */
4423 /* Hack -- obtain bonuses */
4424 if (e_ptr->max_to_h)
4426 if (e_ptr->max_to_h > 127)
4427 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4428 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4430 if (e_ptr->max_to_d)
4432 if (e_ptr->max_to_d > 127)
4433 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4434 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4436 if (e_ptr->max_to_a)
4438 if (e_ptr->max_to_a > 127)
4439 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4440 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4443 /* Accuracy ego must have high to_h */
4444 if(o_ptr->name2 == EGO_ACCURACY)
4446 while(o_ptr->to_h < o_ptr->to_d + 10)
4451 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4454 /* Accuracy ego must have high to_h */
4455 if(o_ptr->name2 == EGO_VELOCITY)
4457 while(o_ptr->to_d < o_ptr->to_h + 10)
4462 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4465 /* Protection ego must have high to_a */
4466 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4468 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4471 /* Hack -- obtain pval */
4472 if (e_ptr->max_pval)
4474 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4477 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4479 else if (o_ptr->name2 == EGO_DEMON)
4481 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4483 o_ptr->pval += randint1(2);
4487 o_ptr->pval += randint1(e_ptr->max_pval);
4490 else if (o_ptr->name2 == EGO_ATTACKS)
4492 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4493 if (o_ptr->pval > 3) o_ptr->pval = 3;
4494 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4495 o_ptr->pval += randint1(2);
4497 else if (o_ptr->name2 == EGO_BAT)
4499 o_ptr->pval = randint1(e_ptr->max_pval);
4500 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4502 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4504 o_ptr->pval = randint1(e_ptr->max_pval);
4508 o_ptr->pval += randint1(e_ptr->max_pval);
4513 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4515 o_ptr->pval = randint1(o_ptr->pval);
4517 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4524 /* Examine real objects */
4527 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4529 /* Hack -- acquire "broken" flag */
4530 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4532 /* Hack -- acquire "cursed" flag */
4533 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4534 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4535 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4536 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4537 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4538 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4546 * @brief ベースアイテムが上質として扱われるかどうかを返す。
4547 * Hack -- determine if a template is "good"
4548 * @param k_idx 判定したいベースアイテムのID
4549 * @return ベースアイテムが上質ならばTRUEを返す。
4551 static bool kind_is_good(KIND_OBJECT_IDX k_idx)
4553 object_kind *k_ptr = &k_info[k_idx];
4555 /* Analyze the item type */
4556 switch (k_ptr->tval)
4558 /* Armor -- Good unless damaged */
4569 if (k_ptr->to_a < 0) return (FALSE);
4573 /* Weapons -- Good unless damaged */
4580 if (k_ptr->to_h < 0) return (FALSE);
4581 if (k_ptr->to_d < 0) return (FALSE);
4585 /* Ammo -- Arrows/Bolts are good */
4592 /* Books -- High level books are good (except Arcane books) */
4594 case TV_SORCERY_BOOK:
4595 case TV_NATURE_BOOK:
4600 case TV_DAEMON_BOOK:
4601 case TV_CRUSADE_BOOK:
4603 case TV_HISSATSU_BOOK:
4606 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4610 /* Rings -- Rings of Speed are good */
4613 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4614 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4618 /* Amulets -- Amulets of the Magi and Resistance are good */
4621 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4622 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4627 /* Assume not good */
4632 * @brief 生成階に応じたベースアイテムの生成を行う。
4633 * Attempt to make an object (normal or good/great)
4634 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4635 * @param mode オプションフラグ
4636 * @return 生成に成功したらTRUEを返す。
4638 * This routine plays nasty games to generate the "special artifacts".\n
4639 * This routine uses "object_level" for the "generation level".\n
4640 * We assume that the given object has been "wiped".\n
4642 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
4648 /* Chance of "special object" */
4649 prob = ((mode & AM_GOOD) ? 10 : 1000);
4651 /* Base level for the object */
4652 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4655 /* Generate a special object, or a normal object */
4656 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4658 KIND_OBJECT_IDX k_idx;
4661 if ((mode & AM_GOOD) && !get_obj_num_hook)
4663 /* Activate restriction (if already specified, use that) */
4664 get_obj_num_hook = kind_is_good;
4667 /* Restricted objects - prepare allocation table */
4668 if (get_obj_num_hook) get_obj_num_prep();
4670 /* Pick a random object */
4671 k_idx = get_obj_num(base);
4673 /* Restricted objects */
4674 if (get_obj_num_hook)
4676 /* Clear restriction */
4677 get_obj_num_hook = NULL;
4679 /* Reset allocation table to default */
4683 /* Handle failure */
4684 if (!k_idx) return (FALSE);
4686 /* Prepare the object */
4687 object_prep(j_ptr, k_idx);
4690 /* Apply magic (allow artifacts) */
4691 apply_magic(j_ptr, object_level, mode);
4693 /* Hack -- generate multiple spikes/missiles */
4694 switch (j_ptr->tval)
4702 j_ptr->number = (byte)damroll(6, 7);
4706 if (cheat_peek) object_mention(j_ptr);
4714 * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
4715 * Attempt to place an object (normal or good/great) at the given location.
4716 * @param y 配置したいフロアのY座標
4717 * @param x 配置したいフロアのX座標
4718 * @param mode オプションフラグ
4719 * @return 生成に成功したらTRUEを返す。
4721 * This routine plays nasty games to generate the "special artifacts".\n
4722 * This routine uses "object_level" for the "generation level".\n
4723 * This routine requires a clean floor grid destination.\n
4725 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
4730 grid_type *g_ptr = &grid_array[y][x];
4736 /* Paranoia -- check bounds */
4737 if (!in_bounds(y, x)) return;
4739 /* Require floor space */
4740 if (!cave_drop_bold(y, x)) return;
4742 /* Avoid stacking on other objects */
4743 if (g_ptr->o_idx) return;
4748 /* Make an object (if possible) */
4749 if (!make_object(q_ptr, mode)) return;
4752 /* Make an object */
4759 o_ptr = &o_list[o_idx];
4761 /* Structure Copy */
4762 object_copy(o_ptr, q_ptr);
4768 o_ptr->next_o_idx = g_ptr->o_idx;
4770 /* Place the object */
4771 g_ptr->o_idx = o_idx;
4779 /* Hack -- Preserve artifacts */
4780 if (object_is_fixed_artifact(q_ptr))
4782 a_info[q_ptr->name1].cur_num = 0;
4789 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
4790 * Make a treasure object
4791 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4792 * @return 生成に成功したらTRUEを返す。
4794 * The location must be a legal, clean, floor grid.
4796 bool make_gold(object_type *j_ptr)
4801 /* Hack -- Pick a Treasure variety */
4802 i = ((randint1(object_level + 2) + 2) / 2) - 1;
4804 /* Apply "extra" magic */
4805 if (one_in_(GREAT_OBJ))
4807 i += randint1(object_level + 1);
4810 /* Hack -- Creeping Coins only generate "themselves" */
4811 if (coin_type) i = coin_type;
4813 /* Do not create "illegal" Treasure Types */
4814 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
4816 /* Prepare a gold object */
4817 object_prep(j_ptr, OBJ_GOLD_LIST + i);
4819 /* Hack -- Base coin cost */
4820 base = k_info[OBJ_GOLD_LIST + i].cost;
4822 /* Determine how much the treasure is "worth" */
4823 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
4831 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
4832 * Places a treasure (Gold or Gems) at given location
4833 * @param y 配置したいフロアのY座標
4834 * @param x 配置したいフロアのX座標
4835 * @return 生成に成功したらTRUEを返す。
4837 * The location must be a legal, clean, floor grid.
4839 void place_gold(POSITION y, POSITION x)
4844 grid_type *g_ptr = &grid_array[y][x];
4850 /* Paranoia -- check bounds */
4851 if (!in_bounds(y, x)) return;
4853 /* Require floor space */
4854 if (!cave_drop_bold(y, x)) return;
4856 /* Avoid stacking on other objects */
4857 if (g_ptr->o_idx) return;
4862 /* Make some gold */
4863 if (!make_gold(q_ptr)) return;
4865 /* Make an object */
4872 o_ptr = &o_list[o_idx];
4874 /* Copy the object */
4875 object_copy(o_ptr, q_ptr);
4882 o_ptr->next_o_idx = g_ptr->o_idx;
4884 /* Place the object */
4885 g_ptr->o_idx = o_idx;
4895 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
4896 * Let an object fall to the ground at or near a location.
4897 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
4898 * @param chance ドロップの成功率(%)
4899 * @param y 配置したいフロアのY座標
4900 * @param x 配置したいフロアのX座標
4901 * @return 生成に成功したらオブジェクトのIDを返す。
4903 * The initial location is assumed to be "in_bounds()".\n
4905 * This function takes a parameter "chance". This is the percentage\n
4906 * chance that the item will "disappear" instead of drop. If the object\n
4907 * has been thrown, then this is the chance of disappearance on contact.\n
4909 * Hack -- this function uses "chance" to determine if it should produce\n
4910 * some form of "description" of the drop event (under the player).\n
4912 * We check several locations to see if we can find a location at which\n
4913 * the object can combine, stack, or be placed. Artifacts will try very\n
4914 * hard to be placed, including "teleporting" to a useful grid if needed.\n
4916 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
4923 POSITION ty, tx = 0;
4925 OBJECT_IDX o_idx = 0;
4926 OBJECT_IDX this_o_idx, next_o_idx = 0;
4930 GAME_TEXT o_name[MAX_NLEN];
4936 /* Extract plural */
4937 bool plural = (j_ptr->number != 1);
4940 /* Describe object */
4941 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
4944 /* Handle normal "breakage" */
4945 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
4948 msg_format("%sは消えた。", o_name);
4950 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
4953 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
4970 /* Scan local grids */
4971 for (dy = -3; dy <= 3; dy++)
4973 /* Scan local grids */
4974 for (dx = -3; dx <= 3; dx++)
4978 /* Calculate actual distance */
4979 d = (dy * dy) + (dx * dx);
4981 /* Ignore distant grids */
4982 if (d > 10) continue;
4987 /* Skip illegal grids */
4988 if (!in_bounds(ty, tx)) continue;
4990 /* Require line of projection */
4991 if (!projectable(y, x, ty, tx)) continue;
4994 g_ptr = &grid_array[ty][tx];
4996 /* Require floor space */
4997 if (!cave_drop_bold(ty, tx)) continue;
5002 /* Scan objects in that grid */
5003 for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5006 o_ptr = &o_list[this_o_idx];
5008 /* Acquire next object */
5009 next_o_idx = o_ptr->next_o_idx;
5011 /* Check for possible combination */
5012 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5018 /* Add new object */
5022 if (k > 99) continue;
5024 /* Calculate score */
5025 s = 1000 - (d + k * 5);
5027 /* Skip bad values */
5028 if (s < bs) continue;
5030 /* New best value */
5033 /* Apply the randomizer to equivalent values */
5034 if ((++bn >= 2) && !one_in_(bn)) continue;
5048 /* Handle lack of space */
5049 if (!flag && !object_is_artifact(j_ptr))
5052 msg_format("%sは消えた。", o_name);
5054 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5059 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5067 for (i = 0; !flag && (i < 1000); i++)
5070 ty = rand_spread(by, 1);
5071 tx = rand_spread(bx, 1);
5073 /* Verify location */
5074 if (!in_bounds(ty, tx)) continue;
5076 /* Bounce to that location */
5080 /* Require floor space */
5081 if (!cave_drop_bold(by, bx)) continue;
5089 int candidates = 0, pick;
5091 for (ty = 1; ty < cur_hgt - 1; ty++)
5093 for (tx = 1; tx < cur_wid - 1; tx++)
5095 /* A valid space found */
5096 if (cave_drop_bold(ty, tx)) candidates++;
5100 /* No valid place! */
5104 msg_format("%sは消えた。", o_name);
5106 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5110 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5112 /* Mega-Hack -- preserve artifacts */
5115 /* Hack -- Preserve unknown artifacts */
5116 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5118 /* Mega-Hack -- Preserve the artifact */
5119 a_info[j_ptr->name1].cur_num = 0;
5127 /* Choose a random one */
5128 pick = randint1(candidates);
5130 for (ty = 1; ty < cur_hgt - 1; ty++)
5132 for (tx = 1; tx < cur_wid - 1; tx++)
5134 if (cave_drop_bold(ty, tx))
5138 /* Is this a picked one? */
5151 g_ptr = &grid_array[by][bx];
5153 /* Scan objects in that grid for combination */
5154 for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5157 o_ptr = &o_list[this_o_idx];
5159 /* Acquire next object */
5160 next_o_idx = o_ptr->next_o_idx;
5162 /* Check for combination */
5163 if (object_similar(o_ptr, j_ptr))
5165 object_absorb(o_ptr, j_ptr);
5174 if (!done) o_idx = o_pop();
5177 if (!done && !o_idx)
5180 msg_format("%sは消えた。", o_name);
5182 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5186 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5188 /* Hack -- Preserve artifacts */
5189 if (object_is_fixed_artifact(j_ptr))
5191 a_info[j_ptr->name1].cur_num = 0;
5201 /* Structure copy */
5202 object_copy(&o_list[o_idx], j_ptr);
5204 /* Access new object */
5205 j_ptr = &o_list[o_idx];
5212 j_ptr->held_m_idx = 0;
5215 j_ptr->next_o_idx = g_ptr->o_idx;
5217 /* Place the object */
5218 g_ptr->o_idx = o_idx;
5228 /* Mega-Hack -- no message if "dropped" by player */
5229 /* Message when an object falls under the player */
5230 if (chance && player_bold(by, bx))
5232 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5239 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5240 * Describe the charges on an item in the inventory.
5241 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5244 void inven_item_charges(INVENTORY_IDX item)
5246 object_type *o_ptr = &inventory[item];
5248 /* Require staff/wand */
5249 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5251 /* Require known item */
5252 if (!object_is_known(o_ptr)) return;
5255 if (o_ptr->pval <= 0)
5257 msg_print("もう魔力が残っていない。");
5261 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5264 /* Multiple charges */
5265 if (o_ptr->pval != 1)
5267 msg_format("You have %d charges remaining.", o_ptr->pval);
5273 msg_format("You have %d charge remaining.", o_ptr->pval);
5280 * @brief アイテムの残り所持数メッセージを表示する /
5281 * Describe an item in the inventory.
5282 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5285 void inven_item_describe(INVENTORY_IDX item)
5287 object_type *o_ptr = &inventory[item];
5288 GAME_TEXT o_name[MAX_NLEN];
5290 object_desc(o_name, o_ptr, 0);
5293 /* "no more" の場合はこちらで表示する */
5294 if (o_ptr->number <= 0)
5296 /*FIRST*//*ここはもう通らないかも */
5297 msg_format("もう%sを持っていない。", o_name);
5301 /* アイテム名を英日切り替え機能対応 */
5302 msg_format("まだ %sを持っている。", o_name);
5305 msg_format("You have %s.", o_name);
5311 * @brief アイテムを増減させ残り所持数メッセージを表示する /
5312 * Increase the "number" of an item in the inventory
5313 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5317 void inven_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
5319 object_type *o_ptr = &inventory[item];
5322 num += o_ptr->number;
5325 if (num > 255) num = 255;
5326 else if (num < 0) num = 0;
5329 num -= o_ptr->number;
5331 /* Change the number and weight */
5334 /* Add the number */
5335 o_ptr->number += num;
5337 /* Add the weight */
5338 p_ptr->total_weight += (num * o_ptr->weight);
5339 p_ptr->update |= (PU_BONUS);
5341 /* Recalculate mana XXX */
5342 p_ptr->update |= (PU_MANA);
5343 p_ptr->update |= (PU_COMBINE);
5344 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5346 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5347 if (!o_ptr->number && p_ptr->ele_attack)
5349 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5351 if (!has_melee_weapon(INVEN_RARM + INVEN_LARM - item))
5353 /* Clear all temporary elemental brands */
5354 set_ele_attack(0, 0);
5362 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5363 * Erase an inventory slot if it has no more items
5364 * @param item 消去したいプレイヤーのアイテム所持スロット
5367 void inven_item_optimize(INVENTORY_IDX item)
5369 object_type *o_ptr = &inventory[item];
5371 /* Only optimize real items */
5372 if (!o_ptr->k_idx) return;
5374 /* Only optimize empty items */
5375 if (o_ptr->number) return;
5377 /* The item is in the pack */
5378 if (item < INVEN_RARM)
5385 /* Slide everything down */
5386 for (i = item; i < INVEN_PACK; i++)
5388 /* Structure copy */
5389 inventory[i] = inventory[i+1];
5392 /* Erase the "final" slot */
5393 object_wipe(&inventory[i]);
5395 p_ptr->window |= (PW_INVEN);
5398 /* The item is being wielded */
5404 /* Erase the empty slot */
5405 object_wipe(&inventory[item]);
5406 p_ptr->update |= (PU_BONUS);
5408 /* Recalculate torch */
5409 p_ptr->update |= (PU_TORCH);
5411 /* Recalculate mana XXX */
5412 p_ptr->update |= (PU_MANA);
5414 p_ptr->window |= (PW_EQUIP);
5417 p_ptr->window |= (PW_SPELL);
5421 * @brief 床上の魔道具の残り残量メッセージを表示する /
5422 * Describe the charges on an item on the floor.
5423 * @param item メッセージの対象にしたいアイテム所持スロット
5426 void floor_item_charges(INVENTORY_IDX item)
5428 object_type *o_ptr = &o_list[item];
5430 /* Require staff/wand */
5431 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5433 /* Require known item */
5434 if (!object_is_known(o_ptr)) return;
5437 if (o_ptr->pval <= 0)
5439 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5443 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5446 /* Multiple charges */
5447 if (o_ptr->pval != 1)
5449 msg_format("There are %d charges remaining.", o_ptr->pval);
5455 msg_format("There is %d charge remaining.", o_ptr->pval);
5462 * @brief 床上のアイテムの残り数メッセージを表示する /
5463 * Describe the charges on an item on the floor.
5464 * @param item メッセージの対象にしたいアイテム所持スロット
5467 void floor_item_describe(INVENTORY_IDX item)
5469 object_type *o_ptr = &o_list[item];
5470 GAME_TEXT o_name[MAX_NLEN];
5472 object_desc(o_name, o_ptr, 0);
5475 /* "no more" の場合はこちらで表示を分ける */
5476 if (o_ptr->number <= 0)
5478 msg_format("床上には、もう%sはない。", o_name);
5482 msg_format("床上には、まだ %sがある。", o_name);
5485 msg_format("You see %s.", o_name);
5492 * @brief 床上のアイテムの数を増やす /
5493 * Increase the "number" of an item on the floor
5494 * @param item 増やしたいアイテムの所持スロット
5495 * @param num 増やしたいアイテムの数
5498 void floor_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
5500 object_type *o_ptr = &o_list[item];
5503 num += o_ptr->number;
5506 if (num > 255) num = 255;
5507 else if (num < 0) num = 0;
5510 num -= o_ptr->number;
5512 /* Change the number */
5513 o_ptr->number += num;
5518 * @brief 床上の数の無くなったアイテムスロットを消去する /
5519 * Optimize an item on the floor (destroy "empty" items)
5520 * @param item 消去したいアイテムの所持スロット
5523 void floor_item_optimize(INVENTORY_IDX item)
5525 object_type *o_ptr = &o_list[item];
5527 /* Paranoia -- be sure it exists */
5528 if (!o_ptr->k_idx) return;
5530 /* Only optimize empty items */
5531 if (o_ptr->number) return;
5533 delete_object_idx(item);
5538 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5539 * Check if we have space for an item in the pack without overflow
5540 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5541 * @return 溢れずに済むならTRUEを返す
5543 bool inven_carry_okay(object_type *o_ptr)
5548 if (inven_cnt < INVEN_PACK) return (TRUE);
5551 for (j = 0; j < INVEN_PACK; j++)
5553 object_type *j_ptr = &inventory[j];
5555 /* Skip non-objects */
5556 if (!j_ptr->k_idx) continue;
5558 /* Check if the two items can be combined */
5559 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5566 * @brief オブジェクトを定義された基準に従いソートするための関数 /
5567 * Check if we have space for an item in the pack without overflow
5568 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
5569 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
5570 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
5571 * @return o_ptrの方が上位ならばTRUEを返す。
5573 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5577 /* Use empty slots */
5578 if (!j_ptr->k_idx) return TRUE;
5580 /* Hack -- readable books always come first */
5581 if ((o_ptr->tval == REALM1_BOOK) &&
5582 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5583 if ((j_ptr->tval == REALM1_BOOK) &&
5584 (o_ptr->tval != REALM1_BOOK)) return FALSE;
5586 if ((o_ptr->tval == REALM2_BOOK) &&
5587 (j_ptr->tval != REALM2_BOOK)) return TRUE;
5588 if ((j_ptr->tval == REALM2_BOOK) &&
5589 (o_ptr->tval != REALM2_BOOK)) return FALSE;
5591 /* Objects sort by decreasing type */
5592 if (o_ptr->tval > j_ptr->tval) return TRUE;
5593 if (o_ptr->tval < j_ptr->tval) return FALSE;
5595 /* Non-aware (flavored) items always come last */
5596 /* Can happen in the home */
5597 if (!object_is_aware(o_ptr)) return FALSE;
5598 if (!object_is_aware(j_ptr)) return TRUE;
5600 /* Objects sort by increasing sval */
5601 if (o_ptr->sval < j_ptr->sval) return TRUE;
5602 if (o_ptr->sval > j_ptr->sval) return FALSE;
5604 /* Unidentified objects always come last */
5605 /* Objects in the home can be unknown */
5606 if (!object_is_known(o_ptr)) return FALSE;
5607 if (!object_is_known(j_ptr)) return TRUE;
5609 /* Fixed artifacts, random artifacts and ego items */
5610 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
5611 else if (o_ptr->art_name) o_type = 2;
5612 else if (object_is_ego(o_ptr)) o_type = 1;
5615 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
5616 else if (j_ptr->art_name) j_type = 2;
5617 else if (object_is_ego(j_ptr)) j_type = 1;
5620 if (o_type < j_type) return TRUE;
5621 if (o_type > j_type) return FALSE;
5623 switch (o_ptr->tval)
5629 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
5630 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
5636 /* Objects sort by increasing hit/damage bonuses */
5637 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
5638 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
5641 /* Hack: otherwise identical rods sort by
5642 increasing recharge time --dsb */
5644 if (o_ptr->pval < j_ptr->pval) return TRUE;
5645 if (o_ptr->pval > j_ptr->pval) return FALSE;
5649 /* Objects sort by decreasing value */
5650 return o_value > object_value(j_ptr);
5655 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
5656 * Add an item to the players inventory, and return the slot used.
5657 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
5658 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
5660 * If the new item can combine with an existing item in the inventory,\n
5661 * it will do so, using "object_similar()" and "object_absorb()", else,\n
5662 * the item will be placed into the "proper" location in the inventory.\n
5664 * This function can be used to "over-fill" the player's pack, but only\n
5665 * once, and such an action must trigger the "overflow" code immediately.\n
5666 * Note that when the pack is being "over-filled", the new item must be\n
5667 * placed into the "overflow" slot, and the "overflow" must take place\n
5668 * before the pack is reordered, but (optionally) after the pack is\n
5669 * combined. This may be tricky. See "dungeon.c" for info.\n
5671 * Note that this code must remove any location/stack information\n
5672 * from the object once it is placed into the inventory.\n
5674 s16b inven_carry(object_type *o_ptr)
5676 INVENTORY_IDX i, j, k;
5677 INVENTORY_IDX n = -1;
5682 /* Check for combining */
5683 for (j = 0; j < INVEN_PACK; j++)
5685 j_ptr = &inventory[j];
5687 /* Skip non-objects */
5688 if (!j_ptr->k_idx) continue;
5690 /* Hack -- track last item */
5693 /* Check if the two items can be combined */
5694 if (object_similar(j_ptr, o_ptr))
5696 object_absorb(j_ptr, o_ptr);
5698 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
5699 p_ptr->update |= (PU_BONUS);
5700 p_ptr->window |= (PW_INVEN);
5709 if (inven_cnt > INVEN_PACK) return (-1);
5711 /* Find an empty slot */
5712 for (j = 0; j <= INVEN_PACK; j++)
5714 j_ptr = &inventory[j];
5716 /* Use it if found */
5717 if (!j_ptr->k_idx) break;
5724 /* Reorder the pack */
5727 /* Get the "value" of the item */
5728 s32b o_value = object_value(o_ptr);
5730 /* Scan every occupied slot */
5731 for (j = 0; j < INVEN_PACK; j++)
5733 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
5740 for (k = n; k >= i; k--)
5742 /* Hack -- Slide the item */
5743 object_copy(&inventory[k+1], &inventory[k]);
5746 /* Wipe the empty slot */
5747 object_wipe(&inventory[i]);
5752 object_copy(&inventory[i], o_ptr);
5754 /* Access new object */
5755 j_ptr = &inventory[i];
5758 j_ptr->next_o_idx = 0;
5760 /* Forget monster */
5761 j_ptr->held_m_idx = 0;
5763 /* Forget location */
5764 j_ptr->iy = j_ptr->ix = 0;
5766 /* Player touches it, and no longer marked */
5767 j_ptr->marked = OM_TOUCHED;
5769 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
5771 /* Count the items */
5773 p_ptr->update |= (PU_BONUS | PU_COMBINE | PU_REORDER);
5774 p_ptr->window |= (PW_INVEN);
5776 /* Return the slot */
5782 * @brief 装備スロットからオブジェクトを外すメインルーチン /
5783 * Take off (some of) a non-cursed equipment item
5784 * @param item オブジェクトを外したい所持テーブルのID
5786 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
5788 * Note that only one item at a time can be wielded per slot.\n
5789 * Note that taking off an item when "full" may cause that item\n
5790 * to fall to the ground.\n
5791 * Return the inventory slot into which the item is placed.\n
5793 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
5804 GAME_TEXT o_name[MAX_NLEN];
5807 /* Get the item to take off */
5808 o_ptr = &inventory[item];
5811 if (amt <= 0) return (-1);
5814 if (amt > o_ptr->number) amt = o_ptr->number;
5817 /* Obtain a local object */
5818 object_copy(q_ptr, o_ptr);
5820 /* Modify quantity */
5821 q_ptr->number = amt;
5823 object_desc(o_name, q_ptr, 0);
5825 /* Took off weapon */
5826 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
5827 object_is_melee_weapon(o_ptr))
5829 act = _("を装備からはずした", "You were wielding");
5833 else if (item == INVEN_BOW)
5835 act = _("を装備からはずした", "You were holding");
5838 /* Took off light */
5839 else if (item == INVEN_LITE)
5841 act = _("を光源からはずした", "You were holding");
5844 /* Took off something */
5847 act = _("を装備からはずした", "You were wearing");
5850 /* Modify, Optimize */
5851 inven_item_increase(item, -amt);
5852 inven_item_optimize(item);
5854 /* Carry the object */
5855 slot = inven_carry(q_ptr);
5858 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
5860 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
5870 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
5871 * Drop (some of) a non-cursed inventory/equipment item
5872 * @param item 所持テーブルのID
5873 * @param amt 落としたい個数
5876 * The object will be dropped "near" the current location
5878 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
5884 GAME_TEXT o_name[MAX_NLEN];
5886 /* Access original object */
5887 o_ptr = &inventory[item];
5890 if (amt <= 0) return;
5893 if (amt > o_ptr->number) amt = o_ptr->number;
5895 /* Take off equipment */
5896 if (item >= INVEN_RARM)
5898 /* Take off first */
5899 item = inven_takeoff(item, amt);
5901 /* Access original object */
5902 o_ptr = &inventory[item];
5907 /* Obtain local object */
5908 object_copy(q_ptr, o_ptr);
5910 /* Distribute charges of wands or rods */
5911 distribute_charges(o_ptr, q_ptr, amt);
5913 /* Modify quantity */
5914 q_ptr->number = amt;
5916 /* Describe local object */
5917 object_desc(o_name, q_ptr, 0);
5919 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
5921 /* Drop it near the player */
5922 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
5924 /* Modify, Describe, Optimize */
5925 inven_item_increase(item, -amt);
5926 inven_item_describe(item);
5927 inven_item_optimize(item);
5932 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
5933 * Combine items in the pack
5936 * Note special handling of the "overflow" slot
5938 void combine_pack(void)
5943 bool flag = FALSE, combined;
5949 /* Combine the pack (backwards) */
5950 for (i = INVEN_PACK; i > 0; i--)
5952 o_ptr = &inventory[i];
5954 /* Skip empty items */
5955 if (!o_ptr->k_idx) continue;
5957 /* Scan the items above that item */
5958 for (j = 0; j < i; j++)
5962 j_ptr = &inventory[j];
5964 /* Skip empty items */
5965 if (!j_ptr->k_idx) continue;
5968 * Get maximum number of the stack if these
5969 * are similar, get zero otherwise.
5971 max_num = object_similar_part(j_ptr, o_ptr);
5973 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
5974 if (max_num && j_ptr->number < max_num)
5976 if (o_ptr->number + j_ptr->number <= max_num)
5981 /* Add together the item counts */
5982 object_absorb(j_ptr, o_ptr);
5984 /* One object is gone */
5987 /* Slide everything down */
5988 for (k = i; k < INVEN_PACK; k++)
5990 /* Structure copy */
5991 inventory[k] = inventory[k+1];
5994 /* Erase the "final" slot */
5995 object_wipe(&inventory[k]);
5999 int old_num = o_ptr->number;
6000 int remain = j_ptr->number + o_ptr->number - max_num;
6002 o_ptr->number -= remain;
6004 /* Add together the item counts */
6005 object_absorb(j_ptr, o_ptr);
6007 o_ptr->number = remain;
6009 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6010 if (o_ptr->tval == TV_ROD)
6012 o_ptr->pval = o_ptr->pval * remain / old_num;
6013 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6016 /* Hack -- if wands are stacking, combine the charges. -LM- */
6017 if (o_ptr->tval == TV_WAND)
6019 o_ptr->pval = o_ptr->pval * remain / old_num;
6023 p_ptr->window |= (PW_INVEN);
6035 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6039 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6040 * Reorder items in the pack
6043 * Note special handling of the "overflow" slot
6045 void reorder_pack(void)
6055 /* Re-order the pack (forwards) */
6056 for (i = 0; i < INVEN_PACK; i++)
6058 /* Mega-Hack -- allow "proper" over-flow */
6059 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6061 o_ptr = &inventory[i];
6063 /* Skip empty slots */
6064 if (!o_ptr->k_idx) continue;
6066 /* Get the "value" of the item */
6067 o_value = object_value(o_ptr);
6069 /* Scan every occupied slot */
6070 for (j = 0; j < INVEN_PACK; j++)
6072 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6075 /* Never move down */
6076 if (j >= i) continue;
6082 /* Save a copy of the moving item */
6083 object_copy(q_ptr, &inventory[i]);
6085 /* Slide the objects */
6086 for (k = i; k > j; k--)
6088 /* Slide the item */
6089 object_copy(&inventory[k], &inventory[k-1]);
6092 /* Insert the moving item */
6093 object_copy(&inventory[j], q_ptr);
6095 p_ptr->window |= (PW_INVEN);
6098 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6102 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6103 * Hack -- display an object kind in the current window
6104 * @param k_idx ベースアイテムの参照ID
6107 * Include list of usable spells for readible books
6109 void display_koff(KIND_OBJECT_IDX k_idx)
6116 REALM_IDX use_realm;
6118 GAME_TEXT o_name[MAX_NLEN];
6121 /* Erase the window */
6122 for (y = 0; y < Term->hgt; y++)
6124 /* Erase the line */
6125 Term_erase(0, y, 255);
6132 /* Prepare the object */
6133 object_prep(q_ptr, k_idx);
6134 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6136 /* Mention the object name */
6137 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6139 /* Access the item's sval */
6141 use_realm = tval2realm(q_ptr->tval);
6143 /* Warriors are illiterate */
6144 if (p_ptr->realm1 || p_ptr->realm2)
6146 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6150 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6151 if (!is_magic(use_realm)) return;
6152 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6155 /* Display spells in readible books */
6159 SPELL_IDX spells[64];
6161 /* Extract spells */
6162 for (spell = 0; spell < 32; spell++)
6164 /* Check for this spell */
6165 if (fake_spell_flags[sval] & (1L << spell))
6167 /* Collect this spell */
6168 spells[num++] = spell;
6173 print_spells(0, spells, num, 2, 0, use_realm);
6178 * @brief 警告を放つアイテムを選択する /
6179 * Choose one of items that have warning flag
6180 * Calculate spell damages
6183 object_type *choose_warning_item(void)
6186 int choices[INVEN_TOTAL - INVEN_RARM];
6189 /* Paranoia -- Player has no warning ability */
6190 if (!p_ptr->warning) return NULL;
6192 /* Search Inventory */
6193 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6195 BIT_FLAGS flgs[TR_FLAG_SIZE];
6196 object_type *o_ptr = &inventory[i];
6198 object_flags(o_ptr, flgs);
6199 if (have_flag(flgs, TR_WARNING))
6201 choices[number] = i;
6206 /* Choice one of them */
6207 return number ? &inventory[choices[randint0(number)]] : NULL;
6211 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6212 * Calculate spell damages
6213 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6214 * @param typ 効果属性のID
6216 * @param max 算出した最大ダメージを返すポインタ
6219 static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
6221 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6222 int rlev = r_ptr->level;
6223 bool ignore_wraith_form = FALSE;
6225 /* Vulnerability, resistance and immunity */
6229 if (p_ptr->immune_elec)
6232 ignore_wraith_form = TRUE;
6236 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6237 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6238 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6239 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6240 if (IS_OPPOSE_ELEC())
6241 dam = (dam + 2) / 3;
6246 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6247 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6251 if (p_ptr->immune_acid)
6254 ignore_wraith_form = TRUE;
6258 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6259 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6260 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6261 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6267 if (p_ptr->immune_cold)
6270 ignore_wraith_form = TRUE;
6274 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6275 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6276 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6277 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6282 if (p_ptr->immune_fire)
6285 ignore_wraith_form = TRUE;
6289 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6290 if (prace_is_(RACE_ENT)) dam += dam / 3;
6291 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6292 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6293 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6298 ignore_wraith_form = TRUE;
6302 if (!p_ptr->blind &&
6303 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6304 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6307 ignore_wraith_form = TRUE;
6312 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6313 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6314 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6317 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6318 * "dam *= 2;" for later "dam /= 2"
6320 if (p_ptr->wraith_form) dam *= 2;
6324 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6327 ignore_wraith_form = TRUE;
6329 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6333 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6337 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6341 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6345 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6349 if (prace_is_(RACE_SPECTRE))
6352 ignore_wraith_form = TRUE;
6354 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6358 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6362 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6366 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6370 if (p_ptr->levitation) dam = (dam * 2) / 3;
6374 if (p_ptr->resist_shard) dam /= 2;
6378 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6379 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6383 if (p_ptr->mimic_form)
6385 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6388 ignore_wraith_form = TRUE;
6393 switch (p_ptr->prace)
6402 ignore_wraith_form = TRUE;
6409 if (p_ptr->align > 10) dam /= 2;
6410 else if (p_ptr->align < -10) dam *= 2;
6414 if (p_ptr->align > 10) dam *= 2;
6418 case GF_BRAIN_SMASH:
6419 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6422 ignore_wraith_form = TRUE;
6430 if (100 + rlev / 2 <= p_ptr->skill_sav)
6433 ignore_wraith_form = TRUE;
6438 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6441 ignore_wraith_form = TRUE;
6446 if (p_ptr->wraith_form && !ignore_wraith_form)
6452 if (dam > *max) *max = dam;
6456 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6457 * Calculate spell damages
6458 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6459 * @param typ 効果属性のID
6460 * @param m_idx 魔法を行使するモンスターのID
6461 * @param max 算出した最大ダメージを返すポインタ
6464 void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
6466 monster_type *m_ptr = &m_list[m_idx];
6467 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6468 spell_damcalc(m_ptr, typ, dam, max);
6472 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6473 * Calculate blow damages
6474 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6475 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6476 * @return 算出された最大ダメージを返す。
6478 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6480 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6482 bool check_wraith_form = TRUE;
6484 if (blow_ptr->method != RBM_EXPLODE)
6486 ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
6488 switch (blow_ptr->effect)
6492 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6493 dam = MAX(dam, tmp_dam * 2);
6499 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6503 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6505 check_wraith_form = FALSE;
6509 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6511 check_wraith_form = FALSE;
6515 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6517 check_wraith_form = FALSE;
6521 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6523 check_wraith_form = FALSE;
6528 check_wraith_form = FALSE;
6532 if (check_wraith_form && p_ptr->wraith_form)
6540 dam = (dam + 1) / 2;
6541 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
6549 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
6550 * Examine the grid (xx,yy) and warn the player if there are any danger
6551 * @param xx 危険性を調査するマスのX座標
6552 * @param yy 危険性を調査するマスのY座標
6553 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
6555 bool process_warning(POSITION xx, POSITION yy)
6559 GAME_TEXT o_name[MAX_NLEN];
6561 #define WARNING_AWARE_RANGE 12
6563 static int old_damage = 0;
6565 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
6567 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
6570 monster_type *m_ptr;
6571 monster_race *r_ptr;
6573 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
6575 g_ptr = &grid_array[my][mx];
6577 if (!g_ptr->m_idx) continue;
6579 m_ptr = &m_list[g_ptr->m_idx];
6581 if (MON_CSLEEP(m_ptr)) continue;
6582 if (!is_hostile(m_ptr)) continue;
6584 r_ptr = &r_info[m_ptr->r_idx];
6586 /* Monster spells (only powerful ones)*/
6587 if (projectable(my, mx, yy, xx))
6589 BIT_FLAGS f4 = r_ptr->flags4;
6590 BIT_FLAGS f5 = r_ptr->a_ability_flags1;
6591 BIT_FLAGS f6 = r_ptr->a_ability_flags2;
6593 if (!(d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC))
6595 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, g_ptr->m_idx, &dam_max0);
6596 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, g_ptr->m_idx, &dam_max0);
6597 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, g_ptr->m_idx, &dam_max0);
6598 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, g_ptr->m_idx, &dam_max0);
6599 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, g_ptr->m_idx, &dam_max0);
6600 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, g_ptr->m_idx, &dam_max0);
6602 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, g_ptr->m_idx, &dam_max0);
6603 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, g_ptr->m_idx, &dam_max0);
6604 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, g_ptr->m_idx, &dam_max0);
6605 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, g_ptr->m_idx, &dam_max0);
6606 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, g_ptr->m_idx, &dam_max0);
6607 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, g_ptr->m_idx, &dam_max0);
6608 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, g_ptr->m_idx, &dam_max0);
6609 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, g_ptr->m_idx, &dam_max0);
6610 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, g_ptr->m_idx, &dam_max0);
6611 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, g_ptr->m_idx, &dam_max0);
6612 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, g_ptr->m_idx, &dam_max0);
6613 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, g_ptr->m_idx, &dam_max0);
6614 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, g_ptr->m_idx, &dam_max0);
6615 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, g_ptr->m_idx, &dam_max0);
6616 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, g_ptr->m_idx, &dam_max0);
6617 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, g_ptr->m_idx, &dam_max0);
6618 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, g_ptr->m_idx, &dam_max0);
6619 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, g_ptr->m_idx, &dam_max0);
6620 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, g_ptr->m_idx, &dam_max0);
6621 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, g_ptr->m_idx, &dam_max0);
6622 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, g_ptr->m_idx, &dam_max0);
6623 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, g_ptr->m_idx, &dam_max0);
6624 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, g_ptr->m_idx, &dam_max0);
6627 /* Monster melee attacks */
6628 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE))
6630 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
6634 for (m = 0; m < 4; m++)
6636 /* Skip non-attacks */
6637 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
6639 /* Extract the attack info */
6640 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
6641 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
6643 if (dam_melee > dam_max0) dam_max0 = dam_melee;
6647 /* Contribution from this monster */
6648 dam_max += dam_max0;
6652 /* Prevent excessive warning */
6653 if (dam_max > old_damage)
6655 old_damage = dam_max * 3 / 2;
6657 if (dam_max > p_ptr->chp / 2)
6659 object_type *o_ptr = choose_warning_item();
6662 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6664 strcpy(o_name, _("体", "body")); /* Warning ability without item */
6665 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
6667 disturb(FALSE, TRUE);
6668 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
6671 else old_damage = old_damage / 2;
6673 g_ptr = &grid_array[yy][xx];
6674 if (((!easy_disarm && is_trap(g_ptr->feat))
6675 || (g_ptr->mimic && is_trap(g_ptr->feat))) && !one_in_(13))
6677 object_type *o_ptr = choose_warning_item();
6680 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6682 strcpy(o_name, _("体", "body")); /* Warning ability without item */
6683 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
6684 disturb(FALSE, TRUE);
6685 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
6692 * エッセンス情報の構造体 / A structure for smithing
6695 int add; /* TR flag number or special essence id */
6696 concptr add_name; /* Name of this ability */
6697 ESSENCE_IDX type; /* Menu number */
6698 int essence; /* Index for carrying essences */
6699 int value; /* Needed value to add this ability */
6704 * エッセンス情報テーブル Smithing type data for Weapon smith
6707 static essence_type essence_info[] =
6709 {TR_STR, "腕力", 4, TR_STR, 20},
6710 {TR_INT, "知能", 4, TR_INT, 20},
6711 {TR_WIS, "賢さ", 4, TR_WIS, 20},
6712 {TR_DEX, "器用さ", 4, TR_DEX, 20},
6713 {TR_CON, "耐久力", 4, TR_CON, 20},
6714 {TR_CHR, "魅力", 4, TR_CHR, 20},
6715 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
6716 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
6717 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
6718 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
6719 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
6720 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
6721 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
6722 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
6723 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
6724 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
6725 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
6726 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
6727 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
6728 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
6729 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
6730 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
6731 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
6732 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
6733 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
6734 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
6735 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
6736 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
6737 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
6738 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
6739 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
6740 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
6741 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
6742 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
6743 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
6744 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
6745 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
6746 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
6747 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
6748 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
6749 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
6750 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
6751 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
6752 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
6753 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
6754 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
6755 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
6756 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
6757 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
6758 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
6759 {TR_SH_FIRE, "", 0, -2, 0},
6760 {TR_SH_ELEC, "", 0, -2, 0},
6761 {TR_SH_COLD, "", 0, -2, 0},
6762 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
6763 {TR_WARNING, "警告", 3, TR_WARNING, 20},
6764 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
6765 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
6766 {TR_LITE_2, "", 0, -2, 0},
6767 {TR_LITE_3, "", 0, -2, 0},
6768 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
6769 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
6770 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
6771 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
6772 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
6774 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
6775 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
6776 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
6777 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
6778 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
6779 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
6780 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
6781 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
6782 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
6783 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
6784 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
6785 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
6786 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
6787 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
6788 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
6789 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
6790 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
6791 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
6793 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
6794 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
6795 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
6796 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
6797 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
6798 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
6799 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
6800 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
6802 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
6803 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
6804 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
6805 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
6806 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
6807 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
6808 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
6809 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
6810 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
6811 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
6812 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
6813 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
6815 {-1, NULL, 0, -1, 0}
6818 static essence_type essence_info[] =
6820 {TR_STR, "strength", 4, TR_STR, 20},
6821 {TR_INT, "intelligence", 4, TR_INT, 20},
6822 {TR_WIS, "wisdom", 4, TR_WIS, 20},
6823 {TR_DEX, "dexterity", 4, TR_DEX, 20},
6824 {TR_CON, "constitution", 4, TR_CON, 20},
6825 {TR_CHR, "charisma", 4, TR_CHR, 20},
6826 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
6827 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
6828 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
6829 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
6830 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
6831 {TR_SPEED, "speed", 4, TR_SPEED, 12},
6832 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
6833 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
6834 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
6835 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
6836 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
6837 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
6838 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
6839 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
6840 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
6841 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
6842 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
6843 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
6844 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
6845 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
6846 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
6847 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
6848 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
6849 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
6850 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
6851 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
6852 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
6853 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
6854 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
6855 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
6856 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
6857 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
6858 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
6859 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
6860 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
6861 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
6862 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
6863 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
6864 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
6865 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
6866 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
6867 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
6868 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
6869 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
6870 {TR_SH_FIRE, "", 0, -2, 0},
6871 {TR_SH_ELEC, "", 0, -2, 0},
6872 {TR_SH_COLD, "", 0, -2, 0},
6873 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
6874 {TR_WARNING, "warning", 3, TR_WARNING, 20},
6875 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
6876 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
6877 {TR_LITE_2, "", 0, -2, 0},
6878 {TR_LITE_3, "", 0, -2, 0},
6879 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
6880 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
6881 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
6882 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
6883 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
6885 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
6886 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
6887 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
6888 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
6889 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
6890 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
6891 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
6892 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
6893 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
6894 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
6895 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
6896 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
6897 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
6898 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
6899 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
6900 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
6901 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
6902 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
6904 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
6905 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
6906 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
6907 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
6908 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
6909 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
6910 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
6911 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
6913 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
6914 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
6915 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
6916 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
6917 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
6918 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
6919 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
6920 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
6921 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
6922 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
6923 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
6924 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
6926 {-1, NULL, 0, -1, 0}
6932 * エッセンス名テーブル / Essense names for Weapon smith
6935 concptr essence_name[] =
7038 concptr essence_name[] =
7141 * @brief 所持しているエッセンス一覧を表示する
7144 static void display_essence(void)
7149 for (i = 1; i < 22; i++)
7153 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7154 "Essence Num Essence Num Essence Num "), 1, 8);
7155 for (i = 0; essence_name[i]; i++)
7157 if (!essence_name[i][0]) continue;
7158 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7161 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7171 static void drain_essence(void)
7173 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7177 bool observe = FALSE;
7178 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7179 TIME_EFFECT old_timeout;
7180 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7186 OBJECT_IDX next_o_idx;
7189 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7192 item_tester_hook = object_is_weapon_armour_ammo;
7194 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7195 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7197 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT));
7200 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7202 GAME_TEXT o_name[MAX_NLEN];
7203 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7204 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7207 take_turn(p_ptr, 100);;
7209 object_flags(o_ptr, old_flgs);
7210 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7211 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7212 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7213 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7214 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7215 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7216 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7217 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7218 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7220 old_to_a = o_ptr->to_a;
7222 old_to_h = o_ptr->to_h;
7223 old_to_d = o_ptr->to_d;
7226 old_pval = o_ptr->pval;
7227 old_name2 = o_ptr->name2;
7228 old_timeout = o_ptr->timeout;
7229 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7230 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7231 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7232 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7233 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7234 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7235 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7236 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7237 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7238 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7239 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7240 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7241 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7242 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7243 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7244 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7245 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7246 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7247 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7251 next_o_idx = o_ptr->next_o_idx;
7252 marked = o_ptr->marked;
7253 weight = o_ptr->weight;
7254 number = o_ptr->number;
7256 object_prep(o_ptr, o_ptr->k_idx);
7260 o_ptr->next_o_idx=next_o_idx;
7261 o_ptr->marked=marked;
7262 o_ptr->number = number;
7263 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7264 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7265 o_ptr->ident |= (IDENT_MENTAL);
7266 object_aware(o_ptr);
7267 object_known(o_ptr);
7269 object_flags(o_ptr, new_flgs);
7271 for (i = 0; essence_info[i].add_name; i++)
7273 essence_type *es_ptr = &essence_info[i];
7274 PARAMETER_VALUE pval = 0;
7276 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7277 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7279 if (es_ptr->add < TR_FLAG_MAX &&
7280 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7281 have_flag(old_flgs, es_ptr->add))
7285 drain_value[es_ptr->essence] += 10 * pval;
7287 else if (es_ptr->essence != -2)
7289 drain_value[es_ptr->essence] += 10;
7291 else if (es_ptr->add == TR_SH_FIRE)
7293 drain_value[TR_BRAND_FIRE] += 10;
7294 drain_value[TR_RES_FIRE] += 10;
7296 else if (es_ptr->add == TR_SH_ELEC)
7298 drain_value[TR_BRAND_ELEC] += 10;
7299 drain_value[TR_RES_ELEC] += 10;
7301 else if (es_ptr->add == TR_SH_COLD)
7303 drain_value[TR_BRAND_COLD] += 10;
7304 drain_value[TR_RES_COLD] += 10;
7306 else if (es_ptr->add == TR_LITE_2)
7308 drain_value[TR_LITE_1] += 20;
7310 else if (es_ptr->add == TR_LITE_3)
7312 drain_value[TR_LITE_1] += 30;
7317 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7319 drain_value[TR_INT] += 5;
7320 drain_value[TR_WIS] += 5;
7322 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7324 drain_value[TR_BRAND_POIS] += 5;
7325 drain_value[TR_BRAND_ACID] += 5;
7326 drain_value[TR_BRAND_ELEC] += 5;
7327 drain_value[TR_BRAND_FIRE] += 5;
7328 drain_value[TR_BRAND_COLD] += 5;
7330 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7332 drain_value[TR_INT] += 10;
7334 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7336 drain_value[TR_STR] += 10;
7338 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7340 drain_value[TR_DEX] += 10;
7342 if (old_name2 == EGO_2WEAPON)
7344 drain_value[TR_DEX] += 20;
7346 if (object_is_weapon_ammo(o_ptr))
7348 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7350 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7352 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7353 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7354 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7355 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7357 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7359 drain_value[i] *= number;
7360 drain_value[i] = drain_value[i] * dec / 4;
7361 drain_value[i] = MAX(drain_value[i], 0);
7362 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7370 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7374 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7376 for (i = 0; essence_name[i]; i++)
7378 if (!essence_name[i][0]) continue;
7379 if (!drain_value[i]) continue;
7381 p_ptr->magic_num1[i] += drain_value[i];
7382 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7384 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7388 /* Apply autodestroy/inscription to the drained item */
7389 autopick_alter_item(item, TRUE);
7390 p_ptr->update |= (PU_COMBINE | PU_REORDER);
7391 p_ptr->window |= (PW_INVEN);
7395 * @brief 付加するエッセンスの大別を選択する
7396 * @return 選んだエッセンスの大別ID
7398 static COMMAND_CODE choose_essence(void)
7400 COMMAND_CODE mode = 0;
7402 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7405 concptr menu_name[] = {
7415 concptr menu_name[] = {
7425 const COMMAND_CODE mode_max = 7;
7427 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7437 for (i = 0; i < mode_max; i++)
7439 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7440 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7442 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7443 prt("Choose from menu.", 0, 0);
7462 menu_line += mode_max - 1;
7471 if (menu_line > mode_max) menu_line -= mode_max;
7482 for (i = 0; i < mode_max; i++)
7483 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7485 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7491 if (isupper(choice)) choice = (char)tolower(choice);
7493 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7494 mode = (int)choice - 'a' + 1;
7504 * @brief エッセンスを実際に付加する
7505 * @param mode エッセンスの大別ID
7508 static void add_essence(ESSENCE_IDX mode)
7520 GAME_TEXT o_name[MAX_NLEN];
7522 essence_type *es_ptr;
7523 bool able[22] = { 0 };
7525 int menu_line = (use_menu ? 1 : 0);
7527 for (i = 0; essence_info[i].add_name; i++)
7529 es_ptr = &essence_info[i];
7531 if (es_ptr->type != mode) continue;
7535 if (!repeat_pull(&i) || i<0 || i>=max_num)
7538 /* Nothing chosen yet */
7544 /* Build a prompt */
7545 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
7546 if (use_menu) screen_save();
7548 /* Get a spell from the user */
7550 choice = (always_show_list || use_menu) ? ESCAPE:1;
7553 if( choice==ESCAPE ) choice = ' ';
7554 else if( !get_com(out_val, &choice, FALSE) )break;
7556 if (use_menu && choice != ' ')
7570 menu_line += (max_num-1);
7593 menu_line = max_num;
7607 if (menu_line > max_num) menu_line -= max_num;
7609 /* Request redraw */
7610 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
7613 if (!redraw || use_menu)
7617 char dummy[80], dummy2[80];
7624 if (!use_menu) screen_save();
7626 for (y = 1; y < 24; y++)
7629 /* Print header(s) */
7631 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
7634 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
7637 for (ctr = 0; ctr < max_num; ctr++)
7639 es_ptr = &essence_info[num[ctr]];
7643 if (ctr == (menu_line-1))
7644 strcpy(dummy, _("》 ", "> "));
7645 else strcpy(dummy, " ");
7648 /* letter/number for power selection */
7651 sprintf(dummy, "%c) ",I2A(ctr));
7654 strcat(dummy, es_ptr->add_name);
7659 if (es_ptr->essence != -1)
7661 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
7662 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
7668 case ESSENCE_SH_FIRE:
7669 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
7670 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
7671 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7673 case ESSENCE_SH_ELEC:
7674 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
7675 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
7676 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7678 case ESSENCE_SH_COLD:
7679 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
7680 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
7681 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7683 case ESSENCE_RESISTANCE:
7684 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
7685 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7686 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7687 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7688 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
7690 case ESSENCE_SUSTAIN:
7691 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
7692 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7693 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7694 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7695 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
7700 if (!able[ctr]) col = TERM_RED;
7702 if (es_ptr->essence != -1)
7704 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
7708 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
7711 c_prt(col, dummy2, ctr+2, x);
7730 ask = (isupper(choice));
7733 if (ask) choice = (char)tolower(choice);
7735 /* Extract request */
7736 i = (islower(choice) ? A2I(choice) : -1);
7739 /* Totally Illegal */
7740 if ((i < 0) || (i >= max_num) || !able[i])
7752 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
7754 /* Belay that order */
7755 if (!get_check(tmp_val)) continue;
7761 if (redraw) screen_load();
7767 es_ptr = &essence_info[num[i]];
7769 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
7770 item_tester_tval = TV_GLOVES;
7771 else if (mode == 1 || mode == 5)
7772 item_tester_hook = item_tester_hook_melee_ammo;
7773 else if (es_ptr->add == ESSENCE_ATTACK)
7774 item_tester_hook = object_allow_enchant_weapon;
7775 else if (es_ptr->add == ESSENCE_AC)
7776 item_tester_hook = object_is_armour;
7778 item_tester_hook = object_is_weapon_armour_ammo;
7780 q = _("どのアイテムを改良しますか?", "Improve which item? ");
7781 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
7783 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT));
7786 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
7788 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
7792 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7794 use_essence = es_ptr->value;
7795 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
7796 if (o_ptr->number > 1)
7798 use_essence *= o_ptr->number;
7799 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
7802 if (es_ptr->essence != -1)
7804 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
7806 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
7809 if (is_pval_flag(es_ptr->add))
7811 if (o_ptr->pval < 0)
7813 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
7816 else if (es_ptr->add == TR_BLOWS)
7818 if (o_ptr->pval > 1)
7820 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
7824 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
7826 else if (o_ptr->pval > 0)
7828 use_essence *= o_ptr->pval;
7829 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
7835 PARAMETER_VALUE pval;
7836 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
7838 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
7839 strcpy(tmp_val, "1");
7841 if (!get_string(tmp, tmp_val, 1)) return;
7842 pval = (PARAMETER_VALUE)atoi(tmp_val);
7843 if (pval > limit) pval = limit;
7844 else if (pval < 1) pval = 1;
7845 o_ptr->pval += pval;
7846 use_essence *= pval;
7847 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
7850 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
7852 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
7856 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
7863 strcpy(tmp_val, "1");
7864 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
7865 val = atoi(tmp_val);
7866 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
7867 else if (val < 1) val = 1;
7869 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
7870 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
7872 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
7875 get_to_h = ((val+1)/2+randint0(val/2+1));
7876 get_to_d = ((val+1)/2+randint0(val/2+1));
7877 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
7878 o_ptr->to_h += get_to_h;
7879 o_ptr->to_d += get_to_d;
7881 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
7882 if (es_ptr->add == ESSENCE_ATTACK)
7884 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
7886 msg_print(_("改良に失敗した。", "You failed to enchant."));
7887 take_turn(p_ptr, 100);;
7892 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
7893 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
7896 else if (es_ptr->add == ESSENCE_AC)
7898 if (o_ptr->to_a >= p_ptr->lev/5+5)
7900 msg_print(_("改良に失敗した。", "You failed to enchant."));
7901 take_turn(p_ptr, 100);;
7906 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
7911 o_ptr->xtra3 = es_ptr->add + 1;
7916 bool success = TRUE;
7920 case ESSENCE_SH_FIRE:
7921 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
7926 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
7927 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
7929 case ESSENCE_SH_ELEC:
7930 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
7935 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
7936 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
7938 case ESSENCE_SH_COLD:
7939 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
7944 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
7945 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
7947 case ESSENCE_RESISTANCE:
7948 case ESSENCE_SUSTAIN:
7949 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))
7954 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
7955 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
7956 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
7957 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
7962 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
7965 if (es_ptr->add == ESSENCE_SUSTAIN)
7967 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
7968 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
7969 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
7970 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
7974 o_ptr->xtra3 = es_ptr->add + 1;
7978 take_turn(p_ptr, 100);
7981 msg_format(_("%sに%sの能力を付加しました。", "You have added ability of %s to %s."), o_name, es_ptr->add_name);
7983 msg_format(, es_ptr->add_name, o_name);
7985 p_ptr->update |= (PU_COMBINE | PU_REORDER);
7986 p_ptr->window |= (PW_INVEN);
7993 static void erase_essence(void)
7998 GAME_TEXT o_name[MAX_NLEN];
7999 BIT_FLAGS flgs[TR_FLAG_SIZE];
8001 item_tester_hook = object_is_smith;
8003 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
8004 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
8006 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
8009 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8010 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
8012 take_turn(p_ptr, 100);;
8014 if (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE)
8016 o_ptr->to_h -= (o_ptr->xtra4>>8);
8017 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8019 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8020 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8023 object_flags(o_ptr, flgs);
8024 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8025 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8026 p_ptr->update |= (PU_COMBINE | PU_REORDER);
8027 p_ptr->window |= (PW_INVEN);
8031 * @brief 鍛冶コマンドのメインルーチン
8032 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8035 void do_cmd_kaji(bool only_browse)
8037 COMMAND_CODE mode = 0;
8040 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8044 if (cmd_limit_confused(p_ptr)) return;
8047 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8052 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8057 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8059 if (only_browse) screen_save();
8061 if (!only_browse) screen_save();
8067 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8068 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8069 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8070 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8071 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8072 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8074 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8075 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8076 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8077 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8078 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8079 prt(format("Choose command from menu."), 0, 0);
8106 if (menu_line > 5) menu_line -= 5;
8114 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
8115 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
8116 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
8117 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
8118 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
8120 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8122 if (!get_com("Command :", &choice, TRUE))
8159 /* Clear lines, position cursor (really should use strlen here) */
8160 Term_erase(14, 21, 255);
8161 Term_erase(14, 20, 255);
8162 Term_erase(14, 19, 255);
8163 Term_erase(14, 18, 255);
8164 Term_erase(14, 17, 255);
8165 Term_erase(14, 16, 255);
8167 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8168 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8170 prt(&temp[j], line, 15);
8175 if (!only_browse) screen_load();
8176 } while (only_browse);
8181 case 1: display_essence();break;
8182 case 2: drain_essence();break;
8183 case 3: erase_essence();break;
8185 mode = choose_essence();
8190 case 5: add_essence(10);break;
8196 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8197 * Torches have special abilities when they are flaming.
8198 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8199 * @param flgs 特別に追加するフラグを返す参照ポインタ
8202 void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
8204 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8206 if (o_ptr->xtra4 > 0)
8208 add_flag(flgs, TR_BRAND_FIRE);
8209 add_flag(flgs, TR_KILL_UNDEAD);
8210 add_flag(flgs, TR_THROW);
8216 * @brief 投擲時たいまつにダイスを与える。
8217 * Torches have special abilities when they are flaming.
8218 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8219 * @param dd 特別なダイス数を返す参照ポインタ
8220 * @param ds 特別なダイス面数を返す参照ポインタ
8223 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
8225 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8227 if (o_ptr->xtra4 > 0)
8236 * @brief 投擲時命中したたいまつの寿命を縮める。
8237 * Torches have special abilities when they are flaming.
8238 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8241 void torch_lost_fuel(object_type *o_ptr)
8243 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8245 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8246 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;