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"
21 static void one_sustain(object_type *o_ptr);
24 static concptr const kaji_tips[5] =
27 "現在持っているエッセンスの一覧を表示する。",
28 "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。",
29 "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。",
30 "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。",
31 "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。",
33 "Display essences you have.",
34 "Extract essences from an item. The item become non magical.",
35 "Remove added essences from an equipment which was improved before. The removed essence will be ruined.",
36 "Add essences to an item. The improved items or artifacts cannot be reimprove.",
37 "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.",
42 * @brief 対象のオブジェクトにランダムな能力維持を一つ付加する。/ Choose one random sustain
44 * @param o_ptr 対象のオブジェクト構造体ポインタ
47 static void one_sustain(object_type *o_ptr)
49 switch (randint0(A_MAX))
51 case 0: add_flag(o_ptr->art_flags, TR_SUST_STR); break;
52 case 1: add_flag(o_ptr->art_flags, TR_SUST_INT); break;
53 case 2: add_flag(o_ptr->art_flags, TR_SUST_WIS); break;
54 case 3: add_flag(o_ptr->art_flags, TR_SUST_DEX); break;
55 case 4: add_flag(o_ptr->art_flags, TR_SUST_CON); break;
56 case 5: add_flag(o_ptr->art_flags, TR_SUST_CHR); break;
61 * @brief 床上、モンスター所持でスタックされたアイテムを削除しスタックを補完する / Excise a dungeon object from any stacks
62 * @param o_idx 削除対象のオブジェクト構造体ポインタ
65 void excise_object_idx(OBJECT_IDX o_idx)
69 OBJECT_IDX this_o_idx, next_o_idx = 0;
70 OBJECT_IDX prev_o_idx = 0;
73 j_ptr = &o_list[o_idx];
76 if (j_ptr->held_m_idx)
81 m_ptr = &m_list[j_ptr->held_m_idx];
83 /* Scan all objects in the grid */
84 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
87 o_ptr = &o_list[this_o_idx];
89 /* Acquire next object */
90 next_o_idx = o_ptr->next_o_idx;
92 if (this_o_idx == o_idx)
97 /* Remove from list */
98 m_ptr->hold_o_idx = next_o_idx;
106 /* Previous object */
107 k_ptr = &o_list[prev_o_idx];
109 /* Remove from list */
110 k_ptr->next_o_idx = next_o_idx;
113 /* Forget next pointer */
114 o_ptr->next_o_idx = 0;
119 /* Save prev_o_idx */
120 prev_o_idx = this_o_idx;
129 POSITION y = j_ptr->iy;
130 POSITION x = j_ptr->ix;
132 g_ptr = &grid_array[y][x];
134 /* Scan all objects in the grid */
135 for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
138 o_ptr = &o_list[this_o_idx];
140 /* Acquire next object */
141 next_o_idx = o_ptr->next_o_idx;
143 if (this_o_idx == o_idx)
148 /* Remove from list */
149 g_ptr->o_idx = next_o_idx;
157 /* Previous object */
158 k_ptr = &o_list[prev_o_idx];
160 /* Remove from list */
161 k_ptr->next_o_idx = next_o_idx;
164 /* Forget next pointer */
165 o_ptr->next_o_idx = 0;
170 /* Save prev_o_idx */
171 prev_o_idx = this_o_idx;
177 * @brief オブジェクトを削除する /
178 * Delete a dungeon object
179 * @param o_idx 削除対象のオブジェクト構造体ポインタ
182 * Handle "stacks" of objects correctly.
184 void delete_object_idx(OBJECT_IDX o_idx)
189 excise_object_idx(o_idx);
192 j_ptr = &o_list[o_idx];
195 if (!(j_ptr->held_m_idx))
213 * @brief フロアにマスに落ちているオブジェクトを全て削除する / Deletes all objects at given location
214 * Delete a dungeon object
215 * @param y 削除したフロアマスのY座標
216 * @param x 削除したフロアマスのX座標
219 void delete_object(POSITION y, POSITION x)
222 OBJECT_IDX this_o_idx, next_o_idx = 0;
224 /* Refuse "illegal" locations */
225 if (!in_bounds(y, x)) return;
227 g_ptr = &grid_array[y][x];
229 /* Scan all objects in the grid */
230 for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
233 o_ptr = &o_list[this_o_idx];
235 /* Acquire next object */
236 next_o_idx = o_ptr->next_o_idx;
243 /* Objects are gone */
252 * @brief グローバルオブジェクト配列に対し指定範囲のオブジェクトを整理してIDの若い順に寄せる /
253 * Move an object from index i1 to index i2 in the object list
254 * @param i1 整理したい配列の始点
255 * @param i2 整理したい配列の終点
258 static void compact_objects_aux(OBJECT_IDX i1, OBJECT_IDX i2)
265 if (i1 == i2) return;
268 for (i = 1; i < o_max; i++)
272 /* Skip "dead" objects */
273 if (!o_ptr->k_idx) continue;
275 /* Repair "next" pointers */
276 if (o_ptr->next_o_idx == i1)
279 o_ptr->next_o_idx = i2;
285 if (o_ptr->held_m_idx)
289 /* Acquire monster */
290 m_ptr = &m_list[o_ptr->held_m_idx];
293 if (m_ptr->hold_o_idx == i1)
296 m_ptr->hold_o_idx = i2;
305 /* Acquire location */
310 g_ptr = &grid_array[y][x];
313 if (g_ptr->o_idx == i1)
321 o_list[i2] = o_list[i1];
329 * @brief グローバルオブジェクト配列から優先度の低いものを削除し、データを圧縮する。 /
330 * Compact and Reorder the object list.
331 * @param size 最低でも減らしたいオブジェクト数の水準
335 * This function can be very dangerous, use with caution!\n
337 * When actually "compacting" objects, we base the saving throw on a\n
338 * combination of object level, distance from player, and current\n
341 * After "compacting" (if needed), we "reorder" the objects into a more\n
342 * compact order, and we reset the allocation info, and the "live" array.\n
344 void compact_objects(int size)
349 int cur_lev, cur_dis, chance;
355 msg_print(_("アイテム情報を圧縮しています...", "Compacting objects..."));
356 p_ptr->redraw |= (PR_MAP);
357 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
361 /* Compact at least 'size' objects */
362 for (num = 0, cnt = 1; num < size; cnt++)
364 /* Get more vicious each iteration */
367 /* Get closer each iteration */
368 cur_dis = 5 * (20 - cnt);
370 /* Examine the objects */
371 for (i = 1; i < o_max; i++)
375 /* Skip dead objects */
376 if (!o_ptr->k_idx) continue;
378 /* Hack -- High level objects start out "immune" */
379 if (k_info[o_ptr->k_idx].level > cur_lev) continue;
382 if (o_ptr->held_m_idx)
386 /* Acquire monster */
387 m_ptr = &m_list[o_ptr->held_m_idx];
392 /* Monsters protect their objects */
393 if (randint0(100) < 90) continue;
403 /* Nearby objects start out "immune" */
404 if ((cur_dis > 0) && (distance(p_ptr->y, p_ptr->x, y, x) < cur_dis)) continue;
409 /* Hack -- only compact artifacts in emergencies */
410 if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
411 (cnt < 1000)) chance = 100;
413 /* Apply the saving throw */
414 if (randint0(100) < chance) continue;
416 delete_object_idx(i);
424 /* Excise dead objects (backwards!) */
425 for (i = o_max - 1; i >= 1; i--)
429 /* Skip real objects */
430 if (o_ptr->k_idx) continue;
432 /* Move last object into open hole */
433 compact_objects_aux(o_max - 1, i);
435 /* Compress "o_max" */
442 * @brief グローバルオブジェクト配列を初期化する /
443 * Delete all the items when player leaves the level
444 * @note we do NOT visually reflect these (irrelevant) changes
446 * Hack -- we clear the "g_ptr->o_idx" field for every grid,
447 * and the "m_ptr->next_o_idx" field for every monster, since
448 * we know we are clearing every object. Technically, we only
449 * clear those fields for grids/monsters containing objects,
450 * and we clear it once for every such object.
453 void wipe_o_list(void)
457 /* Delete the existing objects */
458 for (i = 1; i < o_max; i++)
460 object_type *o_ptr = &o_list[i];
462 /* Skip dead objects */
463 if (!o_ptr->k_idx) continue;
465 /* Mega-Hack -- preserve artifacts */
466 if (!character_dungeon || preserve_mode)
468 /* Hack -- Preserve unknown artifacts */
469 if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
471 /* Mega-Hack -- Preserve the artifact */
472 a_info[o_ptr->name1].cur_num = 0;
477 if (o_ptr->held_m_idx)
482 m_ptr = &m_list[o_ptr->held_m_idx];
484 /* Hack -- see above */
485 m_ptr->hold_o_idx = 0;
493 /* Access location */
494 POSITION y = o_ptr->iy;
495 POSITION x = o_ptr->ix;
498 g_ptr = &grid_array[y][x];
500 /* Hack -- see above */
515 * @brief グローバルオブジェクト配列から空きを取得する /
516 * Acquires and returns the index of a "free" object.
517 * @return 開いているオブジェクト要素のID
519 * This routine should almost never fail, but in case it does,
520 * we must be sure to handle "failure" of this routine.
522 OBJECT_IDX o_pop(void)
526 /* Initial allocation */
527 if (o_max < max_o_idx)
532 /* Expand object array */
538 /* Use this object */
543 /* Recycle dead objects */
544 for (i = 1; i < o_max; i++)
549 /* Skip live objects */
550 if (o_ptr->k_idx) continue;
555 /* Use this object */
560 /* Warn the player (except during dungeon creation) */
561 if (character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!"));
568 * @brief オブジェクト生成テーブルに生成制約を加える /
569 * Apply a "object restriction function" to the "object allocation table"
571 * @details 生成の制約はグローバルのget_obj_num_hook関数ポインタで加える
573 static errr get_obj_num_prep(void)
578 alloc_entry *table = alloc_kind_table;
580 /* Scan the allocation table */
581 for (i = 0; i < alloc_kind_size; i++)
583 /* Accept objects which pass the restriction, if any */
584 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
586 /* Accept this object */
587 table[i].prob2 = table[i].prob1;
590 /* Do not use this object */
593 /* Decline this object */
604 * @brief オブジェクト生成テーブルからアイテムを取得する /
605 * Choose an object kind that seems "appropriate" to the given level
607 * @return 選ばれたオブジェクトベースID
609 * This function uses the "prob2" field of the "object allocation table",\n
610 * and various local information, to calculate the "prob3" field of the\n
611 * same table, which is then used to choose an "appropriate" object, in\n
612 * a relatively efficient manner.\n
614 * It is (slightly) more likely to acquire an object of the given level\n
615 * than one of a lower level. This is done by choosing several objects\n
616 * appropriate to the given level and keeping the "hardest" one.\n
618 * Note that if no objects are "appropriate", then this function will\n
619 * fail, and return zero, but this should *almost* never happen.\n
621 OBJECT_IDX get_obj_num(DEPTH level)
624 KIND_OBJECT_IDX k_idx;
627 alloc_entry *table = alloc_kind_table;
629 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
632 if ((level > 0) && !(d_info[p_ptr->dungeon_idx].flags1 & DF1_BEGINNER))
634 /* Occasional "boost" */
635 if (one_in_(GREAT_OBJ))
637 /* What a bizarre calculation */
638 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
645 /* Process probabilities */
646 for (i = 0; i < alloc_kind_size; i++)
648 /* Objects are sorted by depth */
649 if (table[i].level > level) break;
654 /* Access the index */
655 k_idx = table[i].index;
657 /* Access the actual kind */
658 k_ptr = &k_info[k_idx];
660 /* Hack -- prevent embedded chests */
661 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
664 table[i].prob3 = table[i].prob2;
667 total += table[i].prob3;
670 /* No legal objects */
671 if (total <= 0) return (0);
675 value = randint0(total);
677 /* Find the object */
678 for (i = 0; i < alloc_kind_size; i++)
680 /* Found the entry */
681 if (value < table[i].prob3) break;
684 value = value - table[i].prob3;
691 /* Try for a "better" object once (50%) or twice (10%) */
698 value = randint0(total);
700 /* Find the object */
701 for (i = 0; i < alloc_kind_size; i++)
703 /* Found the entry */
704 if (value < table[i].prob3) break;
707 value = value - table[i].prob3;
710 /* Keep the "best" one */
711 if (table[i].level < table[j].level) i = j;
714 /* Try for a "better" object twice (10%) */
721 value = randint0(total);
723 /* Find the object */
724 for (i = 0; i < alloc_kind_size; i++)
726 /* Found the entry */
727 if (value < table[i].prob3) break;
730 value = value - table[i].prob3;
733 /* Keep the "best" one */
734 if (table[i].level < table[j].level) i = j;
737 return (table[i].index);
742 * @brief オブジェクトを鑑定済にする /
743 * Known is true when the "attributes" of an object are "known".
744 * @param o_ptr 鑑定済にするオブジェクトの構造体参照ポインタ
746 * These include tohit, todam, toac, cost, and pval (charges).\n
748 * Note that "knowing" an object gives you everything that an "awareness"\n
749 * gives you, and much more. In fact, the player is always "aware" of any\n
750 * item of which he has full "knowledge".\n
752 * But having full knowledge of, say, one "wand of wonder", does not, by\n
753 * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
754 * It happens that most "identify" routines (including "buying from a shop")\n
755 * will make the player "aware" of the object as well as fully "know" it.\n
757 * This routine also removes any inscriptions generated by "feelings".\n
759 void object_known(object_type *o_ptr)
761 /* Remove "default inscriptions" */
762 o_ptr->feeling = FEEL_NONE;
764 /* Clear the "Felt" info */
765 o_ptr->ident &= ~(IDENT_SENSE);
767 /* Clear the "Empty" info */
768 o_ptr->ident &= ~(IDENT_EMPTY);
770 /* Now we know about the item */
771 o_ptr->ident |= (IDENT_KNOWN);
775 * @brief オブジェクトを*鑑定*済にする /
776 * The player is now aware of the effects of the given object.
777 * @param o_ptr *鑑定*済にするオブジェクトの構造体参照ポインタ
780 void object_aware(object_type *o_ptr)
782 bool mihanmei = !object_is_aware(o_ptr);
784 /* Fully aware of the effects */
785 k_info[o_ptr->k_idx].aware = TRUE;
787 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
788 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
792 GAME_TEXT o_name[MAX_NLEN];
795 object_copy(q_ptr, o_ptr);
798 object_desc(o_name, q_ptr, OD_NAME_ONLY);
800 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
805 * @brief オブジェクトを試行済にする /
806 * Something has been "sampled"
807 * @param o_ptr 試行済にするオブジェクトの構造体参照ポインタ
810 void object_tried(object_type *o_ptr)
812 /* Mark it as tried (even if "aware") */
813 k_info[o_ptr->k_idx].tried = TRUE;
817 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
818 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
819 * @return 擬似鑑定結果のIDを返す。
821 byte value_check_aux1(object_type *o_ptr)
824 if (object_is_artifact(o_ptr))
827 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
834 if (object_is_ego(o_ptr))
837 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
840 return FEEL_EXCELLENT;
844 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
847 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
849 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
851 /* Good "armor" bonus */
852 if (o_ptr->to_a > 0) return FEEL_GOOD;
854 /* Good "weapon" bonus */
855 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
857 /* Default to "average" */
862 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 2 (Light).
863 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
864 * @return 擬似鑑定結果のIDを返す。
866 byte value_check_aux2(object_type *o_ptr)
868 /* Cursed items (all of them) */
869 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
871 /* Broken items (all of them) */
872 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
874 /* Artifacts -- except cursed/broken ones */
875 if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
877 /* Ego-Items -- except cursed/broken ones */
878 if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
880 /* Good armor bonus */
881 if (o_ptr->to_a > 0) return FEEL_UNCURSED;
883 /* Good weapon bonuses */
884 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
891 * @brief 未鑑定なベースアイテムの基本価格を返す /
892 * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
893 * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
894 * @return オブジェクトの未鑑定価格
896 static PRICE object_value_base(object_type *o_ptr)
898 /* Aware item -- use template cost */
899 if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
901 /* Analyze the type */
906 case TV_FOOD: return (5L);
908 /* Un-aware Potions */
909 case TV_POTION: return (20L);
911 /* Un-aware Scrolls */
912 case TV_SCROLL: return (20L);
914 /* Un-aware Staffs */
915 case TV_STAFF: return (70L);
918 case TV_WAND: return (50L);
921 case TV_ROD: return (90L);
924 case TV_RING: return (45L);
926 /* Un-aware Amulets */
927 case TV_AMULET: return (45L);
929 /* Figurines, relative to monster level */
932 DEPTH level = r_info[o_ptr->pval].level;
933 if (level < 20) return level*50L;
934 else if (level < 30) return 1000+(level-20)*150L;
935 else if (level < 40) return 2500+(level-30)*350L;
936 else if (level < 50) return 6000+(level-40)*800L;
937 else return 14000+(level-50)*2000L;
941 if (!o_ptr->pval) return 1000L;
942 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
945 /* Paranoia -- Oops */
951 * @brief オブジェクトのフラグ類から価格を算出する /
952 * Return the value of the flags the object has...
953 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
954 * @param plusses フラグに与える価格の基本重み
955 * @return オブジェクトのフラグ価格
957 PRICE flag_cost(object_type *o_ptr, int plusses)
960 BIT_FLAGS flgs[TR_FLAG_SIZE];
964 object_kind *k_ptr = &k_info[o_ptr->k_idx];
966 object_flags(o_ptr, flgs);
969 * Exclude fixed flags of the base item.
970 * pval bonuses of base item will be treated later.
972 for (i = 0; i < TR_FLAG_SIZE; i++)
973 flgs[i] &= ~(k_ptr->flags[i]);
975 /* Exclude fixed flags of the fixed artifact. */
976 if (object_is_fixed_artifact(o_ptr))
978 artifact_type *a_ptr = &a_info[o_ptr->name1];
980 for (i = 0; i < TR_FLAG_SIZE; i++)
981 flgs[i] &= ~(a_ptr->flags[i]);
984 /* Exclude fixed flags of the ego-item. */
985 else if (object_is_ego(o_ptr))
987 ego_item_type *e_ptr = &e_info[o_ptr->name2];
989 for (i = 0; i < TR_FLAG_SIZE; i++)
990 flgs[i] &= ~(e_ptr->flags[i]);
995 * Calucurate values of remaining flags
997 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
998 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
999 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
1000 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
1001 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
1002 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
1003 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
1004 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
1005 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
1006 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
1007 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
1008 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
1009 total += (10000 + (2500 * plusses));
1010 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
1011 total += (10000 + (2500 * plusses));
1015 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
1016 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
1017 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
1018 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
1019 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
1020 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
1021 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
1022 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
1023 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
1024 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
1025 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
1026 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
1027 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
1028 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
1029 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
1030 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
1031 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
1032 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
1033 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
1034 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
1035 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
1037 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
1038 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
1039 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
1040 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
1041 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
1042 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
1043 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
1044 total += (tmp_cost * count);
1046 if (have_flag(flgs, TR_SUST_STR)) total += 850;
1047 if (have_flag(flgs, TR_SUST_INT)) total += 850;
1048 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
1049 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
1050 if (have_flag(flgs, TR_SUST_CON)) total += 850;
1051 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
1052 if (have_flag(flgs, TR_RIDING)) total += 0;
1053 if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
1054 if (have_flag(flgs, TR_THROW)) total += 5000;
1055 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
1056 if (have_flag(flgs, TR_HOLD_EXP)) total += 8500;
1060 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
1061 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
1062 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
1063 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
1064 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
1065 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
1066 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
1067 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
1068 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
1069 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
1070 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
1071 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
1072 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
1073 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
1074 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
1075 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
1076 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
1077 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
1078 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
1079 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
1080 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
1081 total += (tmp_cost * count);
1083 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
1084 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
1085 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1086 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1087 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1088 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1089 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1090 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1091 if (have_flag(flgs, TR_LEVITATION)) total += 1250;
1092 if (have_flag(flgs, TR_LITE_1)) total += 1500;
1093 if (have_flag(flgs, TR_LITE_2)) total += 2500;
1094 if (have_flag(flgs, TR_LITE_3)) total += 4000;
1095 if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
1096 if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
1097 if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
1098 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1099 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1100 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1101 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1102 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1103 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1104 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1105 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1106 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1107 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1108 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1109 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1110 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1111 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1112 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1113 if (have_flag(flgs, TR_REGEN)) total += 2500;
1114 if (have_flag(flgs, TR_WARNING)) total += 2000;
1115 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1116 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1117 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1118 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1119 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1120 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1121 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1122 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1123 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1124 if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
1125 if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
1126 if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
1127 if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
1128 if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
1129 if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
1130 if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
1131 if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
1132 if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
1133 if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
1134 if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
1135 if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
1136 if (have_flag(flgs, TR_TELEPORT))
1138 if (object_is_cursed(o_ptr))
1143 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1144 if (have_flag(flgs, TR_BLESSED)) total += 750;
1145 if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1146 if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1147 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1148 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1149 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1151 /* Also, give some extra for activatable powers... */
1152 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1154 const activation_type* const act_ptr = find_activation_info(o_ptr);
1156 total += act_ptr->value;
1165 * @brief オブジェクトの真の価格を算出する /
1166 * Return the value of the flags the object has...
1167 * @param o_ptr 本価格を確認したいオブジェクトの構造体参照ポインタ
1168 * @return オブジェクトの本価格
1170 * Return the "real" price of a "known" item, not including discounts\n
1172 * Wand and staffs get cost for each charge\n
1174 * Armor is worth an extra 100 gold per bonus point to armor class.\n
1176 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
1178 * Missiles are only worth 5 gold per bonus point, since they\n
1179 * usually appear in groups of 20, and we want the player to get\n
1180 * the same amount of cash for any "equivalent" item. Note that\n
1181 * missiles never have any of the "pval" flags, and in fact, they\n
1182 * only have a few of the available flags, primarily of the "slay"\n
1183 * and "brand" and "ignore" variety.\n
1185 * Armor with a negative armor bonus is worthless.\n
1186 * Weapons with negative hit+damage bonuses are worthless.\n
1188 * Every wearable item with a "pval" bonus is worth extra (see below).\n
1190 PRICE object_value_real(object_type *o_ptr)
1193 BIT_FLAGS flgs[TR_FLAG_SIZE];
1194 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1197 /* Hack -- "worthless" items */
1198 if (!k_info[o_ptr->k_idx].cost) return (0L);
1201 value = k_info[o_ptr->k_idx].cost;
1203 /* Extract some flags */
1204 object_flags(o_ptr, flgs);
1207 if (object_is_fixed_artifact(o_ptr))
1209 artifact_type *a_ptr = &a_info[o_ptr->name1];
1211 /* Hack -- "worthless" artifacts */
1212 if (!a_ptr->cost) return (0L);
1214 /* Hack -- Use the artifact cost instead */
1215 value = a_ptr->cost;
1216 value += flag_cost(o_ptr, o_ptr->pval);
1218 /* Don't add pval bonuses etc. */
1223 else if (object_is_ego(o_ptr))
1225 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1227 /* Hack -- "worthless" ego-items */
1228 if (!e_ptr->cost) return (0L);
1230 /* Hack -- Reward the ego-item with a bonus */
1231 value += e_ptr->cost;
1232 value += flag_cost(o_ptr, o_ptr->pval);
1240 for (i = 0; i < TR_FLAG_SIZE; i++)
1241 if (o_ptr->art_flags[i]) flag = TRUE;
1243 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1246 /* Analyze pval bonus for normal object */
1247 switch (o_ptr->tval)
1270 if (!o_ptr->pval) break;
1272 /* Hack -- Negative "pval" is always bad */
1273 if (o_ptr->pval < 0) return (0L);
1275 /* Give credit for stat bonuses */
1276 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1277 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1278 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1279 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1280 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1281 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1283 /* Give credit for stealth and searching */
1284 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1285 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1286 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1288 /* Give credit for infra-vision and tunneling */
1289 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1290 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1292 /* Give credit for extra attacks */
1293 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1295 /* Give credit for speed bonus */
1296 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1302 /* Analyze the item */
1303 switch (o_ptr->tval)
1308 /* Pay extra for charges, depending on standard number of
1309 * charges. Handle new-style wands correctly. -LM-
1311 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1317 /* Pay extra for charges, depending on standard number of
1320 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1329 /* Hack -- negative bonuses are bad */
1330 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1332 /* Give credit for bonuses */
1333 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1349 /* Hack -- negative armor bonus */
1350 if (o_ptr->to_a < 0) return (0L);
1352 /* Give credit for bonuses */
1353 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1365 /* Hack -- negative hit/damage bonuses */
1366 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1368 /* Factor in the bonuses */
1369 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1371 /* Hack -- Factor in extra damage dice and sides */
1372 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1373 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1383 /* Hack -- negative hit/damage bonuses */
1384 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1386 /* Factor in the bonuses */
1387 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1389 /* Hack -- Factor in extra damage dice and sides */
1390 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1391 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1396 /* Figurines, relative to monster level */
1399 DEPTH level = r_info[o_ptr->pval].level;
1400 if (level < 20) value = level*50L;
1401 else if (level < 30) value = 1000+(level-20)*150L;
1402 else if (level < 40) value = 2500+(level-30)*350L;
1403 else if (level < 50) value = 6000+(level-40)*800L;
1404 else value = 14000+(level-50)*2000L;
1410 if (!o_ptr->pval) value = 1000L;
1411 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1417 if (!o_ptr->pval) value = 0L;
1422 /* Worthless object */
1423 if (value < 0) return 0L;
1425 /* Return the value */
1431 * @brief オブジェクト価格算出のメインルーチン /
1432 * Return the price of an item including plusses (and charges)
1433 * @param o_ptr 判明している現価格を確認したいオブジェクトの構造体参照ポインタ
1434 * @return オブジェクトの判明している現価格
1436 * This function returns the "value" of the given item (qty one)\n
1438 * Never notice "unknown" bonuses or properties, including "curses",\n
1439 * since that would give the player information he did not have.\n
1441 * Note that discounted items stay discounted forever, even if\n
1442 * the discount is "forgotten" by the player via memory loss.\n
1444 PRICE object_value(object_type *o_ptr)
1448 /* Unknown items -- acquire a base value */
1449 if (object_is_known(o_ptr))
1451 /* Broken items -- worthless */
1452 if (object_is_broken(o_ptr)) return (0L);
1454 /* Cursed items -- worthless */
1455 if (object_is_cursed(o_ptr)) return (0L);
1457 /* Real value (see above) */
1458 value = object_value_real(o_ptr);
1461 /* Known items -- acquire the actual value */
1464 /* Hack -- Felt broken items */
1465 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1467 /* Hack -- Felt cursed items */
1468 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1470 /* Base value (see above) */
1471 value = object_value_base(o_ptr);
1474 /* Apply discount (if any) */
1475 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1477 /* Return the final value */
1484 * @brief 破壊可能なアイテムかを返す /
1485 * Determines whether an object can be destroyed, and makes fake inscription.
1486 * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
1487 * @return オブジェクトが破壊可能ならばTRUEを返す
1489 bool can_player_destroy_object(object_type *o_ptr)
1491 /* Artifacts cannot be destroyed */
1492 if (!object_is_artifact(o_ptr)) return TRUE;
1494 /* If object is unidentified, makes fake inscription */
1495 if (!object_is_known(o_ptr))
1497 byte feel = FEEL_SPECIAL;
1499 /* Hack -- Handle icky artifacts */
1500 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1502 /* Hack -- inscribe the artifact */
1503 o_ptr->feeling = feel;
1505 /* We have "felt" it (again) */
1506 o_ptr->ident |= (IDENT_SENSE);
1507 p_ptr->update |= (PU_COMBINE);
1508 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1513 /* Identified artifact -- Nothing to do */
1519 * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
1520 * Distribute charges of rods or wands.
1521 * @param o_ptr 分割元オブジェクトの構造体参照ポインタ source item
1522 * @param q_ptr 分割先オブジェクトの構造体参照ポインタ target item, must be of the same type as o_ptr
1523 * @param amt 分割したい回数量 number of items that are transfered
1526 * Hack -- If rods or wands are dropped, the total maximum timeout or\n
1527 * charges need to be allocated between the two stacks. If all the items\n
1528 * are being dropped, it makes for a neater message to leave the original\n
1529 * stack's pval alone. -LM-\n
1531 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1533 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1535 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1536 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1538 /* Hack -- Rods also need to have their timeouts distributed. The
1539 * dropped stack will accept all time remaining to charge up to its
1542 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1544 if (q_ptr->pval > o_ptr->timeout)
1545 q_ptr->timeout = o_ptr->timeout;
1547 q_ptr->timeout = q_ptr->pval;
1549 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1555 * @brief 魔法棒やロッドの使用回数を減らす /
1556 * @param o_ptr オブジェクトの構造体参照ポインタ source item
1557 * @param amt 減らしたい回数量 number of items that are transfered
1560 * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1561 * charges of the stack needs to be reduced, unless all the items are\n
1562 * being destroyed. -LM-\n
1564 void reduce_charges(object_type *o_ptr, int amt)
1566 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1567 (amt < o_ptr->number))
1569 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1574 * Determine if an item can "absorb" a second item
1576 * See "object_absorb()" for the actual "absorption" code.
1578 * If permitted, we allow staffs (if they are known to have equal charges
1579 * and both are either known or confirmed empty) and wands (if both are
1580 * either known or confirmed empty) and rods (in all cases) to combine.
1581 * Staffs will unstack (if necessary) when they are used, but wands and
1582 * rods will only unstack if one is dropped. -LM-
1584 * If permitted, we allow weapons/armor to stack, if fully "known".
1586 * Missiles will combine if both stacks have the same "known" status.
1587 * This is done to make unidentified stacks of missiles useful.
1589 * Food, potions, scrolls, and "easy know" items always stack.
1591 * Chests, and activatable items, never stack (for various reasons).
1595 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1597 #define MAX_STACK_SIZE 99
1601 * @brief 両オブジェクトをスロットに重ね合わせ可能な最大数を返す。
1602 * Determine if an item can partly absorb a second item. Return maximum number of stack.
1603 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1604 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1605 * @return 重ね合わせ可能なアイテム数
1607 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1611 /* Default maximum number of stack */
1612 int max_num = MAX_STACK_SIZE;
1614 /* Require identical object types */
1615 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1618 /* Analyze the items */
1619 switch (o_ptr->tval)
1621 /* Chests and Statues*/
1632 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1633 if (o_ptr->pval != j_ptr->pval) return 0;
1637 /* Figurines and Corpses*/
1642 if (o_ptr->pval != j_ptr->pval) return 0;
1648 /* Food and Potions and Scrolls */
1660 /* Require either knowledge or known empty for both staffs. */
1661 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1662 !object_is_known(o_ptr)) ||
1663 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1664 !object_is_known(j_ptr))) return 0;
1666 /* Require identical charges, since staffs are bulky. */
1667 if (o_ptr->pval != j_ptr->pval) return 0;
1676 /* Require either knowledge or known empty for both wands. */
1677 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1678 !object_is_known(o_ptr)) ||
1679 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1680 !object_is_known(j_ptr))) return 0;
1682 /* Wand charges combine in O&ZAngband. */
1688 /* Staffs and Wands and Rods */
1691 /* Prevent overflaw of timeout */
1692 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1698 /* Weapons and Armor */
1714 /* Rings, Amulets, Lites */
1720 /* Require full knowledge of both items */
1721 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1731 /* Require identical knowledge of both items */
1732 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1733 if (o_ptr->feeling != j_ptr->feeling) return 0;
1735 /* Require identical "bonuses" */
1736 if (o_ptr->to_h != j_ptr->to_h) return 0;
1737 if (o_ptr->to_d != j_ptr->to_d) return 0;
1738 if (o_ptr->to_a != j_ptr->to_a) return 0;
1740 /* Require identical "pval" code */
1741 if (o_ptr->pval != j_ptr->pval) return 0;
1743 /* Artifacts never stack */
1744 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1746 /* Require identical "ego-item" names */
1747 if (o_ptr->name2 != j_ptr->name2) return 0;
1749 /* Require identical added essence */
1750 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1751 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1753 /* Hack -- Never stack "powerful" items */
1754 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1756 /* Hack -- Never stack recharging items */
1757 if (o_ptr->timeout || j_ptr->timeout) return 0;
1759 /* Require identical "values" */
1760 if (o_ptr->ac != j_ptr->ac) return 0;
1761 if (o_ptr->dd != j_ptr->dd) return 0;
1762 if (o_ptr->ds != j_ptr->ds) return 0;
1771 /* Require knowledge */
1772 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1780 /* Hack -- Identical art_flags! */
1781 for (i = 0; i < TR_FLAG_SIZE; i++)
1782 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1784 /* Hack -- Require identical "cursed" status */
1785 if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1787 /* Hack -- Require identical "broken" status */
1788 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1791 /* Hack -- require semi-matching "inscriptions" */
1792 if (o_ptr->inscription && j_ptr->inscription &&
1793 (o_ptr->inscription != j_ptr->inscription))
1796 /* Hack -- normally require matching "inscriptions" */
1797 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1799 /* Hack -- normally require matching "discounts" */
1800 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1803 /* They match, so they must be similar */
1808 * @brief 両オブジェクトをスロットに重ねることができるかどうかを返す。
1809 * Determine if an item can absorb a second item.
1810 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1811 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1812 * @return 重ね合わせ可能ならばTRUEを返す。
1814 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1816 int total = o_ptr->number + j_ptr->number;
1819 /* Are these objects similar? */
1820 max_num = object_similar_part(o_ptr, j_ptr);
1822 /* Return if not similar */
1823 if (!max_num) return FALSE;
1825 /* Maximal "stacking" limit */
1826 if (total > max_num) return (0);
1829 /* They match, so they must be similar */
1835 * @brief 両オブジェクトをスロットに重ね合わせる。
1836 * Allow one item to "absorb" another, assuming they are similar
1837 * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
1838 * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
1841 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1843 int max_num = object_similar_part(o_ptr, j_ptr);
1844 int total = o_ptr->number + j_ptr->number;
1845 int diff = (total > max_num) ? total - max_num : 0;
1847 /* Combine quantity, lose excess items */
1848 o_ptr->number = (total > max_num) ? max_num : total;
1850 /* Hack -- blend "known" status */
1851 if (object_is_known(j_ptr)) object_known(o_ptr);
1853 /* Hack -- clear "storebought" if only one has it */
1854 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1855 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1857 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1858 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1861 /* Hack -- blend "mental" status */
1862 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1864 /* Hack -- blend "inscriptions" */
1865 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1867 /* Hack -- blend "feelings" */
1868 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1870 /* Hack -- could average discounts */
1871 /* Hack -- save largest discount */
1872 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1874 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1875 if (o_ptr->tval == TV_ROD)
1877 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1878 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1881 /* Hack -- if wands are stacking, combine the charges. -LM- */
1882 if (o_ptr->tval == TV_WAND)
1884 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1890 * @brief tvalとsvalに対応するベースアイテムのIDを返す。
1891 * Find the index of the object_kind with the given tval and sval
1892 * @param tval 検索したいベースアイテムのtval
1893 * @param sval 検索したいベースアイテムのsval
1896 KIND_OBJECT_IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval)
1900 KIND_OBJECT_IDX bk = 0;
1903 for (k = 1; k < max_k_idx; k++)
1905 object_kind *k_ptr = &k_info[k];
1907 /* Require correct tval */
1908 if (k_ptr->tval != tval) continue;
1911 if (k_ptr->sval == sval) return (k);
1913 /* Ignore illegal items */
1914 if (sval != SV_ANY) continue;
1916 /* Apply the randomizer */
1917 if (!one_in_(++num)) continue;
1919 /* Use this value */
1923 /* Return this choice */
1930 msg_format(_("アイテムがない (%d,%d)", "No object (%d,%d)"), tval, sval);
1939 * @brief オブジェクトを初期化する
1940 * Wipe an object clean.
1941 * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
1944 void object_wipe(object_type *o_ptr)
1946 /* Wipe the structure */
1947 (void)WIPE(o_ptr, object_type);
1952 * @brief オブジェクトを複製する
1953 * Wipe an object clean.
1954 * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
1955 * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
1958 void object_copy(object_type *o_ptr, object_type *j_ptr)
1960 /* Copy the structure */
1961 (void)COPY(o_ptr, j_ptr, object_type);
1966 * @brief オブジェクト構造体にベースアイテムを作成する
1967 * Prepare an object based on an object kind.
1968 * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
1969 * @param k_idx 新たに作成したいベースアイテム情報のID
1972 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
1974 object_kind *k_ptr = &k_info[k_idx];
1976 /* Clear the record */
1979 /* Save the kind index */
1980 o_ptr->k_idx = k_idx;
1982 /* Efficiency -- tval/sval */
1983 o_ptr->tval = k_ptr->tval;
1984 o_ptr->sval = k_ptr->sval;
1986 /* Default "pval" */
1987 o_ptr->pval = k_ptr->pval;
1989 /* Default number */
1992 /* Default weight */
1993 o_ptr->weight = k_ptr->weight;
1996 o_ptr->to_h = k_ptr->to_h;
1997 o_ptr->to_d = k_ptr->to_d;
1998 o_ptr->to_a = k_ptr->to_a;
2001 o_ptr->ac = k_ptr->ac;
2002 o_ptr->dd = k_ptr->dd;
2003 o_ptr->ds = k_ptr->ds;
2005 /* Default activation */
2006 if (k_ptr->act_idx > 0) o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
2008 /* Hack -- worthless items are always "broken" */
2009 if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
2011 /* Hack -- cursed items are always "cursed" */
2012 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
2013 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2014 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
2015 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2016 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2017 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2022 * @brief 上質以上のオブジェクトに与えるための各種ボーナスを正規乱数も加えて算出する。
2023 * Help determine an "enchantment bonus" for an object.
2024 * @param max ボーナス値の限度
2025 * @param level ボーナス値に加味する基準生成階
2026 * @return 算出されたボーナス値
2028 * To avoid floating point but still provide a smooth distribution of bonuses,\n
2029 * we simply round the results of division in such a way as to "average" the\n
2030 * correct floating point value.\n
2032 * This function has been changed. It uses "randnor()" to choose values from\n
2033 * a normal distribution, whose mean moves from zero towards the max as the\n
2034 * level increases, and whose standard deviation is equal to 1/4 of the max,\n
2035 * and whose values are forced to lie between zero and the max, inclusive.\n
2037 * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
2038 * rare to get the "full" enchantment on an object, even a deep levels.\n
2040 * It is always possible (albeit unlikely) to get the "full" enchantment.\n
2042 * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
2044 * N 0 1 2 3 4 5 6 7 8 9 10\n
2045 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n
2046 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03\n
2047 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05\n
2048 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05\n
2049 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11\n
2050 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41\n
2051 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65\n
2052 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94\n
2053 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78\n
2054 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64\n
2055 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62\n
2056 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33\n
2057 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38\n
2058 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53\n
2059 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53\n
2060 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27\n
2061 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72\n
2062 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07\n
2064 int m_bonus(int max, DEPTH level)
2066 int bonus, stand, extra, value;
2069 /* Paranoia -- enforce maximal "level" */
2070 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
2073 /* The "bonus" moves towards the max */
2074 bonus = ((max * level) / MAX_DEPTH);
2076 /* Hack -- determine fraction of error */
2077 extra = ((max * level) % MAX_DEPTH);
2079 /* Hack -- simulate floating point computations */
2080 if (randint0(MAX_DEPTH) < extra) bonus++;
2083 /* The "stand" is equal to one quarter of the max */
2086 /* Hack -- determine fraction of error */
2089 /* Hack -- simulate floating point computations */
2090 if (randint0(4) < extra) stand++;
2093 /* Choose an "interesting" value */
2094 value = randnor(bonus, stand);
2096 /* Enforce the minimum value */
2097 if (value < 0) return (0);
2099 /* Enforce the maximum value */
2100 if (value > max) return (max);
2106 * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user
2107 * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ
2110 static void object_mention(object_type *o_ptr)
2112 GAME_TEXT o_name[MAX_NLEN];
2114 object_aware(o_ptr);
2115 object_known(o_ptr);
2117 /* Mark the item as fully known */
2118 o_ptr->ident |= (IDENT_MENTAL);
2119 object_desc(o_name, o_ptr, 0);
2120 msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name);
2125 * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
2126 * Choose random ego type
2127 * @param slot 取得したいエゴの装備部位
2128 * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
2129 * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
2131 static byte get_random_ego(byte slot, bool good)
2134 ego_item_type *e_ptr;
2138 for (i = 1; i < max_e_idx; i++)
2142 if (e_ptr->slot == slot
2143 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2146 total += (255 / e_ptr->rarity);
2150 value = randint1(total);
2152 for (i = 1; i < max_e_idx; i++)
2156 if (e_ptr->slot == slot
2157 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2160 value -= (255 / e_ptr->rarity);
2161 if (value <= 0L) break;
2169 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2170 * Apply magic to an item known to be a "weapon"
2171 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2172 * @param level 生成基準階
2173 * @param power 生成ランク
2176 * Hack -- note special base damage dice boosting\n
2177 * Hack -- note special processing for weapon/digger\n
2179 static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
2181 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
2182 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
2184 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
2185 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
2187 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2189 tohit2 = (tohit2+1)/2;
2190 todam2 = (todam2+1)/2;
2197 o_ptr->to_h += tohit1;
2198 o_ptr->to_d += todam1;
2204 o_ptr->to_h += tohit2;
2205 o_ptr->to_d += todam2;
2213 o_ptr->to_h -= tohit1;
2214 o_ptr->to_d -= todam1;
2219 /* Penalize again */
2220 o_ptr->to_h -= tohit2;
2221 o_ptr->to_d -= todam2;
2224 /* Cursed (if "bad") */
2225 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2228 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2231 switch (o_ptr->tval)
2238 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2239 create_artifact(o_ptr, FALSE);
2241 /* Special Ego-item */
2242 o_ptr->name2 = EGO_DIGGING;
2246 else if (power < -1)
2248 /* Hack -- Horrible digging bonus */
2249 o_ptr->pval = 0 - (5 + randint1(5));
2255 /* Hack -- Reverse digging bonus */
2256 o_ptr->pval = 0 - (o_ptr->pval);
2270 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2272 create_artifact(o_ptr, FALSE);
2277 /* Roll for an ego-item */
2278 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2279 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2281 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2283 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2288 switch (o_ptr->name2)
2291 if (one_in_(4) && (level > 40))
2292 add_flag(o_ptr->art_flags, TR_BLOWS);
2296 add_flag(o_ptr->art_flags, TR_RES_POIS);
2298 add_flag(o_ptr->art_flags, TR_WARNING);
2300 case EGO_KILL_DRAGON:
2302 add_flag(o_ptr->art_flags, TR_RES_POIS);
2306 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2308 case EGO_SLAYING_WEAPON:
2309 if (one_in_(3)) /* double damage */
2317 while (one_in_(o_ptr->dd));
2323 while (one_in_(o_ptr->ds));
2328 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2330 if (o_ptr->tval == TV_SWORD && one_in_(3))
2332 add_flag(o_ptr->art_flags, TR_VORPAL);
2337 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2343 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
2345 add_flag(o_ptr->art_flags, TR_DEX);
2347 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2350 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
2352 case EGO_EARTHQUAKES:
2353 if (one_in_(3) && (level > 60))
2354 add_flag(o_ptr->art_flags, TR_BLOWS);
2356 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
2360 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2364 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2366 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2368 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2369 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2372 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2373 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2374 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2375 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2379 if (!o_ptr->art_name)
2381 /* Hack -- Super-charge the damage dice */
2382 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2384 /* Hack -- Lower the damage dice */
2385 if (o_ptr->dd > 9) o_ptr->dd = 9;
2390 else if (power < -1)
2392 /* Roll for ego-item */
2393 if (randint0(MAX_DEPTH) < level)
2397 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2398 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2404 switch (o_ptr->name2)
2407 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2408 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2410 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2411 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2412 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2413 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2414 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2415 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2429 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2431 create_artifact(o_ptr, FALSE);
2434 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2448 if (power > 2) /* power > 2 is debug only */
2450 create_artifact(o_ptr, FALSE);
2454 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2456 switch (o_ptr->name2)
2458 case EGO_SLAYING_BOLT:
2463 /* Hack -- super-charge the damage dice */
2464 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2466 /* Hack -- restrict the damage dice */
2467 if (o_ptr->dd > 9) o_ptr->dd = 9;
2471 else if (power < -1)
2473 /* Roll for ego-item */
2474 if (randint0(MAX_DEPTH) < level)
2476 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2486 * @brief ドラゴン装備にランダムな耐性を与える
2487 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2490 static void dragon_resist(object_type * o_ptr)
2495 one_dragon_ele_resistance(o_ptr);
2497 one_high_resistance(o_ptr);
2503 * @brief オブジェクトにランダムな強いESPを与える
2504 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2507 static bool add_esp_strong(object_type *o_ptr)
2509 bool nonliv = FALSE;
2511 switch (randint1(3))
2513 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2514 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2515 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2522 * @brief オブジェクトにランダムな弱いESPを与える
2523 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2524 * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3)
2527 static void add_esp_weak(object_type *o_ptr, bool extra)
2530 u32b weak_esp_list[] = {
2542 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2543 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2545 /* Add unduplicated weak esp flags randomly */
2546 for (i = 0; i < add_count; ++ i)
2548 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2550 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2551 weak_esp_list[choice] = weak_esp_list[i];
2557 * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2558 * Apply magic to an item known to be "armor"
2559 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2560 * @param level 生成基準階
2561 * @param power 生成ランク
2564 * Hack -- note special processing for crown/helm\n
2565 * Hack -- note special processing for robe of permanence\n
2567 static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
2569 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
2570 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
2576 o_ptr->to_a += toac1;
2582 o_ptr->to_a += toac2;
2590 o_ptr->to_a -= toac1;
2595 /* Penalize again */
2596 o_ptr->to_a -= toac2;
2599 /* Cursed (if "bad") */
2600 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2605 switch (o_ptr->tval)
2609 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2610 create_artifact(o_ptr, FALSE);
2620 /* Hack -- Try for "Robes of the Magi" */
2621 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2622 (o_ptr->sval == SV_ROBE) &&
2623 (randint0(100) < 15))
2627 o_ptr->name2 = EGO_YOIYAMI;
2628 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2629 o_ptr->sval = SV_YOIYAMI_ROBE;
2635 o_ptr->name2 = EGO_PERMANENCE;
2640 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2642 create_artifact(o_ptr, FALSE);
2648 bool okay_flag = TRUE;
2650 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2652 switch (o_ptr->name2)
2655 if (o_ptr->tval != TV_HARD_ARMOR)
2661 if (o_ptr->tval != TV_SOFT_ARMOR)
2670 if (okay_flag) break;
2672 switch (o_ptr->name2)
2674 case EGO_RESISTANCE:
2676 add_flag(o_ptr->art_flags, TR_RES_POIS);
2679 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2680 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2684 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2686 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2688 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2689 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2691 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2692 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2693 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2694 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2695 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2696 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2697 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2698 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2701 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2702 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2703 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2704 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2705 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2706 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2719 if (o_ptr->sval == SV_DRAGON_SHIELD)
2721 dragon_resist(o_ptr);
2722 if (!one_in_(3)) break;
2728 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2730 create_artifact(o_ptr, FALSE);
2736 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2737 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
2738 && o_ptr->name2 == EGO_S_DWARVEN)
2745 switch (o_ptr->name2)
2748 if (!one_in_(3)) one_high_resistance(o_ptr);
2749 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2751 case EGO_REFLECTION:
2752 if (o_ptr->sval == SV_MIRROR_SHIELD)
2757 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2758 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2767 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2769 dragon_resist(o_ptr);
2770 if (!one_in_(3)) break;
2774 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2776 create_artifact(o_ptr, FALSE);
2779 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2783 else if (power < -1)
2785 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2793 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2795 dragon_resist(o_ptr);
2796 if (!one_in_(3)) break;
2801 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2803 create_artifact(o_ptr, FALSE);
2806 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
2808 switch (o_ptr->name2)
2810 case EGO_SLOW_DESCENT:
2813 one_high_resistance(o_ptr);
2819 else if (power < -1)
2821 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
2832 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2834 create_artifact(o_ptr, FALSE);
2839 bool ok_flag = TRUE;
2840 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
2842 switch (o_ptr->name2)
2845 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
2846 else add_esp_weak(o_ptr, FALSE);
2850 case EGO_REGENERATION:
2851 case EGO_LORDLINESS:
2857 if (one_in_(2)) add_esp_strong(o_ptr);
2858 else add_esp_weak(o_ptr, FALSE);
2861 default:/* not existing crown (wisdom,lite, etc...) */
2865 break; /* while (1) */
2871 else if (power < -1)
2875 bool ok_flag = TRUE;
2876 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
2878 switch (o_ptr->name2)
2880 case EGO_ANCIENT_CURSE:
2881 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2882 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2883 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2884 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2885 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2886 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2890 break; /* while (1) */
2899 if (o_ptr->sval == SV_DRAGON_HELM)
2901 dragon_resist(o_ptr);
2902 if (!one_in_(3)) break;
2908 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2910 create_artifact(o_ptr, FALSE);
2915 bool ok_flag = TRUE;
2916 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
2918 switch (o_ptr->name2)
2920 case EGO_BRILLIANCE:
2922 case EGO_INFRAVISION:
2923 case EGO_H_PROTECTION:
2928 if (one_in_(2)) add_esp_strong(o_ptr);
2929 else add_esp_weak(o_ptr, FALSE);
2933 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
2934 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
2937 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2939 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2941 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2942 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2944 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2945 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2946 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2947 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2948 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2949 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2950 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2951 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2953 default:/* not existing helm (Magi, Might, etc...)*/
2957 break; /* while (1) */
2962 else if (power < -1)
2966 bool ok_flag = TRUE;
2967 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
2969 switch (o_ptr->name2)
2971 case EGO_ANCIENT_CURSE:
2975 break; /* while (1) */
2986 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2988 create_artifact(o_ptr, FALSE);
2991 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
2993 switch (o_ptr->name2)
3002 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
3003 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
3004 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
3005 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3012 else if (power < -1)
3014 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3025 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
3026 * Apply magic to an item known to be a "ring" or "amulet"
3027 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3028 * @param level 生成基準階
3029 * @param power 生成ランク
3032 * Hack -- note special "pval boost" code for ring of speed\n
3033 * Hack -- note that some items must be cursed (or blessed)\n
3035 static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
3037 /* Apply magic (good or bad) according to type */
3038 switch (o_ptr->tval)
3043 switch (o_ptr->sval)
3045 case SV_RING_ATTACKS:
3048 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
3049 if (one_in_(15)) o_ptr->pval++;
3050 if (o_ptr->pval < 1) o_ptr->pval = 1;
3056 o_ptr->ident |= (IDENT_BROKEN);
3059 o_ptr->curse_flags |= TRC_CURSED;
3062 o_ptr->pval = 0 - (o_ptr->pval);
3073 /* Strength, Constitution, Dexterity, Intelligence */
3079 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3085 o_ptr->ident |= (IDENT_BROKEN);
3088 o_ptr->curse_flags |= TRC_CURSED;
3091 o_ptr->pval = 0 - (o_ptr->pval);
3097 /* Ring of Speed! */
3100 /* Base speed (1 to 10) */
3101 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3103 /* Super-charge the ring */
3104 while (randint0(100) < 50) o_ptr->pval++;
3110 o_ptr->ident |= (IDENT_BROKEN);
3113 o_ptr->curse_flags |= TRC_CURSED;
3116 o_ptr->pval = 0 - (o_ptr->pval);
3124 case SV_RING_LORDLY:
3128 one_lordly_high_resistance(o_ptr);
3132 /* Bonus to armor class */
3133 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3137 case SV_RING_WARNING:
3139 if (one_in_(3)) one_low_esp(o_ptr);
3144 case SV_RING_SEARCHING:
3146 /* Bonus to searching */
3147 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3153 o_ptr->ident |= (IDENT_BROKEN);
3156 o_ptr->curse_flags |= TRC_CURSED;
3159 o_ptr->pval = 0 - (o_ptr->pval);
3165 /* Flames, Acid, Ice */
3166 case SV_RING_FLAMES:
3171 /* Bonus to armor class */
3172 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3176 /* Weakness, Stupidity */
3177 case SV_RING_WEAKNESS:
3178 case SV_RING_STUPIDITY:
3181 o_ptr->ident |= (IDENT_BROKEN);
3184 o_ptr->curse_flags |= TRC_CURSED;
3187 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3188 if (power > 0) power = 0 - power;
3193 /* WOE, Stupidity */
3197 o_ptr->ident |= (IDENT_BROKEN);
3200 o_ptr->curse_flags |= TRC_CURSED;
3203 o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
3204 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3205 if (power > 0) power = 0 - power;
3210 /* Ring of damage */
3211 case SV_RING_DAMAGE:
3213 /* Bonus to damage */
3214 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
3220 o_ptr->ident |= (IDENT_BROKEN);
3223 o_ptr->curse_flags |= TRC_CURSED;
3226 o_ptr->to_d = 0 - o_ptr->to_d;
3232 /* Ring of Accuracy */
3233 case SV_RING_ACCURACY:
3236 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
3242 o_ptr->ident |= (IDENT_BROKEN);
3245 o_ptr->curse_flags |= TRC_CURSED;
3248 o_ptr->to_h = 0 - o_ptr->to_h;
3254 /* Ring of Protection */
3255 case SV_RING_PROTECTION:
3257 /* Bonus to armor class */
3258 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
3264 o_ptr->ident |= (IDENT_BROKEN);
3267 o_ptr->curse_flags |= TRC_CURSED;
3270 o_ptr->to_a = 0 - o_ptr->to_a;
3276 /* Ring of Slaying */
3277 case SV_RING_SLAYING:
3279 /* Bonus to damage and to hit */
3280 o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
3281 o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
3287 o_ptr->ident |= (IDENT_BROKEN);
3290 o_ptr->curse_flags |= TRC_CURSED;
3292 /* Reverse bonuses */
3293 o_ptr->to_h = 0 - o_ptr->to_h;
3294 o_ptr->to_d = 0 - o_ptr->to_d;
3300 case SV_RING_MUSCLE:
3302 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
3303 if (one_in_(4)) o_ptr->pval++;
3309 o_ptr->ident |= (IDENT_BROKEN);
3312 o_ptr->curse_flags |= TRC_CURSED;
3314 /* Reverse bonuses */
3315 o_ptr->pval = 0 - o_ptr->pval;
3320 case SV_RING_AGGRAVATION:
3323 o_ptr->ident |= (IDENT_BROKEN);
3326 o_ptr->curse_flags |= TRC_CURSED;
3328 if (power > 0) power = 0 - power;
3332 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3333 || (power > 2)) /* power > 2 is debug only */
3335 o_ptr->pval = MIN(o_ptr->pval, 4);
3336 /* Randart amulet */
3337 create_artifact(o_ptr, FALSE);
3339 else if ((power == 2) && one_in_(2))
3341 while(!o_ptr->name2)
3343 int tmp = m_bonus(10, level);
3344 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3345 switch(randint1(28))
3348 o_ptr->name2 = EGO_RING_THROW;
3351 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3352 o_ptr->name2 = EGO_RING_REGEN;
3355 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3356 o_ptr->name2 = EGO_RING_LITE;
3359 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3360 o_ptr->name2 = EGO_RING_TELEPORT;
3363 if (o_ptr->to_h) break;
3364 o_ptr->name2 = EGO_RING_TO_H;
3367 if (o_ptr->to_d) break;
3368 o_ptr->name2 = EGO_RING_TO_D;
3371 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3372 o_ptr->name2 = EGO_RING_SLAY;
3375 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3376 o_ptr->name2 = EGO_RING_WIZARD;
3379 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3380 o_ptr->name2 = EGO_RING_HERO;
3383 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3384 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3385 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3386 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3389 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3390 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;
3391 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3392 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3393 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3396 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3397 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;
3398 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3399 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3400 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3403 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3404 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;
3405 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3406 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3409 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3410 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;
3411 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3412 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3414 case 21: case 22: case 23: case 24: case 25: case 26:
3415 switch (o_ptr->sval)
3418 if (!one_in_(3)) break;
3419 o_ptr->name2 = EGO_RING_D_SPEED;
3421 case SV_RING_DAMAGE:
3422 case SV_RING_ACCURACY:
3423 case SV_RING_SLAYING:
3424 if (one_in_(2)) break;
3425 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3428 o_ptr->name2 = EGO_RING_BERSERKER;
3429 o_ptr->to_h -= 2+randint1(4);
3430 o_ptr->to_d += 2+randint1(4);
3433 case SV_RING_PROTECTION:
3434 o_ptr->name2 = EGO_RING_SUPER_AC;
3435 o_ptr->to_a += 7 + m_bonus(5, level);
3437 case SV_RING_RES_FEAR:
3438 o_ptr->name2 = EGO_RING_HERO;
3441 if (one_in_(2)) break;
3442 o_ptr->name2 = EGO_RING_HUNTER;
3444 case SV_RING_SEARCHING:
3445 o_ptr->name2 = EGO_RING_STEALTH;
3447 case SV_RING_TELEPORTATION:
3448 o_ptr->name2 = EGO_RING_TELE_AWAY;
3450 case SV_RING_RES_BLINDNESS:
3452 o_ptr->name2 = EGO_RING_RES_LITE;
3454 o_ptr->name2 = EGO_RING_RES_DARK;
3456 case SV_RING_LORDLY:
3457 if (!one_in_(20)) break;
3458 one_lordly_high_resistance(o_ptr);
3459 one_lordly_high_resistance(o_ptr);
3460 o_ptr->name2 = EGO_RING_TRUE;
3462 case SV_RING_SUSTAIN:
3463 if (!one_in_(4)) break;
3464 o_ptr->name2 = EGO_RING_RES_TIME;
3466 case SV_RING_FLAMES:
3467 if (!one_in_(2)) break;
3468 o_ptr->name2 = EGO_RING_DRAGON_F;
3471 if (!one_in_(2)) break;
3472 o_ptr->name2 = EGO_RING_DRAGON_C;
3474 case SV_RING_WARNING:
3475 if (!one_in_(2)) break;
3476 o_ptr->name2 = EGO_RING_M_DETECT;
3484 o_ptr->curse_flags = 0L;
3486 else if ((power == -2) && one_in_(2))
3488 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3489 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3490 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3491 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3492 o_ptr->art_flags[0] = 0;
3493 o_ptr->art_flags[1] = 0;
3494 while(!o_ptr->name2)
3496 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3500 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3501 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3504 o_ptr->name2 = EGO_RING_NO_MELEE;
3507 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3508 o_ptr->name2 = EGO_RING_AGGRAVATE;
3511 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3512 o_ptr->name2 = EGO_RING_TY_CURSE;
3515 o_ptr->name2 = EGO_RING_ALBINO;
3520 o_ptr->ident |= (IDENT_BROKEN);
3523 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3531 switch (o_ptr->sval)
3533 /* Amulet of wisdom/charisma */
3534 case SV_AMULET_INTELLIGENCE:
3535 case SV_AMULET_WISDOM:
3536 case SV_AMULET_CHARISMA:
3538 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3544 o_ptr->ident |= (IDENT_BROKEN);
3547 o_ptr->curse_flags |= (TRC_CURSED);
3549 /* Reverse bonuses */
3550 o_ptr->pval = 0 - o_ptr->pval;
3556 /* Amulet of brilliance */
3557 case SV_AMULET_BRILLIANCE:
3559 o_ptr->pval = 1 + m_bonus(3, level);
3560 if (one_in_(4)) o_ptr->pval++;
3566 o_ptr->ident |= (IDENT_BROKEN);
3569 o_ptr->curse_flags |= (TRC_CURSED);
3571 /* Reverse bonuses */
3572 o_ptr->pval = 0 - o_ptr->pval;
3578 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3582 o_ptr->curse_flags |= (TRC_CURSED);
3587 case SV_AMULET_RESISTANCE:
3589 if (one_in_(5)) one_high_resistance(o_ptr);
3590 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3594 /* Amulet of searching */
3595 case SV_AMULET_SEARCHING:
3597 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
3603 o_ptr->ident |= (IDENT_BROKEN);
3606 o_ptr->curse_flags |= (TRC_CURSED);
3608 /* Reverse bonuses */
3609 o_ptr->pval = 0 - (o_ptr->pval);
3615 /* Amulet of the Magi -- never cursed */
3616 case SV_AMULET_THE_MAGI:
3618 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3619 o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
3621 /* gain one low ESP */
3622 add_esp_weak(o_ptr, FALSE);
3627 /* Amulet of Doom -- always cursed */
3628 case SV_AMULET_DOOM:
3631 o_ptr->ident |= (IDENT_BROKEN);
3634 o_ptr->curse_flags |= (TRC_CURSED);
3637 o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
3638 o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
3639 if (power > 0) power = 0 - power;
3644 case SV_AMULET_MAGIC_MASTERY:
3646 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
3652 o_ptr->ident |= (IDENT_BROKEN);
3655 o_ptr->curse_flags |= (TRC_CURSED);
3657 /* Reverse bonuses */
3658 o_ptr->pval = 0 - o_ptr->pval;
3664 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3665 || (power > 2)) /* power > 2 is debug only */
3667 o_ptr->pval = MIN(o_ptr->pval, 4);
3668 /* Randart amulet */
3669 create_artifact(o_ptr, FALSE);
3671 else if ((power == 2) && one_in_(2))
3673 while(!o_ptr->name2)
3675 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3676 switch(randint1(21))
3679 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3680 o_ptr->name2 = EGO_AMU_SLOW_D;
3683 if (o_ptr->pval) break;
3684 o_ptr->name2 = EGO_AMU_INFRA;
3687 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3688 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3691 if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
3692 o_ptr->name2 = EGO_AMU_HOLD_EXP;
3695 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3696 o_ptr->name2 = EGO_AMU_LEVITATION;
3698 case 10: case 11: case 21:
3699 o_ptr->name2 = EGO_AMU_AC;
3702 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3703 if (m_bonus(10, level) > 8)
3704 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3706 o_ptr->name2 = EGO_AMU_RES_FIRE;
3709 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3710 if (m_bonus(10, level) > 8)
3711 o_ptr->name2 = EGO_AMU_RES_COLD_;
3713 o_ptr->name2 = EGO_AMU_RES_COLD;
3716 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3717 if (m_bonus(10, level) > 8)
3718 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3720 o_ptr->name2 = EGO_AMU_RES_ELEC;
3723 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3724 if (m_bonus(10, level) > 8)
3725 o_ptr->name2 = EGO_AMU_RES_ACID_;
3727 o_ptr->name2 = EGO_AMU_RES_ACID;
3729 case 16: case 17: case 18: case 19: case 20:
3730 switch (o_ptr->sval)
3732 case SV_AMULET_TELEPORT:
3733 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3734 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3735 else o_ptr->name2 = EGO_AMU_TELEPORT;
3737 case SV_AMULET_RESIST_ACID:
3738 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3740 case SV_AMULET_SEARCHING:
3741 o_ptr->name2 = EGO_AMU_STEALTH;
3743 case SV_AMULET_BRILLIANCE:
3744 if (!one_in_(3)) break;
3745 o_ptr->name2 = EGO_AMU_IDENT;
3747 case SV_AMULET_CHARISMA:
3748 if (!one_in_(3)) break;
3749 o_ptr->name2 = EGO_AMU_CHARM;
3751 case SV_AMULET_THE_MAGI:
3752 if (one_in_(2)) break;
3753 o_ptr->name2 = EGO_AMU_GREAT;
3755 case SV_AMULET_RESISTANCE:
3756 if (!one_in_(5)) break;
3757 o_ptr->name2 = EGO_AMU_DEFENDER;
3759 case SV_AMULET_TELEPATHY:
3760 if (!one_in_(3)) break;
3761 o_ptr->name2 = EGO_AMU_DETECTION;
3766 o_ptr->curse_flags = 0L;
3768 else if ((power == -2) && one_in_(2))
3770 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3771 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3772 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3773 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3774 o_ptr->art_flags[0] = 0;
3775 o_ptr->art_flags[1] = 0;
3776 while(!o_ptr->name2)
3778 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3782 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3783 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3786 o_ptr->name2 = EGO_AMU_FOOL;
3789 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3790 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3793 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3794 o_ptr->name2 = EGO_AMU_TY_CURSE;
3797 o_ptr->name2 = EGO_AMU_NAIVETY;
3802 o_ptr->ident |= (IDENT_BROKEN);
3805 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3813 * @brief モンスターが人形のベースにできるかを返す
3814 * @param r_idx チェックしたいモンスター種族のID
3815 * @return 人形にできるならTRUEを返す
3817 static bool item_monster_okay(MONRACE_IDX r_idx)
3819 monster_race *r_ptr = &r_info[r_idx];
3822 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
3823 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
3824 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
3825 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
3826 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
3827 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
3834 * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
3835 * Apply magic to an item known to be "boring"
3836 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3837 * @param level 生成基準階
3838 * @param power 生成ランク
3841 * Hack -- note the special code for various items
3843 static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
3845 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3850 /* Apply magic (good or bad) according to type */
3851 switch (o_ptr->tval)
3860 o_ptr->ident |= (IDENT_BROKEN);
3863 o_ptr->curse_flags |= (TRC_CURSED);
3870 o_ptr->xtra4 = o_ptr->pval;
3876 /* Hack -- Torches -- random fuel */
3877 if (o_ptr->sval == SV_LITE_TORCH)
3879 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
3883 /* Hack -- Lanterns -- random fuel */
3884 if (o_ptr->sval == SV_LITE_LANTERN)
3886 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
3890 if (power > 2) /* power > 2 is debug only */
3892 create_artifact(o_ptr, FALSE);
3894 else if ((power == 2) || ((power == 1) && one_in_(3)))
3896 while (!o_ptr->name2)
3900 bool okay_flag = TRUE;
3902 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
3904 switch (o_ptr->name2)
3907 if (o_ptr->sval == SV_LITE_FEANOR)
3915 else if (power == -2)
3917 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
3919 switch (o_ptr->name2)
3921 case EGO_LITE_DARKNESS:
3924 if (o_ptr->sval == SV_LITE_TORCH)
3926 add_flag(o_ptr->art_flags, TR_LITE_M1);
3928 else if (o_ptr->sval == SV_LITE_LANTERN)
3930 add_flag(o_ptr->art_flags, TR_LITE_M2);
3932 else if (o_ptr->sval == SV_LITE_FEANOR)
3934 add_flag(o_ptr->art_flags, TR_LITE_M3);
3946 /* The wand or staff gets a number of initial charges equal
3947 * to between 1/2 (+1) and the full object kind's pval. -LM-
3949 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
3955 /* Transfer the pval. -LM- */
3956 o_ptr->pval = k_ptr->pval;
3963 object_aware(o_ptr);
3964 object_known(o_ptr);
3970 PARAMETER_VALUE i = 1;
3973 monster_race *r_ptr;
3975 /* Pick a random non-unique monster race */
3978 i = randint1(max_r_idx - 1);
3980 if (!item_monster_okay(i)) continue;
3981 if (i == MON_TSUCHINOKO) continue;
3985 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
3987 /* Ignore dead monsters */
3988 if (!r_ptr->rarity) continue;
3990 /* Ignore uncommon monsters */
3991 if (r_ptr->rarity > 100) continue;
3993 /* Prefer less out-of-depth monsters */
3994 if (randint0(check)) continue;
4001 /* Some figurines are cursed */
4002 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
4009 PARAMETER_VALUE i = 1;
4014 monster_race *r_ptr;
4016 if (o_ptr->sval == SV_SKELETON)
4018 match = RF9_DROP_SKELETON;
4020 else if (o_ptr->sval == SV_CORPSE)
4022 match = RF9_DROP_CORPSE;
4025 /* Hack -- Remove the monster restriction */
4026 get_mon_num_prep(item_monster_okay, NULL);
4028 /* Pick a random non-unique monster race */
4031 i = get_mon_num(dun_level);
4035 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4037 /* Ignore dead monsters */
4038 if (!r_ptr->rarity) continue;
4040 /* Ignore corpseless monsters */
4041 if (!(r_ptr->flags9 & match)) continue;
4043 /* Prefer less out-of-depth monsters */
4044 if (randint0(check)) continue;
4052 object_aware(o_ptr);
4053 object_known(o_ptr);
4059 PARAMETER_VALUE i = 1;
4061 monster_race *r_ptr;
4063 /* Pick a random monster race */
4066 i = randint1(max_r_idx - 1);
4070 /* Ignore dead monsters */
4071 if (!r_ptr->rarity) continue;
4080 msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
4082 object_aware(o_ptr);
4083 object_known(o_ptr);
4090 DEPTH obj_level = k_info[o_ptr->k_idx].level;
4092 /* Hack -- skip ruined chests */
4093 if (obj_level <= 0) break;
4095 /* Hack -- pick a "difficulty" */
4096 o_ptr->pval = randint1(obj_level);
4097 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4099 o_ptr->xtra3 = dun_level + 5;
4101 /* Never exceed "difficulty" of 55 to 59 */
4102 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4110 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
4111 * Complete the "creation" of an object by applying "magic" to the item
4112 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4114 * @param mode 生成オプション
4117 * This includes not only rolling for random bonuses, but also putting the\n
4118 * finishing touches on ego-items and artifacts, giving charges to wands and\n
4119 * staffs, giving fuel to lites, and placing traps on chests.\n
4121 * In particular, note that "Instant Artifacts", if "created" by an external\n
4122 * routine, must pass through this function to complete the actual creation.\n
4124 * The base "chance" of the item being "good" increases with the "level"\n
4125 * parameter, which is usually derived from the dungeon level, being equal\n
4126 * to the level plus 10, up to a maximum of 75. If "good" is true, then\n
4127 * the object is guaranteed to be "good". If an object is "good", then\n
4128 * the chance that the object will be "great" (ego-item or artifact), also\n
4129 * increases with the "level", being equal to half the level, plus 5, up to\n
4130 * a maximum of 20. If "great" is true, then the object is guaranteed to be\n
4131 * "great". At dungeon level 65 and below, 15/100 objects are "great".\n
4133 * If the object is not "good", there is a chance it will be "cursed", and\n
4134 * if it is "cursed", there is a chance it will be "broken". These chances\n
4135 * are related to the "good" / "great" chances above.\n
4137 * Otherwise "normal" rings and amulets will be "good" half the time and\n
4138 * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4140 * If "okay" is true, and the object is going to be "great", then there is\n
4141 * a chance that an artifact will be created. This is true even if both the\n
4142 * "good" and "great" arguments are false. As a total hack, if "great" is\n
4143 * true, then the item gets 3 extra "attempts" to become an artifact.\n
4145 void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
4147 int i, rolls, f1, f2, power;
4149 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4151 /* Maximum "level" for various things */
4152 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4154 /* Base chance of being "good" */
4157 /* Maximal chance of being "good" */
4158 if (f1 > d_info[p_ptr->dungeon_idx].obj_good) f1 = d_info[p_ptr->dungeon_idx].obj_good;
4160 /* Base chance of being "great" */
4163 /* Maximal chance of being "great" */
4164 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[p_ptr->dungeon_idx].obj_great))
4165 f2 = d_info[p_ptr->dungeon_idx].obj_great;
4167 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4172 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4181 /* Roll for "good" */
4182 if ((mode & AM_GOOD) || magik(f1))
4187 /* Roll for "great" */
4188 if ((mode & AM_GREAT) || magik(f2))
4192 /* Roll for "special" */
4193 if (mode & AM_SPECIAL) power = 3;
4197 /* Roll for "cursed" */
4200 /* Assume "cursed" */
4203 /* Roll for "broken" */
4204 if (magik(f2)) power = -2;
4208 if (mode & AM_CURSED)
4210 /* Assume 'cursed' */
4215 /* Everything else gets more badly cursed */
4222 /* Assume no rolls */
4225 /* Get one roll if excellent */
4226 if (power >= 2) rolls = 1;
4228 /* Hack -- Get four rolls if forced great or special */
4229 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4231 /* Hack -- Get no rolls if not allowed */
4232 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4234 /* Roll for artifacts if allowed */
4235 for (i = 0; i < rolls; i++)
4237 /* Roll for an artifact */
4238 if (make_artifact(o_ptr)) break;
4239 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4241 if (make_artifact(o_ptr)) break;
4246 /* Hack -- analyze artifacts */
4247 if (object_is_fixed_artifact(o_ptr))
4249 artifact_type *a_ptr = &a_info[o_ptr->name1];
4251 /* Hack -- Mark the artifact as "created" */
4254 /* Hack -- Memorize location of artifact in saved floors */
4255 if (character_dungeon)
4256 a_ptr->floor_id = p_ptr->floor_id;
4258 /* Extract the other fields */
4259 o_ptr->pval = a_ptr->pval;
4260 o_ptr->ac = a_ptr->ac;
4261 o_ptr->dd = a_ptr->dd;
4262 o_ptr->ds = a_ptr->ds;
4263 o_ptr->to_a = a_ptr->to_a;
4264 o_ptr->to_h = a_ptr->to_h;
4265 o_ptr->to_d = a_ptr->to_d;
4266 o_ptr->weight = a_ptr->weight;
4267 o_ptr->xtra2 = a_ptr->act_idx;
4269 if (o_ptr->name1 == ART_MILIM)
4271 if(p_ptr->pseikaku == SEIKAKU_SEXY)
4277 /* Hack -- extract the "broken" flag */
4278 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4280 /* Hack -- extract the "cursed" flag */
4281 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4282 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4283 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4284 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4285 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4286 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4291 switch (o_ptr->tval)
4300 if (power) a_m_aux_1(o_ptr, lev, power);
4306 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4312 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4326 /* Elven Cloak and Black Clothes ... */
4327 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4328 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4329 o_ptr->pval = randint1(4);
4333 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4334 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4335 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4336 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4337 a_m_aux_2(o_ptr, lev, power);
4339 if (power) a_m_aux_2(o_ptr, lev, power);
4347 if (!power && (randint0(100) < 50)) power = -1;
4348 a_m_aux_3(o_ptr, lev, power);
4354 a_m_aux_4(o_ptr, lev, power);
4359 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4360 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4361 (p_ptr->pseikaku == SEIKAKU_SEXY))
4364 add_flag(o_ptr->art_flags, TR_STR);
4365 add_flag(o_ptr->art_flags, TR_INT);
4366 add_flag(o_ptr->art_flags, TR_WIS);
4367 add_flag(o_ptr->art_flags, TR_DEX);
4368 add_flag(o_ptr->art_flags, TR_CON);
4369 add_flag(o_ptr->art_flags, TR_CHR);
4372 /* Hack -- analyze ego-items */
4373 if (object_is_ego(o_ptr))
4375 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4377 /* Hack -- acquire "broken" flag */
4378 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4380 /* Hack -- acquire "cursed" flag */
4381 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4382 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4383 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4384 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4385 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4386 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4388 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4389 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4390 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4391 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4392 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4393 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4394 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4395 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4401 while (one_in_(o_ptr->dd));
4403 if (o_ptr->dd > 9) o_ptr->dd = 9;
4406 /* Hack -- apply activatin index if needed */
4407 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
4409 /* Hack -- apply extra penalties if needed */
4410 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4412 /* Hack -- obtain bonuses */
4413 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4414 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4415 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4417 /* Hack -- obtain pval */
4418 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4421 /* Hack -- apply extra bonuses if needed */
4424 /* Hack -- obtain bonuses */
4425 if (e_ptr->max_to_h)
4427 if (e_ptr->max_to_h > 127)
4428 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4429 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4431 if (e_ptr->max_to_d)
4433 if (e_ptr->max_to_d > 127)
4434 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4435 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4437 if (e_ptr->max_to_a)
4439 if (e_ptr->max_to_a > 127)
4440 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4441 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4444 /* Accuracy ego must have high to_h */
4445 if(o_ptr->name2 == EGO_ACCURACY)
4447 while(o_ptr->to_h < o_ptr->to_d + 10)
4452 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4455 /* Accuracy ego must have high to_h */
4456 if(o_ptr->name2 == EGO_VELOCITY)
4458 while(o_ptr->to_d < o_ptr->to_h + 10)
4463 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4466 /* Protection ego must have high to_a */
4467 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4469 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4472 /* Hack -- obtain pval */
4473 if (e_ptr->max_pval)
4475 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4478 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4480 else if (o_ptr->name2 == EGO_DEMON)
4482 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4484 o_ptr->pval += randint1(2);
4488 o_ptr->pval += randint1(e_ptr->max_pval);
4491 else if (o_ptr->name2 == EGO_ATTACKS)
4493 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4494 if (o_ptr->pval > 3) o_ptr->pval = 3;
4495 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4496 o_ptr->pval += randint1(2);
4498 else if (o_ptr->name2 == EGO_BAT)
4500 o_ptr->pval = randint1(e_ptr->max_pval);
4501 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4503 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4505 o_ptr->pval = randint1(e_ptr->max_pval);
4509 o_ptr->pval += randint1(e_ptr->max_pval);
4514 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4516 o_ptr->pval = randint1(o_ptr->pval);
4518 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4525 /* Examine real objects */
4528 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4530 /* Hack -- acquire "broken" flag */
4531 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4533 /* Hack -- acquire "cursed" flag */
4534 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4535 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4536 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4537 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4538 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4539 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4547 * @brief ベースアイテムが上質として扱われるかどうかを返す。
4548 * Hack -- determine if a template is "good"
4549 * @param k_idx 判定したいベースアイテムのID
4550 * @return ベースアイテムが上質ならばTRUEを返す。
4552 static bool kind_is_good(KIND_OBJECT_IDX k_idx)
4554 object_kind *k_ptr = &k_info[k_idx];
4556 /* Analyze the item type */
4557 switch (k_ptr->tval)
4559 /* Armor -- Good unless damaged */
4570 if (k_ptr->to_a < 0) return (FALSE);
4574 /* Weapons -- Good unless damaged */
4581 if (k_ptr->to_h < 0) return (FALSE);
4582 if (k_ptr->to_d < 0) return (FALSE);
4586 /* Ammo -- Arrows/Bolts are good */
4593 /* Books -- High level books are good (except Arcane books) */
4595 case TV_SORCERY_BOOK:
4596 case TV_NATURE_BOOK:
4601 case TV_DAEMON_BOOK:
4602 case TV_CRUSADE_BOOK:
4604 case TV_HISSATSU_BOOK:
4607 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4611 /* Rings -- Rings of Speed are good */
4614 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4615 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4619 /* Amulets -- Amulets of the Magi and Resistance are good */
4622 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4623 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4628 /* Assume not good */
4633 * @brief 生成階に応じたベースアイテムの生成を行う。
4634 * Attempt to make an object (normal or good/great)
4635 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4636 * @param mode オプションフラグ
4637 * @return 生成に成功したらTRUEを返す。
4639 * This routine plays nasty games to generate the "special artifacts".\n
4640 * This routine uses "object_level" for the "generation level".\n
4641 * We assume that the given object has been "wiped".\n
4643 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
4649 /* Chance of "special object" */
4650 prob = ((mode & AM_GOOD) ? 10 : 1000);
4652 /* Base level for the object */
4653 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4656 /* Generate a special object, or a normal object */
4657 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4659 KIND_OBJECT_IDX k_idx;
4662 if ((mode & AM_GOOD) && !get_obj_num_hook)
4664 /* Activate restriction (if already specified, use that) */
4665 get_obj_num_hook = kind_is_good;
4668 /* Restricted objects - prepare allocation table */
4669 if (get_obj_num_hook) get_obj_num_prep();
4671 /* Pick a random object */
4672 k_idx = get_obj_num(base);
4674 /* Restricted objects */
4675 if (get_obj_num_hook)
4677 /* Clear restriction */
4678 get_obj_num_hook = NULL;
4680 /* Reset allocation table to default */
4684 /* Handle failure */
4685 if (!k_idx) return (FALSE);
4687 /* Prepare the object */
4688 object_prep(j_ptr, k_idx);
4691 /* Apply magic (allow artifacts) */
4692 apply_magic(j_ptr, object_level, mode);
4694 /* Hack -- generate multiple spikes/missiles */
4695 switch (j_ptr->tval)
4703 j_ptr->number = (byte)damroll(6, 7);
4707 if (cheat_peek) object_mention(j_ptr);
4715 * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
4716 * Attempt to place an object (normal or good/great) at the given location.
4717 * @param y 配置したいフロアのY座標
4718 * @param x 配置したいフロアのX座標
4719 * @param mode オプションフラグ
4720 * @return 生成に成功したらTRUEを返す。
4722 * This routine plays nasty games to generate the "special artifacts".\n
4723 * This routine uses "object_level" for the "generation level".\n
4724 * This routine requires a clean floor grid destination.\n
4726 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
4731 grid_type *g_ptr = &grid_array[y][x];
4737 /* Paranoia -- check bounds */
4738 if (!in_bounds(y, x)) return;
4740 /* Require floor space */
4741 if (!cave_drop_bold(y, x)) return;
4743 /* Avoid stacking on other objects */
4744 if (g_ptr->o_idx) return;
4749 /* Make an object (if possible) */
4750 if (!make_object(q_ptr, mode)) return;
4753 /* Make an object */
4760 o_ptr = &o_list[o_idx];
4762 /* Structure Copy */
4763 object_copy(o_ptr, q_ptr);
4769 o_ptr->next_o_idx = g_ptr->o_idx;
4771 /* Place the object */
4772 g_ptr->o_idx = o_idx;
4780 /* Hack -- Preserve artifacts */
4781 if (object_is_fixed_artifact(q_ptr))
4783 a_info[q_ptr->name1].cur_num = 0;
4790 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
4791 * Make a treasure object
4792 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4793 * @return 生成に成功したらTRUEを返す。
4795 * The location must be a legal, clean, floor grid.
4797 bool make_gold(object_type *j_ptr)
4802 /* Hack -- Pick a Treasure variety */
4803 i = ((randint1(object_level + 2) + 2) / 2) - 1;
4805 /* Apply "extra" magic */
4806 if (one_in_(GREAT_OBJ))
4808 i += randint1(object_level + 1);
4811 /* Hack -- Creeping Coins only generate "themselves" */
4812 if (coin_type) i = coin_type;
4814 /* Do not create "illegal" Treasure Types */
4815 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
4817 /* Prepare a gold object */
4818 object_prep(j_ptr, OBJ_GOLD_LIST + i);
4820 /* Hack -- Base coin cost */
4821 base = k_info[OBJ_GOLD_LIST + i].cost;
4823 /* Determine how much the treasure is "worth" */
4824 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
4832 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
4833 * Places a treasure (Gold or Gems) at given location
4834 * @param y 配置したいフロアのY座標
4835 * @param x 配置したいフロアのX座標
4836 * @return 生成に成功したらTRUEを返す。
4838 * The location must be a legal, clean, floor grid.
4840 void place_gold(POSITION y, POSITION x)
4845 grid_type *g_ptr = &grid_array[y][x];
4851 /* Paranoia -- check bounds */
4852 if (!in_bounds(y, x)) return;
4854 /* Require floor space */
4855 if (!cave_drop_bold(y, x)) return;
4857 /* Avoid stacking on other objects */
4858 if (g_ptr->o_idx) return;
4863 /* Make some gold */
4864 if (!make_gold(q_ptr)) return;
4866 /* Make an object */
4873 o_ptr = &o_list[o_idx];
4875 /* Copy the object */
4876 object_copy(o_ptr, q_ptr);
4883 o_ptr->next_o_idx = g_ptr->o_idx;
4885 /* Place the object */
4886 g_ptr->o_idx = o_idx;
4896 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
4897 * Let an object fall to the ground at or near a location.
4898 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
4899 * @param chance ドロップの成功率(%)
4900 * @param y 配置したいフロアのY座標
4901 * @param x 配置したいフロアのX座標
4902 * @return 生成に成功したらオブジェクトのIDを返す。
4904 * The initial location is assumed to be "in_bounds()".\n
4906 * This function takes a parameter "chance". This is the percentage\n
4907 * chance that the item will "disappear" instead of drop. If the object\n
4908 * has been thrown, then this is the chance of disappearance on contact.\n
4910 * Hack -- this function uses "chance" to determine if it should produce\n
4911 * some form of "description" of the drop event (under the player).\n
4913 * We check several locations to see if we can find a location at which\n
4914 * the object can combine, stack, or be placed. Artifacts will try very\n
4915 * hard to be placed, including "teleporting" to a useful grid if needed.\n
4917 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
4924 POSITION ty, tx = 0;
4926 OBJECT_IDX o_idx = 0;
4927 OBJECT_IDX this_o_idx, next_o_idx = 0;
4931 GAME_TEXT o_name[MAX_NLEN];
4937 /* Extract plural */
4938 bool plural = (j_ptr->number != 1);
4941 /* Describe object */
4942 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
4945 /* Handle normal "breakage" */
4946 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
4949 msg_format("%sは消えた。", o_name);
4951 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
4954 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
4971 /* Scan local grids */
4972 for (dy = -3; dy <= 3; dy++)
4974 /* Scan local grids */
4975 for (dx = -3; dx <= 3; dx++)
4979 /* Calculate actual distance */
4980 d = (dy * dy) + (dx * dx);
4982 /* Ignore distant grids */
4983 if (d > 10) continue;
4988 /* Skip illegal grids */
4989 if (!in_bounds(ty, tx)) continue;
4991 /* Require line of projection */
4992 if (!projectable(y, x, ty, tx)) continue;
4995 g_ptr = &grid_array[ty][tx];
4997 /* Require floor space */
4998 if (!cave_drop_bold(ty, tx)) continue;
5003 /* Scan objects in that grid */
5004 for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5007 o_ptr = &o_list[this_o_idx];
5009 /* Acquire next object */
5010 next_o_idx = o_ptr->next_o_idx;
5012 /* Check for possible combination */
5013 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5019 /* Add new object */
5023 if (k > 99) continue;
5025 /* Calculate score */
5026 s = 1000 - (d + k * 5);
5028 /* Skip bad values */
5029 if (s < bs) continue;
5031 /* New best value */
5034 /* Apply the randomizer to equivalent values */
5035 if ((++bn >= 2) && !one_in_(bn)) continue;
5049 /* Handle lack of space */
5050 if (!flag && !object_is_artifact(j_ptr))
5053 msg_format("%sは消えた。", o_name);
5055 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5060 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5068 for (i = 0; !flag && (i < 1000); i++)
5071 ty = rand_spread(by, 1);
5072 tx = rand_spread(bx, 1);
5074 /* Verify location */
5075 if (!in_bounds(ty, tx)) continue;
5077 /* Bounce to that location */
5081 /* Require floor space */
5082 if (!cave_drop_bold(by, bx)) continue;
5090 int candidates = 0, pick;
5092 for (ty = 1; ty < cur_hgt - 1; ty++)
5094 for (tx = 1; tx < cur_wid - 1; tx++)
5096 /* A valid space found */
5097 if (cave_drop_bold(ty, tx)) candidates++;
5101 /* No valid place! */
5105 msg_format("%sは消えた。", o_name);
5107 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5111 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5113 /* Mega-Hack -- preserve artifacts */
5116 /* Hack -- Preserve unknown artifacts */
5117 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5119 /* Mega-Hack -- Preserve the artifact */
5120 a_info[j_ptr->name1].cur_num = 0;
5128 /* Choose a random one */
5129 pick = randint1(candidates);
5131 for (ty = 1; ty < cur_hgt - 1; ty++)
5133 for (tx = 1; tx < cur_wid - 1; tx++)
5135 if (cave_drop_bold(ty, tx))
5139 /* Is this a picked one? */
5152 g_ptr = &grid_array[by][bx];
5154 /* Scan objects in that grid for combination */
5155 for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5158 o_ptr = &o_list[this_o_idx];
5160 /* Acquire next object */
5161 next_o_idx = o_ptr->next_o_idx;
5163 /* Check for combination */
5164 if (object_similar(o_ptr, j_ptr))
5166 object_absorb(o_ptr, j_ptr);
5175 if (!done) o_idx = o_pop();
5178 if (!done && !o_idx)
5181 msg_format("%sは消えた。", o_name);
5183 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5187 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5189 /* Hack -- Preserve artifacts */
5190 if (object_is_fixed_artifact(j_ptr))
5192 a_info[j_ptr->name1].cur_num = 0;
5202 /* Structure copy */
5203 object_copy(&o_list[o_idx], j_ptr);
5205 /* Access new object */
5206 j_ptr = &o_list[o_idx];
5213 j_ptr->held_m_idx = 0;
5216 j_ptr->next_o_idx = g_ptr->o_idx;
5218 /* Place the object */
5219 g_ptr->o_idx = o_idx;
5229 /* Mega-Hack -- no message if "dropped" by player */
5230 /* Message when an object falls under the player */
5231 if (chance && player_bold(by, bx))
5233 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5240 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5241 * Describe the charges on an item in the inventory.
5242 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5245 void inven_item_charges(INVENTORY_IDX item)
5247 object_type *o_ptr = &inventory[item];
5249 /* Require staff/wand */
5250 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5252 /* Require known item */
5253 if (!object_is_known(o_ptr)) return;
5256 if (o_ptr->pval <= 0)
5258 msg_print("もう魔力が残っていない。");
5262 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5265 /* Multiple charges */
5266 if (o_ptr->pval != 1)
5268 msg_format("You have %d charges remaining.", o_ptr->pval);
5274 msg_format("You have %d charge remaining.", o_ptr->pval);
5281 * @brief アイテムの残り所持数メッセージを表示する /
5282 * Describe an item in the inventory.
5283 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5286 void inven_item_describe(INVENTORY_IDX item)
5288 object_type *o_ptr = &inventory[item];
5289 GAME_TEXT o_name[MAX_NLEN];
5291 object_desc(o_name, o_ptr, 0);
5294 /* "no more" の場合はこちらで表示する */
5295 if (o_ptr->number <= 0)
5297 /*FIRST*//*ここはもう通らないかも */
5298 msg_format("もう%sを持っていない。", o_name);
5302 /* アイテム名を英日切り替え機能対応 */
5303 msg_format("まだ %sを持っている。", o_name);
5306 msg_format("You have %s.", o_name);
5312 * @brief アイテムを増減させ残り所持数メッセージを表示する /
5313 * Increase the "number" of an item in the inventory
5314 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5318 void inven_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
5320 object_type *o_ptr = &inventory[item];
5323 num += o_ptr->number;
5326 if (num > 255) num = 255;
5327 else if (num < 0) num = 0;
5330 num -= o_ptr->number;
5332 /* Change the number and weight */
5335 /* Add the number */
5336 o_ptr->number += num;
5338 /* Add the weight */
5339 p_ptr->total_weight += (num * o_ptr->weight);
5340 p_ptr->update |= (PU_BONUS);
5342 /* Recalculate mana XXX */
5343 p_ptr->update |= (PU_MANA);
5344 p_ptr->update |= (PU_COMBINE);
5345 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5347 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5348 if (!o_ptr->number && p_ptr->ele_attack)
5350 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5352 if (!has_melee_weapon(INVEN_RARM + INVEN_LARM - item))
5354 /* Clear all temporary elemental brands */
5355 set_ele_attack(0, 0);
5363 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5364 * Erase an inventory slot if it has no more items
5365 * @param item 消去したいプレイヤーのアイテム所持スロット
5368 void inven_item_optimize(INVENTORY_IDX item)
5370 object_type *o_ptr = &inventory[item];
5372 /* Only optimize real items */
5373 if (!o_ptr->k_idx) return;
5375 /* Only optimize empty items */
5376 if (o_ptr->number) return;
5378 /* The item is in the pack */
5379 if (item < INVEN_RARM)
5386 /* Slide everything down */
5387 for (i = item; i < INVEN_PACK; i++)
5389 /* Structure copy */
5390 inventory[i] = inventory[i+1];
5393 /* Erase the "final" slot */
5394 object_wipe(&inventory[i]);
5396 p_ptr->window |= (PW_INVEN);
5399 /* The item is being wielded */
5405 /* Erase the empty slot */
5406 object_wipe(&inventory[item]);
5407 p_ptr->update |= (PU_BONUS);
5409 /* Recalculate torch */
5410 p_ptr->update |= (PU_TORCH);
5412 /* Recalculate mana XXX */
5413 p_ptr->update |= (PU_MANA);
5415 p_ptr->window |= (PW_EQUIP);
5418 p_ptr->window |= (PW_SPELL);
5422 * @brief 床上の魔道具の残り残量メッセージを表示する /
5423 * Describe the charges on an item on the floor.
5424 * @param item メッセージの対象にしたいアイテム所持スロット
5427 void floor_item_charges(INVENTORY_IDX item)
5429 object_type *o_ptr = &o_list[item];
5431 /* Require staff/wand */
5432 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5434 /* Require known item */
5435 if (!object_is_known(o_ptr)) return;
5438 if (o_ptr->pval <= 0)
5440 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5444 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5447 /* Multiple charges */
5448 if (o_ptr->pval != 1)
5450 msg_format("There are %d charges remaining.", o_ptr->pval);
5456 msg_format("There is %d charge remaining.", o_ptr->pval);
5463 * @brief 床上のアイテムの残り数メッセージを表示する /
5464 * Describe the charges on an item on the floor.
5465 * @param item メッセージの対象にしたいアイテム所持スロット
5468 void floor_item_describe(INVENTORY_IDX item)
5470 object_type *o_ptr = &o_list[item];
5471 GAME_TEXT o_name[MAX_NLEN];
5473 object_desc(o_name, o_ptr, 0);
5476 /* "no more" の場合はこちらで表示を分ける */
5477 if (o_ptr->number <= 0)
5479 msg_format("床上には、もう%sはない。", o_name);
5483 msg_format("床上には、まだ %sがある。", o_name);
5486 msg_format("You see %s.", o_name);
5493 * @brief 床上のアイテムの数を増やす /
5494 * Increase the "number" of an item on the floor
5495 * @param item 増やしたいアイテムの所持スロット
5496 * @param num 増やしたいアイテムの数
5499 void floor_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
5501 object_type *o_ptr = &o_list[item];
5504 num += o_ptr->number;
5507 if (num > 255) num = 255;
5508 else if (num < 0) num = 0;
5511 num -= o_ptr->number;
5513 /* Change the number */
5514 o_ptr->number += num;
5519 * @brief 床上の数の無くなったアイテムスロットを消去する /
5520 * Optimize an item on the floor (destroy "empty" items)
5521 * @param item 消去したいアイテムの所持スロット
5524 void floor_item_optimize(INVENTORY_IDX item)
5526 object_type *o_ptr = &o_list[item];
5528 /* Paranoia -- be sure it exists */
5529 if (!o_ptr->k_idx) return;
5531 /* Only optimize empty items */
5532 if (o_ptr->number) return;
5534 delete_object_idx(item);
5539 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5540 * Check if we have space for an item in the pack without overflow
5541 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5542 * @return 溢れずに済むならTRUEを返す
5544 bool inven_carry_okay(object_type *o_ptr)
5549 if (inven_cnt < INVEN_PACK) return (TRUE);
5552 for (j = 0; j < INVEN_PACK; j++)
5554 object_type *j_ptr = &inventory[j];
5556 /* Skip non-objects */
5557 if (!j_ptr->k_idx) continue;
5559 /* Check if the two items can be combined */
5560 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5567 * @brief オブジェクトを定義された基準に従いソートするための関数 /
5568 * Check if we have space for an item in the pack without overflow
5569 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
5570 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
5571 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
5572 * @return o_ptrの方が上位ならばTRUEを返す。
5574 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5578 /* Use empty slots */
5579 if (!j_ptr->k_idx) return TRUE;
5581 /* Hack -- readable books always come first */
5582 if ((o_ptr->tval == REALM1_BOOK) &&
5583 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5584 if ((j_ptr->tval == REALM1_BOOK) &&
5585 (o_ptr->tval != REALM1_BOOK)) return FALSE;
5587 if ((o_ptr->tval == REALM2_BOOK) &&
5588 (j_ptr->tval != REALM2_BOOK)) return TRUE;
5589 if ((j_ptr->tval == REALM2_BOOK) &&
5590 (o_ptr->tval != REALM2_BOOK)) return FALSE;
5592 /* Objects sort by decreasing type */
5593 if (o_ptr->tval > j_ptr->tval) return TRUE;
5594 if (o_ptr->tval < j_ptr->tval) return FALSE;
5596 /* Non-aware (flavored) items always come last */
5597 /* Can happen in the home */
5598 if (!object_is_aware(o_ptr)) return FALSE;
5599 if (!object_is_aware(j_ptr)) return TRUE;
5601 /* Objects sort by increasing sval */
5602 if (o_ptr->sval < j_ptr->sval) return TRUE;
5603 if (o_ptr->sval > j_ptr->sval) return FALSE;
5605 /* Unidentified objects always come last */
5606 /* Objects in the home can be unknown */
5607 if (!object_is_known(o_ptr)) return FALSE;
5608 if (!object_is_known(j_ptr)) return TRUE;
5610 /* Fixed artifacts, random artifacts and ego items */
5611 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
5612 else if (o_ptr->art_name) o_type = 2;
5613 else if (object_is_ego(o_ptr)) o_type = 1;
5616 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
5617 else if (j_ptr->art_name) j_type = 2;
5618 else if (object_is_ego(j_ptr)) j_type = 1;
5621 if (o_type < j_type) return TRUE;
5622 if (o_type > j_type) return FALSE;
5624 switch (o_ptr->tval)
5630 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
5631 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
5637 /* Objects sort by increasing hit/damage bonuses */
5638 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
5639 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
5642 /* Hack: otherwise identical rods sort by
5643 increasing recharge time --dsb */
5645 if (o_ptr->pval < j_ptr->pval) return TRUE;
5646 if (o_ptr->pval > j_ptr->pval) return FALSE;
5650 /* Objects sort by decreasing value */
5651 return o_value > object_value(j_ptr);
5656 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
5657 * Add an item to the players inventory, and return the slot used.
5658 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
5659 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
5661 * If the new item can combine with an existing item in the inventory,\n
5662 * it will do so, using "object_similar()" and "object_absorb()", else,\n
5663 * the item will be placed into the "proper" location in the inventory.\n
5665 * This function can be used to "over-fill" the player's pack, but only\n
5666 * once, and such an action must trigger the "overflow" code immediately.\n
5667 * Note that when the pack is being "over-filled", the new item must be\n
5668 * placed into the "overflow" slot, and the "overflow" must take place\n
5669 * before the pack is reordered, but (optionally) after the pack is\n
5670 * combined. This may be tricky. See "dungeon.c" for info.\n
5672 * Note that this code must remove any location/stack information\n
5673 * from the object once it is placed into the inventory.\n
5675 s16b inven_carry(object_type *o_ptr)
5677 INVENTORY_IDX i, j, k;
5678 INVENTORY_IDX n = -1;
5683 /* Check for combining */
5684 for (j = 0; j < INVEN_PACK; j++)
5686 j_ptr = &inventory[j];
5688 /* Skip non-objects */
5689 if (!j_ptr->k_idx) continue;
5691 /* Hack -- track last item */
5694 /* Check if the two items can be combined */
5695 if (object_similar(j_ptr, o_ptr))
5697 object_absorb(j_ptr, o_ptr);
5699 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
5700 p_ptr->update |= (PU_BONUS);
5701 p_ptr->window |= (PW_INVEN);
5710 if (inven_cnt > INVEN_PACK) return (-1);
5712 /* Find an empty slot */
5713 for (j = 0; j <= INVEN_PACK; j++)
5715 j_ptr = &inventory[j];
5717 /* Use it if found */
5718 if (!j_ptr->k_idx) break;
5725 /* Reorder the pack */
5728 /* Get the "value" of the item */
5729 s32b o_value = object_value(o_ptr);
5731 /* Scan every occupied slot */
5732 for (j = 0; j < INVEN_PACK; j++)
5734 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
5741 for (k = n; k >= i; k--)
5743 /* Hack -- Slide the item */
5744 object_copy(&inventory[k+1], &inventory[k]);
5747 /* Wipe the empty slot */
5748 object_wipe(&inventory[i]);
5753 object_copy(&inventory[i], o_ptr);
5755 /* Access new object */
5756 j_ptr = &inventory[i];
5759 j_ptr->next_o_idx = 0;
5761 /* Forget monster */
5762 j_ptr->held_m_idx = 0;
5764 /* Forget location */
5765 j_ptr->iy = j_ptr->ix = 0;
5767 /* Player touches it, and no longer marked */
5768 j_ptr->marked = OM_TOUCHED;
5770 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
5772 /* Count the items */
5774 p_ptr->update |= (PU_BONUS | PU_COMBINE | PU_REORDER);
5775 p_ptr->window |= (PW_INVEN);
5777 /* Return the slot */
5783 * @brief 装備スロットからオブジェクトを外すメインルーチン /
5784 * Take off (some of) a non-cursed equipment item
5785 * @param item オブジェクトを外したい所持テーブルのID
5787 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
5789 * Note that only one item at a time can be wielded per slot.\n
5790 * Note that taking off an item when "full" may cause that item\n
5791 * to fall to the ground.\n
5792 * Return the inventory slot into which the item is placed.\n
5794 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
5805 GAME_TEXT o_name[MAX_NLEN];
5808 /* Get the item to take off */
5809 o_ptr = &inventory[item];
5812 if (amt <= 0) return (-1);
5815 if (amt > o_ptr->number) amt = o_ptr->number;
5818 /* Obtain a local object */
5819 object_copy(q_ptr, o_ptr);
5821 /* Modify quantity */
5822 q_ptr->number = amt;
5824 object_desc(o_name, q_ptr, 0);
5826 /* Took off weapon */
5827 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
5828 object_is_melee_weapon(o_ptr))
5830 act = _("を装備からはずした", "You were wielding");
5834 else if (item == INVEN_BOW)
5836 act = _("を装備からはずした", "You were holding");
5839 /* Took off light */
5840 else if (item == INVEN_LITE)
5842 act = _("を光源からはずした", "You were holding");
5845 /* Took off something */
5848 act = _("を装備からはずした", "You were wearing");
5851 /* Modify, Optimize */
5852 inven_item_increase(item, -amt);
5853 inven_item_optimize(item);
5855 /* Carry the object */
5856 slot = inven_carry(q_ptr);
5859 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
5861 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
5871 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
5872 * Drop (some of) a non-cursed inventory/equipment item
5873 * @param item 所持テーブルのID
5874 * @param amt 落としたい個数
5877 * The object will be dropped "near" the current location
5879 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
5885 GAME_TEXT o_name[MAX_NLEN];
5887 /* Access original object */
5888 o_ptr = &inventory[item];
5891 if (amt <= 0) return;
5894 if (amt > o_ptr->number) amt = o_ptr->number;
5896 /* Take off equipment */
5897 if (item >= INVEN_RARM)
5899 /* Take off first */
5900 item = inven_takeoff(item, amt);
5902 /* Access original object */
5903 o_ptr = &inventory[item];
5908 /* Obtain local object */
5909 object_copy(q_ptr, o_ptr);
5911 /* Distribute charges of wands or rods */
5912 distribute_charges(o_ptr, q_ptr, amt);
5914 /* Modify quantity */
5915 q_ptr->number = amt;
5917 /* Describe local object */
5918 object_desc(o_name, q_ptr, 0);
5920 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
5922 /* Drop it near the player */
5923 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
5925 /* Modify, Describe, Optimize */
5926 inven_item_increase(item, -amt);
5927 inven_item_describe(item);
5928 inven_item_optimize(item);
5933 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
5934 * Combine items in the pack
5937 * Note special handling of the "overflow" slot
5939 void combine_pack(void)
5944 bool flag = FALSE, combined;
5950 /* Combine the pack (backwards) */
5951 for (i = INVEN_PACK; i > 0; i--)
5953 o_ptr = &inventory[i];
5955 /* Skip empty items */
5956 if (!o_ptr->k_idx) continue;
5958 /* Scan the items above that item */
5959 for (j = 0; j < i; j++)
5963 j_ptr = &inventory[j];
5965 /* Skip empty items */
5966 if (!j_ptr->k_idx) continue;
5969 * Get maximum number of the stack if these
5970 * are similar, get zero otherwise.
5972 max_num = object_similar_part(j_ptr, o_ptr);
5974 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
5975 if (max_num && j_ptr->number < max_num)
5977 if (o_ptr->number + j_ptr->number <= max_num)
5982 /* Add together the item counts */
5983 object_absorb(j_ptr, o_ptr);
5985 /* One object is gone */
5988 /* Slide everything down */
5989 for (k = i; k < INVEN_PACK; k++)
5991 /* Structure copy */
5992 inventory[k] = inventory[k+1];
5995 /* Erase the "final" slot */
5996 object_wipe(&inventory[k]);
6000 int old_num = o_ptr->number;
6001 int remain = j_ptr->number + o_ptr->number - max_num;
6003 o_ptr->number -= remain;
6005 /* Add together the item counts */
6006 object_absorb(j_ptr, o_ptr);
6008 o_ptr->number = remain;
6010 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6011 if (o_ptr->tval == TV_ROD)
6013 o_ptr->pval = o_ptr->pval * remain / old_num;
6014 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6017 /* Hack -- if wands are stacking, combine the charges. -LM- */
6018 if (o_ptr->tval == TV_WAND)
6020 o_ptr->pval = o_ptr->pval * remain / old_num;
6024 p_ptr->window |= (PW_INVEN);
6036 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6040 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6041 * Reorder items in the pack
6044 * Note special handling of the "overflow" slot
6046 void reorder_pack(void)
6056 /* Re-order the pack (forwards) */
6057 for (i = 0; i < INVEN_PACK; i++)
6059 /* Mega-Hack -- allow "proper" over-flow */
6060 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6062 o_ptr = &inventory[i];
6064 /* Skip empty slots */
6065 if (!o_ptr->k_idx) continue;
6067 /* Get the "value" of the item */
6068 o_value = object_value(o_ptr);
6070 /* Scan every occupied slot */
6071 for (j = 0; j < INVEN_PACK; j++)
6073 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6076 /* Never move down */
6077 if (j >= i) continue;
6083 /* Save a copy of the moving item */
6084 object_copy(q_ptr, &inventory[i]);
6086 /* Slide the objects */
6087 for (k = i; k > j; k--)
6089 /* Slide the item */
6090 object_copy(&inventory[k], &inventory[k-1]);
6093 /* Insert the moving item */
6094 object_copy(&inventory[j], q_ptr);
6096 p_ptr->window |= (PW_INVEN);
6099 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6103 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6104 * Hack -- display an object kind in the current window
6105 * @param k_idx ベースアイテムの参照ID
6108 * Include list of usable spells for readible books
6110 void display_koff(KIND_OBJECT_IDX k_idx)
6117 REALM_IDX use_realm;
6119 GAME_TEXT o_name[MAX_NLEN];
6122 /* Erase the window */
6123 for (y = 0; y < Term->hgt; y++)
6125 /* Erase the line */
6126 Term_erase(0, y, 255);
6133 /* Prepare the object */
6134 object_prep(q_ptr, k_idx);
6135 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6137 /* Mention the object name */
6138 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6140 /* Access the item's sval */
6142 use_realm = tval2realm(q_ptr->tval);
6144 /* Warriors are illiterate */
6145 if (p_ptr->realm1 || p_ptr->realm2)
6147 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6151 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6152 if (!is_magic(use_realm)) return;
6153 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6156 /* Display spells in readible books */
6160 SPELL_IDX spells[64];
6162 /* Extract spells */
6163 for (spell = 0; spell < 32; spell++)
6165 /* Check for this spell */
6166 if (fake_spell_flags[sval] & (1L << spell))
6168 /* Collect this spell */
6169 spells[num++] = spell;
6174 print_spells(0, spells, num, 2, 0, use_realm);
6179 * @brief 警告を放つアイテムを選択する /
6180 * Choose one of items that have warning flag
6181 * Calculate spell damages
6184 object_type *choose_warning_item(void)
6187 int choices[INVEN_TOTAL - INVEN_RARM];
6190 /* Paranoia -- Player has no warning ability */
6191 if (!p_ptr->warning) return NULL;
6193 /* Search Inventory */
6194 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6196 BIT_FLAGS flgs[TR_FLAG_SIZE];
6197 object_type *o_ptr = &inventory[i];
6199 object_flags(o_ptr, flgs);
6200 if (have_flag(flgs, TR_WARNING))
6202 choices[number] = i;
6207 /* Choice one of them */
6208 return number ? &inventory[choices[randint0(number)]] : NULL;
6212 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6213 * Calculate spell damages
6214 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6215 * @param typ 効果属性のID
6217 * @param max 算出した最大ダメージを返すポインタ
6220 static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
6222 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6223 int rlev = r_ptr->level;
6224 bool ignore_wraith_form = FALSE;
6226 /* Vulnerability, resistance and immunity */
6230 if (p_ptr->immune_elec)
6233 ignore_wraith_form = TRUE;
6237 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6238 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6239 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6240 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6241 if (IS_OPPOSE_ELEC())
6242 dam = (dam + 2) / 3;
6247 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6248 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6252 if (p_ptr->immune_acid)
6255 ignore_wraith_form = TRUE;
6259 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6260 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6261 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6262 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6268 if (p_ptr->immune_cold)
6271 ignore_wraith_form = TRUE;
6275 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6276 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6277 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6278 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6283 if (p_ptr->immune_fire)
6286 ignore_wraith_form = TRUE;
6290 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6291 if (prace_is_(RACE_ENT)) dam += dam / 3;
6292 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6293 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6294 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6299 ignore_wraith_form = TRUE;
6303 if (!p_ptr->blind &&
6304 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6305 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6308 ignore_wraith_form = TRUE;
6313 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6314 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6315 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6318 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6319 * "dam *= 2;" for later "dam /= 2"
6321 if (p_ptr->wraith_form) dam *= 2;
6325 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6328 ignore_wraith_form = TRUE;
6330 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6334 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6338 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6342 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6346 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6350 if (prace_is_(RACE_SPECTRE))
6353 ignore_wraith_form = TRUE;
6355 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6359 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6363 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6367 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6371 if (p_ptr->levitation) dam = (dam * 2) / 3;
6375 if (p_ptr->resist_shard) dam /= 2;
6379 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6380 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6384 if (p_ptr->mimic_form)
6386 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6389 ignore_wraith_form = TRUE;
6394 switch (p_ptr->prace)
6403 ignore_wraith_form = TRUE;
6410 if (p_ptr->align > 10) dam /= 2;
6411 else if (p_ptr->align < -10) dam *= 2;
6415 if (p_ptr->align > 10) dam *= 2;
6419 case GF_BRAIN_SMASH:
6420 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6423 ignore_wraith_form = TRUE;
6431 if (100 + rlev / 2 <= p_ptr->skill_sav)
6434 ignore_wraith_form = TRUE;
6439 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6442 ignore_wraith_form = TRUE;
6447 if (p_ptr->wraith_form && !ignore_wraith_form)
6453 if (dam > *max) *max = dam;
6457 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6458 * Calculate spell damages
6459 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6460 * @param typ 効果属性のID
6461 * @param m_idx 魔法を行使するモンスターのID
6462 * @param max 算出した最大ダメージを返すポインタ
6465 void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
6467 monster_type *m_ptr = &m_list[m_idx];
6468 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6469 spell_damcalc(m_ptr, typ, dam, max);
6473 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6474 * Calculate blow damages
6475 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6476 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6477 * @return 算出された最大ダメージを返す。
6479 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6481 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6483 bool check_wraith_form = TRUE;
6485 if (blow_ptr->method != RBM_EXPLODE)
6487 ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
6489 switch (blow_ptr->effect)
6493 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6494 dam = MAX(dam, tmp_dam * 2);
6500 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6504 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6506 check_wraith_form = FALSE;
6510 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6512 check_wraith_form = FALSE;
6516 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6518 check_wraith_form = FALSE;
6522 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6524 check_wraith_form = FALSE;
6529 check_wraith_form = FALSE;
6533 if (check_wraith_form && p_ptr->wraith_form)
6541 dam = (dam + 1) / 2;
6542 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
6550 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
6551 * Examine the grid (xx,yy) and warn the player if there are any danger
6552 * @param xx 危険性を調査するマスのX座標
6553 * @param yy 危険性を調査するマスのY座標
6554 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
6556 bool process_warning(POSITION xx, POSITION yy)
6560 GAME_TEXT o_name[MAX_NLEN];
6562 #define WARNING_AWARE_RANGE 12
6564 static int old_damage = 0;
6566 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
6568 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
6571 monster_type *m_ptr;
6572 monster_race *r_ptr;
6574 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
6576 g_ptr = &grid_array[my][mx];
6578 if (!g_ptr->m_idx) continue;
6580 m_ptr = &m_list[g_ptr->m_idx];
6582 if (MON_CSLEEP(m_ptr)) continue;
6583 if (!is_hostile(m_ptr)) continue;
6585 r_ptr = &r_info[m_ptr->r_idx];
6587 /* Monster spells (only powerful ones)*/
6588 if (projectable(my, mx, yy, xx))
6590 BIT_FLAGS f4 = r_ptr->flags4;
6591 BIT_FLAGS f5 = r_ptr->a_ability_flags1;
6592 BIT_FLAGS f6 = r_ptr->a_ability_flags2;
6594 if (!(d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC))
6596 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, g_ptr->m_idx, &dam_max0);
6597 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, g_ptr->m_idx, &dam_max0);
6598 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, g_ptr->m_idx, &dam_max0);
6599 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, g_ptr->m_idx, &dam_max0);
6600 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, g_ptr->m_idx, &dam_max0);
6601 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, g_ptr->m_idx, &dam_max0);
6603 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, g_ptr->m_idx, &dam_max0);
6604 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, g_ptr->m_idx, &dam_max0);
6605 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, g_ptr->m_idx, &dam_max0);
6606 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, g_ptr->m_idx, &dam_max0);
6607 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, g_ptr->m_idx, &dam_max0);
6608 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, g_ptr->m_idx, &dam_max0);
6609 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, g_ptr->m_idx, &dam_max0);
6610 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, g_ptr->m_idx, &dam_max0);
6611 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, g_ptr->m_idx, &dam_max0);
6612 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, g_ptr->m_idx, &dam_max0);
6613 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, g_ptr->m_idx, &dam_max0);
6614 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, g_ptr->m_idx, &dam_max0);
6615 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, g_ptr->m_idx, &dam_max0);
6616 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, g_ptr->m_idx, &dam_max0);
6617 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, g_ptr->m_idx, &dam_max0);
6618 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, g_ptr->m_idx, &dam_max0);
6619 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, g_ptr->m_idx, &dam_max0);
6620 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, g_ptr->m_idx, &dam_max0);
6621 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, g_ptr->m_idx, &dam_max0);
6622 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, g_ptr->m_idx, &dam_max0);
6623 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, g_ptr->m_idx, &dam_max0);
6624 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, g_ptr->m_idx, &dam_max0);
6625 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, g_ptr->m_idx, &dam_max0);
6628 /* Monster melee attacks */
6629 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE))
6631 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
6635 for (m = 0; m < 4; m++)
6637 /* Skip non-attacks */
6638 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
6640 /* Extract the attack info */
6641 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
6642 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
6644 if (dam_melee > dam_max0) dam_max0 = dam_melee;
6648 /* Contribution from this monster */
6649 dam_max += dam_max0;
6653 /* Prevent excessive warning */
6654 if (dam_max > old_damage)
6656 old_damage = dam_max * 3 / 2;
6658 if (dam_max > p_ptr->chp / 2)
6660 object_type *o_ptr = choose_warning_item();
6663 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6665 strcpy(o_name, _("体", "body")); /* Warning ability without item */
6666 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
6668 disturb(FALSE, TRUE);
6669 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
6672 else old_damage = old_damage / 2;
6674 g_ptr = &grid_array[yy][xx];
6675 if (((!easy_disarm && is_trap(g_ptr->feat))
6676 || (g_ptr->mimic && is_trap(g_ptr->feat))) && !one_in_(13))
6678 object_type *o_ptr = choose_warning_item();
6681 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6683 strcpy(o_name, _("体", "body")); /* Warning ability without item */
6684 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
6685 disturb(FALSE, TRUE);
6686 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
6693 * エッセンス情報の構造体 / A structure for smithing
6696 int add; /* TR flag number or special essence id */
6697 concptr add_name; /* Name of this ability */
6698 ESSENCE_IDX type; /* Menu number */
6699 int essence; /* Index for carrying essences */
6700 int value; /* Needed value to add this ability */
6705 * エッセンス情報テーブル Smithing type data for Weapon smith
6708 static essence_type essence_info[] =
6710 {TR_STR, "腕力", 4, TR_STR, 20},
6711 {TR_INT, "知能", 4, TR_INT, 20},
6712 {TR_WIS, "賢さ", 4, TR_WIS, 20},
6713 {TR_DEX, "器用さ", 4, TR_DEX, 20},
6714 {TR_CON, "耐久力", 4, TR_CON, 20},
6715 {TR_CHR, "魅力", 4, TR_CHR, 20},
6716 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
6717 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
6718 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
6719 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
6720 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
6721 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
6722 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
6723 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
6724 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
6725 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
6726 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
6727 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
6728 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
6729 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
6730 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
6731 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
6732 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
6733 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
6734 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
6735 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
6736 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
6737 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
6738 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
6739 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
6740 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
6741 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
6742 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
6743 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
6744 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
6745 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
6746 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
6747 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
6748 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
6749 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
6750 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
6751 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
6752 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
6753 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
6754 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
6755 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
6756 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
6757 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
6758 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
6759 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
6760 {TR_SH_FIRE, "", 0, -2, 0},
6761 {TR_SH_ELEC, "", 0, -2, 0},
6762 {TR_SH_COLD, "", 0, -2, 0},
6763 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
6764 {TR_WARNING, "警告", 3, TR_WARNING, 20},
6765 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
6766 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
6767 {TR_LITE_2, "", 0, -2, 0},
6768 {TR_LITE_3, "", 0, -2, 0},
6769 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
6770 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
6771 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
6772 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
6773 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
6775 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
6776 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
6777 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
6778 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
6779 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
6780 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
6781 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
6782 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
6783 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
6784 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
6785 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
6786 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
6787 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
6788 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
6789 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
6790 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
6791 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
6792 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
6794 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
6795 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
6796 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
6797 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
6798 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
6799 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
6800 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
6801 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
6803 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
6804 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
6805 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
6806 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
6807 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
6808 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
6809 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
6810 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
6811 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
6812 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
6813 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
6814 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
6816 {-1, NULL, 0, -1, 0}
6819 static essence_type essence_info[] =
6821 {TR_STR, "strength", 4, TR_STR, 20},
6822 {TR_INT, "intelligence", 4, TR_INT, 20},
6823 {TR_WIS, "wisdom", 4, TR_WIS, 20},
6824 {TR_DEX, "dexterity", 4, TR_DEX, 20},
6825 {TR_CON, "constitution", 4, TR_CON, 20},
6826 {TR_CHR, "charisma", 4, TR_CHR, 20},
6827 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
6828 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
6829 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
6830 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
6831 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
6832 {TR_SPEED, "speed", 4, TR_SPEED, 12},
6833 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
6834 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
6835 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
6836 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
6837 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
6838 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
6839 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
6840 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
6841 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
6842 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
6843 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
6844 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
6845 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
6846 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
6847 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
6848 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
6849 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
6850 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
6851 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
6852 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
6853 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
6854 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
6855 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
6856 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
6857 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
6858 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
6859 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
6860 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
6861 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
6862 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
6863 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
6864 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
6865 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
6866 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
6867 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
6868 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
6869 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
6870 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
6871 {TR_SH_FIRE, "", 0, -2, 0},
6872 {TR_SH_ELEC, "", 0, -2, 0},
6873 {TR_SH_COLD, "", 0, -2, 0},
6874 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
6875 {TR_WARNING, "warning", 3, TR_WARNING, 20},
6876 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
6877 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
6878 {TR_LITE_2, "", 0, -2, 0},
6879 {TR_LITE_3, "", 0, -2, 0},
6880 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
6881 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
6882 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
6883 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
6884 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
6886 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
6887 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
6888 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
6889 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
6890 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
6891 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
6892 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
6893 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
6894 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
6895 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
6896 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
6897 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
6898 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
6899 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
6900 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
6901 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
6902 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
6903 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
6905 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
6906 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
6907 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
6908 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
6909 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
6910 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
6911 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
6912 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
6914 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
6915 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
6916 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
6917 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
6918 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
6919 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
6920 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
6921 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
6922 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
6923 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
6924 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
6925 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
6927 {-1, NULL, 0, -1, 0}
6933 * エッセンス名テーブル / Essense names for Weapon smith
6936 concptr essence_name[] =
7039 concptr essence_name[] =
7142 * @brief 所持しているエッセンス一覧を表示する
7145 static void display_essence(void)
7150 for (i = 1; i < 22; i++)
7154 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7155 "Essence Num Essence Num Essence Num "), 1, 8);
7156 for (i = 0; essence_name[i]; i++)
7158 if (!essence_name[i][0]) continue;
7159 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7162 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7172 static void drain_essence(void)
7174 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7178 bool observe = FALSE;
7179 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7180 TIME_EFFECT old_timeout;
7181 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7187 OBJECT_IDX next_o_idx;
7190 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7193 item_tester_hook = object_is_weapon_armour_ammo;
7195 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7196 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7198 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT));
7201 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7203 GAME_TEXT o_name[MAX_NLEN];
7204 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7205 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7208 take_turn(p_ptr, 100);
7210 object_flags(o_ptr, old_flgs);
7211 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7212 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7213 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7214 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7215 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7216 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7217 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7218 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7219 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7221 old_to_a = o_ptr->to_a;
7223 old_to_h = o_ptr->to_h;
7224 old_to_d = o_ptr->to_d;
7227 old_pval = o_ptr->pval;
7228 old_name2 = o_ptr->name2;
7229 old_timeout = o_ptr->timeout;
7230 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7231 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7232 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7233 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7234 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7235 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7236 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7237 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7238 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7239 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7240 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7241 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7242 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7243 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7244 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7245 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7246 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7247 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7248 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7252 next_o_idx = o_ptr->next_o_idx;
7253 marked = o_ptr->marked;
7254 weight = o_ptr->weight;
7255 number = o_ptr->number;
7257 object_prep(o_ptr, o_ptr->k_idx);
7261 o_ptr->next_o_idx=next_o_idx;
7262 o_ptr->marked=marked;
7263 o_ptr->number = number;
7264 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7265 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7266 o_ptr->ident |= (IDENT_MENTAL);
7267 object_aware(o_ptr);
7268 object_known(o_ptr);
7270 object_flags(o_ptr, new_flgs);
7272 for (i = 0; essence_info[i].add_name; i++)
7274 essence_type *es_ptr = &essence_info[i];
7275 PARAMETER_VALUE pval = 0;
7277 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7278 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7280 if (es_ptr->add < TR_FLAG_MAX &&
7281 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7282 have_flag(old_flgs, es_ptr->add))
7286 drain_value[es_ptr->essence] += 10 * pval;
7288 else if (es_ptr->essence != -2)
7290 drain_value[es_ptr->essence] += 10;
7292 else if (es_ptr->add == TR_SH_FIRE)
7294 drain_value[TR_BRAND_FIRE] += 10;
7295 drain_value[TR_RES_FIRE] += 10;
7297 else if (es_ptr->add == TR_SH_ELEC)
7299 drain_value[TR_BRAND_ELEC] += 10;
7300 drain_value[TR_RES_ELEC] += 10;
7302 else if (es_ptr->add == TR_SH_COLD)
7304 drain_value[TR_BRAND_COLD] += 10;
7305 drain_value[TR_RES_COLD] += 10;
7307 else if (es_ptr->add == TR_LITE_2)
7309 drain_value[TR_LITE_1] += 20;
7311 else if (es_ptr->add == TR_LITE_3)
7313 drain_value[TR_LITE_1] += 30;
7318 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7320 drain_value[TR_INT] += 5;
7321 drain_value[TR_WIS] += 5;
7323 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7325 drain_value[TR_BRAND_POIS] += 5;
7326 drain_value[TR_BRAND_ACID] += 5;
7327 drain_value[TR_BRAND_ELEC] += 5;
7328 drain_value[TR_BRAND_FIRE] += 5;
7329 drain_value[TR_BRAND_COLD] += 5;
7331 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7333 drain_value[TR_INT] += 10;
7335 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7337 drain_value[TR_STR] += 10;
7339 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7341 drain_value[TR_DEX] += 10;
7343 if (old_name2 == EGO_2WEAPON)
7345 drain_value[TR_DEX] += 20;
7347 if (object_is_weapon_ammo(o_ptr))
7349 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7351 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7353 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7354 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7355 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7356 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7358 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7360 drain_value[i] *= number;
7361 drain_value[i] = drain_value[i] * dec / 4;
7362 drain_value[i] = MAX(drain_value[i], 0);
7363 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7371 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7375 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7377 for (i = 0; essence_name[i]; i++)
7379 if (!essence_name[i][0]) continue;
7380 if (!drain_value[i]) continue;
7382 p_ptr->magic_num1[i] += drain_value[i];
7383 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7385 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7389 /* Apply autodestroy/inscription to the drained item */
7390 autopick_alter_item(item, TRUE);
7391 p_ptr->update |= (PU_COMBINE | PU_REORDER);
7392 p_ptr->window |= (PW_INVEN);
7396 * @brief 付加するエッセンスの大別を選択する
7397 * @return 選んだエッセンスの大別ID
7399 static COMMAND_CODE choose_essence(void)
7401 COMMAND_CODE mode = 0;
7403 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7406 concptr menu_name[] = {
7416 concptr menu_name[] = {
7426 const COMMAND_CODE mode_max = 7;
7428 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7438 for (i = 0; i < mode_max; i++)
7440 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7441 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7443 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7444 prt("Choose from menu.", 0, 0);
7463 menu_line += mode_max - 1;
7472 if (menu_line > mode_max) menu_line -= mode_max;
7483 for (i = 0; i < mode_max; i++)
7484 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7486 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7492 if (isupper(choice)) choice = (char)tolower(choice);
7494 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7495 mode = (int)choice - 'a' + 1;
7505 * @brief エッセンスを実際に付加する
7506 * @param mode エッセンスの大別ID
7509 static void add_essence(ESSENCE_IDX mode)
7521 GAME_TEXT o_name[MAX_NLEN];
7523 essence_type *es_ptr;
7524 bool able[22] = { 0 };
7526 int menu_line = (use_menu ? 1 : 0);
7528 for (i = 0; essence_info[i].add_name; i++)
7530 es_ptr = &essence_info[i];
7532 if (es_ptr->type != mode) continue;
7536 if (!repeat_pull(&i) || i<0 || i>=max_num)
7539 /* Nothing chosen yet */
7545 /* Build a prompt */
7546 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
7547 if (use_menu) screen_save();
7549 /* Get a spell from the user */
7551 choice = (always_show_list || use_menu) ? ESCAPE:1;
7554 if( choice==ESCAPE ) choice = ' ';
7555 else if( !get_com(out_val, &choice, FALSE) )break;
7557 if (use_menu && choice != ' ')
7571 menu_line += (max_num-1);
7594 menu_line = max_num;
7608 if (menu_line > max_num) menu_line -= max_num;
7610 /* Request redraw */
7611 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
7614 if (!redraw || use_menu)
7618 char dummy[80], dummy2[80];
7625 if (!use_menu) screen_save();
7627 for (y = 1; y < 24; y++)
7630 /* Print header(s) */
7632 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
7635 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
7638 for (ctr = 0; ctr < max_num; ctr++)
7640 es_ptr = &essence_info[num[ctr]];
7644 if (ctr == (menu_line-1))
7645 strcpy(dummy, _("》 ", "> "));
7646 else strcpy(dummy, " ");
7649 /* letter/number for power selection */
7652 sprintf(dummy, "%c) ",I2A(ctr));
7655 strcat(dummy, es_ptr->add_name);
7660 if (es_ptr->essence != -1)
7662 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
7663 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
7669 case ESSENCE_SH_FIRE:
7670 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
7671 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
7672 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7674 case ESSENCE_SH_ELEC:
7675 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
7676 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
7677 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7679 case ESSENCE_SH_COLD:
7680 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
7681 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
7682 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7684 case ESSENCE_RESISTANCE:
7685 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
7686 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7687 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7688 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7689 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
7691 case ESSENCE_SUSTAIN:
7692 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
7693 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7694 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7695 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7696 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
7701 if (!able[ctr]) col = TERM_RED;
7703 if (es_ptr->essence != -1)
7705 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
7709 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
7712 c_prt(col, dummy2, ctr+2, x);
7731 ask = (isupper(choice));
7734 if (ask) choice = (char)tolower(choice);
7736 /* Extract request */
7737 i = (islower(choice) ? A2I(choice) : -1);
7740 /* Totally Illegal */
7741 if ((i < 0) || (i >= max_num) || !able[i])
7753 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
7755 /* Belay that order */
7756 if (!get_check(tmp_val)) continue;
7762 if (redraw) screen_load();
7768 es_ptr = &essence_info[num[i]];
7770 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
7771 item_tester_tval = TV_GLOVES;
7772 else if (mode == 1 || mode == 5)
7773 item_tester_hook = item_tester_hook_melee_ammo;
7774 else if (es_ptr->add == ESSENCE_ATTACK)
7775 item_tester_hook = object_allow_enchant_weapon;
7776 else if (es_ptr->add == ESSENCE_AC)
7777 item_tester_hook = object_is_armour;
7779 item_tester_hook = object_is_weapon_armour_ammo;
7781 q = _("どのアイテムを改良しますか?", "Improve which item? ");
7782 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
7784 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT));
7787 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
7789 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
7793 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7795 use_essence = es_ptr->value;
7796 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
7797 if (o_ptr->number > 1)
7799 use_essence *= o_ptr->number;
7800 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
7803 if (es_ptr->essence != -1)
7805 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
7807 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
7810 if (is_pval_flag(es_ptr->add))
7812 if (o_ptr->pval < 0)
7814 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
7817 else if (es_ptr->add == TR_BLOWS)
7819 if (o_ptr->pval > 1)
7821 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
7825 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
7827 else if (o_ptr->pval > 0)
7829 use_essence *= o_ptr->pval;
7830 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
7836 PARAMETER_VALUE pval;
7837 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
7839 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
7840 strcpy(tmp_val, "1");
7842 if (!get_string(tmp, tmp_val, 1)) return;
7843 pval = (PARAMETER_VALUE)atoi(tmp_val);
7844 if (pval > limit) pval = limit;
7845 else if (pval < 1) pval = 1;
7846 o_ptr->pval += pval;
7847 use_essence *= pval;
7848 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
7851 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
7853 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
7857 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
7864 strcpy(tmp_val, "1");
7865 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
7866 val = atoi(tmp_val);
7867 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
7868 else if (val < 1) val = 1;
7870 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
7871 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
7873 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
7876 get_to_h = ((val+1)/2+randint0(val/2+1));
7877 get_to_d = ((val+1)/2+randint0(val/2+1));
7878 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
7879 o_ptr->to_h += get_to_h;
7880 o_ptr->to_d += get_to_d;
7882 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
7883 if (es_ptr->add == ESSENCE_ATTACK)
7885 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
7887 msg_print(_("改良に失敗した。", "You failed to enchant."));
7888 take_turn(p_ptr, 100);
7893 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
7894 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
7897 else if (es_ptr->add == ESSENCE_AC)
7899 if (o_ptr->to_a >= p_ptr->lev/5+5)
7901 msg_print(_("改良に失敗した。", "You failed to enchant."));
7902 take_turn(p_ptr, 100);
7907 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
7912 o_ptr->xtra3 = es_ptr->add + 1;
7917 bool success = TRUE;
7921 case ESSENCE_SH_FIRE:
7922 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
7927 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
7928 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
7930 case ESSENCE_SH_ELEC:
7931 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
7936 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
7937 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
7939 case ESSENCE_SH_COLD:
7940 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
7945 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
7946 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
7948 case ESSENCE_RESISTANCE:
7949 case ESSENCE_SUSTAIN:
7950 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))
7955 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
7956 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
7957 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
7958 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
7963 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
7966 if (es_ptr->add == ESSENCE_SUSTAIN)
7968 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
7969 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
7970 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
7971 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
7975 o_ptr->xtra3 = es_ptr->add + 1;
7979 take_turn(p_ptr, 100);
7982 msg_format(_("%sに%sの能力を付加しました。", "You have added ability of %s to %s."), o_name, es_ptr->add_name);
7984 msg_format(, es_ptr->add_name, o_name);
7986 p_ptr->update |= (PU_COMBINE | PU_REORDER);
7987 p_ptr->window |= (PW_INVEN);
7994 static void erase_essence(void)
7999 GAME_TEXT o_name[MAX_NLEN];
8000 BIT_FLAGS flgs[TR_FLAG_SIZE];
8002 item_tester_hook = object_is_smith;
8004 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
8005 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
8007 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
8010 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8011 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
8013 take_turn(p_ptr, 100);
8015 if (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE)
8017 o_ptr->to_h -= (o_ptr->xtra4>>8);
8018 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8020 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8021 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8024 object_flags(o_ptr, flgs);
8025 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8026 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8027 p_ptr->update |= (PU_COMBINE | PU_REORDER);
8028 p_ptr->window |= (PW_INVEN);
8032 * @brief 鍛冶コマンドのメインルーチン
8033 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8036 void do_cmd_kaji(bool only_browse)
8038 COMMAND_CODE mode = 0;
8041 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8045 if (cmd_limit_confused(p_ptr)) return;
8048 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8053 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8058 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8060 if (only_browse) screen_save();
8062 if (!only_browse) screen_save();
8068 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8069 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8070 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8071 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8072 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8073 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8075 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8076 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8077 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8078 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8079 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8080 prt(format("Choose command from menu."), 0, 0);
8107 if (menu_line > 5) menu_line -= 5;
8115 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
8116 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
8117 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
8118 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
8119 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
8121 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8123 if (!get_com("Command :", &choice, TRUE))
8160 /* Clear lines, position cursor (really should use strlen here) */
8161 Term_erase(14, 21, 255);
8162 Term_erase(14, 20, 255);
8163 Term_erase(14, 19, 255);
8164 Term_erase(14, 18, 255);
8165 Term_erase(14, 17, 255);
8166 Term_erase(14, 16, 255);
8168 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8169 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8171 prt(&temp[j], line, 15);
8176 if (!only_browse) screen_load();
8177 } while (only_browse);
8182 case 1: display_essence();break;
8183 case 2: drain_essence();break;
8184 case 3: erase_essence();break;
8186 mode = choose_essence();
8191 case 5: add_essence(10);break;
8197 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8198 * Torches have special abilities when they are flaming.
8199 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8200 * @param flgs 特別に追加するフラグを返す参照ポインタ
8203 void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
8205 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8207 if (o_ptr->xtra4 > 0)
8209 add_flag(flgs, TR_BRAND_FIRE);
8210 add_flag(flgs, TR_KILL_UNDEAD);
8211 add_flag(flgs, TR_THROW);
8217 * @brief 投擲時たいまつにダイスを与える。
8218 * Torches have special abilities when they are flaming.
8219 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8220 * @param dd 特別なダイス数を返す参照ポインタ
8221 * @param ds 特別なダイス面数を返す参照ポインタ
8224 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
8226 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8228 if (o_ptr->xtra4 > 0)
8237 * @brief 投擲時命中したたいまつの寿命を縮める。
8238 * Torches have special abilities when they are flaming.
8239 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8242 void torch_lost_fuel(object_type *o_ptr)
8244 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8246 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8247 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;