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 GAME_TEXT o_name[MAX_NLEN];
794 object_copy(q_ptr, o_ptr);
797 object_desc(o_name, q_ptr, OD_NAME_ONLY);
799 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
804 * @brief オブジェクトを試行済にする /
805 * Something has been "sampled"
806 * @param o_ptr 試行済にするオブジェクトの構造体参照ポインタ
809 void object_tried(object_type *o_ptr)
811 /* Mark it as tried (even if "aware") */
812 k_info[o_ptr->k_idx].tried = TRUE;
816 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
817 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
818 * @return 擬似鑑定結果のIDを返す。
820 byte value_check_aux1(object_type *o_ptr)
823 if (object_is_artifact(o_ptr))
826 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
833 if (object_is_ego(o_ptr))
836 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
839 return FEEL_EXCELLENT;
843 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
846 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
848 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
850 /* Good "armor" bonus */
851 if (o_ptr->to_a > 0) return FEEL_GOOD;
853 /* Good "weapon" bonus */
854 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
856 /* Default to "average" */
861 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 2 (Light).
862 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
863 * @return 擬似鑑定結果のIDを返す。
865 byte value_check_aux2(object_type *o_ptr)
867 /* Cursed items (all of them) */
868 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
870 /* Broken items (all of them) */
871 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
873 /* Artifacts -- except cursed/broken ones */
874 if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
876 /* Ego-Items -- except cursed/broken ones */
877 if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
879 /* Good armor bonus */
880 if (o_ptr->to_a > 0) return FEEL_UNCURSED;
882 /* Good weapon bonuses */
883 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
890 * @brief 未鑑定なベースアイテムの基本価格を返す /
891 * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
892 * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
893 * @return オブジェクトの未鑑定価格
895 static 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->update |= (PU_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 GAME_TEXT 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);
4436 switch (o_ptr->tval)
4445 if (power) a_m_aux_1(o_ptr, lev, power);
4451 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4457 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4471 /* Elven Cloak and Black Clothes ... */
4472 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4473 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4474 o_ptr->pval = randint1(4);
4478 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4479 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4480 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4481 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4482 a_m_aux_2(o_ptr, lev, power);
4484 if (power) a_m_aux_2(o_ptr, lev, power);
4492 if (!power && (randint0(100) < 50)) power = -1;
4493 a_m_aux_3(o_ptr, lev, power);
4499 a_m_aux_4(o_ptr, lev, power);
4504 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4505 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4506 (p_ptr->pseikaku == SEIKAKU_SEXY))
4509 add_flag(o_ptr->art_flags, TR_STR);
4510 add_flag(o_ptr->art_flags, TR_INT);
4511 add_flag(o_ptr->art_flags, TR_WIS);
4512 add_flag(o_ptr->art_flags, TR_DEX);
4513 add_flag(o_ptr->art_flags, TR_CON);
4514 add_flag(o_ptr->art_flags, TR_CHR);
4517 /* Hack -- analyze ego-items */
4518 if (object_is_ego(o_ptr))
4520 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4522 /* Hack -- acquire "broken" flag */
4523 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4525 /* Hack -- acquire "cursed" flag */
4526 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4527 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4528 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4529 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4530 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4531 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4533 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4534 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4535 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4536 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4537 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4538 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4539 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4540 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4546 while (one_in_(o_ptr->dd));
4548 if (o_ptr->dd > 9) o_ptr->dd = 9;
4551 /* Hack -- apply activatin index if needed */
4552 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
4554 /* Hack -- apply extra penalties if needed */
4555 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4557 /* Hack -- obtain bonuses */
4558 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4559 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4560 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4562 /* Hack -- obtain pval */
4563 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4566 /* Hack -- apply extra bonuses if needed */
4569 /* Hack -- obtain bonuses */
4570 if (e_ptr->max_to_h)
4572 if (e_ptr->max_to_h > 127)
4573 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4574 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4576 if (e_ptr->max_to_d)
4578 if (e_ptr->max_to_d > 127)
4579 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4580 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4582 if (e_ptr->max_to_a)
4584 if (e_ptr->max_to_a > 127)
4585 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4586 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4589 /* Accuracy ego must have high to_h */
4590 if(o_ptr->name2 == EGO_ACCURACY)
4592 while(o_ptr->to_h < o_ptr->to_d + 10)
4597 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4600 /* Accuracy ego must have high to_h */
4601 if(o_ptr->name2 == EGO_VELOCITY)
4603 while(o_ptr->to_d < o_ptr->to_h + 10)
4608 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4611 /* Protection ego must have high to_a */
4612 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4614 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4617 /* Hack -- obtain pval */
4618 if (e_ptr->max_pval)
4620 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4623 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4625 else if (o_ptr->name2 == EGO_DEMON)
4627 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4629 o_ptr->pval += randint1(2);
4633 o_ptr->pval += randint1(e_ptr->max_pval);
4636 else if (o_ptr->name2 == EGO_ATTACKS)
4638 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4639 if (o_ptr->pval > 3) o_ptr->pval = 3;
4640 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4641 o_ptr->pval += randint1(2);
4643 else if (o_ptr->name2 == EGO_BAT)
4645 o_ptr->pval = randint1(e_ptr->max_pval);
4646 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4648 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4650 o_ptr->pval = randint1(e_ptr->max_pval);
4654 o_ptr->pval += randint1(e_ptr->max_pval);
4659 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4661 o_ptr->pval = randint1(o_ptr->pval);
4663 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4670 /* Examine real objects */
4673 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4675 /* Hack -- acquire "broken" flag */
4676 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4678 /* Hack -- acquire "cursed" flag */
4679 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4680 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4681 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4682 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4683 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4684 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4692 * @brief ベースアイテムが上質として扱われるかどうかを返す。
4693 * Hack -- determine if a template is "good"
4694 * @param k_idx 判定したいベースアイテムのID
4695 * @return ベースアイテムが上質ならばTRUEを返す。
4697 static bool kind_is_good(KIND_OBJECT_IDX k_idx)
4699 object_kind *k_ptr = &k_info[k_idx];
4701 /* Analyze the item type */
4702 switch (k_ptr->tval)
4704 /* Armor -- Good unless damaged */
4715 if (k_ptr->to_a < 0) return (FALSE);
4719 /* Weapons -- Good unless damaged */
4726 if (k_ptr->to_h < 0) return (FALSE);
4727 if (k_ptr->to_d < 0) return (FALSE);
4731 /* Ammo -- Arrows/Bolts are good */
4738 /* Books -- High level books are good (except Arcane books) */
4740 case TV_SORCERY_BOOK:
4741 case TV_NATURE_BOOK:
4746 case TV_DAEMON_BOOK:
4747 case TV_CRUSADE_BOOK:
4749 case TV_HISSATSU_BOOK:
4752 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4756 /* Rings -- Rings of Speed are good */
4759 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4760 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4764 /* Amulets -- Amulets of the Magi and Resistance are good */
4767 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4768 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4773 /* Assume not good */
4778 * @brief 生成階に応じたベースアイテムの生成を行う。
4779 * Attempt to make an object (normal or good/great)
4780 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4781 * @param mode オプションフラグ
4782 * @return 生成に成功したらTRUEを返す。
4784 * This routine plays nasty games to generate the "special artifacts".\n
4785 * This routine uses "object_level" for the "generation level".\n
4786 * We assume that the given object has been "wiped".\n
4788 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
4794 /* Chance of "special object" */
4795 prob = ((mode & AM_GOOD) ? 10 : 1000);
4797 /* Base level for the object */
4798 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4801 /* Generate a special object, or a normal object */
4802 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4804 KIND_OBJECT_IDX k_idx;
4807 if ((mode & AM_GOOD) && !get_obj_num_hook)
4809 /* Activate restriction (if already specified, use that) */
4810 get_obj_num_hook = kind_is_good;
4813 /* Restricted objects - prepare allocation table */
4814 if (get_obj_num_hook) get_obj_num_prep();
4816 /* Pick a random object */
4817 k_idx = get_obj_num(base);
4819 /* Restricted objects */
4820 if (get_obj_num_hook)
4822 /* Clear restriction */
4823 get_obj_num_hook = NULL;
4825 /* Reset allocation table to default */
4829 /* Handle failure */
4830 if (!k_idx) return (FALSE);
4832 /* Prepare the object */
4833 object_prep(j_ptr, k_idx);
4836 /* Apply magic (allow artifacts) */
4837 apply_magic(j_ptr, object_level, mode);
4839 /* Hack -- generate multiple spikes/missiles */
4840 switch (j_ptr->tval)
4848 j_ptr->number = (byte)damroll(6, 7);
4852 if (cheat_peek) object_mention(j_ptr);
4860 * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
4861 * Attempt to place an object (normal or good/great) at the given location.
4862 * @param y 配置したいフロアのY座標
4863 * @param x 配置したいフロアのX座標
4864 * @param mode オプションフラグ
4865 * @return 生成に成功したらTRUEを返す。
4867 * This routine plays nasty games to generate the "special artifacts".\n
4868 * This routine uses "object_level" for the "generation level".\n
4869 * This routine requires a clean floor grid destination.\n
4871 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
4876 cave_type *c_ptr = &cave[y][x];
4882 /* Paranoia -- check bounds */
4883 if (!in_bounds(y, x)) return;
4885 /* Require floor space */
4886 if (!cave_drop_bold(y, x)) return;
4888 /* Avoid stacking on other objects */
4889 if (c_ptr->o_idx) return;
4894 /* Make an object (if possible) */
4895 if (!make_object(q_ptr, mode)) return;
4898 /* Make an object */
4905 o_ptr = &o_list[o_idx];
4907 /* Structure Copy */
4908 object_copy(o_ptr, q_ptr);
4914 o_ptr->next_o_idx = c_ptr->o_idx;
4916 /* Place the object */
4917 c_ptr->o_idx = o_idx;
4925 /* Hack -- Preserve artifacts */
4926 if (object_is_fixed_artifact(q_ptr))
4928 a_info[q_ptr->name1].cur_num = 0;
4935 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
4936 * Make a treasure object
4937 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4938 * @return 生成に成功したらTRUEを返す。
4940 * The location must be a legal, clean, floor grid.
4942 bool make_gold(object_type *j_ptr)
4947 /* Hack -- Pick a Treasure variety */
4948 i = ((randint1(object_level + 2) + 2) / 2) - 1;
4950 /* Apply "extra" magic */
4951 if (one_in_(GREAT_OBJ))
4953 i += randint1(object_level + 1);
4956 /* Hack -- Creeping Coins only generate "themselves" */
4957 if (coin_type) i = coin_type;
4959 /* Do not create "illegal" Treasure Types */
4960 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
4962 /* Prepare a gold object */
4963 object_prep(j_ptr, OBJ_GOLD_LIST + i);
4965 /* Hack -- Base coin cost */
4966 base = k_info[OBJ_GOLD_LIST + i].cost;
4968 /* Determine how much the treasure is "worth" */
4969 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
4977 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
4978 * Places a treasure (Gold or Gems) at given location
4979 * @param y 配置したいフロアのY座標
4980 * @param x 配置したいフロアのX座標
4981 * @return 生成に成功したらTRUEを返す。
4983 * The location must be a legal, clean, floor grid.
4985 void place_gold(POSITION y, POSITION x)
4990 cave_type *c_ptr = &cave[y][x];
4996 /* Paranoia -- check bounds */
4997 if (!in_bounds(y, x)) return;
4999 /* Require floor space */
5000 if (!cave_drop_bold(y, x)) return;
5002 /* Avoid stacking on other objects */
5003 if (c_ptr->o_idx) return;
5008 /* Make some gold */
5009 if (!make_gold(q_ptr)) return;
5011 /* Make an object */
5018 o_ptr = &o_list[o_idx];
5020 /* Copy the object */
5021 object_copy(o_ptr, q_ptr);
5028 o_ptr->next_o_idx = c_ptr->o_idx;
5030 /* Place the object */
5031 c_ptr->o_idx = o_idx;
5041 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
5042 * Let an object fall to the ground at or near a location.
5043 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
5044 * @param chance ドロップの成功率(%)
5045 * @param y 配置したいフロアのY座標
5046 * @param x 配置したいフロアのX座標
5047 * @return 生成に成功したらオブジェクトのIDを返す。
5049 * The initial location is assumed to be "in_bounds()".\n
5051 * This function takes a parameter "chance". This is the percentage\n
5052 * chance that the item will "disappear" instead of drop. If the object\n
5053 * has been thrown, then this is the chance of disappearance on contact.\n
5055 * Hack -- this function uses "chance" to determine if it should produce\n
5056 * some form of "description" of the drop event (under the player).\n
5058 * We check several locations to see if we can find a location at which\n
5059 * the object can combine, stack, or be placed. Artifacts will try very\n
5060 * hard to be placed, including "teleporting" to a useful grid if needed.\n
5062 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
5069 POSITION ty, tx = 0;
5071 OBJECT_IDX o_idx = 0;
5072 OBJECT_IDX this_o_idx, next_o_idx = 0;
5076 GAME_TEXT o_name[MAX_NLEN];
5082 /* Extract plural */
5083 bool plural = (j_ptr->number != 1);
5086 /* Describe object */
5087 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5090 /* Handle normal "breakage" */
5091 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
5094 msg_format("%sは消えた。", o_name);
5096 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5099 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
5116 /* Scan local grids */
5117 for (dy = -3; dy <= 3; dy++)
5119 /* Scan local grids */
5120 for (dx = -3; dx <= 3; dx++)
5124 /* Calculate actual distance */
5125 d = (dy * dy) + (dx * dx);
5127 /* Ignore distant grids */
5128 if (d > 10) continue;
5133 /* Skip illegal grids */
5134 if (!in_bounds(ty, tx)) continue;
5136 /* Require line of projection */
5137 if (!projectable(y, x, ty, tx)) continue;
5140 c_ptr = &cave[ty][tx];
5142 /* Require floor space */
5143 if (!cave_drop_bold(ty, tx)) continue;
5148 /* Scan objects in that grid */
5149 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5152 o_ptr = &o_list[this_o_idx];
5154 /* Acquire next object */
5155 next_o_idx = o_ptr->next_o_idx;
5157 /* Check for possible combination */
5158 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5164 /* Add new object */
5168 if (k > 99) continue;
5170 /* Calculate score */
5171 s = 1000 - (d + k * 5);
5173 /* Skip bad values */
5174 if (s < bs) continue;
5176 /* New best value */
5179 /* Apply the randomizer to equivalent values */
5180 if ((++bn >= 2) && !one_in_(bn)) continue;
5194 /* Handle lack of space */
5195 if (!flag && !object_is_artifact(j_ptr))
5198 msg_format("%sは消えた。", o_name);
5200 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5205 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5213 for (i = 0; !flag && (i < 1000); i++)
5216 ty = rand_spread(by, 1);
5217 tx = rand_spread(bx, 1);
5219 /* Verify location */
5220 if (!in_bounds(ty, tx)) continue;
5222 /* Bounce to that location */
5226 /* Require floor space */
5227 if (!cave_drop_bold(by, bx)) continue;
5235 int candidates = 0, pick;
5237 for (ty = 1; ty < cur_hgt - 1; ty++)
5239 for (tx = 1; tx < cur_wid - 1; tx++)
5241 /* A valid space found */
5242 if (cave_drop_bold(ty, tx)) candidates++;
5246 /* No valid place! */
5250 msg_format("%sは消えた。", o_name);
5252 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5256 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5258 /* Mega-Hack -- preserve artifacts */
5261 /* Hack -- Preserve unknown artifacts */
5262 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5264 /* Mega-Hack -- Preserve the artifact */
5265 a_info[j_ptr->name1].cur_num = 0;
5273 /* Choose a random one */
5274 pick = randint1(candidates);
5276 for (ty = 1; ty < cur_hgt - 1; ty++)
5278 for (tx = 1; tx < cur_wid - 1; tx++)
5280 if (cave_drop_bold(ty, tx))
5284 /* Is this a picked one? */
5298 c_ptr = &cave[by][bx];
5300 /* Scan objects in that grid for combination */
5301 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5304 o_ptr = &o_list[this_o_idx];
5306 /* Acquire next object */
5307 next_o_idx = o_ptr->next_o_idx;
5309 /* Check for combination */
5310 if (object_similar(o_ptr, j_ptr))
5312 /* Combine the items */
5313 object_absorb(o_ptr, j_ptr);
5322 /* Get new object */
5323 if (!done) o_idx = o_pop();
5326 if (!done && !o_idx)
5329 msg_format("%sは消えた。", o_name);
5331 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5336 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5338 /* Hack -- Preserve artifacts */
5339 if (object_is_fixed_artifact(j_ptr))
5341 a_info[j_ptr->name1].cur_num = 0;
5351 /* Structure copy */
5352 object_copy(&o_list[o_idx], j_ptr);
5354 /* Access new object */
5355 j_ptr = &o_list[o_idx];
5362 j_ptr->held_m_idx = 0;
5365 j_ptr->next_o_idx = c_ptr->o_idx;
5367 /* Place the object */
5368 c_ptr->o_idx = o_idx;
5382 /* Mega-Hack -- no message if "dropped" by player */
5383 /* Message when an object falls under the player */
5384 if (chance && player_bold(by, bx))
5386 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5395 * Scatter some "great" objects near the player
5396 * @param y1 配置したいフロアのY座標
5397 * @param x1 配置したいフロアのX座標
5398 * @param num 獲得の処理回数
5399 * @param great TRUEならば必ず高級品以上を落とす
5400 * @param special TRUEならば必ず特別品を落とす
5401 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5404 void acquirement(POSITION y1, POSITION x1, int num, bool great, bool special, bool known)
5407 object_type object_type_body;
5408 BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ;
5413 i_ptr = &object_type_body;
5416 /* Make a good (or great) object (if possible) */
5417 if (!make_object(i_ptr, mode)) continue;
5421 object_aware(i_ptr);
5422 object_known(i_ptr);
5425 /* Drop the object */
5426 (void)drop_near(i_ptr, -1, y1, x1);
5431 * Scatter some "amusing" objects near the player
5434 #define AMS_NOTHING 0x00 /* No restriction */
5435 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
5436 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
5437 #define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */
5438 #define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */
5442 OBJECT_TYPE_VALUE tval;
5443 OBJECT_SUBTYPE_VALUE sval;
5448 amuse_type amuse_info[] =
5450 { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
5451 { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
5452 { TV_SPIKE, SV_ANY, 10, AMS_PILE },
5453 { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
5454 { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
5455 { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
5456 { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
5457 { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
5458 { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
5459 { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
5460 { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
5461 { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
5462 { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
5469 * @param y1 配置したいフロアのY座標
5470 * @param x1 配置したいフロアのX座標
5471 * @param num 誰得の処理回数
5472 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5475 void amusement(POSITION y1, POSITION x1, int num, bool known)
5478 object_type object_type_body;
5481 for (n = 0; amuse_info[n].tval != 0; n++)
5483 t += amuse_info[n].prob;
5490 KIND_OBJECT_IDX k_idx;
5491 ARTIFACT_IDX a_idx = 0;
5492 int r = randint0(t);
5493 bool insta_art, fixed_art;
5497 r -= amuse_info[i].prob;
5500 i_ptr = &object_type_body;
5502 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
5504 /* Paranoia - reroll if nothing */
5505 if (!k_idx) continue;
5507 /* Search an artifact index if need */
5508 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
5509 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
5511 if (insta_art || fixed_art)
5513 for (a_idx = 1; a_idx < max_a_idx; a_idx++)
5515 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
5516 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
5517 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
5518 if (a_info[a_idx].cur_num > 0) continue;
5522 if (a_idx >= max_a_idx) continue;
5525 /* Make an object (if possible) */
5526 object_prep(i_ptr, k_idx);
5527 if (a_idx) i_ptr->name1 = a_idx;
5528 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
5530 if (amuse_info[i].flag & AMS_NO_UNIQUE)
5532 if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
5535 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
5536 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
5540 object_aware(i_ptr);
5541 object_known(i_ptr);
5544 /* Paranoia - reroll if nothing */
5545 if (!(i_ptr->k_idx)) continue;
5547 /* Drop the object */
5548 (void)drop_near(i_ptr, -1, y1, x1);
5556 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5557 * Describe the charges on an item in the inventory.
5558 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5561 void inven_item_charges(INVENTORY_IDX item)
5563 object_type *o_ptr = &inventory[item];
5565 /* Require staff/wand */
5566 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5568 /* Require known item */
5569 if (!object_is_known(o_ptr)) return;
5572 if (o_ptr->pval <= 0)
5574 msg_print("もう魔力が残っていない。");
5578 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5581 /* Multiple charges */
5582 if (o_ptr->pval != 1)
5584 msg_format("You have %d charges remaining.", o_ptr->pval);
5590 msg_format("You have %d charge remaining.", o_ptr->pval);
5597 * @brief アイテムの残り所持数メッセージを表示する /
5598 * Describe an item in the inventory.
5599 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5602 void inven_item_describe(INVENTORY_IDX item)
5604 object_type *o_ptr = &inventory[item];
5605 GAME_TEXT o_name[MAX_NLEN];
5607 object_desc(o_name, o_ptr, 0);
5610 /* "no more" の場合はこちらで表示する */
5611 if (o_ptr->number <= 0)
5613 /*FIRST*//*ここはもう通らないかも */
5614 msg_format("もう%sを持っていない。", o_name);
5618 /* アイテム名を英日切り替え機能対応 */
5619 msg_format("まだ %sを持っている。", o_name);
5622 msg_format("You have %s.", o_name);
5628 * @brief アイテムを増減させ残り所持数メッセージを表示する /
5629 * Increase the "number" of an item in the inventory
5630 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5634 void inven_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
5636 object_type *o_ptr = &inventory[item];
5639 num += o_ptr->number;
5642 if (num > 255) num = 255;
5643 else if (num < 0) num = 0;
5646 num -= o_ptr->number;
5648 /* Change the number and weight */
5651 /* Add the number */
5652 o_ptr->number += num;
5654 /* Add the weight */
5655 p_ptr->total_weight += (num * o_ptr->weight);
5656 p_ptr->update |= (PU_BONUS);
5658 /* Recalculate mana XXX */
5659 p_ptr->update |= (PU_MANA);
5661 /* Combine the pack */
5662 p_ptr->update |= (PU_COMBINE);
5664 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5666 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5667 if (!o_ptr->number && p_ptr->ele_attack)
5669 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5671 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5673 /* Clear all temporary elemental brands */
5674 set_ele_attack(0, 0);
5682 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5683 * Erase an inventory slot if it has no more items
5684 * @param item 消去したいプレイヤーのアイテム所持スロット
5687 void inven_item_optimize(INVENTORY_IDX item)
5689 object_type *o_ptr = &inventory[item];
5691 /* Only optimize real items */
5692 if (!o_ptr->k_idx) return;
5694 /* Only optimize empty items */
5695 if (o_ptr->number) return;
5697 /* The item is in the pack */
5698 if (item < INVEN_RARM)
5705 /* Slide everything down */
5706 for (i = item; i < INVEN_PACK; i++)
5708 /* Structure copy */
5709 inventory[i] = inventory[i+1];
5712 /* Erase the "final" slot */
5713 object_wipe(&inventory[i]);
5715 p_ptr->window |= (PW_INVEN);
5718 /* The item is being wielded */
5724 /* Erase the empty slot */
5725 object_wipe(&inventory[item]);
5726 p_ptr->update |= (PU_BONUS);
5728 /* Recalculate torch */
5729 p_ptr->update |= (PU_TORCH);
5731 /* Recalculate mana XXX */
5732 p_ptr->update |= (PU_MANA);
5734 p_ptr->window |= (PW_EQUIP);
5737 p_ptr->window |= (PW_SPELL);
5741 * @brief 床上の魔道具の残り残量メッセージを表示する /
5742 * Describe the charges on an item on the floor.
5743 * @param item メッセージの対象にしたいアイテム所持スロット
5746 void floor_item_charges(INVENTORY_IDX item)
5748 object_type *o_ptr = &o_list[item];
5750 /* Require staff/wand */
5751 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5753 /* Require known item */
5754 if (!object_is_known(o_ptr)) return;
5757 if (o_ptr->pval <= 0)
5759 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5763 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5766 /* Multiple charges */
5767 if (o_ptr->pval != 1)
5769 msg_format("There are %d charges remaining.", o_ptr->pval);
5775 msg_format("There is %d charge remaining.", o_ptr->pval);
5782 * @brief 床上のアイテムの残り数メッセージを表示する /
5783 * Describe the charges on an item on the floor.
5784 * @param item メッセージの対象にしたいアイテム所持スロット
5787 void floor_item_describe(INVENTORY_IDX item)
5789 object_type *o_ptr = &o_list[item];
5790 GAME_TEXT o_name[MAX_NLEN];
5792 object_desc(o_name, o_ptr, 0);
5795 /* "no more" の場合はこちらで表示を分ける */
5796 if (o_ptr->number <= 0)
5798 msg_format("床上には、もう%sはない。", o_name);
5802 msg_format("床上には、まだ %sがある。", o_name);
5805 msg_format("You see %s.", o_name);
5812 * @brief 床上のアイテムの数を増やす /
5813 * Increase the "number" of an item on the floor
5814 * @param item 増やしたいアイテムの所持スロット
5815 * @param num 増やしたいアイテムの数
5818 void floor_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
5820 object_type *o_ptr = &o_list[item];
5823 num += o_ptr->number;
5826 if (num > 255) num = 255;
5827 else if (num < 0) num = 0;
5830 num -= o_ptr->number;
5832 /* Change the number */
5833 o_ptr->number += num;
5838 * @brief 床上の数の無くなったアイテムスロットを消去する /
5839 * Optimize an item on the floor (destroy "empty" items)
5840 * @param item 消去したいアイテムの所持スロット
5843 void floor_item_optimize(INVENTORY_IDX item)
5845 object_type *o_ptr = &o_list[item];
5847 /* Paranoia -- be sure it exists */
5848 if (!o_ptr->k_idx) return;
5850 /* Only optimize empty items */
5851 if (o_ptr->number) return;
5853 delete_object_idx(item);
5858 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5859 * Check if we have space for an item in the pack without overflow
5860 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5861 * @return 溢れずに済むならTRUEを返す
5863 bool inven_carry_okay(object_type *o_ptr)
5868 if (inven_cnt < INVEN_PACK) return (TRUE);
5871 for (j = 0; j < INVEN_PACK; j++)
5873 object_type *j_ptr = &inventory[j];
5875 /* Skip non-objects */
5876 if (!j_ptr->k_idx) continue;
5878 /* Check if the two items can be combined */
5879 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5886 * @brief オブジェクトを定義された基準に従いソートするための関数 /
5887 * Check if we have space for an item in the pack without overflow
5888 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
5889 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
5890 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
5891 * @return o_ptrの方が上位ならばTRUEを返す。
5893 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5897 /* Use empty slots */
5898 if (!j_ptr->k_idx) return TRUE;
5900 /* Hack -- readable books always come first */
5901 if ((o_ptr->tval == REALM1_BOOK) &&
5902 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5903 if ((j_ptr->tval == REALM1_BOOK) &&
5904 (o_ptr->tval != REALM1_BOOK)) return FALSE;
5906 if ((o_ptr->tval == REALM2_BOOK) &&
5907 (j_ptr->tval != REALM2_BOOK)) return TRUE;
5908 if ((j_ptr->tval == REALM2_BOOK) &&
5909 (o_ptr->tval != REALM2_BOOK)) return FALSE;
5911 /* Objects sort by decreasing type */
5912 if (o_ptr->tval > j_ptr->tval) return TRUE;
5913 if (o_ptr->tval < j_ptr->tval) return FALSE;
5915 /* Non-aware (flavored) items always come last */
5916 /* Can happen in the home */
5917 if (!object_is_aware(o_ptr)) return FALSE;
5918 if (!object_is_aware(j_ptr)) return TRUE;
5920 /* Objects sort by increasing sval */
5921 if (o_ptr->sval < j_ptr->sval) return TRUE;
5922 if (o_ptr->sval > j_ptr->sval) return FALSE;
5924 /* Unidentified objects always come last */
5925 /* Objects in the home can be unknown */
5926 if (!object_is_known(o_ptr)) return FALSE;
5927 if (!object_is_known(j_ptr)) return TRUE;
5929 /* Fixed artifacts, random artifacts and ego items */
5930 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
5931 else if (o_ptr->art_name) o_type = 2;
5932 else if (object_is_ego(o_ptr)) o_type = 1;
5935 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
5936 else if (j_ptr->art_name) j_type = 2;
5937 else if (object_is_ego(j_ptr)) j_type = 1;
5940 if (o_type < j_type) return TRUE;
5941 if (o_type > j_type) return FALSE;
5943 switch (o_ptr->tval)
5949 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
5950 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
5956 /* Objects sort by increasing hit/damage bonuses */
5957 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
5958 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
5961 /* Hack: otherwise identical rods sort by
5962 increasing recharge time --dsb */
5964 if (o_ptr->pval < j_ptr->pval) return TRUE;
5965 if (o_ptr->pval > j_ptr->pval) return FALSE;
5969 /* Objects sort by decreasing value */
5970 return o_value > object_value(j_ptr);
5975 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
5976 * Add an item to the players inventory, and return the slot used.
5977 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
5978 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
5980 * If the new item can combine with an existing item in the inventory,\n
5981 * it will do so, using "object_similar()" and "object_absorb()", else,\n
5982 * the item will be placed into the "proper" location in the inventory.\n
5984 * This function can be used to "over-fill" the player's pack, but only\n
5985 * once, and such an action must trigger the "overflow" code immediately.\n
5986 * Note that when the pack is being "over-filled", the new item must be\n
5987 * placed into the "overflow" slot, and the "overflow" must take place\n
5988 * before the pack is reordered, but (optionally) after the pack is\n
5989 * combined. This may be tricky. See "dungeon.c" for info.\n
5991 * Note that this code must remove any location/stack information\n
5992 * from the object once it is placed into the inventory.\n
5994 s16b inven_carry(object_type *o_ptr)
5996 INVENTORY_IDX i, j, k;
5997 INVENTORY_IDX n = -1;
6002 /* Check for combining */
6003 for (j = 0; j < INVEN_PACK; j++)
6005 j_ptr = &inventory[j];
6007 /* Skip non-objects */
6008 if (!j_ptr->k_idx) continue;
6010 /* Hack -- track last item */
6013 /* Check if the two items can be combined */
6014 if (object_similar(j_ptr, o_ptr))
6016 /* Combine the items */
6017 object_absorb(j_ptr, o_ptr);
6019 /* Increase the weight */
6020 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6021 p_ptr->update |= (PU_BONUS);
6023 p_ptr->window |= (PW_INVEN);
6032 if (inven_cnt > INVEN_PACK) return (-1);
6034 /* Find an empty slot */
6035 for (j = 0; j <= INVEN_PACK; j++)
6037 j_ptr = &inventory[j];
6039 /* Use it if found */
6040 if (!j_ptr->k_idx) break;
6047 /* Reorder the pack */
6050 /* Get the "value" of the item */
6051 s32b o_value = object_value(o_ptr);
6053 /* Scan every occupied slot */
6054 for (j = 0; j < INVEN_PACK; j++)
6056 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6063 for (k = n; k >= i; k--)
6065 /* Hack -- Slide the item */
6066 object_copy(&inventory[k+1], &inventory[k]);
6069 /* Wipe the empty slot */
6070 object_wipe(&inventory[i]);
6075 object_copy(&inventory[i], o_ptr);
6077 /* Access new object */
6078 j_ptr = &inventory[i];
6081 j_ptr->next_o_idx = 0;
6083 /* Forget monster */
6084 j_ptr->held_m_idx = 0;
6086 /* Forget location */
6087 j_ptr->iy = j_ptr->ix = 0;
6089 /* Player touches it, and no longer marked */
6090 j_ptr->marked = OM_TOUCHED;
6092 /* Increase the weight */
6093 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6095 /* Count the items */
6097 p_ptr->update |= (PU_BONUS);
6099 /* Combine and Reorder pack */
6100 p_ptr->update |= (PU_COMBINE | PU_REORDER);
6102 p_ptr->window |= (PW_INVEN);
6104 /* Return the slot */
6110 * @brief 装備スロットからオブジェクトを外すメインルーチン /
6111 * Take off (some of) a non-cursed equipment item
6112 * @param item オブジェクトを外したい所持テーブルのID
6114 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6116 * Note that only one item at a time can be wielded per slot.\n
6117 * Note that taking off an item when "full" may cause that item\n
6118 * to fall to the ground.\n
6119 * Return the inventory slot into which the item is placed.\n
6121 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
6132 GAME_TEXT o_name[MAX_NLEN];
6135 /* Get the item to take off */
6136 o_ptr = &inventory[item];
6139 if (amt <= 0) return (-1);
6142 if (amt > o_ptr->number) amt = o_ptr->number;
6145 /* Obtain a local object */
6146 object_copy(q_ptr, o_ptr);
6148 /* Modify quantity */
6149 q_ptr->number = amt;
6151 object_desc(o_name, q_ptr, 0);
6153 /* Took off weapon */
6154 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
6155 object_is_melee_weapon(o_ptr))
6157 act = _("を装備からはずした", "You were wielding");
6161 else if (item == INVEN_BOW)
6163 act = _("を装備からはずした", "You were holding");
6166 /* Took off light */
6167 else if (item == INVEN_LITE)
6169 act = _("を光源からはずした", "You were holding");
6172 /* Took off something */
6175 act = _("を装備からはずした", "You were wearing");
6178 /* Modify, Optimize */
6179 inven_item_increase(item, -amt);
6180 inven_item_optimize(item);
6182 /* Carry the object */
6183 slot = inven_carry(q_ptr);
6186 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
6188 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6198 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
6199 * Drop (some of) a non-cursed inventory/equipment item
6200 * @param item 所持テーブルのID
6201 * @param amt 落としたい個数
6204 * The object will be dropped "near" the current location
6206 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
6212 GAME_TEXT o_name[MAX_NLEN];
6214 /* Access original object */
6215 o_ptr = &inventory[item];
6218 if (amt <= 0) return;
6221 if (amt > o_ptr->number) amt = o_ptr->number;
6223 /* Take off equipment */
6224 if (item >= INVEN_RARM)
6226 /* Take off first */
6227 item = inven_takeoff(item, amt);
6229 /* Access original object */
6230 o_ptr = &inventory[item];
6235 /* Obtain local object */
6236 object_copy(q_ptr, o_ptr);
6238 /* Distribute charges of wands or rods */
6239 distribute_charges(o_ptr, q_ptr, amt);
6241 /* Modify quantity */
6242 q_ptr->number = amt;
6244 /* Describe local object */
6245 object_desc(o_name, q_ptr, 0);
6247 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
6249 /* Drop it near the player */
6250 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
6252 /* Modify, Describe, Optimize */
6253 inven_item_increase(item, -amt);
6254 inven_item_describe(item);
6255 inven_item_optimize(item);
6260 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
6261 * Combine items in the pack
6264 * Note special handling of the "overflow" slot
6266 void combine_pack(void)
6271 bool flag = FALSE, combined;
6277 /* Combine the pack (backwards) */
6278 for (i = INVEN_PACK; i > 0; i--)
6280 o_ptr = &inventory[i];
6282 /* Skip empty items */
6283 if (!o_ptr->k_idx) continue;
6285 /* Scan the items above that item */
6286 for (j = 0; j < i; j++)
6290 j_ptr = &inventory[j];
6292 /* Skip empty items */
6293 if (!j_ptr->k_idx) continue;
6296 * Get maximum number of the stack if these
6297 * are similar, get zero otherwise.
6299 max_num = object_similar_part(j_ptr, o_ptr);
6301 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6302 if (max_num && j_ptr->number < max_num)
6304 if (o_ptr->number + j_ptr->number <= max_num)
6309 /* Add together the item counts */
6310 object_absorb(j_ptr, o_ptr);
6312 /* One object is gone */
6315 /* Slide everything down */
6316 for (k = i; k < INVEN_PACK; k++)
6318 /* Structure copy */
6319 inventory[k] = inventory[k+1];
6322 /* Erase the "final" slot */
6323 object_wipe(&inventory[k]);
6327 int old_num = o_ptr->number;
6328 int remain = j_ptr->number + o_ptr->number - max_num;
6330 o_ptr->number -= remain;
6332 /* Add together the item counts */
6333 object_absorb(j_ptr, o_ptr);
6335 o_ptr->number = remain;
6337 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6338 if (o_ptr->tval == TV_ROD)
6340 o_ptr->pval = o_ptr->pval * remain / old_num;
6341 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6344 /* Hack -- if wands are stacking, combine the charges. -LM- */
6345 if (o_ptr->tval == TV_WAND)
6347 o_ptr->pval = o_ptr->pval * remain / old_num;
6351 p_ptr->window |= (PW_INVEN);
6363 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6367 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6368 * Reorder items in the pack
6371 * Note special handling of the "overflow" slot
6373 void reorder_pack(void)
6383 /* Re-order the pack (forwards) */
6384 for (i = 0; i < INVEN_PACK; i++)
6386 /* Mega-Hack -- allow "proper" over-flow */
6387 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6389 o_ptr = &inventory[i];
6391 /* Skip empty slots */
6392 if (!o_ptr->k_idx) continue;
6394 /* Get the "value" of the item */
6395 o_value = object_value(o_ptr);
6397 /* Scan every occupied slot */
6398 for (j = 0; j < INVEN_PACK; j++)
6400 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6403 /* Never move down */
6404 if (j >= i) continue;
6410 /* Save a copy of the moving item */
6411 object_copy(q_ptr, &inventory[i]);
6413 /* Slide the objects */
6414 for (k = i; k > j; k--)
6416 /* Slide the item */
6417 object_copy(&inventory[k], &inventory[k-1]);
6420 /* Insert the moving item */
6421 object_copy(&inventory[j], q_ptr);
6423 p_ptr->window |= (PW_INVEN);
6426 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6430 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6431 * Hack -- display an object kind in the current window
6432 * @param k_idx ベースアイテムの参照ID
6435 * Include list of usable spells for readible books
6437 void display_koff(KIND_OBJECT_IDX k_idx)
6444 REALM_IDX use_realm;
6446 GAME_TEXT o_name[MAX_NLEN];
6449 /* Erase the window */
6450 for (y = 0; y < Term->hgt; y++)
6452 /* Erase the line */
6453 Term_erase(0, y, 255);
6460 /* Prepare the object */
6461 object_prep(q_ptr, k_idx);
6462 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6464 /* Mention the object name */
6465 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6467 /* Access the item's sval */
6469 use_realm = tval2realm(q_ptr->tval);
6471 /* Warriors are illiterate */
6472 if (p_ptr->realm1 || p_ptr->realm2)
6474 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6478 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6479 if (!is_magic(use_realm)) return;
6480 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6483 /* Display spells in readible books */
6487 SPELL_IDX spells[64];
6489 /* Extract spells */
6490 for (spell = 0; spell < 32; spell++)
6492 /* Check for this spell */
6493 if (fake_spell_flags[sval] & (1L << spell))
6495 /* Collect this spell */
6496 spells[num++] = spell;
6501 print_spells(0, spells, num, 2, 0, use_realm);
6506 * @brief 警告を放つアイテムを選択する /
6507 * Choose one of items that have warning flag
6508 * Calculate spell damages
6511 object_type *choose_warning_item(void)
6514 int choices[INVEN_TOTAL - INVEN_RARM];
6517 /* Paranoia -- Player has no warning ability */
6518 if (!p_ptr->warning) return NULL;
6520 /* Search Inventory */
6521 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6523 BIT_FLAGS flgs[TR_FLAG_SIZE];
6524 object_type *o_ptr = &inventory[i];
6526 object_flags(o_ptr, flgs);
6527 if (have_flag(flgs, TR_WARNING))
6529 choices[number] = i;
6534 /* Choice one of them */
6535 return number ? &inventory[choices[randint0(number)]] : NULL;
6539 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6540 * Calculate spell damages
6541 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6542 * @param typ 効果属性のID
6544 * @param max 算出した最大ダメージを返すポインタ
6547 static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
6549 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6550 int rlev = r_ptr->level;
6551 bool ignore_wraith_form = FALSE;
6553 /* Vulnerability, resistance and immunity */
6557 if (p_ptr->immune_elec)
6560 ignore_wraith_form = TRUE;
6564 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6565 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6566 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6567 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6568 if (IS_OPPOSE_ELEC())
6569 dam = (dam + 2) / 3;
6574 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6575 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6579 if (p_ptr->immune_acid)
6582 ignore_wraith_form = TRUE;
6586 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6587 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6588 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6589 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6595 if (p_ptr->immune_cold)
6598 ignore_wraith_form = TRUE;
6602 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6603 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6604 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6605 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6610 if (p_ptr->immune_fire)
6613 ignore_wraith_form = TRUE;
6617 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6618 if (prace_is_(RACE_ENT)) dam += dam / 3;
6619 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6620 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6621 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6626 ignore_wraith_form = TRUE;
6630 if (!p_ptr->blind &&
6631 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6632 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6635 ignore_wraith_form = TRUE;
6640 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6641 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6642 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6645 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6646 * "dam *= 2;" for later "dam /= 2"
6648 if (p_ptr->wraith_form) dam *= 2;
6652 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6655 ignore_wraith_form = TRUE;
6657 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6661 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6665 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6669 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6673 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6677 if (prace_is_(RACE_SPECTRE))
6680 ignore_wraith_form = TRUE;
6682 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6686 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6690 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6694 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6698 if (p_ptr->levitation) dam = (dam * 2) / 3;
6702 if (p_ptr->resist_shard) dam /= 2;
6706 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6707 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6711 if (p_ptr->mimic_form)
6713 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6716 ignore_wraith_form = TRUE;
6721 switch (p_ptr->prace)
6730 ignore_wraith_form = TRUE;
6737 if (p_ptr->align > 10) dam /= 2;
6738 else if (p_ptr->align < -10) dam *= 2;
6742 if (p_ptr->align > 10) dam *= 2;
6746 case GF_BRAIN_SMASH:
6747 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6750 ignore_wraith_form = TRUE;
6758 if (100 + rlev / 2 <= p_ptr->skill_sav)
6761 ignore_wraith_form = TRUE;
6766 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6769 ignore_wraith_form = TRUE;
6774 if (p_ptr->wraith_form && !ignore_wraith_form)
6780 if (dam > *max) *max = dam;
6784 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6785 * Calculate spell damages
6786 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6787 * @param typ 効果属性のID
6788 * @param m_idx 魔法を行使するモンスターのID
6789 * @param max 算出した最大ダメージを返すポインタ
6792 void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
6794 monster_type *m_ptr = &m_list[m_idx];
6795 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6796 spell_damcalc(m_ptr, typ, dam, max);
6800 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6801 * Calculate blow damages
6802 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6803 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6804 * @return 算出された最大ダメージを返す。
6806 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6808 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6810 bool check_wraith_form = TRUE;
6812 if (blow_ptr->method != RBM_EXPLODE)
6814 ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
6816 switch (blow_ptr->effect)
6820 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6821 dam = MAX(dam, tmp_dam * 2);
6827 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6831 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6833 check_wraith_form = FALSE;
6837 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6839 check_wraith_form = FALSE;
6843 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6845 check_wraith_form = FALSE;
6849 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6851 check_wraith_form = FALSE;
6856 check_wraith_form = FALSE;
6860 if (check_wraith_form && p_ptr->wraith_form)
6868 dam = (dam + 1) / 2;
6869 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
6877 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
6878 * Examine the grid (xx,yy) and warn the player if there are any danger
6879 * @param xx 危険性を調査するマスのX座標
6880 * @param yy 危険性を調査するマスのY座標
6881 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
6883 bool process_warning(POSITION xx, POSITION yy)
6887 GAME_TEXT o_name[MAX_NLEN];
6889 #define WARNING_AWARE_RANGE 12
6891 static int old_damage = 0;
6893 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
6895 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
6898 monster_type *m_ptr;
6899 monster_race *r_ptr;
6901 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
6903 c_ptr = &cave[my][mx];
6905 if (!c_ptr->m_idx) continue;
6907 m_ptr = &m_list[c_ptr->m_idx];
6909 if (MON_CSLEEP(m_ptr)) continue;
6910 if (!is_hostile(m_ptr)) continue;
6912 r_ptr = &r_info[m_ptr->r_idx];
6914 /* Monster spells (only powerful ones)*/
6915 if (projectable(my, mx, yy, xx))
6917 BIT_FLAGS f4 = r_ptr->flags4;
6918 BIT_FLAGS f5 = r_ptr->a_ability_flags1;
6919 BIT_FLAGS f6 = r_ptr->a_ability_flags2;
6921 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
6923 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
6924 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
6925 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
6926 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, c_ptr->m_idx, &dam_max0);
6927 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, c_ptr->m_idx, &dam_max0);
6928 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, c_ptr->m_idx, &dam_max0);
6930 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, c_ptr->m_idx, &dam_max0);
6931 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, c_ptr->m_idx, &dam_max0);
6932 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, c_ptr->m_idx, &dam_max0);
6933 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, c_ptr->m_idx, &dam_max0);
6934 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, c_ptr->m_idx, &dam_max0);
6935 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, c_ptr->m_idx, &dam_max0);
6936 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, c_ptr->m_idx, &dam_max0);
6937 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, c_ptr->m_idx, &dam_max0);
6938 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
6939 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, c_ptr->m_idx, &dam_max0);
6940 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, c_ptr->m_idx, &dam_max0);
6941 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
6942 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, c_ptr->m_idx, &dam_max0);
6943 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, c_ptr->m_idx, &dam_max0);
6944 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, c_ptr->m_idx, &dam_max0);
6945 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, c_ptr->m_idx, &dam_max0);
6946 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, c_ptr->m_idx, &dam_max0);
6947 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, c_ptr->m_idx, &dam_max0);
6948 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, c_ptr->m_idx, &dam_max0);
6949 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, c_ptr->m_idx, &dam_max0);
6950 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
6951 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, c_ptr->m_idx, &dam_max0);
6952 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, c_ptr->m_idx, &dam_max0);
6955 /* Monster melee attacks */
6956 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
6958 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
6962 for (m = 0; m < 4; m++)
6964 /* Skip non-attacks */
6965 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
6967 /* Extract the attack info */
6968 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
6969 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
6971 if (dam_melee > dam_max0) dam_max0 = dam_melee;
6975 /* Contribution from this monster */
6976 dam_max += dam_max0;
6980 /* Prevent excessive warning */
6981 if (dam_max > old_damage)
6983 old_damage = dam_max * 3 / 2;
6985 if (dam_max > p_ptr->chp / 2)
6987 object_type *o_ptr = choose_warning_item();
6990 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6992 strcpy(o_name, _("体", "body")); /* Warning ability without item */
6993 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
6995 disturb(FALSE, TRUE);
6996 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
6999 else old_damage = old_damage / 2;
7001 c_ptr = &cave[yy][xx];
7002 if (((!easy_disarm && is_trap(c_ptr->feat))
7003 || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
7005 object_type *o_ptr = choose_warning_item();
7008 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7010 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7011 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7012 disturb(FALSE, TRUE);
7013 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7020 * エッセンス情報の構造体 / A structure for smithing
7023 int add; /* TR flag number or special essence id */
7024 cptr add_name; /* Name of this ability */
7025 ESSENCE_IDX type; /* Menu number */
7026 int essence; /* Index for carrying essences */
7027 int value; /* Needed value to add this ability */
7032 * エッセンス情報テーブル Smithing type data for Weapon smith
7035 static essence_type essence_info[] =
7037 {TR_STR, "腕力", 4, TR_STR, 20},
7038 {TR_INT, "知能", 4, TR_INT, 20},
7039 {TR_WIS, "賢さ", 4, TR_WIS, 20},
7040 {TR_DEX, "器用さ", 4, TR_DEX, 20},
7041 {TR_CON, "耐久力", 4, TR_CON, 20},
7042 {TR_CHR, "魅力", 4, TR_CHR, 20},
7043 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
7044 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
7045 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
7046 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
7047 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
7048 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
7049 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
7050 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
7051 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
7052 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
7053 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
7054 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
7055 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
7056 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
7057 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
7058 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
7059 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
7060 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
7061 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
7062 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
7063 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
7064 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
7065 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
7066 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
7067 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
7068 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
7069 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
7070 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
7071 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
7072 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
7073 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
7074 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
7075 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
7076 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
7077 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
7078 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
7079 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
7080 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
7081 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
7082 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
7083 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
7084 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
7085 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
7086 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
7087 {TR_SH_FIRE, "", 0, -2, 0},
7088 {TR_SH_ELEC, "", 0, -2, 0},
7089 {TR_SH_COLD, "", 0, -2, 0},
7090 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
7091 {TR_WARNING, "警告", 3, TR_WARNING, 20},
7092 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
7093 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
7094 {TR_LITE_2, "", 0, -2, 0},
7095 {TR_LITE_3, "", 0, -2, 0},
7096 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
7097 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
7098 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
7099 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
7100 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
7102 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
7103 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
7104 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
7105 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
7106 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
7107 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
7108 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
7109 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
7110 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
7111 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
7112 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
7113 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
7114 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
7115 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
7116 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
7117 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
7118 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
7119 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
7121 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
7122 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
7123 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
7124 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
7125 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
7126 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
7127 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
7128 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
7130 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
7131 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
7132 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
7133 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
7134 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
7135 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
7136 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
7137 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
7138 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
7139 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
7140 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
7141 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
7143 {-1, NULL, 0, -1, 0}
7146 static essence_type essence_info[] =
7148 {TR_STR, "strength", 4, TR_STR, 20},
7149 {TR_INT, "intelligence", 4, TR_INT, 20},
7150 {TR_WIS, "wisdom", 4, TR_WIS, 20},
7151 {TR_DEX, "dexterity", 4, TR_DEX, 20},
7152 {TR_CON, "constitution", 4, TR_CON, 20},
7153 {TR_CHR, "charisma", 4, TR_CHR, 20},
7154 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
7155 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
7156 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
7157 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
7158 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
7159 {TR_SPEED, "speed", 4, TR_SPEED, 12},
7160 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
7161 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
7162 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
7163 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
7164 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
7165 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
7166 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
7167 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
7168 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
7169 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
7170 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
7171 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
7172 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
7173 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
7174 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
7175 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
7176 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
7177 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
7178 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
7179 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
7180 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
7181 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
7182 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
7183 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
7184 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
7185 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
7186 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
7187 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
7188 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
7189 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
7190 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
7191 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
7192 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
7193 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
7194 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
7195 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
7196 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
7197 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
7198 {TR_SH_FIRE, "", 0, -2, 0},
7199 {TR_SH_ELEC, "", 0, -2, 0},
7200 {TR_SH_COLD, "", 0, -2, 0},
7201 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
7202 {TR_WARNING, "warning", 3, TR_WARNING, 20},
7203 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
7204 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
7205 {TR_LITE_2, "", 0, -2, 0},
7206 {TR_LITE_3, "", 0, -2, 0},
7207 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7208 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7209 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7210 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7211 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7213 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7214 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7215 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7216 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7217 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7218 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7219 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7220 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7221 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7222 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7223 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7224 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7225 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7226 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
7227 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7228 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7229 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7230 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7232 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7233 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
7234 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
7235 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
7236 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
7237 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
7238 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7239 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7241 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7242 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7243 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7244 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7245 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7246 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7247 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7248 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7249 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7250 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7251 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7252 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7254 {-1, NULL, 0, -1, 0}
7260 * エッセンス名テーブル / Essense names for Weapon smith
7263 cptr essence_name[] =
7366 cptr essence_name[] =
7469 * @brief 所持しているエッセンス一覧を表示する
7472 static void display_essence(void)
7477 for (i = 1; i < 22; i++)
7481 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7482 "Essence Num Essence Num Essence Num "), 1, 8);
7483 for (i = 0; essence_name[i]; i++)
7485 if (!essence_name[i][0]) continue;
7486 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7489 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7499 static void drain_essence(void)
7501 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7505 bool observe = FALSE;
7506 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7507 TIME_EFFECT old_timeout;
7508 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7514 OBJECT_IDX next_o_idx;
7517 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7520 item_tester_hook = object_is_weapon_armour_ammo;
7522 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7523 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7525 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT))) return;
7527 /* Get the item (in the pack) */
7530 o_ptr = &inventory[item];
7533 /* Get the item (on the floor) */
7536 o_ptr = &o_list[0 - item];
7539 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7541 GAME_TEXT o_name[MAX_NLEN];
7542 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7543 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7546 p_ptr->energy_use = 100;
7548 object_flags(o_ptr, old_flgs);
7549 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7550 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7551 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7552 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7553 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7554 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7555 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7556 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7557 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7559 old_to_a = o_ptr->to_a;
7561 old_to_h = o_ptr->to_h;
7562 old_to_d = o_ptr->to_d;
7565 old_pval = o_ptr->pval;
7566 old_name2 = o_ptr->name2;
7567 old_timeout = o_ptr->timeout;
7568 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7569 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7570 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7571 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7572 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7573 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7574 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7575 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7576 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7577 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7578 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7579 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7580 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7581 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7582 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7583 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7584 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7585 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7586 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7590 next_o_idx = o_ptr->next_o_idx;
7591 marked = o_ptr->marked;
7592 weight = o_ptr->weight;
7593 number = o_ptr->number;
7595 object_prep(o_ptr, o_ptr->k_idx);
7599 o_ptr->next_o_idx=next_o_idx;
7600 o_ptr->marked=marked;
7601 o_ptr->number = number;
7602 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7603 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7604 o_ptr->ident |= (IDENT_MENTAL);
7605 object_aware(o_ptr);
7606 object_known(o_ptr);
7608 object_flags(o_ptr, new_flgs);
7610 for (i = 0; essence_info[i].add_name; i++)
7612 essence_type *es_ptr = &essence_info[i];
7613 PARAMETER_VALUE pval = 0;
7615 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7616 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7618 if (es_ptr->add < TR_FLAG_MAX &&
7619 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7620 have_flag(old_flgs, es_ptr->add))
7624 drain_value[es_ptr->essence] += 10 * pval;
7626 else if (es_ptr->essence != -2)
7628 drain_value[es_ptr->essence] += 10;
7630 else if (es_ptr->add == TR_SH_FIRE)
7632 drain_value[TR_BRAND_FIRE] += 10;
7633 drain_value[TR_RES_FIRE] += 10;
7635 else if (es_ptr->add == TR_SH_ELEC)
7637 drain_value[TR_BRAND_ELEC] += 10;
7638 drain_value[TR_RES_ELEC] += 10;
7640 else if (es_ptr->add == TR_SH_COLD)
7642 drain_value[TR_BRAND_COLD] += 10;
7643 drain_value[TR_RES_COLD] += 10;
7645 else if (es_ptr->add == TR_LITE_2)
7647 drain_value[TR_LITE_1] += 20;
7649 else if (es_ptr->add == TR_LITE_3)
7651 drain_value[TR_LITE_1] += 30;
7656 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7658 drain_value[TR_INT] += 5;
7659 drain_value[TR_WIS] += 5;
7661 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7663 drain_value[TR_BRAND_POIS] += 5;
7664 drain_value[TR_BRAND_ACID] += 5;
7665 drain_value[TR_BRAND_ELEC] += 5;
7666 drain_value[TR_BRAND_FIRE] += 5;
7667 drain_value[TR_BRAND_COLD] += 5;
7669 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7671 drain_value[TR_INT] += 10;
7673 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7675 drain_value[TR_STR] += 10;
7677 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7679 drain_value[TR_DEX] += 10;
7681 if (old_name2 == EGO_2WEAPON)
7683 drain_value[TR_DEX] += 20;
7685 if (object_is_weapon_ammo(o_ptr))
7687 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7689 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7691 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7692 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7693 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7694 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7696 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7698 drain_value[i] *= number;
7699 drain_value[i] = drain_value[i] * dec / 4;
7700 drain_value[i] = MAX(drain_value[i], 0);
7701 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7709 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7713 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7715 for (i = 0; essence_name[i]; i++)
7717 if (!essence_name[i][0]) continue;
7718 if (!drain_value[i]) continue;
7720 p_ptr->magic_num1[i] += drain_value[i];
7721 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7723 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7727 /* Apply autodestroy/inscription to the drained item */
7728 autopick_alter_item(item, TRUE);
7730 /* Combine the pack */
7731 p_ptr->update |= (PU_COMBINE | PU_REORDER);
7733 p_ptr->window |= (PW_INVEN);
7737 * @brief 付加するエッセンスの大別を選択する
7738 * @return 選んだエッセンスの大別ID
7740 static COMMAND_CODE choose_essence(void)
7742 COMMAND_CODE mode = 0;
7744 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7747 cptr menu_name[] = {
7757 cptr menu_name[] = {
7767 const COMMAND_CODE mode_max = 7;
7769 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7779 for (i = 0; i < mode_max; i++)
7781 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7782 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7784 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7785 prt("Choose from menu.", 0, 0);
7804 menu_line += mode_max - 1;
7813 if (menu_line > mode_max) menu_line -= mode_max;
7824 for (i = 0; i < mode_max; i++)
7825 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7827 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7833 if (isupper(choice)) choice = (char)tolower(choice);
7835 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7836 mode = (int)choice - 'a' + 1;
7846 * @brief エッセンスを実際に付加する
7847 * @param mode エッセンスの大別ID
7850 static void add_essence(ESSENCE_IDX mode)
7862 GAME_TEXT o_name[MAX_NLEN];
7864 essence_type *es_ptr;
7865 bool able[22] = { 0 };
7867 int menu_line = (use_menu ? 1 : 0);
7869 for (i = 0; essence_info[i].add_name; i++)
7871 es_ptr = &essence_info[i];
7873 if (es_ptr->type != mode) continue;
7877 if (!repeat_pull(&i) || i<0 || i>=max_num)
7880 /* Nothing chosen yet */
7886 /* Build a prompt */
7887 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
7888 if (use_menu) screen_save();
7890 /* Get a spell from the user */
7892 choice = (always_show_list || use_menu) ? ESCAPE:1;
7895 if( choice==ESCAPE ) choice = ' ';
7896 else if( !get_com(out_val, &choice, FALSE) )break;
7898 if (use_menu && choice != ' ')
7912 menu_line += (max_num-1);
7935 menu_line = max_num;
7949 if (menu_line > max_num) menu_line -= max_num;
7951 /* Request redraw */
7952 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
7955 if (!redraw || use_menu)
7959 char dummy[80], dummy2[80];
7966 if (!use_menu) screen_save();
7968 for (y = 1; y < 24; y++)
7971 /* Print header(s) */
7973 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
7976 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
7979 for (ctr = 0; ctr < max_num; ctr++)
7981 es_ptr = &essence_info[num[ctr]];
7985 if (ctr == (menu_line-1))
7986 strcpy(dummy, _("》 ", "> "));
7987 else strcpy(dummy, " ");
7990 /* letter/number for power selection */
7993 sprintf(dummy, "%c) ",I2A(ctr));
7996 strcat(dummy, es_ptr->add_name);
8001 if (es_ptr->essence != -1)
8003 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
8004 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
8010 case ESSENCE_SH_FIRE:
8011 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
8012 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
8013 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8015 case ESSENCE_SH_ELEC:
8016 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
8017 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
8018 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8020 case ESSENCE_SH_COLD:
8021 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
8022 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
8023 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8025 case ESSENCE_RESISTANCE:
8026 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8027 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8028 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8029 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8030 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8032 case ESSENCE_SUSTAIN:
8033 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8034 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8035 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8036 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8037 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8042 if (!able[ctr]) col = TERM_RED;
8044 if (es_ptr->essence != -1)
8046 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
8050 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
8053 c_prt(col, dummy2, ctr+2, x);
8072 ask = (isupper(choice));
8075 if (ask) choice = (char)tolower(choice);
8077 /* Extract request */
8078 i = (islower(choice) ? A2I(choice) : -1);
8081 /* Totally Illegal */
8082 if ((i < 0) || (i >= max_num) || !able[i])
8094 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
8096 /* Belay that order */
8097 if (!get_check(tmp_val)) continue;
8103 if (redraw) screen_load();
8109 es_ptr = &essence_info[num[i]];
8111 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8112 item_tester_tval = TV_GLOVES;
8113 else if (mode == 1 || mode == 5)
8114 item_tester_hook = item_tester_hook_melee_ammo;
8115 else if (es_ptr->add == ESSENCE_ATTACK)
8116 item_tester_hook = object_allow_enchant_weapon;
8117 else if (es_ptr->add == ESSENCE_AC)
8118 item_tester_hook = object_is_armour;
8120 item_tester_hook = object_is_weapon_armour_ammo;
8122 q = _("どのアイテムを改良しますか?", "Improve which item? ");
8123 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
8125 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT))) return;
8127 /* Get the item (in the pack) */
8130 o_ptr = &inventory[item];
8133 /* Get the item (on the floor) */
8136 o_ptr = &o_list[0 - item];
8139 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
8141 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
8145 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8147 use_essence = es_ptr->value;
8148 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
8149 if (o_ptr->number > 1)
8151 use_essence *= o_ptr->number;
8152 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
8155 if (es_ptr->essence != -1)
8157 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8159 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8162 if (is_pval_flag(es_ptr->add))
8164 if (o_ptr->pval < 0)
8166 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
8169 else if (es_ptr->add == TR_BLOWS)
8171 if (o_ptr->pval > 1)
8173 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
8177 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8179 else if (o_ptr->pval > 0)
8181 use_essence *= o_ptr->pval;
8182 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8188 PARAMETER_VALUE pval;
8189 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8191 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
8192 strcpy(tmp_val, "1");
8194 if (!get_string(tmp, tmp_val, 1)) return;
8195 pval = (PARAMETER_VALUE)atoi(tmp_val);
8196 if (pval > limit) pval = limit;
8197 else if (pval < 1) pval = 1;
8198 o_ptr->pval += pval;
8199 use_essence *= pval;
8200 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8203 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8205 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8209 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8216 strcpy(tmp_val, "1");
8217 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
8218 val = atoi(tmp_val);
8219 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8220 else if (val < 1) val = 1;
8222 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8223 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8225 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8228 get_to_h = ((val+1)/2+randint0(val/2+1));
8229 get_to_d = ((val+1)/2+randint0(val/2+1));
8230 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8231 o_ptr->to_h += get_to_h;
8232 o_ptr->to_d += get_to_d;
8234 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8235 if (es_ptr->add == ESSENCE_ATTACK)
8237 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8239 msg_print(_("改良に失敗した。", "You failed to enchant."));
8240 p_ptr->energy_use = 100;
8245 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8246 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8249 else if (es_ptr->add == ESSENCE_AC)
8251 if (o_ptr->to_a >= p_ptr->lev/5+5)
8253 msg_print(_("改良に失敗した。", "You failed to enchant."));
8254 p_ptr->energy_use = 100;
8259 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8264 o_ptr->xtra3 = es_ptr->add + 1;
8269 bool success = TRUE;
8273 case ESSENCE_SH_FIRE:
8274 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8279 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8280 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8282 case ESSENCE_SH_ELEC:
8283 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8288 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8289 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8291 case ESSENCE_SH_COLD:
8292 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8297 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8298 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8300 case ESSENCE_RESISTANCE:
8301 case ESSENCE_SUSTAIN:
8302 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))
8307 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8308 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8309 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8310 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8315 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8318 if (es_ptr->add == ESSENCE_SUSTAIN)
8320 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8321 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8322 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8323 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8327 o_ptr->xtra3 = es_ptr->add + 1;
8331 p_ptr->energy_use = 100;
8334 msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name);
8336 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8339 /* Combine the pack */
8340 p_ptr->update |= (PU_COMBINE | PU_REORDER);
8342 p_ptr->window |= (PW_INVEN);
8349 static void erase_essence(void)
8354 GAME_TEXT o_name[MAX_NLEN];
8355 BIT_FLAGS flgs[TR_FLAG_SIZE];
8357 item_tester_hook = object_is_smith;
8359 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
8360 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
8362 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8364 /* Get the item (in the pack) */
8367 o_ptr = &inventory[item];
8370 /* Get the item (on the floor) */
8373 o_ptr = &o_list[0 - item];
8376 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8377 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
8379 p_ptr->energy_use = 100;
8381 if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE)
8383 o_ptr->to_h -= (o_ptr->xtra4>>8);
8384 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8386 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8387 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8390 object_flags(o_ptr, flgs);
8391 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8392 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8394 /* Combine the pack */
8395 p_ptr->update |= (PU_COMBINE | PU_REORDER);
8397 p_ptr->window |= (PW_INVEN);
8401 * @brief 鍛冶コマンドのメインルーチン
8402 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8405 void do_cmd_kaji(bool only_browse)
8407 COMMAND_CODE mode = 0;
8410 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8414 if (p_ptr->confused)
8416 msg_print(_("混乱していて作業できない!", "You are too confused!"));
8421 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8426 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8431 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8433 if (only_browse) screen_save();
8435 if (!only_browse) screen_save();
8441 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8442 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8443 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8444 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8445 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8446 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8448 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8449 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8450 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8451 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8452 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8453 prt(format("Choose command from menu."), 0, 0);
8480 if (menu_line > 5) menu_line -= 5;
8488 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
8489 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
8490 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
8491 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
8492 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
8494 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8496 if (!get_com("Command :", &choice, TRUE))
8533 /* Clear lines, position cursor (really should use strlen here) */
8534 Term_erase(14, 21, 255);
8535 Term_erase(14, 20, 255);
8536 Term_erase(14, 19, 255);
8537 Term_erase(14, 18, 255);
8538 Term_erase(14, 17, 255);
8539 Term_erase(14, 16, 255);
8541 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8542 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8544 prt(&temp[j], line, 15);
8549 if (!only_browse) screen_load();
8550 } while (only_browse);
8555 case 1: display_essence();break;
8556 case 2: drain_essence();break;
8557 case 3: erase_essence();break;
8559 mode = choose_essence();
8564 case 5: add_essence(10);break;
8570 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8571 * Torches have special abilities when they are flaming.
8572 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8573 * @param flgs 特別に追加するフラグを返す参照ポインタ
8576 void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
8578 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8580 if (o_ptr->xtra4 > 0)
8582 add_flag(flgs, TR_BRAND_FIRE);
8583 add_flag(flgs, TR_KILL_UNDEAD);
8584 add_flag(flgs, TR_THROW);
8590 * @brief 投擲時たいまつにダイスを与える。
8591 * Torches have special abilities when they are flaming.
8592 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8593 * @param dd 特別なダイス数を返す参照ポインタ
8594 * @param ds 特別なダイス面数を返す参照ポインタ
8597 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
8599 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8601 if (o_ptr->xtra4 > 0)
8610 * @brief 投擲時命中したたいまつの寿命を縮める。
8611 * Torches have special abilities when they are flaming.
8612 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8615 void torch_lost_fuel(object_type *o_ptr)
8617 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8619 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8620 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;