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);
380 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
384 /* Compact at least 'size' objects */
385 for (num = 0, cnt = 1; num < size; cnt++)
387 /* Get more vicious each iteration */
390 /* Get closer each iteration */
391 cur_dis = 5 * (20 - cnt);
393 /* Examine the objects */
394 for (i = 1; i < o_max; i++)
398 /* Skip dead objects */
399 if (!o_ptr->k_idx) continue;
401 /* Hack -- High level objects start out "immune" */
402 if (k_info[o_ptr->k_idx].level > cur_lev) continue;
405 if (o_ptr->held_m_idx)
409 /* Acquire monster */
410 m_ptr = &m_list[o_ptr->held_m_idx];
412 /* Get the location */
416 /* Monsters protect their objects */
417 if (randint0(100) < 90) continue;
423 /* Get the location */
428 /* Nearby objects start out "immune" */
429 if ((cur_dis > 0) && (distance(p_ptr->y, p_ptr->x, y, x) < cur_dis)) continue;
434 /* Hack -- only compact artifacts in emergencies */
435 if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
436 (cnt < 1000)) chance = 100;
438 /* Apply the saving throw */
439 if (randint0(100) < chance) continue;
441 /* Delete the object */
442 delete_object_idx(i);
450 /* Excise dead objects (backwards!) */
451 for (i = o_max - 1; i >= 1; i--)
455 /* Skip real objects */
456 if (o_ptr->k_idx) continue;
458 /* Move last object into open hole */
459 compact_objects_aux(o_max - 1, i);
461 /* Compress "o_max" */
468 * @brief グローバルオブジェクト配列を初期化する /
469 * Delete all the items when player leaves the level
470 * @note we do NOT visually reflect these (irrelevant) changes
472 * Hack -- we clear the "c_ptr->o_idx" field for every grid,
473 * and the "m_ptr->next_o_idx" field for every monster, since
474 * we know we are clearing every object. Technically, we only
475 * clear those fields for grids/monsters containing objects,
476 * and we clear it once for every such object.
479 void wipe_o_list(void)
483 /* Delete the existing objects */
484 for (i = 1; i < o_max; i++)
486 object_type *o_ptr = &o_list[i];
488 /* Skip dead objects */
489 if (!o_ptr->k_idx) continue;
491 /* Mega-Hack -- preserve artifacts */
492 if (!character_dungeon || preserve_mode)
494 /* Hack -- Preserve unknown artifacts */
495 if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
497 /* Mega-Hack -- Preserve the artifact */
498 a_info[o_ptr->name1].cur_num = 0;
503 if (o_ptr->held_m_idx)
508 m_ptr = &m_list[o_ptr->held_m_idx];
510 /* Hack -- see above */
511 m_ptr->hold_o_idx = 0;
519 /* Access location */
520 POSITION y = o_ptr->iy;
521 POSITION x = o_ptr->ix;
526 /* Hack -- see above */
530 /* Wipe the object */
543 * @brief グローバルオブジェクト配列から空きを取得する /
544 * Acquires and returns the index of a "free" object.
545 * @return 開いているオブジェクト要素のID
547 * This routine should almost never fail, but in case it does,
548 * we must be sure to handle "failure" of this routine.
550 OBJECT_IDX o_pop(void)
554 /* Initial allocation */
555 if (o_max < max_o_idx)
560 /* Expand object array */
566 /* Use this object */
571 /* Recycle dead objects */
572 for (i = 1; i < o_max; i++)
579 /* Skip live objects */
580 if (o_ptr->k_idx) continue;
585 /* Use this object */
590 /* Warn the player (except during dungeon creation) */
591 if (character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!"));
599 * @brief オブジェクト生成テーブルに生成制約を加える /
600 * Apply a "object restriction function" to the "object allocation table"
602 * @details 生成の制約はグローバルのget_obj_num_hook関数ポインタで加える
604 static errr get_obj_num_prep(void)
609 alloc_entry *table = alloc_kind_table;
611 /* Scan the allocation table */
612 for (i = 0; i < alloc_kind_size; i++)
614 /* Accept objects which pass the restriction, if any */
615 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
617 /* Accept this object */
618 table[i].prob2 = table[i].prob1;
621 /* Do not use this object */
624 /* Decline this object */
635 * @brief オブジェクト生成テーブルからアイテムを取得する /
636 * Choose an object kind that seems "appropriate" to the given level
638 * @return 選ばれたオブジェクトベースID
640 * This function uses the "prob2" field of the "object allocation table",\n
641 * and various local information, to calculate the "prob3" field of the\n
642 * same table, which is then used to choose an "appropriate" object, in\n
643 * a relatively efficient manner.\n
645 * It is (slightly) more likely to acquire an object of the given level\n
646 * than one of a lower level. This is done by choosing several objects\n
647 * appropriate to the given level and keeping the "hardest" one.\n
649 * Note that if no objects are "appropriate", then this function will\n
650 * fail, and return zero, but this should *almost* never happen.\n
652 OBJECT_IDX get_obj_num(DEPTH level)
655 KIND_OBJECT_IDX k_idx;
658 alloc_entry *table = alloc_kind_table;
660 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
663 if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER))
665 /* Occasional "boost" */
666 if (one_in_(GREAT_OBJ))
668 /* What a bizarre calculation */
669 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
676 /* Process probabilities */
677 for (i = 0; i < alloc_kind_size; i++)
679 /* Objects are sorted by depth */
680 if (table[i].level > level) break;
685 /* Access the index */
686 k_idx = table[i].index;
688 /* Access the actual kind */
689 k_ptr = &k_info[k_idx];
691 /* Hack -- prevent embedded chests */
692 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
695 table[i].prob3 = table[i].prob2;
698 total += table[i].prob3;
701 /* No legal objects */
702 if (total <= 0) return (0);
706 value = randint0(total);
708 /* Find the object */
709 for (i = 0; i < alloc_kind_size; i++)
711 /* Found the entry */
712 if (value < table[i].prob3) break;
715 value = value - table[i].prob3;
722 /* Try for a "better" object once (50%) or twice (10%) */
729 value = randint0(total);
731 /* Find the object */
732 for (i = 0; i < alloc_kind_size; i++)
734 /* Found the entry */
735 if (value < table[i].prob3) break;
738 value = value - table[i].prob3;
741 /* Keep the "best" one */
742 if (table[i].level < table[j].level) i = j;
745 /* Try for a "better" object twice (10%) */
752 value = randint0(total);
754 /* Find the object */
755 for (i = 0; i < alloc_kind_size; i++)
757 /* Found the entry */
758 if (value < table[i].prob3) break;
761 value = value - table[i].prob3;
764 /* Keep the "best" one */
765 if (table[i].level < table[j].level) i = j;
770 return (table[i].index);
775 * @brief オブジェクトを鑑定済にする /
776 * Known is true when the "attributes" of an object are "known".
777 * @param o_ptr 鑑定済にするオブジェクトの構造体参照ポインタ
779 * These include tohit, todam, toac, cost, and pval (charges).\n
781 * Note that "knowing" an object gives you everything that an "awareness"\n
782 * gives you, and much more. In fact, the player is always "aware" of any\n
783 * item of which he has full "knowledge".\n
785 * But having full knowledge of, say, one "wand of wonder", does not, by\n
786 * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
787 * It happens that most "identify" routines (including "buying from a shop")\n
788 * will make the player "aware" of the object as well as fully "know" it.\n
790 * This routine also removes any inscriptions generated by "feelings".\n
792 void object_known(object_type *o_ptr)
794 /* Remove "default inscriptions" */
795 o_ptr->feeling = FEEL_NONE;
797 /* Clear the "Felt" info */
798 o_ptr->ident &= ~(IDENT_SENSE);
800 /* Clear the "Empty" info */
801 o_ptr->ident &= ~(IDENT_EMPTY);
803 /* Now we know about the item */
804 o_ptr->ident |= (IDENT_KNOWN);
808 * @brief オブジェクトを*鑑定*済にする /
809 * The player is now aware of the effects of the given object.
810 * @param o_ptr *鑑定*済にするオブジェクトの構造体参照ポインタ
813 void object_aware(object_type *o_ptr)
815 bool mihanmei = !object_is_aware(o_ptr);
817 /* Fully aware of the effects */
818 k_info[o_ptr->k_idx].aware = TRUE;
820 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
821 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
825 char o_name[MAX_NLEN];
828 object_copy(q_ptr, o_ptr);
831 object_desc(o_name, q_ptr, OD_NAME_ONLY);
833 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
838 * @brief オブジェクトを試行済にする /
839 * Something has been "sampled"
840 * @param o_ptr 試行済にするオブジェクトの構造体参照ポインタ
843 void object_tried(object_type *o_ptr)
845 /* Mark it as tried (even if "aware") */
846 k_info[o_ptr->k_idx].tried = TRUE;
850 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
851 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
852 * @return 擬似鑑定結果のIDを返す。
854 byte value_check_aux1(object_type *o_ptr)
857 if (object_is_artifact(o_ptr))
860 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
867 if (object_is_ego(o_ptr))
870 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
873 return FEEL_EXCELLENT;
877 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
880 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
882 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
884 /* Good "armor" bonus */
885 if (o_ptr->to_a > 0) return FEEL_GOOD;
887 /* Good "weapon" bonus */
888 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
890 /* Default to "average" */
895 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 2 (Light).
896 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
897 * @return 擬似鑑定結果のIDを返す。
899 byte value_check_aux2(object_type *o_ptr)
901 /* Cursed items (all of them) */
902 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
904 /* Broken items (all of them) */
905 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
907 /* Artifacts -- except cursed/broken ones */
908 if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
910 /* Ego-Items -- except cursed/broken ones */
911 if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
913 /* Good armor bonus */
914 if (o_ptr->to_a > 0) return FEEL_UNCURSED;
916 /* Good weapon bonuses */
917 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
924 * @brief 未鑑定なベースアイテムの基本価格を返す /
925 * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
926 * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
927 * @return オブジェクトの未鑑定価格
929 static s32b object_value_base(object_type *o_ptr)
931 /* Aware item -- use template cost */
932 if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
934 /* Analyze the type */
939 case TV_FOOD: return (5L);
941 /* Un-aware Potions */
942 case TV_POTION: return (20L);
944 /* Un-aware Scrolls */
945 case TV_SCROLL: return (20L);
947 /* Un-aware Staffs */
948 case TV_STAFF: return (70L);
951 case TV_WAND: return (50L);
954 case TV_ROD: return (90L);
957 case TV_RING: return (45L);
959 /* Un-aware Amulets */
960 case TV_AMULET: return (45L);
962 /* Figurines, relative to monster level */
965 DEPTH level = r_info[o_ptr->pval].level;
966 if (level < 20) return level*50L;
967 else if (level < 30) return 1000+(level-20)*150L;
968 else if (level < 40) return 2500+(level-30)*350L;
969 else if (level < 50) return 6000+(level-40)*800L;
970 else return 14000+(level-50)*2000L;
974 if (!o_ptr->pval) return 1000L;
975 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
978 /* Paranoia -- Oops */
984 * @brief オブジェクトのフラグ類から価格を算出する /
985 * Return the value of the flags the object has...
986 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
987 * @param plusses フラグに与える価格の基本重み
988 * @return オブジェクトのフラグ価格
990 s32b flag_cost(object_type *o_ptr, int plusses)
993 BIT_FLAGS flgs[TR_FLAG_SIZE];
997 object_kind *k_ptr = &k_info[o_ptr->k_idx];
999 object_flags(o_ptr, flgs);
1002 * Exclude fixed flags of the base item.
1003 * pval bonuses of base item will be treated later.
1005 for (i = 0; i < TR_FLAG_SIZE; i++)
1006 flgs[i] &= ~(k_ptr->flags[i]);
1008 /* Exclude fixed flags of the fixed artifact. */
1009 if (object_is_fixed_artifact(o_ptr))
1011 artifact_type *a_ptr = &a_info[o_ptr->name1];
1013 for (i = 0; i < TR_FLAG_SIZE; i++)
1014 flgs[i] &= ~(a_ptr->flags[i]);
1017 /* Exclude fixed flags of the ego-item. */
1018 else if (object_is_ego(o_ptr))
1020 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1022 for (i = 0; i < TR_FLAG_SIZE; i++)
1023 flgs[i] &= ~(e_ptr->flags[i]);
1028 * Calucurate values of remaining flags
1030 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
1031 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
1032 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
1033 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
1034 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
1035 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
1036 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
1037 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
1038 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
1039 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
1040 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
1041 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
1042 total += (10000 + (2500 * plusses));
1043 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
1044 total += (10000 + (2500 * plusses));
1048 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
1049 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
1050 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
1051 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
1052 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
1053 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
1054 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
1055 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
1056 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
1057 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
1058 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
1059 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
1060 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
1061 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
1062 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
1063 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
1064 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
1065 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
1066 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
1067 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
1068 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
1070 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
1071 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
1072 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
1073 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
1074 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
1075 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
1076 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
1077 total += (tmp_cost * count);
1079 if (have_flag(flgs, TR_SUST_STR)) total += 850;
1080 if (have_flag(flgs, TR_SUST_INT)) total += 850;
1081 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
1082 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
1083 if (have_flag(flgs, TR_SUST_CON)) total += 850;
1084 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
1085 if (have_flag(flgs, TR_RIDING)) total += 0;
1086 if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
1087 if (have_flag(flgs, TR_THROW)) total += 5000;
1088 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
1089 if (have_flag(flgs, TR_HOLD_EXP)) total += 8500;
1093 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
1094 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
1095 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
1096 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
1097 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
1098 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
1099 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
1100 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
1101 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
1102 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
1103 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
1104 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
1105 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
1106 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
1107 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
1108 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
1109 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
1110 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
1111 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
1112 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
1113 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
1114 total += (tmp_cost * count);
1116 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
1117 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
1118 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1119 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1120 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1121 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1122 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1123 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1124 if (have_flag(flgs, TR_LEVITATION)) total += 1250;
1125 if (have_flag(flgs, TR_LITE_1)) total += 1500;
1126 if (have_flag(flgs, TR_LITE_2)) total += 2500;
1127 if (have_flag(flgs, TR_LITE_3)) total += 4000;
1128 if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
1129 if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
1130 if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
1131 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1132 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1133 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1134 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1135 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1136 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1137 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1138 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1139 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1140 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1141 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1142 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1143 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1144 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1145 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1146 if (have_flag(flgs, TR_REGEN)) total += 2500;
1147 if (have_flag(flgs, TR_WARNING)) total += 2000;
1148 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1149 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1150 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1151 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1152 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1153 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1154 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1155 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1156 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1157 if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
1158 if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
1159 if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
1160 if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
1161 if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
1162 if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
1163 if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
1164 if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
1165 if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
1166 if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
1167 if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
1168 if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
1169 if (have_flag(flgs, TR_TELEPORT))
1171 if (object_is_cursed(o_ptr))
1176 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1177 if (have_flag(flgs, TR_BLESSED)) total += 750;
1178 if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1179 if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1180 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1181 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1182 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1184 /* Also, give some extra for activatable powers... */
1185 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1187 const activation_type* const act_ptr = find_activation_info(o_ptr);
1189 total += act_ptr->value;
1198 * @brief オブジェクトの真の価格を算出する /
1199 * Return the value of the flags the object has...
1200 * @param o_ptr 本価格を確認したいオブジェクトの構造体参照ポインタ
1201 * @return オブジェクトの本価格
1203 * Return the "real" price of a "known" item, not including discounts\n
1205 * Wand and staffs get cost for each charge\n
1207 * Armor is worth an extra 100 gold per bonus point to armor class.\n
1209 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
1211 * Missiles are only worth 5 gold per bonus point, since they\n
1212 * usually appear in groups of 20, and we want the player to get\n
1213 * the same amount of cash for any "equivalent" item. Note that\n
1214 * missiles never have any of the "pval" flags, and in fact, they\n
1215 * only have a few of the available flags, primarily of the "slay"\n
1216 * and "brand" and "ignore" variety.\n
1218 * Armor with a negative armor bonus is worthless.\n
1219 * Weapons with negative hit+damage bonuses are worthless.\n
1221 * Every wearable item with a "pval" bonus is worth extra (see below).\n
1223 PRICE object_value_real(object_type *o_ptr)
1226 BIT_FLAGS flgs[TR_FLAG_SIZE];
1227 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1230 /* Hack -- "worthless" items */
1231 if (!k_info[o_ptr->k_idx].cost) return (0L);
1234 value = k_info[o_ptr->k_idx].cost;
1236 /* Extract some flags */
1237 object_flags(o_ptr, flgs);
1240 if (object_is_fixed_artifact(o_ptr))
1242 artifact_type *a_ptr = &a_info[o_ptr->name1];
1244 /* Hack -- "worthless" artifacts */
1245 if (!a_ptr->cost) return (0L);
1247 /* Hack -- Use the artifact cost instead */
1248 value = a_ptr->cost;
1249 value += flag_cost(o_ptr, o_ptr->pval);
1251 /* Don't add pval bonuses etc. */
1256 else if (object_is_ego(o_ptr))
1258 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1260 /* Hack -- "worthless" ego-items */
1261 if (!e_ptr->cost) return (0L);
1263 /* Hack -- Reward the ego-item with a bonus */
1264 value += e_ptr->cost;
1265 value += flag_cost(o_ptr, o_ptr->pval);
1273 for (i = 0; i < TR_FLAG_SIZE; i++)
1274 if (o_ptr->art_flags[i]) flag = TRUE;
1276 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1279 /* Analyze pval bonus for normal object */
1280 switch (o_ptr->tval)
1303 if (!o_ptr->pval) break;
1305 /* Hack -- Negative "pval" is always bad */
1306 if (o_ptr->pval < 0) return (0L);
1308 /* Give credit for stat bonuses */
1309 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1310 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1311 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1312 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1313 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1314 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1316 /* Give credit for stealth and searching */
1317 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1318 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1319 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1321 /* Give credit for infra-vision and tunneling */
1322 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1323 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1325 /* Give credit for extra attacks */
1326 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1328 /* Give credit for speed bonus */
1329 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1335 /* Analyze the item */
1336 switch (o_ptr->tval)
1341 /* Pay extra for charges, depending on standard number of
1342 * charges. Handle new-style wands correctly. -LM-
1344 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1350 /* Pay extra for charges, depending on standard number of
1353 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1362 /* Hack -- negative bonuses are bad */
1363 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1365 /* Give credit for bonuses */
1366 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1382 /* Hack -- negative armor bonus */
1383 if (o_ptr->to_a < 0) return (0L);
1385 /* Give credit for bonuses */
1386 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1398 /* Hack -- negative hit/damage bonuses */
1399 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1401 /* Factor in the bonuses */
1402 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1404 /* Hack -- Factor in extra damage dice and sides */
1405 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1406 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1416 /* Hack -- negative hit/damage bonuses */
1417 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1419 /* Factor in the bonuses */
1420 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1422 /* Hack -- Factor in extra damage dice and sides */
1423 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1424 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1429 /* Figurines, relative to monster level */
1432 DEPTH level = r_info[o_ptr->pval].level;
1433 if (level < 20) value = level*50L;
1434 else if (level < 30) value = 1000+(level-20)*150L;
1435 else if (level < 40) value = 2500+(level-30)*350L;
1436 else if (level < 50) value = 6000+(level-40)*800L;
1437 else value = 14000+(level-50)*2000L;
1443 if (!o_ptr->pval) value = 1000L;
1444 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1450 if (!o_ptr->pval) value = 0L;
1455 /* Worthless object */
1456 if (value < 0) return 0L;
1458 /* Return the value */
1464 * @brief オブジェクト価格算出のメインルーチン /
1465 * Return the price of an item including plusses (and charges)
1466 * @param o_ptr 判明している現価格を確認したいオブジェクトの構造体参照ポインタ
1467 * @return オブジェクトの判明している現価格
1469 * This function returns the "value" of the given item (qty one)\n
1471 * Never notice "unknown" bonuses or properties, including "curses",\n
1472 * since that would give the player information he did not have.\n
1474 * Note that discounted items stay discounted forever, even if\n
1475 * the discount is "forgotten" by the player via memory loss.\n
1477 PRICE object_value(object_type *o_ptr)
1481 /* Unknown items -- acquire a base value */
1482 if (object_is_known(o_ptr))
1484 /* Broken items -- worthless */
1485 if (object_is_broken(o_ptr)) return (0L);
1487 /* Cursed items -- worthless */
1488 if (object_is_cursed(o_ptr)) return (0L);
1490 /* Real value (see above) */
1491 value = object_value_real(o_ptr);
1494 /* Known items -- acquire the actual value */
1497 /* Hack -- Felt broken items */
1498 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1500 /* Hack -- Felt cursed items */
1501 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1503 /* Base value (see above) */
1504 value = object_value_base(o_ptr);
1508 /* Apply discount (if any) */
1509 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1512 /* Return the final value */
1519 * @brief 破壊可能なアイテムかを返す /
1520 * Determines whether an object can be destroyed, and makes fake inscription.
1521 * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
1522 * @return オブジェクトが破壊可能ならばTRUEを返す
1524 bool can_player_destroy_object(object_type *o_ptr)
1526 /* Artifacts cannot be destroyed */
1527 if (!object_is_artifact(o_ptr)) return TRUE;
1529 /* If object is unidentified, makes fake inscription */
1530 if (!object_is_known(o_ptr))
1532 byte feel = FEEL_SPECIAL;
1534 /* Hack -- Handle icky artifacts */
1535 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1537 /* Hack -- inscribe the artifact */
1538 o_ptr->feeling = feel;
1540 /* We have "felt" it (again) */
1541 o_ptr->ident |= (IDENT_SENSE);
1543 /* Combine the pack */
1544 p_ptr->notice |= (PN_COMBINE);
1547 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1552 /* Identified artifact -- Nothing to do */
1558 * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
1559 * Distribute charges of rods or wands.
1560 * @param o_ptr 分割元オブジェクトの構造体参照ポインタ source item
1561 * @param q_ptr 分割先オブジェクトの構造体参照ポインタ target item, must be of the same type as o_ptr
1562 * @param amt 分割したい回数量 number of items that are transfered
1565 * Hack -- If rods or wands are dropped, the total maximum timeout or\n
1566 * charges need to be allocated between the two stacks. If all the items\n
1567 * are being dropped, it makes for a neater message to leave the original\n
1568 * stack's pval alone. -LM-\n
1570 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1572 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1574 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1575 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1577 /* Hack -- Rods also need to have their timeouts distributed. The
1578 * dropped stack will accept all time remaining to charge up to its
1581 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1583 if (q_ptr->pval > o_ptr->timeout)
1584 q_ptr->timeout = o_ptr->timeout;
1586 q_ptr->timeout = q_ptr->pval;
1588 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1594 * @brief 魔法棒やロッドの使用回数を減らす /
1595 * @param o_ptr オブジェクトの構造体参照ポインタ source item
1596 * @param amt 減らしたい回数量 number of items that are transfered
1599 * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1600 * charges of the stack needs to be reduced, unless all the items are\n
1601 * being destroyed. -LM-\n
1603 void reduce_charges(object_type *o_ptr, int amt)
1605 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1606 (amt < o_ptr->number))
1608 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1613 * Determine if an item can "absorb" a second item
1615 * See "object_absorb()" for the actual "absorption" code.
1617 * If permitted, we allow staffs (if they are known to have equal charges
1618 * and both are either known or confirmed empty) and wands (if both are
1619 * either known or confirmed empty) and rods (in all cases) to combine.
1620 * Staffs will unstack (if necessary) when they are used, but wands and
1621 * rods will only unstack if one is dropped. -LM-
1623 * If permitted, we allow weapons/armor to stack, if fully "known".
1625 * Missiles will combine if both stacks have the same "known" status.
1626 * This is done to make unidentified stacks of missiles useful.
1628 * Food, potions, scrolls, and "easy know" items always stack.
1630 * Chests, and activatable items, never stack (for various reasons).
1634 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1636 #define MAX_STACK_SIZE 99
1640 * @brief 両オブジェクトをスロットに重ね合わせ可能な最大数を返す。
1641 * Determine if an item can partly absorb a second item. Return maximum number of stack.
1642 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1643 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1644 * @return 重ね合わせ可能なアイテム数
1646 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1650 /* Default maximum number of stack */
1651 int max_num = MAX_STACK_SIZE;
1653 /* Require identical object types */
1654 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1657 /* Analyze the items */
1658 switch (o_ptr->tval)
1660 /* Chests and Statues*/
1671 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1672 if (o_ptr->pval != j_ptr->pval) return 0;
1676 /* Figurines and Corpses*/
1681 if (o_ptr->pval != j_ptr->pval) return 0;
1687 /* Food and Potions and Scrolls */
1699 /* Require either knowledge or known empty for both staffs. */
1700 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1701 !object_is_known(o_ptr)) ||
1702 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1703 !object_is_known(j_ptr))) return 0;
1705 /* Require identical charges, since staffs are bulky. */
1706 if (o_ptr->pval != j_ptr->pval) return 0;
1715 /* Require either knowledge or known empty for both wands. */
1716 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1717 !object_is_known(o_ptr)) ||
1718 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1719 !object_is_known(j_ptr))) return 0;
1721 /* Wand charges combine in O&ZAngband. */
1727 /* Staffs and Wands and Rods */
1730 /* Prevent overflaw of timeout */
1731 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1737 /* Weapons and Armor */
1753 /* Rings, Amulets, Lites */
1759 /* Require full knowledge of both items */
1760 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1770 /* Require identical knowledge of both items */
1771 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1772 if (o_ptr->feeling != j_ptr->feeling) return 0;
1774 /* Require identical "bonuses" */
1775 if (o_ptr->to_h != j_ptr->to_h) return 0;
1776 if (o_ptr->to_d != j_ptr->to_d) return 0;
1777 if (o_ptr->to_a != j_ptr->to_a) return 0;
1779 /* Require identical "pval" code */
1780 if (o_ptr->pval != j_ptr->pval) return 0;
1782 /* Artifacts never stack */
1783 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1785 /* Require identical "ego-item" names */
1786 if (o_ptr->name2 != j_ptr->name2) return 0;
1788 /* Require identical added essence */
1789 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1790 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1792 /* Hack -- Never stack "powerful" items */
1793 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1795 /* Hack -- Never stack recharging items */
1796 if (o_ptr->timeout || j_ptr->timeout) return 0;
1798 /* Require identical "values" */
1799 if (o_ptr->ac != j_ptr->ac) return 0;
1800 if (o_ptr->dd != j_ptr->dd) return 0;
1801 if (o_ptr->ds != j_ptr->ds) return 0;
1810 /* Require knowledge */
1811 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1819 /* Hack -- Identical art_flags! */
1820 for (i = 0; i < TR_FLAG_SIZE; i++)
1821 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1823 /* Hack -- Require identical "cursed" status */
1824 if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1826 /* Hack -- Require identical "broken" status */
1827 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1830 /* Hack -- require semi-matching "inscriptions" */
1831 if (o_ptr->inscription && j_ptr->inscription &&
1832 (o_ptr->inscription != j_ptr->inscription))
1835 /* Hack -- normally require matching "inscriptions" */
1836 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1838 /* Hack -- normally require matching "discounts" */
1839 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1842 /* They match, so they must be similar */
1847 * @brief 両オブジェクトをスロットに重ねることができるかどうかを返す。
1848 * Determine if an item can absorb a second item.
1849 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1850 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1851 * @return 重ね合わせ可能ならばTRUEを返す。
1853 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1855 int total = o_ptr->number + j_ptr->number;
1858 /* Are these objects similar? */
1859 max_num = object_similar_part(o_ptr, j_ptr);
1861 /* Return if not similar */
1862 if (!max_num) return FALSE;
1864 /* Maximal "stacking" limit */
1865 if (total > max_num) return (0);
1868 /* They match, so they must be similar */
1874 * @brief 両オブジェクトをスロットに重ね合わせる。
1875 * Allow one item to "absorb" another, assuming they are similar
1876 * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
1877 * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
1880 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1882 int max_num = object_similar_part(o_ptr, j_ptr);
1883 int total = o_ptr->number + j_ptr->number;
1884 int diff = (total > max_num) ? total - max_num : 0;
1886 /* Combine quantity, lose excess items */
1887 o_ptr->number = (total > max_num) ? max_num : total;
1889 /* Hack -- blend "known" status */
1890 if (object_is_known(j_ptr)) object_known(o_ptr);
1892 /* Hack -- clear "storebought" if only one has it */
1893 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1894 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1896 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1897 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1900 /* Hack -- blend "mental" status */
1901 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1903 /* Hack -- blend "inscriptions" */
1904 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1906 /* Hack -- blend "feelings" */
1907 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1909 /* Hack -- could average discounts XXX XXX XXX */
1910 /* Hack -- save largest discount XXX XXX XXX */
1911 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1913 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1914 if (o_ptr->tval == TV_ROD)
1916 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1917 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1920 /* Hack -- if wands are stacking, combine the charges. -LM- */
1921 if (o_ptr->tval == TV_WAND)
1923 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1929 * @brief tvalとsvalに対応するベースアイテムのIDを返す。
1930 * Find the index of the object_kind with the given tval and sval
1931 * @param tval 検索したいベースアイテムのtval
1932 * @param sval 検索したいベースアイテムのsval
1935 IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval)
1942 for (k = 1; k < max_k_idx; k++)
1944 object_kind *k_ptr = &k_info[k];
1946 /* Require correct tval */
1947 if (k_ptr->tval != tval) continue;
1950 if (k_ptr->sval == sval) return (k);
1952 /* Ignore illegal items */
1953 if (sval != SV_ANY) continue;
1955 /* Apply the randomizer */
1956 if (!one_in_(++num)) continue;
1958 /* Use this value */
1962 /* Return this choice */
1970 msg_format(_("アイテムがない (%d,%d)", "No object (%d,%d)"), tval, sval);
1980 * @brief オブジェクトを初期化する
1981 * Wipe an object clean.
1982 * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
1985 void object_wipe(object_type *o_ptr)
1987 /* Wipe the structure */
1988 (void)WIPE(o_ptr, object_type);
1993 * @brief オブジェクトを複製する
1994 * Wipe an object clean.
1995 * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
1996 * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
1999 void object_copy(object_type *o_ptr, object_type *j_ptr)
2001 /* Copy the structure */
2002 (void)COPY(o_ptr, j_ptr, object_type);
2007 * @brief オブジェクト構造体にベースアイテムを作成する
2008 * Prepare an object based on an object kind.
2009 * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
2010 * @param k_idx 新たに作成したいベースアイテム情報のID
2013 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
2015 object_kind *k_ptr = &k_info[k_idx];
2017 /* Clear the record */
2020 /* Save the kind index */
2021 o_ptr->k_idx = k_idx;
2023 /* Efficiency -- tval/sval */
2024 o_ptr->tval = k_ptr->tval;
2025 o_ptr->sval = k_ptr->sval;
2027 /* Default "pval" */
2028 o_ptr->pval = k_ptr->pval;
2030 /* Default number */
2033 /* Default weight */
2034 o_ptr->weight = k_ptr->weight;
2037 o_ptr->to_h = k_ptr->to_h;
2038 o_ptr->to_d = k_ptr->to_d;
2039 o_ptr->to_a = k_ptr->to_a;
2042 o_ptr->ac = k_ptr->ac;
2043 o_ptr->dd = k_ptr->dd;
2044 o_ptr->ds = k_ptr->ds;
2046 /* Default activation */
2047 if (k_ptr->act_idx > 0) o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
2049 /* Hack -- worthless items are always "broken" */
2050 if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
2052 /* Hack -- cursed items are always "cursed" */
2053 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
2054 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2055 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
2056 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2057 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2058 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2063 * @brief 上質以上のオブジェクトに与えるための各種ボーナスを正規乱数も加えて算出する。
2064 * Help determine an "enchantment bonus" for an object.
2065 * @param max ボーナス値の限度
2066 * @param level ボーナス値に加味する基準生成階
2067 * @return 算出されたボーナス値
2069 * To avoid floating point but still provide a smooth distribution of bonuses,\n
2070 * we simply round the results of division in such a way as to "average" the\n
2071 * correct floating point value.\n
2073 * This function has been changed. It uses "randnor()" to choose values from\n
2074 * a normal distribution, whose mean moves from zero towards the max as the\n
2075 * level increases, and whose standard deviation is equal to 1/4 of the max,\n
2076 * and whose values are forced to lie between zero and the max, inclusive.\n
2078 * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
2079 * rare to get the "full" enchantment on an object, even a deep levels.\n
2081 * It is always possible (albeit unlikely) to get the "full" enchantment.\n
2083 * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
2085 * N 0 1 2 3 4 5 6 7 8 9 10\n
2086 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n
2087 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03\n
2088 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05\n
2089 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05\n
2090 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11\n
2091 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41\n
2092 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65\n
2093 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94\n
2094 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78\n
2095 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64\n
2096 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62\n
2097 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33\n
2098 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38\n
2099 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53\n
2100 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53\n
2101 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27\n
2102 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72\n
2103 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07\n
2105 int m_bonus(int max, DEPTH level)
2107 int bonus, stand, extra, value;
2110 /* Paranoia -- enforce maximal "level" */
2111 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
2114 /* The "bonus" moves towards the max */
2115 bonus = ((max * level) / MAX_DEPTH);
2117 /* Hack -- determine fraction of error */
2118 extra = ((max * level) % MAX_DEPTH);
2120 /* Hack -- simulate floating point computations */
2121 if (randint0(MAX_DEPTH) < extra) bonus++;
2124 /* The "stand" is equal to one quarter of the max */
2127 /* Hack -- determine fraction of error */
2130 /* Hack -- simulate floating point computations */
2131 if (randint0(4) < extra) stand++;
2134 /* Choose an "interesting" value */
2135 value = randnor(bonus, stand);
2137 /* Enforce the minimum value */
2138 if (value < 0) return (0);
2140 /* Enforce the maximum value */
2141 if (value > max) return (max);
2149 * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user
2150 * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ
2153 static void object_mention(object_type *o_ptr)
2155 char o_name[MAX_NLEN];
2157 object_aware(o_ptr);
2158 object_known(o_ptr);
2160 /* Mark the item as fully known */
2161 o_ptr->ident |= (IDENT_MENTAL);
2164 object_desc(o_name, o_ptr, 0);
2165 msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name);
2169 * @brief INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2170 * Mega-Hack -- Attempt to create one of the "Special Objects"
2171 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2172 * @return 生成に成功したらTRUEを返す。
2174 * We are only called from "make_object()", and we assume that\n
2175 * "apply_magic()" is called immediately after we return.\n
2177 * Note -- see "make_artifact()" and "apply_magic()"\n
2179 static bool make_artifact_special(object_type *o_ptr)
2182 KIND_OBJECT_IDX k_idx = 0;
2184 /*! @note 地上ではキャンセルする / No artifacts in the town */
2185 if (!dun_level) return (FALSE);
2187 /*! @note get_obj_num_hookによる指定がある場合は生成をキャンセルする / Themed object */
2188 if (get_obj_num_hook) return (FALSE);
2190 /*! @note 全固定アーティファクト中からIDの若い順に生成対象とその確率を走査する / Check the artifact list (just the "specials") */
2191 for (i = 0; i < max_a_idx; i++)
2193 artifact_type *a_ptr = &a_info[i];
2195 /*! @note アーティファクト名が空の不正なデータは除外する / Skip "empty" artifacts */
2196 if (!a_ptr->name) continue;
2198 /*! @note 既に生成回数がカウントされたアーティファクト、QUESTITEMと非INSTA_ARTは除外 / Cannot make an artifact twice */
2199 if (a_ptr->cur_num) continue;
2200 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2201 if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue;
2203 /*! @note アーティファクト生成階が現在に対して足りない場合は高確率で1/(不足階層*2)を満たさないと生成リストに加えられない /
2204 * XXX XXX Enforce minimum "depth" (loosely) */
2205 if (a_ptr->level > object_level)
2207 /* @note / Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2208 int d = (a_ptr->level - object_level) * 2;
2209 if (!one_in_(d)) continue;
2212 /*! @note 1/(レア度)の確率を満たさないと除外される / Artifact "rarity roll" */
2213 if (!one_in_(a_ptr->rarity)) continue;
2215 /*! @note INSTA_ART型固定アーティファクトのベースアイテムもチェック対象とする。ベースアイテムの生成階層が足りない場合1/(不足階層*5) を満たさないと除外される。 /
2216 * Find the base object. XXX XXX Enforce minimum "object" level (loosely). Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2217 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2218 if (k_info[k_idx].level > object_level)
2220 int d = (k_info[k_idx].level - object_level) * 5;
2221 if (!one_in_(d)) continue;
2224 /*! @note 前述の条件を満たしたら、後のIDのアーティファクトはチェックせずすぐ確定し生成処理に移す /
2225 * Assign the template. Mega-Hack -- mark the item as an artifact. Hack: Some artifacts get random extra powers. Success. */
2226 object_prep(o_ptr, k_idx);
2229 random_artifact_resistance(o_ptr, a_ptr);
2233 /*! @note 全INSTA_ART固定アーティファクトを試行しても決まらなかった場合 FALSEを返す / Failure */
2239 * @brief 非INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2240 * Mega-Hack -- Attempt to create one of the "Special Objects"
2241 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2242 * @return 生成に成功したらTRUEを返す。
2244 * Attempt to change an object into an artifact\n
2245 * This routine should only be called by "apply_magic()"\n
2246 * Note -- see "make_artifact_special()" and "apply_magic()"\n
2248 static bool make_artifact(object_type *o_ptr)
2253 /* No artifacts in the town */
2254 if (!dun_level) return (FALSE);
2256 /* Paranoia -- no "plural" artifacts */
2257 if (o_ptr->number != 1) return (FALSE);
2259 /* Check the artifact list (skip the "specials") */
2260 for (i = 0; i < max_a_idx; i++)
2262 artifact_type *a_ptr = &a_info[i];
2264 /* Skip "empty" items */
2265 if (!a_ptr->name) continue;
2267 /* Cannot make an artifact twice */
2268 if (a_ptr->cur_num) continue;
2270 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2272 if (a_ptr->gen_flags & TRG_INSTA_ART) continue;
2274 /* Must have the correct fields */
2275 if (a_ptr->tval != o_ptr->tval) continue;
2276 if (a_ptr->sval != o_ptr->sval) continue;
2278 /* XXX XXX Enforce minimum "depth" (loosely) */
2279 if (a_ptr->level > dun_level)
2281 /* Acquire the "out-of-depth factor" */
2282 int d = (a_ptr->level - dun_level) * 2;
2284 /* Roll for out-of-depth creation */
2285 if (!one_in_(d)) continue;
2288 /* We must make the "rarity roll" */
2289 if (!one_in_(a_ptr->rarity)) continue;
2291 /* Hack -- mark the item as an artifact */
2294 /* Hack: Some artifacts get random extra powers */
2295 random_artifact_resistance(o_ptr, a_ptr);
2307 * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
2308 * Choose random ego type
2309 * @param slot 取得したいエゴの装備部位
2310 * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
2311 * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
2313 static byte get_random_ego(byte slot, bool good)
2316 ego_item_type *e_ptr;
2320 for (i = 1; i < max_e_idx; i++)
2324 if (e_ptr->slot == slot
2325 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2328 total += (255 / e_ptr->rarity);
2332 value = randint1(total);
2334 for (i = 1; i < max_e_idx; i++)
2338 if (e_ptr->slot == slot
2339 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2342 value -= (255 / e_ptr->rarity);
2343 if (value <= 0L) break;
2351 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2352 * Apply magic to an item known to be a "weapon"
2353 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2354 * @param level 生成基準階
2355 * @param power 生成ランク
2358 * Hack -- note special base damage dice boosting\n
2359 * Hack -- note special processing for weapon/digger\n
2361 static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
2363 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
2364 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
2366 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
2367 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
2369 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2371 tohit2 = (tohit2+1)/2;
2372 todam2 = (todam2+1)/2;
2379 o_ptr->to_h += tohit1;
2380 o_ptr->to_d += todam1;
2386 o_ptr->to_h += tohit2;
2387 o_ptr->to_d += todam2;
2395 o_ptr->to_h -= tohit1;
2396 o_ptr->to_d -= todam1;
2401 /* Penalize again */
2402 o_ptr->to_h -= tohit2;
2403 o_ptr->to_d -= todam2;
2406 /* Cursed (if "bad") */
2407 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2410 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2413 switch (o_ptr->tval)
2420 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2421 create_artifact(o_ptr, FALSE);
2423 /* Special Ego-item */
2424 o_ptr->name2 = EGO_DIGGING;
2428 else if (power < -1)
2430 /* Hack -- Horrible digging bonus */
2431 o_ptr->pval = 0 - (5 + randint1(5));
2437 /* Hack -- Reverse digging bonus */
2438 o_ptr->pval = 0 - (o_ptr->pval);
2452 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2454 create_artifact(o_ptr, FALSE);
2459 /* Roll for an ego-item */
2460 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2461 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2463 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2465 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2470 switch (o_ptr->name2)
2473 if (one_in_(4) && (level > 40))
2474 add_flag(o_ptr->art_flags, TR_BLOWS);
2478 add_flag(o_ptr->art_flags, TR_RES_POIS);
2480 add_flag(o_ptr->art_flags, TR_WARNING);
2482 case EGO_KILL_DRAGON:
2484 add_flag(o_ptr->art_flags, TR_RES_POIS);
2488 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2490 case EGO_SLAYING_WEAPON:
2491 if (one_in_(3)) /* double damage */
2499 while (one_in_(o_ptr->dd));
2505 while (one_in_(o_ptr->ds));
2510 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2512 if (o_ptr->tval == TV_SWORD && one_in_(3))
2514 add_flag(o_ptr->art_flags, TR_VORPAL);
2519 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2525 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
2527 add_flag(o_ptr->art_flags, TR_DEX);
2529 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2532 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
2534 case EGO_EARTHQUAKES:
2535 if (one_in_(3) && (level > 60))
2536 add_flag(o_ptr->art_flags, TR_BLOWS);
2538 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
2542 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2546 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2548 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2550 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2551 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2554 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2555 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2556 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2557 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2561 if (!o_ptr->art_name)
2563 /* Hack -- Super-charge the damage dice */
2564 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2566 /* Hack -- Lower the damage dice */
2567 if (o_ptr->dd > 9) o_ptr->dd = 9;
2572 else if (power < -1)
2574 /* Roll for ego-item */
2575 if (randint0(MAX_DEPTH) < level)
2579 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2580 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2586 switch (o_ptr->name2)
2589 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2590 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2592 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2593 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2594 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2595 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2596 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2597 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2611 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2613 create_artifact(o_ptr, FALSE);
2616 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2630 if (power > 2) /* power > 2 is debug only */
2632 create_artifact(o_ptr, FALSE);
2636 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2638 switch (o_ptr->name2)
2640 case EGO_SLAYING_BOLT:
2645 /* Hack -- super-charge the damage dice */
2646 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2648 /* Hack -- restrict the damage dice */
2649 if (o_ptr->dd > 9) o_ptr->dd = 9;
2653 else if (power < -1)
2655 /* Roll for ego-item */
2656 if (randint0(MAX_DEPTH) < level)
2658 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2668 * @brief ドラゴン装備にランダムな耐性を与える
2669 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2672 static void dragon_resist(object_type * o_ptr)
2677 one_dragon_ele_resistance(o_ptr);
2679 one_high_resistance(o_ptr);
2685 * @brief オブジェクトにランダムな強いESPを与える
2686 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2689 static bool add_esp_strong(object_type *o_ptr)
2691 bool nonliv = FALSE;
2693 switch (randint1(3))
2695 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2696 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2697 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2704 * @brief オブジェクトにランダムな弱いESPを与える
2705 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2706 * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3)
2709 static void add_esp_weak(object_type *o_ptr, bool extra)
2712 u32b weak_esp_list[] = {
2724 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2725 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2727 /* Add unduplicated weak esp flags randomly */
2728 for (i = 0; i < add_count; ++ i)
2730 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2732 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2733 weak_esp_list[choice] = weak_esp_list[i];
2739 * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2740 * Apply magic to an item known to be "armor"
2741 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2742 * @param level 生成基準階
2743 * @param power 生成ランク
2746 * Hack -- note special processing for crown/helm\n
2747 * Hack -- note special processing for robe of permanence\n
2749 static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
2751 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
2752 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
2758 o_ptr->to_a += toac1;
2764 o_ptr->to_a += toac2;
2772 o_ptr->to_a -= toac1;
2777 /* Penalize again */
2778 o_ptr->to_a -= toac2;
2781 /* Cursed (if "bad") */
2782 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2787 switch (o_ptr->tval)
2791 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2792 create_artifact(o_ptr, FALSE);
2802 /* Hack -- Try for "Robes of the Magi" */
2803 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2804 (o_ptr->sval == SV_ROBE) &&
2805 (randint0(100) < 15))
2809 o_ptr->name2 = EGO_YOIYAMI;
2810 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2811 o_ptr->sval = SV_YOIYAMI_ROBE;
2817 o_ptr->name2 = EGO_PERMANENCE;
2822 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2824 create_artifact(o_ptr, FALSE);
2830 bool okay_flag = TRUE;
2832 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2834 switch (o_ptr->name2)
2837 if (o_ptr->tval != TV_HARD_ARMOR)
2843 if (o_ptr->tval != TV_SOFT_ARMOR)
2852 if (okay_flag) break;
2854 switch (o_ptr->name2)
2856 case EGO_RESISTANCE:
2858 add_flag(o_ptr->art_flags, TR_RES_POIS);
2861 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2862 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2866 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2868 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2870 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2871 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2873 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2874 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2875 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2876 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2877 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2878 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2879 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2880 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2883 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2884 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2885 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2886 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2887 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2888 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2901 if (o_ptr->sval == SV_DRAGON_SHIELD)
2903 dragon_resist(o_ptr);
2904 if (!one_in_(3)) break;
2910 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2912 create_artifact(o_ptr, FALSE);
2918 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2919 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
2920 && o_ptr->name2 == EGO_S_DWARVEN)
2927 switch (o_ptr->name2)
2930 if (!one_in_(3)) one_high_resistance(o_ptr);
2931 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2933 case EGO_REFLECTION:
2934 if (o_ptr->sval == SV_MIRROR_SHIELD)
2939 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2940 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2949 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2951 dragon_resist(o_ptr);
2952 if (!one_in_(3)) break;
2956 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2958 create_artifact(o_ptr, FALSE);
2961 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2965 else if (power < -1)
2967 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2975 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2977 dragon_resist(o_ptr);
2978 if (!one_in_(3)) break;
2983 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2985 create_artifact(o_ptr, FALSE);
2988 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
2990 switch (o_ptr->name2)
2992 case EGO_SLOW_DESCENT:
2995 one_high_resistance(o_ptr);
3001 else if (power < -1)
3003 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
3014 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3016 create_artifact(o_ptr, FALSE);
3021 bool ok_flag = TRUE;
3022 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3024 switch (o_ptr->name2)
3027 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
3028 else add_esp_weak(o_ptr, FALSE);
3032 case EGO_REGENERATION:
3033 case EGO_LORDLINESS:
3039 if (one_in_(2)) add_esp_strong(o_ptr);
3040 else add_esp_weak(o_ptr, FALSE);
3043 default:/* not existing crown (wisdom,lite, etc...) */
3047 break; /* while (1) */
3053 else if (power < -1)
3057 bool ok_flag = TRUE;
3058 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3060 switch (o_ptr->name2)
3062 case EGO_ANCIENT_CURSE:
3063 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
3064 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
3065 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3066 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3067 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3068 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3072 break; /* while (1) */
3081 if (o_ptr->sval == SV_DRAGON_HELM)
3083 dragon_resist(o_ptr);
3084 if (!one_in_(3)) break;
3090 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3092 create_artifact(o_ptr, FALSE);
3097 bool ok_flag = TRUE;
3098 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3100 switch (o_ptr->name2)
3102 case EGO_BRILLIANCE:
3104 case EGO_INFRAVISION:
3105 case EGO_H_PROTECTION:
3110 if (one_in_(2)) add_esp_strong(o_ptr);
3111 else add_esp_weak(o_ptr, FALSE);
3115 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
3116 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
3119 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3121 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
3123 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
3124 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3126 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3127 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
3128 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
3129 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3130 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3131 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3132 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3133 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
3135 default:/* not existing helm (Magi, Might, etc...)*/
3139 break; /* while (1) */
3144 else if (power < -1)
3148 bool ok_flag = TRUE;
3149 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3151 switch (o_ptr->name2)
3153 case EGO_ANCIENT_CURSE:
3157 break; /* while (1) */
3168 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3170 create_artifact(o_ptr, FALSE);
3173 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
3175 switch (o_ptr->name2)
3184 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
3185 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
3186 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
3187 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3194 else if (power < -1)
3196 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3207 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
3208 * Apply magic to an item known to be a "ring" or "amulet"
3209 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3210 * @param level 生成基準階
3211 * @param power 生成ランク
3214 * Hack -- note special "pval boost" code for ring of speed\n
3215 * Hack -- note that some items must be cursed (or blessed)\n
3217 static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
3219 /* Apply magic (good or bad) according to type */
3220 switch (o_ptr->tval)
3225 switch (o_ptr->sval)
3227 case SV_RING_ATTACKS:
3230 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
3231 if (one_in_(15)) o_ptr->pval++;
3232 if (o_ptr->pval < 1) o_ptr->pval = 1;
3238 o_ptr->ident |= (IDENT_BROKEN);
3241 o_ptr->curse_flags |= TRC_CURSED;
3244 o_ptr->pval = 0 - (o_ptr->pval);
3255 /* Strength, Constitution, Dexterity, Intelligence */
3261 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3267 o_ptr->ident |= (IDENT_BROKEN);
3270 o_ptr->curse_flags |= TRC_CURSED;
3273 o_ptr->pval = 0 - (o_ptr->pval);
3279 /* Ring of Speed! */
3282 /* Base speed (1 to 10) */
3283 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3285 /* Super-charge the ring */
3286 while (randint0(100) < 50) o_ptr->pval++;
3292 o_ptr->ident |= (IDENT_BROKEN);
3295 o_ptr->curse_flags |= TRC_CURSED;
3298 o_ptr->pval = 0 - (o_ptr->pval);
3306 case SV_RING_LORDLY:
3310 one_lordly_high_resistance(o_ptr);
3314 /* Bonus to armor class */
3315 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3319 case SV_RING_WARNING:
3321 if (one_in_(3)) one_low_esp(o_ptr);
3326 case SV_RING_SEARCHING:
3328 /* Bonus to searching */
3329 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3335 o_ptr->ident |= (IDENT_BROKEN);
3338 o_ptr->curse_flags |= TRC_CURSED;
3341 o_ptr->pval = 0 - (o_ptr->pval);
3347 /* Flames, Acid, Ice */
3348 case SV_RING_FLAMES:
3353 /* Bonus to armor class */
3354 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3358 /* Weakness, Stupidity */
3359 case SV_RING_WEAKNESS:
3360 case SV_RING_STUPIDITY:
3363 o_ptr->ident |= (IDENT_BROKEN);
3366 o_ptr->curse_flags |= TRC_CURSED;
3369 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3370 if (power > 0) power = 0 - power;
3375 /* WOE, Stupidity */
3379 o_ptr->ident |= (IDENT_BROKEN);
3382 o_ptr->curse_flags |= TRC_CURSED;
3385 o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
3386 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3387 if (power > 0) power = 0 - power;
3392 /* Ring of damage */
3393 case SV_RING_DAMAGE:
3395 /* Bonus to damage */
3396 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
3402 o_ptr->ident |= (IDENT_BROKEN);
3405 o_ptr->curse_flags |= TRC_CURSED;
3408 o_ptr->to_d = 0 - o_ptr->to_d;
3414 /* Ring of Accuracy */
3415 case SV_RING_ACCURACY:
3418 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
3424 o_ptr->ident |= (IDENT_BROKEN);
3427 o_ptr->curse_flags |= TRC_CURSED;
3430 o_ptr->to_h = 0 - o_ptr->to_h;
3436 /* Ring of Protection */
3437 case SV_RING_PROTECTION:
3439 /* Bonus to armor class */
3440 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
3446 o_ptr->ident |= (IDENT_BROKEN);
3449 o_ptr->curse_flags |= TRC_CURSED;
3452 o_ptr->to_a = 0 - o_ptr->to_a;
3458 /* Ring of Slaying */
3459 case SV_RING_SLAYING:
3461 /* Bonus to damage and to hit */
3462 o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
3463 o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
3469 o_ptr->ident |= (IDENT_BROKEN);
3472 o_ptr->curse_flags |= TRC_CURSED;
3474 /* Reverse bonuses */
3475 o_ptr->to_h = 0 - o_ptr->to_h;
3476 o_ptr->to_d = 0 - o_ptr->to_d;
3482 case SV_RING_MUSCLE:
3484 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
3485 if (one_in_(4)) o_ptr->pval++;
3491 o_ptr->ident |= (IDENT_BROKEN);
3494 o_ptr->curse_flags |= TRC_CURSED;
3496 /* Reverse bonuses */
3497 o_ptr->pval = 0 - o_ptr->pval;
3502 case SV_RING_AGGRAVATION:
3505 o_ptr->ident |= (IDENT_BROKEN);
3508 o_ptr->curse_flags |= TRC_CURSED;
3510 if (power > 0) power = 0 - power;
3514 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3515 || (power > 2)) /* power > 2 is debug only */
3517 o_ptr->pval = MIN(o_ptr->pval, 4);
3518 /* Randart amulet */
3519 create_artifact(o_ptr, FALSE);
3521 else if ((power == 2) && one_in_(2))
3523 while(!o_ptr->name2)
3525 int tmp = m_bonus(10, level);
3526 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3527 switch(randint1(28))
3530 o_ptr->name2 = EGO_RING_THROW;
3533 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3534 o_ptr->name2 = EGO_RING_REGEN;
3537 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3538 o_ptr->name2 = EGO_RING_LITE;
3541 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3542 o_ptr->name2 = EGO_RING_TELEPORT;
3545 if (o_ptr->to_h) break;
3546 o_ptr->name2 = EGO_RING_TO_H;
3549 if (o_ptr->to_d) break;
3550 o_ptr->name2 = EGO_RING_TO_D;
3553 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3554 o_ptr->name2 = EGO_RING_SLAY;
3557 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3558 o_ptr->name2 = EGO_RING_WIZARD;
3561 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3562 o_ptr->name2 = EGO_RING_HERO;
3565 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3566 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3567 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3568 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3571 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3572 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;
3573 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3574 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3575 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3578 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3579 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;
3580 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3581 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3582 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3585 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3586 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;
3587 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3588 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3591 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3592 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;
3593 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3594 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3596 case 21: case 22: case 23: case 24: case 25: case 26:
3597 switch (o_ptr->sval)
3600 if (!one_in_(3)) break;
3601 o_ptr->name2 = EGO_RING_D_SPEED;
3603 case SV_RING_DAMAGE:
3604 case SV_RING_ACCURACY:
3605 case SV_RING_SLAYING:
3606 if (one_in_(2)) break;
3607 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3610 o_ptr->name2 = EGO_RING_BERSERKER;
3611 o_ptr->to_h -= 2+randint1(4);
3612 o_ptr->to_d += 2+randint1(4);
3615 case SV_RING_PROTECTION:
3616 o_ptr->name2 = EGO_RING_SUPER_AC;
3617 o_ptr->to_a += 7 + m_bonus(5, level);
3619 case SV_RING_RES_FEAR:
3620 o_ptr->name2 = EGO_RING_HERO;
3623 if (one_in_(2)) break;
3624 o_ptr->name2 = EGO_RING_HUNTER;
3626 case SV_RING_SEARCHING:
3627 o_ptr->name2 = EGO_RING_STEALTH;
3629 case SV_RING_TELEPORTATION:
3630 o_ptr->name2 = EGO_RING_TELE_AWAY;
3632 case SV_RING_RES_BLINDNESS:
3634 o_ptr->name2 = EGO_RING_RES_LITE;
3636 o_ptr->name2 = EGO_RING_RES_DARK;
3638 case SV_RING_LORDLY:
3639 if (!one_in_(20)) break;
3640 one_lordly_high_resistance(o_ptr);
3641 one_lordly_high_resistance(o_ptr);
3642 o_ptr->name2 = EGO_RING_TRUE;
3644 case SV_RING_SUSTAIN:
3645 if (!one_in_(4)) break;
3646 o_ptr->name2 = EGO_RING_RES_TIME;
3648 case SV_RING_FLAMES:
3649 if (!one_in_(2)) break;
3650 o_ptr->name2 = EGO_RING_DRAGON_F;
3653 if (!one_in_(2)) break;
3654 o_ptr->name2 = EGO_RING_DRAGON_C;
3656 case SV_RING_WARNING:
3657 if (!one_in_(2)) break;
3658 o_ptr->name2 = EGO_RING_M_DETECT;
3667 o_ptr->curse_flags = 0L;
3669 else if ((power == -2) && one_in_(2))
3671 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3672 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3673 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3674 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3675 o_ptr->art_flags[0] = 0;
3676 o_ptr->art_flags[1] = 0;
3677 while(!o_ptr->name2)
3679 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3683 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3684 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3687 o_ptr->name2 = EGO_RING_NO_MELEE;
3690 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3691 o_ptr->name2 = EGO_RING_AGGRAVATE;
3694 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3695 o_ptr->name2 = EGO_RING_TY_CURSE;
3698 o_ptr->name2 = EGO_RING_ALBINO;
3703 o_ptr->ident |= (IDENT_BROKEN);
3706 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3714 switch (o_ptr->sval)
3716 /* Amulet of wisdom/charisma */
3717 case SV_AMULET_INTELLIGENCE:
3718 case SV_AMULET_WISDOM:
3719 case SV_AMULET_CHARISMA:
3721 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3727 o_ptr->ident |= (IDENT_BROKEN);
3730 o_ptr->curse_flags |= (TRC_CURSED);
3732 /* Reverse bonuses */
3733 o_ptr->pval = 0 - o_ptr->pval;
3739 /* Amulet of brilliance */
3740 case SV_AMULET_BRILLIANCE:
3742 o_ptr->pval = 1 + m_bonus(3, level);
3743 if (one_in_(4)) o_ptr->pval++;
3749 o_ptr->ident |= (IDENT_BROKEN);
3752 o_ptr->curse_flags |= (TRC_CURSED);
3754 /* Reverse bonuses */
3755 o_ptr->pval = 0 - o_ptr->pval;
3761 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3765 o_ptr->curse_flags |= (TRC_CURSED);
3770 case SV_AMULET_RESISTANCE:
3772 if (one_in_(5)) one_high_resistance(o_ptr);
3773 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3777 /* Amulet of searching */
3778 case SV_AMULET_SEARCHING:
3780 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
3786 o_ptr->ident |= (IDENT_BROKEN);
3789 o_ptr->curse_flags |= (TRC_CURSED);
3791 /* Reverse bonuses */
3792 o_ptr->pval = 0 - (o_ptr->pval);
3798 /* Amulet of the Magi -- never cursed */
3799 case SV_AMULET_THE_MAGI:
3801 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3802 o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
3804 /* gain one low ESP */
3805 add_esp_weak(o_ptr, FALSE);
3810 /* Amulet of Doom -- always cursed */
3811 case SV_AMULET_DOOM:
3814 o_ptr->ident |= (IDENT_BROKEN);
3817 o_ptr->curse_flags |= (TRC_CURSED);
3820 o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
3821 o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
3822 if (power > 0) power = 0 - power;
3827 case SV_AMULET_MAGIC_MASTERY:
3829 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
3835 o_ptr->ident |= (IDENT_BROKEN);
3838 o_ptr->curse_flags |= (TRC_CURSED);
3840 /* Reverse bonuses */
3841 o_ptr->pval = 0 - o_ptr->pval;
3847 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3848 || (power > 2)) /* power > 2 is debug only */
3850 o_ptr->pval = MIN(o_ptr->pval, 4);
3851 /* Randart amulet */
3852 create_artifact(o_ptr, FALSE);
3854 else if ((power == 2) && one_in_(2))
3856 while(!o_ptr->name2)
3858 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3859 switch(randint1(21))
3862 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3863 o_ptr->name2 = EGO_AMU_SLOW_D;
3866 if (o_ptr->pval) break;
3867 o_ptr->name2 = EGO_AMU_INFRA;
3870 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3871 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3874 if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
3875 o_ptr->name2 = EGO_AMU_HOLD_EXP;
3878 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3879 o_ptr->name2 = EGO_AMU_LEVITATION;
3881 case 10: case 11: case 21:
3882 o_ptr->name2 = EGO_AMU_AC;
3885 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3886 if (m_bonus(10, level) > 8)
3887 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3889 o_ptr->name2 = EGO_AMU_RES_FIRE;
3892 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3893 if (m_bonus(10, level) > 8)
3894 o_ptr->name2 = EGO_AMU_RES_COLD_;
3896 o_ptr->name2 = EGO_AMU_RES_COLD;
3899 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3900 if (m_bonus(10, level) > 8)
3901 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3903 o_ptr->name2 = EGO_AMU_RES_ELEC;
3906 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3907 if (m_bonus(10, level) > 8)
3908 o_ptr->name2 = EGO_AMU_RES_ACID_;
3910 o_ptr->name2 = EGO_AMU_RES_ACID;
3912 case 16: case 17: case 18: case 19: case 20:
3913 switch (o_ptr->sval)
3915 case SV_AMULET_TELEPORT:
3916 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3917 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3918 else o_ptr->name2 = EGO_AMU_TELEPORT;
3920 case SV_AMULET_RESIST_ACID:
3921 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3923 case SV_AMULET_SEARCHING:
3924 o_ptr->name2 = EGO_AMU_STEALTH;
3926 case SV_AMULET_BRILLIANCE:
3927 if (!one_in_(3)) break;
3928 o_ptr->name2 = EGO_AMU_IDENT;
3930 case SV_AMULET_CHARISMA:
3931 if (!one_in_(3)) break;
3932 o_ptr->name2 = EGO_AMU_CHARM;
3934 case SV_AMULET_THE_MAGI:
3935 if (one_in_(2)) break;
3936 o_ptr->name2 = EGO_AMU_GREAT;
3938 case SV_AMULET_RESISTANCE:
3939 if (!one_in_(5)) break;
3940 o_ptr->name2 = EGO_AMU_DEFENDER;
3942 case SV_AMULET_TELEPATHY:
3943 if (!one_in_(3)) break;
3944 o_ptr->name2 = EGO_AMU_DETECTION;
3950 o_ptr->curse_flags = 0L;
3952 else if ((power == -2) && one_in_(2))
3954 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3955 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3956 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3957 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3958 o_ptr->art_flags[0] = 0;
3959 o_ptr->art_flags[1] = 0;
3960 while(!o_ptr->name2)
3962 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3966 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3967 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3970 o_ptr->name2 = EGO_AMU_FOOL;
3973 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3974 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3977 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3978 o_ptr->name2 = EGO_AMU_TY_CURSE;
3981 o_ptr->name2 = EGO_AMU_NAIVETY;
3986 o_ptr->ident |= (IDENT_BROKEN);
3989 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3997 * @brief モンスターが人形のベースにできるかを返す
3998 * @param r_idx チェックしたいモンスター種族のID
3999 * @return 人形にできるならTRUEを返す
4001 static bool item_monster_okay(MONRACE_IDX r_idx)
4003 monster_race *r_ptr = &r_info[r_idx];
4006 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
4007 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
4008 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
4009 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
4010 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
4011 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
4019 * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
4020 * Apply magic to an item known to be "boring"
4021 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4022 * @param level 生成基準階
4023 * @param power 生成ランク
4026 * Hack -- note the special code for various items
4028 static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
4030 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4035 /* Apply magic (good or bad) according to type */
4036 switch (o_ptr->tval)
4045 o_ptr->ident |= (IDENT_BROKEN);
4048 o_ptr->curse_flags |= (TRC_CURSED);
4055 o_ptr->xtra4 = o_ptr->pval;
4061 /* Hack -- Torches -- random fuel */
4062 if (o_ptr->sval == SV_LITE_TORCH)
4064 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4068 /* Hack -- Lanterns -- random fuel */
4069 if (o_ptr->sval == SV_LITE_LANTERN)
4071 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4075 if (power > 2) /* power > 2 is debug only */
4077 create_artifact(o_ptr, FALSE);
4079 else if ((power == 2) || ((power == 1) && one_in_(3)))
4081 while (!o_ptr->name2)
4085 bool okay_flag = TRUE;
4087 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
4089 switch (o_ptr->name2)
4092 if (o_ptr->sval == SV_LITE_FEANOR)
4100 else if (power == -2)
4102 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
4104 switch (o_ptr->name2)
4106 case EGO_LITE_DARKNESS:
4109 if (o_ptr->sval == SV_LITE_TORCH)
4111 add_flag(o_ptr->art_flags, TR_LITE_M1);
4113 else if (o_ptr->sval == SV_LITE_LANTERN)
4115 add_flag(o_ptr->art_flags, TR_LITE_M2);
4117 else if (o_ptr->sval == SV_LITE_FEANOR)
4119 add_flag(o_ptr->art_flags, TR_LITE_M3);
4131 /* The wand or staff gets a number of initial charges equal
4132 * to between 1/2 (+1) and the full object kind's pval. -LM-
4134 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
4140 /* Transfer the pval. -LM- */
4141 o_ptr->pval = k_ptr->pval;
4148 object_aware(o_ptr);
4149 object_known(o_ptr);
4155 PARAMETER_VALUE i = 1;
4158 monster_race *r_ptr;
4160 /* Pick a random non-unique monster race */
4163 i = randint1(max_r_idx - 1);
4165 if (!item_monster_okay(i)) continue;
4166 if (i == MON_TSUCHINOKO) continue;
4170 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4172 /* Ignore dead monsters */
4173 if (!r_ptr->rarity) continue;
4175 /* Ignore uncommon monsters */
4176 if (r_ptr->rarity > 100) continue;
4178 /* Prefer less out-of-depth monsters */
4179 if (randint0(check)) continue;
4186 /* Some figurines are cursed */
4187 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
4194 PARAMETER_VALUE i = 1;
4199 monster_race *r_ptr;
4201 if (o_ptr->sval == SV_SKELETON)
4203 match = RF9_DROP_SKELETON;
4205 else if (o_ptr->sval == SV_CORPSE)
4207 match = RF9_DROP_CORPSE;
4210 /* Hack -- Remove the monster restriction */
4211 get_mon_num_prep(item_monster_okay, NULL);
4213 /* Pick a random non-unique monster race */
4216 i = get_mon_num(dun_level);
4220 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4222 /* Ignore dead monsters */
4223 if (!r_ptr->rarity) continue;
4225 /* Ignore corpseless monsters */
4226 if (!(r_ptr->flags9 & match)) continue;
4228 /* Prefer less out-of-depth monsters */
4229 if (randint0(check)) continue;
4237 object_aware(o_ptr);
4238 object_known(o_ptr);
4244 PARAMETER_VALUE i = 1;
4246 monster_race *r_ptr;
4248 /* Pick a random monster race */
4251 i = randint1(max_r_idx - 1);
4255 /* Ignore dead monsters */
4256 if (!r_ptr->rarity) continue;
4265 msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
4267 object_aware(o_ptr);
4268 object_known(o_ptr);
4275 DEPTH obj_level = k_info[o_ptr->k_idx].level;
4277 /* Hack -- skip ruined chests */
4278 if (obj_level <= 0) break;
4280 /* Hack -- pick a "difficulty" */
4281 o_ptr->pval = randint1(obj_level);
4282 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4284 o_ptr->xtra3 = dun_level + 5;
4286 /* Never exceed "difficulty" of 55 to 59 */
4287 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4295 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
4296 * Complete the "creation" of an object by applying "magic" to the item
4297 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4299 * @param mode 生成オプション
4302 * This includes not only rolling for random bonuses, but also putting the\n
4303 * finishing touches on ego-items and artifacts, giving charges to wands and\n
4304 * staffs, giving fuel to lites, and placing traps on chests.\n
4306 * In particular, note that "Instant Artifacts", if "created" by an external\n
4307 * routine, must pass through this function to complete the actual creation.\n
4309 * The base "chance" of the item being "good" increases with the "level"\n
4310 * parameter, which is usually derived from the dungeon level, being equal\n
4311 * to the level plus 10, up to a maximum of 75. If "good" is true, then\n
4312 * the object is guaranteed to be "good". If an object is "good", then\n
4313 * the chance that the object will be "great" (ego-item or artifact), also\n
4314 * increases with the "level", being equal to half the level, plus 5, up to\n
4315 * a maximum of 20. If "great" is true, then the object is guaranteed to be\n
4316 * "great". At dungeon level 65 and below, 15/100 objects are "great".\n
4318 * If the object is not "good", there is a chance it will be "cursed", and\n
4319 * if it is "cursed", there is a chance it will be "broken". These chances\n
4320 * are related to the "good" / "great" chances above.\n
4322 * Otherwise "normal" rings and amulets will be "good" half the time and\n
4323 * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4325 * If "okay" is true, and the object is going to be "great", then there is\n
4326 * a chance that an artifact will be created. This is true even if both the\n
4327 * "good" and "great" arguments are false. As a total hack, if "great" is\n
4328 * true, then the item gets 3 extra "attempts" to become an artifact.\n
4330 void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
4332 int i, rolls, f1, f2, power;
4334 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4336 /* Maximum "level" for various things */
4337 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4339 /* Base chance of being "good" */
4342 /* Maximal chance of being "good" */
4343 if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4345 /* Base chance of being "great" */
4348 /* Maximal chance of being "great" */
4349 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4350 f2 = d_info[dungeon_type].obj_great;
4352 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4357 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4366 /* Roll for "good" */
4367 if ((mode & AM_GOOD) || magik(f1))
4372 /* Roll for "great" */
4373 if ((mode & AM_GREAT) || magik(f2))
4377 /* Roll for "special" */
4378 if (mode & AM_SPECIAL) power = 3;
4382 /* Roll for "cursed" */
4385 /* Assume "cursed" */
4388 /* Roll for "broken" */
4389 if (magik(f2)) power = -2;
4393 if (mode & AM_CURSED)
4395 /* Assume 'cursed' */
4400 /* Everything else gets more badly cursed */
4407 /* Assume no rolls */
4410 /* Get one roll if excellent */
4411 if (power >= 2) rolls = 1;
4413 /* Hack -- Get four rolls if forced great or special */
4414 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4416 /* Hack -- Get no rolls if not allowed */
4417 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4419 /* Roll for artifacts if allowed */
4420 for (i = 0; i < rolls; i++)
4422 /* Roll for an artifact */
4423 if (make_artifact(o_ptr)) break;
4424 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4426 if (make_artifact(o_ptr)) break;
4431 /* Hack -- analyze artifacts */
4432 if (object_is_fixed_artifact(o_ptr))
4434 artifact_type *a_ptr = &a_info[o_ptr->name1];
4436 /* Hack -- Mark the artifact as "created" */
4439 /* Hack -- Memorize location of artifact in saved floors */
4440 if (character_dungeon)
4441 a_ptr->floor_id = p_ptr->floor_id;
4443 /* Extract the other fields */
4444 o_ptr->pval = a_ptr->pval;
4445 o_ptr->ac = a_ptr->ac;
4446 o_ptr->dd = a_ptr->dd;
4447 o_ptr->ds = a_ptr->ds;
4448 o_ptr->to_a = a_ptr->to_a;
4449 o_ptr->to_h = a_ptr->to_h;
4450 o_ptr->to_d = a_ptr->to_d;
4451 o_ptr->weight = a_ptr->weight;
4452 o_ptr->xtra2 = a_ptr->act_idx;
4454 if (o_ptr->name1 == ART_MILIM)
4456 if(p_ptr->pseikaku == SEIKAKU_SEXY)
4462 /* Hack -- extract the "broken" flag */
4463 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4465 /* Hack -- extract the "cursed" flag */
4466 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4467 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4468 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4469 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4470 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4471 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4478 switch (o_ptr->tval)
4487 if (power) a_m_aux_1(o_ptr, lev, power);
4493 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4499 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4513 /* Elven Cloak and Black Clothes ... */
4514 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4515 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4516 o_ptr->pval = randint1(4);
4520 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4521 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4522 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4523 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4524 a_m_aux_2(o_ptr, lev, power);
4526 if (power) a_m_aux_2(o_ptr, lev, power);
4534 if (!power && (randint0(100) < 50)) power = -1;
4535 a_m_aux_3(o_ptr, lev, power);
4541 a_m_aux_4(o_ptr, lev, power);
4546 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4547 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4548 (p_ptr->pseikaku == SEIKAKU_SEXY))
4551 add_flag(o_ptr->art_flags, TR_STR);
4552 add_flag(o_ptr->art_flags, TR_INT);
4553 add_flag(o_ptr->art_flags, TR_WIS);
4554 add_flag(o_ptr->art_flags, TR_DEX);
4555 add_flag(o_ptr->art_flags, TR_CON);
4556 add_flag(o_ptr->art_flags, TR_CHR);
4559 /* Hack -- analyze ego-items */
4560 if (object_is_ego(o_ptr))
4562 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4564 /* Hack -- acquire "broken" flag */
4565 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4567 /* Hack -- acquire "cursed" flag */
4568 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4569 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4570 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4571 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4572 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4573 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4575 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4576 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4577 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4578 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4579 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4580 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4581 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4582 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4588 while (one_in_(o_ptr->dd));
4590 if (o_ptr->dd > 9) o_ptr->dd = 9;
4593 /* Hack -- apply activatin index if needed */
4594 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
4596 /* Hack -- apply extra penalties if needed */
4597 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4599 /* Hack -- obtain bonuses */
4600 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4601 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4602 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4604 /* Hack -- obtain pval */
4605 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4608 /* Hack -- apply extra bonuses if needed */
4611 /* Hack -- obtain bonuses */
4612 if (e_ptr->max_to_h)
4614 if (e_ptr->max_to_h > 127)
4615 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4616 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4618 if (e_ptr->max_to_d)
4620 if (e_ptr->max_to_d > 127)
4621 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4622 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4624 if (e_ptr->max_to_a)
4626 if (e_ptr->max_to_a > 127)
4627 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4628 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4631 /* Accuracy ego must have high to_h */
4632 if(o_ptr->name2 == EGO_ACCURACY)
4634 while(o_ptr->to_h < o_ptr->to_d + 10)
4639 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4642 /* Accuracy ego must have high to_h */
4643 if(o_ptr->name2 == EGO_VELOCITY)
4645 while(o_ptr->to_d < o_ptr->to_h + 10)
4650 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4653 /* Protection ego must have high to_a */
4654 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4656 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4659 /* Hack -- obtain pval */
4660 if (e_ptr->max_pval)
4662 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4665 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4667 else if (o_ptr->name2 == EGO_DEMON)
4669 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4671 o_ptr->pval += randint1(2);
4675 o_ptr->pval += randint1(e_ptr->max_pval);
4678 else if (o_ptr->name2 == EGO_ATTACKS)
4680 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4681 if (o_ptr->pval > 3) o_ptr->pval = 3;
4682 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4683 o_ptr->pval += randint1(2);
4685 else if (o_ptr->name2 == EGO_BAT)
4687 o_ptr->pval = randint1(e_ptr->max_pval);
4688 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4690 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4692 o_ptr->pval = randint1(e_ptr->max_pval);
4696 o_ptr->pval += randint1(e_ptr->max_pval);
4701 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4703 o_ptr->pval = randint1(o_ptr->pval);
4705 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4712 /* Examine real objects */
4715 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4717 /* Hack -- acquire "broken" flag */
4718 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4720 /* Hack -- acquire "cursed" flag */
4721 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4722 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4723 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4724 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4725 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4726 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4734 * @brief ベースアイテムが上質として扱われるかどうかを返す。
4735 * Hack -- determine if a template is "good"
4736 * @param k_idx 判定したいベースアイテムのID
4737 * @return ベースアイテムが上質ならばTRUEを返す。
4739 static bool kind_is_good(KIND_OBJECT_IDX k_idx)
4741 object_kind *k_ptr = &k_info[k_idx];
4743 /* Analyze the item type */
4744 switch (k_ptr->tval)
4746 /* Armor -- Good unless damaged */
4757 if (k_ptr->to_a < 0) return (FALSE);
4761 /* Weapons -- Good unless damaged */
4768 if (k_ptr->to_h < 0) return (FALSE);
4769 if (k_ptr->to_d < 0) return (FALSE);
4773 /* Ammo -- Arrows/Bolts are good */
4780 /* Books -- High level books are good (except Arcane books) */
4782 case TV_SORCERY_BOOK:
4783 case TV_NATURE_BOOK:
4788 case TV_DAEMON_BOOK:
4789 case TV_CRUSADE_BOOK:
4791 case TV_HISSATSU_BOOK:
4794 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4798 /* Rings -- Rings of Speed are good */
4801 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4802 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4806 /* Amulets -- Amulets of the Magi and Resistance are good */
4809 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4810 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4815 /* Assume not good */
4820 * @brief 生成階に応じたベースアイテムの生成を行う。
4821 * Attempt to make an object (normal or good/great)
4822 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4823 * @param mode オプションフラグ
4824 * @return 生成に成功したらTRUEを返す。
4826 * This routine plays nasty games to generate the "special artifacts".\n
4827 * This routine uses "object_level" for the "generation level".\n
4828 * We assume that the given object has been "wiped".\n
4830 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
4836 /* Chance of "special object" */
4837 prob = ((mode & AM_GOOD) ? 10 : 1000);
4839 /* Base level for the object */
4840 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4843 /* Generate a special object, or a normal object */
4844 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4846 KIND_OBJECT_IDX k_idx;
4849 if ((mode & AM_GOOD) && !get_obj_num_hook)
4851 /* Activate restriction (if already specified, use that) */
4852 get_obj_num_hook = kind_is_good;
4855 /* Restricted objects - prepare allocation table */
4856 if (get_obj_num_hook) get_obj_num_prep();
4858 /* Pick a random object */
4859 k_idx = get_obj_num(base);
4861 /* Restricted objects */
4862 if (get_obj_num_hook)
4864 /* Clear restriction */
4865 get_obj_num_hook = NULL;
4867 /* Reset allocation table to default */
4871 /* Handle failure */
4872 if (!k_idx) return (FALSE);
4874 /* Prepare the object */
4875 object_prep(j_ptr, k_idx);
4878 /* Apply magic (allow artifacts) */
4879 apply_magic(j_ptr, object_level, mode);
4881 /* Hack -- generate multiple spikes/missiles */
4882 switch (j_ptr->tval)
4890 j_ptr->number = (byte)damroll(6, 7);
4894 if (cheat_peek) object_mention(j_ptr);
4902 * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
4903 * Attempt to place an object (normal or good/great) at the given location.
4904 * @param y 配置したいフロアのY座標
4905 * @param x 配置したいフロアのX座標
4906 * @param mode オプションフラグ
4907 * @return 生成に成功したらTRUEを返す。
4909 * This routine plays nasty games to generate the "special artifacts".\n
4910 * This routine uses "object_level" for the "generation level".\n
4911 * This routine requires a clean floor grid destination.\n
4913 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
4918 cave_type *c_ptr = &cave[y][x];
4924 /* Paranoia -- check bounds */
4925 if (!in_bounds(y, x)) return;
4927 /* Require floor space */
4928 if (!cave_drop_bold(y, x)) return;
4930 /* Avoid stacking on other objects */
4931 if (c_ptr->o_idx) return;
4934 /* Get local object */
4937 /* Wipe the object */
4940 /* Make an object (if possible) */
4941 if (!make_object(q_ptr, mode)) return;
4944 /* Make an object */
4952 /* Acquire object */
4953 o_ptr = &o_list[o_idx];
4955 /* Structure Copy */
4956 object_copy(o_ptr, q_ptr);
4962 o_ptr->next_o_idx = c_ptr->o_idx;
4964 /* Place the object */
4965 c_ptr->o_idx = o_idx;
4975 /* Hack -- Preserve artifacts */
4976 if (object_is_fixed_artifact(q_ptr))
4978 a_info[q_ptr->name1].cur_num = 0;
4985 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
4986 * Make a treasure object
4987 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4988 * @return 生成に成功したらTRUEを返す。
4990 * The location must be a legal, clean, floor grid.
4992 bool make_gold(object_type *j_ptr)
4997 /* Hack -- Pick a Treasure variety */
4998 i = ((randint1(object_level + 2) + 2) / 2) - 1;
5000 /* Apply "extra" magic */
5001 if (one_in_(GREAT_OBJ))
5003 i += randint1(object_level + 1);
5006 /* Hack -- Creeping Coins only generate "themselves" */
5007 if (coin_type) i = coin_type;
5009 /* Do not create "illegal" Treasure Types */
5010 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
5012 /* Prepare a gold object */
5013 object_prep(j_ptr, OBJ_GOLD_LIST + i);
5015 /* Hack -- Base coin cost */
5016 base = k_info[OBJ_GOLD_LIST + i].cost;
5018 /* Determine how much the treasure is "worth" */
5019 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
5027 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
5028 * Places a treasure (Gold or Gems) at given location
5029 * @param y 配置したいフロアのY座標
5030 * @param x 配置したいフロアのX座標
5031 * @return 生成に成功したらTRUEを返す。
5033 * The location must be a legal, clean, floor grid.
5035 void place_gold(POSITION y, POSITION x)
5040 cave_type *c_ptr = &cave[y][x];
5046 /* Paranoia -- check bounds */
5047 if (!in_bounds(y, x)) return;
5049 /* Require floor space */
5050 if (!cave_drop_bold(y, x)) return;
5052 /* Avoid stacking on other objects */
5053 if (c_ptr->o_idx) return;
5056 /* Get local object */
5059 /* Wipe the object */
5062 /* Make some gold */
5063 if (!make_gold(q_ptr)) return;
5065 /* Make an object */
5073 /* Acquire object */
5074 o_ptr = &o_list[o_idx];
5076 /* Copy the object */
5077 object_copy(o_ptr, q_ptr);
5084 o_ptr->next_o_idx = c_ptr->o_idx;
5086 /* Place the object */
5087 c_ptr->o_idx = o_idx;
5099 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
5100 * Let an object fall to the ground at or near a location.
5101 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
5102 * @param chance ドロップの成功率(%)
5103 * @param y 配置したいフロアのY座標
5104 * @param x 配置したいフロアのX座標
5105 * @return 生成に成功したらオブジェクトのIDを返す。
5107 * The initial location is assumed to be "in_bounds()".\n
5109 * This function takes a parameter "chance". This is the percentage\n
5110 * chance that the item will "disappear" instead of drop. If the object\n
5111 * has been thrown, then this is the chance of disappearance on contact.\n
5113 * Hack -- this function uses "chance" to determine if it should produce\n
5114 * some form of "description" of the drop event (under the player).\n
5116 * We check several locations to see if we can find a location at which\n
5117 * the object can combine, stack, or be placed. Artifacts will try very\n
5118 * hard to be placed, including "teleporting" to a useful grid if needed.\n
5120 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
5127 POSITION ty, tx = 0;
5129 OBJECT_IDX o_idx = 0;
5130 OBJECT_IDX this_o_idx, next_o_idx = 0;
5134 char o_name[MAX_NLEN];
5140 /* Extract plural */
5141 bool plural = (j_ptr->number != 1);
5144 /* Describe object */
5145 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5148 /* Handle normal "breakage" */
5149 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
5152 msg_format("%sは消えた。", o_name);
5154 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5157 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
5174 /* Scan local grids */
5175 for (dy = -3; dy <= 3; dy++)
5177 /* Scan local grids */
5178 for (dx = -3; dx <= 3; dx++)
5182 /* Calculate actual distance */
5183 d = (dy * dy) + (dx * dx);
5185 /* Ignore distant grids */
5186 if (d > 10) continue;
5191 /* Skip illegal grids */
5192 if (!in_bounds(ty, tx)) continue;
5194 /* Require line of projection */
5195 if (!projectable(y, x, ty, tx)) continue;
5198 c_ptr = &cave[ty][tx];
5200 /* Require floor space */
5201 if (!cave_drop_bold(ty, tx)) continue;
5206 /* Scan objects in that grid */
5207 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5211 /* Acquire object */
5212 o_ptr = &o_list[this_o_idx];
5214 /* Acquire next object */
5215 next_o_idx = o_ptr->next_o_idx;
5217 /* Check for possible combination */
5218 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5224 /* Add new object */
5228 if (k > 99) continue;
5230 /* Calculate score */
5231 s = 1000 - (d + k * 5);
5233 /* Skip bad values */
5234 if (s < bs) continue;
5236 /* New best value */
5239 /* Apply the randomizer to equivalent values */
5240 if ((++bn >= 2) && !one_in_(bn)) continue;
5255 /* Handle lack of space */
5256 if (!flag && !object_is_artifact(j_ptr))
5259 msg_format("%sは消えた。", o_name);
5261 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5266 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5274 for (i = 0; !flag && (i < 1000); i++)
5277 ty = rand_spread(by, 1);
5278 tx = rand_spread(bx, 1);
5280 /* Verify location */
5281 if (!in_bounds(ty, tx)) continue;
5283 /* Bounce to that location */
5287 /* Require floor space */
5288 if (!cave_drop_bold(by, bx)) continue;
5297 int candidates = 0, pick;
5299 for (ty = 1; ty < cur_hgt - 1; ty++)
5301 for (tx = 1; tx < cur_wid - 1; tx++)
5303 /* A valid space found */
5304 if (cave_drop_bold(ty, tx)) candidates++;
5308 /* No valid place! */
5312 msg_format("%sは消えた。", o_name);
5314 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5318 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5320 /* Mega-Hack -- preserve artifacts */
5323 /* Hack -- Preserve unknown artifacts */
5324 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5326 /* Mega-Hack -- Preserve the artifact */
5327 a_info[j_ptr->name1].cur_num = 0;
5335 /* Choose a random one */
5336 pick = randint1(candidates);
5338 for (ty = 1; ty < cur_hgt - 1; ty++)
5340 for (tx = 1; tx < cur_wid - 1; tx++)
5342 if (cave_drop_bold(ty, tx))
5346 /* Is this a picked one? */
5360 c_ptr = &cave[by][bx];
5362 /* Scan objects in that grid for combination */
5363 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5367 /* Acquire object */
5368 o_ptr = &o_list[this_o_idx];
5370 /* Acquire next object */
5371 next_o_idx = o_ptr->next_o_idx;
5373 /* Check for combination */
5374 if (object_similar(o_ptr, j_ptr))
5376 /* Combine the items */
5377 object_absorb(o_ptr, j_ptr);
5386 /* Get new object */
5387 if (!done) o_idx = o_pop();
5390 if (!done && !o_idx)
5393 msg_format("%sは消えた。", o_name);
5395 msg_format("The %s disappear%s.",
5396 o_name, (plural ? "" : "s"));
5401 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5403 /* Hack -- Preserve artifacts */
5404 if (object_is_fixed_artifact(j_ptr))
5406 a_info[j_ptr->name1].cur_num = 0;
5416 /* Structure copy */
5417 object_copy(&o_list[o_idx], j_ptr);
5419 /* Access new object */
5420 j_ptr = &o_list[o_idx];
5427 j_ptr->held_m_idx = 0;
5430 j_ptr->next_o_idx = c_ptr->o_idx;
5432 /* Place the object */
5433 c_ptr->o_idx = o_idx;
5447 /* Mega-Hack -- no message if "dropped" by player */
5448 /* Message when an object falls under the player */
5449 if (chance && player_bold(by, bx))
5451 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5463 * Scatter some "great" objects near the player
5464 * @param y1 配置したいフロアのY座標
5465 * @param x1 配置したいフロアのX座標
5466 * @param num 獲得の処理回数
5467 * @param great TRUEならば必ず高級品以上を落とす
5468 * @param special TRUEならば必ず特別品を落とす
5469 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5472 void acquirement(POSITION y1, POSITION x1, int num, bool great, bool special, bool known)
5475 object_type object_type_body;
5476 BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ;
5481 /* Get local object */
5482 i_ptr = &object_type_body;
5484 /* Wipe the object */
5487 /* Make a good (or great) object (if possible) */
5488 if (!make_object(i_ptr, mode)) continue;
5492 object_aware(i_ptr);
5493 object_known(i_ptr);
5496 /* Drop the object */
5497 (void)drop_near(i_ptr, -1, y1, x1);
5502 * Scatter some "amusing" objects near the player
5505 #define AMS_NOTHING 0x00 /* No restriction */
5506 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
5507 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
5508 #define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */
5509 #define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */
5513 OBJECT_TYPE_VALUE tval;
5514 OBJECT_SUBTYPE_VALUE sval;
5519 amuse_type amuse_info[] =
5521 { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
5522 { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
5523 { TV_SPIKE, SV_ANY, 10, AMS_PILE },
5524 { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
5525 { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
5526 { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
5527 { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
5528 { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
5529 { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
5530 { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
5531 { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
5532 { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
5533 { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
5540 * @param y1 配置したいフロアのY座標
5541 * @param x1 配置したいフロアのX座標
5542 * @param num 誰得の処理回数
5543 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5546 void amusement(POSITION y1, POSITION x1, int num, bool known)
5549 object_type object_type_body;
5552 for (n = 0; amuse_info[n].tval != 0; n++)
5554 t += amuse_info[n].prob;
5561 KIND_OBJECT_IDX k_idx;
5562 ARTIFACT_IDX a_idx = 0;
5563 int r = randint0(t);
5564 bool insta_art, fixed_art;
5568 r -= amuse_info[i].prob;
5572 /* Get local object */
5573 i_ptr = &object_type_body;
5575 /* Wipe the object */
5578 /* Wipe the object */
5579 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
5581 /* Paranoia - reroll if nothing */
5582 if (!k_idx) continue;
5584 /* Search an artifact index if need */
5585 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
5586 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
5588 if (insta_art || fixed_art)
5590 for (a_idx = 1; a_idx < max_a_idx; a_idx++)
5592 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
5593 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
5594 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
5595 if (a_info[a_idx].cur_num > 0) continue;
5599 if (a_idx >= max_a_idx) continue;
5602 /* Make an object (if possible) */
5603 object_prep(i_ptr, k_idx);
5604 if (a_idx) i_ptr->name1 = a_idx;
5605 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
5607 if (amuse_info[i].flag & AMS_NO_UNIQUE)
5609 if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
5612 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
5613 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
5617 object_aware(i_ptr);
5618 object_known(i_ptr);
5621 /* Paranoia - reroll if nothing */
5622 if (!(i_ptr->k_idx)) continue;
5624 /* Drop the object */
5625 (void)drop_near(i_ptr, -1, y1, x1);
5633 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5634 * Describe the charges on an item in the inventory.
5635 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5638 void inven_item_charges(INVENTORY_IDX item)
5640 object_type *o_ptr = &inventory[item];
5642 /* Require staff/wand */
5643 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5645 /* Require known item */
5646 if (!object_is_known(o_ptr)) return;
5649 if (o_ptr->pval <= 0)
5651 msg_print("もう魔力が残っていない。");
5655 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5658 /* Multiple charges */
5659 if (o_ptr->pval != 1)
5661 /* Print a message */
5662 msg_format("You have %d charges remaining.", o_ptr->pval);
5668 /* Print a message */
5669 msg_format("You have %d charge remaining.", o_ptr->pval);
5676 * @brief アイテムの残り所持数メッセージを表示する /
5677 * Describe an item in the inventory.
5678 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5681 void inven_item_describe(INVENTORY_IDX item)
5683 object_type *o_ptr = &inventory[item];
5684 char o_name[MAX_NLEN];
5686 /* Get a description */
5687 object_desc(o_name, o_ptr, 0);
5689 /* Print a message */
5691 /* "no more" の場合はこちらで表示する */
5692 if (o_ptr->number <= 0)
5694 /*FIRST*//*ここはもう通らないかも */
5695 msg_format("もう%sを持っていない。", o_name);
5699 /* アイテム名を英日切り替え機能対応 */
5700 msg_format("まだ %sを持っている。", o_name);
5703 msg_format("You have %s.", o_name);
5709 * @brief アイテムの残り所持数メッセージを表示する /
5710 * Increase the "number" of an item in the inventory
5711 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5715 void inven_item_increase(INVENTORY_IDX item, int num)
5717 object_type *o_ptr = &inventory[item];
5720 num += o_ptr->number;
5723 if (num > 255) num = 255;
5724 else if (num < 0) num = 0;
5727 num -= (ITEM_NUMBER)o_ptr->number;
5729 /* Change the number and weight */
5732 /* Add the number */
5733 o_ptr->number += num;
5735 /* Add the weight */
5736 p_ptr->total_weight += (num * o_ptr->weight);
5738 /* Recalculate bonuses */
5739 p_ptr->update |= (PU_BONUS);
5741 /* Recalculate mana XXX */
5742 p_ptr->update |= (PU_MANA);
5744 /* Combine the pack */
5745 p_ptr->notice |= (PN_COMBINE);
5748 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5750 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5751 if (!o_ptr->number && p_ptr->ele_attack)
5753 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5755 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5757 /* Clear all temporary elemental brands */
5758 set_ele_attack(0, 0);
5766 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5767 * Erase an inventory slot if it has no more items
5768 * @param item 消去したいプレイヤーのアイテム所持スロット
5771 void inven_item_optimize(INVENTORY_IDX item)
5773 object_type *o_ptr = &inventory[item];
5775 /* Only optimize real items */
5776 if (!o_ptr->k_idx) return;
5778 /* Only optimize empty items */
5779 if (o_ptr->number) return;
5781 /* The item is in the pack */
5782 if (item < INVEN_RARM)
5789 /* Slide everything down */
5790 for (i = item; i < INVEN_PACK; i++)
5792 /* Structure copy */
5793 inventory[i] = inventory[i+1];
5796 /* Erase the "final" slot */
5797 object_wipe(&inventory[i]);
5800 p_ptr->window |= (PW_INVEN);
5803 /* The item is being wielded */
5809 /* Erase the empty slot */
5810 object_wipe(&inventory[item]);
5812 /* Recalculate bonuses */
5813 p_ptr->update |= (PU_BONUS);
5815 /* Recalculate torch */
5816 p_ptr->update |= (PU_TORCH);
5818 /* Recalculate mana XXX */
5819 p_ptr->update |= (PU_MANA);
5822 p_ptr->window |= (PW_EQUIP);
5826 p_ptr->window |= (PW_SPELL);
5830 * @brief 床上の魔道具の残り残量メッセージを表示する /
5831 * Describe the charges on an item on the floor.
5832 * @param item メッセージの対象にしたいアイテム所持スロット
5835 void floor_item_charges(INVENTORY_IDX item)
5837 object_type *o_ptr = &o_list[item];
5839 /* Require staff/wand */
5840 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5842 /* Require known item */
5843 if (!object_is_known(o_ptr)) return;
5846 if (o_ptr->pval <= 0)
5848 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5852 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5855 /* Multiple charges */
5856 if (o_ptr->pval != 1)
5858 /* Print a message */
5859 msg_format("There are %d charges remaining.", o_ptr->pval);
5865 /* Print a message */
5866 msg_format("There is %d charge remaining.", o_ptr->pval);
5873 * @brief 床上のアイテムの残り数メッセージを表示する /
5874 * Describe the charges on an item on the floor.
5875 * @param item メッセージの対象にしたいアイテム所持スロット
5878 void floor_item_describe(INVENTORY_IDX item)
5880 object_type *o_ptr = &o_list[item];
5881 char o_name[MAX_NLEN];
5883 /* Get a description */
5884 object_desc(o_name, o_ptr, 0);
5886 /* Print a message */
5888 /* "no more" の場合はこちらで表示を分ける */
5889 if (o_ptr->number <= 0)
5891 msg_format("床上には、もう%sはない。", o_name);
5895 msg_format("床上には、まだ %sがある。", o_name);
5898 msg_format("You see %s.", o_name);
5905 * @brief 床上のアイテムの数を増やす /
5906 * Increase the "number" of an item on the floor
5907 * @param item 増やしたいアイテムの所持スロット
5908 * @param num 増やしたいアイテムの数
5911 void floor_item_increase(INVENTORY_IDX item, int num)
5913 object_type *o_ptr = &o_list[item];
5916 num += o_ptr->number;
5919 if (num > 255) num = 255;
5920 else if (num < 0) num = 0;
5923 num -= (int)o_ptr->number;
5925 /* Change the number */
5926 o_ptr->number += (ITEM_NUMBER)num;
5931 * @brief 床上の数の無くなったアイテムスロットを消去する /
5932 * Optimize an item on the floor (destroy "empty" items)
5933 * @param item 消去したいアイテムの所持スロット
5936 void floor_item_optimize(INVENTORY_IDX item)
5938 object_type *o_ptr = &o_list[item];
5940 /* Paranoia -- be sure it exists */
5941 if (!o_ptr->k_idx) return;
5943 /* Only optimize empty items */
5944 if (o_ptr->number) return;
5946 /* Delete the object */
5947 delete_object_idx(item);
5952 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5953 * Check if we have space for an item in the pack without overflow
5954 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5955 * @return 溢れずに済むならTRUEを返す
5957 bool inven_carry_okay(object_type *o_ptr)
5962 if (inven_cnt < INVEN_PACK) return (TRUE);
5965 for (j = 0; j < INVEN_PACK; j++)
5967 object_type *j_ptr = &inventory[j];
5969 /* Skip non-objects */
5970 if (!j_ptr->k_idx) continue;
5972 /* Check if the two items can be combined */
5973 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5981 * @brief オブジェクトを定義された基準に従いソートするための関数 /
5982 * Check if we have space for an item in the pack without overflow
5983 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
5984 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
5985 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
5986 * @return o_ptrの方が上位ならばTRUEを返す。
5988 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5992 /* Use empty slots */
5993 if (!j_ptr->k_idx) return TRUE;
5995 /* Hack -- readable books always come first */
5996 if ((o_ptr->tval == REALM1_BOOK) &&
5997 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5998 if ((j_ptr->tval == REALM1_BOOK) &&
5999 (o_ptr->tval != REALM1_BOOK)) return FALSE;
6001 if ((o_ptr->tval == REALM2_BOOK) &&
6002 (j_ptr->tval != REALM2_BOOK)) return TRUE;
6003 if ((j_ptr->tval == REALM2_BOOK) &&
6004 (o_ptr->tval != REALM2_BOOK)) return FALSE;
6006 /* Objects sort by decreasing type */
6007 if (o_ptr->tval > j_ptr->tval) return TRUE;
6008 if (o_ptr->tval < j_ptr->tval) return FALSE;
6010 /* Non-aware (flavored) items always come last */
6011 /* Can happen in the home */
6012 if (!object_is_aware(o_ptr)) return FALSE;
6013 if (!object_is_aware(j_ptr)) return TRUE;
6015 /* Objects sort by increasing sval */
6016 if (o_ptr->sval < j_ptr->sval) return TRUE;
6017 if (o_ptr->sval > j_ptr->sval) return FALSE;
6019 /* Unidentified objects always come last */
6020 /* Objects in the home can be unknown */
6021 if (!object_is_known(o_ptr)) return FALSE;
6022 if (!object_is_known(j_ptr)) return TRUE;
6024 /* Fixed artifacts, random artifacts and ego items */
6025 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
6026 else if (o_ptr->art_name) o_type = 2;
6027 else if (object_is_ego(o_ptr)) o_type = 1;
6030 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
6031 else if (j_ptr->art_name) j_type = 2;
6032 else if (object_is_ego(j_ptr)) j_type = 1;
6035 if (o_type < j_type) return TRUE;
6036 if (o_type > j_type) return FALSE;
6038 switch (o_ptr->tval)
6044 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
6045 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
6051 /* Objects sort by increasing hit/damage bonuses */
6052 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
6053 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
6056 /* Hack: otherwise identical rods sort by
6057 increasing recharge time --dsb */
6059 if (o_ptr->pval < j_ptr->pval) return TRUE;
6060 if (o_ptr->pval > j_ptr->pval) return FALSE;
6064 /* Objects sort by decreasing value */
6065 return o_value > object_value(j_ptr);
6070 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
6071 * Add an item to the players inventory, and return the slot used.
6072 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
6073 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6075 * If the new item can combine with an existing item in the inventory,\n
6076 * it will do so, using "object_similar()" and "object_absorb()", else,\n
6077 * the item will be placed into the "proper" location in the inventory.\n
6079 * This function can be used to "over-fill" the player's pack, but only\n
6080 * once, and such an action must trigger the "overflow" code immediately.\n
6081 * Note that when the pack is being "over-filled", the new item must be\n
6082 * placed into the "overflow" slot, and the "overflow" must take place\n
6083 * before the pack is reordered, but (optionally) after the pack is\n
6084 * combined. This may be tricky. See "dungeon.c" for info.\n
6086 * Note that this code must remove any location/stack information\n
6087 * from the object once it is placed into the inventory.\n
6089 s16b inven_carry(object_type *o_ptr)
6091 INVENTORY_IDX i, j, k;
6092 INVENTORY_IDX n = -1;
6097 /* Check for combining */
6098 for (j = 0; j < INVEN_PACK; j++)
6100 j_ptr = &inventory[j];
6102 /* Skip non-objects */
6103 if (!j_ptr->k_idx) continue;
6105 /* Hack -- track last item */
6108 /* Check if the two items can be combined */
6109 if (object_similar(j_ptr, o_ptr))
6111 /* Combine the items */
6112 object_absorb(j_ptr, o_ptr);
6114 /* Increase the weight */
6115 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6117 /* Recalculate bonuses */
6118 p_ptr->update |= (PU_BONUS);
6121 p_ptr->window |= (PW_INVEN);
6130 if (inven_cnt > INVEN_PACK) return (-1);
6132 /* Find an empty slot */
6133 for (j = 0; j <= INVEN_PACK; j++)
6135 j_ptr = &inventory[j];
6137 /* Use it if found */
6138 if (!j_ptr->k_idx) break;
6145 /* Reorder the pack */
6148 /* Get the "value" of the item */
6149 s32b o_value = object_value(o_ptr);
6151 /* Scan every occupied slot */
6152 for (j = 0; j < INVEN_PACK; j++)
6154 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6161 for (k = n; k >= i; k--)
6163 /* Hack -- Slide the item */
6164 object_copy(&inventory[k+1], &inventory[k]);
6167 /* Wipe the empty slot */
6168 object_wipe(&inventory[i]);
6173 object_copy(&inventory[i], o_ptr);
6175 /* Access new object */
6176 j_ptr = &inventory[i];
6179 j_ptr->next_o_idx = 0;
6181 /* Forget monster */
6182 j_ptr->held_m_idx = 0;
6184 /* Forget location */
6185 j_ptr->iy = j_ptr->ix = 0;
6187 /* Player touches it, and no longer marked */
6188 j_ptr->marked = OM_TOUCHED;
6190 /* Increase the weight */
6191 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6193 /* Count the items */
6196 /* Recalculate bonuses */
6197 p_ptr->update |= (PU_BONUS);
6199 /* Combine and Reorder pack */
6200 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
6203 p_ptr->window |= (PW_INVEN);
6205 /* Return the slot */
6211 * @brief 装備スロットからオブジェクトを外すメインルーチン /
6212 * Take off (some of) a non-cursed equipment item
6213 * @param item オブジェクトを外したい所持テーブルのID
6215 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6217 * Note that only one item at a time can be wielded per slot.\n
6218 * Note that taking off an item when "full" may cause that item\n
6219 * to fall to the ground.\n
6220 * Return the inventory slot into which the item is placed.\n
6222 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
6233 char o_name[MAX_NLEN];
6236 /* Get the item to take off */
6237 o_ptr = &inventory[item];
6240 if (amt <= 0) return (-1);
6243 if (amt > o_ptr->number) amt = o_ptr->number;
6245 /* Get local object */
6248 /* Obtain a local object */
6249 object_copy(q_ptr, o_ptr);
6251 /* Modify quantity */
6252 q_ptr->number = amt;
6254 /* Describe the object */
6255 object_desc(o_name, q_ptr, 0);
6257 /* Took off weapon */
6258 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
6259 object_is_melee_weapon(o_ptr))
6261 act = _("を装備からはずした", "You were wielding");
6265 else if (item == INVEN_BOW)
6267 act = _("を装備からはずした", "You were holding");
6270 /* Took off light */
6271 else if (item == INVEN_LITE)
6273 act = _("を光源からはずした", "You were holding");
6276 /* Took off something */
6279 act = _("を装備からはずした", "You were wearing");
6282 /* Modify, Optimize */
6283 inven_item_increase(item, -amt);
6284 inven_item_optimize(item);
6286 /* Carry the object */
6287 slot = inven_carry(q_ptr);
6290 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
6292 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6302 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
6303 * Drop (some of) a non-cursed inventory/equipment item
6304 * @param item 所持テーブルのID
6305 * @param amt 落としたい個数
6308 * The object will be dropped "near" the current location
6310 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
6316 char o_name[MAX_NLEN];
6319 /* Access original object */
6320 o_ptr = &inventory[item];
6323 if (amt <= 0) return;
6326 if (amt > o_ptr->number) amt = o_ptr->number;
6329 /* Take off equipment */
6330 if (item >= INVEN_RARM)
6332 /* Take off first */
6333 item = inven_takeoff(item, amt);
6335 /* Access original object */
6336 o_ptr = &inventory[item];
6340 /* Get local object */
6343 /* Obtain local object */
6344 object_copy(q_ptr, o_ptr);
6346 /* Distribute charges of wands or rods */
6347 distribute_charges(o_ptr, q_ptr, amt);
6349 /* Modify quantity */
6350 q_ptr->number = amt;
6352 /* Describe local object */
6353 object_desc(o_name, q_ptr, 0);
6355 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
6357 /* Drop it near the player */
6358 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
6360 /* Modify, Describe, Optimize */
6361 inven_item_increase(item, -amt);
6362 inven_item_describe(item);
6363 inven_item_optimize(item);
6368 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
6369 * Combine items in the pack
6372 * Note special handling of the "overflow" slot
6374 void combine_pack(void)
6379 bool flag = FALSE, combined;
6385 /* Combine the pack (backwards) */
6386 for (i = INVEN_PACK; i > 0; i--)
6389 o_ptr = &inventory[i];
6391 /* Skip empty items */
6392 if (!o_ptr->k_idx) continue;
6394 /* Scan the items above that item */
6395 for (j = 0; j < i; j++)
6400 j_ptr = &inventory[j];
6402 /* Skip empty items */
6403 if (!j_ptr->k_idx) continue;
6406 * Get maximum number of the stack if these
6407 * are similar, get zero otherwise.
6409 max_num = object_similar_part(j_ptr, o_ptr);
6411 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6412 if (max_num && j_ptr->number < max_num)
6414 if (o_ptr->number + j_ptr->number <= max_num)
6419 /* Add together the item counts */
6420 object_absorb(j_ptr, o_ptr);
6422 /* One object is gone */
6425 /* Slide everything down */
6426 for (k = i; k < INVEN_PACK; k++)
6428 /* Structure copy */
6429 inventory[k] = inventory[k+1];
6432 /* Erase the "final" slot */
6433 object_wipe(&inventory[k]);
6437 int old_num = o_ptr->number;
6438 int remain = j_ptr->number + o_ptr->number - max_num;
6440 o_ptr->number -= remain;
6442 /* Add together the item counts */
6443 object_absorb(j_ptr, o_ptr);
6445 o_ptr->number = remain;
6447 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6448 if (o_ptr->tval == TV_ROD)
6450 o_ptr->pval = o_ptr->pval * remain / old_num;
6451 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6454 /* Hack -- if wands are stacking, combine the charges. -LM- */
6455 if (o_ptr->tval == TV_WAND)
6457 o_ptr->pval = o_ptr->pval * remain / old_num;
6462 p_ptr->window |= (PW_INVEN);
6474 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6478 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6479 * Reorder items in the pack
6482 * Note special handling of the "overflow" slot
6484 void reorder_pack(void)
6494 /* Re-order the pack (forwards) */
6495 for (i = 0; i < INVEN_PACK; i++)
6497 /* Mega-Hack -- allow "proper" over-flow */
6498 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6501 o_ptr = &inventory[i];
6503 /* Skip empty slots */
6504 if (!o_ptr->k_idx) continue;
6506 /* Get the "value" of the item */
6507 o_value = object_value(o_ptr);
6509 /* Scan every occupied slot */
6510 for (j = 0; j < INVEN_PACK; j++)
6512 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6515 /* Never move down */
6516 if (j >= i) continue;
6521 /* Get local object */
6524 /* Save a copy of the moving item */
6525 object_copy(q_ptr, &inventory[i]);
6527 /* Slide the objects */
6528 for (k = i; k > j; k--)
6530 /* Slide the item */
6531 object_copy(&inventory[k], &inventory[k-1]);
6534 /* Insert the moving item */
6535 object_copy(&inventory[j], q_ptr);
6538 p_ptr->window |= (PW_INVEN);
6541 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6545 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6546 * Hack -- display an object kind in the current window
6547 * @param k_idx ベースアイテムの参照ID
6550 * Include list of usable spells for readible books
6552 void display_koff(KIND_OBJECT_IDX k_idx)
6559 REALM_IDX use_realm;
6561 char o_name[MAX_NLEN];
6564 /* Erase the window */
6565 for (y = 0; y < Term->hgt; y++)
6567 /* Erase the line */
6568 Term_erase(0, y, 255);
6574 /* Get local object */
6577 /* Prepare the object */
6578 object_prep(q_ptr, k_idx);
6581 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6583 /* Mention the object name */
6584 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6586 /* Access the item's sval */
6588 use_realm = tval2realm(q_ptr->tval);
6590 /* Warriors are illiterate */
6591 if (p_ptr->realm1 || p_ptr->realm2)
6593 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6597 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6598 if (!is_magic(use_realm)) return;
6599 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6602 /* Display spells in readible books */
6606 SPELL_IDX spells[64];
6608 /* Extract spells */
6609 for (spell = 0; spell < 32; spell++)
6611 /* Check for this spell */
6612 if (fake_spell_flags[sval] & (1L << spell))
6614 /* Collect this spell */
6615 spells[num++] = spell;
6620 print_spells(0, spells, num, 2, 0, use_realm);
6625 * @brief 警告を放つアイテムを選択する /
6626 * Choose one of items that have warning flag
6627 * Calculate spell damages
6630 object_type *choose_warning_item(void)
6633 int choices[INVEN_TOTAL - INVEN_RARM];
6636 /* Paranoia -- Player has no warning ability */
6637 if (!p_ptr->warning) return NULL;
6639 /* Search Inventory */
6640 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6642 BIT_FLAGS flgs[TR_FLAG_SIZE];
6643 object_type *o_ptr = &inventory[i];
6645 object_flags(o_ptr, flgs);
6646 if (have_flag(flgs, TR_WARNING))
6648 choices[number] = i;
6653 /* Choice one of them */
6654 return number ? &inventory[choices[randint0(number)]] : NULL;
6658 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6659 * Calculate spell damages
6660 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6661 * @param typ 効果属性のID
6663 * @param max 算出した最大ダメージを返すポインタ
6666 static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
6668 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6669 int rlev = r_ptr->level;
6670 bool ignore_wraith_form = FALSE;
6672 /* Vulnerability, resistance and immunity */
6676 if (p_ptr->immune_elec)
6679 ignore_wraith_form = TRUE;
6683 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6684 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6685 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6686 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6687 if (IS_OPPOSE_ELEC())
6688 dam = (dam + 2) / 3;
6693 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6694 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6698 if (p_ptr->immune_acid)
6701 ignore_wraith_form = TRUE;
6705 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6706 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6707 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6708 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6714 if (p_ptr->immune_cold)
6717 ignore_wraith_form = TRUE;
6721 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6722 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6723 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6724 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6729 if (p_ptr->immune_fire)
6732 ignore_wraith_form = TRUE;
6736 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6737 if (prace_is_(RACE_ENT)) dam += dam / 3;
6738 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6739 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6740 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6745 ignore_wraith_form = TRUE;
6749 if (!p_ptr->blind &&
6750 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6751 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6754 ignore_wraith_form = TRUE;
6759 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6760 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6761 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6764 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6765 * "dam *= 2;" for later "dam /= 2"
6767 if (p_ptr->wraith_form) dam *= 2;
6771 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6774 ignore_wraith_form = TRUE;
6776 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6780 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6784 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6788 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6792 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6796 if (prace_is_(RACE_SPECTRE))
6799 ignore_wraith_form = TRUE;
6801 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6805 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6809 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6813 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6817 if (p_ptr->levitation) dam = (dam * 2) / 3;
6821 if (p_ptr->resist_shard) dam /= 2;
6825 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6826 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6830 if (p_ptr->mimic_form)
6832 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6835 ignore_wraith_form = TRUE;
6840 switch (p_ptr->prace)
6849 ignore_wraith_form = TRUE;
6856 if (p_ptr->align > 10) dam /= 2;
6857 else if (p_ptr->align < -10) dam *= 2;
6861 if (p_ptr->align > 10) dam *= 2;
6865 case GF_BRAIN_SMASH:
6866 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6869 ignore_wraith_form = TRUE;
6877 if (100 + rlev / 2 <= p_ptr->skill_sav)
6880 ignore_wraith_form = TRUE;
6885 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6888 ignore_wraith_form = TRUE;
6893 if (p_ptr->wraith_form && !ignore_wraith_form)
6899 if (dam > *max) *max = dam;
6903 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6904 * Calculate spell damages
6905 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6906 * @param typ 効果属性のID
6907 * @param m_idx 魔法を行使するモンスターのID
6908 * @param max 算出した最大ダメージを返すポインタ
6911 void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
6913 monster_type *m_ptr = &m_list[m_idx];
6914 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6915 spell_damcalc(m_ptr, typ, dam, max);
6919 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6920 * Calculate blow damages
6921 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6922 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6923 * @return 算出された最大ダメージを返す。
6925 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6927 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6929 bool check_wraith_form = TRUE;
6931 if (blow_ptr->method != RBM_EXPLODE)
6933 ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
6935 switch (blow_ptr->effect)
6939 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6940 dam = MAX(dam, tmp_dam * 2);
6946 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6950 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6952 check_wraith_form = FALSE;
6956 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6958 check_wraith_form = FALSE;
6962 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6964 check_wraith_form = FALSE;
6968 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6970 check_wraith_form = FALSE;
6975 check_wraith_form = FALSE;
6979 if (check_wraith_form && p_ptr->wraith_form)
6987 dam = (dam + 1) / 2;
6988 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
6996 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
6997 * Examine the grid (xx,yy) and warn the player if there are any danger
6998 * @param xx 危険性を調査するマスのX座標
6999 * @param yy 危険性を調査するマスのY座標
7000 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
7002 bool process_warning(POSITION xx, POSITION yy)
7006 char o_name[MAX_NLEN];
7008 #define WARNING_AWARE_RANGE 12
7010 static int old_damage = 0;
7012 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
7014 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
7017 monster_type *m_ptr;
7018 monster_race *r_ptr;
7020 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
7022 c_ptr = &cave[my][mx];
7024 if (!c_ptr->m_idx) continue;
7026 m_ptr = &m_list[c_ptr->m_idx];
7028 if (MON_CSLEEP(m_ptr)) continue;
7029 if (!is_hostile(m_ptr)) continue;
7031 r_ptr = &r_info[m_ptr->r_idx];
7033 /* Monster spells (only powerful ones)*/
7034 if (projectable(my, mx, yy, xx))
7036 BIT_FLAGS f4 = r_ptr->flags4;
7037 BIT_FLAGS f5 = r_ptr->a_ability_flags1;
7038 BIT_FLAGS f6 = r_ptr->a_ability_flags2;
7040 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
7042 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
7043 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
7044 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
7045 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, c_ptr->m_idx, &dam_max0);
7046 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, c_ptr->m_idx, &dam_max0);
7047 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, c_ptr->m_idx, &dam_max0);
7049 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, c_ptr->m_idx, &dam_max0);
7050 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, c_ptr->m_idx, &dam_max0);
7051 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, c_ptr->m_idx, &dam_max0);
7052 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, c_ptr->m_idx, &dam_max0);
7053 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, c_ptr->m_idx, &dam_max0);
7054 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, c_ptr->m_idx, &dam_max0);
7055 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, c_ptr->m_idx, &dam_max0);
7056 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, c_ptr->m_idx, &dam_max0);
7057 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
7058 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, c_ptr->m_idx, &dam_max0);
7059 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, c_ptr->m_idx, &dam_max0);
7060 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
7061 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, c_ptr->m_idx, &dam_max0);
7062 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, c_ptr->m_idx, &dam_max0);
7063 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, c_ptr->m_idx, &dam_max0);
7064 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, c_ptr->m_idx, &dam_max0);
7065 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, c_ptr->m_idx, &dam_max0);
7066 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, c_ptr->m_idx, &dam_max0);
7067 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, c_ptr->m_idx, &dam_max0);
7068 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, c_ptr->m_idx, &dam_max0);
7069 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
7070 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, c_ptr->m_idx, &dam_max0);
7071 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, c_ptr->m_idx, &dam_max0);
7074 /* Monster melee attacks */
7075 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
7077 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
7081 for (m = 0; m < 4; m++)
7083 /* Skip non-attacks */
7084 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
7086 /* Extract the attack info */
7087 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
7088 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
7090 if (dam_melee > dam_max0) dam_max0 = dam_melee;
7094 /* Contribution from this monster */
7095 dam_max += dam_max0;
7099 /* Prevent excessive warning */
7100 if (dam_max > old_damage)
7102 old_damage = dam_max * 3 / 2;
7104 if (dam_max > p_ptr->chp / 2)
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);
7115 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7118 else old_damage = old_damage / 2;
7120 c_ptr = &cave[yy][xx];
7121 if (((!easy_disarm && is_trap(c_ptr->feat))
7122 || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
7124 object_type *o_ptr = choose_warning_item();
7127 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7129 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7130 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7132 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7139 * エッセンス情報の構造体 / A structure for smithing
7142 int add; /* TR flag number or special essence id */
7143 cptr add_name; /* Name of this ability */
7144 ESSENCE_IDX type; /* Menu number */
7145 int essence; /* Index for carrying essences */
7146 int value; /* Needed value to add this ability */
7151 * エッセンス情報テーブル Smithing type data for Weapon smith
7154 static essence_type essence_info[] =
7156 {TR_STR, "腕力", 4, TR_STR, 20},
7157 {TR_INT, "知能", 4, TR_INT, 20},
7158 {TR_WIS, "賢さ", 4, TR_WIS, 20},
7159 {TR_DEX, "器用さ", 4, TR_DEX, 20},
7160 {TR_CON, "耐久力", 4, TR_CON, 20},
7161 {TR_CHR, "魅力", 4, TR_CHR, 20},
7162 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
7163 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
7164 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
7165 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
7166 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
7167 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
7168 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
7169 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
7170 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
7171 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
7172 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
7173 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
7174 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
7175 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
7176 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
7177 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
7178 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
7179 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
7180 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
7181 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
7182 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
7183 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
7184 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
7185 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
7186 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
7187 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
7188 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
7189 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
7190 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
7191 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
7192 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
7193 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
7194 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
7195 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
7196 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
7197 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
7198 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
7199 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
7200 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
7201 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
7202 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
7203 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
7204 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
7205 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
7206 {TR_SH_FIRE, "", 0, -2, 0},
7207 {TR_SH_ELEC, "", 0, -2, 0},
7208 {TR_SH_COLD, "", 0, -2, 0},
7209 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
7210 {TR_WARNING, "警告", 3, TR_WARNING, 20},
7211 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
7212 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
7213 {TR_LITE_2, "", 0, -2, 0},
7214 {TR_LITE_3, "", 0, -2, 0},
7215 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
7216 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
7217 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
7218 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
7219 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
7221 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
7222 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
7223 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
7224 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
7225 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
7226 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
7227 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
7228 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
7229 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
7230 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
7231 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
7232 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
7233 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
7234 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
7235 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
7236 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
7237 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
7238 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
7240 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
7241 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
7242 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
7243 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
7244 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
7245 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
7246 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
7247 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
7249 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
7250 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
7251 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
7252 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
7253 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
7254 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
7255 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
7256 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
7257 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
7258 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
7259 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
7260 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
7262 {-1, NULL, 0, -1, 0}
7265 static essence_type essence_info[] =
7267 {TR_STR, "strength", 4, TR_STR, 20},
7268 {TR_INT, "intelligence", 4, TR_INT, 20},
7269 {TR_WIS, "wisdom", 4, TR_WIS, 20},
7270 {TR_DEX, "dexterity", 4, TR_DEX, 20},
7271 {TR_CON, "constitution", 4, TR_CON, 20},
7272 {TR_CHR, "charisma", 4, TR_CHR, 20},
7273 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
7274 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
7275 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
7276 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
7277 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
7278 {TR_SPEED, "speed", 4, TR_SPEED, 12},
7279 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
7280 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
7281 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
7282 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
7283 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
7284 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
7285 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
7286 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
7287 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
7288 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
7289 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
7290 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
7291 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
7292 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
7293 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
7294 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
7295 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
7296 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
7297 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
7298 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
7299 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
7300 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
7301 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
7302 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
7303 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
7304 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
7305 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
7306 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
7307 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
7308 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
7309 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
7310 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
7311 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
7312 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
7313 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
7314 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
7315 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
7316 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
7317 {TR_SH_FIRE, "", 0, -2, 0},
7318 {TR_SH_ELEC, "", 0, -2, 0},
7319 {TR_SH_COLD, "", 0, -2, 0},
7320 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
7321 {TR_WARNING, "warning", 3, TR_WARNING, 20},
7322 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
7323 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
7324 {TR_LITE_2, "", 0, -2, 0},
7325 {TR_LITE_3, "", 0, -2, 0},
7326 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7327 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7328 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7329 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7330 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7332 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7333 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7334 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7335 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7336 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7337 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7338 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7339 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7340 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7341 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7342 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7343 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7344 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7345 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
7346 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7347 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7348 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7349 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7351 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7352 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
7353 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
7354 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
7355 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
7356 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
7357 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7358 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7360 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7361 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7362 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7363 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7364 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7365 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7366 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7367 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7368 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7369 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7370 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7371 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7373 {-1, NULL, 0, -1, 0}
7379 * エッセンス名テーブル / Essense names for Weapon smith
7382 cptr essence_name[] =
7485 cptr essence_name[] =
7588 * @brief 所持しているエッセンス一覧を表示する
7591 static void display_essence(void)
7596 for (i = 1; i < 22; i++)
7600 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7601 "Essence Num Essence Num Essence Num "), 1, 8);
7602 for (i = 0; essence_name[i]; i++)
7604 if (!essence_name[i][0]) continue;
7605 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7608 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7618 static void drain_essence(void)
7620 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7624 bool observe = FALSE;
7625 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7626 TIME_EFFECT old_timeout;
7627 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7633 OBJECT_IDX next_o_idx;
7636 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7639 item_tester_hook = object_is_weapon_armour_ammo;
7640 item_tester_no_ryoute = TRUE;
7643 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7644 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7646 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7648 /* Get the item (in the pack) */
7651 o_ptr = &inventory[item];
7654 /* Get the item (on the floor) */
7657 o_ptr = &o_list[0 - item];
7660 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7662 char o_name[MAX_NLEN];
7663 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7664 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7667 p_ptr->energy_use = 100;
7669 object_flags(o_ptr, old_flgs);
7670 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7671 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7672 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7673 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7674 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7675 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7676 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7677 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7678 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7680 old_to_a = o_ptr->to_a;
7682 old_to_h = o_ptr->to_h;
7683 old_to_d = o_ptr->to_d;
7686 old_pval = o_ptr->pval;
7687 old_name2 = o_ptr->name2;
7688 old_timeout = o_ptr->timeout;
7689 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7690 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7691 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7692 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7693 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7694 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7695 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7696 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7697 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7698 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7699 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7700 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7701 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7702 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7703 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7704 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7705 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7706 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7707 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7711 next_o_idx = o_ptr->next_o_idx;
7712 marked = o_ptr->marked;
7713 weight = o_ptr->weight;
7714 number = o_ptr->number;
7716 object_prep(o_ptr, o_ptr->k_idx);
7720 o_ptr->next_o_idx=next_o_idx;
7721 o_ptr->marked=marked;
7722 o_ptr->number = number;
7723 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7724 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7725 o_ptr->ident |= (IDENT_MENTAL);
7726 object_aware(o_ptr);
7727 object_known(o_ptr);
7729 object_flags(o_ptr, new_flgs);
7731 for (i = 0; essence_info[i].add_name; i++)
7733 essence_type *es_ptr = &essence_info[i];
7734 PARAMETER_VALUE pval = 0;
7736 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7737 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7739 if (es_ptr->add < TR_FLAG_MAX &&
7740 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7741 have_flag(old_flgs, es_ptr->add))
7745 drain_value[es_ptr->essence] += 10 * pval;
7747 else if (es_ptr->essence != -2)
7749 drain_value[es_ptr->essence] += 10;
7751 else if (es_ptr->add == TR_SH_FIRE)
7753 drain_value[TR_BRAND_FIRE] += 10;
7754 drain_value[TR_RES_FIRE] += 10;
7756 else if (es_ptr->add == TR_SH_ELEC)
7758 drain_value[TR_BRAND_ELEC] += 10;
7759 drain_value[TR_RES_ELEC] += 10;
7761 else if (es_ptr->add == TR_SH_COLD)
7763 drain_value[TR_BRAND_COLD] += 10;
7764 drain_value[TR_RES_COLD] += 10;
7766 else if (es_ptr->add == TR_LITE_2)
7768 drain_value[TR_LITE_1] += 20;
7770 else if (es_ptr->add == TR_LITE_3)
7772 drain_value[TR_LITE_1] += 30;
7777 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7779 drain_value[TR_INT] += 5;
7780 drain_value[TR_WIS] += 5;
7782 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7784 drain_value[TR_BRAND_POIS] += 5;
7785 drain_value[TR_BRAND_ACID] += 5;
7786 drain_value[TR_BRAND_ELEC] += 5;
7787 drain_value[TR_BRAND_FIRE] += 5;
7788 drain_value[TR_BRAND_COLD] += 5;
7790 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7792 drain_value[TR_INT] += 10;
7794 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7796 drain_value[TR_STR] += 10;
7798 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7800 drain_value[TR_DEX] += 10;
7802 if (old_name2 == EGO_2WEAPON)
7804 drain_value[TR_DEX] += 20;
7806 if (object_is_weapon_ammo(o_ptr))
7808 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7810 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7812 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7813 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7814 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7815 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7817 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7819 drain_value[i] *= number;
7820 drain_value[i] = drain_value[i] * dec / 4;
7821 drain_value[i] = MAX(drain_value[i], 0);
7822 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7830 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7834 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7836 for (i = 0; essence_name[i]; i++)
7838 if (!essence_name[i][0]) continue;
7839 if (!drain_value[i]) continue;
7841 p_ptr->magic_num1[i] += drain_value[i];
7842 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7844 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7848 /* Apply autodestroy/inscription to the drained item */
7849 autopick_alter_item(item, TRUE);
7851 /* Combine the pack */
7852 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
7855 p_ptr->window |= (PW_INVEN);
7859 * @brief 付加するエッセンスの大別を選択する
7860 * @return 選んだエッセンスの大別ID
7862 static COMMAND_CODE choose_essence(void)
7864 COMMAND_CODE mode = 0;
7866 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7869 cptr menu_name[] = {
7879 cptr menu_name[] = {
7889 const COMMAND_CODE mode_max = 7;
7892 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7895 #endif /* ALLOW_REPEAT */
7904 for (i = 0; i < mode_max; i++)
7906 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7907 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7909 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7910 prt("Choose from menu.", 0, 0);
7929 menu_line += mode_max - 1;
7938 if (menu_line > mode_max) menu_line -= mode_max;
7949 for (i = 0; i < mode_max; i++)
7950 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7952 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7958 if (isupper(choice)) choice = (char)tolower(choice);
7960 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7961 mode = (int)choice - 'a' + 1;
7968 #endif /* ALLOW_REPEAT */
7973 * @brief エッセンスを実際に付加する
7974 * @param mode エッセンスの大別ID
7977 static void add_essence(ESSENCE_IDX mode)
7989 char o_name[MAX_NLEN];
7991 essence_type *es_ptr;
7992 bool able[22] = { 0 };
7994 int menu_line = (use_menu ? 1 : 0);
7996 for (i = 0; essence_info[i].add_name; i++)
7998 es_ptr = &essence_info[i];
8000 if (es_ptr->type != mode) continue;
8005 if (!repeat_pull(&i) || i<0 || i>=max_num)
8007 #endif /* ALLOW_REPEAT */
8010 /* Nothing chosen yet */
8016 /* Build a prompt */
8017 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
8018 if (use_menu) screen_save();
8020 /* Get a spell from the user */
8022 choice = (always_show_list || use_menu) ? ESCAPE:1;
8025 if( choice==ESCAPE ) choice = ' ';
8026 else if( !get_com(out_val, &choice, FALSE) )break;
8028 if (use_menu && choice != ' ')
8042 menu_line += (max_num-1);
8065 menu_line = max_num;
8079 if (menu_line > max_num) menu_line -= max_num;
8081 /* Request redraw */
8082 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
8085 if (!redraw || use_menu)
8089 char dummy[80], dummy2[80];
8097 /* Save the screen */
8098 if (!use_menu) screen_save();
8100 for (y = 1; y < 24; y++)
8103 /* Print header(s) */
8105 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
8108 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
8111 for (ctr = 0; ctr < max_num; ctr++)
8113 es_ptr = &essence_info[num[ctr]];
8117 if (ctr == (menu_line-1))
8118 strcpy(dummy, _("》 ", "> "));
8119 else strcpy(dummy, " ");
8122 /* letter/number for power selection */
8125 sprintf(dummy, "%c) ",I2A(ctr));
8128 strcat(dummy, es_ptr->add_name);
8133 if (es_ptr->essence != -1)
8135 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
8136 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
8142 case ESSENCE_SH_FIRE:
8143 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
8144 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
8145 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8147 case ESSENCE_SH_ELEC:
8148 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
8149 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
8150 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8152 case ESSENCE_SH_COLD:
8153 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
8154 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
8155 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8157 case ESSENCE_RESISTANCE:
8158 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8159 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8160 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8161 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8162 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8164 case ESSENCE_SUSTAIN:
8165 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8166 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8167 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8168 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8169 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8174 if (!able[ctr]) col = TERM_RED;
8176 if (es_ptr->essence != -1)
8178 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
8182 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
8185 c_prt(col, dummy2, ctr+2, x);
8195 /* Restore the screen */
8206 ask = (isupper(choice));
8209 if (ask) choice = (char)tolower(choice);
8211 /* Extract request */
8212 i = (islower(choice) ? A2I(choice) : -1);
8215 /* Totally Illegal */
8216 if ((i < 0) || (i >= max_num) || !able[i])
8228 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
8230 /* Belay that order */
8231 if (!get_check(tmp_val)) continue;
8238 /* Restore the screen */
8239 if (redraw) screen_load();
8246 #endif /* ALLOW_REPEAT */
8248 es_ptr = &essence_info[num[i]];
8250 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8251 item_tester_tval = TV_GLOVES;
8252 else if (mode == 1 || mode == 5)
8253 item_tester_hook = item_tester_hook_melee_ammo;
8254 else if (es_ptr->add == ESSENCE_ATTACK)
8255 item_tester_hook = object_allow_enchant_weapon;
8256 else if (es_ptr->add == ESSENCE_AC)
8257 item_tester_hook = object_is_armour;
8259 item_tester_hook = object_is_weapon_armour_ammo;
8260 item_tester_no_ryoute = TRUE;
8263 q = _("どのアイテムを改良しますか?", "Improve which item? ");
8264 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
8266 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8268 /* Get the item (in the pack) */
8271 o_ptr = &inventory[item];
8274 /* Get the item (on the floor) */
8277 o_ptr = &o_list[0 - item];
8280 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
8282 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
8286 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8288 use_essence = es_ptr->value;
8289 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
8290 if (o_ptr->number > 1)
8292 use_essence *= o_ptr->number;
8293 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
8296 if (es_ptr->essence != -1)
8298 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8300 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8303 if (is_pval_flag(es_ptr->add))
8305 if (o_ptr->pval < 0)
8307 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
8310 else if (es_ptr->add == TR_BLOWS)
8312 if (o_ptr->pval > 1)
8314 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
8318 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8320 else if (o_ptr->pval > 0)
8322 use_essence *= o_ptr->pval;
8323 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8329 PARAMETER_VALUE pval;
8330 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8332 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
8333 strcpy(tmp_val, "1");
8335 if (!get_string(tmp, tmp_val, 1)) return;
8336 pval = (PARAMETER_VALUE)atoi(tmp_val);
8337 if (pval > limit) pval = limit;
8338 else if (pval < 1) pval = 1;
8339 o_ptr->pval += pval;
8340 use_essence *= pval;
8341 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8344 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8346 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8350 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8357 strcpy(tmp_val, "1");
8358 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
8359 val = atoi(tmp_val);
8360 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8361 else if (val < 1) val = 1;
8363 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8364 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8366 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8369 get_to_h = ((val+1)/2+randint0(val/2+1));
8370 get_to_d = ((val+1)/2+randint0(val/2+1));
8371 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8372 o_ptr->to_h += get_to_h;
8373 o_ptr->to_d += get_to_d;
8375 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8376 if (es_ptr->add == ESSENCE_ATTACK)
8378 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8380 msg_print(_("改良に失敗した。", "You failed to enchant."));
8381 p_ptr->energy_use = 100;
8386 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8387 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8390 else if (es_ptr->add == ESSENCE_AC)
8392 if (o_ptr->to_a >= p_ptr->lev/5+5)
8394 msg_print(_("改良に失敗した。", "You failed to enchant."));
8395 p_ptr->energy_use = 100;
8400 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8405 o_ptr->xtra3 = es_ptr->add + 1;
8410 bool success = TRUE;
8414 case ESSENCE_SH_FIRE:
8415 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8420 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8421 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8423 case ESSENCE_SH_ELEC:
8424 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8429 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8430 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8432 case ESSENCE_SH_COLD:
8433 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8438 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8439 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8441 case ESSENCE_RESISTANCE:
8442 case ESSENCE_SUSTAIN:
8443 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))
8448 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8449 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8450 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8451 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8456 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8459 if (es_ptr->add == ESSENCE_SUSTAIN)
8461 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8462 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8463 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8464 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8468 o_ptr->xtra3 = es_ptr->add + 1;
8472 p_ptr->energy_use = 100;
8475 msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name);
8477 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8480 /* Combine the pack */
8481 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8484 p_ptr->window |= (PW_INVEN);
8491 static void erase_essence(void)
8496 char o_name[MAX_NLEN];
8497 BIT_FLAGS flgs[TR_FLAG_SIZE];
8499 item_tester_hook = object_is_smith;
8502 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
8503 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
8505 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8507 /* Get the item (in the pack) */
8510 o_ptr = &inventory[item];
8513 /* Get the item (on the floor) */
8516 o_ptr = &o_list[0 - item];
8519 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8520 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
8522 p_ptr->energy_use = 100;
8524 if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE)
8526 o_ptr->to_h -= (o_ptr->xtra4>>8);
8527 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8529 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8530 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8533 object_flags(o_ptr, flgs);
8534 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8535 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8537 /* Combine the pack */
8538 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8541 p_ptr->window |= (PW_INVEN);
8545 * @brief 鍛冶コマンドのメインルーチン
8546 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8549 void do_cmd_kaji(bool only_browse)
8551 COMMAND_CODE mode = 0;
8554 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8558 if (p_ptr->confused)
8560 msg_print(_("混乱していて作業できない!", "You are too confused!"));
8565 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8570 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8576 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8578 #endif /* ALLOW_REPEAT */
8580 if (only_browse) screen_save();
8582 if (!only_browse) screen_save();
8588 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8589 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8590 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8591 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8592 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8593 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8595 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8596 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8597 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8598 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8599 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8600 prt(format("Choose command from menu."), 0, 0);
8627 if (menu_line > 5) menu_line -= 5;
8636 prt(" a) エッセンス一覧", 2, 14);
8637 prt(" b) エッセンス抽出", 3, 14);
8638 prt(" c) エッセンス消去", 4, 14);
8639 prt(" d) エッセンス付加", 5, 14);
8640 prt(" e) 武器/防具強化", 6, 14);
8641 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8643 prt(" a) List essences", 2, 14);
8644 prt(" b) Extract essence", 3, 14);
8645 prt(" c) Remove essence", 4, 14);
8646 prt(" d) Add essence", 5, 14);
8647 prt(" e) Enchant weapon/armor", 6, 14);
8648 if (!get_com("Command :", &choice, TRUE))
8685 /* Clear lines, position cursor (really should use strlen here) */
8686 Term_erase(14, 21, 255);
8687 Term_erase(14, 20, 255);
8688 Term_erase(14, 19, 255);
8689 Term_erase(14, 18, 255);
8690 Term_erase(14, 17, 255);
8691 Term_erase(14, 16, 255);
8693 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8694 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8696 prt(&temp[j], line, 15);
8701 if (!only_browse) screen_load();
8702 } while (only_browse);
8706 #endif /* ALLOW_REPEAT */
8710 case 1: display_essence();break;
8711 case 2: drain_essence();break;
8712 case 3: erase_essence();break;
8714 mode = choose_essence();
8719 case 5: add_essence(10);break;
8725 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8726 * Torches have special abilities when they are flaming.
8727 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8728 * @param flgs 特別に追加するフラグを返す参照ポインタ
8731 void torch_flags(object_type *o_ptr, u32b *flgs)
8733 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8735 if (o_ptr->xtra4 > 0)
8737 add_flag(flgs, TR_BRAND_FIRE);
8738 add_flag(flgs, TR_KILL_UNDEAD);
8739 add_flag(flgs, TR_THROW);
8745 * @brief 投擲時たいまつにダイスを与える。
8746 * Torches have special abilities when they are flaming.
8747 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8748 * @param dd 特別なダイス数を返す参照ポインタ
8749 * @param ds 特別なダイス面数を返す参照ポインタ
8752 void torch_dice(object_type *o_ptr, int *dd, int *ds)
8754 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8756 if (o_ptr->xtra4 > 0)
8765 * @brief 投擲時命中したたいまつの寿命を縮める。
8766 * Torches have special abilities when they are flaming.
8767 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8770 void torch_lost_fuel(object_type *o_ptr)
8772 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8774 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8775 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;