3 * @brief オブジェクトの実装 / Object code, part 2
6 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
8 * This software may be copied and distributed for educational, research,\n
9 * and not for profit purposes provided that this copyright and statement\n
10 * are included in all such copies. Other copyrights may also apply.\n
11 * 2014 Deskull rearranged comment for Doxygen.\n
15 #include "object-hook.h"
16 #include "object-curse.h"
18 static void one_sustain(object_type *o_ptr);
21 static cptr const kaji_tips[5] =
24 "現在持っているエッセンスの一覧を表示する。",
25 "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。",
26 "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。",
27 "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。",
28 "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。",
30 "Display essences you have.",
31 "Extract essences from an item. The item become non magical.",
32 "Remove added essences from an equipment which was improved before. The removed essence will be ruined.",
33 "Add essences to an item. The improved items or artifacts cannot be reimprove.",
34 "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.",
39 * @brief 対象のオブジェクトにランダムな能力維持を一つ付加する。/ Choose one random sustain
41 * @param o_ptr 対象のオブジェクト構造体ポインタ
44 static void one_sustain(object_type *o_ptr)
48 case 0: add_flag(o_ptr->art_flags, TR_SUST_STR); break;
49 case 1: add_flag(o_ptr->art_flags, TR_SUST_INT); break;
50 case 2: add_flag(o_ptr->art_flags, TR_SUST_WIS); break;
51 case 3: add_flag(o_ptr->art_flags, TR_SUST_DEX); break;
52 case 4: add_flag(o_ptr->art_flags, TR_SUST_CON); break;
53 case 5: add_flag(o_ptr->art_flags, TR_SUST_CHR); break;
58 * @brief 床上、モンスター所持でスタックされたアイテムを削除しスタックを補完する / Excise a dungeon object from any stacks
59 * @param o_idx 削除対象のオブジェクト構造体ポインタ
62 void excise_object_idx(OBJECT_IDX o_idx)
66 OBJECT_IDX this_o_idx, next_o_idx = 0;
67 OBJECT_IDX prev_o_idx = 0;
70 j_ptr = &o_list[o_idx];
73 if (j_ptr->held_m_idx)
78 m_ptr = &m_list[j_ptr->held_m_idx];
80 /* Scan all objects in the grid */
81 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
84 o_ptr = &o_list[this_o_idx];
86 /* Acquire next object */
87 next_o_idx = o_ptr->next_o_idx;
89 if (this_o_idx == o_idx)
94 /* Remove from list */
95 m_ptr->hold_o_idx = next_o_idx;
103 /* Previous object */
104 k_ptr = &o_list[prev_o_idx];
106 /* Remove from list */
107 k_ptr->next_o_idx = next_o_idx;
110 /* Forget next pointer */
111 o_ptr->next_o_idx = 0;
116 /* Save prev_o_idx */
117 prev_o_idx = this_o_idx;
126 POSITION y = j_ptr->iy;
127 POSITION x = j_ptr->ix;
132 /* Scan all objects in the grid */
133 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
136 o_ptr = &o_list[this_o_idx];
138 /* Acquire next object */
139 next_o_idx = o_ptr->next_o_idx;
141 if (this_o_idx == o_idx)
146 /* Remove from list */
147 c_ptr->o_idx = next_o_idx;
155 /* Previous object */
156 k_ptr = &o_list[prev_o_idx];
158 /* Remove from list */
159 k_ptr->next_o_idx = next_o_idx;
162 /* Forget next pointer */
163 o_ptr->next_o_idx = 0;
168 /* Save prev_o_idx */
169 prev_o_idx = this_o_idx;
175 * @brief オブジェクトを削除する /
176 * Delete a dungeon object
177 * @param o_idx 削除対象のオブジェクト構造体ポインタ
180 * Handle "stacks" of objects correctly.
182 void delete_object_idx(OBJECT_IDX o_idx)
187 excise_object_idx(o_idx);
190 j_ptr = &o_list[o_idx];
193 if (!(j_ptr->held_m_idx))
211 * @brief フロアにマスに落ちているオブジェクトを全て削除する / Deletes all objects at given location
212 * Delete a dungeon object
213 * @param y 削除したフロアマスのY座標
214 * @param x 削除したフロアマスのX座標
217 void delete_object(POSITION y, POSITION x)
220 OBJECT_IDX this_o_idx, next_o_idx = 0;
222 /* Refuse "illegal" locations */
223 if (!in_bounds(y, x)) return;
228 /* Scan all objects in the grid */
229 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
232 o_ptr = &o_list[this_o_idx];
234 /* Acquire next object */
235 next_o_idx = o_ptr->next_o_idx;
242 /* Objects are gone */
251 * @brief グローバルオブジェクト配列に対し指定範囲のオブジェクトを整理してIDの若い順に寄せる /
252 * Move an object from index i1 to index i2 in the object list
253 * @param i1 整理したい配列の始点
254 * @param i2 整理したい配列の終点
257 static void compact_objects_aux(OBJECT_IDX i1, OBJECT_IDX i2)
264 if (i1 == i2) return;
267 for (i = 1; i < o_max; i++)
271 /* Skip "dead" objects */
272 if (!o_ptr->k_idx) continue;
274 /* Repair "next" pointers */
275 if (o_ptr->next_o_idx == i1)
278 o_ptr->next_o_idx = i2;
284 if (o_ptr->held_m_idx)
288 /* Acquire monster */
289 m_ptr = &m_list[o_ptr->held_m_idx];
292 if (m_ptr->hold_o_idx == i1)
295 m_ptr->hold_o_idx = i2;
304 /* Acquire location */
312 if (c_ptr->o_idx == i1)
320 o_list[i2] = o_list[i1];
328 * @brief グローバルオブジェクト配列から優先度の低いものを削除し、データを圧縮する。 /
329 * Compact and Reorder the object list.
330 * @param size 最低でも減らしたいオブジェクト数の水準
334 * This function can be very dangerous, use with caution!\n
336 * When actually "compacting" objects, we base the saving throw on a\n
337 * combination of object level, distance from player, and current\n
340 * After "compacting" (if needed), we "reorder" the objects into a more\n
341 * compact order, and we reset the allocation info, and the "live" array.\n
343 void compact_objects(int size)
348 int cur_lev, cur_dis, chance;
354 msg_print(_("アイテム情報を圧縮しています...", "Compacting objects..."));
355 p_ptr->redraw |= (PR_MAP);
356 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
360 /* Compact at least 'size' objects */
361 for (num = 0, cnt = 1; num < size; cnt++)
363 /* Get more vicious each iteration */
366 /* Get closer each iteration */
367 cur_dis = 5 * (20 - cnt);
369 /* Examine the objects */
370 for (i = 1; i < o_max; i++)
374 /* Skip dead objects */
375 if (!o_ptr->k_idx) continue;
377 /* Hack -- High level objects start out "immune" */
378 if (k_info[o_ptr->k_idx].level > cur_lev) continue;
381 if (o_ptr->held_m_idx)
385 /* Acquire monster */
386 m_ptr = &m_list[o_ptr->held_m_idx];
391 /* Monsters protect their objects */
392 if (randint0(100) < 90) continue;
402 /* Nearby objects start out "immune" */
403 if ((cur_dis > 0) && (distance(p_ptr->y, p_ptr->x, y, x) < cur_dis)) continue;
408 /* Hack -- only compact artifacts in emergencies */
409 if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
410 (cnt < 1000)) chance = 100;
412 /* Apply the saving throw */
413 if (randint0(100) < chance) continue;
415 delete_object_idx(i);
423 /* Excise dead objects (backwards!) */
424 for (i = o_max - 1; i >= 1; i--)
428 /* Skip real objects */
429 if (o_ptr->k_idx) continue;
431 /* Move last object into open hole */
432 compact_objects_aux(o_max - 1, i);
434 /* Compress "o_max" */
441 * @brief グローバルオブジェクト配列を初期化する /
442 * Delete all the items when player leaves the level
443 * @note we do NOT visually reflect these (irrelevant) changes
445 * Hack -- we clear the "c_ptr->o_idx" field for every grid,
446 * and the "m_ptr->next_o_idx" field for every monster, since
447 * we know we are clearing every object. Technically, we only
448 * clear those fields for grids/monsters containing objects,
449 * and we clear it once for every such object.
452 void wipe_o_list(void)
456 /* Delete the existing objects */
457 for (i = 1; i < o_max; i++)
459 object_type *o_ptr = &o_list[i];
461 /* Skip dead objects */
462 if (!o_ptr->k_idx) continue;
464 /* Mega-Hack -- preserve artifacts */
465 if (!character_dungeon || preserve_mode)
467 /* Hack -- Preserve unknown artifacts */
468 if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
470 /* Mega-Hack -- Preserve the artifact */
471 a_info[o_ptr->name1].cur_num = 0;
476 if (o_ptr->held_m_idx)
481 m_ptr = &m_list[o_ptr->held_m_idx];
483 /* Hack -- see above */
484 m_ptr->hold_o_idx = 0;
492 /* Access location */
493 POSITION y = o_ptr->iy;
494 POSITION x = o_ptr->ix;
499 /* Hack -- see above */
514 * @brief グローバルオブジェクト配列から空きを取得する /
515 * Acquires and returns the index of a "free" object.
516 * @return 開いているオブジェクト要素のID
518 * This routine should almost never fail, but in case it does,
519 * we must be sure to handle "failure" of this routine.
521 OBJECT_IDX o_pop(void)
525 /* Initial allocation */
526 if (o_max < max_o_idx)
531 /* Expand object array */
537 /* Use this object */
542 /* Recycle dead objects */
543 for (i = 1; i < o_max; i++)
548 /* Skip live objects */
549 if (o_ptr->k_idx) continue;
554 /* Use this object */
559 /* Warn the player (except during dungeon creation) */
560 if (character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!"));
567 * @brief オブジェクト生成テーブルに生成制約を加える /
568 * Apply a "object restriction function" to the "object allocation table"
570 * @details 生成の制約はグローバルのget_obj_num_hook関数ポインタで加える
572 static errr get_obj_num_prep(void)
577 alloc_entry *table = alloc_kind_table;
579 /* Scan the allocation table */
580 for (i = 0; i < alloc_kind_size; i++)
582 /* Accept objects which pass the restriction, if any */
583 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
585 /* Accept this object */
586 table[i].prob2 = table[i].prob1;
589 /* Do not use this object */
592 /* Decline this object */
603 * @brief オブジェクト生成テーブルからアイテムを取得する /
604 * Choose an object kind that seems "appropriate" to the given level
606 * @return 選ばれたオブジェクトベースID
608 * This function uses the "prob2" field of the "object allocation table",\n
609 * and various local information, to calculate the "prob3" field of the\n
610 * same table, which is then used to choose an "appropriate" object, in\n
611 * a relatively efficient manner.\n
613 * It is (slightly) more likely to acquire an object of the given level\n
614 * than one of a lower level. This is done by choosing several objects\n
615 * appropriate to the given level and keeping the "hardest" one.\n
617 * Note that if no objects are "appropriate", then this function will\n
618 * fail, and return zero, but this should *almost* never happen.\n
620 OBJECT_IDX get_obj_num(DEPTH level)
623 KIND_OBJECT_IDX k_idx;
626 alloc_entry *table = alloc_kind_table;
628 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
631 if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER))
633 /* Occasional "boost" */
634 if (one_in_(GREAT_OBJ))
636 /* What a bizarre calculation */
637 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
644 /* Process probabilities */
645 for (i = 0; i < alloc_kind_size; i++)
647 /* Objects are sorted by depth */
648 if (table[i].level > level) break;
653 /* Access the index */
654 k_idx = table[i].index;
656 /* Access the actual kind */
657 k_ptr = &k_info[k_idx];
659 /* Hack -- prevent embedded chests */
660 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
663 table[i].prob3 = table[i].prob2;
666 total += table[i].prob3;
669 /* No legal objects */
670 if (total <= 0) return (0);
674 value = randint0(total);
676 /* Find the object */
677 for (i = 0; i < alloc_kind_size; i++)
679 /* Found the entry */
680 if (value < table[i].prob3) break;
683 value = value - table[i].prob3;
690 /* Try for a "better" object once (50%) or twice (10%) */
697 value = randint0(total);
699 /* Find the object */
700 for (i = 0; i < alloc_kind_size; i++)
702 /* Found the entry */
703 if (value < table[i].prob3) break;
706 value = value - table[i].prob3;
709 /* Keep the "best" one */
710 if (table[i].level < table[j].level) i = j;
713 /* Try for a "better" object twice (10%) */
720 value = randint0(total);
722 /* Find the object */
723 for (i = 0; i < alloc_kind_size; i++)
725 /* Found the entry */
726 if (value < table[i].prob3) break;
729 value = value - table[i].prob3;
732 /* Keep the "best" one */
733 if (table[i].level < table[j].level) i = j;
736 return (table[i].index);
741 * @brief オブジェクトを鑑定済にする /
742 * Known is true when the "attributes" of an object are "known".
743 * @param o_ptr 鑑定済にするオブジェクトの構造体参照ポインタ
745 * These include tohit, todam, toac, cost, and pval (charges).\n
747 * Note that "knowing" an object gives you everything that an "awareness"\n
748 * gives you, and much more. In fact, the player is always "aware" of any\n
749 * item of which he has full "knowledge".\n
751 * But having full knowledge of, say, one "wand of wonder", does not, by\n
752 * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
753 * It happens that most "identify" routines (including "buying from a shop")\n
754 * will make the player "aware" of the object as well as fully "know" it.\n
756 * This routine also removes any inscriptions generated by "feelings".\n
758 void object_known(object_type *o_ptr)
760 /* Remove "default inscriptions" */
761 o_ptr->feeling = FEEL_NONE;
763 /* Clear the "Felt" info */
764 o_ptr->ident &= ~(IDENT_SENSE);
766 /* Clear the "Empty" info */
767 o_ptr->ident &= ~(IDENT_EMPTY);
769 /* Now we know about the item */
770 o_ptr->ident |= (IDENT_KNOWN);
774 * @brief オブジェクトを*鑑定*済にする /
775 * The player is now aware of the effects of the given object.
776 * @param o_ptr *鑑定*済にするオブジェクトの構造体参照ポインタ
779 void object_aware(object_type *o_ptr)
781 bool mihanmei = !object_is_aware(o_ptr);
783 /* Fully aware of the effects */
784 k_info[o_ptr->k_idx].aware = TRUE;
786 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
787 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
791 char o_name[MAX_NLEN];
794 object_copy(q_ptr, o_ptr);
797 object_desc(o_name, q_ptr, OD_NAME_ONLY);
799 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
804 * @brief オブジェクトを試行済にする /
805 * Something has been "sampled"
806 * @param o_ptr 試行済にするオブジェクトの構造体参照ポインタ
809 void object_tried(object_type *o_ptr)
811 /* Mark it as tried (even if "aware") */
812 k_info[o_ptr->k_idx].tried = TRUE;
816 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
817 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
818 * @return 擬似鑑定結果のIDを返す。
820 byte value_check_aux1(object_type *o_ptr)
823 if (object_is_artifact(o_ptr))
826 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
833 if (object_is_ego(o_ptr))
836 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
839 return FEEL_EXCELLENT;
843 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
846 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
848 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
850 /* Good "armor" bonus */
851 if (o_ptr->to_a > 0) return FEEL_GOOD;
853 /* Good "weapon" bonus */
854 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
856 /* Default to "average" */
861 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 2 (Light).
862 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
863 * @return 擬似鑑定結果のIDを返す。
865 byte value_check_aux2(object_type *o_ptr)
867 /* Cursed items (all of them) */
868 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
870 /* Broken items (all of them) */
871 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
873 /* Artifacts -- except cursed/broken ones */
874 if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
876 /* Ego-Items -- except cursed/broken ones */
877 if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
879 /* Good armor bonus */
880 if (o_ptr->to_a > 0) return FEEL_UNCURSED;
882 /* Good weapon bonuses */
883 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
890 * @brief 未鑑定なベースアイテムの基本価格を返す /
891 * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
892 * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
893 * @return オブジェクトの未鑑定価格
895 static s32b object_value_base(object_type *o_ptr)
897 /* Aware item -- use template cost */
898 if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
900 /* Analyze the type */
905 case TV_FOOD: return (5L);
907 /* Un-aware Potions */
908 case TV_POTION: return (20L);
910 /* Un-aware Scrolls */
911 case TV_SCROLL: return (20L);
913 /* Un-aware Staffs */
914 case TV_STAFF: return (70L);
917 case TV_WAND: return (50L);
920 case TV_ROD: return (90L);
923 case TV_RING: return (45L);
925 /* Un-aware Amulets */
926 case TV_AMULET: return (45L);
928 /* Figurines, relative to monster level */
931 DEPTH level = r_info[o_ptr->pval].level;
932 if (level < 20) return level*50L;
933 else if (level < 30) return 1000+(level-20)*150L;
934 else if (level < 40) return 2500+(level-30)*350L;
935 else if (level < 50) return 6000+(level-40)*800L;
936 else return 14000+(level-50)*2000L;
940 if (!o_ptr->pval) return 1000L;
941 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
944 /* Paranoia -- Oops */
950 * @brief オブジェクトのフラグ類から価格を算出する /
951 * Return the value of the flags the object has...
952 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
953 * @param plusses フラグに与える価格の基本重み
954 * @return オブジェクトのフラグ価格
956 s32b flag_cost(object_type *o_ptr, int plusses)
959 BIT_FLAGS flgs[TR_FLAG_SIZE];
963 object_kind *k_ptr = &k_info[o_ptr->k_idx];
965 object_flags(o_ptr, flgs);
968 * Exclude fixed flags of the base item.
969 * pval bonuses of base item will be treated later.
971 for (i = 0; i < TR_FLAG_SIZE; i++)
972 flgs[i] &= ~(k_ptr->flags[i]);
974 /* Exclude fixed flags of the fixed artifact. */
975 if (object_is_fixed_artifact(o_ptr))
977 artifact_type *a_ptr = &a_info[o_ptr->name1];
979 for (i = 0; i < TR_FLAG_SIZE; i++)
980 flgs[i] &= ~(a_ptr->flags[i]);
983 /* Exclude fixed flags of the ego-item. */
984 else if (object_is_ego(o_ptr))
986 ego_item_type *e_ptr = &e_info[o_ptr->name2];
988 for (i = 0; i < TR_FLAG_SIZE; i++)
989 flgs[i] &= ~(e_ptr->flags[i]);
994 * Calucurate values of remaining flags
996 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
997 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
998 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
999 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
1000 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
1001 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
1002 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
1003 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
1004 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
1005 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
1006 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
1007 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
1008 total += (10000 + (2500 * plusses));
1009 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
1010 total += (10000 + (2500 * plusses));
1014 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
1015 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
1016 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
1017 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
1018 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
1019 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
1020 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
1021 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
1022 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
1023 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
1024 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
1025 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
1026 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
1027 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
1028 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
1029 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
1030 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
1031 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
1032 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
1033 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
1034 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
1036 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
1037 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
1038 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
1039 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
1040 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
1041 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
1042 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
1043 total += (tmp_cost * count);
1045 if (have_flag(flgs, TR_SUST_STR)) total += 850;
1046 if (have_flag(flgs, TR_SUST_INT)) total += 850;
1047 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
1048 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
1049 if (have_flag(flgs, TR_SUST_CON)) total += 850;
1050 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
1051 if (have_flag(flgs, TR_RIDING)) total += 0;
1052 if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
1053 if (have_flag(flgs, TR_THROW)) total += 5000;
1054 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
1055 if (have_flag(flgs, TR_HOLD_EXP)) total += 8500;
1059 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
1060 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
1061 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
1062 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
1063 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
1064 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
1065 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
1066 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
1067 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
1068 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
1069 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
1070 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
1071 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
1072 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
1073 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
1074 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
1075 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
1076 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
1077 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
1078 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
1079 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
1080 total += (tmp_cost * count);
1082 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
1083 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
1084 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1085 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1086 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1087 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1088 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1089 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1090 if (have_flag(flgs, TR_LEVITATION)) total += 1250;
1091 if (have_flag(flgs, TR_LITE_1)) total += 1500;
1092 if (have_flag(flgs, TR_LITE_2)) total += 2500;
1093 if (have_flag(flgs, TR_LITE_3)) total += 4000;
1094 if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
1095 if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
1096 if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
1097 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1098 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1099 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1100 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1101 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1102 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1103 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1104 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1105 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1106 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1107 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1108 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1109 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1110 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1111 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1112 if (have_flag(flgs, TR_REGEN)) total += 2500;
1113 if (have_flag(flgs, TR_WARNING)) total += 2000;
1114 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1115 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1116 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1117 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1118 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1119 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1120 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1121 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1122 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1123 if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
1124 if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
1125 if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
1126 if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
1127 if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
1128 if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
1129 if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
1130 if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
1131 if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
1132 if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
1133 if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
1134 if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
1135 if (have_flag(flgs, TR_TELEPORT))
1137 if (object_is_cursed(o_ptr))
1142 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1143 if (have_flag(flgs, TR_BLESSED)) total += 750;
1144 if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1145 if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1146 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1147 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1148 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1150 /* Also, give some extra for activatable powers... */
1151 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1153 const activation_type* const act_ptr = find_activation_info(o_ptr);
1155 total += act_ptr->value;
1164 * @brief オブジェクトの真の価格を算出する /
1165 * Return the value of the flags the object has...
1166 * @param o_ptr 本価格を確認したいオブジェクトの構造体参照ポインタ
1167 * @return オブジェクトの本価格
1169 * Return the "real" price of a "known" item, not including discounts\n
1171 * Wand and staffs get cost for each charge\n
1173 * Armor is worth an extra 100 gold per bonus point to armor class.\n
1175 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
1177 * Missiles are only worth 5 gold per bonus point, since they\n
1178 * usually appear in groups of 20, and we want the player to get\n
1179 * the same amount of cash for any "equivalent" item. Note that\n
1180 * missiles never have any of the "pval" flags, and in fact, they\n
1181 * only have a few of the available flags, primarily of the "slay"\n
1182 * and "brand" and "ignore" variety.\n
1184 * Armor with a negative armor bonus is worthless.\n
1185 * Weapons with negative hit+damage bonuses are worthless.\n
1187 * Every wearable item with a "pval" bonus is worth extra (see below).\n
1189 PRICE object_value_real(object_type *o_ptr)
1192 BIT_FLAGS flgs[TR_FLAG_SIZE];
1193 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1196 /* Hack -- "worthless" items */
1197 if (!k_info[o_ptr->k_idx].cost) return (0L);
1200 value = k_info[o_ptr->k_idx].cost;
1202 /* Extract some flags */
1203 object_flags(o_ptr, flgs);
1206 if (object_is_fixed_artifact(o_ptr))
1208 artifact_type *a_ptr = &a_info[o_ptr->name1];
1210 /* Hack -- "worthless" artifacts */
1211 if (!a_ptr->cost) return (0L);
1213 /* Hack -- Use the artifact cost instead */
1214 value = a_ptr->cost;
1215 value += flag_cost(o_ptr, o_ptr->pval);
1217 /* Don't add pval bonuses etc. */
1222 else if (object_is_ego(o_ptr))
1224 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1226 /* Hack -- "worthless" ego-items */
1227 if (!e_ptr->cost) return (0L);
1229 /* Hack -- Reward the ego-item with a bonus */
1230 value += e_ptr->cost;
1231 value += flag_cost(o_ptr, o_ptr->pval);
1239 for (i = 0; i < TR_FLAG_SIZE; i++)
1240 if (o_ptr->art_flags[i]) flag = TRUE;
1242 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1245 /* Analyze pval bonus for normal object */
1246 switch (o_ptr->tval)
1269 if (!o_ptr->pval) break;
1271 /* Hack -- Negative "pval" is always bad */
1272 if (o_ptr->pval < 0) return (0L);
1274 /* Give credit for stat bonuses */
1275 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1276 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1277 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1278 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1279 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1280 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1282 /* Give credit for stealth and searching */
1283 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1284 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1285 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1287 /* Give credit for infra-vision and tunneling */
1288 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1289 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1291 /* Give credit for extra attacks */
1292 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1294 /* Give credit for speed bonus */
1295 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1301 /* Analyze the item */
1302 switch (o_ptr->tval)
1307 /* Pay extra for charges, depending on standard number of
1308 * charges. Handle new-style wands correctly. -LM-
1310 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1316 /* Pay extra for charges, depending on standard number of
1319 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1328 /* Hack -- negative bonuses are bad */
1329 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1331 /* Give credit for bonuses */
1332 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1348 /* Hack -- negative armor bonus */
1349 if (o_ptr->to_a < 0) return (0L);
1351 /* Give credit for bonuses */
1352 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1364 /* Hack -- negative hit/damage bonuses */
1365 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1367 /* Factor in the bonuses */
1368 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1370 /* Hack -- Factor in extra damage dice and sides */
1371 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1372 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1382 /* Hack -- negative hit/damage bonuses */
1383 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1385 /* Factor in the bonuses */
1386 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1388 /* Hack -- Factor in extra damage dice and sides */
1389 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1390 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1395 /* Figurines, relative to monster level */
1398 DEPTH level = r_info[o_ptr->pval].level;
1399 if (level < 20) value = level*50L;
1400 else if (level < 30) value = 1000+(level-20)*150L;
1401 else if (level < 40) value = 2500+(level-30)*350L;
1402 else if (level < 50) value = 6000+(level-40)*800L;
1403 else value = 14000+(level-50)*2000L;
1409 if (!o_ptr->pval) value = 1000L;
1410 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1416 if (!o_ptr->pval) value = 0L;
1421 /* Worthless object */
1422 if (value < 0) return 0L;
1424 /* Return the value */
1430 * @brief オブジェクト価格算出のメインルーチン /
1431 * Return the price of an item including plusses (and charges)
1432 * @param o_ptr 判明している現価格を確認したいオブジェクトの構造体参照ポインタ
1433 * @return オブジェクトの判明している現価格
1435 * This function returns the "value" of the given item (qty one)\n
1437 * Never notice "unknown" bonuses or properties, including "curses",\n
1438 * since that would give the player information he did not have.\n
1440 * Note that discounted items stay discounted forever, even if\n
1441 * the discount is "forgotten" by the player via memory loss.\n
1443 PRICE object_value(object_type *o_ptr)
1447 /* Unknown items -- acquire a base value */
1448 if (object_is_known(o_ptr))
1450 /* Broken items -- worthless */
1451 if (object_is_broken(o_ptr)) return (0L);
1453 /* Cursed items -- worthless */
1454 if (object_is_cursed(o_ptr)) return (0L);
1456 /* Real value (see above) */
1457 value = object_value_real(o_ptr);
1460 /* Known items -- acquire the actual value */
1463 /* Hack -- Felt broken items */
1464 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1466 /* Hack -- Felt cursed items */
1467 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1469 /* Base value (see above) */
1470 value = object_value_base(o_ptr);
1474 /* Apply discount (if any) */
1475 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1478 /* Return the final value */
1485 * @brief 破壊可能なアイテムかを返す /
1486 * Determines whether an object can be destroyed, and makes fake inscription.
1487 * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
1488 * @return オブジェクトが破壊可能ならばTRUEを返す
1490 bool can_player_destroy_object(object_type *o_ptr)
1492 /* Artifacts cannot be destroyed */
1493 if (!object_is_artifact(o_ptr)) return TRUE;
1495 /* If object is unidentified, makes fake inscription */
1496 if (!object_is_known(o_ptr))
1498 byte feel = FEEL_SPECIAL;
1500 /* Hack -- Handle icky artifacts */
1501 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1503 /* Hack -- inscribe the artifact */
1504 o_ptr->feeling = feel;
1506 /* We have "felt" it (again) */
1507 o_ptr->ident |= (IDENT_SENSE);
1509 /* Combine the pack */
1510 p_ptr->notice |= (PN_COMBINE);
1512 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1517 /* Identified artifact -- Nothing to do */
1523 * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
1524 * Distribute charges of rods or wands.
1525 * @param o_ptr 分割元オブジェクトの構造体参照ポインタ source item
1526 * @param q_ptr 分割先オブジェクトの構造体参照ポインタ target item, must be of the same type as o_ptr
1527 * @param amt 分割したい回数量 number of items that are transfered
1530 * Hack -- If rods or wands are dropped, the total maximum timeout or\n
1531 * charges need to be allocated between the two stacks. If all the items\n
1532 * are being dropped, it makes for a neater message to leave the original\n
1533 * stack's pval alone. -LM-\n
1535 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1537 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1539 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1540 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1542 /* Hack -- Rods also need to have their timeouts distributed. The
1543 * dropped stack will accept all time remaining to charge up to its
1546 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1548 if (q_ptr->pval > o_ptr->timeout)
1549 q_ptr->timeout = o_ptr->timeout;
1551 q_ptr->timeout = q_ptr->pval;
1553 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1559 * @brief 魔法棒やロッドの使用回数を減らす /
1560 * @param o_ptr オブジェクトの構造体参照ポインタ source item
1561 * @param amt 減らしたい回数量 number of items that are transfered
1564 * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1565 * charges of the stack needs to be reduced, unless all the items are\n
1566 * being destroyed. -LM-\n
1568 void reduce_charges(object_type *o_ptr, int amt)
1570 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1571 (amt < o_ptr->number))
1573 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1578 * Determine if an item can "absorb" a second item
1580 * See "object_absorb()" for the actual "absorption" code.
1582 * If permitted, we allow staffs (if they are known to have equal charges
1583 * and both are either known or confirmed empty) and wands (if both are
1584 * either known or confirmed empty) and rods (in all cases) to combine.
1585 * Staffs will unstack (if necessary) when they are used, but wands and
1586 * rods will only unstack if one is dropped. -LM-
1588 * If permitted, we allow weapons/armor to stack, if fully "known".
1590 * Missiles will combine if both stacks have the same "known" status.
1591 * This is done to make unidentified stacks of missiles useful.
1593 * Food, potions, scrolls, and "easy know" items always stack.
1595 * Chests, and activatable items, never stack (for various reasons).
1599 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1601 #define MAX_STACK_SIZE 99
1605 * @brief 両オブジェクトをスロットに重ね合わせ可能な最大数を返す。
1606 * Determine if an item can partly absorb a second item. Return maximum number of stack.
1607 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1608 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1609 * @return 重ね合わせ可能なアイテム数
1611 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1615 /* Default maximum number of stack */
1616 int max_num = MAX_STACK_SIZE;
1618 /* Require identical object types */
1619 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1622 /* Analyze the items */
1623 switch (o_ptr->tval)
1625 /* Chests and Statues*/
1636 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1637 if (o_ptr->pval != j_ptr->pval) return 0;
1641 /* Figurines and Corpses*/
1646 if (o_ptr->pval != j_ptr->pval) return 0;
1652 /* Food and Potions and Scrolls */
1664 /* Require either knowledge or known empty for both staffs. */
1665 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1666 !object_is_known(o_ptr)) ||
1667 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1668 !object_is_known(j_ptr))) return 0;
1670 /* Require identical charges, since staffs are bulky. */
1671 if (o_ptr->pval != j_ptr->pval) return 0;
1680 /* Require either knowledge or known empty for both wands. */
1681 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1682 !object_is_known(o_ptr)) ||
1683 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1684 !object_is_known(j_ptr))) return 0;
1686 /* Wand charges combine in O&ZAngband. */
1692 /* Staffs and Wands and Rods */
1695 /* Prevent overflaw of timeout */
1696 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1702 /* Weapons and Armor */
1718 /* Rings, Amulets, Lites */
1724 /* Require full knowledge of both items */
1725 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1735 /* Require identical knowledge of both items */
1736 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1737 if (o_ptr->feeling != j_ptr->feeling) return 0;
1739 /* Require identical "bonuses" */
1740 if (o_ptr->to_h != j_ptr->to_h) return 0;
1741 if (o_ptr->to_d != j_ptr->to_d) return 0;
1742 if (o_ptr->to_a != j_ptr->to_a) return 0;
1744 /* Require identical "pval" code */
1745 if (o_ptr->pval != j_ptr->pval) return 0;
1747 /* Artifacts never stack */
1748 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1750 /* Require identical "ego-item" names */
1751 if (o_ptr->name2 != j_ptr->name2) return 0;
1753 /* Require identical added essence */
1754 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1755 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1757 /* Hack -- Never stack "powerful" items */
1758 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1760 /* Hack -- Never stack recharging items */
1761 if (o_ptr->timeout || j_ptr->timeout) return 0;
1763 /* Require identical "values" */
1764 if (o_ptr->ac != j_ptr->ac) return 0;
1765 if (o_ptr->dd != j_ptr->dd) return 0;
1766 if (o_ptr->ds != j_ptr->ds) return 0;
1775 /* Require knowledge */
1776 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1784 /* Hack -- Identical art_flags! */
1785 for (i = 0; i < TR_FLAG_SIZE; i++)
1786 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1788 /* Hack -- Require identical "cursed" status */
1789 if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1791 /* Hack -- Require identical "broken" status */
1792 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1795 /* Hack -- require semi-matching "inscriptions" */
1796 if (o_ptr->inscription && j_ptr->inscription &&
1797 (o_ptr->inscription != j_ptr->inscription))
1800 /* Hack -- normally require matching "inscriptions" */
1801 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1803 /* Hack -- normally require matching "discounts" */
1804 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1807 /* They match, so they must be similar */
1812 * @brief 両オブジェクトをスロットに重ねることができるかどうかを返す。
1813 * Determine if an item can absorb a second item.
1814 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1815 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1816 * @return 重ね合わせ可能ならばTRUEを返す。
1818 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1820 int total = o_ptr->number + j_ptr->number;
1823 /* Are these objects similar? */
1824 max_num = object_similar_part(o_ptr, j_ptr);
1826 /* Return if not similar */
1827 if (!max_num) return FALSE;
1829 /* Maximal "stacking" limit */
1830 if (total > max_num) return (0);
1833 /* They match, so they must be similar */
1839 * @brief 両オブジェクトをスロットに重ね合わせる。
1840 * Allow one item to "absorb" another, assuming they are similar
1841 * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
1842 * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
1845 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1847 int max_num = object_similar_part(o_ptr, j_ptr);
1848 int total = o_ptr->number + j_ptr->number;
1849 int diff = (total > max_num) ? total - max_num : 0;
1851 /* Combine quantity, lose excess items */
1852 o_ptr->number = (total > max_num) ? max_num : total;
1854 /* Hack -- blend "known" status */
1855 if (object_is_known(j_ptr)) object_known(o_ptr);
1857 /* Hack -- clear "storebought" if only one has it */
1858 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1859 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1861 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1862 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1865 /* Hack -- blend "mental" status */
1866 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1868 /* Hack -- blend "inscriptions" */
1869 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1871 /* Hack -- blend "feelings" */
1872 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1874 /* Hack -- could average discounts */
1875 /* Hack -- save largest discount */
1876 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1878 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1879 if (o_ptr->tval == TV_ROD)
1881 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1882 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1885 /* Hack -- if wands are stacking, combine the charges. -LM- */
1886 if (o_ptr->tval == TV_WAND)
1888 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1894 * @brief tvalとsvalに対応するベースアイテムのIDを返す。
1895 * Find the index of the object_kind with the given tval and sval
1896 * @param tval 検索したいベースアイテムのtval
1897 * @param sval 検索したいベースアイテムのsval
1900 IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval)
1907 for (k = 1; k < max_k_idx; k++)
1909 object_kind *k_ptr = &k_info[k];
1911 /* Require correct tval */
1912 if (k_ptr->tval != tval) continue;
1915 if (k_ptr->sval == sval) return (k);
1917 /* Ignore illegal items */
1918 if (sval != SV_ANY) continue;
1920 /* Apply the randomizer */
1921 if (!one_in_(++num)) continue;
1923 /* Use this value */
1927 /* Return this choice */
1934 msg_format(_("アイテムがない (%d,%d)", "No object (%d,%d)"), tval, sval);
1943 * @brief オブジェクトを初期化する
1944 * Wipe an object clean.
1945 * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
1948 void object_wipe(object_type *o_ptr)
1950 /* Wipe the structure */
1951 (void)WIPE(o_ptr, object_type);
1956 * @brief オブジェクトを複製する
1957 * Wipe an object clean.
1958 * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
1959 * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
1962 void object_copy(object_type *o_ptr, object_type *j_ptr)
1964 /* Copy the structure */
1965 (void)COPY(o_ptr, j_ptr, object_type);
1970 * @brief オブジェクト構造体にベースアイテムを作成する
1971 * Prepare an object based on an object kind.
1972 * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
1973 * @param k_idx 新たに作成したいベースアイテム情報のID
1976 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
1978 object_kind *k_ptr = &k_info[k_idx];
1980 /* Clear the record */
1983 /* Save the kind index */
1984 o_ptr->k_idx = k_idx;
1986 /* Efficiency -- tval/sval */
1987 o_ptr->tval = k_ptr->tval;
1988 o_ptr->sval = k_ptr->sval;
1990 /* Default "pval" */
1991 o_ptr->pval = k_ptr->pval;
1993 /* Default number */
1996 /* Default weight */
1997 o_ptr->weight = k_ptr->weight;
2000 o_ptr->to_h = k_ptr->to_h;
2001 o_ptr->to_d = k_ptr->to_d;
2002 o_ptr->to_a = k_ptr->to_a;
2005 o_ptr->ac = k_ptr->ac;
2006 o_ptr->dd = k_ptr->dd;
2007 o_ptr->ds = k_ptr->ds;
2009 /* Default activation */
2010 if (k_ptr->act_idx > 0) o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
2012 /* Hack -- worthless items are always "broken" */
2013 if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
2015 /* Hack -- cursed items are always "cursed" */
2016 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
2017 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2018 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
2019 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2020 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2021 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2026 * @brief 上質以上のオブジェクトに与えるための各種ボーナスを正規乱数も加えて算出する。
2027 * Help determine an "enchantment bonus" for an object.
2028 * @param max ボーナス値の限度
2029 * @param level ボーナス値に加味する基準生成階
2030 * @return 算出されたボーナス値
2032 * To avoid floating point but still provide a smooth distribution of bonuses,\n
2033 * we simply round the results of division in such a way as to "average" the\n
2034 * correct floating point value.\n
2036 * This function has been changed. It uses "randnor()" to choose values from\n
2037 * a normal distribution, whose mean moves from zero towards the max as the\n
2038 * level increases, and whose standard deviation is equal to 1/4 of the max,\n
2039 * and whose values are forced to lie between zero and the max, inclusive.\n
2041 * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
2042 * rare to get the "full" enchantment on an object, even a deep levels.\n
2044 * It is always possible (albeit unlikely) to get the "full" enchantment.\n
2046 * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
2048 * N 0 1 2 3 4 5 6 7 8 9 10\n
2049 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n
2050 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03\n
2051 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05\n
2052 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05\n
2053 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11\n
2054 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41\n
2055 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65\n
2056 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94\n
2057 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78\n
2058 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64\n
2059 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62\n
2060 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33\n
2061 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38\n
2062 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53\n
2063 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53\n
2064 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27\n
2065 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72\n
2066 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07\n
2068 int m_bonus(int max, DEPTH level)
2070 int bonus, stand, extra, value;
2073 /* Paranoia -- enforce maximal "level" */
2074 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
2077 /* The "bonus" moves towards the max */
2078 bonus = ((max * level) / MAX_DEPTH);
2080 /* Hack -- determine fraction of error */
2081 extra = ((max * level) % MAX_DEPTH);
2083 /* Hack -- simulate floating point computations */
2084 if (randint0(MAX_DEPTH) < extra) bonus++;
2087 /* The "stand" is equal to one quarter of the max */
2090 /* Hack -- determine fraction of error */
2093 /* Hack -- simulate floating point computations */
2094 if (randint0(4) < extra) stand++;
2097 /* Choose an "interesting" value */
2098 value = randnor(bonus, stand);
2100 /* Enforce the minimum value */
2101 if (value < 0) return (0);
2103 /* Enforce the maximum value */
2104 if (value > max) return (max);
2110 * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user
2111 * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ
2114 static void object_mention(object_type *o_ptr)
2116 char o_name[MAX_NLEN];
2118 object_aware(o_ptr);
2119 object_known(o_ptr);
2121 /* Mark the item as fully known */
2122 o_ptr->ident |= (IDENT_MENTAL);
2125 object_desc(o_name, o_ptr, 0);
2126 msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name);
2130 * @brief INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2131 * Mega-Hack -- Attempt to create one of the "Special Objects"
2132 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2133 * @return 生成に成功したらTRUEを返す。
2135 * We are only called from "make_object()", and we assume that\n
2136 * "apply_magic()" is called immediately after we return.\n
2138 * Note -- see "make_artifact()" and "apply_magic()"\n
2140 static bool make_artifact_special(object_type *o_ptr)
2143 KIND_OBJECT_IDX k_idx = 0;
2145 /*! @note 地上ではキャンセルする / No artifacts in the town */
2146 if (!dun_level) return (FALSE);
2148 /*! @note get_obj_num_hookによる指定がある場合は生成をキャンセルする / Themed object */
2149 if (get_obj_num_hook) return (FALSE);
2151 /*! @note 全固定アーティファクト中からIDの若い順に生成対象とその確率を走査する / Check the artifact list (just the "specials") */
2152 for (i = 0; i < max_a_idx; i++)
2154 artifact_type *a_ptr = &a_info[i];
2156 /*! @note アーティファクト名が空の不正なデータは除外する / Skip "empty" artifacts */
2157 if (!a_ptr->name) continue;
2159 /*! @note 既に生成回数がカウントされたアーティファクト、QUESTITEMと非INSTA_ARTは除外 / Cannot make an artifact twice */
2160 if (a_ptr->cur_num) continue;
2161 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2162 if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue;
2164 /*! @note アーティファクト生成階が現在に対して足りない場合は高確率で1/(不足階層*2)を満たさないと生成リストに加えられない /
2165 * XXX XXX Enforce minimum "depth" (loosely) */
2166 if (a_ptr->level > object_level)
2168 /* @note / Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2169 int d = (a_ptr->level - object_level) * 2;
2170 if (!one_in_(d)) continue;
2173 /*! @note 1/(レア度)の確率を満たさないと除外される / Artifact "rarity roll" */
2174 if (!one_in_(a_ptr->rarity)) continue;
2176 /*! @note INSTA_ART型固定アーティファクトのベースアイテムもチェック対象とする。ベースアイテムの生成階層が足りない場合1/(不足階層*5) を満たさないと除外される。 /
2177 * Find the base object. XXX XXX Enforce minimum "object" level (loosely). Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2178 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2179 if (k_info[k_idx].level > object_level)
2181 int d = (k_info[k_idx].level - object_level) * 5;
2182 if (!one_in_(d)) continue;
2185 /*! @note 前述の条件を満たしたら、後のIDのアーティファクトはチェックせずすぐ確定し生成処理に移す /
2186 * Assign the template. Mega-Hack -- mark the item as an artifact. Hack: Some artifacts get random extra powers. Success. */
2187 object_prep(o_ptr, k_idx);
2190 random_artifact_resistance(o_ptr, a_ptr);
2194 /*! @note 全INSTA_ART固定アーティファクトを試行しても決まらなかった場合 FALSEを返す / Failure */
2200 * @brief 非INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2201 * Mega-Hack -- Attempt to create one of the "Special Objects"
2202 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2203 * @return 生成に成功したらTRUEを返す。
2205 * Attempt to change an object into an artifact\n
2206 * This routine should only be called by "apply_magic()"\n
2207 * Note -- see "make_artifact_special()" and "apply_magic()"\n
2209 static bool make_artifact(object_type *o_ptr)
2214 /* No artifacts in the town */
2215 if (!dun_level) return (FALSE);
2217 /* Paranoia -- no "plural" artifacts */
2218 if (o_ptr->number != 1) return (FALSE);
2220 /* Check the artifact list (skip the "specials") */
2221 for (i = 0; i < max_a_idx; i++)
2223 artifact_type *a_ptr = &a_info[i];
2225 /* Skip "empty" items */
2226 if (!a_ptr->name) continue;
2228 /* Cannot make an artifact twice */
2229 if (a_ptr->cur_num) continue;
2231 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2233 if (a_ptr->gen_flags & TRG_INSTA_ART) continue;
2235 /* Must have the correct fields */
2236 if (a_ptr->tval != o_ptr->tval) continue;
2237 if (a_ptr->sval != o_ptr->sval) continue;
2239 /* XXX XXX Enforce minimum "depth" (loosely) */
2240 if (a_ptr->level > dun_level)
2242 /* Acquire the "out-of-depth factor" */
2243 int d = (a_ptr->level - dun_level) * 2;
2245 /* Roll for out-of-depth creation */
2246 if (!one_in_(d)) continue;
2249 /* We must make the "rarity roll" */
2250 if (!one_in_(a_ptr->rarity)) continue;
2252 /* Hack -- mark the item as an artifact */
2255 /* Hack: Some artifacts get random extra powers */
2256 random_artifact_resistance(o_ptr, a_ptr);
2268 * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
2269 * Choose random ego type
2270 * @param slot 取得したいエゴの装備部位
2271 * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
2272 * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
2274 static byte get_random_ego(byte slot, bool good)
2277 ego_item_type *e_ptr;
2281 for (i = 1; i < max_e_idx; i++)
2285 if (e_ptr->slot == slot
2286 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2289 total += (255 / e_ptr->rarity);
2293 value = randint1(total);
2295 for (i = 1; i < max_e_idx; i++)
2299 if (e_ptr->slot == slot
2300 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2303 value -= (255 / e_ptr->rarity);
2304 if (value <= 0L) break;
2312 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2313 * Apply magic to an item known to be a "weapon"
2314 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2315 * @param level 生成基準階
2316 * @param power 生成ランク
2319 * Hack -- note special base damage dice boosting\n
2320 * Hack -- note special processing for weapon/digger\n
2322 static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
2324 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
2325 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
2327 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
2328 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
2330 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2332 tohit2 = (tohit2+1)/2;
2333 todam2 = (todam2+1)/2;
2340 o_ptr->to_h += tohit1;
2341 o_ptr->to_d += todam1;
2347 o_ptr->to_h += tohit2;
2348 o_ptr->to_d += todam2;
2356 o_ptr->to_h -= tohit1;
2357 o_ptr->to_d -= todam1;
2362 /* Penalize again */
2363 o_ptr->to_h -= tohit2;
2364 o_ptr->to_d -= todam2;
2367 /* Cursed (if "bad") */
2368 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2371 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2374 switch (o_ptr->tval)
2381 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2382 create_artifact(o_ptr, FALSE);
2384 /* Special Ego-item */
2385 o_ptr->name2 = EGO_DIGGING;
2389 else if (power < -1)
2391 /* Hack -- Horrible digging bonus */
2392 o_ptr->pval = 0 - (5 + randint1(5));
2398 /* Hack -- Reverse digging bonus */
2399 o_ptr->pval = 0 - (o_ptr->pval);
2413 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2415 create_artifact(o_ptr, FALSE);
2420 /* Roll for an ego-item */
2421 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2422 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2424 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2426 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2431 switch (o_ptr->name2)
2434 if (one_in_(4) && (level > 40))
2435 add_flag(o_ptr->art_flags, TR_BLOWS);
2439 add_flag(o_ptr->art_flags, TR_RES_POIS);
2441 add_flag(o_ptr->art_flags, TR_WARNING);
2443 case EGO_KILL_DRAGON:
2445 add_flag(o_ptr->art_flags, TR_RES_POIS);
2449 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2451 case EGO_SLAYING_WEAPON:
2452 if (one_in_(3)) /* double damage */
2460 while (one_in_(o_ptr->dd));
2466 while (one_in_(o_ptr->ds));
2471 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2473 if (o_ptr->tval == TV_SWORD && one_in_(3))
2475 add_flag(o_ptr->art_flags, TR_VORPAL);
2480 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2486 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
2488 add_flag(o_ptr->art_flags, TR_DEX);
2490 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2493 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
2495 case EGO_EARTHQUAKES:
2496 if (one_in_(3) && (level > 60))
2497 add_flag(o_ptr->art_flags, TR_BLOWS);
2499 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
2503 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2507 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2509 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2511 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2512 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2515 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2516 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2517 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2518 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2522 if (!o_ptr->art_name)
2524 /* Hack -- Super-charge the damage dice */
2525 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2527 /* Hack -- Lower the damage dice */
2528 if (o_ptr->dd > 9) o_ptr->dd = 9;
2533 else if (power < -1)
2535 /* Roll for ego-item */
2536 if (randint0(MAX_DEPTH) < level)
2540 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2541 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2547 switch (o_ptr->name2)
2550 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2551 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2553 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2554 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2555 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2556 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2557 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2558 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2572 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2574 create_artifact(o_ptr, FALSE);
2577 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2591 if (power > 2) /* power > 2 is debug only */
2593 create_artifact(o_ptr, FALSE);
2597 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2599 switch (o_ptr->name2)
2601 case EGO_SLAYING_BOLT:
2606 /* Hack -- super-charge the damage dice */
2607 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2609 /* Hack -- restrict the damage dice */
2610 if (o_ptr->dd > 9) o_ptr->dd = 9;
2614 else if (power < -1)
2616 /* Roll for ego-item */
2617 if (randint0(MAX_DEPTH) < level)
2619 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2629 * @brief ドラゴン装備にランダムな耐性を与える
2630 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2633 static void dragon_resist(object_type * o_ptr)
2638 one_dragon_ele_resistance(o_ptr);
2640 one_high_resistance(o_ptr);
2646 * @brief オブジェクトにランダムな強いESPを与える
2647 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2650 static bool add_esp_strong(object_type *o_ptr)
2652 bool nonliv = FALSE;
2654 switch (randint1(3))
2656 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2657 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2658 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2665 * @brief オブジェクトにランダムな弱いESPを与える
2666 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2667 * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3)
2670 static void add_esp_weak(object_type *o_ptr, bool extra)
2673 u32b weak_esp_list[] = {
2685 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2686 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2688 /* Add unduplicated weak esp flags randomly */
2689 for (i = 0; i < add_count; ++ i)
2691 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2693 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2694 weak_esp_list[choice] = weak_esp_list[i];
2700 * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2701 * Apply magic to an item known to be "armor"
2702 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2703 * @param level 生成基準階
2704 * @param power 生成ランク
2707 * Hack -- note special processing for crown/helm\n
2708 * Hack -- note special processing for robe of permanence\n
2710 static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
2712 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
2713 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
2719 o_ptr->to_a += toac1;
2725 o_ptr->to_a += toac2;
2733 o_ptr->to_a -= toac1;
2738 /* Penalize again */
2739 o_ptr->to_a -= toac2;
2742 /* Cursed (if "bad") */
2743 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2748 switch (o_ptr->tval)
2752 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2753 create_artifact(o_ptr, FALSE);
2763 /* Hack -- Try for "Robes of the Magi" */
2764 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2765 (o_ptr->sval == SV_ROBE) &&
2766 (randint0(100) < 15))
2770 o_ptr->name2 = EGO_YOIYAMI;
2771 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2772 o_ptr->sval = SV_YOIYAMI_ROBE;
2778 o_ptr->name2 = EGO_PERMANENCE;
2783 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2785 create_artifact(o_ptr, FALSE);
2791 bool okay_flag = TRUE;
2793 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2795 switch (o_ptr->name2)
2798 if (o_ptr->tval != TV_HARD_ARMOR)
2804 if (o_ptr->tval != TV_SOFT_ARMOR)
2813 if (okay_flag) break;
2815 switch (o_ptr->name2)
2817 case EGO_RESISTANCE:
2819 add_flag(o_ptr->art_flags, TR_RES_POIS);
2822 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2823 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2827 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2829 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2831 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2832 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2834 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2835 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2836 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2837 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2838 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2839 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2840 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2841 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2844 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2845 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2846 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2847 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2848 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2849 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2862 if (o_ptr->sval == SV_DRAGON_SHIELD)
2864 dragon_resist(o_ptr);
2865 if (!one_in_(3)) break;
2871 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2873 create_artifact(o_ptr, FALSE);
2879 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2880 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
2881 && o_ptr->name2 == EGO_S_DWARVEN)
2888 switch (o_ptr->name2)
2891 if (!one_in_(3)) one_high_resistance(o_ptr);
2892 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2894 case EGO_REFLECTION:
2895 if (o_ptr->sval == SV_MIRROR_SHIELD)
2900 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2901 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2910 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2912 dragon_resist(o_ptr);
2913 if (!one_in_(3)) break;
2917 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2919 create_artifact(o_ptr, FALSE);
2922 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2926 else if (power < -1)
2928 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2936 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2938 dragon_resist(o_ptr);
2939 if (!one_in_(3)) break;
2944 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2946 create_artifact(o_ptr, FALSE);
2949 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
2951 switch (o_ptr->name2)
2953 case EGO_SLOW_DESCENT:
2956 one_high_resistance(o_ptr);
2962 else if (power < -1)
2964 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
2975 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2977 create_artifact(o_ptr, FALSE);
2982 bool ok_flag = TRUE;
2983 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
2985 switch (o_ptr->name2)
2988 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
2989 else add_esp_weak(o_ptr, FALSE);
2993 case EGO_REGENERATION:
2994 case EGO_LORDLINESS:
3000 if (one_in_(2)) add_esp_strong(o_ptr);
3001 else add_esp_weak(o_ptr, FALSE);
3004 default:/* not existing crown (wisdom,lite, etc...) */
3008 break; /* while (1) */
3014 else if (power < -1)
3018 bool ok_flag = TRUE;
3019 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3021 switch (o_ptr->name2)
3023 case EGO_ANCIENT_CURSE:
3024 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
3025 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
3026 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3027 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3028 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3029 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3033 break; /* while (1) */
3042 if (o_ptr->sval == SV_DRAGON_HELM)
3044 dragon_resist(o_ptr);
3045 if (!one_in_(3)) break;
3051 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3053 create_artifact(o_ptr, FALSE);
3058 bool ok_flag = TRUE;
3059 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3061 switch (o_ptr->name2)
3063 case EGO_BRILLIANCE:
3065 case EGO_INFRAVISION:
3066 case EGO_H_PROTECTION:
3071 if (one_in_(2)) add_esp_strong(o_ptr);
3072 else add_esp_weak(o_ptr, FALSE);
3076 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
3077 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
3080 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3082 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
3084 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
3085 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3087 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3088 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
3089 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
3090 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3091 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3092 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3093 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3094 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
3096 default:/* not existing helm (Magi, Might, etc...)*/
3100 break; /* while (1) */
3105 else if (power < -1)
3109 bool ok_flag = TRUE;
3110 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3112 switch (o_ptr->name2)
3114 case EGO_ANCIENT_CURSE:
3118 break; /* while (1) */
3129 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3131 create_artifact(o_ptr, FALSE);
3134 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
3136 switch (o_ptr->name2)
3145 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
3146 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
3147 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
3148 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3155 else if (power < -1)
3157 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3168 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
3169 * Apply magic to an item known to be a "ring" or "amulet"
3170 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3171 * @param level 生成基準階
3172 * @param power 生成ランク
3175 * Hack -- note special "pval boost" code for ring of speed\n
3176 * Hack -- note that some items must be cursed (or blessed)\n
3178 static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
3180 /* Apply magic (good or bad) according to type */
3181 switch (o_ptr->tval)
3186 switch (o_ptr->sval)
3188 case SV_RING_ATTACKS:
3191 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
3192 if (one_in_(15)) o_ptr->pval++;
3193 if (o_ptr->pval < 1) o_ptr->pval = 1;
3199 o_ptr->ident |= (IDENT_BROKEN);
3202 o_ptr->curse_flags |= TRC_CURSED;
3205 o_ptr->pval = 0 - (o_ptr->pval);
3216 /* Strength, Constitution, Dexterity, Intelligence */
3222 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3228 o_ptr->ident |= (IDENT_BROKEN);
3231 o_ptr->curse_flags |= TRC_CURSED;
3234 o_ptr->pval = 0 - (o_ptr->pval);
3240 /* Ring of Speed! */
3243 /* Base speed (1 to 10) */
3244 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3246 /* Super-charge the ring */
3247 while (randint0(100) < 50) o_ptr->pval++;
3253 o_ptr->ident |= (IDENT_BROKEN);
3256 o_ptr->curse_flags |= TRC_CURSED;
3259 o_ptr->pval = 0 - (o_ptr->pval);
3267 case SV_RING_LORDLY:
3271 one_lordly_high_resistance(o_ptr);
3275 /* Bonus to armor class */
3276 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3280 case SV_RING_WARNING:
3282 if (one_in_(3)) one_low_esp(o_ptr);
3287 case SV_RING_SEARCHING:
3289 /* Bonus to searching */
3290 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3296 o_ptr->ident |= (IDENT_BROKEN);
3299 o_ptr->curse_flags |= TRC_CURSED;
3302 o_ptr->pval = 0 - (o_ptr->pval);
3308 /* Flames, Acid, Ice */
3309 case SV_RING_FLAMES:
3314 /* Bonus to armor class */
3315 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3319 /* Weakness, Stupidity */
3320 case SV_RING_WEAKNESS:
3321 case SV_RING_STUPIDITY:
3324 o_ptr->ident |= (IDENT_BROKEN);
3327 o_ptr->curse_flags |= TRC_CURSED;
3330 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3331 if (power > 0) power = 0 - power;
3336 /* WOE, Stupidity */
3340 o_ptr->ident |= (IDENT_BROKEN);
3343 o_ptr->curse_flags |= TRC_CURSED;
3346 o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
3347 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3348 if (power > 0) power = 0 - power;
3353 /* Ring of damage */
3354 case SV_RING_DAMAGE:
3356 /* Bonus to damage */
3357 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
3363 o_ptr->ident |= (IDENT_BROKEN);
3366 o_ptr->curse_flags |= TRC_CURSED;
3369 o_ptr->to_d = 0 - o_ptr->to_d;
3375 /* Ring of Accuracy */
3376 case SV_RING_ACCURACY:
3379 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
3385 o_ptr->ident |= (IDENT_BROKEN);
3388 o_ptr->curse_flags |= TRC_CURSED;
3391 o_ptr->to_h = 0 - o_ptr->to_h;
3397 /* Ring of Protection */
3398 case SV_RING_PROTECTION:
3400 /* Bonus to armor class */
3401 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
3407 o_ptr->ident |= (IDENT_BROKEN);
3410 o_ptr->curse_flags |= TRC_CURSED;
3413 o_ptr->to_a = 0 - o_ptr->to_a;
3419 /* Ring of Slaying */
3420 case SV_RING_SLAYING:
3422 /* Bonus to damage and to hit */
3423 o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
3424 o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
3430 o_ptr->ident |= (IDENT_BROKEN);
3433 o_ptr->curse_flags |= TRC_CURSED;
3435 /* Reverse bonuses */
3436 o_ptr->to_h = 0 - o_ptr->to_h;
3437 o_ptr->to_d = 0 - o_ptr->to_d;
3443 case SV_RING_MUSCLE:
3445 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
3446 if (one_in_(4)) o_ptr->pval++;
3452 o_ptr->ident |= (IDENT_BROKEN);
3455 o_ptr->curse_flags |= TRC_CURSED;
3457 /* Reverse bonuses */
3458 o_ptr->pval = 0 - o_ptr->pval;
3463 case SV_RING_AGGRAVATION:
3466 o_ptr->ident |= (IDENT_BROKEN);
3469 o_ptr->curse_flags |= TRC_CURSED;
3471 if (power > 0) power = 0 - power;
3475 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3476 || (power > 2)) /* power > 2 is debug only */
3478 o_ptr->pval = MIN(o_ptr->pval, 4);
3479 /* Randart amulet */
3480 create_artifact(o_ptr, FALSE);
3482 else if ((power == 2) && one_in_(2))
3484 while(!o_ptr->name2)
3486 int tmp = m_bonus(10, level);
3487 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3488 switch(randint1(28))
3491 o_ptr->name2 = EGO_RING_THROW;
3494 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3495 o_ptr->name2 = EGO_RING_REGEN;
3498 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3499 o_ptr->name2 = EGO_RING_LITE;
3502 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3503 o_ptr->name2 = EGO_RING_TELEPORT;
3506 if (o_ptr->to_h) break;
3507 o_ptr->name2 = EGO_RING_TO_H;
3510 if (o_ptr->to_d) break;
3511 o_ptr->name2 = EGO_RING_TO_D;
3514 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3515 o_ptr->name2 = EGO_RING_SLAY;
3518 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3519 o_ptr->name2 = EGO_RING_WIZARD;
3522 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3523 o_ptr->name2 = EGO_RING_HERO;
3526 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3527 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3528 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3529 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3532 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3533 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;
3534 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3535 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3536 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3539 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3540 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;
3541 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3542 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3543 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3546 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3547 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;
3548 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3549 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3552 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3553 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;
3554 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3555 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3557 case 21: case 22: case 23: case 24: case 25: case 26:
3558 switch (o_ptr->sval)
3561 if (!one_in_(3)) break;
3562 o_ptr->name2 = EGO_RING_D_SPEED;
3564 case SV_RING_DAMAGE:
3565 case SV_RING_ACCURACY:
3566 case SV_RING_SLAYING:
3567 if (one_in_(2)) break;
3568 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3571 o_ptr->name2 = EGO_RING_BERSERKER;
3572 o_ptr->to_h -= 2+randint1(4);
3573 o_ptr->to_d += 2+randint1(4);
3576 case SV_RING_PROTECTION:
3577 o_ptr->name2 = EGO_RING_SUPER_AC;
3578 o_ptr->to_a += 7 + m_bonus(5, level);
3580 case SV_RING_RES_FEAR:
3581 o_ptr->name2 = EGO_RING_HERO;
3584 if (one_in_(2)) break;
3585 o_ptr->name2 = EGO_RING_HUNTER;
3587 case SV_RING_SEARCHING:
3588 o_ptr->name2 = EGO_RING_STEALTH;
3590 case SV_RING_TELEPORTATION:
3591 o_ptr->name2 = EGO_RING_TELE_AWAY;
3593 case SV_RING_RES_BLINDNESS:
3595 o_ptr->name2 = EGO_RING_RES_LITE;
3597 o_ptr->name2 = EGO_RING_RES_DARK;
3599 case SV_RING_LORDLY:
3600 if (!one_in_(20)) break;
3601 one_lordly_high_resistance(o_ptr);
3602 one_lordly_high_resistance(o_ptr);
3603 o_ptr->name2 = EGO_RING_TRUE;
3605 case SV_RING_SUSTAIN:
3606 if (!one_in_(4)) break;
3607 o_ptr->name2 = EGO_RING_RES_TIME;
3609 case SV_RING_FLAMES:
3610 if (!one_in_(2)) break;
3611 o_ptr->name2 = EGO_RING_DRAGON_F;
3614 if (!one_in_(2)) break;
3615 o_ptr->name2 = EGO_RING_DRAGON_C;
3617 case SV_RING_WARNING:
3618 if (!one_in_(2)) break;
3619 o_ptr->name2 = EGO_RING_M_DETECT;
3628 o_ptr->curse_flags = 0L;
3630 else if ((power == -2) && one_in_(2))
3632 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3633 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3634 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3635 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3636 o_ptr->art_flags[0] = 0;
3637 o_ptr->art_flags[1] = 0;
3638 while(!o_ptr->name2)
3640 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3644 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3645 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3648 o_ptr->name2 = EGO_RING_NO_MELEE;
3651 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3652 o_ptr->name2 = EGO_RING_AGGRAVATE;
3655 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3656 o_ptr->name2 = EGO_RING_TY_CURSE;
3659 o_ptr->name2 = EGO_RING_ALBINO;
3664 o_ptr->ident |= (IDENT_BROKEN);
3667 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3675 switch (o_ptr->sval)
3677 /* Amulet of wisdom/charisma */
3678 case SV_AMULET_INTELLIGENCE:
3679 case SV_AMULET_WISDOM:
3680 case SV_AMULET_CHARISMA:
3682 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3688 o_ptr->ident |= (IDENT_BROKEN);
3691 o_ptr->curse_flags |= (TRC_CURSED);
3693 /* Reverse bonuses */
3694 o_ptr->pval = 0 - o_ptr->pval;
3700 /* Amulet of brilliance */
3701 case SV_AMULET_BRILLIANCE:
3703 o_ptr->pval = 1 + m_bonus(3, level);
3704 if (one_in_(4)) o_ptr->pval++;
3710 o_ptr->ident |= (IDENT_BROKEN);
3713 o_ptr->curse_flags |= (TRC_CURSED);
3715 /* Reverse bonuses */
3716 o_ptr->pval = 0 - o_ptr->pval;
3722 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3726 o_ptr->curse_flags |= (TRC_CURSED);
3731 case SV_AMULET_RESISTANCE:
3733 if (one_in_(5)) one_high_resistance(o_ptr);
3734 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3738 /* Amulet of searching */
3739 case SV_AMULET_SEARCHING:
3741 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
3747 o_ptr->ident |= (IDENT_BROKEN);
3750 o_ptr->curse_flags |= (TRC_CURSED);
3752 /* Reverse bonuses */
3753 o_ptr->pval = 0 - (o_ptr->pval);
3759 /* Amulet of the Magi -- never cursed */
3760 case SV_AMULET_THE_MAGI:
3762 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3763 o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
3765 /* gain one low ESP */
3766 add_esp_weak(o_ptr, FALSE);
3771 /* Amulet of Doom -- always cursed */
3772 case SV_AMULET_DOOM:
3775 o_ptr->ident |= (IDENT_BROKEN);
3778 o_ptr->curse_flags |= (TRC_CURSED);
3781 o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
3782 o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
3783 if (power > 0) power = 0 - power;
3788 case SV_AMULET_MAGIC_MASTERY:
3790 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
3796 o_ptr->ident |= (IDENT_BROKEN);
3799 o_ptr->curse_flags |= (TRC_CURSED);
3801 /* Reverse bonuses */
3802 o_ptr->pval = 0 - o_ptr->pval;
3808 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3809 || (power > 2)) /* power > 2 is debug only */
3811 o_ptr->pval = MIN(o_ptr->pval, 4);
3812 /* Randart amulet */
3813 create_artifact(o_ptr, FALSE);
3815 else if ((power == 2) && one_in_(2))
3817 while(!o_ptr->name2)
3819 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3820 switch(randint1(21))
3823 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3824 o_ptr->name2 = EGO_AMU_SLOW_D;
3827 if (o_ptr->pval) break;
3828 o_ptr->name2 = EGO_AMU_INFRA;
3831 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3832 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3835 if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
3836 o_ptr->name2 = EGO_AMU_HOLD_EXP;
3839 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3840 o_ptr->name2 = EGO_AMU_LEVITATION;
3842 case 10: case 11: case 21:
3843 o_ptr->name2 = EGO_AMU_AC;
3846 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3847 if (m_bonus(10, level) > 8)
3848 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3850 o_ptr->name2 = EGO_AMU_RES_FIRE;
3853 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3854 if (m_bonus(10, level) > 8)
3855 o_ptr->name2 = EGO_AMU_RES_COLD_;
3857 o_ptr->name2 = EGO_AMU_RES_COLD;
3860 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3861 if (m_bonus(10, level) > 8)
3862 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3864 o_ptr->name2 = EGO_AMU_RES_ELEC;
3867 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3868 if (m_bonus(10, level) > 8)
3869 o_ptr->name2 = EGO_AMU_RES_ACID_;
3871 o_ptr->name2 = EGO_AMU_RES_ACID;
3873 case 16: case 17: case 18: case 19: case 20:
3874 switch (o_ptr->sval)
3876 case SV_AMULET_TELEPORT:
3877 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3878 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3879 else o_ptr->name2 = EGO_AMU_TELEPORT;
3881 case SV_AMULET_RESIST_ACID:
3882 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3884 case SV_AMULET_SEARCHING:
3885 o_ptr->name2 = EGO_AMU_STEALTH;
3887 case SV_AMULET_BRILLIANCE:
3888 if (!one_in_(3)) break;
3889 o_ptr->name2 = EGO_AMU_IDENT;
3891 case SV_AMULET_CHARISMA:
3892 if (!one_in_(3)) break;
3893 o_ptr->name2 = EGO_AMU_CHARM;
3895 case SV_AMULET_THE_MAGI:
3896 if (one_in_(2)) break;
3897 o_ptr->name2 = EGO_AMU_GREAT;
3899 case SV_AMULET_RESISTANCE:
3900 if (!one_in_(5)) break;
3901 o_ptr->name2 = EGO_AMU_DEFENDER;
3903 case SV_AMULET_TELEPATHY:
3904 if (!one_in_(3)) break;
3905 o_ptr->name2 = EGO_AMU_DETECTION;
3911 o_ptr->curse_flags = 0L;
3913 else if ((power == -2) && one_in_(2))
3915 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3916 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3917 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3918 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3919 o_ptr->art_flags[0] = 0;
3920 o_ptr->art_flags[1] = 0;
3921 while(!o_ptr->name2)
3923 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3927 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3928 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3931 o_ptr->name2 = EGO_AMU_FOOL;
3934 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3935 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3938 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3939 o_ptr->name2 = EGO_AMU_TY_CURSE;
3942 o_ptr->name2 = EGO_AMU_NAIVETY;
3947 o_ptr->ident |= (IDENT_BROKEN);
3950 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3958 * @brief モンスターが人形のベースにできるかを返す
3959 * @param r_idx チェックしたいモンスター種族のID
3960 * @return 人形にできるならTRUEを返す
3962 static bool item_monster_okay(MONRACE_IDX r_idx)
3964 monster_race *r_ptr = &r_info[r_idx];
3967 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
3968 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
3969 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
3970 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
3971 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
3972 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
3979 * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
3980 * Apply magic to an item known to be "boring"
3981 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3982 * @param level 生成基準階
3983 * @param power 生成ランク
3986 * Hack -- note the special code for various items
3988 static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
3990 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3995 /* Apply magic (good or bad) according to type */
3996 switch (o_ptr->tval)
4005 o_ptr->ident |= (IDENT_BROKEN);
4008 o_ptr->curse_flags |= (TRC_CURSED);
4015 o_ptr->xtra4 = o_ptr->pval;
4021 /* Hack -- Torches -- random fuel */
4022 if (o_ptr->sval == SV_LITE_TORCH)
4024 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4028 /* Hack -- Lanterns -- random fuel */
4029 if (o_ptr->sval == SV_LITE_LANTERN)
4031 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4035 if (power > 2) /* power > 2 is debug only */
4037 create_artifact(o_ptr, FALSE);
4039 else if ((power == 2) || ((power == 1) && one_in_(3)))
4041 while (!o_ptr->name2)
4045 bool okay_flag = TRUE;
4047 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
4049 switch (o_ptr->name2)
4052 if (o_ptr->sval == SV_LITE_FEANOR)
4060 else if (power == -2)
4062 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
4064 switch (o_ptr->name2)
4066 case EGO_LITE_DARKNESS:
4069 if (o_ptr->sval == SV_LITE_TORCH)
4071 add_flag(o_ptr->art_flags, TR_LITE_M1);
4073 else if (o_ptr->sval == SV_LITE_LANTERN)
4075 add_flag(o_ptr->art_flags, TR_LITE_M2);
4077 else if (o_ptr->sval == SV_LITE_FEANOR)
4079 add_flag(o_ptr->art_flags, TR_LITE_M3);
4091 /* The wand or staff gets a number of initial charges equal
4092 * to between 1/2 (+1) and the full object kind's pval. -LM-
4094 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
4100 /* Transfer the pval. -LM- */
4101 o_ptr->pval = k_ptr->pval;
4108 object_aware(o_ptr);
4109 object_known(o_ptr);
4115 PARAMETER_VALUE i = 1;
4118 monster_race *r_ptr;
4120 /* Pick a random non-unique monster race */
4123 i = randint1(max_r_idx - 1);
4125 if (!item_monster_okay(i)) continue;
4126 if (i == MON_TSUCHINOKO) continue;
4130 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4132 /* Ignore dead monsters */
4133 if (!r_ptr->rarity) continue;
4135 /* Ignore uncommon monsters */
4136 if (r_ptr->rarity > 100) continue;
4138 /* Prefer less out-of-depth monsters */
4139 if (randint0(check)) continue;
4146 /* Some figurines are cursed */
4147 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
4154 PARAMETER_VALUE i = 1;
4159 monster_race *r_ptr;
4161 if (o_ptr->sval == SV_SKELETON)
4163 match = RF9_DROP_SKELETON;
4165 else if (o_ptr->sval == SV_CORPSE)
4167 match = RF9_DROP_CORPSE;
4170 /* Hack -- Remove the monster restriction */
4171 get_mon_num_prep(item_monster_okay, NULL);
4173 /* Pick a random non-unique monster race */
4176 i = get_mon_num(dun_level);
4180 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4182 /* Ignore dead monsters */
4183 if (!r_ptr->rarity) continue;
4185 /* Ignore corpseless monsters */
4186 if (!(r_ptr->flags9 & match)) continue;
4188 /* Prefer less out-of-depth monsters */
4189 if (randint0(check)) continue;
4197 object_aware(o_ptr);
4198 object_known(o_ptr);
4204 PARAMETER_VALUE i = 1;
4206 monster_race *r_ptr;
4208 /* Pick a random monster race */
4211 i = randint1(max_r_idx - 1);
4215 /* Ignore dead monsters */
4216 if (!r_ptr->rarity) continue;
4225 msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
4227 object_aware(o_ptr);
4228 object_known(o_ptr);
4235 DEPTH obj_level = k_info[o_ptr->k_idx].level;
4237 /* Hack -- skip ruined chests */
4238 if (obj_level <= 0) break;
4240 /* Hack -- pick a "difficulty" */
4241 o_ptr->pval = randint1(obj_level);
4242 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4244 o_ptr->xtra3 = dun_level + 5;
4246 /* Never exceed "difficulty" of 55 to 59 */
4247 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4255 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
4256 * Complete the "creation" of an object by applying "magic" to the item
4257 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4259 * @param mode 生成オプション
4262 * This includes not only rolling for random bonuses, but also putting the\n
4263 * finishing touches on ego-items and artifacts, giving charges to wands and\n
4264 * staffs, giving fuel to lites, and placing traps on chests.\n
4266 * In particular, note that "Instant Artifacts", if "created" by an external\n
4267 * routine, must pass through this function to complete the actual creation.\n
4269 * The base "chance" of the item being "good" increases with the "level"\n
4270 * parameter, which is usually derived from the dungeon level, being equal\n
4271 * to the level plus 10, up to a maximum of 75. If "good" is true, then\n
4272 * the object is guaranteed to be "good". If an object is "good", then\n
4273 * the chance that the object will be "great" (ego-item or artifact), also\n
4274 * increases with the "level", being equal to half the level, plus 5, up to\n
4275 * a maximum of 20. If "great" is true, then the object is guaranteed to be\n
4276 * "great". At dungeon level 65 and below, 15/100 objects are "great".\n
4278 * If the object is not "good", there is a chance it will be "cursed", and\n
4279 * if it is "cursed", there is a chance it will be "broken". These chances\n
4280 * are related to the "good" / "great" chances above.\n
4282 * Otherwise "normal" rings and amulets will be "good" half the time and\n
4283 * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4285 * If "okay" is true, and the object is going to be "great", then there is\n
4286 * a chance that an artifact will be created. This is true even if both the\n
4287 * "good" and "great" arguments are false. As a total hack, if "great" is\n
4288 * true, then the item gets 3 extra "attempts" to become an artifact.\n
4290 void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
4292 int i, rolls, f1, f2, power;
4294 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4296 /* Maximum "level" for various things */
4297 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4299 /* Base chance of being "good" */
4302 /* Maximal chance of being "good" */
4303 if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4305 /* Base chance of being "great" */
4308 /* Maximal chance of being "great" */
4309 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4310 f2 = d_info[dungeon_type].obj_great;
4312 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4317 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4326 /* Roll for "good" */
4327 if ((mode & AM_GOOD) || magik(f1))
4332 /* Roll for "great" */
4333 if ((mode & AM_GREAT) || magik(f2))
4337 /* Roll for "special" */
4338 if (mode & AM_SPECIAL) power = 3;
4342 /* Roll for "cursed" */
4345 /* Assume "cursed" */
4348 /* Roll for "broken" */
4349 if (magik(f2)) power = -2;
4353 if (mode & AM_CURSED)
4355 /* Assume 'cursed' */
4360 /* Everything else gets more badly cursed */
4367 /* Assume no rolls */
4370 /* Get one roll if excellent */
4371 if (power >= 2) rolls = 1;
4373 /* Hack -- Get four rolls if forced great or special */
4374 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4376 /* Hack -- Get no rolls if not allowed */
4377 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4379 /* Roll for artifacts if allowed */
4380 for (i = 0; i < rolls; i++)
4382 /* Roll for an artifact */
4383 if (make_artifact(o_ptr)) break;
4384 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4386 if (make_artifact(o_ptr)) break;
4391 /* Hack -- analyze artifacts */
4392 if (object_is_fixed_artifact(o_ptr))
4394 artifact_type *a_ptr = &a_info[o_ptr->name1];
4396 /* Hack -- Mark the artifact as "created" */
4399 /* Hack -- Memorize location of artifact in saved floors */
4400 if (character_dungeon)
4401 a_ptr->floor_id = p_ptr->floor_id;
4403 /* Extract the other fields */
4404 o_ptr->pval = a_ptr->pval;
4405 o_ptr->ac = a_ptr->ac;
4406 o_ptr->dd = a_ptr->dd;
4407 o_ptr->ds = a_ptr->ds;
4408 o_ptr->to_a = a_ptr->to_a;
4409 o_ptr->to_h = a_ptr->to_h;
4410 o_ptr->to_d = a_ptr->to_d;
4411 o_ptr->weight = a_ptr->weight;
4412 o_ptr->xtra2 = a_ptr->act_idx;
4414 if (o_ptr->name1 == ART_MILIM)
4416 if(p_ptr->pseikaku == SEIKAKU_SEXY)
4422 /* Hack -- extract the "broken" flag */
4423 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4425 /* Hack -- extract the "cursed" flag */
4426 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4427 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4428 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4429 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4430 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4431 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4438 switch (o_ptr->tval)
4447 if (power) a_m_aux_1(o_ptr, lev, power);
4453 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4459 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4473 /* Elven Cloak and Black Clothes ... */
4474 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4475 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4476 o_ptr->pval = randint1(4);
4480 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4481 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4482 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4483 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4484 a_m_aux_2(o_ptr, lev, power);
4486 if (power) a_m_aux_2(o_ptr, lev, power);
4494 if (!power && (randint0(100) < 50)) power = -1;
4495 a_m_aux_3(o_ptr, lev, power);
4501 a_m_aux_4(o_ptr, lev, power);
4506 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4507 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4508 (p_ptr->pseikaku == SEIKAKU_SEXY))
4511 add_flag(o_ptr->art_flags, TR_STR);
4512 add_flag(o_ptr->art_flags, TR_INT);
4513 add_flag(o_ptr->art_flags, TR_WIS);
4514 add_flag(o_ptr->art_flags, TR_DEX);
4515 add_flag(o_ptr->art_flags, TR_CON);
4516 add_flag(o_ptr->art_flags, TR_CHR);
4519 /* Hack -- analyze ego-items */
4520 if (object_is_ego(o_ptr))
4522 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4524 /* Hack -- acquire "broken" flag */
4525 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4527 /* Hack -- acquire "cursed" flag */
4528 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4529 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4530 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4531 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4532 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4533 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4535 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4536 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4537 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4538 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4539 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4540 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4541 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4542 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4548 while (one_in_(o_ptr->dd));
4550 if (o_ptr->dd > 9) o_ptr->dd = 9;
4553 /* Hack -- apply activatin index if needed */
4554 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
4556 /* Hack -- apply extra penalties if needed */
4557 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4559 /* Hack -- obtain bonuses */
4560 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4561 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4562 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4564 /* Hack -- obtain pval */
4565 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4568 /* Hack -- apply extra bonuses if needed */
4571 /* Hack -- obtain bonuses */
4572 if (e_ptr->max_to_h)
4574 if (e_ptr->max_to_h > 127)
4575 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4576 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4578 if (e_ptr->max_to_d)
4580 if (e_ptr->max_to_d > 127)
4581 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4582 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4584 if (e_ptr->max_to_a)
4586 if (e_ptr->max_to_a > 127)
4587 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4588 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4591 /* Accuracy ego must have high to_h */
4592 if(o_ptr->name2 == EGO_ACCURACY)
4594 while(o_ptr->to_h < o_ptr->to_d + 10)
4599 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4602 /* Accuracy ego must have high to_h */
4603 if(o_ptr->name2 == EGO_VELOCITY)
4605 while(o_ptr->to_d < o_ptr->to_h + 10)
4610 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4613 /* Protection ego must have high to_a */
4614 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4616 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4619 /* Hack -- obtain pval */
4620 if (e_ptr->max_pval)
4622 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4625 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4627 else if (o_ptr->name2 == EGO_DEMON)
4629 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4631 o_ptr->pval += randint1(2);
4635 o_ptr->pval += randint1(e_ptr->max_pval);
4638 else if (o_ptr->name2 == EGO_ATTACKS)
4640 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4641 if (o_ptr->pval > 3) o_ptr->pval = 3;
4642 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4643 o_ptr->pval += randint1(2);
4645 else if (o_ptr->name2 == EGO_BAT)
4647 o_ptr->pval = randint1(e_ptr->max_pval);
4648 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4650 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4652 o_ptr->pval = randint1(e_ptr->max_pval);
4656 o_ptr->pval += randint1(e_ptr->max_pval);
4661 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4663 o_ptr->pval = randint1(o_ptr->pval);
4665 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4672 /* Examine real objects */
4675 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4677 /* Hack -- acquire "broken" flag */
4678 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4680 /* Hack -- acquire "cursed" flag */
4681 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4682 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4683 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4684 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4685 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4686 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4694 * @brief ベースアイテムが上質として扱われるかどうかを返す。
4695 * Hack -- determine if a template is "good"
4696 * @param k_idx 判定したいベースアイテムのID
4697 * @return ベースアイテムが上質ならばTRUEを返す。
4699 static bool kind_is_good(KIND_OBJECT_IDX k_idx)
4701 object_kind *k_ptr = &k_info[k_idx];
4703 /* Analyze the item type */
4704 switch (k_ptr->tval)
4706 /* Armor -- Good unless damaged */
4717 if (k_ptr->to_a < 0) return (FALSE);
4721 /* Weapons -- Good unless damaged */
4728 if (k_ptr->to_h < 0) return (FALSE);
4729 if (k_ptr->to_d < 0) return (FALSE);
4733 /* Ammo -- Arrows/Bolts are good */
4740 /* Books -- High level books are good (except Arcane books) */
4742 case TV_SORCERY_BOOK:
4743 case TV_NATURE_BOOK:
4748 case TV_DAEMON_BOOK:
4749 case TV_CRUSADE_BOOK:
4751 case TV_HISSATSU_BOOK:
4754 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4758 /* Rings -- Rings of Speed are good */
4761 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4762 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4766 /* Amulets -- Amulets of the Magi and Resistance are good */
4769 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4770 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4775 /* Assume not good */
4780 * @brief 生成階に応じたベースアイテムの生成を行う。
4781 * Attempt to make an object (normal or good/great)
4782 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4783 * @param mode オプションフラグ
4784 * @return 生成に成功したらTRUEを返す。
4786 * This routine plays nasty games to generate the "special artifacts".\n
4787 * This routine uses "object_level" for the "generation level".\n
4788 * We assume that the given object has been "wiped".\n
4790 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
4796 /* Chance of "special object" */
4797 prob = ((mode & AM_GOOD) ? 10 : 1000);
4799 /* Base level for the object */
4800 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4803 /* Generate a special object, or a normal object */
4804 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4806 KIND_OBJECT_IDX k_idx;
4809 if ((mode & AM_GOOD) && !get_obj_num_hook)
4811 /* Activate restriction (if already specified, use that) */
4812 get_obj_num_hook = kind_is_good;
4815 /* Restricted objects - prepare allocation table */
4816 if (get_obj_num_hook) get_obj_num_prep();
4818 /* Pick a random object */
4819 k_idx = get_obj_num(base);
4821 /* Restricted objects */
4822 if (get_obj_num_hook)
4824 /* Clear restriction */
4825 get_obj_num_hook = NULL;
4827 /* Reset allocation table to default */
4831 /* Handle failure */
4832 if (!k_idx) return (FALSE);
4834 /* Prepare the object */
4835 object_prep(j_ptr, k_idx);
4838 /* Apply magic (allow artifacts) */
4839 apply_magic(j_ptr, object_level, mode);
4841 /* Hack -- generate multiple spikes/missiles */
4842 switch (j_ptr->tval)
4850 j_ptr->number = (byte)damroll(6, 7);
4854 if (cheat_peek) object_mention(j_ptr);
4862 * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
4863 * Attempt to place an object (normal or good/great) at the given location.
4864 * @param y 配置したいフロアのY座標
4865 * @param x 配置したいフロアのX座標
4866 * @param mode オプションフラグ
4867 * @return 生成に成功したらTRUEを返す。
4869 * This routine plays nasty games to generate the "special artifacts".\n
4870 * This routine uses "object_level" for the "generation level".\n
4871 * This routine requires a clean floor grid destination.\n
4873 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
4878 cave_type *c_ptr = &cave[y][x];
4884 /* Paranoia -- check bounds */
4885 if (!in_bounds(y, x)) return;
4887 /* Require floor space */
4888 if (!cave_drop_bold(y, x)) return;
4890 /* Avoid stacking on other objects */
4891 if (c_ptr->o_idx) return;
4896 /* Make an object (if possible) */
4897 if (!make_object(q_ptr, mode)) return;
4900 /* Make an object */
4907 o_ptr = &o_list[o_idx];
4909 /* Structure Copy */
4910 object_copy(o_ptr, q_ptr);
4916 o_ptr->next_o_idx = c_ptr->o_idx;
4918 /* Place the object */
4919 c_ptr->o_idx = o_idx;
4927 /* Hack -- Preserve artifacts */
4928 if (object_is_fixed_artifact(q_ptr))
4930 a_info[q_ptr->name1].cur_num = 0;
4937 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
4938 * Make a treasure object
4939 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4940 * @return 生成に成功したらTRUEを返す。
4942 * The location must be a legal, clean, floor grid.
4944 bool make_gold(object_type *j_ptr)
4949 /* Hack -- Pick a Treasure variety */
4950 i = ((randint1(object_level + 2) + 2) / 2) - 1;
4952 /* Apply "extra" magic */
4953 if (one_in_(GREAT_OBJ))
4955 i += randint1(object_level + 1);
4958 /* Hack -- Creeping Coins only generate "themselves" */
4959 if (coin_type) i = coin_type;
4961 /* Do not create "illegal" Treasure Types */
4962 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
4964 /* Prepare a gold object */
4965 object_prep(j_ptr, OBJ_GOLD_LIST + i);
4967 /* Hack -- Base coin cost */
4968 base = k_info[OBJ_GOLD_LIST + i].cost;
4970 /* Determine how much the treasure is "worth" */
4971 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
4979 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
4980 * Places a treasure (Gold or Gems) at given location
4981 * @param y 配置したいフロアのY座標
4982 * @param x 配置したいフロアのX座標
4983 * @return 生成に成功したらTRUEを返す。
4985 * The location must be a legal, clean, floor grid.
4987 void place_gold(POSITION y, POSITION x)
4992 cave_type *c_ptr = &cave[y][x];
4998 /* Paranoia -- check bounds */
4999 if (!in_bounds(y, x)) return;
5001 /* Require floor space */
5002 if (!cave_drop_bold(y, x)) return;
5004 /* Avoid stacking on other objects */
5005 if (c_ptr->o_idx) return;
5010 /* Make some gold */
5011 if (!make_gold(q_ptr)) return;
5013 /* Make an object */
5020 o_ptr = &o_list[o_idx];
5022 /* Copy the object */
5023 object_copy(o_ptr, q_ptr);
5030 o_ptr->next_o_idx = c_ptr->o_idx;
5032 /* Place the object */
5033 c_ptr->o_idx = o_idx;
5043 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
5044 * Let an object fall to the ground at or near a location.
5045 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
5046 * @param chance ドロップの成功率(%)
5047 * @param y 配置したいフロアのY座標
5048 * @param x 配置したいフロアのX座標
5049 * @return 生成に成功したらオブジェクトのIDを返す。
5051 * The initial location is assumed to be "in_bounds()".\n
5053 * This function takes a parameter "chance". This is the percentage\n
5054 * chance that the item will "disappear" instead of drop. If the object\n
5055 * has been thrown, then this is the chance of disappearance on contact.\n
5057 * Hack -- this function uses "chance" to determine if it should produce\n
5058 * some form of "description" of the drop event (under the player).\n
5060 * We check several locations to see if we can find a location at which\n
5061 * the object can combine, stack, or be placed. Artifacts will try very\n
5062 * hard to be placed, including "teleporting" to a useful grid if needed.\n
5064 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
5071 POSITION ty, tx = 0;
5073 OBJECT_IDX o_idx = 0;
5074 OBJECT_IDX this_o_idx, next_o_idx = 0;
5078 char o_name[MAX_NLEN];
5084 /* Extract plural */
5085 bool plural = (j_ptr->number != 1);
5088 /* Describe object */
5089 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5092 /* Handle normal "breakage" */
5093 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
5096 msg_format("%sは消えた。", o_name);
5098 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5101 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
5118 /* Scan local grids */
5119 for (dy = -3; dy <= 3; dy++)
5121 /* Scan local grids */
5122 for (dx = -3; dx <= 3; dx++)
5126 /* Calculate actual distance */
5127 d = (dy * dy) + (dx * dx);
5129 /* Ignore distant grids */
5130 if (d > 10) continue;
5135 /* Skip illegal grids */
5136 if (!in_bounds(ty, tx)) continue;
5138 /* Require line of projection */
5139 if (!projectable(y, x, ty, tx)) continue;
5142 c_ptr = &cave[ty][tx];
5144 /* Require floor space */
5145 if (!cave_drop_bold(ty, tx)) continue;
5150 /* Scan objects in that grid */
5151 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5154 o_ptr = &o_list[this_o_idx];
5156 /* Acquire next object */
5157 next_o_idx = o_ptr->next_o_idx;
5159 /* Check for possible combination */
5160 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5166 /* Add new object */
5170 if (k > 99) continue;
5172 /* Calculate score */
5173 s = 1000 - (d + k * 5);
5175 /* Skip bad values */
5176 if (s < bs) continue;
5178 /* New best value */
5181 /* Apply the randomizer to equivalent values */
5182 if ((++bn >= 2) && !one_in_(bn)) continue;
5196 /* Handle lack of space */
5197 if (!flag && !object_is_artifact(j_ptr))
5200 msg_format("%sは消えた。", o_name);
5202 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5207 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5215 for (i = 0; !flag && (i < 1000); i++)
5218 ty = rand_spread(by, 1);
5219 tx = rand_spread(bx, 1);
5221 /* Verify location */
5222 if (!in_bounds(ty, tx)) continue;
5224 /* Bounce to that location */
5228 /* Require floor space */
5229 if (!cave_drop_bold(by, bx)) continue;
5237 int candidates = 0, pick;
5239 for (ty = 1; ty < cur_hgt - 1; ty++)
5241 for (tx = 1; tx < cur_wid - 1; tx++)
5243 /* A valid space found */
5244 if (cave_drop_bold(ty, tx)) candidates++;
5248 /* No valid place! */
5252 msg_format("%sは消えた。", o_name);
5254 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5258 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5260 /* Mega-Hack -- preserve artifacts */
5263 /* Hack -- Preserve unknown artifacts */
5264 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5266 /* Mega-Hack -- Preserve the artifact */
5267 a_info[j_ptr->name1].cur_num = 0;
5275 /* Choose a random one */
5276 pick = randint1(candidates);
5278 for (ty = 1; ty < cur_hgt - 1; ty++)
5280 for (tx = 1; tx < cur_wid - 1; tx++)
5282 if (cave_drop_bold(ty, tx))
5286 /* Is this a picked one? */
5300 c_ptr = &cave[by][bx];
5302 /* Scan objects in that grid for combination */
5303 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5306 o_ptr = &o_list[this_o_idx];
5308 /* Acquire next object */
5309 next_o_idx = o_ptr->next_o_idx;
5311 /* Check for combination */
5312 if (object_similar(o_ptr, j_ptr))
5314 /* Combine the items */
5315 object_absorb(o_ptr, j_ptr);
5324 /* Get new object */
5325 if (!done) o_idx = o_pop();
5328 if (!done && !o_idx)
5331 msg_format("%sは消えた。", o_name);
5333 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5338 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5340 /* Hack -- Preserve artifacts */
5341 if (object_is_fixed_artifact(j_ptr))
5343 a_info[j_ptr->name1].cur_num = 0;
5353 /* Structure copy */
5354 object_copy(&o_list[o_idx], j_ptr);
5356 /* Access new object */
5357 j_ptr = &o_list[o_idx];
5364 j_ptr->held_m_idx = 0;
5367 j_ptr->next_o_idx = c_ptr->o_idx;
5369 /* Place the object */
5370 c_ptr->o_idx = o_idx;
5384 /* Mega-Hack -- no message if "dropped" by player */
5385 /* Message when an object falls under the player */
5386 if (chance && player_bold(by, bx))
5388 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5397 * Scatter some "great" objects near the player
5398 * @param y1 配置したいフロアのY座標
5399 * @param x1 配置したいフロアのX座標
5400 * @param num 獲得の処理回数
5401 * @param great TRUEならば必ず高級品以上を落とす
5402 * @param special TRUEならば必ず特別品を落とす
5403 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5406 void acquirement(POSITION y1, POSITION x1, int num, bool great, bool special, bool known)
5409 object_type object_type_body;
5410 BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ;
5415 i_ptr = &object_type_body;
5418 /* Make a good (or great) object (if possible) */
5419 if (!make_object(i_ptr, mode)) continue;
5423 object_aware(i_ptr);
5424 object_known(i_ptr);
5427 /* Drop the object */
5428 (void)drop_near(i_ptr, -1, y1, x1);
5433 * Scatter some "amusing" objects near the player
5436 #define AMS_NOTHING 0x00 /* No restriction */
5437 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
5438 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
5439 #define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */
5440 #define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */
5444 OBJECT_TYPE_VALUE tval;
5445 OBJECT_SUBTYPE_VALUE sval;
5450 amuse_type amuse_info[] =
5452 { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
5453 { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
5454 { TV_SPIKE, SV_ANY, 10, AMS_PILE },
5455 { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
5456 { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
5457 { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
5458 { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
5459 { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
5460 { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
5461 { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
5462 { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
5463 { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
5464 { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
5471 * @param y1 配置したいフロアのY座標
5472 * @param x1 配置したいフロアのX座標
5473 * @param num 誰得の処理回数
5474 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5477 void amusement(POSITION y1, POSITION x1, int num, bool known)
5480 object_type object_type_body;
5483 for (n = 0; amuse_info[n].tval != 0; n++)
5485 t += amuse_info[n].prob;
5492 KIND_OBJECT_IDX k_idx;
5493 ARTIFACT_IDX a_idx = 0;
5494 int r = randint0(t);
5495 bool insta_art, fixed_art;
5499 r -= amuse_info[i].prob;
5502 i_ptr = &object_type_body;
5504 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
5506 /* Paranoia - reroll if nothing */
5507 if (!k_idx) continue;
5509 /* Search an artifact index if need */
5510 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
5511 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
5513 if (insta_art || fixed_art)
5515 for (a_idx = 1; a_idx < max_a_idx; a_idx++)
5517 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
5518 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
5519 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
5520 if (a_info[a_idx].cur_num > 0) continue;
5524 if (a_idx >= max_a_idx) continue;
5527 /* Make an object (if possible) */
5528 object_prep(i_ptr, k_idx);
5529 if (a_idx) i_ptr->name1 = a_idx;
5530 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
5532 if (amuse_info[i].flag & AMS_NO_UNIQUE)
5534 if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
5537 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
5538 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
5542 object_aware(i_ptr);
5543 object_known(i_ptr);
5546 /* Paranoia - reroll if nothing */
5547 if (!(i_ptr->k_idx)) continue;
5549 /* Drop the object */
5550 (void)drop_near(i_ptr, -1, y1, x1);
5558 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5559 * Describe the charges on an item in the inventory.
5560 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5563 void inven_item_charges(INVENTORY_IDX item)
5565 object_type *o_ptr = &inventory[item];
5567 /* Require staff/wand */
5568 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5570 /* Require known item */
5571 if (!object_is_known(o_ptr)) return;
5574 if (o_ptr->pval <= 0)
5576 msg_print("もう魔力が残っていない。");
5580 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5583 /* Multiple charges */
5584 if (o_ptr->pval != 1)
5586 msg_format("You have %d charges remaining.", o_ptr->pval);
5592 msg_format("You have %d charge remaining.", o_ptr->pval);
5599 * @brief アイテムの残り所持数メッセージを表示する /
5600 * Describe an item in the inventory.
5601 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5604 void inven_item_describe(INVENTORY_IDX item)
5606 object_type *o_ptr = &inventory[item];
5607 char o_name[MAX_NLEN];
5609 object_desc(o_name, o_ptr, 0);
5612 /* "no more" の場合はこちらで表示する */
5613 if (o_ptr->number <= 0)
5615 /*FIRST*//*ここはもう通らないかも */
5616 msg_format("もう%sを持っていない。", o_name);
5620 /* アイテム名を英日切り替え機能対応 */
5621 msg_format("まだ %sを持っている。", o_name);
5624 msg_format("You have %s.", o_name);
5630 * @brief アイテムを増減させ残り所持数メッセージを表示する /
5631 * Increase the "number" of an item in the inventory
5632 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5636 void inven_item_increase(INVENTORY_IDX item, int num)
5638 object_type *o_ptr = &inventory[item];
5641 num += o_ptr->number;
5644 if (num > 255) num = 255;
5645 else if (num < 0) num = 0;
5648 num -= (ITEM_NUMBER)o_ptr->number;
5650 /* Change the number and weight */
5653 /* Add the number */
5654 o_ptr->number += num;
5656 /* Add the weight */
5657 p_ptr->total_weight += (num * o_ptr->weight);
5659 /* Recalculate bonuses */
5660 p_ptr->update |= (PU_BONUS);
5662 /* Recalculate mana XXX */
5663 p_ptr->update |= (PU_MANA);
5665 /* Combine the pack */
5666 p_ptr->notice |= (PN_COMBINE);
5668 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5670 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5671 if (!o_ptr->number && p_ptr->ele_attack)
5673 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5675 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5677 /* Clear all temporary elemental brands */
5678 set_ele_attack(0, 0);
5686 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5687 * Erase an inventory slot if it has no more items
5688 * @param item 消去したいプレイヤーのアイテム所持スロット
5691 void inven_item_optimize(INVENTORY_IDX item)
5693 object_type *o_ptr = &inventory[item];
5695 /* Only optimize real items */
5696 if (!o_ptr->k_idx) return;
5698 /* Only optimize empty items */
5699 if (o_ptr->number) return;
5701 /* The item is in the pack */
5702 if (item < INVEN_RARM)
5709 /* Slide everything down */
5710 for (i = item; i < INVEN_PACK; i++)
5712 /* Structure copy */
5713 inventory[i] = inventory[i+1];
5716 /* Erase the "final" slot */
5717 object_wipe(&inventory[i]);
5719 p_ptr->window |= (PW_INVEN);
5722 /* The item is being wielded */
5728 /* Erase the empty slot */
5729 object_wipe(&inventory[item]);
5731 /* Recalculate bonuses */
5732 p_ptr->update |= (PU_BONUS);
5734 /* Recalculate torch */
5735 p_ptr->update |= (PU_TORCH);
5737 /* Recalculate mana XXX */
5738 p_ptr->update |= (PU_MANA);
5740 p_ptr->window |= (PW_EQUIP);
5743 p_ptr->window |= (PW_SPELL);
5747 * @brief 床上の魔道具の残り残量メッセージを表示する /
5748 * Describe the charges on an item on the floor.
5749 * @param item メッセージの対象にしたいアイテム所持スロット
5752 void floor_item_charges(INVENTORY_IDX item)
5754 object_type *o_ptr = &o_list[item];
5756 /* Require staff/wand */
5757 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5759 /* Require known item */
5760 if (!object_is_known(o_ptr)) return;
5763 if (o_ptr->pval <= 0)
5765 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5769 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5772 /* Multiple charges */
5773 if (o_ptr->pval != 1)
5775 msg_format("There are %d charges remaining.", o_ptr->pval);
5781 msg_format("There is %d charge remaining.", o_ptr->pval);
5788 * @brief 床上のアイテムの残り数メッセージを表示する /
5789 * Describe the charges on an item on the floor.
5790 * @param item メッセージの対象にしたいアイテム所持スロット
5793 void floor_item_describe(INVENTORY_IDX item)
5795 object_type *o_ptr = &o_list[item];
5796 char o_name[MAX_NLEN];
5798 object_desc(o_name, o_ptr, 0);
5801 /* "no more" の場合はこちらで表示を分ける */
5802 if (o_ptr->number <= 0)
5804 msg_format("床上には、もう%sはない。", o_name);
5808 msg_format("床上には、まだ %sがある。", o_name);
5811 msg_format("You see %s.", o_name);
5818 * @brief 床上のアイテムの数を増やす /
5819 * Increase the "number" of an item on the floor
5820 * @param item 増やしたいアイテムの所持スロット
5821 * @param num 増やしたいアイテムの数
5824 void floor_item_increase(INVENTORY_IDX item, int num)
5826 object_type *o_ptr = &o_list[item];
5829 num += o_ptr->number;
5832 if (num > 255) num = 255;
5833 else if (num < 0) num = 0;
5836 num -= (int)o_ptr->number;
5838 /* Change the number */
5839 o_ptr->number += (ITEM_NUMBER)num;
5844 * @brief 床上の数の無くなったアイテムスロットを消去する /
5845 * Optimize an item on the floor (destroy "empty" items)
5846 * @param item 消去したいアイテムの所持スロット
5849 void floor_item_optimize(INVENTORY_IDX item)
5851 object_type *o_ptr = &o_list[item];
5853 /* Paranoia -- be sure it exists */
5854 if (!o_ptr->k_idx) return;
5856 /* Only optimize empty items */
5857 if (o_ptr->number) return;
5859 delete_object_idx(item);
5864 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5865 * Check if we have space for an item in the pack without overflow
5866 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5867 * @return 溢れずに済むならTRUEを返す
5869 bool inven_carry_okay(object_type *o_ptr)
5874 if (inven_cnt < INVEN_PACK) return (TRUE);
5877 for (j = 0; j < INVEN_PACK; j++)
5879 object_type *j_ptr = &inventory[j];
5881 /* Skip non-objects */
5882 if (!j_ptr->k_idx) continue;
5884 /* Check if the two items can be combined */
5885 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5892 * @brief オブジェクトを定義された基準に従いソートするための関数 /
5893 * Check if we have space for an item in the pack without overflow
5894 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
5895 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
5896 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
5897 * @return o_ptrの方が上位ならばTRUEを返す。
5899 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5903 /* Use empty slots */
5904 if (!j_ptr->k_idx) return TRUE;
5906 /* Hack -- readable books always come first */
5907 if ((o_ptr->tval == REALM1_BOOK) &&
5908 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5909 if ((j_ptr->tval == REALM1_BOOK) &&
5910 (o_ptr->tval != REALM1_BOOK)) return FALSE;
5912 if ((o_ptr->tval == REALM2_BOOK) &&
5913 (j_ptr->tval != REALM2_BOOK)) return TRUE;
5914 if ((j_ptr->tval == REALM2_BOOK) &&
5915 (o_ptr->tval != REALM2_BOOK)) return FALSE;
5917 /* Objects sort by decreasing type */
5918 if (o_ptr->tval > j_ptr->tval) return TRUE;
5919 if (o_ptr->tval < j_ptr->tval) return FALSE;
5921 /* Non-aware (flavored) items always come last */
5922 /* Can happen in the home */
5923 if (!object_is_aware(o_ptr)) return FALSE;
5924 if (!object_is_aware(j_ptr)) return TRUE;
5926 /* Objects sort by increasing sval */
5927 if (o_ptr->sval < j_ptr->sval) return TRUE;
5928 if (o_ptr->sval > j_ptr->sval) return FALSE;
5930 /* Unidentified objects always come last */
5931 /* Objects in the home can be unknown */
5932 if (!object_is_known(o_ptr)) return FALSE;
5933 if (!object_is_known(j_ptr)) return TRUE;
5935 /* Fixed artifacts, random artifacts and ego items */
5936 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
5937 else if (o_ptr->art_name) o_type = 2;
5938 else if (object_is_ego(o_ptr)) o_type = 1;
5941 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
5942 else if (j_ptr->art_name) j_type = 2;
5943 else if (object_is_ego(j_ptr)) j_type = 1;
5946 if (o_type < j_type) return TRUE;
5947 if (o_type > j_type) return FALSE;
5949 switch (o_ptr->tval)
5955 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
5956 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
5962 /* Objects sort by increasing hit/damage bonuses */
5963 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
5964 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
5967 /* Hack: otherwise identical rods sort by
5968 increasing recharge time --dsb */
5970 if (o_ptr->pval < j_ptr->pval) return TRUE;
5971 if (o_ptr->pval > j_ptr->pval) return FALSE;
5975 /* Objects sort by decreasing value */
5976 return o_value > object_value(j_ptr);
5981 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
5982 * Add an item to the players inventory, and return the slot used.
5983 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
5984 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
5986 * If the new item can combine with an existing item in the inventory,\n
5987 * it will do so, using "object_similar()" and "object_absorb()", else,\n
5988 * the item will be placed into the "proper" location in the inventory.\n
5990 * This function can be used to "over-fill" the player's pack, but only\n
5991 * once, and such an action must trigger the "overflow" code immediately.\n
5992 * Note that when the pack is being "over-filled", the new item must be\n
5993 * placed into the "overflow" slot, and the "overflow" must take place\n
5994 * before the pack is reordered, but (optionally) after the pack is\n
5995 * combined. This may be tricky. See "dungeon.c" for info.\n
5997 * Note that this code must remove any location/stack information\n
5998 * from the object once it is placed into the inventory.\n
6000 s16b inven_carry(object_type *o_ptr)
6002 INVENTORY_IDX i, j, k;
6003 INVENTORY_IDX n = -1;
6008 /* Check for combining */
6009 for (j = 0; j < INVEN_PACK; j++)
6011 j_ptr = &inventory[j];
6013 /* Skip non-objects */
6014 if (!j_ptr->k_idx) continue;
6016 /* Hack -- track last item */
6019 /* Check if the two items can be combined */
6020 if (object_similar(j_ptr, o_ptr))
6022 /* Combine the items */
6023 object_absorb(j_ptr, o_ptr);
6025 /* Increase the weight */
6026 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6028 /* Recalculate bonuses */
6029 p_ptr->update |= (PU_BONUS);
6031 p_ptr->window |= (PW_INVEN);
6040 if (inven_cnt > INVEN_PACK) return (-1);
6042 /* Find an empty slot */
6043 for (j = 0; j <= INVEN_PACK; j++)
6045 j_ptr = &inventory[j];
6047 /* Use it if found */
6048 if (!j_ptr->k_idx) break;
6055 /* Reorder the pack */
6058 /* Get the "value" of the item */
6059 s32b o_value = object_value(o_ptr);
6061 /* Scan every occupied slot */
6062 for (j = 0; j < INVEN_PACK; j++)
6064 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6071 for (k = n; k >= i; k--)
6073 /* Hack -- Slide the item */
6074 object_copy(&inventory[k+1], &inventory[k]);
6077 /* Wipe the empty slot */
6078 object_wipe(&inventory[i]);
6083 object_copy(&inventory[i], o_ptr);
6085 /* Access new object */
6086 j_ptr = &inventory[i];
6089 j_ptr->next_o_idx = 0;
6091 /* Forget monster */
6092 j_ptr->held_m_idx = 0;
6094 /* Forget location */
6095 j_ptr->iy = j_ptr->ix = 0;
6097 /* Player touches it, and no longer marked */
6098 j_ptr->marked = OM_TOUCHED;
6100 /* Increase the weight */
6101 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6103 /* Count the items */
6106 /* Recalculate bonuses */
6107 p_ptr->update |= (PU_BONUS);
6109 /* Combine and Reorder pack */
6110 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
6112 p_ptr->window |= (PW_INVEN);
6114 /* Return the slot */
6120 * @brief 装備スロットからオブジェクトを外すメインルーチン /
6121 * Take off (some of) a non-cursed equipment item
6122 * @param item オブジェクトを外したい所持テーブルのID
6124 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6126 * Note that only one item at a time can be wielded per slot.\n
6127 * Note that taking off an item when "full" may cause that item\n
6128 * to fall to the ground.\n
6129 * Return the inventory slot into which the item is placed.\n
6131 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
6142 char o_name[MAX_NLEN];
6145 /* Get the item to take off */
6146 o_ptr = &inventory[item];
6149 if (amt <= 0) return (-1);
6152 if (amt > o_ptr->number) amt = o_ptr->number;
6155 /* Obtain a local object */
6156 object_copy(q_ptr, o_ptr);
6158 /* Modify quantity */
6159 q_ptr->number = amt;
6161 object_desc(o_name, q_ptr, 0);
6163 /* Took off weapon */
6164 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
6165 object_is_melee_weapon(o_ptr))
6167 act = _("を装備からはずした", "You were wielding");
6171 else if (item == INVEN_BOW)
6173 act = _("を装備からはずした", "You were holding");
6176 /* Took off light */
6177 else if (item == INVEN_LITE)
6179 act = _("を光源からはずした", "You were holding");
6182 /* Took off something */
6185 act = _("を装備からはずした", "You were wearing");
6188 /* Modify, Optimize */
6189 inven_item_increase(item, -amt);
6190 inven_item_optimize(item);
6192 /* Carry the object */
6193 slot = inven_carry(q_ptr);
6196 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
6198 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6208 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
6209 * Drop (some of) a non-cursed inventory/equipment item
6210 * @param item 所持テーブルのID
6211 * @param amt 落としたい個数
6214 * The object will be dropped "near" the current location
6216 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
6222 char o_name[MAX_NLEN];
6224 /* Access original object */
6225 o_ptr = &inventory[item];
6228 if (amt <= 0) return;
6231 if (amt > o_ptr->number) amt = o_ptr->number;
6233 /* Take off equipment */
6234 if (item >= INVEN_RARM)
6236 /* Take off first */
6237 item = inven_takeoff(item, amt);
6239 /* Access original object */
6240 o_ptr = &inventory[item];
6245 /* Obtain local object */
6246 object_copy(q_ptr, o_ptr);
6248 /* Distribute charges of wands or rods */
6249 distribute_charges(o_ptr, q_ptr, amt);
6251 /* Modify quantity */
6252 q_ptr->number = amt;
6254 /* Describe local object */
6255 object_desc(o_name, q_ptr, 0);
6257 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
6259 /* Drop it near the player */
6260 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
6262 /* Modify, Describe, Optimize */
6263 inven_item_increase(item, -amt);
6264 inven_item_describe(item);
6265 inven_item_optimize(item);
6270 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
6271 * Combine items in the pack
6274 * Note special handling of the "overflow" slot
6276 void combine_pack(void)
6281 bool flag = FALSE, combined;
6287 /* Combine the pack (backwards) */
6288 for (i = INVEN_PACK; i > 0; i--)
6290 o_ptr = &inventory[i];
6292 /* Skip empty items */
6293 if (!o_ptr->k_idx) continue;
6295 /* Scan the items above that item */
6296 for (j = 0; j < i; j++)
6300 j_ptr = &inventory[j];
6302 /* Skip empty items */
6303 if (!j_ptr->k_idx) continue;
6306 * Get maximum number of the stack if these
6307 * are similar, get zero otherwise.
6309 max_num = object_similar_part(j_ptr, o_ptr);
6311 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6312 if (max_num && j_ptr->number < max_num)
6314 if (o_ptr->number + j_ptr->number <= max_num)
6319 /* Add together the item counts */
6320 object_absorb(j_ptr, o_ptr);
6322 /* One object is gone */
6325 /* Slide everything down */
6326 for (k = i; k < INVEN_PACK; k++)
6328 /* Structure copy */
6329 inventory[k] = inventory[k+1];
6332 /* Erase the "final" slot */
6333 object_wipe(&inventory[k]);
6337 int old_num = o_ptr->number;
6338 int remain = j_ptr->number + o_ptr->number - max_num;
6340 o_ptr->number -= remain;
6342 /* Add together the item counts */
6343 object_absorb(j_ptr, o_ptr);
6345 o_ptr->number = remain;
6347 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6348 if (o_ptr->tval == TV_ROD)
6350 o_ptr->pval = o_ptr->pval * remain / old_num;
6351 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6354 /* Hack -- if wands are stacking, combine the charges. -LM- */
6355 if (o_ptr->tval == TV_WAND)
6357 o_ptr->pval = o_ptr->pval * remain / old_num;
6361 p_ptr->window |= (PW_INVEN);
6373 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6377 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6378 * Reorder items in the pack
6381 * Note special handling of the "overflow" slot
6383 void reorder_pack(void)
6393 /* Re-order the pack (forwards) */
6394 for (i = 0; i < INVEN_PACK; i++)
6396 /* Mega-Hack -- allow "proper" over-flow */
6397 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6399 o_ptr = &inventory[i];
6401 /* Skip empty slots */
6402 if (!o_ptr->k_idx) continue;
6404 /* Get the "value" of the item */
6405 o_value = object_value(o_ptr);
6407 /* Scan every occupied slot */
6408 for (j = 0; j < INVEN_PACK; j++)
6410 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6413 /* Never move down */
6414 if (j >= i) continue;
6420 /* Save a copy of the moving item */
6421 object_copy(q_ptr, &inventory[i]);
6423 /* Slide the objects */
6424 for (k = i; k > j; k--)
6426 /* Slide the item */
6427 object_copy(&inventory[k], &inventory[k-1]);
6430 /* Insert the moving item */
6431 object_copy(&inventory[j], q_ptr);
6433 p_ptr->window |= (PW_INVEN);
6436 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6440 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6441 * Hack -- display an object kind in the current window
6442 * @param k_idx ベースアイテムの参照ID
6445 * Include list of usable spells for readible books
6447 void display_koff(KIND_OBJECT_IDX k_idx)
6454 REALM_IDX use_realm;
6456 char o_name[MAX_NLEN];
6459 /* Erase the window */
6460 for (y = 0; y < Term->hgt; y++)
6462 /* Erase the line */
6463 Term_erase(0, y, 255);
6470 /* Prepare the object */
6471 object_prep(q_ptr, k_idx);
6472 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6474 /* Mention the object name */
6475 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6477 /* Access the item's sval */
6479 use_realm = tval2realm(q_ptr->tval);
6481 /* Warriors are illiterate */
6482 if (p_ptr->realm1 || p_ptr->realm2)
6484 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6488 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6489 if (!is_magic(use_realm)) return;
6490 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6493 /* Display spells in readible books */
6497 SPELL_IDX spells[64];
6499 /* Extract spells */
6500 for (spell = 0; spell < 32; spell++)
6502 /* Check for this spell */
6503 if (fake_spell_flags[sval] & (1L << spell))
6505 /* Collect this spell */
6506 spells[num++] = spell;
6511 print_spells(0, spells, num, 2, 0, use_realm);
6516 * @brief 警告を放つアイテムを選択する /
6517 * Choose one of items that have warning flag
6518 * Calculate spell damages
6521 object_type *choose_warning_item(void)
6524 int choices[INVEN_TOTAL - INVEN_RARM];
6527 /* Paranoia -- Player has no warning ability */
6528 if (!p_ptr->warning) return NULL;
6530 /* Search Inventory */
6531 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6533 BIT_FLAGS flgs[TR_FLAG_SIZE];
6534 object_type *o_ptr = &inventory[i];
6536 object_flags(o_ptr, flgs);
6537 if (have_flag(flgs, TR_WARNING))
6539 choices[number] = i;
6544 /* Choice one of them */
6545 return number ? &inventory[choices[randint0(number)]] : NULL;
6549 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6550 * Calculate spell damages
6551 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6552 * @param typ 効果属性のID
6554 * @param max 算出した最大ダメージを返すポインタ
6557 static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
6559 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6560 int rlev = r_ptr->level;
6561 bool ignore_wraith_form = FALSE;
6563 /* Vulnerability, resistance and immunity */
6567 if (p_ptr->immune_elec)
6570 ignore_wraith_form = TRUE;
6574 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6575 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6576 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6577 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6578 if (IS_OPPOSE_ELEC())
6579 dam = (dam + 2) / 3;
6584 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6585 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6589 if (p_ptr->immune_acid)
6592 ignore_wraith_form = TRUE;
6596 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6597 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6598 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6599 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6605 if (p_ptr->immune_cold)
6608 ignore_wraith_form = TRUE;
6612 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6613 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6614 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6615 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6620 if (p_ptr->immune_fire)
6623 ignore_wraith_form = TRUE;
6627 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6628 if (prace_is_(RACE_ENT)) dam += dam / 3;
6629 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6630 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6631 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6636 ignore_wraith_form = TRUE;
6640 if (!p_ptr->blind &&
6641 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6642 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6645 ignore_wraith_form = TRUE;
6650 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6651 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6652 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6655 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6656 * "dam *= 2;" for later "dam /= 2"
6658 if (p_ptr->wraith_form) dam *= 2;
6662 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6665 ignore_wraith_form = TRUE;
6667 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6671 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6675 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6679 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6683 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6687 if (prace_is_(RACE_SPECTRE))
6690 ignore_wraith_form = TRUE;
6692 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6696 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6700 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6704 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6708 if (p_ptr->levitation) dam = (dam * 2) / 3;
6712 if (p_ptr->resist_shard) dam /= 2;
6716 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6717 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6721 if (p_ptr->mimic_form)
6723 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6726 ignore_wraith_form = TRUE;
6731 switch (p_ptr->prace)
6740 ignore_wraith_form = TRUE;
6747 if (p_ptr->align > 10) dam /= 2;
6748 else if (p_ptr->align < -10) dam *= 2;
6752 if (p_ptr->align > 10) dam *= 2;
6756 case GF_BRAIN_SMASH:
6757 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6760 ignore_wraith_form = TRUE;
6768 if (100 + rlev / 2 <= p_ptr->skill_sav)
6771 ignore_wraith_form = TRUE;
6776 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6779 ignore_wraith_form = TRUE;
6784 if (p_ptr->wraith_form && !ignore_wraith_form)
6790 if (dam > *max) *max = dam;
6794 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6795 * Calculate spell damages
6796 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6797 * @param typ 効果属性のID
6798 * @param m_idx 魔法を行使するモンスターのID
6799 * @param max 算出した最大ダメージを返すポインタ
6802 void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
6804 monster_type *m_ptr = &m_list[m_idx];
6805 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6806 spell_damcalc(m_ptr, typ, dam, max);
6810 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6811 * Calculate blow damages
6812 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6813 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6814 * @return 算出された最大ダメージを返す。
6816 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6818 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6820 bool check_wraith_form = TRUE;
6822 if (blow_ptr->method != RBM_EXPLODE)
6824 ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
6826 switch (blow_ptr->effect)
6830 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6831 dam = MAX(dam, tmp_dam * 2);
6837 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6841 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6843 check_wraith_form = FALSE;
6847 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6849 check_wraith_form = FALSE;
6853 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6855 check_wraith_form = FALSE;
6859 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6861 check_wraith_form = FALSE;
6866 check_wraith_form = FALSE;
6870 if (check_wraith_form && p_ptr->wraith_form)
6878 dam = (dam + 1) / 2;
6879 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
6887 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
6888 * Examine the grid (xx,yy) and warn the player if there are any danger
6889 * @param xx 危険性を調査するマスのX座標
6890 * @param yy 危険性を調査するマスのY座標
6891 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
6893 bool process_warning(POSITION xx, POSITION yy)
6897 char o_name[MAX_NLEN];
6899 #define WARNING_AWARE_RANGE 12
6901 static int old_damage = 0;
6903 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
6905 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
6908 monster_type *m_ptr;
6909 monster_race *r_ptr;
6911 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
6913 c_ptr = &cave[my][mx];
6915 if (!c_ptr->m_idx) continue;
6917 m_ptr = &m_list[c_ptr->m_idx];
6919 if (MON_CSLEEP(m_ptr)) continue;
6920 if (!is_hostile(m_ptr)) continue;
6922 r_ptr = &r_info[m_ptr->r_idx];
6924 /* Monster spells (only powerful ones)*/
6925 if (projectable(my, mx, yy, xx))
6927 BIT_FLAGS f4 = r_ptr->flags4;
6928 BIT_FLAGS f5 = r_ptr->a_ability_flags1;
6929 BIT_FLAGS f6 = r_ptr->a_ability_flags2;
6931 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
6933 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
6934 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
6935 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
6936 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, c_ptr->m_idx, &dam_max0);
6937 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, c_ptr->m_idx, &dam_max0);
6938 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, c_ptr->m_idx, &dam_max0);
6940 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, c_ptr->m_idx, &dam_max0);
6941 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, c_ptr->m_idx, &dam_max0);
6942 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, c_ptr->m_idx, &dam_max0);
6943 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, c_ptr->m_idx, &dam_max0);
6944 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, c_ptr->m_idx, &dam_max0);
6945 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, c_ptr->m_idx, &dam_max0);
6946 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, c_ptr->m_idx, &dam_max0);
6947 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, c_ptr->m_idx, &dam_max0);
6948 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
6949 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, c_ptr->m_idx, &dam_max0);
6950 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, c_ptr->m_idx, &dam_max0);
6951 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
6952 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, c_ptr->m_idx, &dam_max0);
6953 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, c_ptr->m_idx, &dam_max0);
6954 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, c_ptr->m_idx, &dam_max0);
6955 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, c_ptr->m_idx, &dam_max0);
6956 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, c_ptr->m_idx, &dam_max0);
6957 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, c_ptr->m_idx, &dam_max0);
6958 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, c_ptr->m_idx, &dam_max0);
6959 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, c_ptr->m_idx, &dam_max0);
6960 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
6961 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, c_ptr->m_idx, &dam_max0);
6962 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, c_ptr->m_idx, &dam_max0);
6965 /* Monster melee attacks */
6966 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
6968 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
6972 for (m = 0; m < 4; m++)
6974 /* Skip non-attacks */
6975 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
6977 /* Extract the attack info */
6978 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
6979 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
6981 if (dam_melee > dam_max0) dam_max0 = dam_melee;
6985 /* Contribution from this monster */
6986 dam_max += dam_max0;
6990 /* Prevent excessive warning */
6991 if (dam_max > old_damage)
6993 old_damage = dam_max * 3 / 2;
6995 if (dam_max > p_ptr->chp / 2)
6997 object_type *o_ptr = choose_warning_item();
7000 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7002 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7003 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7005 disturb(FALSE, TRUE);
7006 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7009 else old_damage = old_damage / 2;
7011 c_ptr = &cave[yy][xx];
7012 if (((!easy_disarm && is_trap(c_ptr->feat))
7013 || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
7015 object_type *o_ptr = choose_warning_item();
7018 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7020 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7021 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7022 disturb(FALSE, TRUE);
7023 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7030 * エッセンス情報の構造体 / A structure for smithing
7033 int add; /* TR flag number or special essence id */
7034 cptr add_name; /* Name of this ability */
7035 ESSENCE_IDX type; /* Menu number */
7036 int essence; /* Index for carrying essences */
7037 int value; /* Needed value to add this ability */
7042 * エッセンス情報テーブル Smithing type data for Weapon smith
7045 static essence_type essence_info[] =
7047 {TR_STR, "腕力", 4, TR_STR, 20},
7048 {TR_INT, "知能", 4, TR_INT, 20},
7049 {TR_WIS, "賢さ", 4, TR_WIS, 20},
7050 {TR_DEX, "器用さ", 4, TR_DEX, 20},
7051 {TR_CON, "耐久力", 4, TR_CON, 20},
7052 {TR_CHR, "魅力", 4, TR_CHR, 20},
7053 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
7054 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
7055 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
7056 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
7057 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
7058 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
7059 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
7060 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
7061 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
7062 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
7063 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
7064 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
7065 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
7066 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
7067 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
7068 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
7069 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
7070 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
7071 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
7072 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
7073 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
7074 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
7075 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
7076 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
7077 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
7078 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
7079 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
7080 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
7081 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
7082 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
7083 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
7084 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
7085 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
7086 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
7087 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
7088 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
7089 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
7090 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
7091 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
7092 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
7093 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
7094 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
7095 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
7096 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
7097 {TR_SH_FIRE, "", 0, -2, 0},
7098 {TR_SH_ELEC, "", 0, -2, 0},
7099 {TR_SH_COLD, "", 0, -2, 0},
7100 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
7101 {TR_WARNING, "警告", 3, TR_WARNING, 20},
7102 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
7103 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
7104 {TR_LITE_2, "", 0, -2, 0},
7105 {TR_LITE_3, "", 0, -2, 0},
7106 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
7107 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
7108 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
7109 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
7110 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
7112 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
7113 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
7114 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
7115 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
7116 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
7117 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
7118 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
7119 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
7120 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
7121 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
7122 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
7123 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
7124 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
7125 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
7126 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
7127 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
7128 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
7129 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
7131 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
7132 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
7133 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
7134 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
7135 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
7136 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
7137 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
7138 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
7140 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
7141 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
7142 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
7143 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
7144 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
7145 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
7146 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
7147 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
7148 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
7149 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
7150 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
7151 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
7153 {-1, NULL, 0, -1, 0}
7156 static essence_type essence_info[] =
7158 {TR_STR, "strength", 4, TR_STR, 20},
7159 {TR_INT, "intelligence", 4, TR_INT, 20},
7160 {TR_WIS, "wisdom", 4, TR_WIS, 20},
7161 {TR_DEX, "dexterity", 4, TR_DEX, 20},
7162 {TR_CON, "constitution", 4, TR_CON, 20},
7163 {TR_CHR, "charisma", 4, TR_CHR, 20},
7164 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
7165 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
7166 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
7167 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
7168 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
7169 {TR_SPEED, "speed", 4, TR_SPEED, 12},
7170 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
7171 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
7172 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
7173 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
7174 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
7175 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
7176 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
7177 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
7178 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
7179 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
7180 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
7181 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
7182 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
7183 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
7184 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
7185 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
7186 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
7187 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
7188 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
7189 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
7190 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
7191 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
7192 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
7193 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
7194 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
7195 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
7196 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
7197 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
7198 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
7199 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
7200 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
7201 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
7202 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
7203 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
7204 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
7205 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
7206 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
7207 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
7208 {TR_SH_FIRE, "", 0, -2, 0},
7209 {TR_SH_ELEC, "", 0, -2, 0},
7210 {TR_SH_COLD, "", 0, -2, 0},
7211 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
7212 {TR_WARNING, "warning", 3, TR_WARNING, 20},
7213 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
7214 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
7215 {TR_LITE_2, "", 0, -2, 0},
7216 {TR_LITE_3, "", 0, -2, 0},
7217 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7218 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7219 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7220 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7221 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7223 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7224 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7225 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7226 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7227 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7228 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7229 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7230 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7231 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7232 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7233 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7234 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7235 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7236 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
7237 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7238 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7239 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7240 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7242 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7243 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
7244 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
7245 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
7246 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
7247 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
7248 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7249 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7251 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7252 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7253 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7254 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7255 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7256 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7257 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7258 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7259 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7260 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7261 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7262 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7264 {-1, NULL, 0, -1, 0}
7270 * エッセンス名テーブル / Essense names for Weapon smith
7273 cptr essence_name[] =
7376 cptr essence_name[] =
7479 * @brief 所持しているエッセンス一覧を表示する
7482 static void display_essence(void)
7487 for (i = 1; i < 22; i++)
7491 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7492 "Essence Num Essence Num Essence Num "), 1, 8);
7493 for (i = 0; essence_name[i]; i++)
7495 if (!essence_name[i][0]) continue;
7496 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7499 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7509 static void drain_essence(void)
7511 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7515 bool observe = FALSE;
7516 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7517 TIME_EFFECT old_timeout;
7518 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7524 OBJECT_IDX next_o_idx;
7527 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7530 item_tester_hook = object_is_weapon_armour_ammo;
7531 item_tester_no_ryoute = TRUE;
7533 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7534 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7536 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7538 /* Get the item (in the pack) */
7541 o_ptr = &inventory[item];
7544 /* Get the item (on the floor) */
7547 o_ptr = &o_list[0 - item];
7550 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7552 char o_name[MAX_NLEN];
7553 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7554 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7557 p_ptr->energy_use = 100;
7559 object_flags(o_ptr, old_flgs);
7560 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7561 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7562 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7563 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7564 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7565 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7566 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7567 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7568 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7570 old_to_a = o_ptr->to_a;
7572 old_to_h = o_ptr->to_h;
7573 old_to_d = o_ptr->to_d;
7576 old_pval = o_ptr->pval;
7577 old_name2 = o_ptr->name2;
7578 old_timeout = o_ptr->timeout;
7579 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7580 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7581 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7582 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7583 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7584 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7585 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7586 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7587 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7588 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7589 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7590 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7591 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7592 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7593 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7594 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7595 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7596 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7597 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7601 next_o_idx = o_ptr->next_o_idx;
7602 marked = o_ptr->marked;
7603 weight = o_ptr->weight;
7604 number = o_ptr->number;
7606 object_prep(o_ptr, o_ptr->k_idx);
7610 o_ptr->next_o_idx=next_o_idx;
7611 o_ptr->marked=marked;
7612 o_ptr->number = number;
7613 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7614 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7615 o_ptr->ident |= (IDENT_MENTAL);
7616 object_aware(o_ptr);
7617 object_known(o_ptr);
7619 object_flags(o_ptr, new_flgs);
7621 for (i = 0; essence_info[i].add_name; i++)
7623 essence_type *es_ptr = &essence_info[i];
7624 PARAMETER_VALUE pval = 0;
7626 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7627 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7629 if (es_ptr->add < TR_FLAG_MAX &&
7630 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7631 have_flag(old_flgs, es_ptr->add))
7635 drain_value[es_ptr->essence] += 10 * pval;
7637 else if (es_ptr->essence != -2)
7639 drain_value[es_ptr->essence] += 10;
7641 else if (es_ptr->add == TR_SH_FIRE)
7643 drain_value[TR_BRAND_FIRE] += 10;
7644 drain_value[TR_RES_FIRE] += 10;
7646 else if (es_ptr->add == TR_SH_ELEC)
7648 drain_value[TR_BRAND_ELEC] += 10;
7649 drain_value[TR_RES_ELEC] += 10;
7651 else if (es_ptr->add == TR_SH_COLD)
7653 drain_value[TR_BRAND_COLD] += 10;
7654 drain_value[TR_RES_COLD] += 10;
7656 else if (es_ptr->add == TR_LITE_2)
7658 drain_value[TR_LITE_1] += 20;
7660 else if (es_ptr->add == TR_LITE_3)
7662 drain_value[TR_LITE_1] += 30;
7667 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7669 drain_value[TR_INT] += 5;
7670 drain_value[TR_WIS] += 5;
7672 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7674 drain_value[TR_BRAND_POIS] += 5;
7675 drain_value[TR_BRAND_ACID] += 5;
7676 drain_value[TR_BRAND_ELEC] += 5;
7677 drain_value[TR_BRAND_FIRE] += 5;
7678 drain_value[TR_BRAND_COLD] += 5;
7680 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7682 drain_value[TR_INT] += 10;
7684 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7686 drain_value[TR_STR] += 10;
7688 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7690 drain_value[TR_DEX] += 10;
7692 if (old_name2 == EGO_2WEAPON)
7694 drain_value[TR_DEX] += 20;
7696 if (object_is_weapon_ammo(o_ptr))
7698 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7700 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7702 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7703 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7704 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7705 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7707 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7709 drain_value[i] *= number;
7710 drain_value[i] = drain_value[i] * dec / 4;
7711 drain_value[i] = MAX(drain_value[i], 0);
7712 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7720 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7724 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7726 for (i = 0; essence_name[i]; i++)
7728 if (!essence_name[i][0]) continue;
7729 if (!drain_value[i]) continue;
7731 p_ptr->magic_num1[i] += drain_value[i];
7732 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7734 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7738 /* Apply autodestroy/inscription to the drained item */
7739 autopick_alter_item(item, TRUE);
7741 /* Combine the pack */
7742 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
7744 p_ptr->window |= (PW_INVEN);
7748 * @brief 付加するエッセンスの大別を選択する
7749 * @return 選んだエッセンスの大別ID
7751 static COMMAND_CODE choose_essence(void)
7753 COMMAND_CODE mode = 0;
7755 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7758 cptr menu_name[] = {
7768 cptr menu_name[] = {
7778 const COMMAND_CODE mode_max = 7;
7780 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7790 for (i = 0; i < mode_max; i++)
7792 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7793 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7795 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7796 prt("Choose from menu.", 0, 0);
7815 menu_line += mode_max - 1;
7824 if (menu_line > mode_max) menu_line -= mode_max;
7835 for (i = 0; i < mode_max; i++)
7836 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7838 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7844 if (isupper(choice)) choice = (char)tolower(choice);
7846 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7847 mode = (int)choice - 'a' + 1;
7857 * @brief エッセンスを実際に付加する
7858 * @param mode エッセンスの大別ID
7861 static void add_essence(ESSENCE_IDX mode)
7873 char o_name[MAX_NLEN];
7875 essence_type *es_ptr;
7876 bool able[22] = { 0 };
7878 int menu_line = (use_menu ? 1 : 0);
7880 for (i = 0; essence_info[i].add_name; i++)
7882 es_ptr = &essence_info[i];
7884 if (es_ptr->type != mode) continue;
7888 if (!repeat_pull(&i) || i<0 || i>=max_num)
7891 /* Nothing chosen yet */
7897 /* Build a prompt */
7898 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
7899 if (use_menu) screen_save();
7901 /* Get a spell from the user */
7903 choice = (always_show_list || use_menu) ? ESCAPE:1;
7906 if( choice==ESCAPE ) choice = ' ';
7907 else if( !get_com(out_val, &choice, FALSE) )break;
7909 if (use_menu && choice != ' ')
7923 menu_line += (max_num-1);
7946 menu_line = max_num;
7960 if (menu_line > max_num) menu_line -= max_num;
7962 /* Request redraw */
7963 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
7966 if (!redraw || use_menu)
7970 char dummy[80], dummy2[80];
7977 if (!use_menu) screen_save();
7979 for (y = 1; y < 24; y++)
7982 /* Print header(s) */
7984 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
7987 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
7990 for (ctr = 0; ctr < max_num; ctr++)
7992 es_ptr = &essence_info[num[ctr]];
7996 if (ctr == (menu_line-1))
7997 strcpy(dummy, _("》 ", "> "));
7998 else strcpy(dummy, " ");
8001 /* letter/number for power selection */
8004 sprintf(dummy, "%c) ",I2A(ctr));
8007 strcat(dummy, es_ptr->add_name);
8012 if (es_ptr->essence != -1)
8014 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
8015 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
8021 case ESSENCE_SH_FIRE:
8022 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
8023 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
8024 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8026 case ESSENCE_SH_ELEC:
8027 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
8028 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
8029 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8031 case ESSENCE_SH_COLD:
8032 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
8033 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
8034 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8036 case ESSENCE_RESISTANCE:
8037 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8038 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8039 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8040 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8041 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8043 case ESSENCE_SUSTAIN:
8044 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8045 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8046 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8047 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8048 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8053 if (!able[ctr]) col = TERM_RED;
8055 if (es_ptr->essence != -1)
8057 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
8061 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
8064 c_prt(col, dummy2, ctr+2, x);
8083 ask = (isupper(choice));
8086 if (ask) choice = (char)tolower(choice);
8088 /* Extract request */
8089 i = (islower(choice) ? A2I(choice) : -1);
8092 /* Totally Illegal */
8093 if ((i < 0) || (i >= max_num) || !able[i])
8105 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
8107 /* Belay that order */
8108 if (!get_check(tmp_val)) continue;
8114 if (redraw) screen_load();
8120 es_ptr = &essence_info[num[i]];
8122 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8123 item_tester_tval = TV_GLOVES;
8124 else if (mode == 1 || mode == 5)
8125 item_tester_hook = item_tester_hook_melee_ammo;
8126 else if (es_ptr->add == ESSENCE_ATTACK)
8127 item_tester_hook = object_allow_enchant_weapon;
8128 else if (es_ptr->add == ESSENCE_AC)
8129 item_tester_hook = object_is_armour;
8131 item_tester_hook = object_is_weapon_armour_ammo;
8132 item_tester_no_ryoute = TRUE;
8134 q = _("どのアイテムを改良しますか?", "Improve which item? ");
8135 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
8137 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8139 /* Get the item (in the pack) */
8142 o_ptr = &inventory[item];
8145 /* Get the item (on the floor) */
8148 o_ptr = &o_list[0 - item];
8151 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
8153 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
8157 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8159 use_essence = es_ptr->value;
8160 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
8161 if (o_ptr->number > 1)
8163 use_essence *= o_ptr->number;
8164 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
8167 if (es_ptr->essence != -1)
8169 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8171 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8174 if (is_pval_flag(es_ptr->add))
8176 if (o_ptr->pval < 0)
8178 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
8181 else if (es_ptr->add == TR_BLOWS)
8183 if (o_ptr->pval > 1)
8185 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
8189 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8191 else if (o_ptr->pval > 0)
8193 use_essence *= o_ptr->pval;
8194 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8200 PARAMETER_VALUE pval;
8201 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8203 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
8204 strcpy(tmp_val, "1");
8206 if (!get_string(tmp, tmp_val, 1)) return;
8207 pval = (PARAMETER_VALUE)atoi(tmp_val);
8208 if (pval > limit) pval = limit;
8209 else if (pval < 1) pval = 1;
8210 o_ptr->pval += pval;
8211 use_essence *= pval;
8212 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8215 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8217 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8221 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8228 strcpy(tmp_val, "1");
8229 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
8230 val = atoi(tmp_val);
8231 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8232 else if (val < 1) val = 1;
8234 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8235 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8237 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8240 get_to_h = ((val+1)/2+randint0(val/2+1));
8241 get_to_d = ((val+1)/2+randint0(val/2+1));
8242 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8243 o_ptr->to_h += get_to_h;
8244 o_ptr->to_d += get_to_d;
8246 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8247 if (es_ptr->add == ESSENCE_ATTACK)
8249 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8251 msg_print(_("改良に失敗した。", "You failed to enchant."));
8252 p_ptr->energy_use = 100;
8257 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8258 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8261 else if (es_ptr->add == ESSENCE_AC)
8263 if (o_ptr->to_a >= p_ptr->lev/5+5)
8265 msg_print(_("改良に失敗した。", "You failed to enchant."));
8266 p_ptr->energy_use = 100;
8271 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8276 o_ptr->xtra3 = es_ptr->add + 1;
8281 bool success = TRUE;
8285 case ESSENCE_SH_FIRE:
8286 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8291 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8292 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8294 case ESSENCE_SH_ELEC:
8295 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8300 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8301 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8303 case ESSENCE_SH_COLD:
8304 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8309 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8310 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8312 case ESSENCE_RESISTANCE:
8313 case ESSENCE_SUSTAIN:
8314 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))
8319 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8320 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8321 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8322 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8327 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8330 if (es_ptr->add == ESSENCE_SUSTAIN)
8332 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8333 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8334 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8335 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8339 o_ptr->xtra3 = es_ptr->add + 1;
8343 p_ptr->energy_use = 100;
8346 msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name);
8348 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8351 /* Combine the pack */
8352 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8354 p_ptr->window |= (PW_INVEN);
8361 static void erase_essence(void)
8366 char o_name[MAX_NLEN];
8367 BIT_FLAGS flgs[TR_FLAG_SIZE];
8369 item_tester_hook = object_is_smith;
8371 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
8372 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
8374 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8376 /* Get the item (in the pack) */
8379 o_ptr = &inventory[item];
8382 /* Get the item (on the floor) */
8385 o_ptr = &o_list[0 - item];
8388 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8389 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
8391 p_ptr->energy_use = 100;
8393 if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE)
8395 o_ptr->to_h -= (o_ptr->xtra4>>8);
8396 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8398 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8399 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8402 object_flags(o_ptr, flgs);
8403 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8404 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8406 /* Combine the pack */
8407 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8409 p_ptr->window |= (PW_INVEN);
8413 * @brief 鍛冶コマンドのメインルーチン
8414 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8417 void do_cmd_kaji(bool only_browse)
8419 COMMAND_CODE mode = 0;
8422 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8426 if (p_ptr->confused)
8428 msg_print(_("混乱していて作業できない!", "You are too confused!"));
8433 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8438 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8443 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8445 if (only_browse) screen_save();
8447 if (!only_browse) screen_save();
8453 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8454 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8455 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8456 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8457 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8458 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8460 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8461 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8462 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8463 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8464 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8465 prt(format("Choose command from menu."), 0, 0);
8492 if (menu_line > 5) menu_line -= 5;
8500 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
8501 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
8502 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
8503 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
8504 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
8506 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8508 if (!get_com("Command :", &choice, TRUE))
8545 /* Clear lines, position cursor (really should use strlen here) */
8546 Term_erase(14, 21, 255);
8547 Term_erase(14, 20, 255);
8548 Term_erase(14, 19, 255);
8549 Term_erase(14, 18, 255);
8550 Term_erase(14, 17, 255);
8551 Term_erase(14, 16, 255);
8553 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8554 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8556 prt(&temp[j], line, 15);
8561 if (!only_browse) screen_load();
8562 } while (only_browse);
8567 case 1: display_essence();break;
8568 case 2: drain_essence();break;
8569 case 3: erase_essence();break;
8571 mode = choose_essence();
8576 case 5: add_essence(10);break;
8582 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8583 * Torches have special abilities when they are flaming.
8584 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8585 * @param flgs 特別に追加するフラグを返す参照ポインタ
8588 void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
8590 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8592 if (o_ptr->xtra4 > 0)
8594 add_flag(flgs, TR_BRAND_FIRE);
8595 add_flag(flgs, TR_KILL_UNDEAD);
8596 add_flag(flgs, TR_THROW);
8602 * @brief 投擲時たいまつにダイスを与える。
8603 * Torches have special abilities when they are flaming.
8604 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8605 * @param dd 特別なダイス数を返す参照ポインタ
8606 * @param ds 特別なダイス面数を返す参照ポインタ
8609 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
8611 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8613 if (o_ptr->xtra4 > 0)
8622 * @brief 投擲時命中したたいまつの寿命を縮める。
8623 * Torches have special abilities when they are flaming.
8624 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8627 void torch_lost_fuel(object_type *o_ptr)
8629 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8631 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8632 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;