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 KIND_OBJECT_IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval)
1904 KIND_OBJECT_IDX bk = 0;
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);
2123 object_desc(o_name, o_ptr, 0);
2124 msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name);
2128 * @brief INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2129 * Mega-Hack -- Attempt to create one of the "Special Objects"
2130 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2131 * @return 生成に成功したらTRUEを返す。
2133 * We are only called from "make_object()", and we assume that\n
2134 * "apply_magic()" is called immediately after we return.\n
2136 * Note -- see "make_artifact()" and "apply_magic()"\n
2138 static bool make_artifact_special(object_type *o_ptr)
2141 KIND_OBJECT_IDX k_idx = 0;
2143 /*! @note 地上ではキャンセルする / No artifacts in the town */
2144 if (!dun_level) return (FALSE);
2146 /*! @note get_obj_num_hookによる指定がある場合は生成をキャンセルする / Themed object */
2147 if (get_obj_num_hook) return (FALSE);
2149 /*! @note 全固定アーティファクト中からIDの若い順に生成対象とその確率を走査する / Check the artifact list (just the "specials") */
2150 for (i = 0; i < max_a_idx; i++)
2152 artifact_type *a_ptr = &a_info[i];
2154 /*! @note アーティファクト名が空の不正なデータは除外する / Skip "empty" artifacts */
2155 if (!a_ptr->name) continue;
2157 /*! @note 既に生成回数がカウントされたアーティファクト、QUESTITEMと非INSTA_ARTは除外 / Cannot make an artifact twice */
2158 if (a_ptr->cur_num) continue;
2159 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2160 if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue;
2162 /*! @note アーティファクト生成階が現在に対して足りない場合は高確率で1/(不足階層*2)を満たさないと生成リストに加えられない /
2163 * XXX XXX Enforce minimum "depth" (loosely) */
2164 if (a_ptr->level > object_level)
2166 /* @note / Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2167 int d = (a_ptr->level - object_level) * 2;
2168 if (!one_in_(d)) continue;
2171 /*! @note 1/(レア度)の確率を満たさないと除外される / Artifact "rarity roll" */
2172 if (!one_in_(a_ptr->rarity)) continue;
2174 /*! @note INSTA_ART型固定アーティファクトのベースアイテムもチェック対象とする。ベースアイテムの生成階層が足りない場合1/(不足階層*5) を満たさないと除外される。 /
2175 * Find the base object. XXX XXX Enforce minimum "object" level (loosely). Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2176 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2177 if (k_info[k_idx].level > object_level)
2179 int d = (k_info[k_idx].level - object_level) * 5;
2180 if (!one_in_(d)) continue;
2183 /*! @note 前述の条件を満たしたら、後のIDのアーティファクトはチェックせずすぐ確定し生成処理に移す /
2184 * Assign the template. Mega-Hack -- mark the item as an artifact. Hack: Some artifacts get random extra powers. Success. */
2185 object_prep(o_ptr, k_idx);
2188 random_artifact_resistance(o_ptr, a_ptr);
2192 /*! @note 全INSTA_ART固定アーティファクトを試行しても決まらなかった場合 FALSEを返す / Failure */
2198 * @brief 非INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2199 * Mega-Hack -- Attempt to create one of the "Special Objects"
2200 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2201 * @return 生成に成功したらTRUEを返す。
2203 * Attempt to change an object into an artifact\n
2204 * This routine should only be called by "apply_magic()"\n
2205 * Note -- see "make_artifact_special()" and "apply_magic()"\n
2207 static bool make_artifact(object_type *o_ptr)
2211 /* No artifacts in the town */
2212 if (!dun_level) return (FALSE);
2214 /* Paranoia -- no "plural" artifacts */
2215 if (o_ptr->number != 1) return (FALSE);
2217 /* Check the artifact list (skip the "specials") */
2218 for (i = 0; i < max_a_idx; i++)
2220 artifact_type *a_ptr = &a_info[i];
2222 /* Skip "empty" items */
2223 if (!a_ptr->name) continue;
2225 /* Cannot make an artifact twice */
2226 if (a_ptr->cur_num) continue;
2228 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2230 if (a_ptr->gen_flags & TRG_INSTA_ART) continue;
2232 /* Must have the correct fields */
2233 if (a_ptr->tval != o_ptr->tval) continue;
2234 if (a_ptr->sval != o_ptr->sval) continue;
2236 /* XXX XXX Enforce minimum "depth" (loosely) */
2237 if (a_ptr->level > dun_level)
2239 /* Acquire the "out-of-depth factor" */
2240 int d = (a_ptr->level - dun_level) * 2;
2242 /* Roll for out-of-depth creation */
2243 if (!one_in_(d)) continue;
2246 /* We must make the "rarity roll" */
2247 if (!one_in_(a_ptr->rarity)) continue;
2249 /* Hack -- mark the item as an artifact */
2252 /* Hack: Some artifacts get random extra powers */
2253 random_artifact_resistance(o_ptr, a_ptr);
2265 * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
2266 * Choose random ego type
2267 * @param slot 取得したいエゴの装備部位
2268 * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
2269 * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
2271 static byte get_random_ego(byte slot, bool good)
2274 ego_item_type *e_ptr;
2278 for (i = 1; i < max_e_idx; i++)
2282 if (e_ptr->slot == slot
2283 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2286 total += (255 / e_ptr->rarity);
2290 value = randint1(total);
2292 for (i = 1; i < max_e_idx; i++)
2296 if (e_ptr->slot == slot
2297 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2300 value -= (255 / e_ptr->rarity);
2301 if (value <= 0L) break;
2309 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2310 * Apply magic to an item known to be a "weapon"
2311 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2312 * @param level 生成基準階
2313 * @param power 生成ランク
2316 * Hack -- note special base damage dice boosting\n
2317 * Hack -- note special processing for weapon/digger\n
2319 static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
2321 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
2322 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
2324 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
2325 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
2327 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2329 tohit2 = (tohit2+1)/2;
2330 todam2 = (todam2+1)/2;
2337 o_ptr->to_h += tohit1;
2338 o_ptr->to_d += todam1;
2344 o_ptr->to_h += tohit2;
2345 o_ptr->to_d += todam2;
2353 o_ptr->to_h -= tohit1;
2354 o_ptr->to_d -= todam1;
2359 /* Penalize again */
2360 o_ptr->to_h -= tohit2;
2361 o_ptr->to_d -= todam2;
2364 /* Cursed (if "bad") */
2365 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2368 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2371 switch (o_ptr->tval)
2378 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2379 create_artifact(o_ptr, FALSE);
2381 /* Special Ego-item */
2382 o_ptr->name2 = EGO_DIGGING;
2386 else if (power < -1)
2388 /* Hack -- Horrible digging bonus */
2389 o_ptr->pval = 0 - (5 + randint1(5));
2395 /* Hack -- Reverse digging bonus */
2396 o_ptr->pval = 0 - (o_ptr->pval);
2410 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2412 create_artifact(o_ptr, FALSE);
2417 /* Roll for an ego-item */
2418 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2419 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2421 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2423 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2428 switch (o_ptr->name2)
2431 if (one_in_(4) && (level > 40))
2432 add_flag(o_ptr->art_flags, TR_BLOWS);
2436 add_flag(o_ptr->art_flags, TR_RES_POIS);
2438 add_flag(o_ptr->art_flags, TR_WARNING);
2440 case EGO_KILL_DRAGON:
2442 add_flag(o_ptr->art_flags, TR_RES_POIS);
2446 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2448 case EGO_SLAYING_WEAPON:
2449 if (one_in_(3)) /* double damage */
2457 while (one_in_(o_ptr->dd));
2463 while (one_in_(o_ptr->ds));
2468 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2470 if (o_ptr->tval == TV_SWORD && one_in_(3))
2472 add_flag(o_ptr->art_flags, TR_VORPAL);
2477 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2483 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
2485 add_flag(o_ptr->art_flags, TR_DEX);
2487 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2490 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
2492 case EGO_EARTHQUAKES:
2493 if (one_in_(3) && (level > 60))
2494 add_flag(o_ptr->art_flags, TR_BLOWS);
2496 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
2500 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2504 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2506 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2508 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2509 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2512 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2513 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2514 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2515 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2519 if (!o_ptr->art_name)
2521 /* Hack -- Super-charge the damage dice */
2522 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2524 /* Hack -- Lower the damage dice */
2525 if (o_ptr->dd > 9) o_ptr->dd = 9;
2530 else if (power < -1)
2532 /* Roll for ego-item */
2533 if (randint0(MAX_DEPTH) < level)
2537 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2538 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2544 switch (o_ptr->name2)
2547 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2548 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2550 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2551 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2552 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2553 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2554 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2555 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2569 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2571 create_artifact(o_ptr, FALSE);
2574 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2588 if (power > 2) /* power > 2 is debug only */
2590 create_artifact(o_ptr, FALSE);
2594 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2596 switch (o_ptr->name2)
2598 case EGO_SLAYING_BOLT:
2603 /* Hack -- super-charge the damage dice */
2604 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2606 /* Hack -- restrict the damage dice */
2607 if (o_ptr->dd > 9) o_ptr->dd = 9;
2611 else if (power < -1)
2613 /* Roll for ego-item */
2614 if (randint0(MAX_DEPTH) < level)
2616 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2626 * @brief ドラゴン装備にランダムな耐性を与える
2627 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2630 static void dragon_resist(object_type * o_ptr)
2635 one_dragon_ele_resistance(o_ptr);
2637 one_high_resistance(o_ptr);
2643 * @brief オブジェクトにランダムな強いESPを与える
2644 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2647 static bool add_esp_strong(object_type *o_ptr)
2649 bool nonliv = FALSE;
2651 switch (randint1(3))
2653 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2654 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2655 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2662 * @brief オブジェクトにランダムな弱いESPを与える
2663 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2664 * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3)
2667 static void add_esp_weak(object_type *o_ptr, bool extra)
2670 u32b weak_esp_list[] = {
2682 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2683 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2685 /* Add unduplicated weak esp flags randomly */
2686 for (i = 0; i < add_count; ++ i)
2688 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2690 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2691 weak_esp_list[choice] = weak_esp_list[i];
2697 * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2698 * Apply magic to an item known to be "armor"
2699 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2700 * @param level 生成基準階
2701 * @param power 生成ランク
2704 * Hack -- note special processing for crown/helm\n
2705 * Hack -- note special processing for robe of permanence\n
2707 static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
2709 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
2710 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
2716 o_ptr->to_a += toac1;
2722 o_ptr->to_a += toac2;
2730 o_ptr->to_a -= toac1;
2735 /* Penalize again */
2736 o_ptr->to_a -= toac2;
2739 /* Cursed (if "bad") */
2740 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2745 switch (o_ptr->tval)
2749 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2750 create_artifact(o_ptr, FALSE);
2760 /* Hack -- Try for "Robes of the Magi" */
2761 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2762 (o_ptr->sval == SV_ROBE) &&
2763 (randint0(100) < 15))
2767 o_ptr->name2 = EGO_YOIYAMI;
2768 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2769 o_ptr->sval = SV_YOIYAMI_ROBE;
2775 o_ptr->name2 = EGO_PERMANENCE;
2780 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2782 create_artifact(o_ptr, FALSE);
2788 bool okay_flag = TRUE;
2790 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2792 switch (o_ptr->name2)
2795 if (o_ptr->tval != TV_HARD_ARMOR)
2801 if (o_ptr->tval != TV_SOFT_ARMOR)
2810 if (okay_flag) break;
2812 switch (o_ptr->name2)
2814 case EGO_RESISTANCE:
2816 add_flag(o_ptr->art_flags, TR_RES_POIS);
2819 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2820 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2824 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2826 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2828 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2829 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2831 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2832 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2833 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2834 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2835 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2836 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2837 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2838 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2841 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2842 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2843 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2844 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2845 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2846 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2859 if (o_ptr->sval == SV_DRAGON_SHIELD)
2861 dragon_resist(o_ptr);
2862 if (!one_in_(3)) break;
2868 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2870 create_artifact(o_ptr, FALSE);
2876 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2877 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
2878 && o_ptr->name2 == EGO_S_DWARVEN)
2885 switch (o_ptr->name2)
2888 if (!one_in_(3)) one_high_resistance(o_ptr);
2889 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2891 case EGO_REFLECTION:
2892 if (o_ptr->sval == SV_MIRROR_SHIELD)
2897 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2898 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2907 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2909 dragon_resist(o_ptr);
2910 if (!one_in_(3)) break;
2914 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2916 create_artifact(o_ptr, FALSE);
2919 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2923 else if (power < -1)
2925 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2933 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2935 dragon_resist(o_ptr);
2936 if (!one_in_(3)) break;
2941 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2943 create_artifact(o_ptr, FALSE);
2946 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
2948 switch (o_ptr->name2)
2950 case EGO_SLOW_DESCENT:
2953 one_high_resistance(o_ptr);
2959 else if (power < -1)
2961 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
2972 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2974 create_artifact(o_ptr, FALSE);
2979 bool ok_flag = TRUE;
2980 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
2982 switch (o_ptr->name2)
2985 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
2986 else add_esp_weak(o_ptr, FALSE);
2990 case EGO_REGENERATION:
2991 case EGO_LORDLINESS:
2997 if (one_in_(2)) add_esp_strong(o_ptr);
2998 else add_esp_weak(o_ptr, FALSE);
3001 default:/* not existing crown (wisdom,lite, etc...) */
3005 break; /* while (1) */
3011 else if (power < -1)
3015 bool ok_flag = TRUE;
3016 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3018 switch (o_ptr->name2)
3020 case EGO_ANCIENT_CURSE:
3021 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
3022 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
3023 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3024 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3025 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3026 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3030 break; /* while (1) */
3039 if (o_ptr->sval == SV_DRAGON_HELM)
3041 dragon_resist(o_ptr);
3042 if (!one_in_(3)) break;
3048 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3050 create_artifact(o_ptr, FALSE);
3055 bool ok_flag = TRUE;
3056 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3058 switch (o_ptr->name2)
3060 case EGO_BRILLIANCE:
3062 case EGO_INFRAVISION:
3063 case EGO_H_PROTECTION:
3068 if (one_in_(2)) add_esp_strong(o_ptr);
3069 else add_esp_weak(o_ptr, FALSE);
3073 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
3074 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
3077 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3079 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
3081 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
3082 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3084 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3085 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
3086 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
3087 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3088 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3089 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3090 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3091 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
3093 default:/* not existing helm (Magi, Might, etc...)*/
3097 break; /* while (1) */
3102 else if (power < -1)
3106 bool ok_flag = TRUE;
3107 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3109 switch (o_ptr->name2)
3111 case EGO_ANCIENT_CURSE:
3115 break; /* while (1) */
3126 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3128 create_artifact(o_ptr, FALSE);
3131 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
3133 switch (o_ptr->name2)
3142 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
3143 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
3144 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
3145 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3152 else if (power < -1)
3154 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3165 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
3166 * Apply magic to an item known to be a "ring" or "amulet"
3167 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3168 * @param level 生成基準階
3169 * @param power 生成ランク
3172 * Hack -- note special "pval boost" code for ring of speed\n
3173 * Hack -- note that some items must be cursed (or blessed)\n
3175 static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
3177 /* Apply magic (good or bad) according to type */
3178 switch (o_ptr->tval)
3183 switch (o_ptr->sval)
3185 case SV_RING_ATTACKS:
3188 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
3189 if (one_in_(15)) o_ptr->pval++;
3190 if (o_ptr->pval < 1) o_ptr->pval = 1;
3196 o_ptr->ident |= (IDENT_BROKEN);
3199 o_ptr->curse_flags |= TRC_CURSED;
3202 o_ptr->pval = 0 - (o_ptr->pval);
3213 /* Strength, Constitution, Dexterity, Intelligence */
3219 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3225 o_ptr->ident |= (IDENT_BROKEN);
3228 o_ptr->curse_flags |= TRC_CURSED;
3231 o_ptr->pval = 0 - (o_ptr->pval);
3237 /* Ring of Speed! */
3240 /* Base speed (1 to 10) */
3241 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3243 /* Super-charge the ring */
3244 while (randint0(100) < 50) o_ptr->pval++;
3250 o_ptr->ident |= (IDENT_BROKEN);
3253 o_ptr->curse_flags |= TRC_CURSED;
3256 o_ptr->pval = 0 - (o_ptr->pval);
3264 case SV_RING_LORDLY:
3268 one_lordly_high_resistance(o_ptr);
3272 /* Bonus to armor class */
3273 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3277 case SV_RING_WARNING:
3279 if (one_in_(3)) one_low_esp(o_ptr);
3284 case SV_RING_SEARCHING:
3286 /* Bonus to searching */
3287 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3293 o_ptr->ident |= (IDENT_BROKEN);
3296 o_ptr->curse_flags |= TRC_CURSED;
3299 o_ptr->pval = 0 - (o_ptr->pval);
3305 /* Flames, Acid, Ice */
3306 case SV_RING_FLAMES:
3311 /* Bonus to armor class */
3312 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3316 /* Weakness, Stupidity */
3317 case SV_RING_WEAKNESS:
3318 case SV_RING_STUPIDITY:
3321 o_ptr->ident |= (IDENT_BROKEN);
3324 o_ptr->curse_flags |= TRC_CURSED;
3327 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3328 if (power > 0) power = 0 - power;
3333 /* WOE, Stupidity */
3337 o_ptr->ident |= (IDENT_BROKEN);
3340 o_ptr->curse_flags |= TRC_CURSED;
3343 o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
3344 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3345 if (power > 0) power = 0 - power;
3350 /* Ring of damage */
3351 case SV_RING_DAMAGE:
3353 /* Bonus to damage */
3354 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
3360 o_ptr->ident |= (IDENT_BROKEN);
3363 o_ptr->curse_flags |= TRC_CURSED;
3366 o_ptr->to_d = 0 - o_ptr->to_d;
3372 /* Ring of Accuracy */
3373 case SV_RING_ACCURACY:
3376 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
3382 o_ptr->ident |= (IDENT_BROKEN);
3385 o_ptr->curse_flags |= TRC_CURSED;
3388 o_ptr->to_h = 0 - o_ptr->to_h;
3394 /* Ring of Protection */
3395 case SV_RING_PROTECTION:
3397 /* Bonus to armor class */
3398 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
3404 o_ptr->ident |= (IDENT_BROKEN);
3407 o_ptr->curse_flags |= TRC_CURSED;
3410 o_ptr->to_a = 0 - o_ptr->to_a;
3416 /* Ring of Slaying */
3417 case SV_RING_SLAYING:
3419 /* Bonus to damage and to hit */
3420 o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
3421 o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
3427 o_ptr->ident |= (IDENT_BROKEN);
3430 o_ptr->curse_flags |= TRC_CURSED;
3432 /* Reverse bonuses */
3433 o_ptr->to_h = 0 - o_ptr->to_h;
3434 o_ptr->to_d = 0 - o_ptr->to_d;
3440 case SV_RING_MUSCLE:
3442 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
3443 if (one_in_(4)) o_ptr->pval++;
3449 o_ptr->ident |= (IDENT_BROKEN);
3452 o_ptr->curse_flags |= TRC_CURSED;
3454 /* Reverse bonuses */
3455 o_ptr->pval = 0 - o_ptr->pval;
3460 case SV_RING_AGGRAVATION:
3463 o_ptr->ident |= (IDENT_BROKEN);
3466 o_ptr->curse_flags |= TRC_CURSED;
3468 if (power > 0) power = 0 - power;
3472 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3473 || (power > 2)) /* power > 2 is debug only */
3475 o_ptr->pval = MIN(o_ptr->pval, 4);
3476 /* Randart amulet */
3477 create_artifact(o_ptr, FALSE);
3479 else if ((power == 2) && one_in_(2))
3481 while(!o_ptr->name2)
3483 int tmp = m_bonus(10, level);
3484 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3485 switch(randint1(28))
3488 o_ptr->name2 = EGO_RING_THROW;
3491 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3492 o_ptr->name2 = EGO_RING_REGEN;
3495 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3496 o_ptr->name2 = EGO_RING_LITE;
3499 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3500 o_ptr->name2 = EGO_RING_TELEPORT;
3503 if (o_ptr->to_h) break;
3504 o_ptr->name2 = EGO_RING_TO_H;
3507 if (o_ptr->to_d) break;
3508 o_ptr->name2 = EGO_RING_TO_D;
3511 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3512 o_ptr->name2 = EGO_RING_SLAY;
3515 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3516 o_ptr->name2 = EGO_RING_WIZARD;
3519 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3520 o_ptr->name2 = EGO_RING_HERO;
3523 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3524 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3525 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3526 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3529 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3530 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;
3531 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3532 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3533 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3536 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3537 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;
3538 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3539 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3540 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3543 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3544 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;
3545 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3546 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3549 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3550 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;
3551 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3552 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3554 case 21: case 22: case 23: case 24: case 25: case 26:
3555 switch (o_ptr->sval)
3558 if (!one_in_(3)) break;
3559 o_ptr->name2 = EGO_RING_D_SPEED;
3561 case SV_RING_DAMAGE:
3562 case SV_RING_ACCURACY:
3563 case SV_RING_SLAYING:
3564 if (one_in_(2)) break;
3565 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3568 o_ptr->name2 = EGO_RING_BERSERKER;
3569 o_ptr->to_h -= 2+randint1(4);
3570 o_ptr->to_d += 2+randint1(4);
3573 case SV_RING_PROTECTION:
3574 o_ptr->name2 = EGO_RING_SUPER_AC;
3575 o_ptr->to_a += 7 + m_bonus(5, level);
3577 case SV_RING_RES_FEAR:
3578 o_ptr->name2 = EGO_RING_HERO;
3581 if (one_in_(2)) break;
3582 o_ptr->name2 = EGO_RING_HUNTER;
3584 case SV_RING_SEARCHING:
3585 o_ptr->name2 = EGO_RING_STEALTH;
3587 case SV_RING_TELEPORTATION:
3588 o_ptr->name2 = EGO_RING_TELE_AWAY;
3590 case SV_RING_RES_BLINDNESS:
3592 o_ptr->name2 = EGO_RING_RES_LITE;
3594 o_ptr->name2 = EGO_RING_RES_DARK;
3596 case SV_RING_LORDLY:
3597 if (!one_in_(20)) break;
3598 one_lordly_high_resistance(o_ptr);
3599 one_lordly_high_resistance(o_ptr);
3600 o_ptr->name2 = EGO_RING_TRUE;
3602 case SV_RING_SUSTAIN:
3603 if (!one_in_(4)) break;
3604 o_ptr->name2 = EGO_RING_RES_TIME;
3606 case SV_RING_FLAMES:
3607 if (!one_in_(2)) break;
3608 o_ptr->name2 = EGO_RING_DRAGON_F;
3611 if (!one_in_(2)) break;
3612 o_ptr->name2 = EGO_RING_DRAGON_C;
3614 case SV_RING_WARNING:
3615 if (!one_in_(2)) break;
3616 o_ptr->name2 = EGO_RING_M_DETECT;
3625 o_ptr->curse_flags = 0L;
3627 else if ((power == -2) && one_in_(2))
3629 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3630 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3631 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3632 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3633 o_ptr->art_flags[0] = 0;
3634 o_ptr->art_flags[1] = 0;
3635 while(!o_ptr->name2)
3637 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3641 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3642 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3645 o_ptr->name2 = EGO_RING_NO_MELEE;
3648 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3649 o_ptr->name2 = EGO_RING_AGGRAVATE;
3652 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3653 o_ptr->name2 = EGO_RING_TY_CURSE;
3656 o_ptr->name2 = EGO_RING_ALBINO;
3661 o_ptr->ident |= (IDENT_BROKEN);
3664 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3672 switch (o_ptr->sval)
3674 /* Amulet of wisdom/charisma */
3675 case SV_AMULET_INTELLIGENCE:
3676 case SV_AMULET_WISDOM:
3677 case SV_AMULET_CHARISMA:
3679 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3685 o_ptr->ident |= (IDENT_BROKEN);
3688 o_ptr->curse_flags |= (TRC_CURSED);
3690 /* Reverse bonuses */
3691 o_ptr->pval = 0 - o_ptr->pval;
3697 /* Amulet of brilliance */
3698 case SV_AMULET_BRILLIANCE:
3700 o_ptr->pval = 1 + m_bonus(3, level);
3701 if (one_in_(4)) o_ptr->pval++;
3707 o_ptr->ident |= (IDENT_BROKEN);
3710 o_ptr->curse_flags |= (TRC_CURSED);
3712 /* Reverse bonuses */
3713 o_ptr->pval = 0 - o_ptr->pval;
3719 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3723 o_ptr->curse_flags |= (TRC_CURSED);
3728 case SV_AMULET_RESISTANCE:
3730 if (one_in_(5)) one_high_resistance(o_ptr);
3731 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3735 /* Amulet of searching */
3736 case SV_AMULET_SEARCHING:
3738 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
3744 o_ptr->ident |= (IDENT_BROKEN);
3747 o_ptr->curse_flags |= (TRC_CURSED);
3749 /* Reverse bonuses */
3750 o_ptr->pval = 0 - (o_ptr->pval);
3756 /* Amulet of the Magi -- never cursed */
3757 case SV_AMULET_THE_MAGI:
3759 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3760 o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
3762 /* gain one low ESP */
3763 add_esp_weak(o_ptr, FALSE);
3768 /* Amulet of Doom -- always cursed */
3769 case SV_AMULET_DOOM:
3772 o_ptr->ident |= (IDENT_BROKEN);
3775 o_ptr->curse_flags |= (TRC_CURSED);
3778 o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
3779 o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
3780 if (power > 0) power = 0 - power;
3785 case SV_AMULET_MAGIC_MASTERY:
3787 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
3793 o_ptr->ident |= (IDENT_BROKEN);
3796 o_ptr->curse_flags |= (TRC_CURSED);
3798 /* Reverse bonuses */
3799 o_ptr->pval = 0 - o_ptr->pval;
3805 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3806 || (power > 2)) /* power > 2 is debug only */
3808 o_ptr->pval = MIN(o_ptr->pval, 4);
3809 /* Randart amulet */
3810 create_artifact(o_ptr, FALSE);
3812 else if ((power == 2) && one_in_(2))
3814 while(!o_ptr->name2)
3816 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3817 switch(randint1(21))
3820 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3821 o_ptr->name2 = EGO_AMU_SLOW_D;
3824 if (o_ptr->pval) break;
3825 o_ptr->name2 = EGO_AMU_INFRA;
3828 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3829 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3832 if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
3833 o_ptr->name2 = EGO_AMU_HOLD_EXP;
3836 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3837 o_ptr->name2 = EGO_AMU_LEVITATION;
3839 case 10: case 11: case 21:
3840 o_ptr->name2 = EGO_AMU_AC;
3843 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3844 if (m_bonus(10, level) > 8)
3845 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3847 o_ptr->name2 = EGO_AMU_RES_FIRE;
3850 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3851 if (m_bonus(10, level) > 8)
3852 o_ptr->name2 = EGO_AMU_RES_COLD_;
3854 o_ptr->name2 = EGO_AMU_RES_COLD;
3857 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3858 if (m_bonus(10, level) > 8)
3859 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3861 o_ptr->name2 = EGO_AMU_RES_ELEC;
3864 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3865 if (m_bonus(10, level) > 8)
3866 o_ptr->name2 = EGO_AMU_RES_ACID_;
3868 o_ptr->name2 = EGO_AMU_RES_ACID;
3870 case 16: case 17: case 18: case 19: case 20:
3871 switch (o_ptr->sval)
3873 case SV_AMULET_TELEPORT:
3874 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3875 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3876 else o_ptr->name2 = EGO_AMU_TELEPORT;
3878 case SV_AMULET_RESIST_ACID:
3879 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3881 case SV_AMULET_SEARCHING:
3882 o_ptr->name2 = EGO_AMU_STEALTH;
3884 case SV_AMULET_BRILLIANCE:
3885 if (!one_in_(3)) break;
3886 o_ptr->name2 = EGO_AMU_IDENT;
3888 case SV_AMULET_CHARISMA:
3889 if (!one_in_(3)) break;
3890 o_ptr->name2 = EGO_AMU_CHARM;
3892 case SV_AMULET_THE_MAGI:
3893 if (one_in_(2)) break;
3894 o_ptr->name2 = EGO_AMU_GREAT;
3896 case SV_AMULET_RESISTANCE:
3897 if (!one_in_(5)) break;
3898 o_ptr->name2 = EGO_AMU_DEFENDER;
3900 case SV_AMULET_TELEPATHY:
3901 if (!one_in_(3)) break;
3902 o_ptr->name2 = EGO_AMU_DETECTION;
3908 o_ptr->curse_flags = 0L;
3910 else if ((power == -2) && one_in_(2))
3912 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3913 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3914 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3915 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3916 o_ptr->art_flags[0] = 0;
3917 o_ptr->art_flags[1] = 0;
3918 while(!o_ptr->name2)
3920 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3924 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3925 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3928 o_ptr->name2 = EGO_AMU_FOOL;
3931 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3932 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3935 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3936 o_ptr->name2 = EGO_AMU_TY_CURSE;
3939 o_ptr->name2 = EGO_AMU_NAIVETY;
3944 o_ptr->ident |= (IDENT_BROKEN);
3947 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3955 * @brief モンスターが人形のベースにできるかを返す
3956 * @param r_idx チェックしたいモンスター種族のID
3957 * @return 人形にできるならTRUEを返す
3959 static bool item_monster_okay(MONRACE_IDX r_idx)
3961 monster_race *r_ptr = &r_info[r_idx];
3964 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
3965 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
3966 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
3967 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
3968 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
3969 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
3976 * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
3977 * Apply magic to an item known to be "boring"
3978 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3979 * @param level 生成基準階
3980 * @param power 生成ランク
3983 * Hack -- note the special code for various items
3985 static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
3987 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3992 /* Apply magic (good or bad) according to type */
3993 switch (o_ptr->tval)
4002 o_ptr->ident |= (IDENT_BROKEN);
4005 o_ptr->curse_flags |= (TRC_CURSED);
4012 o_ptr->xtra4 = o_ptr->pval;
4018 /* Hack -- Torches -- random fuel */
4019 if (o_ptr->sval == SV_LITE_TORCH)
4021 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4025 /* Hack -- Lanterns -- random fuel */
4026 if (o_ptr->sval == SV_LITE_LANTERN)
4028 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4032 if (power > 2) /* power > 2 is debug only */
4034 create_artifact(o_ptr, FALSE);
4036 else if ((power == 2) || ((power == 1) && one_in_(3)))
4038 while (!o_ptr->name2)
4042 bool okay_flag = TRUE;
4044 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
4046 switch (o_ptr->name2)
4049 if (o_ptr->sval == SV_LITE_FEANOR)
4057 else if (power == -2)
4059 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
4061 switch (o_ptr->name2)
4063 case EGO_LITE_DARKNESS:
4066 if (o_ptr->sval == SV_LITE_TORCH)
4068 add_flag(o_ptr->art_flags, TR_LITE_M1);
4070 else if (o_ptr->sval == SV_LITE_LANTERN)
4072 add_flag(o_ptr->art_flags, TR_LITE_M2);
4074 else if (o_ptr->sval == SV_LITE_FEANOR)
4076 add_flag(o_ptr->art_flags, TR_LITE_M3);
4088 /* The wand or staff gets a number of initial charges equal
4089 * to between 1/2 (+1) and the full object kind's pval. -LM-
4091 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
4097 /* Transfer the pval. -LM- */
4098 o_ptr->pval = k_ptr->pval;
4105 object_aware(o_ptr);
4106 object_known(o_ptr);
4112 PARAMETER_VALUE i = 1;
4115 monster_race *r_ptr;
4117 /* Pick a random non-unique monster race */
4120 i = randint1(max_r_idx - 1);
4122 if (!item_monster_okay(i)) continue;
4123 if (i == MON_TSUCHINOKO) continue;
4127 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4129 /* Ignore dead monsters */
4130 if (!r_ptr->rarity) continue;
4132 /* Ignore uncommon monsters */
4133 if (r_ptr->rarity > 100) continue;
4135 /* Prefer less out-of-depth monsters */
4136 if (randint0(check)) continue;
4143 /* Some figurines are cursed */
4144 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
4151 PARAMETER_VALUE i = 1;
4156 monster_race *r_ptr;
4158 if (o_ptr->sval == SV_SKELETON)
4160 match = RF9_DROP_SKELETON;
4162 else if (o_ptr->sval == SV_CORPSE)
4164 match = RF9_DROP_CORPSE;
4167 /* Hack -- Remove the monster restriction */
4168 get_mon_num_prep(item_monster_okay, NULL);
4170 /* Pick a random non-unique monster race */
4173 i = get_mon_num(dun_level);
4177 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4179 /* Ignore dead monsters */
4180 if (!r_ptr->rarity) continue;
4182 /* Ignore corpseless monsters */
4183 if (!(r_ptr->flags9 & match)) continue;
4185 /* Prefer less out-of-depth monsters */
4186 if (randint0(check)) continue;
4194 object_aware(o_ptr);
4195 object_known(o_ptr);
4201 PARAMETER_VALUE i = 1;
4203 monster_race *r_ptr;
4205 /* Pick a random monster race */
4208 i = randint1(max_r_idx - 1);
4212 /* Ignore dead monsters */
4213 if (!r_ptr->rarity) continue;
4222 msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
4224 object_aware(o_ptr);
4225 object_known(o_ptr);
4232 DEPTH obj_level = k_info[o_ptr->k_idx].level;
4234 /* Hack -- skip ruined chests */
4235 if (obj_level <= 0) break;
4237 /* Hack -- pick a "difficulty" */
4238 o_ptr->pval = randint1(obj_level);
4239 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4241 o_ptr->xtra3 = dun_level + 5;
4243 /* Never exceed "difficulty" of 55 to 59 */
4244 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4252 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
4253 * Complete the "creation" of an object by applying "magic" to the item
4254 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4256 * @param mode 生成オプション
4259 * This includes not only rolling for random bonuses, but also putting the\n
4260 * finishing touches on ego-items and artifacts, giving charges to wands and\n
4261 * staffs, giving fuel to lites, and placing traps on chests.\n
4263 * In particular, note that "Instant Artifacts", if "created" by an external\n
4264 * routine, must pass through this function to complete the actual creation.\n
4266 * The base "chance" of the item being "good" increases with the "level"\n
4267 * parameter, which is usually derived from the dungeon level, being equal\n
4268 * to the level plus 10, up to a maximum of 75. If "good" is true, then\n
4269 * the object is guaranteed to be "good". If an object is "good", then\n
4270 * the chance that the object will be "great" (ego-item or artifact), also\n
4271 * increases with the "level", being equal to half the level, plus 5, up to\n
4272 * a maximum of 20. If "great" is true, then the object is guaranteed to be\n
4273 * "great". At dungeon level 65 and below, 15/100 objects are "great".\n
4275 * If the object is not "good", there is a chance it will be "cursed", and\n
4276 * if it is "cursed", there is a chance it will be "broken". These chances\n
4277 * are related to the "good" / "great" chances above.\n
4279 * Otherwise "normal" rings and amulets will be "good" half the time and\n
4280 * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4282 * If "okay" is true, and the object is going to be "great", then there is\n
4283 * a chance that an artifact will be created. This is true even if both the\n
4284 * "good" and "great" arguments are false. As a total hack, if "great" is\n
4285 * true, then the item gets 3 extra "attempts" to become an artifact.\n
4287 void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
4289 int i, rolls, f1, f2, power;
4291 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4293 /* Maximum "level" for various things */
4294 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4296 /* Base chance of being "good" */
4299 /* Maximal chance of being "good" */
4300 if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4302 /* Base chance of being "great" */
4305 /* Maximal chance of being "great" */
4306 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4307 f2 = d_info[dungeon_type].obj_great;
4309 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4314 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4323 /* Roll for "good" */
4324 if ((mode & AM_GOOD) || magik(f1))
4329 /* Roll for "great" */
4330 if ((mode & AM_GREAT) || magik(f2))
4334 /* Roll for "special" */
4335 if (mode & AM_SPECIAL) power = 3;
4339 /* Roll for "cursed" */
4342 /* Assume "cursed" */
4345 /* Roll for "broken" */
4346 if (magik(f2)) power = -2;
4350 if (mode & AM_CURSED)
4352 /* Assume 'cursed' */
4357 /* Everything else gets more badly cursed */
4364 /* Assume no rolls */
4367 /* Get one roll if excellent */
4368 if (power >= 2) rolls = 1;
4370 /* Hack -- Get four rolls if forced great or special */
4371 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4373 /* Hack -- Get no rolls if not allowed */
4374 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4376 /* Roll for artifacts if allowed */
4377 for (i = 0; i < rolls; i++)
4379 /* Roll for an artifact */
4380 if (make_artifact(o_ptr)) break;
4381 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4383 if (make_artifact(o_ptr)) break;
4388 /* Hack -- analyze artifacts */
4389 if (object_is_fixed_artifact(o_ptr))
4391 artifact_type *a_ptr = &a_info[o_ptr->name1];
4393 /* Hack -- Mark the artifact as "created" */
4396 /* Hack -- Memorize location of artifact in saved floors */
4397 if (character_dungeon)
4398 a_ptr->floor_id = p_ptr->floor_id;
4400 /* Extract the other fields */
4401 o_ptr->pval = a_ptr->pval;
4402 o_ptr->ac = a_ptr->ac;
4403 o_ptr->dd = a_ptr->dd;
4404 o_ptr->ds = a_ptr->ds;
4405 o_ptr->to_a = a_ptr->to_a;
4406 o_ptr->to_h = a_ptr->to_h;
4407 o_ptr->to_d = a_ptr->to_d;
4408 o_ptr->weight = a_ptr->weight;
4409 o_ptr->xtra2 = a_ptr->act_idx;
4411 if (o_ptr->name1 == ART_MILIM)
4413 if(p_ptr->pseikaku == SEIKAKU_SEXY)
4419 /* Hack -- extract the "broken" flag */
4420 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4422 /* Hack -- extract the "cursed" flag */
4423 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4424 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4425 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4426 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4427 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4428 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4433 switch (o_ptr->tval)
4442 if (power) a_m_aux_1(o_ptr, lev, power);
4448 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4454 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4468 /* Elven Cloak and Black Clothes ... */
4469 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4470 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4471 o_ptr->pval = randint1(4);
4475 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4476 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4477 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4478 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4479 a_m_aux_2(o_ptr, lev, power);
4481 if (power) a_m_aux_2(o_ptr, lev, power);
4489 if (!power && (randint0(100) < 50)) power = -1;
4490 a_m_aux_3(o_ptr, lev, power);
4496 a_m_aux_4(o_ptr, lev, power);
4501 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4502 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4503 (p_ptr->pseikaku == SEIKAKU_SEXY))
4506 add_flag(o_ptr->art_flags, TR_STR);
4507 add_flag(o_ptr->art_flags, TR_INT);
4508 add_flag(o_ptr->art_flags, TR_WIS);
4509 add_flag(o_ptr->art_flags, TR_DEX);
4510 add_flag(o_ptr->art_flags, TR_CON);
4511 add_flag(o_ptr->art_flags, TR_CHR);
4514 /* Hack -- analyze ego-items */
4515 if (object_is_ego(o_ptr))
4517 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4519 /* Hack -- acquire "broken" flag */
4520 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4522 /* Hack -- acquire "cursed" flag */
4523 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4524 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4525 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4526 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4527 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4528 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4530 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4531 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4532 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4533 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4534 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4535 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4536 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4537 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4543 while (one_in_(o_ptr->dd));
4545 if (o_ptr->dd > 9) o_ptr->dd = 9;
4548 /* Hack -- apply activatin index if needed */
4549 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
4551 /* Hack -- apply extra penalties if needed */
4552 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4554 /* Hack -- obtain bonuses */
4555 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4556 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4557 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4559 /* Hack -- obtain pval */
4560 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4563 /* Hack -- apply extra bonuses if needed */
4566 /* Hack -- obtain bonuses */
4567 if (e_ptr->max_to_h)
4569 if (e_ptr->max_to_h > 127)
4570 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4571 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4573 if (e_ptr->max_to_d)
4575 if (e_ptr->max_to_d > 127)
4576 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4577 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4579 if (e_ptr->max_to_a)
4581 if (e_ptr->max_to_a > 127)
4582 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4583 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4586 /* Accuracy ego must have high to_h */
4587 if(o_ptr->name2 == EGO_ACCURACY)
4589 while(o_ptr->to_h < o_ptr->to_d + 10)
4594 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4597 /* Accuracy ego must have high to_h */
4598 if(o_ptr->name2 == EGO_VELOCITY)
4600 while(o_ptr->to_d < o_ptr->to_h + 10)
4605 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4608 /* Protection ego must have high to_a */
4609 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4611 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4614 /* Hack -- obtain pval */
4615 if (e_ptr->max_pval)
4617 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4620 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4622 else if (o_ptr->name2 == EGO_DEMON)
4624 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4626 o_ptr->pval += randint1(2);
4630 o_ptr->pval += randint1(e_ptr->max_pval);
4633 else if (o_ptr->name2 == EGO_ATTACKS)
4635 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4636 if (o_ptr->pval > 3) o_ptr->pval = 3;
4637 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4638 o_ptr->pval += randint1(2);
4640 else if (o_ptr->name2 == EGO_BAT)
4642 o_ptr->pval = randint1(e_ptr->max_pval);
4643 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4645 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4647 o_ptr->pval = randint1(e_ptr->max_pval);
4651 o_ptr->pval += randint1(e_ptr->max_pval);
4656 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4658 o_ptr->pval = randint1(o_ptr->pval);
4660 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4667 /* Examine real objects */
4670 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4672 /* Hack -- acquire "broken" flag */
4673 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4675 /* Hack -- acquire "cursed" flag */
4676 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4677 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4678 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4679 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4680 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4681 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4689 * @brief ベースアイテムが上質として扱われるかどうかを返す。
4690 * Hack -- determine if a template is "good"
4691 * @param k_idx 判定したいベースアイテムのID
4692 * @return ベースアイテムが上質ならばTRUEを返す。
4694 static bool kind_is_good(KIND_OBJECT_IDX k_idx)
4696 object_kind *k_ptr = &k_info[k_idx];
4698 /* Analyze the item type */
4699 switch (k_ptr->tval)
4701 /* Armor -- Good unless damaged */
4712 if (k_ptr->to_a < 0) return (FALSE);
4716 /* Weapons -- Good unless damaged */
4723 if (k_ptr->to_h < 0) return (FALSE);
4724 if (k_ptr->to_d < 0) return (FALSE);
4728 /* Ammo -- Arrows/Bolts are good */
4735 /* Books -- High level books are good (except Arcane books) */
4737 case TV_SORCERY_BOOK:
4738 case TV_NATURE_BOOK:
4743 case TV_DAEMON_BOOK:
4744 case TV_CRUSADE_BOOK:
4746 case TV_HISSATSU_BOOK:
4749 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4753 /* Rings -- Rings of Speed are good */
4756 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4757 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4761 /* Amulets -- Amulets of the Magi and Resistance are good */
4764 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4765 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4770 /* Assume not good */
4775 * @brief 生成階に応じたベースアイテムの生成を行う。
4776 * Attempt to make an object (normal or good/great)
4777 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4778 * @param mode オプションフラグ
4779 * @return 生成に成功したらTRUEを返す。
4781 * This routine plays nasty games to generate the "special artifacts".\n
4782 * This routine uses "object_level" for the "generation level".\n
4783 * We assume that the given object has been "wiped".\n
4785 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
4791 /* Chance of "special object" */
4792 prob = ((mode & AM_GOOD) ? 10 : 1000);
4794 /* Base level for the object */
4795 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4798 /* Generate a special object, or a normal object */
4799 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4801 KIND_OBJECT_IDX k_idx;
4804 if ((mode & AM_GOOD) && !get_obj_num_hook)
4806 /* Activate restriction (if already specified, use that) */
4807 get_obj_num_hook = kind_is_good;
4810 /* Restricted objects - prepare allocation table */
4811 if (get_obj_num_hook) get_obj_num_prep();
4813 /* Pick a random object */
4814 k_idx = get_obj_num(base);
4816 /* Restricted objects */
4817 if (get_obj_num_hook)
4819 /* Clear restriction */
4820 get_obj_num_hook = NULL;
4822 /* Reset allocation table to default */
4826 /* Handle failure */
4827 if (!k_idx) return (FALSE);
4829 /* Prepare the object */
4830 object_prep(j_ptr, k_idx);
4833 /* Apply magic (allow artifacts) */
4834 apply_magic(j_ptr, object_level, mode);
4836 /* Hack -- generate multiple spikes/missiles */
4837 switch (j_ptr->tval)
4845 j_ptr->number = (byte)damroll(6, 7);
4849 if (cheat_peek) object_mention(j_ptr);
4857 * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
4858 * Attempt to place an object (normal or good/great) at the given location.
4859 * @param y 配置したいフロアのY座標
4860 * @param x 配置したいフロアのX座標
4861 * @param mode オプションフラグ
4862 * @return 生成に成功したらTRUEを返す。
4864 * This routine plays nasty games to generate the "special artifacts".\n
4865 * This routine uses "object_level" for the "generation level".\n
4866 * This routine requires a clean floor grid destination.\n
4868 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
4873 cave_type *c_ptr = &cave[y][x];
4879 /* Paranoia -- check bounds */
4880 if (!in_bounds(y, x)) return;
4882 /* Require floor space */
4883 if (!cave_drop_bold(y, x)) return;
4885 /* Avoid stacking on other objects */
4886 if (c_ptr->o_idx) return;
4891 /* Make an object (if possible) */
4892 if (!make_object(q_ptr, mode)) return;
4895 /* Make an object */
4902 o_ptr = &o_list[o_idx];
4904 /* Structure Copy */
4905 object_copy(o_ptr, q_ptr);
4911 o_ptr->next_o_idx = c_ptr->o_idx;
4913 /* Place the object */
4914 c_ptr->o_idx = o_idx;
4922 /* Hack -- Preserve artifacts */
4923 if (object_is_fixed_artifact(q_ptr))
4925 a_info[q_ptr->name1].cur_num = 0;
4932 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
4933 * Make a treasure object
4934 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4935 * @return 生成に成功したらTRUEを返す。
4937 * The location must be a legal, clean, floor grid.
4939 bool make_gold(object_type *j_ptr)
4944 /* Hack -- Pick a Treasure variety */
4945 i = ((randint1(object_level + 2) + 2) / 2) - 1;
4947 /* Apply "extra" magic */
4948 if (one_in_(GREAT_OBJ))
4950 i += randint1(object_level + 1);
4953 /* Hack -- Creeping Coins only generate "themselves" */
4954 if (coin_type) i = coin_type;
4956 /* Do not create "illegal" Treasure Types */
4957 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
4959 /* Prepare a gold object */
4960 object_prep(j_ptr, OBJ_GOLD_LIST + i);
4962 /* Hack -- Base coin cost */
4963 base = k_info[OBJ_GOLD_LIST + i].cost;
4965 /* Determine how much the treasure is "worth" */
4966 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
4974 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
4975 * Places a treasure (Gold or Gems) at given location
4976 * @param y 配置したいフロアのY座標
4977 * @param x 配置したいフロアのX座標
4978 * @return 生成に成功したらTRUEを返す。
4980 * The location must be a legal, clean, floor grid.
4982 void place_gold(POSITION y, POSITION x)
4987 cave_type *c_ptr = &cave[y][x];
4993 /* Paranoia -- check bounds */
4994 if (!in_bounds(y, x)) return;
4996 /* Require floor space */
4997 if (!cave_drop_bold(y, x)) return;
4999 /* Avoid stacking on other objects */
5000 if (c_ptr->o_idx) return;
5005 /* Make some gold */
5006 if (!make_gold(q_ptr)) return;
5008 /* Make an object */
5015 o_ptr = &o_list[o_idx];
5017 /* Copy the object */
5018 object_copy(o_ptr, q_ptr);
5025 o_ptr->next_o_idx = c_ptr->o_idx;
5027 /* Place the object */
5028 c_ptr->o_idx = o_idx;
5038 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
5039 * Let an object fall to the ground at or near a location.
5040 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
5041 * @param chance ドロップの成功率(%)
5042 * @param y 配置したいフロアのY座標
5043 * @param x 配置したいフロアのX座標
5044 * @return 生成に成功したらオブジェクトのIDを返す。
5046 * The initial location is assumed to be "in_bounds()".\n
5048 * This function takes a parameter "chance". This is the percentage\n
5049 * chance that the item will "disappear" instead of drop. If the object\n
5050 * has been thrown, then this is the chance of disappearance on contact.\n
5052 * Hack -- this function uses "chance" to determine if it should produce\n
5053 * some form of "description" of the drop event (under the player).\n
5055 * We check several locations to see if we can find a location at which\n
5056 * the object can combine, stack, or be placed. Artifacts will try very\n
5057 * hard to be placed, including "teleporting" to a useful grid if needed.\n
5059 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
5066 POSITION ty, tx = 0;
5068 OBJECT_IDX o_idx = 0;
5069 OBJECT_IDX this_o_idx, next_o_idx = 0;
5073 GAME_TEXT o_name[MAX_NLEN];
5079 /* Extract plural */
5080 bool plural = (j_ptr->number != 1);
5083 /* Describe object */
5084 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5087 /* Handle normal "breakage" */
5088 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
5091 msg_format("%sは消えた。", o_name);
5093 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5096 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
5113 /* Scan local grids */
5114 for (dy = -3; dy <= 3; dy++)
5116 /* Scan local grids */
5117 for (dx = -3; dx <= 3; dx++)
5121 /* Calculate actual distance */
5122 d = (dy * dy) + (dx * dx);
5124 /* Ignore distant grids */
5125 if (d > 10) continue;
5130 /* Skip illegal grids */
5131 if (!in_bounds(ty, tx)) continue;
5133 /* Require line of projection */
5134 if (!projectable(y, x, ty, tx)) continue;
5137 c_ptr = &cave[ty][tx];
5139 /* Require floor space */
5140 if (!cave_drop_bold(ty, tx)) continue;
5145 /* Scan objects in that grid */
5146 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5149 o_ptr = &o_list[this_o_idx];
5151 /* Acquire next object */
5152 next_o_idx = o_ptr->next_o_idx;
5154 /* Check for possible combination */
5155 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5161 /* Add new object */
5165 if (k > 99) continue;
5167 /* Calculate score */
5168 s = 1000 - (d + k * 5);
5170 /* Skip bad values */
5171 if (s < bs) continue;
5173 /* New best value */
5176 /* Apply the randomizer to equivalent values */
5177 if ((++bn >= 2) && !one_in_(bn)) continue;
5191 /* Handle lack of space */
5192 if (!flag && !object_is_artifact(j_ptr))
5195 msg_format("%sは消えた。", o_name);
5197 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5202 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5210 for (i = 0; !flag && (i < 1000); i++)
5213 ty = rand_spread(by, 1);
5214 tx = rand_spread(bx, 1);
5216 /* Verify location */
5217 if (!in_bounds(ty, tx)) continue;
5219 /* Bounce to that location */
5223 /* Require floor space */
5224 if (!cave_drop_bold(by, bx)) continue;
5232 int candidates = 0, pick;
5234 for (ty = 1; ty < cur_hgt - 1; ty++)
5236 for (tx = 1; tx < cur_wid - 1; tx++)
5238 /* A valid space found */
5239 if (cave_drop_bold(ty, tx)) candidates++;
5243 /* No valid place! */
5247 msg_format("%sは消えた。", o_name);
5249 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5253 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5255 /* Mega-Hack -- preserve artifacts */
5258 /* Hack -- Preserve unknown artifacts */
5259 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5261 /* Mega-Hack -- Preserve the artifact */
5262 a_info[j_ptr->name1].cur_num = 0;
5270 /* Choose a random one */
5271 pick = randint1(candidates);
5273 for (ty = 1; ty < cur_hgt - 1; ty++)
5275 for (tx = 1; tx < cur_wid - 1; tx++)
5277 if (cave_drop_bold(ty, tx))
5281 /* Is this a picked one? */
5295 c_ptr = &cave[by][bx];
5297 /* Scan objects in that grid for combination */
5298 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5301 o_ptr = &o_list[this_o_idx];
5303 /* Acquire next object */
5304 next_o_idx = o_ptr->next_o_idx;
5306 /* Check for combination */
5307 if (object_similar(o_ptr, j_ptr))
5309 /* Combine the items */
5310 object_absorb(o_ptr, j_ptr);
5319 if (!done) o_idx = o_pop();
5322 if (!done && !o_idx)
5325 msg_format("%sは消えた。", o_name);
5327 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5331 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5333 /* Hack -- Preserve artifacts */
5334 if (object_is_fixed_artifact(j_ptr))
5336 a_info[j_ptr->name1].cur_num = 0;
5346 /* Structure copy */
5347 object_copy(&o_list[o_idx], j_ptr);
5349 /* Access new object */
5350 j_ptr = &o_list[o_idx];
5357 j_ptr->held_m_idx = 0;
5360 j_ptr->next_o_idx = c_ptr->o_idx;
5362 /* Place the object */
5363 c_ptr->o_idx = o_idx;
5373 /* Mega-Hack -- no message if "dropped" by player */
5374 /* Message when an object falls under the player */
5375 if (chance && player_bold(by, bx))
5377 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5386 * Scatter some "great" objects near the player
5387 * @param y1 配置したいフロアのY座標
5388 * @param x1 配置したいフロアのX座標
5389 * @param num 獲得の処理回数
5390 * @param great TRUEならば必ず高級品以上を落とす
5391 * @param special TRUEならば必ず特別品を落とす
5392 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5395 void acquirement(POSITION y1, POSITION x1, int num, bool great, bool special, bool known)
5398 object_type object_type_body;
5399 BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ;
5404 i_ptr = &object_type_body;
5407 /* Make a good (or great) object (if possible) */
5408 if (!make_object(i_ptr, mode)) continue;
5412 object_aware(i_ptr);
5413 object_known(i_ptr);
5416 /* Drop the object */
5417 (void)drop_near(i_ptr, -1, y1, x1);
5422 * Scatter some "amusing" objects near the player
5425 #define AMS_NOTHING 0x00 /* No restriction */
5426 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
5427 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
5428 #define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */
5429 #define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */
5433 OBJECT_TYPE_VALUE tval;
5434 OBJECT_SUBTYPE_VALUE sval;
5439 amuse_type amuse_info[] =
5441 { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
5442 { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
5443 { TV_SPIKE, SV_ANY, 10, AMS_PILE },
5444 { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
5445 { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
5446 { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
5447 { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
5448 { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
5449 { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
5450 { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
5451 { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
5452 { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
5453 { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
5460 * @param y1 配置したいフロアのY座標
5461 * @param x1 配置したいフロアのX座標
5462 * @param num 誰得の処理回数
5463 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5466 void amusement(POSITION y1, POSITION x1, int num, bool known)
5469 object_type object_type_body;
5472 for (n = 0; amuse_info[n].tval != 0; n++)
5474 t += amuse_info[n].prob;
5481 KIND_OBJECT_IDX k_idx;
5482 ARTIFACT_IDX a_idx = 0;
5483 int r = randint0(t);
5484 bool insta_art, fixed_art;
5488 r -= amuse_info[i].prob;
5491 i_ptr = &object_type_body;
5493 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
5495 /* Paranoia - reroll if nothing */
5496 if (!k_idx) continue;
5498 /* Search an artifact index if need */
5499 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
5500 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
5502 if (insta_art || fixed_art)
5504 for (a_idx = 1; a_idx < max_a_idx; a_idx++)
5506 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
5507 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
5508 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
5509 if (a_info[a_idx].cur_num > 0) continue;
5513 if (a_idx >= max_a_idx) continue;
5516 /* Make an object (if possible) */
5517 object_prep(i_ptr, k_idx);
5518 if (a_idx) i_ptr->name1 = a_idx;
5519 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
5521 if (amuse_info[i].flag & AMS_NO_UNIQUE)
5523 if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
5526 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
5527 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
5531 object_aware(i_ptr);
5532 object_known(i_ptr);
5535 /* Paranoia - reroll if nothing */
5536 if (!(i_ptr->k_idx)) continue;
5538 /* Drop the object */
5539 (void)drop_near(i_ptr, -1, y1, x1);
5547 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5548 * Describe the charges on an item in the inventory.
5549 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5552 void inven_item_charges(INVENTORY_IDX item)
5554 object_type *o_ptr = &inventory[item];
5556 /* Require staff/wand */
5557 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5559 /* Require known item */
5560 if (!object_is_known(o_ptr)) return;
5563 if (o_ptr->pval <= 0)
5565 msg_print("もう魔力が残っていない。");
5569 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5572 /* Multiple charges */
5573 if (o_ptr->pval != 1)
5575 msg_format("You have %d charges remaining.", o_ptr->pval);
5581 msg_format("You have %d charge remaining.", o_ptr->pval);
5588 * @brief アイテムの残り所持数メッセージを表示する /
5589 * Describe an item in the inventory.
5590 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5593 void inven_item_describe(INVENTORY_IDX item)
5595 object_type *o_ptr = &inventory[item];
5596 GAME_TEXT o_name[MAX_NLEN];
5598 object_desc(o_name, o_ptr, 0);
5601 /* "no more" の場合はこちらで表示する */
5602 if (o_ptr->number <= 0)
5604 /*FIRST*//*ここはもう通らないかも */
5605 msg_format("もう%sを持っていない。", o_name);
5609 /* アイテム名を英日切り替え機能対応 */
5610 msg_format("まだ %sを持っている。", o_name);
5613 msg_format("You have %s.", o_name);
5619 * @brief アイテムを増減させ残り所持数メッセージを表示する /
5620 * Increase the "number" of an item in the inventory
5621 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5625 void inven_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
5627 object_type *o_ptr = &inventory[item];
5630 num += o_ptr->number;
5633 if (num > 255) num = 255;
5634 else if (num < 0) num = 0;
5637 num -= o_ptr->number;
5639 /* Change the number and weight */
5642 /* Add the number */
5643 o_ptr->number += num;
5645 /* Add the weight */
5646 p_ptr->total_weight += (num * o_ptr->weight);
5647 p_ptr->update |= (PU_BONUS);
5649 /* Recalculate mana XXX */
5650 p_ptr->update |= (PU_MANA);
5652 /* Combine the pack */
5653 p_ptr->update |= (PU_COMBINE);
5655 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5657 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5658 if (!o_ptr->number && p_ptr->ele_attack)
5660 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5662 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5664 /* Clear all temporary elemental brands */
5665 set_ele_attack(0, 0);
5673 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5674 * Erase an inventory slot if it has no more items
5675 * @param item 消去したいプレイヤーのアイテム所持スロット
5678 void inven_item_optimize(INVENTORY_IDX item)
5680 object_type *o_ptr = &inventory[item];
5682 /* Only optimize real items */
5683 if (!o_ptr->k_idx) return;
5685 /* Only optimize empty items */
5686 if (o_ptr->number) return;
5688 /* The item is in the pack */
5689 if (item < INVEN_RARM)
5696 /* Slide everything down */
5697 for (i = item; i < INVEN_PACK; i++)
5699 /* Structure copy */
5700 inventory[i] = inventory[i+1];
5703 /* Erase the "final" slot */
5704 object_wipe(&inventory[i]);
5706 p_ptr->window |= (PW_INVEN);
5709 /* The item is being wielded */
5715 /* Erase the empty slot */
5716 object_wipe(&inventory[item]);
5717 p_ptr->update |= (PU_BONUS);
5719 /* Recalculate torch */
5720 p_ptr->update |= (PU_TORCH);
5722 /* Recalculate mana XXX */
5723 p_ptr->update |= (PU_MANA);
5725 p_ptr->window |= (PW_EQUIP);
5728 p_ptr->window |= (PW_SPELL);
5732 * @brief 床上の魔道具の残り残量メッセージを表示する /
5733 * Describe the charges on an item on the floor.
5734 * @param item メッセージの対象にしたいアイテム所持スロット
5737 void floor_item_charges(INVENTORY_IDX item)
5739 object_type *o_ptr = &o_list[item];
5741 /* Require staff/wand */
5742 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5744 /* Require known item */
5745 if (!object_is_known(o_ptr)) return;
5748 if (o_ptr->pval <= 0)
5750 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5754 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5757 /* Multiple charges */
5758 if (o_ptr->pval != 1)
5760 msg_format("There are %d charges remaining.", o_ptr->pval);
5766 msg_format("There is %d charge remaining.", o_ptr->pval);
5773 * @brief 床上のアイテムの残り数メッセージを表示する /
5774 * Describe the charges on an item on the floor.
5775 * @param item メッセージの対象にしたいアイテム所持スロット
5778 void floor_item_describe(INVENTORY_IDX item)
5780 object_type *o_ptr = &o_list[item];
5781 GAME_TEXT o_name[MAX_NLEN];
5783 object_desc(o_name, o_ptr, 0);
5786 /* "no more" の場合はこちらで表示を分ける */
5787 if (o_ptr->number <= 0)
5789 msg_format("床上には、もう%sはない。", o_name);
5793 msg_format("床上には、まだ %sがある。", o_name);
5796 msg_format("You see %s.", o_name);
5803 * @brief 床上のアイテムの数を増やす /
5804 * Increase the "number" of an item on the floor
5805 * @param item 増やしたいアイテムの所持スロット
5806 * @param num 増やしたいアイテムの数
5809 void floor_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
5811 object_type *o_ptr = &o_list[item];
5814 num += o_ptr->number;
5817 if (num > 255) num = 255;
5818 else if (num < 0) num = 0;
5821 num -= o_ptr->number;
5823 /* Change the number */
5824 o_ptr->number += num;
5829 * @brief 床上の数の無くなったアイテムスロットを消去する /
5830 * Optimize an item on the floor (destroy "empty" items)
5831 * @param item 消去したいアイテムの所持スロット
5834 void floor_item_optimize(INVENTORY_IDX item)
5836 object_type *o_ptr = &o_list[item];
5838 /* Paranoia -- be sure it exists */
5839 if (!o_ptr->k_idx) return;
5841 /* Only optimize empty items */
5842 if (o_ptr->number) return;
5844 delete_object_idx(item);
5849 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5850 * Check if we have space for an item in the pack without overflow
5851 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5852 * @return 溢れずに済むならTRUEを返す
5854 bool inven_carry_okay(object_type *o_ptr)
5859 if (inven_cnt < INVEN_PACK) return (TRUE);
5862 for (j = 0; j < INVEN_PACK; j++)
5864 object_type *j_ptr = &inventory[j];
5866 /* Skip non-objects */
5867 if (!j_ptr->k_idx) continue;
5869 /* Check if the two items can be combined */
5870 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5877 * @brief オブジェクトを定義された基準に従いソートするための関数 /
5878 * Check if we have space for an item in the pack without overflow
5879 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
5880 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
5881 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
5882 * @return o_ptrの方が上位ならばTRUEを返す。
5884 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5888 /* Use empty slots */
5889 if (!j_ptr->k_idx) return TRUE;
5891 /* Hack -- readable books always come first */
5892 if ((o_ptr->tval == REALM1_BOOK) &&
5893 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5894 if ((j_ptr->tval == REALM1_BOOK) &&
5895 (o_ptr->tval != REALM1_BOOK)) return FALSE;
5897 if ((o_ptr->tval == REALM2_BOOK) &&
5898 (j_ptr->tval != REALM2_BOOK)) return TRUE;
5899 if ((j_ptr->tval == REALM2_BOOK) &&
5900 (o_ptr->tval != REALM2_BOOK)) return FALSE;
5902 /* Objects sort by decreasing type */
5903 if (o_ptr->tval > j_ptr->tval) return TRUE;
5904 if (o_ptr->tval < j_ptr->tval) return FALSE;
5906 /* Non-aware (flavored) items always come last */
5907 /* Can happen in the home */
5908 if (!object_is_aware(o_ptr)) return FALSE;
5909 if (!object_is_aware(j_ptr)) return TRUE;
5911 /* Objects sort by increasing sval */
5912 if (o_ptr->sval < j_ptr->sval) return TRUE;
5913 if (o_ptr->sval > j_ptr->sval) return FALSE;
5915 /* Unidentified objects always come last */
5916 /* Objects in the home can be unknown */
5917 if (!object_is_known(o_ptr)) return FALSE;
5918 if (!object_is_known(j_ptr)) return TRUE;
5920 /* Fixed artifacts, random artifacts and ego items */
5921 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
5922 else if (o_ptr->art_name) o_type = 2;
5923 else if (object_is_ego(o_ptr)) o_type = 1;
5926 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
5927 else if (j_ptr->art_name) j_type = 2;
5928 else if (object_is_ego(j_ptr)) j_type = 1;
5931 if (o_type < j_type) return TRUE;
5932 if (o_type > j_type) return FALSE;
5934 switch (o_ptr->tval)
5940 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
5941 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
5947 /* Objects sort by increasing hit/damage bonuses */
5948 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
5949 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
5952 /* Hack: otherwise identical rods sort by
5953 increasing recharge time --dsb */
5955 if (o_ptr->pval < j_ptr->pval) return TRUE;
5956 if (o_ptr->pval > j_ptr->pval) return FALSE;
5960 /* Objects sort by decreasing value */
5961 return o_value > object_value(j_ptr);
5966 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
5967 * Add an item to the players inventory, and return the slot used.
5968 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
5969 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
5971 * If the new item can combine with an existing item in the inventory,\n
5972 * it will do so, using "object_similar()" and "object_absorb()", else,\n
5973 * the item will be placed into the "proper" location in the inventory.\n
5975 * This function can be used to "over-fill" the player's pack, but only\n
5976 * once, and such an action must trigger the "overflow" code immediately.\n
5977 * Note that when the pack is being "over-filled", the new item must be\n
5978 * placed into the "overflow" slot, and the "overflow" must take place\n
5979 * before the pack is reordered, but (optionally) after the pack is\n
5980 * combined. This may be tricky. See "dungeon.c" for info.\n
5982 * Note that this code must remove any location/stack information\n
5983 * from the object once it is placed into the inventory.\n
5985 s16b inven_carry(object_type *o_ptr)
5987 INVENTORY_IDX i, j, k;
5988 INVENTORY_IDX n = -1;
5993 /* Check for combining */
5994 for (j = 0; j < INVEN_PACK; j++)
5996 j_ptr = &inventory[j];
5998 /* Skip non-objects */
5999 if (!j_ptr->k_idx) continue;
6001 /* Hack -- track last item */
6004 /* Check if the two items can be combined */
6005 if (object_similar(j_ptr, o_ptr))
6007 /* Combine the items */
6008 object_absorb(j_ptr, o_ptr);
6010 /* Increase the weight */
6011 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6012 p_ptr->update |= (PU_BONUS);
6014 p_ptr->window |= (PW_INVEN);
6023 if (inven_cnt > INVEN_PACK) return (-1);
6025 /* Find an empty slot */
6026 for (j = 0; j <= INVEN_PACK; j++)
6028 j_ptr = &inventory[j];
6030 /* Use it if found */
6031 if (!j_ptr->k_idx) break;
6038 /* Reorder the pack */
6041 /* Get the "value" of the item */
6042 s32b o_value = object_value(o_ptr);
6044 /* Scan every occupied slot */
6045 for (j = 0; j < INVEN_PACK; j++)
6047 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6054 for (k = n; k >= i; k--)
6056 /* Hack -- Slide the item */
6057 object_copy(&inventory[k+1], &inventory[k]);
6060 /* Wipe the empty slot */
6061 object_wipe(&inventory[i]);
6066 object_copy(&inventory[i], o_ptr);
6068 /* Access new object */
6069 j_ptr = &inventory[i];
6072 j_ptr->next_o_idx = 0;
6074 /* Forget monster */
6075 j_ptr->held_m_idx = 0;
6077 /* Forget location */
6078 j_ptr->iy = j_ptr->ix = 0;
6080 /* Player touches it, and no longer marked */
6081 j_ptr->marked = OM_TOUCHED;
6083 /* Increase the weight */
6084 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6086 /* Count the items */
6088 p_ptr->update |= (PU_BONUS);
6090 /* Combine and Reorder pack */
6091 p_ptr->update |= (PU_COMBINE | PU_REORDER);
6093 p_ptr->window |= (PW_INVEN);
6095 /* Return the slot */
6101 * @brief 装備スロットからオブジェクトを外すメインルーチン /
6102 * Take off (some of) a non-cursed equipment item
6103 * @param item オブジェクトを外したい所持テーブルのID
6105 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6107 * Note that only one item at a time can be wielded per slot.\n
6108 * Note that taking off an item when "full" may cause that item\n
6109 * to fall to the ground.\n
6110 * Return the inventory slot into which the item is placed.\n
6112 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
6123 GAME_TEXT o_name[MAX_NLEN];
6126 /* Get the item to take off */
6127 o_ptr = &inventory[item];
6130 if (amt <= 0) return (-1);
6133 if (amt > o_ptr->number) amt = o_ptr->number;
6136 /* Obtain a local object */
6137 object_copy(q_ptr, o_ptr);
6139 /* Modify quantity */
6140 q_ptr->number = amt;
6142 object_desc(o_name, q_ptr, 0);
6144 /* Took off weapon */
6145 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
6146 object_is_melee_weapon(o_ptr))
6148 act = _("を装備からはずした", "You were wielding");
6152 else if (item == INVEN_BOW)
6154 act = _("を装備からはずした", "You were holding");
6157 /* Took off light */
6158 else if (item == INVEN_LITE)
6160 act = _("を光源からはずした", "You were holding");
6163 /* Took off something */
6166 act = _("を装備からはずした", "You were wearing");
6169 /* Modify, Optimize */
6170 inven_item_increase(item, -amt);
6171 inven_item_optimize(item);
6173 /* Carry the object */
6174 slot = inven_carry(q_ptr);
6177 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
6179 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6189 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
6190 * Drop (some of) a non-cursed inventory/equipment item
6191 * @param item 所持テーブルのID
6192 * @param amt 落としたい個数
6195 * The object will be dropped "near" the current location
6197 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
6203 GAME_TEXT o_name[MAX_NLEN];
6205 /* Access original object */
6206 o_ptr = &inventory[item];
6209 if (amt <= 0) return;
6212 if (amt > o_ptr->number) amt = o_ptr->number;
6214 /* Take off equipment */
6215 if (item >= INVEN_RARM)
6217 /* Take off first */
6218 item = inven_takeoff(item, amt);
6220 /* Access original object */
6221 o_ptr = &inventory[item];
6226 /* Obtain local object */
6227 object_copy(q_ptr, o_ptr);
6229 /* Distribute charges of wands or rods */
6230 distribute_charges(o_ptr, q_ptr, amt);
6232 /* Modify quantity */
6233 q_ptr->number = amt;
6235 /* Describe local object */
6236 object_desc(o_name, q_ptr, 0);
6238 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
6240 /* Drop it near the player */
6241 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
6243 /* Modify, Describe, Optimize */
6244 inven_item_increase(item, -amt);
6245 inven_item_describe(item);
6246 inven_item_optimize(item);
6251 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
6252 * Combine items in the pack
6255 * Note special handling of the "overflow" slot
6257 void combine_pack(void)
6262 bool flag = FALSE, combined;
6268 /* Combine the pack (backwards) */
6269 for (i = INVEN_PACK; i > 0; i--)
6271 o_ptr = &inventory[i];
6273 /* Skip empty items */
6274 if (!o_ptr->k_idx) continue;
6276 /* Scan the items above that item */
6277 for (j = 0; j < i; j++)
6281 j_ptr = &inventory[j];
6283 /* Skip empty items */
6284 if (!j_ptr->k_idx) continue;
6287 * Get maximum number of the stack if these
6288 * are similar, get zero otherwise.
6290 max_num = object_similar_part(j_ptr, o_ptr);
6292 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6293 if (max_num && j_ptr->number < max_num)
6295 if (o_ptr->number + j_ptr->number <= max_num)
6300 /* Add together the item counts */
6301 object_absorb(j_ptr, o_ptr);
6303 /* One object is gone */
6306 /* Slide everything down */
6307 for (k = i; k < INVEN_PACK; k++)
6309 /* Structure copy */
6310 inventory[k] = inventory[k+1];
6313 /* Erase the "final" slot */
6314 object_wipe(&inventory[k]);
6318 int old_num = o_ptr->number;
6319 int remain = j_ptr->number + o_ptr->number - max_num;
6321 o_ptr->number -= remain;
6323 /* Add together the item counts */
6324 object_absorb(j_ptr, o_ptr);
6326 o_ptr->number = remain;
6328 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6329 if (o_ptr->tval == TV_ROD)
6331 o_ptr->pval = o_ptr->pval * remain / old_num;
6332 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6335 /* Hack -- if wands are stacking, combine the charges. -LM- */
6336 if (o_ptr->tval == TV_WAND)
6338 o_ptr->pval = o_ptr->pval * remain / old_num;
6342 p_ptr->window |= (PW_INVEN);
6354 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6358 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6359 * Reorder items in the pack
6362 * Note special handling of the "overflow" slot
6364 void reorder_pack(void)
6374 /* Re-order the pack (forwards) */
6375 for (i = 0; i < INVEN_PACK; i++)
6377 /* Mega-Hack -- allow "proper" over-flow */
6378 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6380 o_ptr = &inventory[i];
6382 /* Skip empty slots */
6383 if (!o_ptr->k_idx) continue;
6385 /* Get the "value" of the item */
6386 o_value = object_value(o_ptr);
6388 /* Scan every occupied slot */
6389 for (j = 0; j < INVEN_PACK; j++)
6391 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6394 /* Never move down */
6395 if (j >= i) continue;
6401 /* Save a copy of the moving item */
6402 object_copy(q_ptr, &inventory[i]);
6404 /* Slide the objects */
6405 for (k = i; k > j; k--)
6407 /* Slide the item */
6408 object_copy(&inventory[k], &inventory[k-1]);
6411 /* Insert the moving item */
6412 object_copy(&inventory[j], q_ptr);
6414 p_ptr->window |= (PW_INVEN);
6417 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6421 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6422 * Hack -- display an object kind in the current window
6423 * @param k_idx ベースアイテムの参照ID
6426 * Include list of usable spells for readible books
6428 void display_koff(KIND_OBJECT_IDX k_idx)
6435 REALM_IDX use_realm;
6437 GAME_TEXT o_name[MAX_NLEN];
6440 /* Erase the window */
6441 for (y = 0; y < Term->hgt; y++)
6443 /* Erase the line */
6444 Term_erase(0, y, 255);
6451 /* Prepare the object */
6452 object_prep(q_ptr, k_idx);
6453 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6455 /* Mention the object name */
6456 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6458 /* Access the item's sval */
6460 use_realm = tval2realm(q_ptr->tval);
6462 /* Warriors are illiterate */
6463 if (p_ptr->realm1 || p_ptr->realm2)
6465 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6469 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6470 if (!is_magic(use_realm)) return;
6471 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6474 /* Display spells in readible books */
6478 SPELL_IDX spells[64];
6480 /* Extract spells */
6481 for (spell = 0; spell < 32; spell++)
6483 /* Check for this spell */
6484 if (fake_spell_flags[sval] & (1L << spell))
6486 /* Collect this spell */
6487 spells[num++] = spell;
6492 print_spells(0, spells, num, 2, 0, use_realm);
6497 * @brief 警告を放つアイテムを選択する /
6498 * Choose one of items that have warning flag
6499 * Calculate spell damages
6502 object_type *choose_warning_item(void)
6505 int choices[INVEN_TOTAL - INVEN_RARM];
6508 /* Paranoia -- Player has no warning ability */
6509 if (!p_ptr->warning) return NULL;
6511 /* Search Inventory */
6512 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6514 BIT_FLAGS flgs[TR_FLAG_SIZE];
6515 object_type *o_ptr = &inventory[i];
6517 object_flags(o_ptr, flgs);
6518 if (have_flag(flgs, TR_WARNING))
6520 choices[number] = i;
6525 /* Choice one of them */
6526 return number ? &inventory[choices[randint0(number)]] : NULL;
6530 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6531 * Calculate spell damages
6532 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6533 * @param typ 効果属性のID
6535 * @param max 算出した最大ダメージを返すポインタ
6538 static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
6540 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6541 int rlev = r_ptr->level;
6542 bool ignore_wraith_form = FALSE;
6544 /* Vulnerability, resistance and immunity */
6548 if (p_ptr->immune_elec)
6551 ignore_wraith_form = TRUE;
6555 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6556 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6557 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6558 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6559 if (IS_OPPOSE_ELEC())
6560 dam = (dam + 2) / 3;
6565 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6566 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6570 if (p_ptr->immune_acid)
6573 ignore_wraith_form = TRUE;
6577 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6578 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6579 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6580 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6586 if (p_ptr->immune_cold)
6589 ignore_wraith_form = TRUE;
6593 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6594 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6595 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6596 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6601 if (p_ptr->immune_fire)
6604 ignore_wraith_form = TRUE;
6608 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6609 if (prace_is_(RACE_ENT)) dam += dam / 3;
6610 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6611 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6612 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6617 ignore_wraith_form = TRUE;
6621 if (!p_ptr->blind &&
6622 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6623 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6626 ignore_wraith_form = TRUE;
6631 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6632 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6633 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6636 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6637 * "dam *= 2;" for later "dam /= 2"
6639 if (p_ptr->wraith_form) dam *= 2;
6643 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6646 ignore_wraith_form = TRUE;
6648 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6652 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6656 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6660 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6664 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6668 if (prace_is_(RACE_SPECTRE))
6671 ignore_wraith_form = TRUE;
6673 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6677 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6681 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6685 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6689 if (p_ptr->levitation) dam = (dam * 2) / 3;
6693 if (p_ptr->resist_shard) dam /= 2;
6697 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6698 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6702 if (p_ptr->mimic_form)
6704 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6707 ignore_wraith_form = TRUE;
6712 switch (p_ptr->prace)
6721 ignore_wraith_form = TRUE;
6728 if (p_ptr->align > 10) dam /= 2;
6729 else if (p_ptr->align < -10) dam *= 2;
6733 if (p_ptr->align > 10) dam *= 2;
6737 case GF_BRAIN_SMASH:
6738 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6741 ignore_wraith_form = TRUE;
6749 if (100 + rlev / 2 <= p_ptr->skill_sav)
6752 ignore_wraith_form = TRUE;
6757 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6760 ignore_wraith_form = TRUE;
6765 if (p_ptr->wraith_form && !ignore_wraith_form)
6771 if (dam > *max) *max = dam;
6775 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6776 * Calculate spell damages
6777 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6778 * @param typ 効果属性のID
6779 * @param m_idx 魔法を行使するモンスターのID
6780 * @param max 算出した最大ダメージを返すポインタ
6783 void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
6785 monster_type *m_ptr = &m_list[m_idx];
6786 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6787 spell_damcalc(m_ptr, typ, dam, max);
6791 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6792 * Calculate blow damages
6793 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6794 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6795 * @return 算出された最大ダメージを返す。
6797 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6799 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6801 bool check_wraith_form = TRUE;
6803 if (blow_ptr->method != RBM_EXPLODE)
6805 ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
6807 switch (blow_ptr->effect)
6811 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6812 dam = MAX(dam, tmp_dam * 2);
6818 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6822 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6824 check_wraith_form = FALSE;
6828 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6830 check_wraith_form = FALSE;
6834 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6836 check_wraith_form = FALSE;
6840 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6842 check_wraith_form = FALSE;
6847 check_wraith_form = FALSE;
6851 if (check_wraith_form && p_ptr->wraith_form)
6859 dam = (dam + 1) / 2;
6860 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
6868 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
6869 * Examine the grid (xx,yy) and warn the player if there are any danger
6870 * @param xx 危険性を調査するマスのX座標
6871 * @param yy 危険性を調査するマスのY座標
6872 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
6874 bool process_warning(POSITION xx, POSITION yy)
6878 GAME_TEXT o_name[MAX_NLEN];
6880 #define WARNING_AWARE_RANGE 12
6882 static int old_damage = 0;
6884 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
6886 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
6889 monster_type *m_ptr;
6890 monster_race *r_ptr;
6892 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
6894 c_ptr = &cave[my][mx];
6896 if (!c_ptr->m_idx) continue;
6898 m_ptr = &m_list[c_ptr->m_idx];
6900 if (MON_CSLEEP(m_ptr)) continue;
6901 if (!is_hostile(m_ptr)) continue;
6903 r_ptr = &r_info[m_ptr->r_idx];
6905 /* Monster spells (only powerful ones)*/
6906 if (projectable(my, mx, yy, xx))
6908 BIT_FLAGS f4 = r_ptr->flags4;
6909 BIT_FLAGS f5 = r_ptr->a_ability_flags1;
6910 BIT_FLAGS f6 = r_ptr->a_ability_flags2;
6912 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
6914 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
6915 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
6916 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
6917 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, c_ptr->m_idx, &dam_max0);
6918 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, c_ptr->m_idx, &dam_max0);
6919 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, c_ptr->m_idx, &dam_max0);
6921 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, c_ptr->m_idx, &dam_max0);
6922 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, c_ptr->m_idx, &dam_max0);
6923 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, c_ptr->m_idx, &dam_max0);
6924 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, c_ptr->m_idx, &dam_max0);
6925 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, c_ptr->m_idx, &dam_max0);
6926 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, c_ptr->m_idx, &dam_max0);
6927 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, c_ptr->m_idx, &dam_max0);
6928 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, c_ptr->m_idx, &dam_max0);
6929 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
6930 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, c_ptr->m_idx, &dam_max0);
6931 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, c_ptr->m_idx, &dam_max0);
6932 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
6933 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, c_ptr->m_idx, &dam_max0);
6934 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, c_ptr->m_idx, &dam_max0);
6935 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, c_ptr->m_idx, &dam_max0);
6936 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, c_ptr->m_idx, &dam_max0);
6937 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, c_ptr->m_idx, &dam_max0);
6938 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, c_ptr->m_idx, &dam_max0);
6939 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, c_ptr->m_idx, &dam_max0);
6940 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, c_ptr->m_idx, &dam_max0);
6941 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
6942 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, c_ptr->m_idx, &dam_max0);
6943 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, c_ptr->m_idx, &dam_max0);
6946 /* Monster melee attacks */
6947 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
6949 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
6953 for (m = 0; m < 4; m++)
6955 /* Skip non-attacks */
6956 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
6958 /* Extract the attack info */
6959 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
6960 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
6962 if (dam_melee > dam_max0) dam_max0 = dam_melee;
6966 /* Contribution from this monster */
6967 dam_max += dam_max0;
6971 /* Prevent excessive warning */
6972 if (dam_max > old_damage)
6974 old_damage = dam_max * 3 / 2;
6976 if (dam_max > p_ptr->chp / 2)
6978 object_type *o_ptr = choose_warning_item();
6981 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6983 strcpy(o_name, _("体", "body")); /* Warning ability without item */
6984 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
6986 disturb(FALSE, TRUE);
6987 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
6990 else old_damage = old_damage / 2;
6992 c_ptr = &cave[yy][xx];
6993 if (((!easy_disarm && is_trap(c_ptr->feat))
6994 || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
6996 object_type *o_ptr = choose_warning_item();
6999 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7001 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7002 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7003 disturb(FALSE, TRUE);
7004 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7011 * エッセンス情報の構造体 / A structure for smithing
7014 int add; /* TR flag number or special essence id */
7015 cptr add_name; /* Name of this ability */
7016 ESSENCE_IDX type; /* Menu number */
7017 int essence; /* Index for carrying essences */
7018 int value; /* Needed value to add this ability */
7023 * エッセンス情報テーブル Smithing type data for Weapon smith
7026 static essence_type essence_info[] =
7028 {TR_STR, "腕力", 4, TR_STR, 20},
7029 {TR_INT, "知能", 4, TR_INT, 20},
7030 {TR_WIS, "賢さ", 4, TR_WIS, 20},
7031 {TR_DEX, "器用さ", 4, TR_DEX, 20},
7032 {TR_CON, "耐久力", 4, TR_CON, 20},
7033 {TR_CHR, "魅力", 4, TR_CHR, 20},
7034 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
7035 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
7036 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
7037 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
7038 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
7039 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
7040 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
7041 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
7042 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
7043 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
7044 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
7045 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
7046 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
7047 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
7048 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
7049 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
7050 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
7051 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
7052 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
7053 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
7054 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
7055 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
7056 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
7057 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
7058 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
7059 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
7060 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
7061 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
7062 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
7063 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
7064 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
7065 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
7066 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
7067 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
7068 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
7069 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
7070 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
7071 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
7072 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
7073 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
7074 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
7075 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
7076 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
7077 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
7078 {TR_SH_FIRE, "", 0, -2, 0},
7079 {TR_SH_ELEC, "", 0, -2, 0},
7080 {TR_SH_COLD, "", 0, -2, 0},
7081 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
7082 {TR_WARNING, "警告", 3, TR_WARNING, 20},
7083 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
7084 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
7085 {TR_LITE_2, "", 0, -2, 0},
7086 {TR_LITE_3, "", 0, -2, 0},
7087 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
7088 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
7089 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
7090 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
7091 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
7093 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
7094 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
7095 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
7096 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
7097 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
7098 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
7099 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
7100 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
7101 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
7102 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
7103 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
7104 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
7105 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
7106 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
7107 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
7108 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
7109 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
7110 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
7112 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
7113 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
7114 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
7115 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
7116 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
7117 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
7118 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
7119 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
7121 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
7122 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
7123 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
7124 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
7125 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
7126 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
7127 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
7128 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
7129 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
7130 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
7131 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
7132 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
7134 {-1, NULL, 0, -1, 0}
7137 static essence_type essence_info[] =
7139 {TR_STR, "strength", 4, TR_STR, 20},
7140 {TR_INT, "intelligence", 4, TR_INT, 20},
7141 {TR_WIS, "wisdom", 4, TR_WIS, 20},
7142 {TR_DEX, "dexterity", 4, TR_DEX, 20},
7143 {TR_CON, "constitution", 4, TR_CON, 20},
7144 {TR_CHR, "charisma", 4, TR_CHR, 20},
7145 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
7146 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
7147 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
7148 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
7149 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
7150 {TR_SPEED, "speed", 4, TR_SPEED, 12},
7151 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
7152 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
7153 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
7154 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
7155 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
7156 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
7157 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
7158 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
7159 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
7160 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
7161 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
7162 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
7163 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
7164 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
7165 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
7166 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
7167 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
7168 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
7169 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
7170 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
7171 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
7172 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
7173 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
7174 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
7175 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
7176 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
7177 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
7178 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
7179 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
7180 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
7181 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
7182 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
7183 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
7184 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
7185 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
7186 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
7187 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
7188 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
7189 {TR_SH_FIRE, "", 0, -2, 0},
7190 {TR_SH_ELEC, "", 0, -2, 0},
7191 {TR_SH_COLD, "", 0, -2, 0},
7192 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
7193 {TR_WARNING, "warning", 3, TR_WARNING, 20},
7194 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
7195 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
7196 {TR_LITE_2, "", 0, -2, 0},
7197 {TR_LITE_3, "", 0, -2, 0},
7198 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7199 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7200 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7201 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7202 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7204 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7205 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7206 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7207 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7208 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7209 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7210 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7211 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7212 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7213 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7214 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7215 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7216 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7217 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
7218 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7219 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7220 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7221 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7223 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7224 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
7225 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
7226 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
7227 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
7228 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
7229 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7230 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7232 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7233 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7234 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7235 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7236 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7237 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7238 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7239 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7240 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7241 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7242 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7243 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7245 {-1, NULL, 0, -1, 0}
7251 * エッセンス名テーブル / Essense names for Weapon smith
7254 cptr essence_name[] =
7357 cptr essence_name[] =
7460 * @brief 所持しているエッセンス一覧を表示する
7463 static void display_essence(void)
7468 for (i = 1; i < 22; i++)
7472 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7473 "Essence Num Essence Num Essence Num "), 1, 8);
7474 for (i = 0; essence_name[i]; i++)
7476 if (!essence_name[i][0]) continue;
7477 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7480 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7490 static void drain_essence(void)
7492 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7496 bool observe = FALSE;
7497 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7498 TIME_EFFECT old_timeout;
7499 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7505 OBJECT_IDX next_o_idx;
7508 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7511 item_tester_hook = object_is_weapon_armour_ammo;
7513 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7514 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7516 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT));
7519 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7521 GAME_TEXT o_name[MAX_NLEN];
7522 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7523 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7526 p_ptr->energy_use = 100;
7528 object_flags(o_ptr, old_flgs);
7529 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7530 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7531 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7532 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7533 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7534 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7535 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7536 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7537 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7539 old_to_a = o_ptr->to_a;
7541 old_to_h = o_ptr->to_h;
7542 old_to_d = o_ptr->to_d;
7545 old_pval = o_ptr->pval;
7546 old_name2 = o_ptr->name2;
7547 old_timeout = o_ptr->timeout;
7548 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7549 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7550 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7551 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7552 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7553 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7554 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7555 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7556 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7557 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7558 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7559 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7560 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7561 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7562 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7563 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7564 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7565 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7566 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7570 next_o_idx = o_ptr->next_o_idx;
7571 marked = o_ptr->marked;
7572 weight = o_ptr->weight;
7573 number = o_ptr->number;
7575 object_prep(o_ptr, o_ptr->k_idx);
7579 o_ptr->next_o_idx=next_o_idx;
7580 o_ptr->marked=marked;
7581 o_ptr->number = number;
7582 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7583 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7584 o_ptr->ident |= (IDENT_MENTAL);
7585 object_aware(o_ptr);
7586 object_known(o_ptr);
7588 object_flags(o_ptr, new_flgs);
7590 for (i = 0; essence_info[i].add_name; i++)
7592 essence_type *es_ptr = &essence_info[i];
7593 PARAMETER_VALUE pval = 0;
7595 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7596 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7598 if (es_ptr->add < TR_FLAG_MAX &&
7599 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7600 have_flag(old_flgs, es_ptr->add))
7604 drain_value[es_ptr->essence] += 10 * pval;
7606 else if (es_ptr->essence != -2)
7608 drain_value[es_ptr->essence] += 10;
7610 else if (es_ptr->add == TR_SH_FIRE)
7612 drain_value[TR_BRAND_FIRE] += 10;
7613 drain_value[TR_RES_FIRE] += 10;
7615 else if (es_ptr->add == TR_SH_ELEC)
7617 drain_value[TR_BRAND_ELEC] += 10;
7618 drain_value[TR_RES_ELEC] += 10;
7620 else if (es_ptr->add == TR_SH_COLD)
7622 drain_value[TR_BRAND_COLD] += 10;
7623 drain_value[TR_RES_COLD] += 10;
7625 else if (es_ptr->add == TR_LITE_2)
7627 drain_value[TR_LITE_1] += 20;
7629 else if (es_ptr->add == TR_LITE_3)
7631 drain_value[TR_LITE_1] += 30;
7636 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7638 drain_value[TR_INT] += 5;
7639 drain_value[TR_WIS] += 5;
7641 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7643 drain_value[TR_BRAND_POIS] += 5;
7644 drain_value[TR_BRAND_ACID] += 5;
7645 drain_value[TR_BRAND_ELEC] += 5;
7646 drain_value[TR_BRAND_FIRE] += 5;
7647 drain_value[TR_BRAND_COLD] += 5;
7649 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7651 drain_value[TR_INT] += 10;
7653 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7655 drain_value[TR_STR] += 10;
7657 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7659 drain_value[TR_DEX] += 10;
7661 if (old_name2 == EGO_2WEAPON)
7663 drain_value[TR_DEX] += 20;
7665 if (object_is_weapon_ammo(o_ptr))
7667 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7669 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7671 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7672 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7673 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7674 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7676 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7678 drain_value[i] *= number;
7679 drain_value[i] = drain_value[i] * dec / 4;
7680 drain_value[i] = MAX(drain_value[i], 0);
7681 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7689 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7693 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7695 for (i = 0; essence_name[i]; i++)
7697 if (!essence_name[i][0]) continue;
7698 if (!drain_value[i]) continue;
7700 p_ptr->magic_num1[i] += drain_value[i];
7701 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7703 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7707 /* Apply autodestroy/inscription to the drained item */
7708 autopick_alter_item(item, TRUE);
7710 /* Combine the pack */
7711 p_ptr->update |= (PU_COMBINE | PU_REORDER);
7713 p_ptr->window |= (PW_INVEN);
7717 * @brief 付加するエッセンスの大別を選択する
7718 * @return 選んだエッセンスの大別ID
7720 static COMMAND_CODE choose_essence(void)
7722 COMMAND_CODE mode = 0;
7724 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7727 cptr menu_name[] = {
7737 cptr menu_name[] = {
7747 const COMMAND_CODE mode_max = 7;
7749 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7759 for (i = 0; i < mode_max; i++)
7761 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7762 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7764 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7765 prt("Choose from menu.", 0, 0);
7784 menu_line += mode_max - 1;
7793 if (menu_line > mode_max) menu_line -= mode_max;
7804 for (i = 0; i < mode_max; i++)
7805 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7807 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7813 if (isupper(choice)) choice = (char)tolower(choice);
7815 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7816 mode = (int)choice - 'a' + 1;
7826 * @brief エッセンスを実際に付加する
7827 * @param mode エッセンスの大別ID
7830 static void add_essence(ESSENCE_IDX mode)
7842 GAME_TEXT o_name[MAX_NLEN];
7844 essence_type *es_ptr;
7845 bool able[22] = { 0 };
7847 int menu_line = (use_menu ? 1 : 0);
7849 for (i = 0; essence_info[i].add_name; i++)
7851 es_ptr = &essence_info[i];
7853 if (es_ptr->type != mode) continue;
7857 if (!repeat_pull(&i) || i<0 || i>=max_num)
7860 /* Nothing chosen yet */
7866 /* Build a prompt */
7867 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
7868 if (use_menu) screen_save();
7870 /* Get a spell from the user */
7872 choice = (always_show_list || use_menu) ? ESCAPE:1;
7875 if( choice==ESCAPE ) choice = ' ';
7876 else if( !get_com(out_val, &choice, FALSE) )break;
7878 if (use_menu && choice != ' ')
7892 menu_line += (max_num-1);
7915 menu_line = max_num;
7929 if (menu_line > max_num) menu_line -= max_num;
7931 /* Request redraw */
7932 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
7935 if (!redraw || use_menu)
7939 char dummy[80], dummy2[80];
7946 if (!use_menu) screen_save();
7948 for (y = 1; y < 24; y++)
7951 /* Print header(s) */
7953 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
7956 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
7959 for (ctr = 0; ctr < max_num; ctr++)
7961 es_ptr = &essence_info[num[ctr]];
7965 if (ctr == (menu_line-1))
7966 strcpy(dummy, _("》 ", "> "));
7967 else strcpy(dummy, " ");
7970 /* letter/number for power selection */
7973 sprintf(dummy, "%c) ",I2A(ctr));
7976 strcat(dummy, es_ptr->add_name);
7981 if (es_ptr->essence != -1)
7983 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
7984 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
7990 case ESSENCE_SH_FIRE:
7991 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
7992 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
7993 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7995 case ESSENCE_SH_ELEC:
7996 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
7997 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
7998 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8000 case ESSENCE_SH_COLD:
8001 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
8002 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
8003 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8005 case ESSENCE_RESISTANCE:
8006 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8007 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8008 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8009 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8010 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8012 case ESSENCE_SUSTAIN:
8013 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8014 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8015 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8016 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8017 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8022 if (!able[ctr]) col = TERM_RED;
8024 if (es_ptr->essence != -1)
8026 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
8030 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
8033 c_prt(col, dummy2, ctr+2, x);
8052 ask = (isupper(choice));
8055 if (ask) choice = (char)tolower(choice);
8057 /* Extract request */
8058 i = (islower(choice) ? A2I(choice) : -1);
8061 /* Totally Illegal */
8062 if ((i < 0) || (i >= max_num) || !able[i])
8074 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
8076 /* Belay that order */
8077 if (!get_check(tmp_val)) continue;
8083 if (redraw) screen_load();
8089 es_ptr = &essence_info[num[i]];
8091 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8092 item_tester_tval = TV_GLOVES;
8093 else if (mode == 1 || mode == 5)
8094 item_tester_hook = item_tester_hook_melee_ammo;
8095 else if (es_ptr->add == ESSENCE_ATTACK)
8096 item_tester_hook = object_allow_enchant_weapon;
8097 else if (es_ptr->add == ESSENCE_AC)
8098 item_tester_hook = object_is_armour;
8100 item_tester_hook = object_is_weapon_armour_ammo;
8102 q = _("どのアイテムを改良しますか?", "Improve which item? ");
8103 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
8105 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT));
8108 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
8110 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
8114 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8116 use_essence = es_ptr->value;
8117 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
8118 if (o_ptr->number > 1)
8120 use_essence *= o_ptr->number;
8121 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
8124 if (es_ptr->essence != -1)
8126 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8128 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8131 if (is_pval_flag(es_ptr->add))
8133 if (o_ptr->pval < 0)
8135 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
8138 else if (es_ptr->add == TR_BLOWS)
8140 if (o_ptr->pval > 1)
8142 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
8146 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8148 else if (o_ptr->pval > 0)
8150 use_essence *= o_ptr->pval;
8151 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8157 PARAMETER_VALUE pval;
8158 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8160 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
8161 strcpy(tmp_val, "1");
8163 if (!get_string(tmp, tmp_val, 1)) return;
8164 pval = (PARAMETER_VALUE)atoi(tmp_val);
8165 if (pval > limit) pval = limit;
8166 else if (pval < 1) pval = 1;
8167 o_ptr->pval += pval;
8168 use_essence *= pval;
8169 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8172 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8174 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8178 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8185 strcpy(tmp_val, "1");
8186 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
8187 val = atoi(tmp_val);
8188 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8189 else if (val < 1) val = 1;
8191 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8192 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8194 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8197 get_to_h = ((val+1)/2+randint0(val/2+1));
8198 get_to_d = ((val+1)/2+randint0(val/2+1));
8199 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8200 o_ptr->to_h += get_to_h;
8201 o_ptr->to_d += get_to_d;
8203 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8204 if (es_ptr->add == ESSENCE_ATTACK)
8206 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8208 msg_print(_("改良に失敗した。", "You failed to enchant."));
8209 p_ptr->energy_use = 100;
8214 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8215 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8218 else if (es_ptr->add == ESSENCE_AC)
8220 if (o_ptr->to_a >= p_ptr->lev/5+5)
8222 msg_print(_("改良に失敗した。", "You failed to enchant."));
8223 p_ptr->energy_use = 100;
8228 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8233 o_ptr->xtra3 = es_ptr->add + 1;
8238 bool success = TRUE;
8242 case ESSENCE_SH_FIRE:
8243 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8248 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8249 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8251 case ESSENCE_SH_ELEC:
8252 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8257 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8258 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8260 case ESSENCE_SH_COLD:
8261 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8266 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8267 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8269 case ESSENCE_RESISTANCE:
8270 case ESSENCE_SUSTAIN:
8271 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))
8276 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8277 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8278 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8279 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8284 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8287 if (es_ptr->add == ESSENCE_SUSTAIN)
8289 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8290 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8291 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8292 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8296 o_ptr->xtra3 = es_ptr->add + 1;
8300 p_ptr->energy_use = 100;
8303 msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name);
8305 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8308 /* Combine the pack */
8309 p_ptr->update |= (PU_COMBINE | PU_REORDER);
8311 p_ptr->window |= (PW_INVEN);
8318 static void erase_essence(void)
8323 GAME_TEXT o_name[MAX_NLEN];
8324 BIT_FLAGS flgs[TR_FLAG_SIZE];
8326 item_tester_hook = object_is_smith;
8328 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
8329 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
8331 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
8334 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8335 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
8337 p_ptr->energy_use = 100;
8339 if (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE)
8341 o_ptr->to_h -= (o_ptr->xtra4>>8);
8342 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8344 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8345 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8348 object_flags(o_ptr, flgs);
8349 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8350 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8352 /* Combine the pack */
8353 p_ptr->update |= (PU_COMBINE | PU_REORDER);
8355 p_ptr->window |= (PW_INVEN);
8359 * @brief 鍛冶コマンドのメインルーチン
8360 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8363 void do_cmd_kaji(bool only_browse)
8365 COMMAND_CODE mode = 0;
8368 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8372 if (p_ptr->confused)
8374 msg_print(_("混乱していて作業できない!", "You are too confused!"));
8379 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8384 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8389 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8391 if (only_browse) screen_save();
8393 if (!only_browse) screen_save();
8399 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8400 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8401 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8402 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8403 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8404 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8406 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8407 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8408 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8409 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8410 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8411 prt(format("Choose command from menu."), 0, 0);
8438 if (menu_line > 5) menu_line -= 5;
8446 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
8447 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
8448 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
8449 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
8450 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
8452 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8454 if (!get_com("Command :", &choice, TRUE))
8491 /* Clear lines, position cursor (really should use strlen here) */
8492 Term_erase(14, 21, 255);
8493 Term_erase(14, 20, 255);
8494 Term_erase(14, 19, 255);
8495 Term_erase(14, 18, 255);
8496 Term_erase(14, 17, 255);
8497 Term_erase(14, 16, 255);
8499 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8500 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8502 prt(&temp[j], line, 15);
8507 if (!only_browse) screen_load();
8508 } while (only_browse);
8513 case 1: display_essence();break;
8514 case 2: drain_essence();break;
8515 case 3: erase_essence();break;
8517 mode = choose_essence();
8522 case 5: add_essence(10);break;
8528 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8529 * Torches have special abilities when they are flaming.
8530 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8531 * @param flgs 特別に追加するフラグを返す参照ポインタ
8534 void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
8536 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8538 if (o_ptr->xtra4 > 0)
8540 add_flag(flgs, TR_BRAND_FIRE);
8541 add_flag(flgs, TR_KILL_UNDEAD);
8542 add_flag(flgs, TR_THROW);
8548 * @brief 投擲時たいまつにダイスを与える。
8549 * Torches have special abilities when they are flaming.
8550 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8551 * @param dd 特別なダイス数を返す参照ポインタ
8552 * @param ds 特別なダイス面数を返す参照ポインタ
8555 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
8557 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8559 if (o_ptr->xtra4 > 0)
8568 * @brief 投擲時命中したたいまつの寿命を縮める。
8569 * Torches have special abilities when they are flaming.
8570 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8573 void torch_lost_fuel(object_type *o_ptr)
8575 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8577 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8578 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;