3 * @brief オブジェクトの実装 / Object code, part 2
6 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
8 * This software may be copied and distributed for educational, research,\n
9 * and not for profit purposes provided that this copyright and statement\n
10 * are included in all such copies. Other copyrights may also apply.\n
11 * 2014 Deskull rearranged comment for Doxygen.\n
15 #include "object-hook.h"
16 #include "object-curse.h"
18 static void one_sustain(object_type *o_ptr);
21 static cptr const kaji_tips[5] =
24 "現在持っているエッセンスの一覧を表示する。",
25 "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。",
26 "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。",
27 "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。",
28 "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。",
30 "Display essences you have.",
31 "Extract essences from an item. The item become non magical.",
32 "Remove added essences from an equipment which was improved before. The removed essence will be ruined.",
33 "Add essences to an item. The improved items or artifacts cannot be reimprove.",
34 "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.",
39 * @brief 対象のオブジェクトにランダムな能力維持を一つ付加する。/ Choose one random sustain
41 * @param o_ptr 対象のオブジェクト構造体ポインタ
44 static void one_sustain(object_type *o_ptr)
48 case 0: add_flag(o_ptr->art_flags, TR_SUST_STR); break;
49 case 1: add_flag(o_ptr->art_flags, TR_SUST_INT); break;
50 case 2: add_flag(o_ptr->art_flags, TR_SUST_WIS); break;
51 case 3: add_flag(o_ptr->art_flags, TR_SUST_DEX); break;
52 case 4: add_flag(o_ptr->art_flags, TR_SUST_CON); break;
53 case 5: add_flag(o_ptr->art_flags, TR_SUST_CHR); break;
58 * @brief 床上、モンスター所持でスタックされたアイテムを削除しスタックを補完する / Excise a dungeon object from any stacks
59 * @param o_idx 削除対象のオブジェクト構造体ポインタ
62 void excise_object_idx(OBJECT_IDX o_idx)
66 OBJECT_IDX this_o_idx, next_o_idx = 0;
72 j_ptr = &o_list[o_idx];
75 if (j_ptr->held_m_idx)
80 m_ptr = &m_list[j_ptr->held_m_idx];
82 /* Scan all objects in the grid */
83 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
88 o_ptr = &o_list[this_o_idx];
90 /* Acquire next object */
91 next_o_idx = o_ptr->next_o_idx;
93 if (this_o_idx == o_idx)
98 /* Remove from list */
99 m_ptr->hold_o_idx = next_o_idx;
107 /* Previous object */
108 k_ptr = &o_list[prev_o_idx];
110 /* Remove from list */
111 k_ptr->next_o_idx = next_o_idx;
114 /* Forget next pointer */
115 o_ptr->next_o_idx = 0;
120 /* Save prev_o_idx */
121 prev_o_idx = this_o_idx;
130 POSITION y = j_ptr->iy;
131 POSITION x = j_ptr->ix;
136 /* Scan all objects in the grid */
137 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
142 o_ptr = &o_list[this_o_idx];
144 /* Acquire next object */
145 next_o_idx = o_ptr->next_o_idx;
147 if (this_o_idx == o_idx)
152 /* Remove from list */
153 c_ptr->o_idx = next_o_idx;
161 /* Previous object */
162 k_ptr = &o_list[prev_o_idx];
164 /* Remove from list */
165 k_ptr->next_o_idx = next_o_idx;
168 /* Forget next pointer */
169 o_ptr->next_o_idx = 0;
174 /* Save prev_o_idx */
175 prev_o_idx = this_o_idx;
181 * @brief オブジェクトを削除する /
182 * Delete a dungeon object
183 * @param o_idx 削除対象のオブジェクト構造体ポインタ
186 * Handle "stacks" of objects correctly.
188 void delete_object_idx(OBJECT_IDX o_idx)
193 excise_object_idx(o_idx);
196 j_ptr = &o_list[o_idx];
199 if (!(j_ptr->held_m_idx))
210 /* Wipe the object */
219 * @brief フロアにマスに落ちているオブジェクトを全て削除する / Deletes all objects at given location
220 * Delete a dungeon object
221 * @param y 削除したフロアマスのY座標
222 * @param x 削除したフロアマスのX座標
225 void delete_object(POSITION y, POSITION x)
228 OBJECT_IDX this_o_idx, next_o_idx = 0;
230 /* Refuse "illegal" locations */
231 if (!in_bounds(y, x)) return;
236 /* Scan all objects in the grid */
237 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
242 o_ptr = &o_list[this_o_idx];
244 /* Acquire next object */
245 next_o_idx = o_ptr->next_o_idx;
247 /* Wipe the object */
254 /* Objects are gone */
263 * @brief グローバルオブジェクト配列に対し指定範囲のオブジェクトを整理してIDの若い順に寄せる /
264 * Move an object from index i1 to index i2 in the object list
265 * @param i1 整理したい配列の始点
266 * @param i2 整理したい配列の終点
269 static void compact_objects_aux(IDX i1, IDX i2)
276 if (i1 == i2) return;
280 for (i = 1; i < o_max; i++)
285 /* Skip "dead" objects */
286 if (!o_ptr->k_idx) continue;
288 /* Repair "next" pointers */
289 if (o_ptr->next_o_idx == i1)
292 o_ptr->next_o_idx = i2;
302 if (o_ptr->held_m_idx)
306 /* Acquire monster */
307 m_ptr = &m_list[o_ptr->held_m_idx];
310 if (m_ptr->hold_o_idx == i1)
313 m_ptr->hold_o_idx = i2;
322 /* Acquire location */
330 if (c_ptr->o_idx == i1)
339 o_list[i2] = o_list[i1];
347 * @brief グローバルオブジェクト配列から優先度の低いものを削除し、データを圧縮する。 /
348 * Compact and Reorder the object list.
349 * @param size 最低でも減らしたいオブジェクト数の水準
353 * This function can be very dangerous, use with caution!\n
355 * When actually "compacting" objects, we base the saving throw on a\n
356 * combination of object level, distance from player, and current\n
359 * After "compacting" (if needed), we "reorder" the objects into a more\n
360 * compact order, and we reset the allocation info, and the "live" array.\n
362 void compact_objects(int size)
367 int cur_lev, cur_dis, chance;
374 msg_print(_("アイテム情報を圧縮しています...", "Compacting objects..."));
377 p_ptr->redraw |= (PR_MAP);
379 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
383 /* Compact at least 'size' objects */
384 for (num = 0, cnt = 1; num < size; cnt++)
386 /* Get more vicious each iteration */
389 /* Get closer each iteration */
390 cur_dis = 5 * (20 - cnt);
392 /* Examine the objects */
393 for (i = 1; i < o_max; i++)
397 /* Skip dead objects */
398 if (!o_ptr->k_idx) continue;
400 /* Hack -- High level objects start out "immune" */
401 if (k_info[o_ptr->k_idx].level > cur_lev) continue;
404 if (o_ptr->held_m_idx)
408 /* Acquire monster */
409 m_ptr = &m_list[o_ptr->held_m_idx];
411 /* Get the location */
415 /* Monsters protect their objects */
416 if (randint0(100) < 90) continue;
422 /* Get the location */
427 /* Nearby objects start out "immune" */
428 if ((cur_dis > 0) && (distance(p_ptr->y, p_ptr->x, y, x) < cur_dis)) continue;
433 /* Hack -- only compact artifacts in emergencies */
434 if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
435 (cnt < 1000)) chance = 100;
437 /* Apply the saving throw */
438 if (randint0(100) < chance) continue;
440 /* Delete the object */
441 delete_object_idx(i);
449 /* Excise dead objects (backwards!) */
450 for (i = o_max - 1; i >= 1; i--)
454 /* Skip real objects */
455 if (o_ptr->k_idx) continue;
457 /* Move last object into open hole */
458 compact_objects_aux(o_max - 1, i);
460 /* Compress "o_max" */
467 * @brief グローバルオブジェクト配列を初期化する /
468 * Delete all the items when player leaves the level
469 * @note we do NOT visually reflect these (irrelevant) changes
471 * Hack -- we clear the "c_ptr->o_idx" field for every grid,
472 * and the "m_ptr->next_o_idx" field for every monster, since
473 * we know we are clearing every object. Technically, we only
474 * clear those fields for grids/monsters containing objects,
475 * and we clear it once for every such object.
478 void wipe_o_list(void)
482 /* Delete the existing objects */
483 for (i = 1; i < o_max; i++)
485 object_type *o_ptr = &o_list[i];
487 /* Skip dead objects */
488 if (!o_ptr->k_idx) continue;
490 /* Mega-Hack -- preserve artifacts */
491 if (!character_dungeon || preserve_mode)
493 /* Hack -- Preserve unknown artifacts */
494 if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
496 /* Mega-Hack -- Preserve the artifact */
497 a_info[o_ptr->name1].cur_num = 0;
502 if (o_ptr->held_m_idx)
507 m_ptr = &m_list[o_ptr->held_m_idx];
509 /* Hack -- see above */
510 m_ptr->hold_o_idx = 0;
518 /* Access location */
519 POSITION y = o_ptr->iy;
520 POSITION x = o_ptr->ix;
525 /* Hack -- see above */
529 /* Wipe the object */
542 * @brief グローバルオブジェクト配列から空きを取得する /
543 * Acquires and returns the index of a "free" object.
544 * @return 開いているオブジェクト要素のID
546 * This routine should almost never fail, but in case it does,
547 * we must be sure to handle "failure" of this routine.
549 OBJECT_IDX o_pop(void)
553 /* Initial allocation */
554 if (o_max < max_o_idx)
559 /* Expand object array */
565 /* Use this object */
570 /* Recycle dead objects */
571 for (i = 1; i < o_max; i++)
578 /* Skip live objects */
579 if (o_ptr->k_idx) continue;
584 /* Use this object */
589 /* Warn the player (except during dungeon creation) */
590 if (character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!"));
597 * @brief オブジェクト生成テーブルに生成制約を加える /
598 * Apply a "object restriction function" to the "object allocation table"
600 * @details 生成の制約はグローバルのget_obj_num_hook関数ポインタで加える
602 static errr get_obj_num_prep(void)
607 alloc_entry *table = alloc_kind_table;
609 /* Scan the allocation table */
610 for (i = 0; i < alloc_kind_size; i++)
612 /* Accept objects which pass the restriction, if any */
613 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
615 /* Accept this object */
616 table[i].prob2 = table[i].prob1;
619 /* Do not use this object */
622 /* Decline this object */
633 * @brief オブジェクト生成テーブルからアイテムを取得する /
634 * Choose an object kind that seems "appropriate" to the given level
636 * @return 選ばれたオブジェクトベースID
638 * This function uses the "prob2" field of the "object allocation table",\n
639 * and various local information, to calculate the "prob3" field of the\n
640 * same table, which is then used to choose an "appropriate" object, in\n
641 * a relatively efficient manner.\n
643 * It is (slightly) more likely to acquire an object of the given level\n
644 * than one of a lower level. This is done by choosing several objects\n
645 * appropriate to the given level and keeping the "hardest" one.\n
647 * Note that if no objects are "appropriate", then this function will\n
648 * fail, and return zero, but this should *almost* never happen.\n
650 OBJECT_IDX get_obj_num(DEPTH level)
653 KIND_OBJECT_IDX k_idx;
656 alloc_entry *table = alloc_kind_table;
658 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
661 if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER))
663 /* Occasional "boost" */
664 if (one_in_(GREAT_OBJ))
666 /* What a bizarre calculation */
667 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
674 /* Process probabilities */
675 for (i = 0; i < alloc_kind_size; i++)
677 /* Objects are sorted by depth */
678 if (table[i].level > level) break;
683 /* Access the index */
684 k_idx = table[i].index;
686 /* Access the actual kind */
687 k_ptr = &k_info[k_idx];
689 /* Hack -- prevent embedded chests */
690 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
693 table[i].prob3 = table[i].prob2;
696 total += table[i].prob3;
699 /* No legal objects */
700 if (total <= 0) return (0);
704 value = randint0(total);
706 /* Find the object */
707 for (i = 0; i < alloc_kind_size; i++)
709 /* Found the entry */
710 if (value < table[i].prob3) break;
713 value = value - table[i].prob3;
720 /* Try for a "better" object once (50%) or twice (10%) */
727 value = randint0(total);
729 /* Find the object */
730 for (i = 0; i < alloc_kind_size; i++)
732 /* Found the entry */
733 if (value < table[i].prob3) break;
736 value = value - table[i].prob3;
739 /* Keep the "best" one */
740 if (table[i].level < table[j].level) i = j;
743 /* Try for a "better" object twice (10%) */
750 value = randint0(total);
752 /* Find the object */
753 for (i = 0; i < alloc_kind_size; i++)
755 /* Found the entry */
756 if (value < table[i].prob3) break;
759 value = value - table[i].prob3;
762 /* Keep the "best" one */
763 if (table[i].level < table[j].level) i = j;
768 return (table[i].index);
773 * @brief オブジェクトを鑑定済にする /
774 * Known is true when the "attributes" of an object are "known".
775 * @param o_ptr 鑑定済にするオブジェクトの構造体参照ポインタ
777 * These include tohit, todam, toac, cost, and pval (charges).\n
779 * Note that "knowing" an object gives you everything that an "awareness"\n
780 * gives you, and much more. In fact, the player is always "aware" of any\n
781 * item of which he has full "knowledge".\n
783 * But having full knowledge of, say, one "wand of wonder", does not, by\n
784 * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
785 * It happens that most "identify" routines (including "buying from a shop")\n
786 * will make the player "aware" of the object as well as fully "know" it.\n
788 * This routine also removes any inscriptions generated by "feelings".\n
790 void object_known(object_type *o_ptr)
792 /* Remove "default inscriptions" */
793 o_ptr->feeling = FEEL_NONE;
795 /* Clear the "Felt" info */
796 o_ptr->ident &= ~(IDENT_SENSE);
798 /* Clear the "Empty" info */
799 o_ptr->ident &= ~(IDENT_EMPTY);
801 /* Now we know about the item */
802 o_ptr->ident |= (IDENT_KNOWN);
806 * @brief オブジェクトを*鑑定*済にする /
807 * The player is now aware of the effects of the given object.
808 * @param o_ptr *鑑定*済にするオブジェクトの構造体参照ポインタ
811 void object_aware(object_type *o_ptr)
813 bool mihanmei = !object_is_aware(o_ptr);
815 /* Fully aware of the effects */
816 k_info[o_ptr->k_idx].aware = TRUE;
818 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
819 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
823 char o_name[MAX_NLEN];
826 object_copy(q_ptr, o_ptr);
829 object_desc(o_name, q_ptr, OD_NAME_ONLY);
831 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
836 * @brief オブジェクトを試行済にする /
837 * Something has been "sampled"
838 * @param o_ptr 試行済にするオブジェクトの構造体参照ポインタ
841 void object_tried(object_type *o_ptr)
843 /* Mark it as tried (even if "aware") */
844 k_info[o_ptr->k_idx].tried = TRUE;
848 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
849 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
850 * @return 擬似鑑定結果のIDを返す。
852 byte value_check_aux1(object_type *o_ptr)
855 if (object_is_artifact(o_ptr))
858 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
865 if (object_is_ego(o_ptr))
868 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
871 return FEEL_EXCELLENT;
875 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
878 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
880 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
882 /* Good "armor" bonus */
883 if (o_ptr->to_a > 0) return FEEL_GOOD;
885 /* Good "weapon" bonus */
886 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
888 /* Default to "average" */
893 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 2 (Light).
894 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
895 * @return 擬似鑑定結果のIDを返す。
897 byte value_check_aux2(object_type *o_ptr)
899 /* Cursed items (all of them) */
900 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
902 /* Broken items (all of them) */
903 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
905 /* Artifacts -- except cursed/broken ones */
906 if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
908 /* Ego-Items -- except cursed/broken ones */
909 if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
911 /* Good armor bonus */
912 if (o_ptr->to_a > 0) return FEEL_UNCURSED;
914 /* Good weapon bonuses */
915 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
922 * @brief 未鑑定なベースアイテムの基本価格を返す /
923 * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
924 * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
925 * @return オブジェクトの未鑑定価格
927 static s32b object_value_base(object_type *o_ptr)
929 /* Aware item -- use template cost */
930 if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
932 /* Analyze the type */
937 case TV_FOOD: return (5L);
939 /* Un-aware Potions */
940 case TV_POTION: return (20L);
942 /* Un-aware Scrolls */
943 case TV_SCROLL: return (20L);
945 /* Un-aware Staffs */
946 case TV_STAFF: return (70L);
949 case TV_WAND: return (50L);
952 case TV_ROD: return (90L);
955 case TV_RING: return (45L);
957 /* Un-aware Amulets */
958 case TV_AMULET: return (45L);
960 /* Figurines, relative to monster level */
963 DEPTH level = r_info[o_ptr->pval].level;
964 if (level < 20) return level*50L;
965 else if (level < 30) return 1000+(level-20)*150L;
966 else if (level < 40) return 2500+(level-30)*350L;
967 else if (level < 50) return 6000+(level-40)*800L;
968 else return 14000+(level-50)*2000L;
972 if (!o_ptr->pval) return 1000L;
973 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
976 /* Paranoia -- Oops */
982 * @brief オブジェクトのフラグ類から価格を算出する /
983 * Return the value of the flags the object has...
984 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
985 * @param plusses フラグに与える価格の基本重み
986 * @return オブジェクトのフラグ価格
988 s32b flag_cost(object_type *o_ptr, int plusses)
991 BIT_FLAGS flgs[TR_FLAG_SIZE];
995 object_kind *k_ptr = &k_info[o_ptr->k_idx];
997 object_flags(o_ptr, flgs);
1000 * Exclude fixed flags of the base item.
1001 * pval bonuses of base item will be treated later.
1003 for (i = 0; i < TR_FLAG_SIZE; i++)
1004 flgs[i] &= ~(k_ptr->flags[i]);
1006 /* Exclude fixed flags of the fixed artifact. */
1007 if (object_is_fixed_artifact(o_ptr))
1009 artifact_type *a_ptr = &a_info[o_ptr->name1];
1011 for (i = 0; i < TR_FLAG_SIZE; i++)
1012 flgs[i] &= ~(a_ptr->flags[i]);
1015 /* Exclude fixed flags of the ego-item. */
1016 else if (object_is_ego(o_ptr))
1018 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1020 for (i = 0; i < TR_FLAG_SIZE; i++)
1021 flgs[i] &= ~(e_ptr->flags[i]);
1026 * Calucurate values of remaining flags
1028 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
1029 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
1030 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
1031 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
1032 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
1033 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
1034 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
1035 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
1036 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
1037 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
1038 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
1039 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
1040 total += (10000 + (2500 * plusses));
1041 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
1042 total += (10000 + (2500 * plusses));
1046 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
1047 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
1048 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
1049 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
1050 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
1051 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
1052 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
1053 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
1054 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
1055 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
1056 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
1057 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
1058 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
1059 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
1060 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
1061 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
1062 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
1063 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
1064 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
1065 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
1066 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
1068 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
1069 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
1070 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
1071 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
1072 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
1073 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
1074 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
1075 total += (tmp_cost * count);
1077 if (have_flag(flgs, TR_SUST_STR)) total += 850;
1078 if (have_flag(flgs, TR_SUST_INT)) total += 850;
1079 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
1080 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
1081 if (have_flag(flgs, TR_SUST_CON)) total += 850;
1082 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
1083 if (have_flag(flgs, TR_RIDING)) total += 0;
1084 if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
1085 if (have_flag(flgs, TR_THROW)) total += 5000;
1086 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
1087 if (have_flag(flgs, TR_HOLD_EXP)) total += 8500;
1091 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
1092 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
1093 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
1094 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
1095 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
1096 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
1097 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
1098 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
1099 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
1100 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
1101 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
1102 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
1103 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
1104 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
1105 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
1106 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
1107 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
1108 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
1109 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
1110 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
1111 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
1112 total += (tmp_cost * count);
1114 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
1115 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
1116 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1117 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1118 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1119 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1120 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1121 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1122 if (have_flag(flgs, TR_LEVITATION)) total += 1250;
1123 if (have_flag(flgs, TR_LITE_1)) total += 1500;
1124 if (have_flag(flgs, TR_LITE_2)) total += 2500;
1125 if (have_flag(flgs, TR_LITE_3)) total += 4000;
1126 if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
1127 if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
1128 if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
1129 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1130 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1131 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1132 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1133 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1134 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1135 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1136 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1137 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1138 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1139 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1140 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1141 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1142 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1143 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1144 if (have_flag(flgs, TR_REGEN)) total += 2500;
1145 if (have_flag(flgs, TR_WARNING)) total += 2000;
1146 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1147 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1148 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1149 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1150 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1151 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1152 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1153 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1154 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1155 if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
1156 if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
1157 if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
1158 if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
1159 if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
1160 if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
1161 if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
1162 if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
1163 if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
1164 if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
1165 if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
1166 if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
1167 if (have_flag(flgs, TR_TELEPORT))
1169 if (object_is_cursed(o_ptr))
1174 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1175 if (have_flag(flgs, TR_BLESSED)) total += 750;
1176 if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1177 if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1178 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1179 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1180 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1182 /* Also, give some extra for activatable powers... */
1183 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1185 const activation_type* const act_ptr = find_activation_info(o_ptr);
1187 total += act_ptr->value;
1196 * @brief オブジェクトの真の価格を算出する /
1197 * Return the value of the flags the object has...
1198 * @param o_ptr 本価格を確認したいオブジェクトの構造体参照ポインタ
1199 * @return オブジェクトの本価格
1201 * Return the "real" price of a "known" item, not including discounts\n
1203 * Wand and staffs get cost for each charge\n
1205 * Armor is worth an extra 100 gold per bonus point to armor class.\n
1207 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
1209 * Missiles are only worth 5 gold per bonus point, since they\n
1210 * usually appear in groups of 20, and we want the player to get\n
1211 * the same amount of cash for any "equivalent" item. Note that\n
1212 * missiles never have any of the "pval" flags, and in fact, they\n
1213 * only have a few of the available flags, primarily of the "slay"\n
1214 * and "brand" and "ignore" variety.\n
1216 * Armor with a negative armor bonus is worthless.\n
1217 * Weapons with negative hit+damage bonuses are worthless.\n
1219 * Every wearable item with a "pval" bonus is worth extra (see below).\n
1221 PRICE object_value_real(object_type *o_ptr)
1224 BIT_FLAGS flgs[TR_FLAG_SIZE];
1225 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1228 /* Hack -- "worthless" items */
1229 if (!k_info[o_ptr->k_idx].cost) return (0L);
1232 value = k_info[o_ptr->k_idx].cost;
1234 /* Extract some flags */
1235 object_flags(o_ptr, flgs);
1238 if (object_is_fixed_artifact(o_ptr))
1240 artifact_type *a_ptr = &a_info[o_ptr->name1];
1242 /* Hack -- "worthless" artifacts */
1243 if (!a_ptr->cost) return (0L);
1245 /* Hack -- Use the artifact cost instead */
1246 value = a_ptr->cost;
1247 value += flag_cost(o_ptr, o_ptr->pval);
1249 /* Don't add pval bonuses etc. */
1254 else if (object_is_ego(o_ptr))
1256 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1258 /* Hack -- "worthless" ego-items */
1259 if (!e_ptr->cost) return (0L);
1261 /* Hack -- Reward the ego-item with a bonus */
1262 value += e_ptr->cost;
1263 value += flag_cost(o_ptr, o_ptr->pval);
1271 for (i = 0; i < TR_FLAG_SIZE; i++)
1272 if (o_ptr->art_flags[i]) flag = TRUE;
1274 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1277 /* Analyze pval bonus for normal object */
1278 switch (o_ptr->tval)
1301 if (!o_ptr->pval) break;
1303 /* Hack -- Negative "pval" is always bad */
1304 if (o_ptr->pval < 0) return (0L);
1306 /* Give credit for stat bonuses */
1307 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1308 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1309 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1310 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1311 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1312 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1314 /* Give credit for stealth and searching */
1315 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1316 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1317 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1319 /* Give credit for infra-vision and tunneling */
1320 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1321 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1323 /* Give credit for extra attacks */
1324 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1326 /* Give credit for speed bonus */
1327 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1333 /* Analyze the item */
1334 switch (o_ptr->tval)
1339 /* Pay extra for charges, depending on standard number of
1340 * charges. Handle new-style wands correctly. -LM-
1342 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1348 /* Pay extra for charges, depending on standard number of
1351 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1360 /* Hack -- negative bonuses are bad */
1361 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1363 /* Give credit for bonuses */
1364 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1380 /* Hack -- negative armor bonus */
1381 if (o_ptr->to_a < 0) return (0L);
1383 /* Give credit for bonuses */
1384 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1396 /* Hack -- negative hit/damage bonuses */
1397 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1399 /* Factor in the bonuses */
1400 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1402 /* Hack -- Factor in extra damage dice and sides */
1403 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1404 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1414 /* Hack -- negative hit/damage bonuses */
1415 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1417 /* Factor in the bonuses */
1418 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1420 /* Hack -- Factor in extra damage dice and sides */
1421 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1422 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1427 /* Figurines, relative to monster level */
1430 DEPTH level = r_info[o_ptr->pval].level;
1431 if (level < 20) value = level*50L;
1432 else if (level < 30) value = 1000+(level-20)*150L;
1433 else if (level < 40) value = 2500+(level-30)*350L;
1434 else if (level < 50) value = 6000+(level-40)*800L;
1435 else value = 14000+(level-50)*2000L;
1441 if (!o_ptr->pval) value = 1000L;
1442 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1448 if (!o_ptr->pval) value = 0L;
1453 /* Worthless object */
1454 if (value < 0) return 0L;
1456 /* Return the value */
1462 * @brief オブジェクト価格算出のメインルーチン /
1463 * Return the price of an item including plusses (and charges)
1464 * @param o_ptr 判明している現価格を確認したいオブジェクトの構造体参照ポインタ
1465 * @return オブジェクトの判明している現価格
1467 * This function returns the "value" of the given item (qty one)\n
1469 * Never notice "unknown" bonuses or properties, including "curses",\n
1470 * since that would give the player information he did not have.\n
1472 * Note that discounted items stay discounted forever, even if\n
1473 * the discount is "forgotten" by the player via memory loss.\n
1475 PRICE object_value(object_type *o_ptr)
1479 /* Unknown items -- acquire a base value */
1480 if (object_is_known(o_ptr))
1482 /* Broken items -- worthless */
1483 if (object_is_broken(o_ptr)) return (0L);
1485 /* Cursed items -- worthless */
1486 if (object_is_cursed(o_ptr)) return (0L);
1488 /* Real value (see above) */
1489 value = object_value_real(o_ptr);
1492 /* Known items -- acquire the actual value */
1495 /* Hack -- Felt broken items */
1496 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1498 /* Hack -- Felt cursed items */
1499 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1501 /* Base value (see above) */
1502 value = object_value_base(o_ptr);
1506 /* Apply discount (if any) */
1507 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1510 /* Return the final value */
1517 * @brief 破壊可能なアイテムかを返す /
1518 * Determines whether an object can be destroyed, and makes fake inscription.
1519 * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
1520 * @return オブジェクトが破壊可能ならばTRUEを返す
1522 bool can_player_destroy_object(object_type *o_ptr)
1524 /* Artifacts cannot be destroyed */
1525 if (!object_is_artifact(o_ptr)) return TRUE;
1527 /* If object is unidentified, makes fake inscription */
1528 if (!object_is_known(o_ptr))
1530 byte feel = FEEL_SPECIAL;
1532 /* Hack -- Handle icky artifacts */
1533 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1535 /* Hack -- inscribe the artifact */
1536 o_ptr->feeling = feel;
1538 /* We have "felt" it (again) */
1539 o_ptr->ident |= (IDENT_SENSE);
1541 /* Combine the pack */
1542 p_ptr->notice |= (PN_COMBINE);
1544 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1549 /* Identified artifact -- Nothing to do */
1555 * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
1556 * Distribute charges of rods or wands.
1557 * @param o_ptr 分割元オブジェクトの構造体参照ポインタ source item
1558 * @param q_ptr 分割先オブジェクトの構造体参照ポインタ target item, must be of the same type as o_ptr
1559 * @param amt 分割したい回数量 number of items that are transfered
1562 * Hack -- If rods or wands are dropped, the total maximum timeout or\n
1563 * charges need to be allocated between the two stacks. If all the items\n
1564 * are being dropped, it makes for a neater message to leave the original\n
1565 * stack's pval alone. -LM-\n
1567 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1569 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1571 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1572 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1574 /* Hack -- Rods also need to have their timeouts distributed. The
1575 * dropped stack will accept all time remaining to charge up to its
1578 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1580 if (q_ptr->pval > o_ptr->timeout)
1581 q_ptr->timeout = o_ptr->timeout;
1583 q_ptr->timeout = q_ptr->pval;
1585 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1591 * @brief 魔法棒やロッドの使用回数を減らす /
1592 * @param o_ptr オブジェクトの構造体参照ポインタ source item
1593 * @param amt 減らしたい回数量 number of items that are transfered
1596 * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1597 * charges of the stack needs to be reduced, unless all the items are\n
1598 * being destroyed. -LM-\n
1600 void reduce_charges(object_type *o_ptr, int amt)
1602 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1603 (amt < o_ptr->number))
1605 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1610 * Determine if an item can "absorb" a second item
1612 * See "object_absorb()" for the actual "absorption" code.
1614 * If permitted, we allow staffs (if they are known to have equal charges
1615 * and both are either known or confirmed empty) and wands (if both are
1616 * either known or confirmed empty) and rods (in all cases) to combine.
1617 * Staffs will unstack (if necessary) when they are used, but wands and
1618 * rods will only unstack if one is dropped. -LM-
1620 * If permitted, we allow weapons/armor to stack, if fully "known".
1622 * Missiles will combine if both stacks have the same "known" status.
1623 * This is done to make unidentified stacks of missiles useful.
1625 * Food, potions, scrolls, and "easy know" items always stack.
1627 * Chests, and activatable items, never stack (for various reasons).
1631 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1633 #define MAX_STACK_SIZE 99
1637 * @brief 両オブジェクトをスロットに重ね合わせ可能な最大数を返す。
1638 * Determine if an item can partly absorb a second item. Return maximum number of stack.
1639 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1640 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1641 * @return 重ね合わせ可能なアイテム数
1643 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1647 /* Default maximum number of stack */
1648 int max_num = MAX_STACK_SIZE;
1650 /* Require identical object types */
1651 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1654 /* Analyze the items */
1655 switch (o_ptr->tval)
1657 /* Chests and Statues*/
1668 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1669 if (o_ptr->pval != j_ptr->pval) return 0;
1673 /* Figurines and Corpses*/
1678 if (o_ptr->pval != j_ptr->pval) return 0;
1684 /* Food and Potions and Scrolls */
1696 /* Require either knowledge or known empty for both staffs. */
1697 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1698 !object_is_known(o_ptr)) ||
1699 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1700 !object_is_known(j_ptr))) return 0;
1702 /* Require identical charges, since staffs are bulky. */
1703 if (o_ptr->pval != j_ptr->pval) return 0;
1712 /* Require either knowledge or known empty for both wands. */
1713 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1714 !object_is_known(o_ptr)) ||
1715 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1716 !object_is_known(j_ptr))) return 0;
1718 /* Wand charges combine in O&ZAngband. */
1724 /* Staffs and Wands and Rods */
1727 /* Prevent overflaw of timeout */
1728 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1734 /* Weapons and Armor */
1750 /* Rings, Amulets, Lites */
1756 /* Require full knowledge of both items */
1757 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1767 /* Require identical knowledge of both items */
1768 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1769 if (o_ptr->feeling != j_ptr->feeling) return 0;
1771 /* Require identical "bonuses" */
1772 if (o_ptr->to_h != j_ptr->to_h) return 0;
1773 if (o_ptr->to_d != j_ptr->to_d) return 0;
1774 if (o_ptr->to_a != j_ptr->to_a) return 0;
1776 /* Require identical "pval" code */
1777 if (o_ptr->pval != j_ptr->pval) return 0;
1779 /* Artifacts never stack */
1780 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1782 /* Require identical "ego-item" names */
1783 if (o_ptr->name2 != j_ptr->name2) return 0;
1785 /* Require identical added essence */
1786 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1787 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1789 /* Hack -- Never stack "powerful" items */
1790 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1792 /* Hack -- Never stack recharging items */
1793 if (o_ptr->timeout || j_ptr->timeout) return 0;
1795 /* Require identical "values" */
1796 if (o_ptr->ac != j_ptr->ac) return 0;
1797 if (o_ptr->dd != j_ptr->dd) return 0;
1798 if (o_ptr->ds != j_ptr->ds) return 0;
1807 /* Require knowledge */
1808 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1816 /* Hack -- Identical art_flags! */
1817 for (i = 0; i < TR_FLAG_SIZE; i++)
1818 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1820 /* Hack -- Require identical "cursed" status */
1821 if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1823 /* Hack -- Require identical "broken" status */
1824 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1827 /* Hack -- require semi-matching "inscriptions" */
1828 if (o_ptr->inscription && j_ptr->inscription &&
1829 (o_ptr->inscription != j_ptr->inscription))
1832 /* Hack -- normally require matching "inscriptions" */
1833 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1835 /* Hack -- normally require matching "discounts" */
1836 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1839 /* They match, so they must be similar */
1844 * @brief 両オブジェクトをスロットに重ねることができるかどうかを返す。
1845 * Determine if an item can absorb a second item.
1846 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1847 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1848 * @return 重ね合わせ可能ならばTRUEを返す。
1850 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1852 int total = o_ptr->number + j_ptr->number;
1855 /* Are these objects similar? */
1856 max_num = object_similar_part(o_ptr, j_ptr);
1858 /* Return if not similar */
1859 if (!max_num) return FALSE;
1861 /* Maximal "stacking" limit */
1862 if (total > max_num) return (0);
1865 /* They match, so they must be similar */
1871 * @brief 両オブジェクトをスロットに重ね合わせる。
1872 * Allow one item to "absorb" another, assuming they are similar
1873 * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
1874 * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
1877 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1879 int max_num = object_similar_part(o_ptr, j_ptr);
1880 int total = o_ptr->number + j_ptr->number;
1881 int diff = (total > max_num) ? total - max_num : 0;
1883 /* Combine quantity, lose excess items */
1884 o_ptr->number = (total > max_num) ? max_num : total;
1886 /* Hack -- blend "known" status */
1887 if (object_is_known(j_ptr)) object_known(o_ptr);
1889 /* Hack -- clear "storebought" if only one has it */
1890 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1891 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1893 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1894 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1897 /* Hack -- blend "mental" status */
1898 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1900 /* Hack -- blend "inscriptions" */
1901 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1903 /* Hack -- blend "feelings" */
1904 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1906 /* Hack -- could average discounts */
1907 /* Hack -- save largest discount */
1908 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1910 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1911 if (o_ptr->tval == TV_ROD)
1913 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1914 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1917 /* Hack -- if wands are stacking, combine the charges. -LM- */
1918 if (o_ptr->tval == TV_WAND)
1920 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1926 * @brief tvalとsvalに対応するベースアイテムのIDを返す。
1927 * Find the index of the object_kind with the given tval and sval
1928 * @param tval 検索したいベースアイテムのtval
1929 * @param sval 検索したいベースアイテムのsval
1932 IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval)
1939 for (k = 1; k < max_k_idx; k++)
1941 object_kind *k_ptr = &k_info[k];
1943 /* Require correct tval */
1944 if (k_ptr->tval != tval) continue;
1947 if (k_ptr->sval == sval) return (k);
1949 /* Ignore illegal items */
1950 if (sval != SV_ANY) continue;
1952 /* Apply the randomizer */
1953 if (!one_in_(++num)) continue;
1955 /* Use this value */
1959 /* Return this choice */
1966 msg_format(_("アイテムがない (%d,%d)", "No object (%d,%d)"), tval, sval);
1975 * @brief オブジェクトを初期化する
1976 * Wipe an object clean.
1977 * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
1980 void object_wipe(object_type *o_ptr)
1982 /* Wipe the structure */
1983 (void)WIPE(o_ptr, object_type);
1988 * @brief オブジェクトを複製する
1989 * Wipe an object clean.
1990 * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
1991 * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
1994 void object_copy(object_type *o_ptr, object_type *j_ptr)
1996 /* Copy the structure */
1997 (void)COPY(o_ptr, j_ptr, object_type);
2002 * @brief オブジェクト構造体にベースアイテムを作成する
2003 * Prepare an object based on an object kind.
2004 * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
2005 * @param k_idx 新たに作成したいベースアイテム情報のID
2008 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
2010 object_kind *k_ptr = &k_info[k_idx];
2012 /* Clear the record */
2015 /* Save the kind index */
2016 o_ptr->k_idx = k_idx;
2018 /* Efficiency -- tval/sval */
2019 o_ptr->tval = k_ptr->tval;
2020 o_ptr->sval = k_ptr->sval;
2022 /* Default "pval" */
2023 o_ptr->pval = k_ptr->pval;
2025 /* Default number */
2028 /* Default weight */
2029 o_ptr->weight = k_ptr->weight;
2032 o_ptr->to_h = k_ptr->to_h;
2033 o_ptr->to_d = k_ptr->to_d;
2034 o_ptr->to_a = k_ptr->to_a;
2037 o_ptr->ac = k_ptr->ac;
2038 o_ptr->dd = k_ptr->dd;
2039 o_ptr->ds = k_ptr->ds;
2041 /* Default activation */
2042 if (k_ptr->act_idx > 0) o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
2044 /* Hack -- worthless items are always "broken" */
2045 if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
2047 /* Hack -- cursed items are always "cursed" */
2048 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
2049 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2050 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
2051 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2052 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2053 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2058 * @brief 上質以上のオブジェクトに与えるための各種ボーナスを正規乱数も加えて算出する。
2059 * Help determine an "enchantment bonus" for an object.
2060 * @param max ボーナス値の限度
2061 * @param level ボーナス値に加味する基準生成階
2062 * @return 算出されたボーナス値
2064 * To avoid floating point but still provide a smooth distribution of bonuses,\n
2065 * we simply round the results of division in such a way as to "average" the\n
2066 * correct floating point value.\n
2068 * This function has been changed. It uses "randnor()" to choose values from\n
2069 * a normal distribution, whose mean moves from zero towards the max as the\n
2070 * level increases, and whose standard deviation is equal to 1/4 of the max,\n
2071 * and whose values are forced to lie between zero and the max, inclusive.\n
2073 * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
2074 * rare to get the "full" enchantment on an object, even a deep levels.\n
2076 * It is always possible (albeit unlikely) to get the "full" enchantment.\n
2078 * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
2080 * N 0 1 2 3 4 5 6 7 8 9 10\n
2081 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n
2082 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03\n
2083 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05\n
2084 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05\n
2085 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11\n
2086 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41\n
2087 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65\n
2088 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94\n
2089 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78\n
2090 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64\n
2091 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62\n
2092 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33\n
2093 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38\n
2094 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53\n
2095 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53\n
2096 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27\n
2097 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72\n
2098 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07\n
2100 int m_bonus(int max, DEPTH level)
2102 int bonus, stand, extra, value;
2105 /* Paranoia -- enforce maximal "level" */
2106 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
2109 /* The "bonus" moves towards the max */
2110 bonus = ((max * level) / MAX_DEPTH);
2112 /* Hack -- determine fraction of error */
2113 extra = ((max * level) % MAX_DEPTH);
2115 /* Hack -- simulate floating point computations */
2116 if (randint0(MAX_DEPTH) < extra) bonus++;
2119 /* The "stand" is equal to one quarter of the max */
2122 /* Hack -- determine fraction of error */
2125 /* Hack -- simulate floating point computations */
2126 if (randint0(4) < extra) stand++;
2129 /* Choose an "interesting" value */
2130 value = randnor(bonus, stand);
2132 /* Enforce the minimum value */
2133 if (value < 0) return (0);
2135 /* Enforce the maximum value */
2136 if (value > max) return (max);
2144 * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user
2145 * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ
2148 static void object_mention(object_type *o_ptr)
2150 char o_name[MAX_NLEN];
2152 object_aware(o_ptr);
2153 object_known(o_ptr);
2155 /* Mark the item as fully known */
2156 o_ptr->ident |= (IDENT_MENTAL);
2159 object_desc(o_name, o_ptr, 0);
2160 msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name);
2164 * @brief INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2165 * Mega-Hack -- Attempt to create one of the "Special Objects"
2166 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2167 * @return 生成に成功したらTRUEを返す。
2169 * We are only called from "make_object()", and we assume that\n
2170 * "apply_magic()" is called immediately after we return.\n
2172 * Note -- see "make_artifact()" and "apply_magic()"\n
2174 static bool make_artifact_special(object_type *o_ptr)
2177 KIND_OBJECT_IDX k_idx = 0;
2179 /*! @note 地上ではキャンセルする / No artifacts in the town */
2180 if (!dun_level) return (FALSE);
2182 /*! @note get_obj_num_hookによる指定がある場合は生成をキャンセルする / Themed object */
2183 if (get_obj_num_hook) return (FALSE);
2185 /*! @note 全固定アーティファクト中からIDの若い順に生成対象とその確率を走査する / Check the artifact list (just the "specials") */
2186 for (i = 0; i < max_a_idx; i++)
2188 artifact_type *a_ptr = &a_info[i];
2190 /*! @note アーティファクト名が空の不正なデータは除外する / Skip "empty" artifacts */
2191 if (!a_ptr->name) continue;
2193 /*! @note 既に生成回数がカウントされたアーティファクト、QUESTITEMと非INSTA_ARTは除外 / Cannot make an artifact twice */
2194 if (a_ptr->cur_num) continue;
2195 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2196 if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue;
2198 /*! @note アーティファクト生成階が現在に対して足りない場合は高確率で1/(不足階層*2)を満たさないと生成リストに加えられない /
2199 * XXX XXX Enforce minimum "depth" (loosely) */
2200 if (a_ptr->level > object_level)
2202 /* @note / Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2203 int d = (a_ptr->level - object_level) * 2;
2204 if (!one_in_(d)) continue;
2207 /*! @note 1/(レア度)の確率を満たさないと除外される / Artifact "rarity roll" */
2208 if (!one_in_(a_ptr->rarity)) continue;
2210 /*! @note INSTA_ART型固定アーティファクトのベースアイテムもチェック対象とする。ベースアイテムの生成階層が足りない場合1/(不足階層*5) を満たさないと除外される。 /
2211 * Find the base object. XXX XXX Enforce minimum "object" level (loosely). Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2212 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2213 if (k_info[k_idx].level > object_level)
2215 int d = (k_info[k_idx].level - object_level) * 5;
2216 if (!one_in_(d)) continue;
2219 /*! @note 前述の条件を満たしたら、後のIDのアーティファクトはチェックせずすぐ確定し生成処理に移す /
2220 * Assign the template. Mega-Hack -- mark the item as an artifact. Hack: Some artifacts get random extra powers. Success. */
2221 object_prep(o_ptr, k_idx);
2224 random_artifact_resistance(o_ptr, a_ptr);
2228 /*! @note 全INSTA_ART固定アーティファクトを試行しても決まらなかった場合 FALSEを返す / Failure */
2234 * @brief 非INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2235 * Mega-Hack -- Attempt to create one of the "Special Objects"
2236 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2237 * @return 生成に成功したらTRUEを返す。
2239 * Attempt to change an object into an artifact\n
2240 * This routine should only be called by "apply_magic()"\n
2241 * Note -- see "make_artifact_special()" and "apply_magic()"\n
2243 static bool make_artifact(object_type *o_ptr)
2248 /* No artifacts in the town */
2249 if (!dun_level) return (FALSE);
2251 /* Paranoia -- no "plural" artifacts */
2252 if (o_ptr->number != 1) return (FALSE);
2254 /* Check the artifact list (skip the "specials") */
2255 for (i = 0; i < max_a_idx; i++)
2257 artifact_type *a_ptr = &a_info[i];
2259 /* Skip "empty" items */
2260 if (!a_ptr->name) continue;
2262 /* Cannot make an artifact twice */
2263 if (a_ptr->cur_num) continue;
2265 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2267 if (a_ptr->gen_flags & TRG_INSTA_ART) continue;
2269 /* Must have the correct fields */
2270 if (a_ptr->tval != o_ptr->tval) continue;
2271 if (a_ptr->sval != o_ptr->sval) continue;
2273 /* XXX XXX Enforce minimum "depth" (loosely) */
2274 if (a_ptr->level > dun_level)
2276 /* Acquire the "out-of-depth factor" */
2277 int d = (a_ptr->level - dun_level) * 2;
2279 /* Roll for out-of-depth creation */
2280 if (!one_in_(d)) continue;
2283 /* We must make the "rarity roll" */
2284 if (!one_in_(a_ptr->rarity)) continue;
2286 /* Hack -- mark the item as an artifact */
2289 /* Hack: Some artifacts get random extra powers */
2290 random_artifact_resistance(o_ptr, a_ptr);
2302 * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
2303 * Choose random ego type
2304 * @param slot 取得したいエゴの装備部位
2305 * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
2306 * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
2308 static byte get_random_ego(byte slot, bool good)
2311 ego_item_type *e_ptr;
2315 for (i = 1; i < max_e_idx; i++)
2319 if (e_ptr->slot == slot
2320 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2323 total += (255 / e_ptr->rarity);
2327 value = randint1(total);
2329 for (i = 1; i < max_e_idx; i++)
2333 if (e_ptr->slot == slot
2334 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2337 value -= (255 / e_ptr->rarity);
2338 if (value <= 0L) break;
2346 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2347 * Apply magic to an item known to be a "weapon"
2348 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2349 * @param level 生成基準階
2350 * @param power 生成ランク
2353 * Hack -- note special base damage dice boosting\n
2354 * Hack -- note special processing for weapon/digger\n
2356 static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
2358 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
2359 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
2361 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
2362 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
2364 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2366 tohit2 = (tohit2+1)/2;
2367 todam2 = (todam2+1)/2;
2374 o_ptr->to_h += tohit1;
2375 o_ptr->to_d += todam1;
2381 o_ptr->to_h += tohit2;
2382 o_ptr->to_d += todam2;
2390 o_ptr->to_h -= tohit1;
2391 o_ptr->to_d -= todam1;
2396 /* Penalize again */
2397 o_ptr->to_h -= tohit2;
2398 o_ptr->to_d -= todam2;
2401 /* Cursed (if "bad") */
2402 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2405 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2408 switch (o_ptr->tval)
2415 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2416 create_artifact(o_ptr, FALSE);
2418 /* Special Ego-item */
2419 o_ptr->name2 = EGO_DIGGING;
2423 else if (power < -1)
2425 /* Hack -- Horrible digging bonus */
2426 o_ptr->pval = 0 - (5 + randint1(5));
2432 /* Hack -- Reverse digging bonus */
2433 o_ptr->pval = 0 - (o_ptr->pval);
2447 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2449 create_artifact(o_ptr, FALSE);
2454 /* Roll for an ego-item */
2455 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2456 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2458 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2460 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2465 switch (o_ptr->name2)
2468 if (one_in_(4) && (level > 40))
2469 add_flag(o_ptr->art_flags, TR_BLOWS);
2473 add_flag(o_ptr->art_flags, TR_RES_POIS);
2475 add_flag(o_ptr->art_flags, TR_WARNING);
2477 case EGO_KILL_DRAGON:
2479 add_flag(o_ptr->art_flags, TR_RES_POIS);
2483 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2485 case EGO_SLAYING_WEAPON:
2486 if (one_in_(3)) /* double damage */
2494 while (one_in_(o_ptr->dd));
2500 while (one_in_(o_ptr->ds));
2505 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2507 if (o_ptr->tval == TV_SWORD && one_in_(3))
2509 add_flag(o_ptr->art_flags, TR_VORPAL);
2514 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2520 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
2522 add_flag(o_ptr->art_flags, TR_DEX);
2524 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2527 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
2529 case EGO_EARTHQUAKES:
2530 if (one_in_(3) && (level > 60))
2531 add_flag(o_ptr->art_flags, TR_BLOWS);
2533 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
2537 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2541 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2543 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2545 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2546 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2549 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2550 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2551 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2552 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2556 if (!o_ptr->art_name)
2558 /* Hack -- Super-charge the damage dice */
2559 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2561 /* Hack -- Lower the damage dice */
2562 if (o_ptr->dd > 9) o_ptr->dd = 9;
2567 else if (power < -1)
2569 /* Roll for ego-item */
2570 if (randint0(MAX_DEPTH) < level)
2574 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2575 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2581 switch (o_ptr->name2)
2584 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2585 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2587 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2588 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2589 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2590 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2591 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2592 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2606 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2608 create_artifact(o_ptr, FALSE);
2611 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2625 if (power > 2) /* power > 2 is debug only */
2627 create_artifact(o_ptr, FALSE);
2631 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2633 switch (o_ptr->name2)
2635 case EGO_SLAYING_BOLT:
2640 /* Hack -- super-charge the damage dice */
2641 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2643 /* Hack -- restrict the damage dice */
2644 if (o_ptr->dd > 9) o_ptr->dd = 9;
2648 else if (power < -1)
2650 /* Roll for ego-item */
2651 if (randint0(MAX_DEPTH) < level)
2653 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2663 * @brief ドラゴン装備にランダムな耐性を与える
2664 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2667 static void dragon_resist(object_type * o_ptr)
2672 one_dragon_ele_resistance(o_ptr);
2674 one_high_resistance(o_ptr);
2680 * @brief オブジェクトにランダムな強いESPを与える
2681 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2684 static bool add_esp_strong(object_type *o_ptr)
2686 bool nonliv = FALSE;
2688 switch (randint1(3))
2690 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2691 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2692 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2699 * @brief オブジェクトにランダムな弱いESPを与える
2700 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2701 * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3)
2704 static void add_esp_weak(object_type *o_ptr, bool extra)
2707 u32b weak_esp_list[] = {
2719 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2720 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2722 /* Add unduplicated weak esp flags randomly */
2723 for (i = 0; i < add_count; ++ i)
2725 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2727 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2728 weak_esp_list[choice] = weak_esp_list[i];
2734 * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2735 * Apply magic to an item known to be "armor"
2736 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2737 * @param level 生成基準階
2738 * @param power 生成ランク
2741 * Hack -- note special processing for crown/helm\n
2742 * Hack -- note special processing for robe of permanence\n
2744 static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
2746 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
2747 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
2753 o_ptr->to_a += toac1;
2759 o_ptr->to_a += toac2;
2767 o_ptr->to_a -= toac1;
2772 /* Penalize again */
2773 o_ptr->to_a -= toac2;
2776 /* Cursed (if "bad") */
2777 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2782 switch (o_ptr->tval)
2786 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2787 create_artifact(o_ptr, FALSE);
2797 /* Hack -- Try for "Robes of the Magi" */
2798 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2799 (o_ptr->sval == SV_ROBE) &&
2800 (randint0(100) < 15))
2804 o_ptr->name2 = EGO_YOIYAMI;
2805 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2806 o_ptr->sval = SV_YOIYAMI_ROBE;
2812 o_ptr->name2 = EGO_PERMANENCE;
2817 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2819 create_artifact(o_ptr, FALSE);
2825 bool okay_flag = TRUE;
2827 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2829 switch (o_ptr->name2)
2832 if (o_ptr->tval != TV_HARD_ARMOR)
2838 if (o_ptr->tval != TV_SOFT_ARMOR)
2847 if (okay_flag) break;
2849 switch (o_ptr->name2)
2851 case EGO_RESISTANCE:
2853 add_flag(o_ptr->art_flags, TR_RES_POIS);
2856 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2857 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2861 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2863 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2865 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2866 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2868 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2869 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2870 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2871 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2872 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2873 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2874 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2875 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2878 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2879 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2880 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2881 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2882 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2883 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2896 if (o_ptr->sval == SV_DRAGON_SHIELD)
2898 dragon_resist(o_ptr);
2899 if (!one_in_(3)) break;
2905 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2907 create_artifact(o_ptr, FALSE);
2913 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2914 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
2915 && o_ptr->name2 == EGO_S_DWARVEN)
2922 switch (o_ptr->name2)
2925 if (!one_in_(3)) one_high_resistance(o_ptr);
2926 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2928 case EGO_REFLECTION:
2929 if (o_ptr->sval == SV_MIRROR_SHIELD)
2934 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2935 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2944 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2946 dragon_resist(o_ptr);
2947 if (!one_in_(3)) break;
2951 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2953 create_artifact(o_ptr, FALSE);
2956 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2960 else if (power < -1)
2962 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2970 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2972 dragon_resist(o_ptr);
2973 if (!one_in_(3)) break;
2978 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2980 create_artifact(o_ptr, FALSE);
2983 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
2985 switch (o_ptr->name2)
2987 case EGO_SLOW_DESCENT:
2990 one_high_resistance(o_ptr);
2996 else if (power < -1)
2998 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
3009 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3011 create_artifact(o_ptr, FALSE);
3016 bool ok_flag = TRUE;
3017 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3019 switch (o_ptr->name2)
3022 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
3023 else add_esp_weak(o_ptr, FALSE);
3027 case EGO_REGENERATION:
3028 case EGO_LORDLINESS:
3034 if (one_in_(2)) add_esp_strong(o_ptr);
3035 else add_esp_weak(o_ptr, FALSE);
3038 default:/* not existing crown (wisdom,lite, etc...) */
3042 break; /* while (1) */
3048 else if (power < -1)
3052 bool ok_flag = TRUE;
3053 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3055 switch (o_ptr->name2)
3057 case EGO_ANCIENT_CURSE:
3058 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
3059 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
3060 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3061 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3062 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3063 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3067 break; /* while (1) */
3076 if (o_ptr->sval == SV_DRAGON_HELM)
3078 dragon_resist(o_ptr);
3079 if (!one_in_(3)) break;
3085 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3087 create_artifact(o_ptr, FALSE);
3092 bool ok_flag = TRUE;
3093 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3095 switch (o_ptr->name2)
3097 case EGO_BRILLIANCE:
3099 case EGO_INFRAVISION:
3100 case EGO_H_PROTECTION:
3105 if (one_in_(2)) add_esp_strong(o_ptr);
3106 else add_esp_weak(o_ptr, FALSE);
3110 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
3111 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
3114 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3116 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
3118 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
3119 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3121 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3122 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
3123 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
3124 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3125 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3126 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3127 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3128 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
3130 default:/* not existing helm (Magi, Might, etc...)*/
3134 break; /* while (1) */
3139 else if (power < -1)
3143 bool ok_flag = TRUE;
3144 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3146 switch (o_ptr->name2)
3148 case EGO_ANCIENT_CURSE:
3152 break; /* while (1) */
3163 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3165 create_artifact(o_ptr, FALSE);
3168 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
3170 switch (o_ptr->name2)
3179 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
3180 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
3181 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
3182 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3189 else if (power < -1)
3191 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3202 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
3203 * Apply magic to an item known to be a "ring" or "amulet"
3204 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3205 * @param level 生成基準階
3206 * @param power 生成ランク
3209 * Hack -- note special "pval boost" code for ring of speed\n
3210 * Hack -- note that some items must be cursed (or blessed)\n
3212 static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
3214 /* Apply magic (good or bad) according to type */
3215 switch (o_ptr->tval)
3220 switch (o_ptr->sval)
3222 case SV_RING_ATTACKS:
3225 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
3226 if (one_in_(15)) o_ptr->pval++;
3227 if (o_ptr->pval < 1) o_ptr->pval = 1;
3233 o_ptr->ident |= (IDENT_BROKEN);
3236 o_ptr->curse_flags |= TRC_CURSED;
3239 o_ptr->pval = 0 - (o_ptr->pval);
3250 /* Strength, Constitution, Dexterity, Intelligence */
3256 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3262 o_ptr->ident |= (IDENT_BROKEN);
3265 o_ptr->curse_flags |= TRC_CURSED;
3268 o_ptr->pval = 0 - (o_ptr->pval);
3274 /* Ring of Speed! */
3277 /* Base speed (1 to 10) */
3278 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3280 /* Super-charge the ring */
3281 while (randint0(100) < 50) o_ptr->pval++;
3287 o_ptr->ident |= (IDENT_BROKEN);
3290 o_ptr->curse_flags |= TRC_CURSED;
3293 o_ptr->pval = 0 - (o_ptr->pval);
3301 case SV_RING_LORDLY:
3305 one_lordly_high_resistance(o_ptr);
3309 /* Bonus to armor class */
3310 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3314 case SV_RING_WARNING:
3316 if (one_in_(3)) one_low_esp(o_ptr);
3321 case SV_RING_SEARCHING:
3323 /* Bonus to searching */
3324 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3330 o_ptr->ident |= (IDENT_BROKEN);
3333 o_ptr->curse_flags |= TRC_CURSED;
3336 o_ptr->pval = 0 - (o_ptr->pval);
3342 /* Flames, Acid, Ice */
3343 case SV_RING_FLAMES:
3348 /* Bonus to armor class */
3349 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3353 /* Weakness, Stupidity */
3354 case SV_RING_WEAKNESS:
3355 case SV_RING_STUPIDITY:
3358 o_ptr->ident |= (IDENT_BROKEN);
3361 o_ptr->curse_flags |= TRC_CURSED;
3364 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3365 if (power > 0) power = 0 - power;
3370 /* WOE, Stupidity */
3374 o_ptr->ident |= (IDENT_BROKEN);
3377 o_ptr->curse_flags |= TRC_CURSED;
3380 o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
3381 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3382 if (power > 0) power = 0 - power;
3387 /* Ring of damage */
3388 case SV_RING_DAMAGE:
3390 /* Bonus to damage */
3391 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
3397 o_ptr->ident |= (IDENT_BROKEN);
3400 o_ptr->curse_flags |= TRC_CURSED;
3403 o_ptr->to_d = 0 - o_ptr->to_d;
3409 /* Ring of Accuracy */
3410 case SV_RING_ACCURACY:
3413 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
3419 o_ptr->ident |= (IDENT_BROKEN);
3422 o_ptr->curse_flags |= TRC_CURSED;
3425 o_ptr->to_h = 0 - o_ptr->to_h;
3431 /* Ring of Protection */
3432 case SV_RING_PROTECTION:
3434 /* Bonus to armor class */
3435 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
3441 o_ptr->ident |= (IDENT_BROKEN);
3444 o_ptr->curse_flags |= TRC_CURSED;
3447 o_ptr->to_a = 0 - o_ptr->to_a;
3453 /* Ring of Slaying */
3454 case SV_RING_SLAYING:
3456 /* Bonus to damage and to hit */
3457 o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
3458 o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
3464 o_ptr->ident |= (IDENT_BROKEN);
3467 o_ptr->curse_flags |= TRC_CURSED;
3469 /* Reverse bonuses */
3470 o_ptr->to_h = 0 - o_ptr->to_h;
3471 o_ptr->to_d = 0 - o_ptr->to_d;
3477 case SV_RING_MUSCLE:
3479 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
3480 if (one_in_(4)) o_ptr->pval++;
3486 o_ptr->ident |= (IDENT_BROKEN);
3489 o_ptr->curse_flags |= TRC_CURSED;
3491 /* Reverse bonuses */
3492 o_ptr->pval = 0 - o_ptr->pval;
3497 case SV_RING_AGGRAVATION:
3500 o_ptr->ident |= (IDENT_BROKEN);
3503 o_ptr->curse_flags |= TRC_CURSED;
3505 if (power > 0) power = 0 - power;
3509 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3510 || (power > 2)) /* power > 2 is debug only */
3512 o_ptr->pval = MIN(o_ptr->pval, 4);
3513 /* Randart amulet */
3514 create_artifact(o_ptr, FALSE);
3516 else if ((power == 2) && one_in_(2))
3518 while(!o_ptr->name2)
3520 int tmp = m_bonus(10, level);
3521 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3522 switch(randint1(28))
3525 o_ptr->name2 = EGO_RING_THROW;
3528 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3529 o_ptr->name2 = EGO_RING_REGEN;
3532 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3533 o_ptr->name2 = EGO_RING_LITE;
3536 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3537 o_ptr->name2 = EGO_RING_TELEPORT;
3540 if (o_ptr->to_h) break;
3541 o_ptr->name2 = EGO_RING_TO_H;
3544 if (o_ptr->to_d) break;
3545 o_ptr->name2 = EGO_RING_TO_D;
3548 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3549 o_ptr->name2 = EGO_RING_SLAY;
3552 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3553 o_ptr->name2 = EGO_RING_WIZARD;
3556 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3557 o_ptr->name2 = EGO_RING_HERO;
3560 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3561 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3562 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3563 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3566 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3567 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;
3568 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3569 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3570 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3573 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3574 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;
3575 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3576 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3577 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3580 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3581 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;
3582 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3583 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3586 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3587 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;
3588 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3589 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3591 case 21: case 22: case 23: case 24: case 25: case 26:
3592 switch (o_ptr->sval)
3595 if (!one_in_(3)) break;
3596 o_ptr->name2 = EGO_RING_D_SPEED;
3598 case SV_RING_DAMAGE:
3599 case SV_RING_ACCURACY:
3600 case SV_RING_SLAYING:
3601 if (one_in_(2)) break;
3602 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3605 o_ptr->name2 = EGO_RING_BERSERKER;
3606 o_ptr->to_h -= 2+randint1(4);
3607 o_ptr->to_d += 2+randint1(4);
3610 case SV_RING_PROTECTION:
3611 o_ptr->name2 = EGO_RING_SUPER_AC;
3612 o_ptr->to_a += 7 + m_bonus(5, level);
3614 case SV_RING_RES_FEAR:
3615 o_ptr->name2 = EGO_RING_HERO;
3618 if (one_in_(2)) break;
3619 o_ptr->name2 = EGO_RING_HUNTER;
3621 case SV_RING_SEARCHING:
3622 o_ptr->name2 = EGO_RING_STEALTH;
3624 case SV_RING_TELEPORTATION:
3625 o_ptr->name2 = EGO_RING_TELE_AWAY;
3627 case SV_RING_RES_BLINDNESS:
3629 o_ptr->name2 = EGO_RING_RES_LITE;
3631 o_ptr->name2 = EGO_RING_RES_DARK;
3633 case SV_RING_LORDLY:
3634 if (!one_in_(20)) break;
3635 one_lordly_high_resistance(o_ptr);
3636 one_lordly_high_resistance(o_ptr);
3637 o_ptr->name2 = EGO_RING_TRUE;
3639 case SV_RING_SUSTAIN:
3640 if (!one_in_(4)) break;
3641 o_ptr->name2 = EGO_RING_RES_TIME;
3643 case SV_RING_FLAMES:
3644 if (!one_in_(2)) break;
3645 o_ptr->name2 = EGO_RING_DRAGON_F;
3648 if (!one_in_(2)) break;
3649 o_ptr->name2 = EGO_RING_DRAGON_C;
3651 case SV_RING_WARNING:
3652 if (!one_in_(2)) break;
3653 o_ptr->name2 = EGO_RING_M_DETECT;
3662 o_ptr->curse_flags = 0L;
3664 else if ((power == -2) && one_in_(2))
3666 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3667 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3668 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3669 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3670 o_ptr->art_flags[0] = 0;
3671 o_ptr->art_flags[1] = 0;
3672 while(!o_ptr->name2)
3674 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3678 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3679 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3682 o_ptr->name2 = EGO_RING_NO_MELEE;
3685 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3686 o_ptr->name2 = EGO_RING_AGGRAVATE;
3689 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3690 o_ptr->name2 = EGO_RING_TY_CURSE;
3693 o_ptr->name2 = EGO_RING_ALBINO;
3698 o_ptr->ident |= (IDENT_BROKEN);
3701 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3709 switch (o_ptr->sval)
3711 /* Amulet of wisdom/charisma */
3712 case SV_AMULET_INTELLIGENCE:
3713 case SV_AMULET_WISDOM:
3714 case SV_AMULET_CHARISMA:
3716 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3722 o_ptr->ident |= (IDENT_BROKEN);
3725 o_ptr->curse_flags |= (TRC_CURSED);
3727 /* Reverse bonuses */
3728 o_ptr->pval = 0 - o_ptr->pval;
3734 /* Amulet of brilliance */
3735 case SV_AMULET_BRILLIANCE:
3737 o_ptr->pval = 1 + m_bonus(3, level);
3738 if (one_in_(4)) o_ptr->pval++;
3744 o_ptr->ident |= (IDENT_BROKEN);
3747 o_ptr->curse_flags |= (TRC_CURSED);
3749 /* Reverse bonuses */
3750 o_ptr->pval = 0 - o_ptr->pval;
3756 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3760 o_ptr->curse_flags |= (TRC_CURSED);
3765 case SV_AMULET_RESISTANCE:
3767 if (one_in_(5)) one_high_resistance(o_ptr);
3768 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3772 /* Amulet of searching */
3773 case SV_AMULET_SEARCHING:
3775 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
3781 o_ptr->ident |= (IDENT_BROKEN);
3784 o_ptr->curse_flags |= (TRC_CURSED);
3786 /* Reverse bonuses */
3787 o_ptr->pval = 0 - (o_ptr->pval);
3793 /* Amulet of the Magi -- never cursed */
3794 case SV_AMULET_THE_MAGI:
3796 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3797 o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
3799 /* gain one low ESP */
3800 add_esp_weak(o_ptr, FALSE);
3805 /* Amulet of Doom -- always cursed */
3806 case SV_AMULET_DOOM:
3809 o_ptr->ident |= (IDENT_BROKEN);
3812 o_ptr->curse_flags |= (TRC_CURSED);
3815 o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
3816 o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
3817 if (power > 0) power = 0 - power;
3822 case SV_AMULET_MAGIC_MASTERY:
3824 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
3830 o_ptr->ident |= (IDENT_BROKEN);
3833 o_ptr->curse_flags |= (TRC_CURSED);
3835 /* Reverse bonuses */
3836 o_ptr->pval = 0 - o_ptr->pval;
3842 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3843 || (power > 2)) /* power > 2 is debug only */
3845 o_ptr->pval = MIN(o_ptr->pval, 4);
3846 /* Randart amulet */
3847 create_artifact(o_ptr, FALSE);
3849 else if ((power == 2) && one_in_(2))
3851 while(!o_ptr->name2)
3853 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3854 switch(randint1(21))
3857 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3858 o_ptr->name2 = EGO_AMU_SLOW_D;
3861 if (o_ptr->pval) break;
3862 o_ptr->name2 = EGO_AMU_INFRA;
3865 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3866 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3869 if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
3870 o_ptr->name2 = EGO_AMU_HOLD_EXP;
3873 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3874 o_ptr->name2 = EGO_AMU_LEVITATION;
3876 case 10: case 11: case 21:
3877 o_ptr->name2 = EGO_AMU_AC;
3880 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3881 if (m_bonus(10, level) > 8)
3882 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3884 o_ptr->name2 = EGO_AMU_RES_FIRE;
3887 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3888 if (m_bonus(10, level) > 8)
3889 o_ptr->name2 = EGO_AMU_RES_COLD_;
3891 o_ptr->name2 = EGO_AMU_RES_COLD;
3894 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3895 if (m_bonus(10, level) > 8)
3896 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3898 o_ptr->name2 = EGO_AMU_RES_ELEC;
3901 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3902 if (m_bonus(10, level) > 8)
3903 o_ptr->name2 = EGO_AMU_RES_ACID_;
3905 o_ptr->name2 = EGO_AMU_RES_ACID;
3907 case 16: case 17: case 18: case 19: case 20:
3908 switch (o_ptr->sval)
3910 case SV_AMULET_TELEPORT:
3911 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3912 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3913 else o_ptr->name2 = EGO_AMU_TELEPORT;
3915 case SV_AMULET_RESIST_ACID:
3916 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3918 case SV_AMULET_SEARCHING:
3919 o_ptr->name2 = EGO_AMU_STEALTH;
3921 case SV_AMULET_BRILLIANCE:
3922 if (!one_in_(3)) break;
3923 o_ptr->name2 = EGO_AMU_IDENT;
3925 case SV_AMULET_CHARISMA:
3926 if (!one_in_(3)) break;
3927 o_ptr->name2 = EGO_AMU_CHARM;
3929 case SV_AMULET_THE_MAGI:
3930 if (one_in_(2)) break;
3931 o_ptr->name2 = EGO_AMU_GREAT;
3933 case SV_AMULET_RESISTANCE:
3934 if (!one_in_(5)) break;
3935 o_ptr->name2 = EGO_AMU_DEFENDER;
3937 case SV_AMULET_TELEPATHY:
3938 if (!one_in_(3)) break;
3939 o_ptr->name2 = EGO_AMU_DETECTION;
3945 o_ptr->curse_flags = 0L;
3947 else if ((power == -2) && one_in_(2))
3949 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3950 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3951 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3952 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3953 o_ptr->art_flags[0] = 0;
3954 o_ptr->art_flags[1] = 0;
3955 while(!o_ptr->name2)
3957 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3961 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3962 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3965 o_ptr->name2 = EGO_AMU_FOOL;
3968 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3969 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3972 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3973 o_ptr->name2 = EGO_AMU_TY_CURSE;
3976 o_ptr->name2 = EGO_AMU_NAIVETY;
3981 o_ptr->ident |= (IDENT_BROKEN);
3984 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3992 * @brief モンスターが人形のベースにできるかを返す
3993 * @param r_idx チェックしたいモンスター種族のID
3994 * @return 人形にできるならTRUEを返す
3996 static bool item_monster_okay(MONRACE_IDX r_idx)
3998 monster_race *r_ptr = &r_info[r_idx];
4001 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
4002 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
4003 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
4004 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
4005 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
4006 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
4013 * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
4014 * Apply magic to an item known to be "boring"
4015 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4016 * @param level 生成基準階
4017 * @param power 生成ランク
4020 * Hack -- note the special code for various items
4022 static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
4024 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4029 /* Apply magic (good or bad) according to type */
4030 switch (o_ptr->tval)
4039 o_ptr->ident |= (IDENT_BROKEN);
4042 o_ptr->curse_flags |= (TRC_CURSED);
4049 o_ptr->xtra4 = o_ptr->pval;
4055 /* Hack -- Torches -- random fuel */
4056 if (o_ptr->sval == SV_LITE_TORCH)
4058 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4062 /* Hack -- Lanterns -- random fuel */
4063 if (o_ptr->sval == SV_LITE_LANTERN)
4065 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4069 if (power > 2) /* power > 2 is debug only */
4071 create_artifact(o_ptr, FALSE);
4073 else if ((power == 2) || ((power == 1) && one_in_(3)))
4075 while (!o_ptr->name2)
4079 bool okay_flag = TRUE;
4081 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
4083 switch (o_ptr->name2)
4086 if (o_ptr->sval == SV_LITE_FEANOR)
4094 else if (power == -2)
4096 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
4098 switch (o_ptr->name2)
4100 case EGO_LITE_DARKNESS:
4103 if (o_ptr->sval == SV_LITE_TORCH)
4105 add_flag(o_ptr->art_flags, TR_LITE_M1);
4107 else if (o_ptr->sval == SV_LITE_LANTERN)
4109 add_flag(o_ptr->art_flags, TR_LITE_M2);
4111 else if (o_ptr->sval == SV_LITE_FEANOR)
4113 add_flag(o_ptr->art_flags, TR_LITE_M3);
4125 /* The wand or staff gets a number of initial charges equal
4126 * to between 1/2 (+1) and the full object kind's pval. -LM-
4128 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
4134 /* Transfer the pval. -LM- */
4135 o_ptr->pval = k_ptr->pval;
4142 object_aware(o_ptr);
4143 object_known(o_ptr);
4149 PARAMETER_VALUE i = 1;
4152 monster_race *r_ptr;
4154 /* Pick a random non-unique monster race */
4157 i = randint1(max_r_idx - 1);
4159 if (!item_monster_okay(i)) continue;
4160 if (i == MON_TSUCHINOKO) continue;
4164 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4166 /* Ignore dead monsters */
4167 if (!r_ptr->rarity) continue;
4169 /* Ignore uncommon monsters */
4170 if (r_ptr->rarity > 100) continue;
4172 /* Prefer less out-of-depth monsters */
4173 if (randint0(check)) continue;
4180 /* Some figurines are cursed */
4181 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
4188 PARAMETER_VALUE i = 1;
4193 monster_race *r_ptr;
4195 if (o_ptr->sval == SV_SKELETON)
4197 match = RF9_DROP_SKELETON;
4199 else if (o_ptr->sval == SV_CORPSE)
4201 match = RF9_DROP_CORPSE;
4204 /* Hack -- Remove the monster restriction */
4205 get_mon_num_prep(item_monster_okay, NULL);
4207 /* Pick a random non-unique monster race */
4210 i = get_mon_num(dun_level);
4214 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4216 /* Ignore dead monsters */
4217 if (!r_ptr->rarity) continue;
4219 /* Ignore corpseless monsters */
4220 if (!(r_ptr->flags9 & match)) continue;
4222 /* Prefer less out-of-depth monsters */
4223 if (randint0(check)) continue;
4231 object_aware(o_ptr);
4232 object_known(o_ptr);
4238 PARAMETER_VALUE i = 1;
4240 monster_race *r_ptr;
4242 /* Pick a random monster race */
4245 i = randint1(max_r_idx - 1);
4249 /* Ignore dead monsters */
4250 if (!r_ptr->rarity) continue;
4259 msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
4261 object_aware(o_ptr);
4262 object_known(o_ptr);
4269 DEPTH obj_level = k_info[o_ptr->k_idx].level;
4271 /* Hack -- skip ruined chests */
4272 if (obj_level <= 0) break;
4274 /* Hack -- pick a "difficulty" */
4275 o_ptr->pval = randint1(obj_level);
4276 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4278 o_ptr->xtra3 = dun_level + 5;
4280 /* Never exceed "difficulty" of 55 to 59 */
4281 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4289 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
4290 * Complete the "creation" of an object by applying "magic" to the item
4291 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4293 * @param mode 生成オプション
4296 * This includes not only rolling for random bonuses, but also putting the\n
4297 * finishing touches on ego-items and artifacts, giving charges to wands and\n
4298 * staffs, giving fuel to lites, and placing traps on chests.\n
4300 * In particular, note that "Instant Artifacts", if "created" by an external\n
4301 * routine, must pass through this function to complete the actual creation.\n
4303 * The base "chance" of the item being "good" increases with the "level"\n
4304 * parameter, which is usually derived from the dungeon level, being equal\n
4305 * to the level plus 10, up to a maximum of 75. If "good" is true, then\n
4306 * the object is guaranteed to be "good". If an object is "good", then\n
4307 * the chance that the object will be "great" (ego-item or artifact), also\n
4308 * increases with the "level", being equal to half the level, plus 5, up to\n
4309 * a maximum of 20. If "great" is true, then the object is guaranteed to be\n
4310 * "great". At dungeon level 65 and below, 15/100 objects are "great".\n
4312 * If the object is not "good", there is a chance it will be "cursed", and\n
4313 * if it is "cursed", there is a chance it will be "broken". These chances\n
4314 * are related to the "good" / "great" chances above.\n
4316 * Otherwise "normal" rings and amulets will be "good" half the time and\n
4317 * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4319 * If "okay" is true, and the object is going to be "great", then there is\n
4320 * a chance that an artifact will be created. This is true even if both the\n
4321 * "good" and "great" arguments are false. As a total hack, if "great" is\n
4322 * true, then the item gets 3 extra "attempts" to become an artifact.\n
4324 void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
4326 int i, rolls, f1, f2, power;
4328 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4330 /* Maximum "level" for various things */
4331 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4333 /* Base chance of being "good" */
4336 /* Maximal chance of being "good" */
4337 if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4339 /* Base chance of being "great" */
4342 /* Maximal chance of being "great" */
4343 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4344 f2 = d_info[dungeon_type].obj_great;
4346 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4351 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4360 /* Roll for "good" */
4361 if ((mode & AM_GOOD) || magik(f1))
4366 /* Roll for "great" */
4367 if ((mode & AM_GREAT) || magik(f2))
4371 /* Roll for "special" */
4372 if (mode & AM_SPECIAL) power = 3;
4376 /* Roll for "cursed" */
4379 /* Assume "cursed" */
4382 /* Roll for "broken" */
4383 if (magik(f2)) power = -2;
4387 if (mode & AM_CURSED)
4389 /* Assume 'cursed' */
4394 /* Everything else gets more badly cursed */
4401 /* Assume no rolls */
4404 /* Get one roll if excellent */
4405 if (power >= 2) rolls = 1;
4407 /* Hack -- Get four rolls if forced great or special */
4408 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4410 /* Hack -- Get no rolls if not allowed */
4411 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4413 /* Roll for artifacts if allowed */
4414 for (i = 0; i < rolls; i++)
4416 /* Roll for an artifact */
4417 if (make_artifact(o_ptr)) break;
4418 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4420 if (make_artifact(o_ptr)) break;
4425 /* Hack -- analyze artifacts */
4426 if (object_is_fixed_artifact(o_ptr))
4428 artifact_type *a_ptr = &a_info[o_ptr->name1];
4430 /* Hack -- Mark the artifact as "created" */
4433 /* Hack -- Memorize location of artifact in saved floors */
4434 if (character_dungeon)
4435 a_ptr->floor_id = p_ptr->floor_id;
4437 /* Extract the other fields */
4438 o_ptr->pval = a_ptr->pval;
4439 o_ptr->ac = a_ptr->ac;
4440 o_ptr->dd = a_ptr->dd;
4441 o_ptr->ds = a_ptr->ds;
4442 o_ptr->to_a = a_ptr->to_a;
4443 o_ptr->to_h = a_ptr->to_h;
4444 o_ptr->to_d = a_ptr->to_d;
4445 o_ptr->weight = a_ptr->weight;
4446 o_ptr->xtra2 = a_ptr->act_idx;
4448 if (o_ptr->name1 == ART_MILIM)
4450 if(p_ptr->pseikaku == SEIKAKU_SEXY)
4456 /* Hack -- extract the "broken" flag */
4457 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4459 /* Hack -- extract the "cursed" flag */
4460 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4461 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4462 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4463 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4464 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4465 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4472 switch (o_ptr->tval)
4481 if (power) a_m_aux_1(o_ptr, lev, power);
4487 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4493 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4507 /* Elven Cloak and Black Clothes ... */
4508 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4509 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4510 o_ptr->pval = randint1(4);
4514 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4515 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4516 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4517 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4518 a_m_aux_2(o_ptr, lev, power);
4520 if (power) a_m_aux_2(o_ptr, lev, power);
4528 if (!power && (randint0(100) < 50)) power = -1;
4529 a_m_aux_3(o_ptr, lev, power);
4535 a_m_aux_4(o_ptr, lev, power);
4540 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4541 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4542 (p_ptr->pseikaku == SEIKAKU_SEXY))
4545 add_flag(o_ptr->art_flags, TR_STR);
4546 add_flag(o_ptr->art_flags, TR_INT);
4547 add_flag(o_ptr->art_flags, TR_WIS);
4548 add_flag(o_ptr->art_flags, TR_DEX);
4549 add_flag(o_ptr->art_flags, TR_CON);
4550 add_flag(o_ptr->art_flags, TR_CHR);
4553 /* Hack -- analyze ego-items */
4554 if (object_is_ego(o_ptr))
4556 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4558 /* Hack -- acquire "broken" flag */
4559 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4561 /* Hack -- acquire "cursed" flag */
4562 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4563 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4564 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4565 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4566 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4567 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4569 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4570 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4571 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4572 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4573 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4574 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4575 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4576 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4582 while (one_in_(o_ptr->dd));
4584 if (o_ptr->dd > 9) o_ptr->dd = 9;
4587 /* Hack -- apply activatin index if needed */
4588 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
4590 /* Hack -- apply extra penalties if needed */
4591 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4593 /* Hack -- obtain bonuses */
4594 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4595 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4596 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4598 /* Hack -- obtain pval */
4599 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4602 /* Hack -- apply extra bonuses if needed */
4605 /* Hack -- obtain bonuses */
4606 if (e_ptr->max_to_h)
4608 if (e_ptr->max_to_h > 127)
4609 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4610 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4612 if (e_ptr->max_to_d)
4614 if (e_ptr->max_to_d > 127)
4615 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4616 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4618 if (e_ptr->max_to_a)
4620 if (e_ptr->max_to_a > 127)
4621 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4622 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4625 /* Accuracy ego must have high to_h */
4626 if(o_ptr->name2 == EGO_ACCURACY)
4628 while(o_ptr->to_h < o_ptr->to_d + 10)
4633 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4636 /* Accuracy ego must have high to_h */
4637 if(o_ptr->name2 == EGO_VELOCITY)
4639 while(o_ptr->to_d < o_ptr->to_h + 10)
4644 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4647 /* Protection ego must have high to_a */
4648 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4650 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4653 /* Hack -- obtain pval */
4654 if (e_ptr->max_pval)
4656 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4659 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4661 else if (o_ptr->name2 == EGO_DEMON)
4663 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4665 o_ptr->pval += randint1(2);
4669 o_ptr->pval += randint1(e_ptr->max_pval);
4672 else if (o_ptr->name2 == EGO_ATTACKS)
4674 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4675 if (o_ptr->pval > 3) o_ptr->pval = 3;
4676 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4677 o_ptr->pval += randint1(2);
4679 else if (o_ptr->name2 == EGO_BAT)
4681 o_ptr->pval = randint1(e_ptr->max_pval);
4682 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4684 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4686 o_ptr->pval = randint1(e_ptr->max_pval);
4690 o_ptr->pval += randint1(e_ptr->max_pval);
4695 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4697 o_ptr->pval = randint1(o_ptr->pval);
4699 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4706 /* Examine real objects */
4709 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4711 /* Hack -- acquire "broken" flag */
4712 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4714 /* Hack -- acquire "cursed" flag */
4715 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4716 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4717 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4718 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4719 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4720 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4728 * @brief ベースアイテムが上質として扱われるかどうかを返す。
4729 * Hack -- determine if a template is "good"
4730 * @param k_idx 判定したいベースアイテムのID
4731 * @return ベースアイテムが上質ならばTRUEを返す。
4733 static bool kind_is_good(KIND_OBJECT_IDX k_idx)
4735 object_kind *k_ptr = &k_info[k_idx];
4737 /* Analyze the item type */
4738 switch (k_ptr->tval)
4740 /* Armor -- Good unless damaged */
4751 if (k_ptr->to_a < 0) return (FALSE);
4755 /* Weapons -- Good unless damaged */
4762 if (k_ptr->to_h < 0) return (FALSE);
4763 if (k_ptr->to_d < 0) return (FALSE);
4767 /* Ammo -- Arrows/Bolts are good */
4774 /* Books -- High level books are good (except Arcane books) */
4776 case TV_SORCERY_BOOK:
4777 case TV_NATURE_BOOK:
4782 case TV_DAEMON_BOOK:
4783 case TV_CRUSADE_BOOK:
4785 case TV_HISSATSU_BOOK:
4788 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4792 /* Rings -- Rings of Speed are good */
4795 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4796 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4800 /* Amulets -- Amulets of the Magi and Resistance are good */
4803 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4804 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4809 /* Assume not good */
4814 * @brief 生成階に応じたベースアイテムの生成を行う。
4815 * Attempt to make an object (normal or good/great)
4816 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4817 * @param mode オプションフラグ
4818 * @return 生成に成功したらTRUEを返す。
4820 * This routine plays nasty games to generate the "special artifacts".\n
4821 * This routine uses "object_level" for the "generation level".\n
4822 * We assume that the given object has been "wiped".\n
4824 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
4830 /* Chance of "special object" */
4831 prob = ((mode & AM_GOOD) ? 10 : 1000);
4833 /* Base level for the object */
4834 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4837 /* Generate a special object, or a normal object */
4838 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4840 KIND_OBJECT_IDX k_idx;
4843 if ((mode & AM_GOOD) && !get_obj_num_hook)
4845 /* Activate restriction (if already specified, use that) */
4846 get_obj_num_hook = kind_is_good;
4849 /* Restricted objects - prepare allocation table */
4850 if (get_obj_num_hook) get_obj_num_prep();
4852 /* Pick a random object */
4853 k_idx = get_obj_num(base);
4855 /* Restricted objects */
4856 if (get_obj_num_hook)
4858 /* Clear restriction */
4859 get_obj_num_hook = NULL;
4861 /* Reset allocation table to default */
4865 /* Handle failure */
4866 if (!k_idx) return (FALSE);
4868 /* Prepare the object */
4869 object_prep(j_ptr, k_idx);
4872 /* Apply magic (allow artifacts) */
4873 apply_magic(j_ptr, object_level, mode);
4875 /* Hack -- generate multiple spikes/missiles */
4876 switch (j_ptr->tval)
4884 j_ptr->number = (byte)damroll(6, 7);
4888 if (cheat_peek) object_mention(j_ptr);
4896 * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
4897 * Attempt to place an object (normal or good/great) at the given location.
4898 * @param y 配置したいフロアのY座標
4899 * @param x 配置したいフロアのX座標
4900 * @param mode オプションフラグ
4901 * @return 生成に成功したらTRUEを返す。
4903 * This routine plays nasty games to generate the "special artifacts".\n
4904 * This routine uses "object_level" for the "generation level".\n
4905 * This routine requires a clean floor grid destination.\n
4907 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
4912 cave_type *c_ptr = &cave[y][x];
4918 /* Paranoia -- check bounds */
4919 if (!in_bounds(y, x)) return;
4921 /* Require floor space */
4922 if (!cave_drop_bold(y, x)) return;
4924 /* Avoid stacking on other objects */
4925 if (c_ptr->o_idx) return;
4928 /* Get local object */
4931 /* Wipe the object */
4934 /* Make an object (if possible) */
4935 if (!make_object(q_ptr, mode)) return;
4938 /* Make an object */
4946 /* Acquire object */
4947 o_ptr = &o_list[o_idx];
4949 /* Structure Copy */
4950 object_copy(o_ptr, q_ptr);
4956 o_ptr->next_o_idx = c_ptr->o_idx;
4958 /* Place the object */
4959 c_ptr->o_idx = o_idx;
4969 /* Hack -- Preserve artifacts */
4970 if (object_is_fixed_artifact(q_ptr))
4972 a_info[q_ptr->name1].cur_num = 0;
4979 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
4980 * Make a treasure object
4981 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4982 * @return 生成に成功したらTRUEを返す。
4984 * The location must be a legal, clean, floor grid.
4986 bool make_gold(object_type *j_ptr)
4991 /* Hack -- Pick a Treasure variety */
4992 i = ((randint1(object_level + 2) + 2) / 2) - 1;
4994 /* Apply "extra" magic */
4995 if (one_in_(GREAT_OBJ))
4997 i += randint1(object_level + 1);
5000 /* Hack -- Creeping Coins only generate "themselves" */
5001 if (coin_type) i = coin_type;
5003 /* Do not create "illegal" Treasure Types */
5004 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
5006 /* Prepare a gold object */
5007 object_prep(j_ptr, OBJ_GOLD_LIST + i);
5009 /* Hack -- Base coin cost */
5010 base = k_info[OBJ_GOLD_LIST + i].cost;
5012 /* Determine how much the treasure is "worth" */
5013 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
5021 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
5022 * Places a treasure (Gold or Gems) at given location
5023 * @param y 配置したいフロアのY座標
5024 * @param x 配置したいフロアのX座標
5025 * @return 生成に成功したらTRUEを返す。
5027 * The location must be a legal, clean, floor grid.
5029 void place_gold(POSITION y, POSITION x)
5034 cave_type *c_ptr = &cave[y][x];
5040 /* Paranoia -- check bounds */
5041 if (!in_bounds(y, x)) return;
5043 /* Require floor space */
5044 if (!cave_drop_bold(y, x)) return;
5046 /* Avoid stacking on other objects */
5047 if (c_ptr->o_idx) return;
5050 /* Get local object */
5053 /* Wipe the object */
5056 /* Make some gold */
5057 if (!make_gold(q_ptr)) return;
5059 /* Make an object */
5067 /* Acquire object */
5068 o_ptr = &o_list[o_idx];
5070 /* Copy the object */
5071 object_copy(o_ptr, q_ptr);
5078 o_ptr->next_o_idx = c_ptr->o_idx;
5080 /* Place the object */
5081 c_ptr->o_idx = o_idx;
5093 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
5094 * Let an object fall to the ground at or near a location.
5095 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
5096 * @param chance ドロップの成功率(%)
5097 * @param y 配置したいフロアのY座標
5098 * @param x 配置したいフロアのX座標
5099 * @return 生成に成功したらオブジェクトのIDを返す。
5101 * The initial location is assumed to be "in_bounds()".\n
5103 * This function takes a parameter "chance". This is the percentage\n
5104 * chance that the item will "disappear" instead of drop. If the object\n
5105 * has been thrown, then this is the chance of disappearance on contact.\n
5107 * Hack -- this function uses "chance" to determine if it should produce\n
5108 * some form of "description" of the drop event (under the player).\n
5110 * We check several locations to see if we can find a location at which\n
5111 * the object can combine, stack, or be placed. Artifacts will try very\n
5112 * hard to be placed, including "teleporting" to a useful grid if needed.\n
5114 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
5121 POSITION ty, tx = 0;
5123 OBJECT_IDX o_idx = 0;
5124 OBJECT_IDX this_o_idx, next_o_idx = 0;
5128 char o_name[MAX_NLEN];
5134 /* Extract plural */
5135 bool plural = (j_ptr->number != 1);
5138 /* Describe object */
5139 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5142 /* Handle normal "breakage" */
5143 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
5146 msg_format("%sは消えた。", o_name);
5148 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5151 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
5168 /* Scan local grids */
5169 for (dy = -3; dy <= 3; dy++)
5171 /* Scan local grids */
5172 for (dx = -3; dx <= 3; dx++)
5176 /* Calculate actual distance */
5177 d = (dy * dy) + (dx * dx);
5179 /* Ignore distant grids */
5180 if (d > 10) continue;
5185 /* Skip illegal grids */
5186 if (!in_bounds(ty, tx)) continue;
5188 /* Require line of projection */
5189 if (!projectable(y, x, ty, tx)) continue;
5192 c_ptr = &cave[ty][tx];
5194 /* Require floor space */
5195 if (!cave_drop_bold(ty, tx)) continue;
5200 /* Scan objects in that grid */
5201 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5205 /* Acquire object */
5206 o_ptr = &o_list[this_o_idx];
5208 /* Acquire next object */
5209 next_o_idx = o_ptr->next_o_idx;
5211 /* Check for possible combination */
5212 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5218 /* Add new object */
5222 if (k > 99) continue;
5224 /* Calculate score */
5225 s = 1000 - (d + k * 5);
5227 /* Skip bad values */
5228 if (s < bs) continue;
5230 /* New best value */
5233 /* Apply the randomizer to equivalent values */
5234 if ((++bn >= 2) && !one_in_(bn)) continue;
5248 /* Handle lack of space */
5249 if (!flag && !object_is_artifact(j_ptr))
5252 msg_format("%sは消えた。", o_name);
5254 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5259 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5267 for (i = 0; !flag && (i < 1000); i++)
5270 ty = rand_spread(by, 1);
5271 tx = rand_spread(bx, 1);
5273 /* Verify location */
5274 if (!in_bounds(ty, tx)) continue;
5276 /* Bounce to that location */
5280 /* Require floor space */
5281 if (!cave_drop_bold(by, bx)) continue;
5289 int candidates = 0, pick;
5291 for (ty = 1; ty < cur_hgt - 1; ty++)
5293 for (tx = 1; tx < cur_wid - 1; tx++)
5295 /* A valid space found */
5296 if (cave_drop_bold(ty, tx)) candidates++;
5300 /* No valid place! */
5304 msg_format("%sは消えた。", o_name);
5306 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5310 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5312 /* Mega-Hack -- preserve artifacts */
5315 /* Hack -- Preserve unknown artifacts */
5316 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5318 /* Mega-Hack -- Preserve the artifact */
5319 a_info[j_ptr->name1].cur_num = 0;
5327 /* Choose a random one */
5328 pick = randint1(candidates);
5330 for (ty = 1; ty < cur_hgt - 1; ty++)
5332 for (tx = 1; tx < cur_wid - 1; tx++)
5334 if (cave_drop_bold(ty, tx))
5338 /* Is this a picked one? */
5352 c_ptr = &cave[by][bx];
5354 /* Scan objects in that grid for combination */
5355 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5359 /* Acquire object */
5360 o_ptr = &o_list[this_o_idx];
5362 /* Acquire next object */
5363 next_o_idx = o_ptr->next_o_idx;
5365 /* Check for combination */
5366 if (object_similar(o_ptr, j_ptr))
5368 /* Combine the items */
5369 object_absorb(o_ptr, j_ptr);
5378 /* Get new object */
5379 if (!done) o_idx = o_pop();
5382 if (!done && !o_idx)
5385 msg_format("%sは消えた。", o_name);
5387 msg_format("The %s disappear%s.",
5388 o_name, (plural ? "" : "s"));
5393 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5395 /* Hack -- Preserve artifacts */
5396 if (object_is_fixed_artifact(j_ptr))
5398 a_info[j_ptr->name1].cur_num = 0;
5408 /* Structure copy */
5409 object_copy(&o_list[o_idx], j_ptr);
5411 /* Access new object */
5412 j_ptr = &o_list[o_idx];
5419 j_ptr->held_m_idx = 0;
5422 j_ptr->next_o_idx = c_ptr->o_idx;
5424 /* Place the object */
5425 c_ptr->o_idx = o_idx;
5439 /* Mega-Hack -- no message if "dropped" by player */
5440 /* Message when an object falls under the player */
5441 if (chance && player_bold(by, bx))
5443 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5454 * Scatter some "great" objects near the player
5455 * @param y1 配置したいフロアのY座標
5456 * @param x1 配置したいフロアのX座標
5457 * @param num 獲得の処理回数
5458 * @param great TRUEならば必ず高級品以上を落とす
5459 * @param special TRUEならば必ず特別品を落とす
5460 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5463 void acquirement(POSITION y1, POSITION x1, int num, bool great, bool special, bool known)
5466 object_type object_type_body;
5467 BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ;
5472 /* Get local object */
5473 i_ptr = &object_type_body;
5475 /* Wipe the object */
5478 /* Make a good (or great) object (if possible) */
5479 if (!make_object(i_ptr, mode)) continue;
5483 object_aware(i_ptr);
5484 object_known(i_ptr);
5487 /* Drop the object */
5488 (void)drop_near(i_ptr, -1, y1, x1);
5493 * Scatter some "amusing" objects near the player
5496 #define AMS_NOTHING 0x00 /* No restriction */
5497 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
5498 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
5499 #define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */
5500 #define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */
5504 OBJECT_TYPE_VALUE tval;
5505 OBJECT_SUBTYPE_VALUE sval;
5510 amuse_type amuse_info[] =
5512 { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
5513 { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
5514 { TV_SPIKE, SV_ANY, 10, AMS_PILE },
5515 { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
5516 { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
5517 { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
5518 { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
5519 { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
5520 { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
5521 { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
5522 { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
5523 { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
5524 { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
5531 * @param y1 配置したいフロアのY座標
5532 * @param x1 配置したいフロアのX座標
5533 * @param num 誰得の処理回数
5534 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5537 void amusement(POSITION y1, POSITION x1, int num, bool known)
5540 object_type object_type_body;
5543 for (n = 0; amuse_info[n].tval != 0; n++)
5545 t += amuse_info[n].prob;
5552 KIND_OBJECT_IDX k_idx;
5553 ARTIFACT_IDX a_idx = 0;
5554 int r = randint0(t);
5555 bool insta_art, fixed_art;
5559 r -= amuse_info[i].prob;
5563 /* Get local object */
5564 i_ptr = &object_type_body;
5566 /* Wipe the object */
5569 /* Wipe the object */
5570 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
5572 /* Paranoia - reroll if nothing */
5573 if (!k_idx) continue;
5575 /* Search an artifact index if need */
5576 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
5577 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
5579 if (insta_art || fixed_art)
5581 for (a_idx = 1; a_idx < max_a_idx; a_idx++)
5583 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
5584 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
5585 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
5586 if (a_info[a_idx].cur_num > 0) continue;
5590 if (a_idx >= max_a_idx) continue;
5593 /* Make an object (if possible) */
5594 object_prep(i_ptr, k_idx);
5595 if (a_idx) i_ptr->name1 = a_idx;
5596 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
5598 if (amuse_info[i].flag & AMS_NO_UNIQUE)
5600 if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
5603 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
5604 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
5608 object_aware(i_ptr);
5609 object_known(i_ptr);
5612 /* Paranoia - reroll if nothing */
5613 if (!(i_ptr->k_idx)) continue;
5615 /* Drop the object */
5616 (void)drop_near(i_ptr, -1, y1, x1);
5624 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5625 * Describe the charges on an item in the inventory.
5626 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5629 void inven_item_charges(INVENTORY_IDX item)
5631 object_type *o_ptr = &inventory[item];
5633 /* Require staff/wand */
5634 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5636 /* Require known item */
5637 if (!object_is_known(o_ptr)) return;
5640 if (o_ptr->pval <= 0)
5642 msg_print("もう魔力が残っていない。");
5646 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5649 /* Multiple charges */
5650 if (o_ptr->pval != 1)
5652 /* Print a message */
5653 msg_format("You have %d charges remaining.", o_ptr->pval);
5659 /* Print a message */
5660 msg_format("You have %d charge remaining.", o_ptr->pval);
5667 * @brief アイテムの残り所持数メッセージを表示する /
5668 * Describe an item in the inventory.
5669 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5672 void inven_item_describe(INVENTORY_IDX item)
5674 object_type *o_ptr = &inventory[item];
5675 char o_name[MAX_NLEN];
5677 /* Get a description */
5678 object_desc(o_name, o_ptr, 0);
5680 /* Print a message */
5682 /* "no more" の場合はこちらで表示する */
5683 if (o_ptr->number <= 0)
5685 /*FIRST*//*ここはもう通らないかも */
5686 msg_format("もう%sを持っていない。", o_name);
5690 /* アイテム名を英日切り替え機能対応 */
5691 msg_format("まだ %sを持っている。", o_name);
5694 msg_format("You have %s.", o_name);
5700 * @brief アイテムの残り所持数メッセージを表示する /
5701 * Increase the "number" of an item in the inventory
5702 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5706 void inven_item_increase(INVENTORY_IDX item, int num)
5708 object_type *o_ptr = &inventory[item];
5711 num += o_ptr->number;
5714 if (num > 255) num = 255;
5715 else if (num < 0) num = 0;
5718 num -= (ITEM_NUMBER)o_ptr->number;
5720 /* Change the number and weight */
5723 /* Add the number */
5724 o_ptr->number += num;
5726 /* Add the weight */
5727 p_ptr->total_weight += (num * o_ptr->weight);
5729 /* Recalculate bonuses */
5730 p_ptr->update |= (PU_BONUS);
5732 /* Recalculate mana XXX */
5733 p_ptr->update |= (PU_MANA);
5735 /* Combine the pack */
5736 p_ptr->notice |= (PN_COMBINE);
5738 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5740 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5741 if (!o_ptr->number && p_ptr->ele_attack)
5743 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5745 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5747 /* Clear all temporary elemental brands */
5748 set_ele_attack(0, 0);
5756 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5757 * Erase an inventory slot if it has no more items
5758 * @param item 消去したいプレイヤーのアイテム所持スロット
5761 void inven_item_optimize(INVENTORY_IDX item)
5763 object_type *o_ptr = &inventory[item];
5765 /* Only optimize real items */
5766 if (!o_ptr->k_idx) return;
5768 /* Only optimize empty items */
5769 if (o_ptr->number) return;
5771 /* The item is in the pack */
5772 if (item < INVEN_RARM)
5779 /* Slide everything down */
5780 for (i = item; i < INVEN_PACK; i++)
5782 /* Structure copy */
5783 inventory[i] = inventory[i+1];
5786 /* Erase the "final" slot */
5787 object_wipe(&inventory[i]);
5789 p_ptr->window |= (PW_INVEN);
5792 /* The item is being wielded */
5798 /* Erase the empty slot */
5799 object_wipe(&inventory[item]);
5801 /* Recalculate bonuses */
5802 p_ptr->update |= (PU_BONUS);
5804 /* Recalculate torch */
5805 p_ptr->update |= (PU_TORCH);
5807 /* Recalculate mana XXX */
5808 p_ptr->update |= (PU_MANA);
5810 p_ptr->window |= (PW_EQUIP);
5813 p_ptr->window |= (PW_SPELL);
5817 * @brief 床上の魔道具の残り残量メッセージを表示する /
5818 * Describe the charges on an item on the floor.
5819 * @param item メッセージの対象にしたいアイテム所持スロット
5822 void floor_item_charges(INVENTORY_IDX item)
5824 object_type *o_ptr = &o_list[item];
5826 /* Require staff/wand */
5827 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5829 /* Require known item */
5830 if (!object_is_known(o_ptr)) return;
5833 if (o_ptr->pval <= 0)
5835 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5839 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5842 /* Multiple charges */
5843 if (o_ptr->pval != 1)
5845 /* Print a message */
5846 msg_format("There are %d charges remaining.", o_ptr->pval);
5852 /* Print a message */
5853 msg_format("There is %d charge remaining.", o_ptr->pval);
5860 * @brief 床上のアイテムの残り数メッセージを表示する /
5861 * Describe the charges on an item on the floor.
5862 * @param item メッセージの対象にしたいアイテム所持スロット
5865 void floor_item_describe(INVENTORY_IDX item)
5867 object_type *o_ptr = &o_list[item];
5868 char o_name[MAX_NLEN];
5870 /* Get a description */
5871 object_desc(o_name, o_ptr, 0);
5873 /* Print a message */
5875 /* "no more" の場合はこちらで表示を分ける */
5876 if (o_ptr->number <= 0)
5878 msg_format("床上には、もう%sはない。", o_name);
5882 msg_format("床上には、まだ %sがある。", o_name);
5885 msg_format("You see %s.", o_name);
5892 * @brief 床上のアイテムの数を増やす /
5893 * Increase the "number" of an item on the floor
5894 * @param item 増やしたいアイテムの所持スロット
5895 * @param num 増やしたいアイテムの数
5898 void floor_item_increase(INVENTORY_IDX item, int num)
5900 object_type *o_ptr = &o_list[item];
5903 num += o_ptr->number;
5906 if (num > 255) num = 255;
5907 else if (num < 0) num = 0;
5910 num -= (int)o_ptr->number;
5912 /* Change the number */
5913 o_ptr->number += (ITEM_NUMBER)num;
5918 * @brief 床上の数の無くなったアイテムスロットを消去する /
5919 * Optimize an item on the floor (destroy "empty" items)
5920 * @param item 消去したいアイテムの所持スロット
5923 void floor_item_optimize(INVENTORY_IDX item)
5925 object_type *o_ptr = &o_list[item];
5927 /* Paranoia -- be sure it exists */
5928 if (!o_ptr->k_idx) return;
5930 /* Only optimize empty items */
5931 if (o_ptr->number) return;
5933 /* Delete the object */
5934 delete_object_idx(item);
5939 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5940 * Check if we have space for an item in the pack without overflow
5941 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5942 * @return 溢れずに済むならTRUEを返す
5944 bool inven_carry_okay(object_type *o_ptr)
5949 if (inven_cnt < INVEN_PACK) return (TRUE);
5952 for (j = 0; j < INVEN_PACK; j++)
5954 object_type *j_ptr = &inventory[j];
5956 /* Skip non-objects */
5957 if (!j_ptr->k_idx) continue;
5959 /* Check if the two items can be combined */
5960 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5967 * @brief オブジェクトを定義された基準に従いソートするための関数 /
5968 * Check if we have space for an item in the pack without overflow
5969 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
5970 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
5971 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
5972 * @return o_ptrの方が上位ならばTRUEを返す。
5974 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5978 /* Use empty slots */
5979 if (!j_ptr->k_idx) return TRUE;
5981 /* Hack -- readable books always come first */
5982 if ((o_ptr->tval == REALM1_BOOK) &&
5983 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5984 if ((j_ptr->tval == REALM1_BOOK) &&
5985 (o_ptr->tval != REALM1_BOOK)) return FALSE;
5987 if ((o_ptr->tval == REALM2_BOOK) &&
5988 (j_ptr->tval != REALM2_BOOK)) return TRUE;
5989 if ((j_ptr->tval == REALM2_BOOK) &&
5990 (o_ptr->tval != REALM2_BOOK)) return FALSE;
5992 /* Objects sort by decreasing type */
5993 if (o_ptr->tval > j_ptr->tval) return TRUE;
5994 if (o_ptr->tval < j_ptr->tval) return FALSE;
5996 /* Non-aware (flavored) items always come last */
5997 /* Can happen in the home */
5998 if (!object_is_aware(o_ptr)) return FALSE;
5999 if (!object_is_aware(j_ptr)) return TRUE;
6001 /* Objects sort by increasing sval */
6002 if (o_ptr->sval < j_ptr->sval) return TRUE;
6003 if (o_ptr->sval > j_ptr->sval) return FALSE;
6005 /* Unidentified objects always come last */
6006 /* Objects in the home can be unknown */
6007 if (!object_is_known(o_ptr)) return FALSE;
6008 if (!object_is_known(j_ptr)) return TRUE;
6010 /* Fixed artifacts, random artifacts and ego items */
6011 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
6012 else if (o_ptr->art_name) o_type = 2;
6013 else if (object_is_ego(o_ptr)) o_type = 1;
6016 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
6017 else if (j_ptr->art_name) j_type = 2;
6018 else if (object_is_ego(j_ptr)) j_type = 1;
6021 if (o_type < j_type) return TRUE;
6022 if (o_type > j_type) return FALSE;
6024 switch (o_ptr->tval)
6030 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
6031 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
6037 /* Objects sort by increasing hit/damage bonuses */
6038 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
6039 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
6042 /* Hack: otherwise identical rods sort by
6043 increasing recharge time --dsb */
6045 if (o_ptr->pval < j_ptr->pval) return TRUE;
6046 if (o_ptr->pval > j_ptr->pval) return FALSE;
6050 /* Objects sort by decreasing value */
6051 return o_value > object_value(j_ptr);
6056 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
6057 * Add an item to the players inventory, and return the slot used.
6058 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
6059 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6061 * If the new item can combine with an existing item in the inventory,\n
6062 * it will do so, using "object_similar()" and "object_absorb()", else,\n
6063 * the item will be placed into the "proper" location in the inventory.\n
6065 * This function can be used to "over-fill" the player's pack, but only\n
6066 * once, and such an action must trigger the "overflow" code immediately.\n
6067 * Note that when the pack is being "over-filled", the new item must be\n
6068 * placed into the "overflow" slot, and the "overflow" must take place\n
6069 * before the pack is reordered, but (optionally) after the pack is\n
6070 * combined. This may be tricky. See "dungeon.c" for info.\n
6072 * Note that this code must remove any location/stack information\n
6073 * from the object once it is placed into the inventory.\n
6075 s16b inven_carry(object_type *o_ptr)
6077 INVENTORY_IDX i, j, k;
6078 INVENTORY_IDX n = -1;
6083 /* Check for combining */
6084 for (j = 0; j < INVEN_PACK; j++)
6086 j_ptr = &inventory[j];
6088 /* Skip non-objects */
6089 if (!j_ptr->k_idx) continue;
6091 /* Hack -- track last item */
6094 /* Check if the two items can be combined */
6095 if (object_similar(j_ptr, o_ptr))
6097 /* Combine the items */
6098 object_absorb(j_ptr, o_ptr);
6100 /* Increase the weight */
6101 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6103 /* Recalculate bonuses */
6104 p_ptr->update |= (PU_BONUS);
6106 p_ptr->window |= (PW_INVEN);
6115 if (inven_cnt > INVEN_PACK) return (-1);
6117 /* Find an empty slot */
6118 for (j = 0; j <= INVEN_PACK; j++)
6120 j_ptr = &inventory[j];
6122 /* Use it if found */
6123 if (!j_ptr->k_idx) break;
6130 /* Reorder the pack */
6133 /* Get the "value" of the item */
6134 s32b o_value = object_value(o_ptr);
6136 /* Scan every occupied slot */
6137 for (j = 0; j < INVEN_PACK; j++)
6139 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6146 for (k = n; k >= i; k--)
6148 /* Hack -- Slide the item */
6149 object_copy(&inventory[k+1], &inventory[k]);
6152 /* Wipe the empty slot */
6153 object_wipe(&inventory[i]);
6158 object_copy(&inventory[i], o_ptr);
6160 /* Access new object */
6161 j_ptr = &inventory[i];
6164 j_ptr->next_o_idx = 0;
6166 /* Forget monster */
6167 j_ptr->held_m_idx = 0;
6169 /* Forget location */
6170 j_ptr->iy = j_ptr->ix = 0;
6172 /* Player touches it, and no longer marked */
6173 j_ptr->marked = OM_TOUCHED;
6175 /* Increase the weight */
6176 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6178 /* Count the items */
6181 /* Recalculate bonuses */
6182 p_ptr->update |= (PU_BONUS);
6184 /* Combine and Reorder pack */
6185 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
6187 p_ptr->window |= (PW_INVEN);
6189 /* Return the slot */
6195 * @brief 装備スロットからオブジェクトを外すメインルーチン /
6196 * Take off (some of) a non-cursed equipment item
6197 * @param item オブジェクトを外したい所持テーブルのID
6199 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6201 * Note that only one item at a time can be wielded per slot.\n
6202 * Note that taking off an item when "full" may cause that item\n
6203 * to fall to the ground.\n
6204 * Return the inventory slot into which the item is placed.\n
6206 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
6217 char o_name[MAX_NLEN];
6220 /* Get the item to take off */
6221 o_ptr = &inventory[item];
6224 if (amt <= 0) return (-1);
6227 if (amt > o_ptr->number) amt = o_ptr->number;
6229 /* Get local object */
6232 /* Obtain a local object */
6233 object_copy(q_ptr, o_ptr);
6235 /* Modify quantity */
6236 q_ptr->number = amt;
6238 /* Describe the object */
6239 object_desc(o_name, q_ptr, 0);
6241 /* Took off weapon */
6242 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
6243 object_is_melee_weapon(o_ptr))
6245 act = _("を装備からはずした", "You were wielding");
6249 else if (item == INVEN_BOW)
6251 act = _("を装備からはずした", "You were holding");
6254 /* Took off light */
6255 else if (item == INVEN_LITE)
6257 act = _("を光源からはずした", "You were holding");
6260 /* Took off something */
6263 act = _("を装備からはずした", "You were wearing");
6266 /* Modify, Optimize */
6267 inven_item_increase(item, -amt);
6268 inven_item_optimize(item);
6270 /* Carry the object */
6271 slot = inven_carry(q_ptr);
6274 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
6276 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6286 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
6287 * Drop (some of) a non-cursed inventory/equipment item
6288 * @param item 所持テーブルのID
6289 * @param amt 落としたい個数
6292 * The object will be dropped "near" the current location
6294 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
6300 char o_name[MAX_NLEN];
6303 /* Access original object */
6304 o_ptr = &inventory[item];
6307 if (amt <= 0) return;
6310 if (amt > o_ptr->number) amt = o_ptr->number;
6313 /* Take off equipment */
6314 if (item >= INVEN_RARM)
6316 /* Take off first */
6317 item = inven_takeoff(item, amt);
6319 /* Access original object */
6320 o_ptr = &inventory[item];
6324 /* Get local object */
6327 /* Obtain local object */
6328 object_copy(q_ptr, o_ptr);
6330 /* Distribute charges of wands or rods */
6331 distribute_charges(o_ptr, q_ptr, amt);
6333 /* Modify quantity */
6334 q_ptr->number = amt;
6336 /* Describe local object */
6337 object_desc(o_name, q_ptr, 0);
6339 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
6341 /* Drop it near the player */
6342 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
6344 /* Modify, Describe, Optimize */
6345 inven_item_increase(item, -amt);
6346 inven_item_describe(item);
6347 inven_item_optimize(item);
6352 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
6353 * Combine items in the pack
6356 * Note special handling of the "overflow" slot
6358 void combine_pack(void)
6363 bool flag = FALSE, combined;
6369 /* Combine the pack (backwards) */
6370 for (i = INVEN_PACK; i > 0; i--)
6373 o_ptr = &inventory[i];
6375 /* Skip empty items */
6376 if (!o_ptr->k_idx) continue;
6378 /* Scan the items above that item */
6379 for (j = 0; j < i; j++)
6384 j_ptr = &inventory[j];
6386 /* Skip empty items */
6387 if (!j_ptr->k_idx) continue;
6390 * Get maximum number of the stack if these
6391 * are similar, get zero otherwise.
6393 max_num = object_similar_part(j_ptr, o_ptr);
6395 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6396 if (max_num && j_ptr->number < max_num)
6398 if (o_ptr->number + j_ptr->number <= max_num)
6403 /* Add together the item counts */
6404 object_absorb(j_ptr, o_ptr);
6406 /* One object is gone */
6409 /* Slide everything down */
6410 for (k = i; k < INVEN_PACK; k++)
6412 /* Structure copy */
6413 inventory[k] = inventory[k+1];
6416 /* Erase the "final" slot */
6417 object_wipe(&inventory[k]);
6421 int old_num = o_ptr->number;
6422 int remain = j_ptr->number + o_ptr->number - max_num;
6424 o_ptr->number -= remain;
6426 /* Add together the item counts */
6427 object_absorb(j_ptr, o_ptr);
6429 o_ptr->number = remain;
6431 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6432 if (o_ptr->tval == TV_ROD)
6434 o_ptr->pval = o_ptr->pval * remain / old_num;
6435 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6438 /* Hack -- if wands are stacking, combine the charges. -LM- */
6439 if (o_ptr->tval == TV_WAND)
6441 o_ptr->pval = o_ptr->pval * remain / old_num;
6445 p_ptr->window |= (PW_INVEN);
6457 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6461 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6462 * Reorder items in the pack
6465 * Note special handling of the "overflow" slot
6467 void reorder_pack(void)
6477 /* Re-order the pack (forwards) */
6478 for (i = 0; i < INVEN_PACK; i++)
6480 /* Mega-Hack -- allow "proper" over-flow */
6481 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6484 o_ptr = &inventory[i];
6486 /* Skip empty slots */
6487 if (!o_ptr->k_idx) continue;
6489 /* Get the "value" of the item */
6490 o_value = object_value(o_ptr);
6492 /* Scan every occupied slot */
6493 for (j = 0; j < INVEN_PACK; j++)
6495 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6498 /* Never move down */
6499 if (j >= i) continue;
6504 /* Get local object */
6507 /* Save a copy of the moving item */
6508 object_copy(q_ptr, &inventory[i]);
6510 /* Slide the objects */
6511 for (k = i; k > j; k--)
6513 /* Slide the item */
6514 object_copy(&inventory[k], &inventory[k-1]);
6517 /* Insert the moving item */
6518 object_copy(&inventory[j], q_ptr);
6520 p_ptr->window |= (PW_INVEN);
6523 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6527 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6528 * Hack -- display an object kind in the current window
6529 * @param k_idx ベースアイテムの参照ID
6532 * Include list of usable spells for readible books
6534 void display_koff(KIND_OBJECT_IDX k_idx)
6541 REALM_IDX use_realm;
6543 char o_name[MAX_NLEN];
6546 /* Erase the window */
6547 for (y = 0; y < Term->hgt; y++)
6549 /* Erase the line */
6550 Term_erase(0, y, 255);
6556 /* Get local object */
6559 /* Prepare the object */
6560 object_prep(q_ptr, k_idx);
6563 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6565 /* Mention the object name */
6566 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6568 /* Access the item's sval */
6570 use_realm = tval2realm(q_ptr->tval);
6572 /* Warriors are illiterate */
6573 if (p_ptr->realm1 || p_ptr->realm2)
6575 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6579 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6580 if (!is_magic(use_realm)) return;
6581 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6584 /* Display spells in readible books */
6588 SPELL_IDX spells[64];
6590 /* Extract spells */
6591 for (spell = 0; spell < 32; spell++)
6593 /* Check for this spell */
6594 if (fake_spell_flags[sval] & (1L << spell))
6596 /* Collect this spell */
6597 spells[num++] = spell;
6602 print_spells(0, spells, num, 2, 0, use_realm);
6607 * @brief 警告を放つアイテムを選択する /
6608 * Choose one of items that have warning flag
6609 * Calculate spell damages
6612 object_type *choose_warning_item(void)
6615 int choices[INVEN_TOTAL - INVEN_RARM];
6618 /* Paranoia -- Player has no warning ability */
6619 if (!p_ptr->warning) return NULL;
6621 /* Search Inventory */
6622 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6624 BIT_FLAGS flgs[TR_FLAG_SIZE];
6625 object_type *o_ptr = &inventory[i];
6627 object_flags(o_ptr, flgs);
6628 if (have_flag(flgs, TR_WARNING))
6630 choices[number] = i;
6635 /* Choice one of them */
6636 return number ? &inventory[choices[randint0(number)]] : NULL;
6640 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6641 * Calculate spell damages
6642 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6643 * @param typ 効果属性のID
6645 * @param max 算出した最大ダメージを返すポインタ
6648 static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
6650 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6651 int rlev = r_ptr->level;
6652 bool ignore_wraith_form = FALSE;
6654 /* Vulnerability, resistance and immunity */
6658 if (p_ptr->immune_elec)
6661 ignore_wraith_form = TRUE;
6665 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6666 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6667 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6668 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6669 if (IS_OPPOSE_ELEC())
6670 dam = (dam + 2) / 3;
6675 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6676 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6680 if (p_ptr->immune_acid)
6683 ignore_wraith_form = TRUE;
6687 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6688 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6689 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6690 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6696 if (p_ptr->immune_cold)
6699 ignore_wraith_form = TRUE;
6703 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6704 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6705 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6706 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6711 if (p_ptr->immune_fire)
6714 ignore_wraith_form = TRUE;
6718 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6719 if (prace_is_(RACE_ENT)) dam += dam / 3;
6720 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6721 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6722 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6727 ignore_wraith_form = TRUE;
6731 if (!p_ptr->blind &&
6732 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6733 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6736 ignore_wraith_form = TRUE;
6741 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6742 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6743 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6746 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6747 * "dam *= 2;" for later "dam /= 2"
6749 if (p_ptr->wraith_form) dam *= 2;
6753 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6756 ignore_wraith_form = TRUE;
6758 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6762 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6766 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6770 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6774 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6778 if (prace_is_(RACE_SPECTRE))
6781 ignore_wraith_form = TRUE;
6783 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6787 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6791 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6795 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6799 if (p_ptr->levitation) dam = (dam * 2) / 3;
6803 if (p_ptr->resist_shard) dam /= 2;
6807 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6808 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6812 if (p_ptr->mimic_form)
6814 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6817 ignore_wraith_form = TRUE;
6822 switch (p_ptr->prace)
6831 ignore_wraith_form = TRUE;
6838 if (p_ptr->align > 10) dam /= 2;
6839 else if (p_ptr->align < -10) dam *= 2;
6843 if (p_ptr->align > 10) dam *= 2;
6847 case GF_BRAIN_SMASH:
6848 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6851 ignore_wraith_form = TRUE;
6859 if (100 + rlev / 2 <= p_ptr->skill_sav)
6862 ignore_wraith_form = TRUE;
6867 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6870 ignore_wraith_form = TRUE;
6875 if (p_ptr->wraith_form && !ignore_wraith_form)
6881 if (dam > *max) *max = dam;
6885 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6886 * Calculate spell damages
6887 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6888 * @param typ 効果属性のID
6889 * @param m_idx 魔法を行使するモンスターのID
6890 * @param max 算出した最大ダメージを返すポインタ
6893 void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
6895 monster_type *m_ptr = &m_list[m_idx];
6896 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6897 spell_damcalc(m_ptr, typ, dam, max);
6901 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6902 * Calculate blow damages
6903 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6904 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6905 * @return 算出された最大ダメージを返す。
6907 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6909 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6911 bool check_wraith_form = TRUE;
6913 if (blow_ptr->method != RBM_EXPLODE)
6915 ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
6917 switch (blow_ptr->effect)
6921 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6922 dam = MAX(dam, tmp_dam * 2);
6928 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6932 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6934 check_wraith_form = FALSE;
6938 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6940 check_wraith_form = FALSE;
6944 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6946 check_wraith_form = FALSE;
6950 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6952 check_wraith_form = FALSE;
6957 check_wraith_form = FALSE;
6961 if (check_wraith_form && p_ptr->wraith_form)
6969 dam = (dam + 1) / 2;
6970 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
6978 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
6979 * Examine the grid (xx,yy) and warn the player if there are any danger
6980 * @param xx 危険性を調査するマスのX座標
6981 * @param yy 危険性を調査するマスのY座標
6982 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
6984 bool process_warning(POSITION xx, POSITION yy)
6988 char o_name[MAX_NLEN];
6990 #define WARNING_AWARE_RANGE 12
6992 static int old_damage = 0;
6994 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
6996 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
6999 monster_type *m_ptr;
7000 monster_race *r_ptr;
7002 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
7004 c_ptr = &cave[my][mx];
7006 if (!c_ptr->m_idx) continue;
7008 m_ptr = &m_list[c_ptr->m_idx];
7010 if (MON_CSLEEP(m_ptr)) continue;
7011 if (!is_hostile(m_ptr)) continue;
7013 r_ptr = &r_info[m_ptr->r_idx];
7015 /* Monster spells (only powerful ones)*/
7016 if (projectable(my, mx, yy, xx))
7018 BIT_FLAGS f4 = r_ptr->flags4;
7019 BIT_FLAGS f5 = r_ptr->a_ability_flags1;
7020 BIT_FLAGS f6 = r_ptr->a_ability_flags2;
7022 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
7024 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
7025 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
7026 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
7027 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, c_ptr->m_idx, &dam_max0);
7028 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, c_ptr->m_idx, &dam_max0);
7029 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, c_ptr->m_idx, &dam_max0);
7031 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, c_ptr->m_idx, &dam_max0);
7032 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, c_ptr->m_idx, &dam_max0);
7033 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, c_ptr->m_idx, &dam_max0);
7034 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, c_ptr->m_idx, &dam_max0);
7035 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, c_ptr->m_idx, &dam_max0);
7036 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, c_ptr->m_idx, &dam_max0);
7037 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, c_ptr->m_idx, &dam_max0);
7038 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, c_ptr->m_idx, &dam_max0);
7039 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
7040 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, c_ptr->m_idx, &dam_max0);
7041 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, c_ptr->m_idx, &dam_max0);
7042 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
7043 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, c_ptr->m_idx, &dam_max0);
7044 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, c_ptr->m_idx, &dam_max0);
7045 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, c_ptr->m_idx, &dam_max0);
7046 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, c_ptr->m_idx, &dam_max0);
7047 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, c_ptr->m_idx, &dam_max0);
7048 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, c_ptr->m_idx, &dam_max0);
7049 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, c_ptr->m_idx, &dam_max0);
7050 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, c_ptr->m_idx, &dam_max0);
7051 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
7052 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, c_ptr->m_idx, &dam_max0);
7053 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, c_ptr->m_idx, &dam_max0);
7056 /* Monster melee attacks */
7057 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
7059 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
7063 for (m = 0; m < 4; m++)
7065 /* Skip non-attacks */
7066 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
7068 /* Extract the attack info */
7069 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
7070 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
7072 if (dam_melee > dam_max0) dam_max0 = dam_melee;
7076 /* Contribution from this monster */
7077 dam_max += dam_max0;
7081 /* Prevent excessive warning */
7082 if (dam_max > old_damage)
7084 old_damage = dam_max * 3 / 2;
7086 if (dam_max > p_ptr->chp / 2)
7088 object_type *o_ptr = choose_warning_item();
7091 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7093 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7094 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7097 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7100 else old_damage = old_damage / 2;
7102 c_ptr = &cave[yy][xx];
7103 if (((!easy_disarm && is_trap(c_ptr->feat))
7104 || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
7106 object_type *o_ptr = choose_warning_item();
7109 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7111 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7112 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7114 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7121 * エッセンス情報の構造体 / A structure for smithing
7124 int add; /* TR flag number or special essence id */
7125 cptr add_name; /* Name of this ability */
7126 ESSENCE_IDX type; /* Menu number */
7127 int essence; /* Index for carrying essences */
7128 int value; /* Needed value to add this ability */
7133 * エッセンス情報テーブル Smithing type data for Weapon smith
7136 static essence_type essence_info[] =
7138 {TR_STR, "腕力", 4, TR_STR, 20},
7139 {TR_INT, "知能", 4, TR_INT, 20},
7140 {TR_WIS, "賢さ", 4, TR_WIS, 20},
7141 {TR_DEX, "器用さ", 4, TR_DEX, 20},
7142 {TR_CON, "耐久力", 4, TR_CON, 20},
7143 {TR_CHR, "魅力", 4, TR_CHR, 20},
7144 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
7145 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
7146 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
7147 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
7148 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
7149 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
7150 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
7151 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
7152 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
7153 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
7154 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
7155 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
7156 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
7157 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
7158 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
7159 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
7160 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
7161 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
7162 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
7163 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
7164 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
7165 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
7166 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
7167 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
7168 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
7169 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
7170 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
7171 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
7172 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
7173 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
7174 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
7175 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
7176 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
7177 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
7178 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
7179 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
7180 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
7181 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
7182 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
7183 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
7184 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
7185 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
7186 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
7187 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
7188 {TR_SH_FIRE, "", 0, -2, 0},
7189 {TR_SH_ELEC, "", 0, -2, 0},
7190 {TR_SH_COLD, "", 0, -2, 0},
7191 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
7192 {TR_WARNING, "警告", 3, TR_WARNING, 20},
7193 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
7194 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
7195 {TR_LITE_2, "", 0, -2, 0},
7196 {TR_LITE_3, "", 0, -2, 0},
7197 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
7198 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
7199 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
7200 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
7201 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
7203 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
7204 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
7205 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
7206 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
7207 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
7208 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
7209 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
7210 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
7211 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
7212 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
7213 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
7214 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
7215 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
7216 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
7217 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
7218 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
7219 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
7220 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
7222 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
7223 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
7224 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
7225 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
7226 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
7227 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
7228 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
7229 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
7231 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
7232 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
7233 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
7234 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
7235 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
7236 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
7237 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
7238 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
7239 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
7240 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
7241 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
7242 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
7244 {-1, NULL, 0, -1, 0}
7247 static essence_type essence_info[] =
7249 {TR_STR, "strength", 4, TR_STR, 20},
7250 {TR_INT, "intelligence", 4, TR_INT, 20},
7251 {TR_WIS, "wisdom", 4, TR_WIS, 20},
7252 {TR_DEX, "dexterity", 4, TR_DEX, 20},
7253 {TR_CON, "constitution", 4, TR_CON, 20},
7254 {TR_CHR, "charisma", 4, TR_CHR, 20},
7255 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
7256 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
7257 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
7258 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
7259 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
7260 {TR_SPEED, "speed", 4, TR_SPEED, 12},
7261 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
7262 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
7263 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
7264 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
7265 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
7266 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
7267 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
7268 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
7269 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
7270 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
7271 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
7272 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
7273 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
7274 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
7275 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
7276 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
7277 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
7278 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
7279 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
7280 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
7281 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
7282 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
7283 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
7284 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
7285 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
7286 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
7287 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
7288 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
7289 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
7290 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
7291 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
7292 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
7293 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
7294 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
7295 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
7296 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
7297 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
7298 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
7299 {TR_SH_FIRE, "", 0, -2, 0},
7300 {TR_SH_ELEC, "", 0, -2, 0},
7301 {TR_SH_COLD, "", 0, -2, 0},
7302 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
7303 {TR_WARNING, "warning", 3, TR_WARNING, 20},
7304 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
7305 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
7306 {TR_LITE_2, "", 0, -2, 0},
7307 {TR_LITE_3, "", 0, -2, 0},
7308 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7309 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7310 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7311 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7312 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7314 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7315 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7316 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7317 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7318 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7319 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7320 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7321 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7322 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7323 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7324 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7325 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7326 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7327 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
7328 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7329 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7330 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7331 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7333 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7334 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
7335 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
7336 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
7337 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
7338 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
7339 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7340 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7342 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7343 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7344 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7345 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7346 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7347 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7348 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7349 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7350 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7351 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7352 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7353 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7355 {-1, NULL, 0, -1, 0}
7361 * エッセンス名テーブル / Essense names for Weapon smith
7364 cptr essence_name[] =
7467 cptr essence_name[] =
7570 * @brief 所持しているエッセンス一覧を表示する
7573 static void display_essence(void)
7578 for (i = 1; i < 22; i++)
7582 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7583 "Essence Num Essence Num Essence Num "), 1, 8);
7584 for (i = 0; essence_name[i]; i++)
7586 if (!essence_name[i][0]) continue;
7587 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7590 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7600 static void drain_essence(void)
7602 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7606 bool observe = FALSE;
7607 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7608 TIME_EFFECT old_timeout;
7609 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7615 OBJECT_IDX next_o_idx;
7618 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7621 item_tester_hook = object_is_weapon_armour_ammo;
7622 item_tester_no_ryoute = TRUE;
7624 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7625 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7627 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7629 /* Get the item (in the pack) */
7632 o_ptr = &inventory[item];
7635 /* Get the item (on the floor) */
7638 o_ptr = &o_list[0 - item];
7641 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7643 char o_name[MAX_NLEN];
7644 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7645 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7648 p_ptr->energy_use = 100;
7650 object_flags(o_ptr, old_flgs);
7651 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7652 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7653 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7654 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7655 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7656 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7657 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7658 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7659 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7661 old_to_a = o_ptr->to_a;
7663 old_to_h = o_ptr->to_h;
7664 old_to_d = o_ptr->to_d;
7667 old_pval = o_ptr->pval;
7668 old_name2 = o_ptr->name2;
7669 old_timeout = o_ptr->timeout;
7670 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7671 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7672 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7673 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7674 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7675 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7676 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7677 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7678 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7679 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7680 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7681 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7682 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7683 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7684 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7685 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7686 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7687 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7688 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7692 next_o_idx = o_ptr->next_o_idx;
7693 marked = o_ptr->marked;
7694 weight = o_ptr->weight;
7695 number = o_ptr->number;
7697 object_prep(o_ptr, o_ptr->k_idx);
7701 o_ptr->next_o_idx=next_o_idx;
7702 o_ptr->marked=marked;
7703 o_ptr->number = number;
7704 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7705 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7706 o_ptr->ident |= (IDENT_MENTAL);
7707 object_aware(o_ptr);
7708 object_known(o_ptr);
7710 object_flags(o_ptr, new_flgs);
7712 for (i = 0; essence_info[i].add_name; i++)
7714 essence_type *es_ptr = &essence_info[i];
7715 PARAMETER_VALUE pval = 0;
7717 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7718 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7720 if (es_ptr->add < TR_FLAG_MAX &&
7721 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7722 have_flag(old_flgs, es_ptr->add))
7726 drain_value[es_ptr->essence] += 10 * pval;
7728 else if (es_ptr->essence != -2)
7730 drain_value[es_ptr->essence] += 10;
7732 else if (es_ptr->add == TR_SH_FIRE)
7734 drain_value[TR_BRAND_FIRE] += 10;
7735 drain_value[TR_RES_FIRE] += 10;
7737 else if (es_ptr->add == TR_SH_ELEC)
7739 drain_value[TR_BRAND_ELEC] += 10;
7740 drain_value[TR_RES_ELEC] += 10;
7742 else if (es_ptr->add == TR_SH_COLD)
7744 drain_value[TR_BRAND_COLD] += 10;
7745 drain_value[TR_RES_COLD] += 10;
7747 else if (es_ptr->add == TR_LITE_2)
7749 drain_value[TR_LITE_1] += 20;
7751 else if (es_ptr->add == TR_LITE_3)
7753 drain_value[TR_LITE_1] += 30;
7758 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7760 drain_value[TR_INT] += 5;
7761 drain_value[TR_WIS] += 5;
7763 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7765 drain_value[TR_BRAND_POIS] += 5;
7766 drain_value[TR_BRAND_ACID] += 5;
7767 drain_value[TR_BRAND_ELEC] += 5;
7768 drain_value[TR_BRAND_FIRE] += 5;
7769 drain_value[TR_BRAND_COLD] += 5;
7771 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7773 drain_value[TR_INT] += 10;
7775 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7777 drain_value[TR_STR] += 10;
7779 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7781 drain_value[TR_DEX] += 10;
7783 if (old_name2 == EGO_2WEAPON)
7785 drain_value[TR_DEX] += 20;
7787 if (object_is_weapon_ammo(o_ptr))
7789 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7791 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7793 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7794 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7795 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7796 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7798 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7800 drain_value[i] *= number;
7801 drain_value[i] = drain_value[i] * dec / 4;
7802 drain_value[i] = MAX(drain_value[i], 0);
7803 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7811 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7815 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7817 for (i = 0; essence_name[i]; i++)
7819 if (!essence_name[i][0]) continue;
7820 if (!drain_value[i]) continue;
7822 p_ptr->magic_num1[i] += drain_value[i];
7823 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7825 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7829 /* Apply autodestroy/inscription to the drained item */
7830 autopick_alter_item(item, TRUE);
7832 /* Combine the pack */
7833 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
7835 p_ptr->window |= (PW_INVEN);
7839 * @brief 付加するエッセンスの大別を選択する
7840 * @return 選んだエッセンスの大別ID
7842 static COMMAND_CODE choose_essence(void)
7844 COMMAND_CODE mode = 0;
7846 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7849 cptr menu_name[] = {
7859 cptr menu_name[] = {
7869 const COMMAND_CODE mode_max = 7;
7872 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7875 #endif /* ALLOW_REPEAT */
7884 for (i = 0; i < mode_max; i++)
7886 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7887 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7889 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7890 prt("Choose from menu.", 0, 0);
7909 menu_line += mode_max - 1;
7918 if (menu_line > mode_max) menu_line -= mode_max;
7929 for (i = 0; i < mode_max; i++)
7930 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7932 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7938 if (isupper(choice)) choice = (char)tolower(choice);
7940 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7941 mode = (int)choice - 'a' + 1;
7948 #endif /* ALLOW_REPEAT */
7953 * @brief エッセンスを実際に付加する
7954 * @param mode エッセンスの大別ID
7957 static void add_essence(ESSENCE_IDX mode)
7969 char o_name[MAX_NLEN];
7971 essence_type *es_ptr;
7972 bool able[22] = { 0 };
7974 int menu_line = (use_menu ? 1 : 0);
7976 for (i = 0; essence_info[i].add_name; i++)
7978 es_ptr = &essence_info[i];
7980 if (es_ptr->type != mode) continue;
7985 if (!repeat_pull(&i) || i<0 || i>=max_num)
7987 #endif /* ALLOW_REPEAT */
7990 /* Nothing chosen yet */
7996 /* Build a prompt */
7997 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
7998 if (use_menu) screen_save();
8000 /* Get a spell from the user */
8002 choice = (always_show_list || use_menu) ? ESCAPE:1;
8005 if( choice==ESCAPE ) choice = ' ';
8006 else if( !get_com(out_val, &choice, FALSE) )break;
8008 if (use_menu && choice != ' ')
8022 menu_line += (max_num-1);
8045 menu_line = max_num;
8059 if (menu_line > max_num) menu_line -= max_num;
8061 /* Request redraw */
8062 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
8065 if (!redraw || use_menu)
8069 char dummy[80], dummy2[80];
8077 /* Save the screen */
8078 if (!use_menu) screen_save();
8080 for (y = 1; y < 24; y++)
8083 /* Print header(s) */
8085 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
8088 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
8091 for (ctr = 0; ctr < max_num; ctr++)
8093 es_ptr = &essence_info[num[ctr]];
8097 if (ctr == (menu_line-1))
8098 strcpy(dummy, _("》 ", "> "));
8099 else strcpy(dummy, " ");
8102 /* letter/number for power selection */
8105 sprintf(dummy, "%c) ",I2A(ctr));
8108 strcat(dummy, es_ptr->add_name);
8113 if (es_ptr->essence != -1)
8115 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
8116 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
8122 case ESSENCE_SH_FIRE:
8123 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
8124 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
8125 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8127 case ESSENCE_SH_ELEC:
8128 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
8129 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
8130 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8132 case ESSENCE_SH_COLD:
8133 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
8134 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
8135 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8137 case ESSENCE_RESISTANCE:
8138 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8139 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8140 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8141 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8142 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8144 case ESSENCE_SUSTAIN:
8145 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8146 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8147 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8148 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8149 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8154 if (!able[ctr]) col = TERM_RED;
8156 if (es_ptr->essence != -1)
8158 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
8162 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
8165 c_prt(col, dummy2, ctr+2, x);
8175 /* Restore the screen */
8186 ask = (isupper(choice));
8189 if (ask) choice = (char)tolower(choice);
8191 /* Extract request */
8192 i = (islower(choice) ? A2I(choice) : -1);
8195 /* Totally Illegal */
8196 if ((i < 0) || (i >= max_num) || !able[i])
8208 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
8210 /* Belay that order */
8211 if (!get_check(tmp_val)) continue;
8218 /* Restore the screen */
8219 if (redraw) screen_load();
8226 #endif /* ALLOW_REPEAT */
8228 es_ptr = &essence_info[num[i]];
8230 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8231 item_tester_tval = TV_GLOVES;
8232 else if (mode == 1 || mode == 5)
8233 item_tester_hook = item_tester_hook_melee_ammo;
8234 else if (es_ptr->add == ESSENCE_ATTACK)
8235 item_tester_hook = object_allow_enchant_weapon;
8236 else if (es_ptr->add == ESSENCE_AC)
8237 item_tester_hook = object_is_armour;
8239 item_tester_hook = object_is_weapon_armour_ammo;
8240 item_tester_no_ryoute = TRUE;
8242 q = _("どのアイテムを改良しますか?", "Improve which item? ");
8243 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
8245 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8247 /* Get the item (in the pack) */
8250 o_ptr = &inventory[item];
8253 /* Get the item (on the floor) */
8256 o_ptr = &o_list[0 - item];
8259 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
8261 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
8265 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8267 use_essence = es_ptr->value;
8268 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
8269 if (o_ptr->number > 1)
8271 use_essence *= o_ptr->number;
8272 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
8275 if (es_ptr->essence != -1)
8277 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8279 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8282 if (is_pval_flag(es_ptr->add))
8284 if (o_ptr->pval < 0)
8286 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
8289 else if (es_ptr->add == TR_BLOWS)
8291 if (o_ptr->pval > 1)
8293 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
8297 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8299 else if (o_ptr->pval > 0)
8301 use_essence *= o_ptr->pval;
8302 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8308 PARAMETER_VALUE pval;
8309 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8311 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
8312 strcpy(tmp_val, "1");
8314 if (!get_string(tmp, tmp_val, 1)) return;
8315 pval = (PARAMETER_VALUE)atoi(tmp_val);
8316 if (pval > limit) pval = limit;
8317 else if (pval < 1) pval = 1;
8318 o_ptr->pval += pval;
8319 use_essence *= pval;
8320 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8323 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8325 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8329 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8336 strcpy(tmp_val, "1");
8337 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
8338 val = atoi(tmp_val);
8339 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8340 else if (val < 1) val = 1;
8342 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8343 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8345 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8348 get_to_h = ((val+1)/2+randint0(val/2+1));
8349 get_to_d = ((val+1)/2+randint0(val/2+1));
8350 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8351 o_ptr->to_h += get_to_h;
8352 o_ptr->to_d += get_to_d;
8354 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8355 if (es_ptr->add == ESSENCE_ATTACK)
8357 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8359 msg_print(_("改良に失敗した。", "You failed to enchant."));
8360 p_ptr->energy_use = 100;
8365 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8366 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8369 else if (es_ptr->add == ESSENCE_AC)
8371 if (o_ptr->to_a >= p_ptr->lev/5+5)
8373 msg_print(_("改良に失敗した。", "You failed to enchant."));
8374 p_ptr->energy_use = 100;
8379 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8384 o_ptr->xtra3 = es_ptr->add + 1;
8389 bool success = TRUE;
8393 case ESSENCE_SH_FIRE:
8394 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8399 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8400 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8402 case ESSENCE_SH_ELEC:
8403 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8408 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8409 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8411 case ESSENCE_SH_COLD:
8412 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8417 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8418 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8420 case ESSENCE_RESISTANCE:
8421 case ESSENCE_SUSTAIN:
8422 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))
8427 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8428 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8429 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8430 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8435 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8438 if (es_ptr->add == ESSENCE_SUSTAIN)
8440 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8441 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8442 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8443 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8447 o_ptr->xtra3 = es_ptr->add + 1;
8451 p_ptr->energy_use = 100;
8454 msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name);
8456 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8459 /* Combine the pack */
8460 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8462 p_ptr->window |= (PW_INVEN);
8469 static void erase_essence(void)
8474 char o_name[MAX_NLEN];
8475 BIT_FLAGS flgs[TR_FLAG_SIZE];
8477 item_tester_hook = object_is_smith;
8479 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
8480 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
8482 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8484 /* Get the item (in the pack) */
8487 o_ptr = &inventory[item];
8490 /* Get the item (on the floor) */
8493 o_ptr = &o_list[0 - item];
8496 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8497 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
8499 p_ptr->energy_use = 100;
8501 if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE)
8503 o_ptr->to_h -= (o_ptr->xtra4>>8);
8504 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8506 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8507 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8510 object_flags(o_ptr, flgs);
8511 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8512 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8514 /* Combine the pack */
8515 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8517 p_ptr->window |= (PW_INVEN);
8521 * @brief 鍛冶コマンドのメインルーチン
8522 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8525 void do_cmd_kaji(bool only_browse)
8527 COMMAND_CODE mode = 0;
8530 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8534 if (p_ptr->confused)
8536 msg_print(_("混乱していて作業できない!", "You are too confused!"));
8541 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8546 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8552 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8554 #endif /* ALLOW_REPEAT */
8556 if (only_browse) screen_save();
8558 if (!only_browse) screen_save();
8564 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8565 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8566 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8567 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8568 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8569 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8571 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8572 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8573 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8574 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8575 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8576 prt(format("Choose command from menu."), 0, 0);
8603 if (menu_line > 5) menu_line -= 5;
8611 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
8612 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
8613 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
8614 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
8615 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
8617 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8619 if (!get_com("Command :", &choice, TRUE))
8656 /* Clear lines, position cursor (really should use strlen here) */
8657 Term_erase(14, 21, 255);
8658 Term_erase(14, 20, 255);
8659 Term_erase(14, 19, 255);
8660 Term_erase(14, 18, 255);
8661 Term_erase(14, 17, 255);
8662 Term_erase(14, 16, 255);
8664 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8665 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8667 prt(&temp[j], line, 15);
8672 if (!only_browse) screen_load();
8673 } while (only_browse);
8677 #endif /* ALLOW_REPEAT */
8681 case 1: display_essence();break;
8682 case 2: drain_essence();break;
8683 case 3: erase_essence();break;
8685 mode = choose_essence();
8690 case 5: add_essence(10);break;
8696 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8697 * Torches have special abilities when they are flaming.
8698 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8699 * @param flgs 特別に追加するフラグを返す参照ポインタ
8702 void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
8704 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8706 if (o_ptr->xtra4 > 0)
8708 add_flag(flgs, TR_BRAND_FIRE);
8709 add_flag(flgs, TR_KILL_UNDEAD);
8710 add_flag(flgs, TR_THROW);
8716 * @brief 投擲時たいまつにダイスを与える。
8717 * Torches have special abilities when they are flaming.
8718 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8719 * @param dd 特別なダイス数を返す参照ポインタ
8720 * @param ds 特別なダイス面数を返す参照ポインタ
8723 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
8725 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8727 if (o_ptr->xtra4 > 0)
8736 * @brief 投擲時命中したたいまつの寿命を縮める。
8737 * Torches have special abilities when they are flaming.
8738 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8741 void torch_lost_fuel(object_type *o_ptr)
8743 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8745 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8746 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;