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"
17 static void one_sustain(object_type *o_ptr);
20 static cptr const kaji_tips[5] =
23 "現在持っているエッセンスの一覧を表示する。",
24 "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。",
25 "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。",
26 "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。",
27 "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。",
29 "Display essences you have.",
30 "Extract essences from an item. The item become non magical.",
31 "Remove added essences from an equipment which was improved before. The removed essence will be ruined.",
32 "Add essences to an item. The improved items or artifacts cannot be reimprove.",
33 "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.",
38 * @brief 対象のオブジェクトにランダムな能力維持を一つ付加する。/ Choose one random sustain
40 * @param o_ptr 対象のオブジェクト構造体ポインタ
43 static void one_sustain(object_type *o_ptr)
47 case 0: add_flag(o_ptr->art_flags, TR_SUST_STR); break;
48 case 1: add_flag(o_ptr->art_flags, TR_SUST_INT); break;
49 case 2: add_flag(o_ptr->art_flags, TR_SUST_WIS); break;
50 case 3: add_flag(o_ptr->art_flags, TR_SUST_DEX); break;
51 case 4: add_flag(o_ptr->art_flags, TR_SUST_CON); break;
52 case 5: add_flag(o_ptr->art_flags, TR_SUST_CHR); break;
57 * @brief 床上、モンスター所持でスタックされたアイテムを削除しスタックを補完する / Excise a dungeon object from any stacks
58 * @param o_idx 削除対象のオブジェクト構造体ポインタ
61 void excise_object_idx(OBJECT_IDX o_idx)
65 s16b this_o_idx, next_o_idx = 0;
71 j_ptr = &o_list[o_idx];
74 if (j_ptr->held_m_idx)
79 m_ptr = &m_list[j_ptr->held_m_idx];
81 /* Scan all objects in the grid */
82 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
87 o_ptr = &o_list[this_o_idx];
89 /* Acquire next object */
90 next_o_idx = o_ptr->next_o_idx;
93 if (this_o_idx == o_idx)
98 /* Remove from list */
99 m_ptr->hold_o_idx = next_o_idx;
107 /* Previous object */
108 k_ptr = &o_list[prev_o_idx];
110 /* Remove from list */
111 k_ptr->next_o_idx = next_o_idx;
114 /* Forget next pointer */
115 o_ptr->next_o_idx = 0;
121 /* Save prev_o_idx */
122 prev_o_idx = this_o_idx;
131 POSITION y = j_ptr->iy;
132 POSITION x = j_ptr->ix;
137 /* Scan all objects in the grid */
138 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
143 o_ptr = &o_list[this_o_idx];
145 /* Acquire next object */
146 next_o_idx = o_ptr->next_o_idx;
149 if (this_o_idx == o_idx)
154 /* Remove from list */
155 c_ptr->o_idx = next_o_idx;
163 /* Previous object */
164 k_ptr = &o_list[prev_o_idx];
166 /* Remove from list */
167 k_ptr->next_o_idx = next_o_idx;
170 /* Forget next pointer */
171 o_ptr->next_o_idx = 0;
177 /* Save prev_o_idx */
178 prev_o_idx = this_o_idx;
184 * @brief オブジェクトを削除する /
185 * Delete a dungeon object
186 * @param o_idx 削除対象のオブジェクト構造体ポインタ
189 * Handle "stacks" of objects correctly.
191 void delete_object_idx(OBJECT_IDX o_idx)
196 excise_object_idx(o_idx);
199 j_ptr = &o_list[o_idx];
202 if (!(j_ptr->held_m_idx))
214 /* Wipe the object */
223 * @brief フロアにマスに落ちているオブジェクトを全て削除する / Deletes all objects at given location
224 * Delete a dungeon object
225 * @param y 削除したフロアマスのY座標
226 * @param x 削除したフロアマスのX座標
229 void delete_object(POSITION y, POSITION x)
232 OBJECT_IDX this_o_idx, next_o_idx = 0;
234 /* Refuse "illegal" locations */
235 if (!in_bounds(y, x)) return;
240 /* Scan all objects in the grid */
241 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
246 o_ptr = &o_list[this_o_idx];
248 /* Acquire next object */
249 next_o_idx = o_ptr->next_o_idx;
251 /* Wipe the object */
258 /* Objects are gone */
267 * @brief グローバルオブジェクト配列に対し指定範囲のオブジェクトを整理してIDの若い順に寄せる /
268 * Move an object from index i1 to index i2 in the object list
269 * @param i1 整理したい配列の始点
270 * @param i2 整理したい配列の終点
273 static void compact_objects_aux(IDX i1, IDX i2)
280 if (i1 == i2) return;
284 for (i = 1; i < o_max; i++)
289 /* Skip "dead" objects */
290 if (!o_ptr->k_idx) continue;
292 /* Repair "next" pointers */
293 if (o_ptr->next_o_idx == i1)
296 o_ptr->next_o_idx = i2;
306 if (o_ptr->held_m_idx)
310 /* Acquire monster */
311 m_ptr = &m_list[o_ptr->held_m_idx];
314 if (m_ptr->hold_o_idx == i1)
317 m_ptr->hold_o_idx = i2;
326 /* Acquire location */
334 if (c_ptr->o_idx == i1)
343 o_list[i2] = o_list[i1];
351 * @brief グローバルオブジェクト配列から優先度の低いものを削除し、データを圧縮する。 /
352 * Compact and Reorder the object list.
353 * @param size 最低でも減らしたいオブジェクト数の水準
357 * This function can be very dangerous, use with caution!\n
359 * When actually "compacting" objects, we base the saving throw on a\n
360 * combination of object level, distance from player, and current\n
363 * After "compacting" (if needed), we "reorder" the objects into a more\n
364 * compact order, and we reset the allocation info, and the "live" array.\n
366 void compact_objects(int size)
370 int cur_lev, cur_dis, chance;
378 msg_print(_("アイテム情報を圧縮しています...", "Compacting objects..."));
381 p_ptr->redraw |= (PR_MAP);
384 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
388 /* Compact at least 'size' objects */
389 for (num = 0, cnt = 1; num < size; cnt++)
391 /* Get more vicious each iteration */
394 /* Get closer each iteration */
395 cur_dis = 5 * (20 - cnt);
397 /* Examine the objects */
398 for (i = 1; i < o_max; i++)
402 /* Skip dead objects */
403 if (!o_ptr->k_idx) continue;
405 /* Hack -- High level objects start out "immune" */
406 if (k_info[o_ptr->k_idx].level > cur_lev) continue;
409 if (o_ptr->held_m_idx)
413 /* Acquire monster */
414 m_ptr = &m_list[o_ptr->held_m_idx];
416 /* Get the location */
420 /* Monsters protect their objects */
421 if (randint0(100) < 90) continue;
427 /* Get the location */
432 /* Nearby objects start out "immune" */
433 if ((cur_dis > 0) && (distance(p_ptr->y, p_ptr->x, y, x) < cur_dis)) continue;
438 /* Hack -- only compact artifacts in emergencies */
439 if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
440 (cnt < 1000)) chance = 100;
442 /* Apply the saving throw */
443 if (randint0(100) < chance) continue;
445 /* Delete the object */
446 delete_object_idx(i);
454 /* Excise dead objects (backwards!) */
455 for (i = o_max - 1; i >= 1; i--)
459 /* Skip real objects */
460 if (o_ptr->k_idx) continue;
462 /* Move last object into open hole */
463 compact_objects_aux(o_max - 1, i);
465 /* Compress "o_max" */
472 * @brief グローバルオブジェクト配列を初期化する /
473 * Delete all the items when player leaves the level
474 * @note we do NOT visually reflect these (irrelevant) changes
476 * Hack -- we clear the "c_ptr->o_idx" field for every grid,
477 * and the "m_ptr->next_o_idx" field for every monster, since
478 * we know we are clearing every object. Technically, we only
479 * clear those fields for grids/monsters containing objects,
480 * and we clear it once for every such object.
483 void wipe_o_list(void)
487 /* Delete the existing objects */
488 for (i = 1; i < o_max; i++)
490 object_type *o_ptr = &o_list[i];
492 /* Skip dead objects */
493 if (!o_ptr->k_idx) continue;
495 /* Mega-Hack -- preserve artifacts */
496 if (!character_dungeon || preserve_mode)
498 /* Hack -- Preserve unknown artifacts */
499 if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
501 /* Mega-Hack -- Preserve the artifact */
502 a_info[o_ptr->name1].cur_num = 0;
507 if (o_ptr->held_m_idx)
512 m_ptr = &m_list[o_ptr->held_m_idx];
514 /* Hack -- see above */
515 m_ptr->hold_o_idx = 0;
523 /* Access location */
524 POSITION y = o_ptr->iy;
525 POSITION x = o_ptr->ix;
530 /* Hack -- see above */
534 /* Wipe the object */
547 * @brief グローバルオブジェクト配列から空きを取得する /
548 * Acquires and returns the index of a "free" object.
549 * @return 開いているオブジェクト要素のID
551 * This routine should almost never fail, but in case it does,
552 * we must be sure to handle "failure" of this routine.
559 /* Initial allocation */
560 if (o_max < max_o_idx)
565 /* Expand object array */
571 /* Use this object */
576 /* Recycle dead objects */
577 for (i = 1; i < o_max; i++)
584 /* Skip live objects */
585 if (o_ptr->k_idx) continue;
590 /* Use this object */
595 /* Warn the player (except during dungeon creation) */
596 if (character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!"));
604 * @brief オブジェクト生成テーブルに生成制約を加える /
605 * Apply a "object restriction function" to the "object allocation table"
607 * @details 生成の制約はグローバルのget_obj_num_hook関数ポインタで加える
609 static errr get_obj_num_prep(void)
614 alloc_entry *table = alloc_kind_table;
616 /* Scan the allocation table */
617 for (i = 0; i < alloc_kind_size; i++)
619 /* Accept objects which pass the restriction, if any */
620 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
622 /* Accept this object */
623 table[i].prob2 = table[i].prob1;
626 /* Do not use this object */
629 /* Decline this object */
640 * @brief オブジェクト生成テーブルからアイテムを取得する /
641 * Choose an object kind that seems "appropriate" to the given level
643 * @return 選ばれたオブジェクトベースID
645 * This function uses the "prob2" field of the "object allocation table",\n
646 * and various local information, to calculate the "prob3" field of the\n
647 * same table, which is then used to choose an "appropriate" object, in\n
648 * a relatively efficient manner.\n
650 * It is (slightly) more likely to acquire an object of the given level\n
651 * than one of a lower level. This is done by choosing several objects\n
652 * appropriate to the given level and keeping the "hardest" one.\n
654 * Note that if no objects are "appropriate", then this function will\n
655 * fail, and return zero, but this should *almost* never happen.\n
657 s16b get_obj_num(int level)
663 alloc_entry *table = alloc_kind_table;
665 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
668 if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER))
670 /* Occasional "boost" */
671 if (one_in_(GREAT_OBJ))
673 /* What a bizarre calculation */
674 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
681 /* Process probabilities */
682 for (i = 0; i < alloc_kind_size; i++)
684 /* Objects are sorted by depth */
685 if (table[i].level > level) break;
690 /* Access the index */
691 k_idx = table[i].index;
693 /* Access the actual kind */
694 k_ptr = &k_info[k_idx];
696 /* Hack -- prevent embedded chests */
697 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
700 table[i].prob3 = table[i].prob2;
703 total += table[i].prob3;
706 /* No legal objects */
707 if (total <= 0) return (0);
711 value = randint0(total);
713 /* Find the object */
714 for (i = 0; i < alloc_kind_size; i++)
716 /* Found the entry */
717 if (value < table[i].prob3) break;
720 value = value - table[i].prob3;
727 /* Try for a "better" object once (50%) or twice (10%) */
734 value = randint0(total);
736 /* Find the object */
737 for (i = 0; i < alloc_kind_size; i++)
739 /* Found the entry */
740 if (value < table[i].prob3) break;
743 value = value - table[i].prob3;
746 /* Keep the "best" one */
747 if (table[i].level < table[j].level) i = j;
750 /* Try for a "better" object twice (10%) */
757 value = randint0(total);
759 /* Find the object */
760 for (i = 0; i < alloc_kind_size; i++)
762 /* Found the entry */
763 if (value < table[i].prob3) break;
766 value = value - table[i].prob3;
769 /* Keep the "best" one */
770 if (table[i].level < table[j].level) i = j;
775 return (table[i].index);
780 * @brief オブジェクトを鑑定済にする /
781 * Known is true when the "attributes" of an object are "known".
782 * @param o_ptr 鑑定済にするオブジェクトの構造体参照ポインタ
784 * These include tohit, todam, toac, cost, and pval (charges).\n
786 * Note that "knowing" an object gives you everything that an "awareness"\n
787 * gives you, and much more. In fact, the player is always "aware" of any\n
788 * item of which he has full "knowledge".\n
790 * But having full knowledge of, say, one "wand of wonder", does not, by\n
791 * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
792 * It happens that most "identify" routines (including "buying from a shop")\n
793 * will make the player "aware" of the object as well as fully "know" it.\n
795 * This routine also removes any inscriptions generated by "feelings".\n
797 void object_known(object_type *o_ptr)
799 /* Remove "default inscriptions" */
800 o_ptr->feeling = FEEL_NONE;
802 /* Clear the "Felt" info */
803 o_ptr->ident &= ~(IDENT_SENSE);
805 /* Clear the "Empty" info */
806 o_ptr->ident &= ~(IDENT_EMPTY);
808 /* Now we know about the item */
809 o_ptr->ident |= (IDENT_KNOWN);
813 * @brief オブジェクトを*鑑定*済にする /
814 * The player is now aware of the effects of the given object.
815 * @param o_ptr *鑑定*済にするオブジェクトの構造体参照ポインタ
818 void object_aware(object_type *o_ptr)
820 bool mihanmei = !object_is_aware(o_ptr);
822 /* Fully aware of the effects */
823 k_info[o_ptr->k_idx].aware = TRUE;
825 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
826 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
830 char o_name[MAX_NLEN];
833 object_copy(q_ptr, o_ptr);
836 object_desc(o_name, q_ptr, OD_NAME_ONLY);
838 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
843 * @brief オブジェクトを試行済にする /
844 * Something has been "sampled"
845 * @param o_ptr 試行済にするオブジェクトの構造体参照ポインタ
848 void object_tried(object_type *o_ptr)
850 /* Mark it as tried (even if "aware") */
851 k_info[o_ptr->k_idx].tried = TRUE;
855 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
856 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
857 * @return 擬似鑑定結果のIDを返す。
859 byte value_check_aux1(object_type *o_ptr)
862 if (object_is_artifact(o_ptr))
865 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
872 if (object_is_ego(o_ptr))
875 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
878 return FEEL_EXCELLENT;
882 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
885 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
887 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
889 /* Good "armor" bonus */
890 if (o_ptr->to_a > 0) return FEEL_GOOD;
892 /* Good "weapon" bonus */
893 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
895 /* Default to "average" */
900 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 2 (Light).
901 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
902 * @return 擬似鑑定結果のIDを返す。
904 byte value_check_aux2(object_type *o_ptr)
906 /* Cursed items (all of them) */
907 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
909 /* Broken items (all of them) */
910 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
912 /* Artifacts -- except cursed/broken ones */
913 if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
915 /* Ego-Items -- except cursed/broken ones */
916 if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
918 /* Good armor bonus */
919 if (o_ptr->to_a > 0) return FEEL_UNCURSED;
921 /* Good weapon bonuses */
922 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
929 * @brief 未鑑定なベースアイテムの基本価格を返す /
930 * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
931 * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
932 * @return オブジェクトの未鑑定価格
934 static s32b object_value_base(object_type *o_ptr)
936 /* Aware item -- use template cost */
937 if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
939 /* Analyze the type */
944 case TV_FOOD: return (5L);
946 /* Un-aware Potions */
947 case TV_POTION: return (20L);
949 /* Un-aware Scrolls */
950 case TV_SCROLL: return (20L);
952 /* Un-aware Staffs */
953 case TV_STAFF: return (70L);
956 case TV_WAND: return (50L);
959 case TV_ROD: return (90L);
962 case TV_RING: return (45L);
964 /* Un-aware Amulets */
965 case TV_AMULET: return (45L);
967 /* Figurines, relative to monster level */
970 int level = r_info[o_ptr->pval].level;
971 if (level < 20) return level*50L;
972 else if (level < 30) return 1000+(level-20)*150L;
973 else if (level < 40) return 2500+(level-30)*350L;
974 else if (level < 50) return 6000+(level-40)*800L;
975 else return 14000+(level-50)*2000L;
979 if (!o_ptr->pval) return 1000L;
980 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
983 /* Paranoia -- Oops */
989 * @brief オブジェクトのフラグ類から価格を算出する /
990 * Return the value of the flags the object has...
991 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
992 * @param plusses フラグに与える価格の基本重み
993 * @return オブジェクトのフラグ価格
995 s32b flag_cost(object_type *o_ptr, int plusses)
998 u32b flgs[TR_FLAG_SIZE];
1002 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1004 object_flags(o_ptr, flgs);
1007 * Exclude fixed flags of the base item.
1008 * pval bonuses of base item will be treated later.
1010 for (i = 0; i < TR_FLAG_SIZE; i++)
1011 flgs[i] &= ~(k_ptr->flags[i]);
1013 /* Exclude fixed flags of the fixed artifact. */
1014 if (object_is_fixed_artifact(o_ptr))
1016 artifact_type *a_ptr = &a_info[o_ptr->name1];
1018 for (i = 0; i < TR_FLAG_SIZE; i++)
1019 flgs[i] &= ~(a_ptr->flags[i]);
1022 /* Exclude fixed flags of the ego-item. */
1023 else if (object_is_ego(o_ptr))
1025 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1027 for (i = 0; i < TR_FLAG_SIZE; i++)
1028 flgs[i] &= ~(e_ptr->flags[i]);
1033 * Calucurate values of remaining flags
1035 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
1036 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
1037 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
1038 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
1039 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
1040 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
1041 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
1042 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
1043 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
1044 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
1045 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
1046 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
1047 total += (10000 + (2500 * plusses));
1048 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
1049 total += (10000 + (2500 * plusses));
1053 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
1054 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
1055 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
1056 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
1057 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
1058 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
1059 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
1060 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
1061 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
1062 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
1063 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
1064 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
1065 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
1066 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
1067 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
1068 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
1069 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
1070 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
1071 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
1072 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
1073 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
1075 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
1076 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
1077 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
1078 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
1079 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
1080 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
1081 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
1082 total += (tmp_cost * count);
1084 if (have_flag(flgs, TR_SUST_STR)) total += 850;
1085 if (have_flag(flgs, TR_SUST_INT)) total += 850;
1086 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
1087 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
1088 if (have_flag(flgs, TR_SUST_CON)) total += 850;
1089 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
1090 if (have_flag(flgs, TR_RIDING)) total += 0;
1091 if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
1092 if (have_flag(flgs, TR_THROW)) total += 5000;
1093 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
1094 if (have_flag(flgs, TR_HOLD_EXP)) total += 8500;
1098 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
1099 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
1100 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
1101 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
1102 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
1103 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
1104 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
1105 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
1106 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
1107 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
1108 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
1109 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
1110 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
1111 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
1112 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
1113 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
1114 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
1115 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
1116 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
1117 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
1118 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
1119 total += (tmp_cost * count);
1121 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
1122 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
1123 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1124 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1125 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1126 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1127 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1128 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1129 if (have_flag(flgs, TR_LEVITATION)) total += 1250;
1130 if (have_flag(flgs, TR_LITE_1)) total += 1500;
1131 if (have_flag(flgs, TR_LITE_2)) total += 2500;
1132 if (have_flag(flgs, TR_LITE_3)) total += 4000;
1133 if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
1134 if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
1135 if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
1136 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1137 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1138 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1139 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1140 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1141 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1142 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1143 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1144 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1145 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1146 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1147 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1148 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1149 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1150 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1151 if (have_flag(flgs, TR_REGEN)) total += 2500;
1152 if (have_flag(flgs, TR_WARNING)) total += 2000;
1153 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1154 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1155 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1156 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1157 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1158 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1159 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1160 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1161 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1162 if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
1163 if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
1164 if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
1165 if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
1166 if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
1167 if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
1168 if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
1169 if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
1170 if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
1171 if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
1172 if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
1173 if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
1174 if (have_flag(flgs, TR_TELEPORT))
1176 if (object_is_cursed(o_ptr))
1181 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1182 if (have_flag(flgs, TR_BLESSED)) total += 750;
1183 if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1184 if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1185 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1186 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1187 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1189 /* Also, give some extra for activatable powers... */
1190 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1192 const activation_type* const act_ptr = find_activation_info(o_ptr);
1194 total += act_ptr->value;
1203 * @brief オブジェクトの真の価格を算出する /
1204 * Return the value of the flags the object has...
1205 * @param o_ptr 本価格を確認したいオブジェクトの構造体参照ポインタ
1206 * @return オブジェクトの本価格
1208 * Return the "real" price of a "known" item, not including discounts\n
1210 * Wand and staffs get cost for each charge\n
1212 * Armor is worth an extra 100 gold per bonus point to armor class.\n
1214 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
1216 * Missiles are only worth 5 gold per bonus point, since they\n
1217 * usually appear in groups of 20, and we want the player to get\n
1218 * the same amount of cash for any "equivalent" item. Note that\n
1219 * missiles never have any of the "pval" flags, and in fact, they\n
1220 * only have a few of the available flags, primarily of the "slay"\n
1221 * and "brand" and "ignore" variety.\n
1223 * Armor with a negative armor bonus is worthless.\n
1224 * Weapons with negative hit+damage bonuses are worthless.\n
1226 * Every wearable item with a "pval" bonus is worth extra (see below).\n
1228 s32b object_value_real(object_type *o_ptr)
1232 u32b flgs[TR_FLAG_SIZE];
1234 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1237 /* Hack -- "worthless" items */
1238 if (!k_info[o_ptr->k_idx].cost) return (0L);
1241 value = k_info[o_ptr->k_idx].cost;
1243 /* Extract some flags */
1244 object_flags(o_ptr, flgs);
1247 if (object_is_fixed_artifact(o_ptr))
1249 artifact_type *a_ptr = &a_info[o_ptr->name1];
1251 /* Hack -- "worthless" artifacts */
1252 if (!a_ptr->cost) return (0L);
1254 /* Hack -- Use the artifact cost instead */
1255 value = a_ptr->cost;
1256 value += flag_cost(o_ptr, o_ptr->pval);
1258 /* Don't add pval bonuses etc. */
1263 else if (object_is_ego(o_ptr))
1265 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1267 /* Hack -- "worthless" ego-items */
1268 if (!e_ptr->cost) return (0L);
1270 /* Hack -- Reward the ego-item with a bonus */
1271 value += e_ptr->cost;
1272 value += flag_cost(o_ptr, o_ptr->pval);
1280 for (i = 0; i < TR_FLAG_SIZE; i++)
1281 if (o_ptr->art_flags[i]) flag = TRUE;
1283 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1286 /* Analyze pval bonus for normal object */
1287 switch (o_ptr->tval)
1310 if (!o_ptr->pval) break;
1312 /* Hack -- Negative "pval" is always bad */
1313 if (o_ptr->pval < 0) return (0L);
1315 /* Give credit for stat bonuses */
1316 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1317 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1318 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1319 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1320 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1321 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1323 /* Give credit for stealth and searching */
1324 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1325 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1326 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1328 /* Give credit for infra-vision and tunneling */
1329 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1330 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1332 /* Give credit for extra attacks */
1333 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1335 /* Give credit for speed bonus */
1336 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1342 /* Analyze the item */
1343 switch (o_ptr->tval)
1348 /* Pay extra for charges, depending on standard number of
1349 * charges. Handle new-style wands correctly. -LM-
1351 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1358 /* Pay extra for charges, depending on standard number of
1361 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1371 /* Hack -- negative bonuses are bad */
1372 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1374 /* Give credit for bonuses */
1375 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1392 /* Hack -- negative armor bonus */
1393 if (o_ptr->to_a < 0) return (0L);
1395 /* Give credit for bonuses */
1396 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1409 /* Hack -- negative hit/damage bonuses */
1410 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1412 /* Factor in the bonuses */
1413 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1415 /* Hack -- Factor in extra damage dice and sides */
1416 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1417 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1428 /* Hack -- negative hit/damage bonuses */
1429 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1431 /* Factor in the bonuses */
1432 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1434 /* Hack -- Factor in extra damage dice and sides */
1435 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1436 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1442 /* Figurines, relative to monster level */
1445 int level = r_info[o_ptr->pval].level;
1446 if (level < 20) value = level*50L;
1447 else if (level < 30) value = 1000+(level-20)*150L;
1448 else if (level < 40) value = 2500+(level-30)*350L;
1449 else if (level < 50) value = 6000+(level-40)*800L;
1450 else value = 14000+(level-50)*2000L;
1456 if (!o_ptr->pval) value = 1000L;
1457 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1463 if (!o_ptr->pval) value = 0L;
1468 /* Worthless object */
1469 if (value < 0) return 0L;
1471 /* Return the value */
1477 * @brief オブジェクト価格算出のメインルーチン /
1478 * Return the price of an item including plusses (and charges)
1479 * @param o_ptr 判明している現価格を確認したいオブジェクトの構造体参照ポインタ
1480 * @return オブジェクトの判明している現価格
1482 * This function returns the "value" of the given item (qty one)\n
1484 * Never notice "unknown" bonuses or properties, including "curses",\n
1485 * since that would give the player information he did not have.\n
1487 * Note that discounted items stay discounted forever, even if\n
1488 * the discount is "forgotten" by the player via memory loss.\n
1490 s32b object_value(object_type *o_ptr)
1495 /* Unknown items -- acquire a base value */
1496 if (object_is_known(o_ptr))
1498 /* Broken items -- worthless */
1499 if (object_is_broken(o_ptr)) return (0L);
1501 /* Cursed items -- worthless */
1502 if (object_is_cursed(o_ptr)) return (0L);
1504 /* Real value (see above) */
1505 value = object_value_real(o_ptr);
1508 /* Known items -- acquire the actual value */
1511 /* Hack -- Felt broken items */
1512 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1514 /* Hack -- Felt cursed items */
1515 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1517 /* Base value (see above) */
1518 value = object_value_base(o_ptr);
1522 /* Apply discount (if any) */
1523 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1526 /* Return the final value */
1533 * @brief 破壊可能なアイテムかを返す /
1534 * Determines whether an object can be destroyed, and makes fake inscription.
1535 * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
1536 * @return オブジェクトが破壊可能ならばTRUEを返す
1538 bool can_player_destroy_object(object_type *o_ptr)
1540 /* Artifacts cannot be destroyed */
1541 if (!object_is_artifact(o_ptr)) return TRUE;
1543 /* If object is unidentified, makes fake inscription */
1544 if (!object_is_known(o_ptr))
1546 byte feel = FEEL_SPECIAL;
1548 /* Hack -- Handle icky artifacts */
1549 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1551 /* Hack -- inscribe the artifact */
1552 o_ptr->feeling = feel;
1554 /* We have "felt" it (again) */
1555 o_ptr->ident |= (IDENT_SENSE);
1557 /* Combine the pack */
1558 p_ptr->notice |= (PN_COMBINE);
1561 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1567 /* Identified artifact -- Nothing to do */
1573 * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
1574 * Distribute charges of rods or wands.
1575 * @param o_ptr 分割元オブジェクトの構造体参照ポインタ source item
1576 * @param q_ptr 分割先オブジェクトの構造体参照ポインタ target item, must be of the same type as o_ptr
1577 * @param amt 分割したい回数量 number of items that are transfered
1580 * Hack -- If rods or wands are dropped, the total maximum timeout or\n
1581 * charges need to be allocated between the two stacks. If all the items\n
1582 * are being dropped, it makes for a neater message to leave the original\n
1583 * stack's pval alone. -LM-\n
1585 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1587 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1589 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1590 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1592 /* Hack -- Rods also need to have their timeouts distributed. The
1593 * dropped stack will accept all time remaining to charge up to its
1596 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1598 if (q_ptr->pval > o_ptr->timeout)
1599 q_ptr->timeout = o_ptr->timeout;
1601 q_ptr->timeout = q_ptr->pval;
1603 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1609 * @brief 魔法棒やロッドの使用回数を減らす /
1610 * @param o_ptr オブジェクトの構造体参照ポインタ source item
1611 * @param amt 減らしたい回数量 number of items that are transfered
1614 * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1615 * charges of the stack needs to be reduced, unless all the items are\n
1616 * being destroyed. -LM-\n
1618 void reduce_charges(object_type *o_ptr, int amt)
1620 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1621 (amt < o_ptr->number))
1623 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1628 * Determine if an item can "absorb" a second item
1630 * See "object_absorb()" for the actual "absorption" code.
1632 * If permitted, we allow staffs (if they are known to have equal charges
1633 * and both are either known or confirmed empty) and wands (if both are
1634 * either known or confirmed empty) and rods (in all cases) to combine.
1635 * Staffs will unstack (if necessary) when they are used, but wands and
1636 * rods will only unstack if one is dropped. -LM-
1638 * If permitted, we allow weapons/armor to stack, if fully "known".
1640 * Missiles will combine if both stacks have the same "known" status.
1641 * This is done to make unidentified stacks of missiles useful.
1643 * Food, potions, scrolls, and "easy know" items always stack.
1645 * Chests, and activatable items, never stack (for various reasons).
1649 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1651 #define MAX_STACK_SIZE 99
1655 * @brief 両オブジェクトをスロットに重ね合わせ可能な最大数を返す。
1656 * Determine if an item can partly absorb a second item. Return maximum number of stack.
1657 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1658 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1659 * @return 重ね合わせ可能なアイテム数
1661 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1665 /* Default maximum number of stack */
1666 int max_num = MAX_STACK_SIZE;
1668 /* Require identical object types */
1669 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1672 /* Analyze the items */
1673 switch (o_ptr->tval)
1675 /* Chests and Statues*/
1686 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1687 if (o_ptr->pval != j_ptr->pval) return 0;
1691 /* Figurines and Corpses*/
1696 if (o_ptr->pval != j_ptr->pval) return 0;
1702 /* Food and Potions and Scrolls */
1714 /* Require either knowledge or known empty for both staffs. */
1715 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1716 !object_is_known(o_ptr)) ||
1717 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1718 !object_is_known(j_ptr))) return 0;
1720 /* Require identical charges, since staffs are bulky. */
1721 if (o_ptr->pval != j_ptr->pval) return 0;
1730 /* Require either knowledge or known empty for both wands. */
1731 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1732 !object_is_known(o_ptr)) ||
1733 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1734 !object_is_known(j_ptr))) return 0;
1736 /* Wand charges combine in O&ZAngband. */
1742 /* Staffs and Wands and Rods */
1745 /* Prevent overflaw of timeout */
1746 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1752 /* Weapons and Armor */
1768 /* Rings, Amulets, Lites */
1774 /* Require full knowledge of both items */
1775 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1785 /* Require identical knowledge of both items */
1786 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1787 if (o_ptr->feeling != j_ptr->feeling) return 0;
1789 /* Require identical "bonuses" */
1790 if (o_ptr->to_h != j_ptr->to_h) return 0;
1791 if (o_ptr->to_d != j_ptr->to_d) return 0;
1792 if (o_ptr->to_a != j_ptr->to_a) return 0;
1794 /* Require identical "pval" code */
1795 if (o_ptr->pval != j_ptr->pval) return 0;
1797 /* Artifacts never stack */
1798 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1800 /* Require identical "ego-item" names */
1801 if (o_ptr->name2 != j_ptr->name2) return 0;
1803 /* Require identical added essence */
1804 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1805 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1807 /* Hack -- Never stack "powerful" items */
1808 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1810 /* Hack -- Never stack recharging items */
1811 if (o_ptr->timeout || j_ptr->timeout) return 0;
1813 /* Require identical "values" */
1814 if (o_ptr->ac != j_ptr->ac) return 0;
1815 if (o_ptr->dd != j_ptr->dd) return 0;
1816 if (o_ptr->ds != j_ptr->ds) return 0;
1825 /* Require knowledge */
1826 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1834 /* Hack -- Identical art_flags! */
1835 for (i = 0; i < TR_FLAG_SIZE; i++)
1836 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1838 /* Hack -- Require identical "cursed" status */
1839 if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1841 /* Hack -- Require identical "broken" status */
1842 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1845 /* Hack -- require semi-matching "inscriptions" */
1846 if (o_ptr->inscription && j_ptr->inscription &&
1847 (o_ptr->inscription != j_ptr->inscription))
1850 /* Hack -- normally require matching "inscriptions" */
1851 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1853 /* Hack -- normally require matching "discounts" */
1854 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1857 /* They match, so they must be similar */
1862 * @brief 両オブジェクトをスロットに重ねることができるかどうかを返す。
1863 * Determine if an item can absorb a second item.
1864 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1865 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1866 * @return 重ね合わせ可能ならばTRUEを返す。
1868 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1870 int total = o_ptr->number + j_ptr->number;
1873 /* Are these objects similar? */
1874 max_num = object_similar_part(o_ptr, j_ptr);
1876 /* Return if not similar */
1877 if (!max_num) return FALSE;
1879 /* Maximal "stacking" limit */
1880 if (total > max_num) return (0);
1883 /* They match, so they must be similar */
1889 * @brief 両オブジェクトをスロットに重ね合わせる。
1890 * Allow one item to "absorb" another, assuming they are similar
1891 * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
1892 * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
1895 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1897 int max_num = object_similar_part(o_ptr, j_ptr);
1898 int total = o_ptr->number + j_ptr->number;
1899 int diff = (total > max_num) ? total - max_num : 0;
1901 /* Combine quantity, lose excess items */
1902 o_ptr->number = (total > max_num) ? max_num : total;
1904 /* Hack -- blend "known" status */
1905 if (object_is_known(j_ptr)) object_known(o_ptr);
1907 /* Hack -- clear "storebought" if only one has it */
1908 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1909 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1911 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1912 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1915 /* Hack -- blend "mental" status */
1916 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1918 /* Hack -- blend "inscriptions" */
1919 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1921 /* Hack -- blend "feelings" */
1922 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1924 /* Hack -- could average discounts XXX XXX XXX */
1925 /* Hack -- save largest discount XXX XXX XXX */
1926 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1928 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1929 if (o_ptr->tval == TV_ROD)
1931 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1932 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1935 /* Hack -- if wands are stacking, combine the charges. -LM- */
1936 if (o_ptr->tval == TV_WAND)
1938 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1944 * @brief tvalとsvalに対応するベースアイテムのIDを返す。
1945 * Find the index of the object_kind with the given tval and sval
1946 * @param tval 検索したいベースアイテムのtval
1947 * @param sval 検索したいベースアイテムのsval
1950 IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval)
1957 for (k = 1; k < max_k_idx; k++)
1959 object_kind *k_ptr = &k_info[k];
1961 /* Require correct tval */
1962 if (k_ptr->tval != tval) continue;
1965 if (k_ptr->sval == sval) return (k);
1967 /* Ignore illegal items */
1968 if (sval != SV_ANY) continue;
1970 /* Apply the randomizer */
1971 if (!one_in_(++num)) continue;
1973 /* Use this value */
1977 /* Return this choice */
1985 msg_format(_("アイテムがない (%d,%d)", "No object (%d,%d)"), tval, sval);
1995 * @brief オブジェクトを初期化する
1996 * Wipe an object clean.
1997 * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
2000 void object_wipe(object_type *o_ptr)
2002 /* Wipe the structure */
2003 (void)WIPE(o_ptr, object_type);
2008 * @brief オブジェクトを複製する
2009 * Wipe an object clean.
2010 * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
2011 * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
2014 void object_copy(object_type *o_ptr, object_type *j_ptr)
2016 /* Copy the structure */
2017 (void)COPY(o_ptr, j_ptr, object_type);
2022 * @brief オブジェクト構造体にベースアイテムを作成する
2023 * Prepare an object based on an object kind.
2024 * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
2025 * @param k_idx 新たに作成したいベースアイテム情報のID
2028 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
2030 object_kind *k_ptr = &k_info[k_idx];
2032 /* Clear the record */
2035 /* Save the kind index */
2036 o_ptr->k_idx = k_idx;
2038 /* Efficiency -- tval/sval */
2039 o_ptr->tval = k_ptr->tval;
2040 o_ptr->sval = k_ptr->sval;
2042 /* Default "pval" */
2043 o_ptr->pval = k_ptr->pval;
2045 /* Default number */
2048 /* Default weight */
2049 o_ptr->weight = k_ptr->weight;
2052 o_ptr->to_h = k_ptr->to_h;
2053 o_ptr->to_d = k_ptr->to_d;
2054 o_ptr->to_a = k_ptr->to_a;
2057 o_ptr->ac = k_ptr->ac;
2058 o_ptr->dd = k_ptr->dd;
2059 o_ptr->ds = k_ptr->ds;
2061 /* Default activation */
2062 if (k_ptr->act_idx > 0) o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
2064 /* Hack -- worthless items are always "broken" */
2065 if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
2067 /* Hack -- cursed items are always "cursed" */
2068 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
2069 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2070 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
2071 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2072 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2073 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2078 * @brief 上質以上のオブジェクトに与えるための各種ボーナスを正規乱数も加えて算出する。
2079 * Help determine an "enchantment bonus" for an object.
2080 * @param max ボーナス値の限度
2081 * @param level ボーナス値に加味する基準生成階
2082 * @return 算出されたボーナス値
2084 * To avoid floating point but still provide a smooth distribution of bonuses,\n
2085 * we simply round the results of division in such a way as to "average" the\n
2086 * correct floating point value.\n
2088 * This function has been changed. It uses "randnor()" to choose values from\n
2089 * a normal distribution, whose mean moves from zero towards the max as the\n
2090 * level increases, and whose standard deviation is equal to 1/4 of the max,\n
2091 * and whose values are forced to lie between zero and the max, inclusive.\n
2093 * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
2094 * rare to get the "full" enchantment on an object, even a deep levels.\n
2096 * It is always possible (albeit unlikely) to get the "full" enchantment.\n
2098 * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
2100 * N 0 1 2 3 4 5 6 7 8 9 10\n
2101 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n
2102 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03\n
2103 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05\n
2104 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05\n
2105 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11\n
2106 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41\n
2107 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65\n
2108 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94\n
2109 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78\n
2110 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64\n
2111 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62\n
2112 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33\n
2113 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38\n
2114 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53\n
2115 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53\n
2116 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27\n
2117 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72\n
2118 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07\n
2120 int m_bonus(int max, DEPTH level)
2122 int bonus, stand, extra, value;
2125 /* Paranoia -- enforce maximal "level" */
2126 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
2129 /* The "bonus" moves towards the max */
2130 bonus = ((max * level) / MAX_DEPTH);
2132 /* Hack -- determine fraction of error */
2133 extra = ((max * level) % MAX_DEPTH);
2135 /* Hack -- simulate floating point computations */
2136 if (randint0(MAX_DEPTH) < extra) bonus++;
2139 /* The "stand" is equal to one quarter of the max */
2142 /* Hack -- determine fraction of error */
2145 /* Hack -- simulate floating point computations */
2146 if (randint0(4) < extra) stand++;
2149 /* Choose an "interesting" value */
2150 value = randnor(bonus, stand);
2152 /* Enforce the minimum value */
2153 if (value < 0) return (0);
2155 /* Enforce the maximum value */
2156 if (value > max) return (max);
2164 * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user
2165 * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ
2168 static void object_mention(object_type *o_ptr)
2170 char o_name[MAX_NLEN];
2172 object_aware(o_ptr);
2173 object_known(o_ptr);
2175 /* Mark the item as fully known */
2176 o_ptr->ident |= (IDENT_MENTAL);
2179 object_desc(o_name, o_ptr, 0);
2180 msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name);
2184 * @brief INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2185 * Mega-Hack -- Attempt to create one of the "Special Objects"
2186 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2187 * @return 生成に成功したらTRUEを返す。
2189 * We are only called from "make_object()", and we assume that\n
2190 * "apply_magic()" is called immediately after we return.\n
2192 * Note -- see "make_artifact()" and "apply_magic()"\n
2194 static bool make_artifact_special(object_type *o_ptr)
2199 /*! @note 地上ではキャンセルする / No artifacts in the town */
2200 if (!dun_level) return (FALSE);
2202 /*! @note get_obj_num_hookによる指定がある場合は生成をキャンセルする / Themed object */
2203 if (get_obj_num_hook) return (FALSE);
2205 /*! @note 全固定アーティファクト中からIDの若い順に生成対象とその確率を走査する / Check the artifact list (just the "specials") */
2206 for (i = 0; i < max_a_idx; i++)
2208 artifact_type *a_ptr = &a_info[i];
2210 /*! @note アーティファクト名が空の不正なデータは除外する / Skip "empty" artifacts */
2211 if (!a_ptr->name) continue;
2213 /*! @note 既に生成回数がカウントされたアーティファクト、QUESTITEMと非INSTA_ARTは除外 / Cannot make an artifact twice */
2214 if (a_ptr->cur_num) continue;
2215 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2216 if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue;
2218 /*! @note アーティファクト生成階が現在に対して足りない場合は高確率で1/(不足階層*2)を満たさないと生成リストに加えられない /
2219 * XXX XXX Enforce minimum "depth" (loosely) */
2220 if (a_ptr->level > object_level)
2222 /* @note / Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2223 int d = (a_ptr->level - object_level) * 2;
2224 if (!one_in_(d)) continue;
2227 /*! @note 1/(レア度)の確率を満たさないと除外される / Artifact "rarity roll" */
2228 if (!one_in_(a_ptr->rarity)) continue;
2230 /*! @note INSTA_ART型固定アーティファクトのベースアイテムもチェック対象とする。ベースアイテムの生成階層が足りない場合1/(不足階層*5) を満たさないと除外される。 /
2231 * Find the base object. XXX XXX Enforce minimum "object" level (loosely). Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2232 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2233 if (k_info[k_idx].level > object_level)
2235 int d = (k_info[k_idx].level - object_level) * 5;
2236 if (!one_in_(d)) continue;
2239 /*! @note 前述の条件を満たしたら、後のIDのアーティファクトはチェックせずすぐ確定し生成処理に移す /
2240 * Assign the template. Mega-Hack -- mark the item as an artifact. Hack: Some artifacts get random extra powers. Success. */
2241 object_prep(o_ptr, k_idx);
2244 random_artifact_resistance(o_ptr, a_ptr);
2248 /*! @note 全INSTA_ART固定アーティファクトを試行しても決まらなかった場合 FALSEを返す / Failure */
2254 * @brief 非INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2255 * Mega-Hack -- Attempt to create one of the "Special Objects"
2256 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2257 * @return 生成に成功したらTRUEを返す。
2259 * Attempt to change an object into an artifact\n
2260 * This routine should only be called by "apply_magic()"\n
2261 * Note -- see "make_artifact_special()" and "apply_magic()"\n
2263 static bool make_artifact(object_type *o_ptr)
2268 /* No artifacts in the town */
2269 if (!dun_level) return (FALSE);
2271 /* Paranoia -- no "plural" artifacts */
2272 if (o_ptr->number != 1) return (FALSE);
2274 /* Check the artifact list (skip the "specials") */
2275 for (i = 0; i < max_a_idx; i++)
2277 artifact_type *a_ptr = &a_info[i];
2279 /* Skip "empty" items */
2280 if (!a_ptr->name) continue;
2282 /* Cannot make an artifact twice */
2283 if (a_ptr->cur_num) continue;
2285 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2287 if (a_ptr->gen_flags & TRG_INSTA_ART) continue;
2289 /* Must have the correct fields */
2290 if (a_ptr->tval != o_ptr->tval) continue;
2291 if (a_ptr->sval != o_ptr->sval) continue;
2293 /* XXX XXX Enforce minimum "depth" (loosely) */
2294 if (a_ptr->level > dun_level)
2296 /* Acquire the "out-of-depth factor" */
2297 int d = (a_ptr->level - dun_level) * 2;
2299 /* Roll for out-of-depth creation */
2300 if (!one_in_(d)) continue;
2303 /* We must make the "rarity roll" */
2304 if (!one_in_(a_ptr->rarity)) continue;
2306 /* Hack -- mark the item as an artifact */
2309 /* Hack: Some artifacts get random extra powers */
2310 random_artifact_resistance(o_ptr, a_ptr);
2322 * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
2323 * Choose random ego type
2324 * @param slot 取得したいエゴの装備部位
2325 * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
2326 * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
2328 static byte get_random_ego(byte slot, bool good)
2331 ego_item_type *e_ptr;
2335 for (i = 1; i < max_e_idx; i++)
2339 if (e_ptr->slot == slot
2340 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2343 total += (255 / e_ptr->rarity);
2347 value = randint1(total);
2349 for (i = 1; i < max_e_idx; i++)
2353 if (e_ptr->slot == slot
2354 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2357 value -= (255 / e_ptr->rarity);
2358 if (value <= 0L) break;
2366 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2367 * Apply magic to an item known to be a "weapon"
2368 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2369 * @param level 生成基準階
2370 * @param power 生成ランク
2373 * Hack -- note special base damage dice boosting\n
2374 * Hack -- note special processing for weapon/digger\n
2376 static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
2378 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
2379 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
2381 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
2382 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
2384 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2386 tohit2 = (tohit2+1)/2;
2387 todam2 = (todam2+1)/2;
2394 o_ptr->to_h += tohit1;
2395 o_ptr->to_d += todam1;
2401 o_ptr->to_h += tohit2;
2402 o_ptr->to_d += todam2;
2410 o_ptr->to_h -= tohit1;
2411 o_ptr->to_d -= todam1;
2416 /* Penalize again */
2417 o_ptr->to_h -= tohit2;
2418 o_ptr->to_d -= todam2;
2421 /* Cursed (if "bad") */
2422 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2425 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2428 switch (o_ptr->tval)
2435 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2436 create_artifact(o_ptr, FALSE);
2438 /* Special Ego-item */
2439 o_ptr->name2 = EGO_DIGGING;
2443 else if (power < -1)
2445 /* Hack -- Horrible digging bonus */
2446 o_ptr->pval = 0 - (5 + randint1(5));
2452 /* Hack -- Reverse digging bonus */
2453 o_ptr->pval = 0 - (o_ptr->pval);
2467 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2469 create_artifact(o_ptr, FALSE);
2474 /* Roll for an ego-item */
2475 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2476 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2478 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2480 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2485 switch (o_ptr->name2)
2488 if (one_in_(4) && (level > 40))
2489 add_flag(o_ptr->art_flags, TR_BLOWS);
2493 add_flag(o_ptr->art_flags, TR_RES_POIS);
2495 add_flag(o_ptr->art_flags, TR_WARNING);
2497 case EGO_KILL_DRAGON:
2499 add_flag(o_ptr->art_flags, TR_RES_POIS);
2503 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2505 case EGO_SLAYING_WEAPON:
2506 if (one_in_(3)) /* double damage */
2514 while (one_in_(o_ptr->dd));
2520 while (one_in_(o_ptr->ds));
2525 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2527 if (o_ptr->tval == TV_SWORD && one_in_(3))
2529 add_flag(o_ptr->art_flags, TR_VORPAL);
2534 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2540 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
2542 add_flag(o_ptr->art_flags, TR_DEX);
2544 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2547 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
2549 case EGO_EARTHQUAKES:
2550 if (one_in_(3) && (level > 60))
2551 add_flag(o_ptr->art_flags, TR_BLOWS);
2553 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
2557 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2561 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2563 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2565 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2566 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2569 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2570 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2571 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2572 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2576 if (!o_ptr->art_name)
2578 /* Hack -- Super-charge the damage dice */
2579 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2581 /* Hack -- Lower the damage dice */
2582 if (o_ptr->dd > 9) o_ptr->dd = 9;
2587 else if (power < -1)
2589 /* Roll for ego-item */
2590 if (randint0(MAX_DEPTH) < level)
2594 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2595 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2601 switch (o_ptr->name2)
2604 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2605 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2607 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2608 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2609 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2610 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2611 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2612 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2626 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2628 create_artifact(o_ptr, FALSE);
2631 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2645 if (power > 2) /* power > 2 is debug only */
2647 create_artifact(o_ptr, FALSE);
2651 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2653 switch (o_ptr->name2)
2655 case EGO_SLAYING_BOLT:
2660 /* Hack -- super-charge the damage dice */
2661 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2663 /* Hack -- restrict the damage dice */
2664 if (o_ptr->dd > 9) o_ptr->dd = 9;
2668 else if (power < -1)
2670 /* Roll for ego-item */
2671 if (randint0(MAX_DEPTH) < level)
2673 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2683 * @brief ドラゴン装備にランダムな耐性を与える
2684 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2687 static void dragon_resist(object_type * o_ptr)
2692 one_dragon_ele_resistance(o_ptr);
2694 one_high_resistance(o_ptr);
2700 * @brief オブジェクトにランダムな強いESPを与える
2701 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2704 static bool add_esp_strong(object_type *o_ptr)
2706 bool nonliv = FALSE;
2708 switch (randint1(3))
2710 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2711 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2712 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2719 * @brief オブジェクトにランダムな弱いESPを与える
2720 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2721 * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3)
2724 static void add_esp_weak(object_type *o_ptr, bool extra)
2727 u32b weak_esp_list[] = {
2739 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2740 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2742 /* Add unduplicated weak esp flags randomly */
2743 for (i = 0; i < add_count; ++ i)
2745 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2747 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2748 weak_esp_list[choice] = weak_esp_list[i];
2754 * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2755 * Apply magic to an item known to be "armor"
2756 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2757 * @param level 生成基準階
2758 * @param power 生成ランク
2761 * Hack -- note special processing for crown/helm\n
2762 * Hack -- note special processing for robe of permanence\n
2764 static void a_m_aux_2(object_type *o_ptr, int level, int power)
2766 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
2767 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
2773 o_ptr->to_a += toac1;
2779 o_ptr->to_a += toac2;
2787 o_ptr->to_a -= toac1;
2792 /* Penalize again */
2793 o_ptr->to_a -= toac2;
2796 /* Cursed (if "bad") */
2797 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2802 switch (o_ptr->tval)
2806 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2807 create_artifact(o_ptr, FALSE);
2817 /* Hack -- Try for "Robes of the Magi" */
2818 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2819 (o_ptr->sval == SV_ROBE) &&
2820 (randint0(100) < 15))
2824 o_ptr->name2 = EGO_YOIYAMI;
2825 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2826 o_ptr->sval = SV_YOIYAMI_ROBE;
2832 o_ptr->name2 = EGO_PERMANENCE;
2837 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2839 create_artifact(o_ptr, FALSE);
2845 bool okay_flag = TRUE;
2847 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2849 switch (o_ptr->name2)
2852 if (o_ptr->tval != TV_HARD_ARMOR)
2858 if (o_ptr->tval != TV_SOFT_ARMOR)
2867 if (okay_flag) break;
2869 switch (o_ptr->name2)
2871 case EGO_RESISTANCE:
2873 add_flag(o_ptr->art_flags, TR_RES_POIS);
2876 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2877 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2881 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2883 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2885 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2886 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2888 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2889 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2890 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2891 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2892 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2893 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2894 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2895 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2898 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2899 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2900 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2901 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2902 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2903 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2916 if (o_ptr->sval == SV_DRAGON_SHIELD)
2918 dragon_resist(o_ptr);
2919 if (!one_in_(3)) break;
2925 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2927 create_artifact(o_ptr, FALSE);
2933 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2934 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
2935 && o_ptr->name2 == EGO_S_DWARVEN)
2942 switch (o_ptr->name2)
2945 if (!one_in_(3)) one_high_resistance(o_ptr);
2946 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2948 case EGO_REFLECTION:
2949 if (o_ptr->sval == SV_MIRROR_SHIELD)
2954 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2955 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2964 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2966 dragon_resist(o_ptr);
2967 if (!one_in_(3)) break;
2971 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2973 create_artifact(o_ptr, FALSE);
2976 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2980 else if (power < -1)
2982 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2990 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2992 dragon_resist(o_ptr);
2993 if (!one_in_(3)) break;
2998 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3000 create_artifact(o_ptr, FALSE);
3003 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
3005 switch (o_ptr->name2)
3007 case EGO_SLOW_DESCENT:
3010 one_high_resistance(o_ptr);
3016 else if (power < -1)
3018 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
3029 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3031 create_artifact(o_ptr, FALSE);
3036 bool ok_flag = TRUE;
3037 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3039 switch (o_ptr->name2)
3042 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
3043 else add_esp_weak(o_ptr, FALSE);
3047 case EGO_REGENERATION:
3048 case EGO_LORDLINESS:
3054 if (one_in_(2)) add_esp_strong(o_ptr);
3055 else add_esp_weak(o_ptr, FALSE);
3058 default:/* not existing crown (wisdom,lite, etc...) */
3062 break; /* while (1) */
3068 else if (power < -1)
3072 bool ok_flag = TRUE;
3073 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3075 switch (o_ptr->name2)
3077 case EGO_ANCIENT_CURSE:
3078 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
3079 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
3080 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3081 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3082 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3083 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3087 break; /* while (1) */
3096 if (o_ptr->sval == SV_DRAGON_HELM)
3098 dragon_resist(o_ptr);
3099 if (!one_in_(3)) break;
3105 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3107 create_artifact(o_ptr, FALSE);
3112 bool ok_flag = TRUE;
3113 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3115 switch (o_ptr->name2)
3117 case EGO_BRILLIANCE:
3119 case EGO_INFRAVISION:
3120 case EGO_H_PROTECTION:
3125 if (one_in_(2)) add_esp_strong(o_ptr);
3126 else add_esp_weak(o_ptr, FALSE);
3130 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
3131 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
3134 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3136 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
3138 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
3139 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3141 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3142 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
3143 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
3144 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3145 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3146 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3147 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3148 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
3150 default:/* not existing helm (Magi, Might, etc...)*/
3154 break; /* while (1) */
3159 else if (power < -1)
3163 bool ok_flag = TRUE;
3164 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3166 switch (o_ptr->name2)
3168 case EGO_ANCIENT_CURSE:
3172 break; /* while (1) */
3183 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3185 create_artifact(o_ptr, FALSE);
3188 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
3190 switch (o_ptr->name2)
3199 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
3200 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
3201 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
3202 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3209 else if (power < -1)
3211 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3222 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
3223 * Apply magic to an item known to be a "ring" or "amulet"
3224 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3225 * @param level 生成基準階
3226 * @param power 生成ランク
3229 * Hack -- note special "pval boost" code for ring of speed\n
3230 * Hack -- note that some items must be cursed (or blessed)\n
3232 static void a_m_aux_3(object_type *o_ptr, int level, int power)
3234 /* Apply magic (good or bad) according to type */
3235 switch (o_ptr->tval)
3240 switch (o_ptr->sval)
3242 case SV_RING_ATTACKS:
3245 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
3246 if (one_in_(15)) o_ptr->pval++;
3247 if (o_ptr->pval < 1) o_ptr->pval = 1;
3253 o_ptr->ident |= (IDENT_BROKEN);
3256 o_ptr->curse_flags |= TRC_CURSED;
3259 o_ptr->pval = 0 - (o_ptr->pval);
3270 /* Strength, Constitution, Dexterity, Intelligence */
3276 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3282 o_ptr->ident |= (IDENT_BROKEN);
3285 o_ptr->curse_flags |= TRC_CURSED;
3288 o_ptr->pval = 0 - (o_ptr->pval);
3294 /* Ring of Speed! */
3297 /* Base speed (1 to 10) */
3298 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3300 /* Super-charge the ring */
3301 while (randint0(100) < 50) o_ptr->pval++;
3307 o_ptr->ident |= (IDENT_BROKEN);
3310 o_ptr->curse_flags |= TRC_CURSED;
3313 o_ptr->pval = 0 - (o_ptr->pval);
3321 case SV_RING_LORDLY:
3325 one_lordly_high_resistance(o_ptr);
3329 /* Bonus to armor class */
3330 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3334 case SV_RING_WARNING:
3336 if (one_in_(3)) one_low_esp(o_ptr);
3341 case SV_RING_SEARCHING:
3343 /* Bonus to searching */
3344 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3350 o_ptr->ident |= (IDENT_BROKEN);
3353 o_ptr->curse_flags |= TRC_CURSED;
3356 o_ptr->pval = 0 - (o_ptr->pval);
3362 /* Flames, Acid, Ice */
3363 case SV_RING_FLAMES:
3368 /* Bonus to armor class */
3369 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3373 /* Weakness, Stupidity */
3374 case SV_RING_WEAKNESS:
3375 case SV_RING_STUPIDITY:
3378 o_ptr->ident |= (IDENT_BROKEN);
3381 o_ptr->curse_flags |= TRC_CURSED;
3384 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3385 if (power > 0) power = 0 - power;
3390 /* WOE, Stupidity */
3394 o_ptr->ident |= (IDENT_BROKEN);
3397 o_ptr->curse_flags |= TRC_CURSED;
3400 o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
3401 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3402 if (power > 0) power = 0 - power;
3407 /* Ring of damage */
3408 case SV_RING_DAMAGE:
3410 /* Bonus to damage */
3411 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
3417 o_ptr->ident |= (IDENT_BROKEN);
3420 o_ptr->curse_flags |= TRC_CURSED;
3423 o_ptr->to_d = 0 - o_ptr->to_d;
3429 /* Ring of Accuracy */
3430 case SV_RING_ACCURACY:
3433 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
3439 o_ptr->ident |= (IDENT_BROKEN);
3442 o_ptr->curse_flags |= TRC_CURSED;
3445 o_ptr->to_h = 0 - o_ptr->to_h;
3451 /* Ring of Protection */
3452 case SV_RING_PROTECTION:
3454 /* Bonus to armor class */
3455 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
3461 o_ptr->ident |= (IDENT_BROKEN);
3464 o_ptr->curse_flags |= TRC_CURSED;
3467 o_ptr->to_a = 0 - o_ptr->to_a;
3473 /* Ring of Slaying */
3474 case SV_RING_SLAYING:
3476 /* Bonus to damage and to hit */
3477 o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
3478 o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
3484 o_ptr->ident |= (IDENT_BROKEN);
3487 o_ptr->curse_flags |= TRC_CURSED;
3489 /* Reverse bonuses */
3490 o_ptr->to_h = 0 - o_ptr->to_h;
3491 o_ptr->to_d = 0 - o_ptr->to_d;
3497 case SV_RING_MUSCLE:
3499 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
3500 if (one_in_(4)) o_ptr->pval++;
3506 o_ptr->ident |= (IDENT_BROKEN);
3509 o_ptr->curse_flags |= TRC_CURSED;
3511 /* Reverse bonuses */
3512 o_ptr->pval = 0 - o_ptr->pval;
3517 case SV_RING_AGGRAVATION:
3520 o_ptr->ident |= (IDENT_BROKEN);
3523 o_ptr->curse_flags |= TRC_CURSED;
3525 if (power > 0) power = 0 - power;
3529 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3530 || (power > 2)) /* power > 2 is debug only */
3532 o_ptr->pval = MIN(o_ptr->pval, 4);
3533 /* Randart amulet */
3534 create_artifact(o_ptr, FALSE);
3536 else if ((power == 2) && one_in_(2))
3538 while(!o_ptr->name2)
3540 int tmp = m_bonus(10, level);
3541 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3542 switch(randint1(28))
3545 o_ptr->name2 = EGO_RING_THROW;
3548 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3549 o_ptr->name2 = EGO_RING_REGEN;
3552 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3553 o_ptr->name2 = EGO_RING_LITE;
3556 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3557 o_ptr->name2 = EGO_RING_TELEPORT;
3560 if (o_ptr->to_h) break;
3561 o_ptr->name2 = EGO_RING_TO_H;
3564 if (o_ptr->to_d) break;
3565 o_ptr->name2 = EGO_RING_TO_D;
3568 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3569 o_ptr->name2 = EGO_RING_SLAY;
3572 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3573 o_ptr->name2 = EGO_RING_WIZARD;
3576 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3577 o_ptr->name2 = EGO_RING_HERO;
3580 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3581 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3582 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3583 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3586 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3587 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;
3588 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3589 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3590 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3593 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3594 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;
3595 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3596 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3597 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3600 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3601 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;
3602 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3603 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3606 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3607 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;
3608 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3609 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3611 case 21: case 22: case 23: case 24: case 25: case 26:
3612 switch (o_ptr->sval)
3615 if (!one_in_(3)) break;
3616 o_ptr->name2 = EGO_RING_D_SPEED;
3618 case SV_RING_DAMAGE:
3619 case SV_RING_ACCURACY:
3620 case SV_RING_SLAYING:
3621 if (one_in_(2)) break;
3622 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3625 o_ptr->name2 = EGO_RING_BERSERKER;
3626 o_ptr->to_h -= 2+randint1(4);
3627 o_ptr->to_d += 2+randint1(4);
3630 case SV_RING_PROTECTION:
3631 o_ptr->name2 = EGO_RING_SUPER_AC;
3632 o_ptr->to_a += 7 + m_bonus(5, level);
3634 case SV_RING_RES_FEAR:
3635 o_ptr->name2 = EGO_RING_HERO;
3638 if (one_in_(2)) break;
3639 o_ptr->name2 = EGO_RING_HUNTER;
3641 case SV_RING_SEARCHING:
3642 o_ptr->name2 = EGO_RING_STEALTH;
3644 case SV_RING_TELEPORTATION:
3645 o_ptr->name2 = EGO_RING_TELE_AWAY;
3647 case SV_RING_RES_BLINDNESS:
3649 o_ptr->name2 = EGO_RING_RES_LITE;
3651 o_ptr->name2 = EGO_RING_RES_DARK;
3653 case SV_RING_LORDLY:
3654 if (!one_in_(20)) break;
3655 one_lordly_high_resistance(o_ptr);
3656 one_lordly_high_resistance(o_ptr);
3657 o_ptr->name2 = EGO_RING_TRUE;
3659 case SV_RING_SUSTAIN:
3660 if (!one_in_(4)) break;
3661 o_ptr->name2 = EGO_RING_RES_TIME;
3663 case SV_RING_FLAMES:
3664 if (!one_in_(2)) break;
3665 o_ptr->name2 = EGO_RING_DRAGON_F;
3668 if (!one_in_(2)) break;
3669 o_ptr->name2 = EGO_RING_DRAGON_C;
3671 case SV_RING_WARNING:
3672 if (!one_in_(2)) break;
3673 o_ptr->name2 = EGO_RING_M_DETECT;
3682 o_ptr->curse_flags = 0L;
3684 else if ((power == -2) && one_in_(2))
3686 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3687 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3688 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3689 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3690 o_ptr->art_flags[0] = 0;
3691 o_ptr->art_flags[1] = 0;
3692 while(!o_ptr->name2)
3694 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3698 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3699 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3702 o_ptr->name2 = EGO_RING_NO_MELEE;
3705 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3706 o_ptr->name2 = EGO_RING_AGGRAVATE;
3709 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3710 o_ptr->name2 = EGO_RING_TY_CURSE;
3713 o_ptr->name2 = EGO_RING_ALBINO;
3718 o_ptr->ident |= (IDENT_BROKEN);
3721 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3729 switch (o_ptr->sval)
3731 /* Amulet of wisdom/charisma */
3732 case SV_AMULET_INTELLIGENCE:
3733 case SV_AMULET_WISDOM:
3734 case SV_AMULET_CHARISMA:
3736 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3742 o_ptr->ident |= (IDENT_BROKEN);
3745 o_ptr->curse_flags |= (TRC_CURSED);
3747 /* Reverse bonuses */
3748 o_ptr->pval = 0 - o_ptr->pval;
3754 /* Amulet of brilliance */
3755 case SV_AMULET_BRILLIANCE:
3757 o_ptr->pval = 1 + m_bonus(3, level);
3758 if (one_in_(4)) o_ptr->pval++;
3764 o_ptr->ident |= (IDENT_BROKEN);
3767 o_ptr->curse_flags |= (TRC_CURSED);
3769 /* Reverse bonuses */
3770 o_ptr->pval = 0 - o_ptr->pval;
3776 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3780 o_ptr->curse_flags |= (TRC_CURSED);
3785 case SV_AMULET_RESISTANCE:
3787 if (one_in_(5)) one_high_resistance(o_ptr);
3788 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3792 /* Amulet of searching */
3793 case SV_AMULET_SEARCHING:
3795 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
3801 o_ptr->ident |= (IDENT_BROKEN);
3804 o_ptr->curse_flags |= (TRC_CURSED);
3806 /* Reverse bonuses */
3807 o_ptr->pval = 0 - (o_ptr->pval);
3813 /* Amulet of the Magi -- never cursed */
3814 case SV_AMULET_THE_MAGI:
3816 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3817 o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
3819 /* gain one low ESP */
3820 add_esp_weak(o_ptr, FALSE);
3825 /* Amulet of Doom -- always cursed */
3826 case SV_AMULET_DOOM:
3829 o_ptr->ident |= (IDENT_BROKEN);
3832 o_ptr->curse_flags |= (TRC_CURSED);
3835 o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
3836 o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
3837 if (power > 0) power = 0 - power;
3842 case SV_AMULET_MAGIC_MASTERY:
3844 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
3850 o_ptr->ident |= (IDENT_BROKEN);
3853 o_ptr->curse_flags |= (TRC_CURSED);
3855 /* Reverse bonuses */
3856 o_ptr->pval = 0 - o_ptr->pval;
3862 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3863 || (power > 2)) /* power > 2 is debug only */
3865 o_ptr->pval = MIN(o_ptr->pval, 4);
3866 /* Randart amulet */
3867 create_artifact(o_ptr, FALSE);
3869 else if ((power == 2) && one_in_(2))
3871 while(!o_ptr->name2)
3873 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3874 switch(randint1(21))
3877 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3878 o_ptr->name2 = EGO_AMU_SLOW_D;
3881 if (o_ptr->pval) break;
3882 o_ptr->name2 = EGO_AMU_INFRA;
3885 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3886 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3889 if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
3890 o_ptr->name2 = EGO_AMU_HOLD_EXP;
3893 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3894 o_ptr->name2 = EGO_AMU_LEVITATION;
3896 case 10: case 11: case 21:
3897 o_ptr->name2 = EGO_AMU_AC;
3900 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3901 if (m_bonus(10, level) > 8)
3902 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3904 o_ptr->name2 = EGO_AMU_RES_FIRE;
3907 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3908 if (m_bonus(10, level) > 8)
3909 o_ptr->name2 = EGO_AMU_RES_COLD_;
3911 o_ptr->name2 = EGO_AMU_RES_COLD;
3914 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3915 if (m_bonus(10, level) > 8)
3916 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3918 o_ptr->name2 = EGO_AMU_RES_ELEC;
3921 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3922 if (m_bonus(10, level) > 8)
3923 o_ptr->name2 = EGO_AMU_RES_ACID_;
3925 o_ptr->name2 = EGO_AMU_RES_ACID;
3927 case 16: case 17: case 18: case 19: case 20:
3928 switch (o_ptr->sval)
3930 case SV_AMULET_TELEPORT:
3931 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3932 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3933 else o_ptr->name2 = EGO_AMU_TELEPORT;
3935 case SV_AMULET_RESIST_ACID:
3936 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3938 case SV_AMULET_SEARCHING:
3939 o_ptr->name2 = EGO_AMU_STEALTH;
3941 case SV_AMULET_BRILLIANCE:
3942 if (!one_in_(3)) break;
3943 o_ptr->name2 = EGO_AMU_IDENT;
3945 case SV_AMULET_CHARISMA:
3946 if (!one_in_(3)) break;
3947 o_ptr->name2 = EGO_AMU_CHARM;
3949 case SV_AMULET_THE_MAGI:
3950 if (one_in_(2)) break;
3951 o_ptr->name2 = EGO_AMU_GREAT;
3953 case SV_AMULET_RESISTANCE:
3954 if (!one_in_(5)) break;
3955 o_ptr->name2 = EGO_AMU_DEFENDER;
3957 case SV_AMULET_TELEPATHY:
3958 if (!one_in_(3)) break;
3959 o_ptr->name2 = EGO_AMU_DETECTION;
3965 o_ptr->curse_flags = 0L;
3967 else if ((power == -2) && one_in_(2))
3969 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3970 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3971 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3972 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3973 o_ptr->art_flags[0] = 0;
3974 o_ptr->art_flags[1] = 0;
3975 while(!o_ptr->name2)
3977 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3981 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3982 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3985 o_ptr->name2 = EGO_AMU_FOOL;
3988 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3989 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3992 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3993 o_ptr->name2 = EGO_AMU_TY_CURSE;
3996 o_ptr->name2 = EGO_AMU_NAIVETY;
4001 o_ptr->ident |= (IDENT_BROKEN);
4004 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
4012 * @brief モンスターが人形のベースにできるかを返す
4013 * @param r_idx チェックしたいモンスター種族のID
4014 * @return 人形にできるならTRUEを返す
4016 static bool item_monster_okay(MONRACE_IDX r_idx)
4018 monster_race *r_ptr = &r_info[r_idx];
4021 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
4022 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
4023 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
4024 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
4025 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
4026 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
4034 * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
4035 * Apply magic to an item known to be "boring"
4036 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4037 * @param level 生成基準階
4038 * @param power 生成ランク
4041 * Hack -- note the special code for various items
4043 static void a_m_aux_4(object_type *o_ptr, int level, int power)
4045 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4050 /* Apply magic (good or bad) according to type */
4051 switch (o_ptr->tval)
4060 o_ptr->ident |= (IDENT_BROKEN);
4063 o_ptr->curse_flags |= (TRC_CURSED);
4070 o_ptr->xtra4 = o_ptr->pval;
4076 /* Hack -- Torches -- random fuel */
4077 if (o_ptr->sval == SV_LITE_TORCH)
4079 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4083 /* Hack -- Lanterns -- random fuel */
4084 if (o_ptr->sval == SV_LITE_LANTERN)
4086 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4090 if (power > 2) /* power > 2 is debug only */
4092 create_artifact(o_ptr, FALSE);
4094 else if ((power == 2) || ((power == 1) && one_in_(3)))
4096 while (!o_ptr->name2)
4100 bool okay_flag = TRUE;
4102 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
4104 switch (o_ptr->name2)
4107 if (o_ptr->sval == SV_LITE_FEANOR)
4115 else if (power == -2)
4117 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
4119 switch (o_ptr->name2)
4121 case EGO_LITE_DARKNESS:
4124 if (o_ptr->sval == SV_LITE_TORCH)
4126 add_flag(o_ptr->art_flags, TR_LITE_M1);
4128 else if (o_ptr->sval == SV_LITE_LANTERN)
4130 add_flag(o_ptr->art_flags, TR_LITE_M2);
4132 else if (o_ptr->sval == SV_LITE_FEANOR)
4134 add_flag(o_ptr->art_flags, TR_LITE_M3);
4146 /* The wand or staff gets a number of initial charges equal
4147 * to between 1/2 (+1) and the full object kind's pval. -LM-
4149 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
4155 /* Transfer the pval. -LM- */
4156 o_ptr->pval = k_ptr->pval;
4163 object_aware(o_ptr);
4164 object_known(o_ptr);
4170 PARAMETER_VALUE i = 1;
4173 monster_race *r_ptr;
4175 /* Pick a random non-unique monster race */
4178 i = randint1(max_r_idx - 1);
4180 if (!item_monster_okay(i)) continue;
4181 if (i == MON_TSUCHINOKO) continue;
4185 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4187 /* Ignore dead monsters */
4188 if (!r_ptr->rarity) continue;
4190 /* Ignore uncommon monsters */
4191 if (r_ptr->rarity > 100) continue;
4193 /* Prefer less out-of-depth monsters */
4194 if (randint0(check)) continue;
4201 /* Some figurines are cursed */
4202 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
4209 PARAMETER_VALUE i = 1;
4214 monster_race *r_ptr;
4216 if (o_ptr->sval == SV_SKELETON)
4218 match = RF9_DROP_SKELETON;
4220 else if (o_ptr->sval == SV_CORPSE)
4222 match = RF9_DROP_CORPSE;
4225 /* Hack -- Remove the monster restriction */
4226 get_mon_num_prep(item_monster_okay, NULL);
4228 /* Pick a random non-unique monster race */
4231 i = get_mon_num(dun_level);
4235 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4237 /* Ignore dead monsters */
4238 if (!r_ptr->rarity) continue;
4240 /* Ignore corpseless monsters */
4241 if (!(r_ptr->flags9 & match)) continue;
4243 /* Prefer less out-of-depth monsters */
4244 if (randint0(check)) continue;
4252 object_aware(o_ptr);
4253 object_known(o_ptr);
4259 PARAMETER_VALUE i = 1;
4261 monster_race *r_ptr;
4263 /* Pick a random monster race */
4266 i = randint1(max_r_idx - 1);
4270 /* Ignore dead monsters */
4271 if (!r_ptr->rarity) continue;
4280 msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
4282 object_aware(o_ptr);
4283 object_known(o_ptr);
4290 DEPTH obj_level = k_info[o_ptr->k_idx].level;
4292 /* Hack -- skip ruined chests */
4293 if (obj_level <= 0) break;
4295 /* Hack -- pick a "difficulty" */
4296 o_ptr->pval = randint1(obj_level);
4297 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4299 o_ptr->xtra3 = dun_level + 5;
4301 /* Never exceed "difficulty" of 55 to 59 */
4302 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4310 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
4311 * Complete the "creation" of an object by applying "magic" to the item
4312 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4314 * @param mode 生成オプション
4317 * This includes not only rolling for random bonuses, but also putting the\n
4318 * finishing touches on ego-items and artifacts, giving charges to wands and\n
4319 * staffs, giving fuel to lites, and placing traps on chests.\n
4321 * In particular, note that "Instant Artifacts", if "created" by an external\n
4322 * routine, must pass through this function to complete the actual creation.\n
4324 * The base "chance" of the item being "good" increases with the "level"\n
4325 * parameter, which is usually derived from the dungeon level, being equal\n
4326 * to the level plus 10, up to a maximum of 75. If "good" is true, then\n
4327 * the object is guaranteed to be "good". If an object is "good", then\n
4328 * the chance that the object will be "great" (ego-item or artifact), also\n
4329 * increases with the "level", being equal to half the level, plus 5, up to\n
4330 * a maximum of 20. If "great" is true, then the object is guaranteed to be\n
4331 * "great". At dungeon level 65 and below, 15/100 objects are "great".\n
4333 * If the object is not "good", there is a chance it will be "cursed", and\n
4334 * if it is "cursed", there is a chance it will be "broken". These chances\n
4335 * are related to the "good" / "great" chances above.\n
4337 * Otherwise "normal" rings and amulets will be "good" half the time and\n
4338 * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4340 * If "okay" is true, and the object is going to be "great", then there is\n
4341 * a chance that an artifact will be created. This is true even if both the\n
4342 * "good" and "great" arguments are false. As a total hack, if "great" is\n
4343 * true, then the item gets 3 extra "attempts" to become an artifact.\n
4345 void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
4347 int i, rolls, f1, f2, power;
4349 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4351 /* Maximum "level" for various things */
4352 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4354 /* Base chance of being "good" */
4357 /* Maximal chance of being "good" */
4358 if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4360 /* Base chance of being "great" */
4363 /* Maximal chance of being "great" */
4364 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4365 f2 = d_info[dungeon_type].obj_great;
4367 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4372 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4381 /* Roll for "good" */
4382 if ((mode & AM_GOOD) || magik(f1))
4387 /* Roll for "great" */
4388 if ((mode & AM_GREAT) || magik(f2))
4392 /* Roll for "special" */
4393 if (mode & AM_SPECIAL) power = 3;
4397 /* Roll for "cursed" */
4400 /* Assume "cursed" */
4403 /* Roll for "broken" */
4404 if (magik(f2)) power = -2;
4408 if (mode & AM_CURSED)
4410 /* Assume 'cursed' */
4415 /* Everything else gets more badly cursed */
4422 /* Assume no rolls */
4425 /* Get one roll if excellent */
4426 if (power >= 2) rolls = 1;
4428 /* Hack -- Get four rolls if forced great or special */
4429 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4431 /* Hack -- Get no rolls if not allowed */
4432 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4434 /* Roll for artifacts if allowed */
4435 for (i = 0; i < rolls; i++)
4437 /* Roll for an artifact */
4438 if (make_artifact(o_ptr)) break;
4439 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4441 if (make_artifact(o_ptr)) break;
4446 /* Hack -- analyze artifacts */
4447 if (object_is_fixed_artifact(o_ptr))
4449 artifact_type *a_ptr = &a_info[o_ptr->name1];
4451 /* Hack -- Mark the artifact as "created" */
4454 /* Hack -- Memorize location of artifact in saved floors */
4455 if (character_dungeon)
4456 a_ptr->floor_id = p_ptr->floor_id;
4458 /* Extract the other fields */
4459 o_ptr->pval = a_ptr->pval;
4460 o_ptr->ac = a_ptr->ac;
4461 o_ptr->dd = a_ptr->dd;
4462 o_ptr->ds = a_ptr->ds;
4463 o_ptr->to_a = a_ptr->to_a;
4464 o_ptr->to_h = a_ptr->to_h;
4465 o_ptr->to_d = a_ptr->to_d;
4466 o_ptr->weight = a_ptr->weight;
4467 o_ptr->xtra2 = a_ptr->act_idx;
4469 if (o_ptr->name1 == ART_MILIM)
4471 if(p_ptr->pseikaku == SEIKAKU_SEXY)
4477 /* Hack -- extract the "broken" flag */
4478 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4480 /* Hack -- extract the "cursed" flag */
4481 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4482 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4483 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4484 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4485 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4486 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4494 switch (o_ptr->tval)
4503 if (power) a_m_aux_1(o_ptr, lev, power);
4509 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4515 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4529 /* Elven Cloak and Black Clothes ... */
4530 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4531 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4532 o_ptr->pval = randint1(4);
4536 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4537 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4538 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4539 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4540 a_m_aux_2(o_ptr, lev, power);
4542 if (power) a_m_aux_2(o_ptr, lev, power);
4550 if (!power && (randint0(100) < 50)) power = -1;
4551 a_m_aux_3(o_ptr, lev, power);
4557 a_m_aux_4(o_ptr, lev, power);
4562 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4563 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4564 (p_ptr->pseikaku == SEIKAKU_SEXY))
4567 add_flag(o_ptr->art_flags, TR_STR);
4568 add_flag(o_ptr->art_flags, TR_INT);
4569 add_flag(o_ptr->art_flags, TR_WIS);
4570 add_flag(o_ptr->art_flags, TR_DEX);
4571 add_flag(o_ptr->art_flags, TR_CON);
4572 add_flag(o_ptr->art_flags, TR_CHR);
4575 /* Hack -- analyze ego-items */
4576 if (object_is_ego(o_ptr))
4578 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4580 /* Hack -- acquire "broken" flag */
4581 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4583 /* Hack -- acquire "cursed" flag */
4584 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4585 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4586 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4587 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4588 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4589 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4591 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4592 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4593 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4594 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4595 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4596 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4597 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4598 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4604 while (one_in_(o_ptr->dd));
4606 if (o_ptr->dd > 9) o_ptr->dd = 9;
4609 /* Hack -- apply activatin index if needed */
4610 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
4612 /* Hack -- apply extra penalties if needed */
4613 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4615 /* Hack -- obtain bonuses */
4616 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4617 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4618 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4620 /* Hack -- obtain pval */
4621 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4624 /* Hack -- apply extra bonuses if needed */
4627 /* Hack -- obtain bonuses */
4628 if (e_ptr->max_to_h)
4630 if (e_ptr->max_to_h > 127)
4631 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4632 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4634 if (e_ptr->max_to_d)
4636 if (e_ptr->max_to_d > 127)
4637 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4638 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4640 if (e_ptr->max_to_a)
4642 if (e_ptr->max_to_a > 127)
4643 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4644 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4647 /* Accuracy ego must have high to_h */
4648 if(o_ptr->name2 == EGO_ACCURACY)
4650 while(o_ptr->to_h < o_ptr->to_d + 10)
4655 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4658 /* Accuracy ego must have high to_h */
4659 if(o_ptr->name2 == EGO_VELOCITY)
4661 while(o_ptr->to_d < o_ptr->to_h + 10)
4666 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4669 /* Protection ego must have high to_a */
4670 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4672 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4675 /* Hack -- obtain pval */
4676 if (e_ptr->max_pval)
4678 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4681 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4683 else if (o_ptr->name2 == EGO_DEMON)
4685 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4687 o_ptr->pval += randint1(2);
4691 o_ptr->pval += randint1(e_ptr->max_pval);
4694 else if (o_ptr->name2 == EGO_ATTACKS)
4696 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4697 if (o_ptr->pval > 3) o_ptr->pval = 3;
4698 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4699 o_ptr->pval += randint1(2);
4701 else if (o_ptr->name2 == EGO_BAT)
4703 o_ptr->pval = randint1(e_ptr->max_pval);
4704 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4706 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4708 o_ptr->pval = randint1(e_ptr->max_pval);
4712 o_ptr->pval += randint1(e_ptr->max_pval);
4717 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4719 o_ptr->pval = randint1(o_ptr->pval);
4721 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4729 /* Examine real objects */
4732 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4734 /* Hack -- acquire "broken" flag */
4735 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4737 /* Hack -- acquire "cursed" flag */
4738 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4739 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4740 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4741 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4742 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4743 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4751 * @brief ベースアイテムが上質として扱われるかどうかを返す。
4752 * Hack -- determine if a template is "good"
4753 * @param k_idx 判定したいベースアイテムのID
4754 * @return ベースアイテムが上質ならばTRUEを返す。
4756 static bool kind_is_good(KIND_OBJECT_IDX k_idx)
4758 object_kind *k_ptr = &k_info[k_idx];
4760 /* Analyze the item type */
4761 switch (k_ptr->tval)
4763 /* Armor -- Good unless damaged */
4774 if (k_ptr->to_a < 0) return (FALSE);
4778 /* Weapons -- Good unless damaged */
4785 if (k_ptr->to_h < 0) return (FALSE);
4786 if (k_ptr->to_d < 0) return (FALSE);
4790 /* Ammo -- Arrows/Bolts are good */
4797 /* Books -- High level books are good (except Arcane books) */
4799 case TV_SORCERY_BOOK:
4800 case TV_NATURE_BOOK:
4805 case TV_DAEMON_BOOK:
4806 case TV_CRUSADE_BOOK:
4808 case TV_HISSATSU_BOOK:
4811 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4815 /* Rings -- Rings of Speed are good */
4818 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4819 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4823 /* Amulets -- Amulets of the Magi and Resistance are good */
4826 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4827 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4832 /* Assume not good */
4837 * @brief 生成階に応じたベースアイテムの生成を行う。
4838 * Attempt to make an object (normal or good/great)
4839 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4840 * @param mode オプションフラグ
4841 * @return 生成に成功したらTRUEを返す。
4843 * This routine plays nasty games to generate the "special artifacts".\n
4844 * This routine uses "object_level" for the "generation level".\n
4845 * We assume that the given object has been "wiped".\n
4847 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
4852 /* Chance of "special object" */
4853 prob = ((mode & AM_GOOD) ? 10 : 1000);
4855 /* Base level for the object */
4856 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4859 /* Generate a special object, or a normal object */
4860 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4865 if ((mode & AM_GOOD) && !get_obj_num_hook)
4867 /* Activate restriction (if already specified, use that) */
4868 get_obj_num_hook = kind_is_good;
4871 /* Restricted objects - prepare allocation table */
4872 if (get_obj_num_hook) get_obj_num_prep();
4874 /* Pick a random object */
4875 k_idx = get_obj_num(base);
4877 /* Restricted objects */
4878 if (get_obj_num_hook)
4880 /* Clear restriction */
4881 get_obj_num_hook = NULL;
4883 /* Reset allocation table to default */
4887 /* Handle failure */
4888 if (!k_idx) return (FALSE);
4890 /* Prepare the object */
4891 object_prep(j_ptr, k_idx);
4894 /* Apply magic (allow artifacts) */
4895 apply_magic(j_ptr, object_level, mode);
4897 /* Hack -- generate multiple spikes/missiles */
4898 switch (j_ptr->tval)
4906 j_ptr->number = (byte)damroll(6, 7);
4910 if (cheat_peek) object_mention(j_ptr);
4918 * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
4919 * Attempt to place an object (normal or good/great) at the given location.
4920 * @param y 配置したいフロアのY座標
4921 * @param x 配置したいフロアのX座標
4922 * @param mode オプションフラグ
4923 * @return 生成に成功したらTRUEを返す。
4925 * This routine plays nasty games to generate the "special artifacts".\n
4926 * This routine uses "object_level" for the "generation level".\n
4927 * This routine requires a clean floor grid destination.\n
4929 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
4934 cave_type *c_ptr = &cave[y][x];
4940 /* Paranoia -- check bounds */
4941 if (!in_bounds(y, x)) return;
4943 /* Require floor space */
4944 if (!cave_drop_bold(y, x)) return;
4946 /* Avoid stacking on other objects */
4947 if (c_ptr->o_idx) return;
4950 /* Get local object */
4953 /* Wipe the object */
4956 /* Make an object (if possible) */
4957 if (!make_object(q_ptr, mode)) return;
4960 /* Make an object */
4968 /* Acquire object */
4969 o_ptr = &o_list[o_idx];
4971 /* Structure Copy */
4972 object_copy(o_ptr, q_ptr);
4979 o_ptr->next_o_idx = c_ptr->o_idx;
4981 /* Place the object */
4982 c_ptr->o_idx = o_idx;
4992 /* Hack -- Preserve artifacts */
4993 if (object_is_fixed_artifact(q_ptr))
4995 a_info[q_ptr->name1].cur_num = 0;
5002 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
5003 * Make a treasure object
5004 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
5005 * @return 生成に成功したらTRUEを返す。
5007 * The location must be a legal, clean, floor grid.
5009 bool make_gold(object_type *j_ptr)
5014 /* Hack -- Pick a Treasure variety */
5015 i = ((randint1(object_level + 2) + 2) / 2) - 1;
5017 /* Apply "extra" magic */
5018 if (one_in_(GREAT_OBJ))
5020 i += randint1(object_level + 1);
5023 /* Hack -- Creeping Coins only generate "themselves" */
5024 if (coin_type) i = coin_type;
5026 /* Do not create "illegal" Treasure Types */
5027 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
5029 /* Prepare a gold object */
5030 object_prep(j_ptr, OBJ_GOLD_LIST + i);
5032 /* Hack -- Base coin cost */
5033 base = k_info[OBJ_GOLD_LIST + i].cost;
5035 /* Determine how much the treasure is "worth" */
5036 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
5044 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
5045 * Places a treasure (Gold or Gems) at given location
5046 * @param y 配置したいフロアのY座標
5047 * @param x 配置したいフロアのX座標
5048 * @return 生成に成功したらTRUEを返す。
5050 * The location must be a legal, clean, floor grid.
5052 void place_gold(POSITION y, POSITION x)
5057 cave_type *c_ptr = &cave[y][x];
5063 /* Paranoia -- check bounds */
5064 if (!in_bounds(y, x)) return;
5066 /* Require floor space */
5067 if (!cave_drop_bold(y, x)) return;
5069 /* Avoid stacking on other objects */
5070 if (c_ptr->o_idx) return;
5073 /* Get local object */
5076 /* Wipe the object */
5079 /* Make some gold */
5080 if (!make_gold(q_ptr)) return;
5082 /* Make an object */
5090 /* Acquire object */
5091 o_ptr = &o_list[o_idx];
5093 /* Copy the object */
5094 object_copy(o_ptr, q_ptr);
5101 o_ptr->next_o_idx = c_ptr->o_idx;
5103 /* Place the object */
5104 c_ptr->o_idx = o_idx;
5116 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
5117 * Let an object fall to the ground at or near a location.
5118 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
5119 * @param chance ドロップの成功率(%)
5120 * @param y 配置したいフロアのY座標
5121 * @param x 配置したいフロアのX座標
5122 * @return 生成に成功したらオブジェクトのIDを返す。
5124 * The initial location is assumed to be "in_bounds()".\n
5126 * This function takes a parameter "chance". This is the percentage\n
5127 * chance that the item will "disappear" instead of drop. If the object\n
5128 * has been thrown, then this is the chance of disappearance on contact.\n
5130 * Hack -- this function uses "chance" to determine if it should produce\n
5131 * some form of "description" of the drop event (under the player).\n
5133 * We check several locations to see if we can find a location at which\n
5134 * the object can combine, stack, or be placed. Artifacts will try very\n
5135 * hard to be placed, including "teleporting" to a useful grid if needed.\n
5137 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
5144 POSITION ty, tx = 0;
5146 OBJECT_IDX o_idx = 0;
5147 OBJECT_IDX this_o_idx, next_o_idx = 0;
5151 char o_name[MAX_NLEN];
5157 /* Extract plural */
5158 bool plural = (j_ptr->number != 1);
5161 /* Describe object */
5162 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5165 /* Handle normal "breakage" */
5166 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
5170 msg_format("%sは消えた。", o_name);
5172 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5175 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
5192 /* Scan local grids */
5193 for (dy = -3; dy <= 3; dy++)
5195 /* Scan local grids */
5196 for (dx = -3; dx <= 3; dx++)
5200 /* Calculate actual distance */
5201 d = (dy * dy) + (dx * dx);
5203 /* Ignore distant grids */
5204 if (d > 10) continue;
5210 /* Skip illegal grids */
5211 if (!in_bounds(ty, tx)) continue;
5213 /* Require line of projection */
5214 if (!projectable(y, x, ty, tx)) continue;
5217 c_ptr = &cave[ty][tx];
5219 /* Require floor space */
5220 if (!cave_drop_bold(ty, tx)) continue;
5225 /* Scan objects in that grid */
5226 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5230 /* Acquire object */
5231 o_ptr = &o_list[this_o_idx];
5233 /* Acquire next object */
5234 next_o_idx = o_ptr->next_o_idx;
5236 /* Check for possible combination */
5237 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5243 /* Add new object */
5247 if (k > 99) continue;
5249 /* Calculate score */
5250 s = 1000 - (d + k * 5);
5252 /* Skip bad values */
5253 if (s < bs) continue;
5255 /* New best value */
5258 /* Apply the randomizer to equivalent values */
5259 if ((++bn >= 2) && !one_in_(bn)) continue;
5274 /* Handle lack of space */
5275 if (!flag && !object_is_artifact(j_ptr))
5279 msg_format("%sは消えた。", o_name);
5281 msg_format("The %s disappear%s.",
5282 o_name, (plural ? "" : "s"));
5287 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5295 for (i = 0; !flag && (i < 1000); i++)
5298 ty = rand_spread(by, 1);
5299 tx = rand_spread(bx, 1);
5301 /* Verify location */
5302 if (!in_bounds(ty, tx)) continue;
5304 /* Bounce to that location */
5308 /* Require floor space */
5309 if (!cave_drop_bold(by, bx)) continue;
5318 int candidates = 0, pick;
5320 for (ty = 1; ty < cur_hgt - 1; ty++)
5322 for (tx = 1; tx < cur_wid - 1; tx++)
5324 /* A valid space found */
5325 if (cave_drop_bold(ty, tx)) candidates++;
5329 /* No valid place! */
5334 msg_format("%sは消えた。", o_name);
5336 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5340 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5342 /* Mega-Hack -- preserve artifacts */
5345 /* Hack -- Preserve unknown artifacts */
5346 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5348 /* Mega-Hack -- Preserve the artifact */
5349 a_info[j_ptr->name1].cur_num = 0;
5357 /* Choose a random one */
5358 pick = randint1(candidates);
5360 for (ty = 1; ty < cur_hgt - 1; ty++)
5362 for (tx = 1; tx < cur_wid - 1; tx++)
5364 if (cave_drop_bold(ty, tx))
5368 /* Is this a picked one? */
5382 c_ptr = &cave[by][bx];
5384 /* Scan objects in that grid for combination */
5385 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5389 /* Acquire object */
5390 o_ptr = &o_list[this_o_idx];
5392 /* Acquire next object */
5393 next_o_idx = o_ptr->next_o_idx;
5395 /* Check for combination */
5396 if (object_similar(o_ptr, j_ptr))
5398 /* Combine the items */
5399 object_absorb(o_ptr, j_ptr);
5409 /* Get new object */
5410 if (!done) o_idx = o_pop();
5413 if (!done && !o_idx)
5417 msg_format("%sは消えた。", o_name);
5419 msg_format("The %s disappear%s.",
5420 o_name, (plural ? "" : "s"));
5425 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5427 /* Hack -- Preserve artifacts */
5428 if (object_is_fixed_artifact(j_ptr))
5430 a_info[j_ptr->name1].cur_num = 0;
5440 /* Structure copy */
5441 object_copy(&o_list[o_idx], j_ptr);
5443 /* Access new object */
5444 j_ptr = &o_list[o_idx];
5451 j_ptr->held_m_idx = 0;
5454 j_ptr->next_o_idx = c_ptr->o_idx;
5456 /* Place the object */
5457 c_ptr->o_idx = o_idx;
5471 /* Mega-Hack -- no message if "dropped" by player */
5472 /* Message when an object falls under the player */
5473 if (chance && player_bold(by, bx))
5475 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5487 * Scatter some "great" objects near the player
5488 * @param y1 配置したいフロアのY座標
5489 * @param x1 配置したいフロアのX座標
5490 * @param num 獲得の処理回数
5491 * @param great TRUEならば必ず高級品以上を落とす
5492 * @param special TRUEならば必ず特別品を落とす
5493 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5496 void acquirement(POSITION y1, POSITION x1, int num, bool great, bool special, bool known)
5499 object_type object_type_body;
5500 BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ;
5505 /* Get local object */
5506 i_ptr = &object_type_body;
5508 /* Wipe the object */
5511 /* Make a good (or great) object (if possible) */
5512 if (!make_object(i_ptr, mode)) continue;
5516 object_aware(i_ptr);
5517 object_known(i_ptr);
5520 /* Drop the object */
5521 (void)drop_near(i_ptr, -1, y1, x1);
5526 * Scatter some "amusing" objects near the player
5529 #define AMS_NOTHING 0x00 /* No restriction */
5530 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
5531 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
5532 #define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */
5533 #define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */
5537 OBJECT_TYPE_VALUE tval;
5538 OBJECT_SUBTYPE_VALUE sval;
5543 amuse_type amuse_info[] =
5545 { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
5546 { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
5547 { TV_SPIKE, SV_ANY, 10, AMS_PILE },
5548 { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
5549 { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
5550 { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
5551 { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
5552 { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
5553 { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
5554 { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
5555 { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
5556 { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
5557 { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
5564 * @param y1 配置したいフロアのY座標
5565 * @param x1 配置したいフロアのX座標
5566 * @param num 誰得の処理回数
5567 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5570 void amusement(POSITION y1, POSITION x1, int num, bool known)
5573 object_type object_type_body;
5576 for (n = 0; amuse_info[n].tval != 0; n++)
5578 t += amuse_info[n].prob;
5585 IDX k_idx, a_idx = 0;
5586 int r = randint0(t);
5587 bool insta_art, fixed_art;
5591 r -= amuse_info[i].prob;
5595 /* Get local object */
5596 i_ptr = &object_type_body;
5598 /* Wipe the object */
5601 /* Wipe the object */
5602 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
5604 /* Paranoia - reroll if nothing */
5605 if (!k_idx) continue;
5607 /* Search an artifact index if need */
5608 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
5609 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
5611 if (insta_art || fixed_art)
5613 for (a_idx = 1; a_idx < max_a_idx; a_idx++)
5615 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
5616 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
5617 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
5618 if (a_info[a_idx].cur_num > 0) continue;
5622 if (a_idx >= max_a_idx) continue;
5625 /* Make an object (if possible) */
5626 object_prep(i_ptr, k_idx);
5627 if (a_idx) i_ptr->name1 = a_idx;
5628 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
5630 if (amuse_info[i].flag & AMS_NO_UNIQUE)
5632 if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
5635 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
5636 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
5640 object_aware(i_ptr);
5641 object_known(i_ptr);
5644 /* Paranoia - reroll if nothing */
5645 if (!(i_ptr->k_idx)) continue;
5647 /* Drop the object */
5648 (void)drop_near(i_ptr, -1, y1, x1);
5656 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5657 * Describe the charges on an item in the inventory.
5658 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5661 void inven_item_charges(INVENTORY_IDX item)
5663 object_type *o_ptr = &inventory[item];
5665 /* Require staff/wand */
5666 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5668 /* Require known item */
5669 if (!object_is_known(o_ptr)) return;
5672 if (o_ptr->pval <= 0)
5674 msg_print("もう魔力が残っていない。");
5678 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5681 /* Multiple charges */
5682 if (o_ptr->pval != 1)
5684 /* Print a message */
5685 msg_format("You have %d charges remaining.", o_ptr->pval);
5691 /* Print a message */
5692 msg_format("You have %d charge remaining.", o_ptr->pval);
5699 * @brief アイテムの残り所持数メッセージを表示する /
5700 * Describe an item in the inventory.
5701 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5704 void inven_item_describe(INVENTORY_IDX item)
5706 object_type *o_ptr = &inventory[item];
5707 char o_name[MAX_NLEN];
5709 /* Get a description */
5710 object_desc(o_name, o_ptr, 0);
5712 /* Print a message */
5714 /* "no more" の場合はこちらで表示する */
5715 if (o_ptr->number <= 0)
5717 /*FIRST*//*ここはもう通らないかも */
5718 msg_format("もう%sを持っていない。", o_name);
5722 /* アイテム名を英日切り替え機能対応 */
5723 msg_format("まだ %sを持っている。", o_name);
5726 msg_format("You have %s.", o_name);
5732 * @brief アイテムの残り所持数メッセージを表示する /
5733 * Increase the "number" of an item in the inventory
5734 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5738 void inven_item_increase(INVENTORY_IDX item, int num)
5740 object_type *o_ptr = &inventory[item];
5743 num += o_ptr->number;
5746 if (num > 255) num = 255;
5747 else if (num < 0) num = 0;
5750 num -= (ITEM_NUMBER)o_ptr->number;
5752 /* Change the number and weight */
5755 /* Add the number */
5756 o_ptr->number += num;
5758 /* Add the weight */
5759 p_ptr->total_weight += (num * o_ptr->weight);
5761 /* Recalculate bonuses */
5762 p_ptr->update |= (PU_BONUS);
5764 /* Recalculate mana XXX */
5765 p_ptr->update |= (PU_MANA);
5767 /* Combine the pack */
5768 p_ptr->notice |= (PN_COMBINE);
5771 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5773 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5774 if (!o_ptr->number && p_ptr->ele_attack)
5776 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5778 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5780 /* Clear all temporary elemental brands */
5781 set_ele_attack(0, 0);
5789 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5790 * Erase an inventory slot if it has no more items
5791 * @param item 消去したいプレイヤーのアイテム所持スロット
5794 void inven_item_optimize(INVENTORY_IDX item)
5796 object_type *o_ptr = &inventory[item];
5798 /* Only optimize real items */
5799 if (!o_ptr->k_idx) return;
5801 /* Only optimize empty items */
5802 if (o_ptr->number) return;
5804 /* The item is in the pack */
5805 if (item < INVEN_RARM)
5812 /* Slide everything down */
5813 for (i = item; i < INVEN_PACK; i++)
5815 /* Structure copy */
5816 inventory[i] = inventory[i+1];
5819 /* Erase the "final" slot */
5820 object_wipe(&inventory[i]);
5823 p_ptr->window |= (PW_INVEN);
5826 /* The item is being wielded */
5832 /* Erase the empty slot */
5833 object_wipe(&inventory[item]);
5835 /* Recalculate bonuses */
5836 p_ptr->update |= (PU_BONUS);
5838 /* Recalculate torch */
5839 p_ptr->update |= (PU_TORCH);
5841 /* Recalculate mana XXX */
5842 p_ptr->update |= (PU_MANA);
5845 p_ptr->window |= (PW_EQUIP);
5849 p_ptr->window |= (PW_SPELL);
5853 * @brief 床上の魔道具の残り残量メッセージを表示する /
5854 * Describe the charges on an item on the floor.
5855 * @param item メッセージの対象にしたいアイテム所持スロット
5858 void floor_item_charges(INVENTORY_IDX item)
5860 object_type *o_ptr = &o_list[item];
5862 /* Require staff/wand */
5863 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5865 /* Require known item */
5866 if (!object_is_known(o_ptr)) return;
5869 if (o_ptr->pval <= 0)
5871 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5875 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5878 /* Multiple charges */
5879 if (o_ptr->pval != 1)
5881 /* Print a message */
5882 msg_format("There are %d charges remaining.", o_ptr->pval);
5888 /* Print a message */
5889 msg_format("There is %d charge remaining.", o_ptr->pval);
5896 * @brief 床上のアイテムの残り数メッセージを表示する /
5897 * Describe the charges on an item on the floor.
5898 * @param item メッセージの対象にしたいアイテム所持スロット
5901 void floor_item_describe(INVENTORY_IDX item)
5903 object_type *o_ptr = &o_list[item];
5904 char o_name[MAX_NLEN];
5906 /* Get a description */
5907 object_desc(o_name, o_ptr, 0);
5909 /* Print a message */
5911 /* "no more" の場合はこちらで表示を分ける */
5912 if (o_ptr->number <= 0)
5914 msg_format("床上には、もう%sはない。", o_name);
5918 msg_format("床上には、まだ %sがある。", o_name);
5921 msg_format("You see %s.", o_name);
5928 * @brief 床上のアイテムの数を増やす /
5929 * Increase the "number" of an item on the floor
5930 * @param item 増やしたいアイテムの所持スロット
5931 * @param num 増やしたいアイテムの数
5934 void floor_item_increase(INVENTORY_IDX item, int num)
5936 object_type *o_ptr = &o_list[item];
5939 num += o_ptr->number;
5942 if (num > 255) num = 255;
5943 else if (num < 0) num = 0;
5946 num -= (int)o_ptr->number;
5948 /* Change the number */
5949 o_ptr->number += (ITEM_NUMBER)num;
5954 * @brief 床上の数の無くなったアイテムスロットを消去する /
5955 * Optimize an item on the floor (destroy "empty" items)
5956 * @param item 消去したいアイテムの所持スロット
5959 void floor_item_optimize(INVENTORY_IDX item)
5961 object_type *o_ptr = &o_list[item];
5963 /* Paranoia -- be sure it exists */
5964 if (!o_ptr->k_idx) return;
5966 /* Only optimize empty items */
5967 if (o_ptr->number) return;
5969 /* Delete the object */
5970 delete_object_idx(item);
5975 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5976 * Check if we have space for an item in the pack without overflow
5977 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5978 * @return 溢れずに済むならTRUEを返す
5980 bool inven_carry_okay(object_type *o_ptr)
5985 if (inven_cnt < INVEN_PACK) return (TRUE);
5988 for (j = 0; j < INVEN_PACK; j++)
5990 object_type *j_ptr = &inventory[j];
5992 /* Skip non-objects */
5993 if (!j_ptr->k_idx) continue;
5995 /* Check if the two items can be combined */
5996 if (object_similar(j_ptr, o_ptr)) return (TRUE);
6004 * @brief オブジェクトを定義された基準に従いソートするための関数 /
6005 * Check if we have space for an item in the pack without overflow
6006 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
6007 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
6008 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
6009 * @return o_ptrの方が上位ならばTRUEを返す。
6011 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
6015 /* Use empty slots */
6016 if (!j_ptr->k_idx) return TRUE;
6018 /* Hack -- readable books always come first */
6019 if ((o_ptr->tval == REALM1_BOOK) &&
6020 (j_ptr->tval != REALM1_BOOK)) return TRUE;
6021 if ((j_ptr->tval == REALM1_BOOK) &&
6022 (o_ptr->tval != REALM1_BOOK)) return FALSE;
6024 if ((o_ptr->tval == REALM2_BOOK) &&
6025 (j_ptr->tval != REALM2_BOOK)) return TRUE;
6026 if ((j_ptr->tval == REALM2_BOOK) &&
6027 (o_ptr->tval != REALM2_BOOK)) return FALSE;
6029 /* Objects sort by decreasing type */
6030 if (o_ptr->tval > j_ptr->tval) return TRUE;
6031 if (o_ptr->tval < j_ptr->tval) return FALSE;
6033 /* Non-aware (flavored) items always come last */
6034 /* Can happen in the home */
6035 if (!object_is_aware(o_ptr)) return FALSE;
6036 if (!object_is_aware(j_ptr)) return TRUE;
6038 /* Objects sort by increasing sval */
6039 if (o_ptr->sval < j_ptr->sval) return TRUE;
6040 if (o_ptr->sval > j_ptr->sval) return FALSE;
6042 /* Unidentified objects always come last */
6043 /* Objects in the home can be unknown */
6044 if (!object_is_known(o_ptr)) return FALSE;
6045 if (!object_is_known(j_ptr)) return TRUE;
6047 /* Fixed artifacts, random artifacts and ego items */
6048 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
6049 else if (o_ptr->art_name) o_type = 2;
6050 else if (object_is_ego(o_ptr)) o_type = 1;
6053 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
6054 else if (j_ptr->art_name) j_type = 2;
6055 else if (object_is_ego(j_ptr)) j_type = 1;
6058 if (o_type < j_type) return TRUE;
6059 if (o_type > j_type) return FALSE;
6061 switch (o_ptr->tval)
6067 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
6068 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
6074 /* Objects sort by increasing hit/damage bonuses */
6075 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
6076 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
6079 /* Hack: otherwise identical rods sort by
6080 increasing recharge time --dsb */
6082 if (o_ptr->pval < j_ptr->pval) return TRUE;
6083 if (o_ptr->pval > j_ptr->pval) return FALSE;
6087 /* Objects sort by decreasing value */
6088 return o_value > object_value(j_ptr);
6093 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
6094 * Add an item to the players inventory, and return the slot used.
6095 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
6096 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6098 * If the new item can combine with an existing item in the inventory,\n
6099 * it will do so, using "object_similar()" and "object_absorb()", else,\n
6100 * the item will be placed into the "proper" location in the inventory.\n
6102 * This function can be used to "over-fill" the player's pack, but only\n
6103 * once, and such an action must trigger the "overflow" code immediately.\n
6104 * Note that when the pack is being "over-filled", the new item must be\n
6105 * placed into the "overflow" slot, and the "overflow" must take place\n
6106 * before the pack is reordered, but (optionally) after the pack is\n
6107 * combined. This may be tricky. See "dungeon.c" for info.\n
6109 * Note that this code must remove any location/stack information\n
6110 * from the object once it is placed into the inventory.\n
6112 s16b inven_carry(object_type *o_ptr)
6114 INVENTORY_IDX i, j, k;
6115 INVENTORY_IDX n = -1;
6120 /* Check for combining */
6121 for (j = 0; j < INVEN_PACK; j++)
6123 j_ptr = &inventory[j];
6125 /* Skip non-objects */
6126 if (!j_ptr->k_idx) continue;
6128 /* Hack -- track last item */
6131 /* Check if the two items can be combined */
6132 if (object_similar(j_ptr, o_ptr))
6134 /* Combine the items */
6135 object_absorb(j_ptr, o_ptr);
6137 /* Increase the weight */
6138 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6140 /* Recalculate bonuses */
6141 p_ptr->update |= (PU_BONUS);
6144 p_ptr->window |= (PW_INVEN);
6153 if (inven_cnt > INVEN_PACK) return (-1);
6155 /* Find an empty slot */
6156 for (j = 0; j <= INVEN_PACK; j++)
6158 j_ptr = &inventory[j];
6160 /* Use it if found */
6161 if (!j_ptr->k_idx) break;
6168 /* Reorder the pack */
6171 /* Get the "value" of the item */
6172 s32b o_value = object_value(o_ptr);
6174 /* Scan every occupied slot */
6175 for (j = 0; j < INVEN_PACK; j++)
6177 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6184 for (k = n; k >= i; k--)
6186 /* Hack -- Slide the item */
6187 object_copy(&inventory[k+1], &inventory[k]);
6190 /* Wipe the empty slot */
6191 object_wipe(&inventory[i]);
6196 object_copy(&inventory[i], o_ptr);
6198 /* Access new object */
6199 j_ptr = &inventory[i];
6202 j_ptr->next_o_idx = 0;
6204 /* Forget monster */
6205 j_ptr->held_m_idx = 0;
6207 /* Forget location */
6208 j_ptr->iy = j_ptr->ix = 0;
6210 /* Player touches it, and no longer marked */
6211 j_ptr->marked = OM_TOUCHED;
6213 /* Increase the weight */
6214 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6216 /* Count the items */
6219 /* Recalculate bonuses */
6220 p_ptr->update |= (PU_BONUS);
6222 /* Combine and Reorder pack */
6223 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
6226 p_ptr->window |= (PW_INVEN);
6228 /* Return the slot */
6234 * @brief 装備スロットからオブジェクトを外すメインルーチン /
6235 * Take off (some of) a non-cursed equipment item
6236 * @param item オブジェクトを外したい所持テーブルのID
6238 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6240 * Note that only one item at a time can be wielded per slot.\n
6241 * Note that taking off an item when "full" may cause that item\n
6242 * to fall to the ground.\n
6243 * Return the inventory slot into which the item is placed.\n
6245 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
6256 char o_name[MAX_NLEN];
6259 /* Get the item to take off */
6260 o_ptr = &inventory[item];
6263 if (amt <= 0) return (-1);
6266 if (amt > o_ptr->number) amt = o_ptr->number;
6268 /* Get local object */
6271 /* Obtain a local object */
6272 object_copy(q_ptr, o_ptr);
6274 /* Modify quantity */
6275 q_ptr->number = amt;
6277 /* Describe the object */
6278 object_desc(o_name, q_ptr, 0);
6280 /* Took off weapon */
6281 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
6282 object_is_melee_weapon(o_ptr))
6284 act = _("を装備からはずした", "You were wielding");
6288 else if (item == INVEN_BOW)
6290 act = _("を装備からはずした", "You were holding");
6293 /* Took off light */
6294 else if (item == INVEN_LITE)
6296 act = _("を光源からはずした", "You were holding");
6299 /* Took off something */
6302 act = _("を装備からはずした", "You were wearing");
6305 /* Modify, Optimize */
6306 inven_item_increase(item, -amt);
6307 inven_item_optimize(item);
6309 /* Carry the object */
6310 slot = inven_carry(q_ptr);
6314 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
6316 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6326 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
6327 * Drop (some of) a non-cursed inventory/equipment item
6328 * @param item 所持テーブルのID
6329 * @param amt 落としたい個数
6332 * The object will be dropped "near" the current location
6334 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
6340 char o_name[MAX_NLEN];
6343 /* Access original object */
6344 o_ptr = &inventory[item];
6347 if (amt <= 0) return;
6350 if (amt > o_ptr->number) amt = o_ptr->number;
6353 /* Take off equipment */
6354 if (item >= INVEN_RARM)
6356 /* Take off first */
6357 item = inven_takeoff(item, amt);
6359 /* Access original object */
6360 o_ptr = &inventory[item];
6364 /* Get local object */
6367 /* Obtain local object */
6368 object_copy(q_ptr, o_ptr);
6370 /* Distribute charges of wands or rods */
6371 distribute_charges(o_ptr, q_ptr, amt);
6373 /* Modify quantity */
6374 q_ptr->number = amt;
6376 /* Describe local object */
6377 object_desc(o_name, q_ptr, 0);
6380 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
6382 /* Drop it near the player */
6383 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
6385 /* Modify, Describe, Optimize */
6386 inven_item_increase(item, -amt);
6387 inven_item_describe(item);
6388 inven_item_optimize(item);
6393 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
6394 * Combine items in the pack
6397 * Note special handling of the "overflow" slot
6399 void combine_pack(void)
6404 bool flag = FALSE, combined;
6410 /* Combine the pack (backwards) */
6411 for (i = INVEN_PACK; i > 0; i--)
6414 o_ptr = &inventory[i];
6416 /* Skip empty items */
6417 if (!o_ptr->k_idx) continue;
6419 /* Scan the items above that item */
6420 for (j = 0; j < i; j++)
6425 j_ptr = &inventory[j];
6427 /* Skip empty items */
6428 if (!j_ptr->k_idx) continue;
6431 * Get maximum number of the stack if these
6432 * are similar, get zero otherwise.
6434 max_num = object_similar_part(j_ptr, o_ptr);
6436 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6437 if (max_num && j_ptr->number < max_num)
6439 if (o_ptr->number + j_ptr->number <= max_num)
6444 /* Add together the item counts */
6445 object_absorb(j_ptr, o_ptr);
6447 /* One object is gone */
6450 /* Slide everything down */
6451 for (k = i; k < INVEN_PACK; k++)
6453 /* Structure copy */
6454 inventory[k] = inventory[k+1];
6457 /* Erase the "final" slot */
6458 object_wipe(&inventory[k]);
6462 int old_num = o_ptr->number;
6463 int remain = j_ptr->number + o_ptr->number - max_num;
6465 o_ptr->number -= remain;
6467 /* Add together the item counts */
6468 object_absorb(j_ptr, o_ptr);
6470 o_ptr->number = remain;
6472 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6473 if (o_ptr->tval == TV_ROD)
6475 o_ptr->pval = o_ptr->pval * remain / old_num;
6476 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6479 /* Hack -- if wands are stacking, combine the charges. -LM- */
6480 if (o_ptr->tval == TV_WAND)
6482 o_ptr->pval = o_ptr->pval * remain / old_num;
6487 p_ptr->window |= (PW_INVEN);
6501 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6505 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6506 * Reorder items in the pack
6509 * Note special handling of the "overflow" slot
6511 void reorder_pack(void)
6521 /* Re-order the pack (forwards) */
6522 for (i = 0; i < INVEN_PACK; i++)
6524 /* Mega-Hack -- allow "proper" over-flow */
6525 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6528 o_ptr = &inventory[i];
6530 /* Skip empty slots */
6531 if (!o_ptr->k_idx) continue;
6533 /* Get the "value" of the item */
6534 o_value = object_value(o_ptr);
6536 /* Scan every occupied slot */
6537 for (j = 0; j < INVEN_PACK; j++)
6539 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6542 /* Never move down */
6543 if (j >= i) continue;
6548 /* Get local object */
6551 /* Save a copy of the moving item */
6552 object_copy(q_ptr, &inventory[i]);
6554 /* Slide the objects */
6555 for (k = i; k > j; k--)
6557 /* Slide the item */
6558 object_copy(&inventory[k], &inventory[k-1]);
6561 /* Insert the moving item */
6562 object_copy(&inventory[j], q_ptr);
6565 p_ptr->window |= (PW_INVEN);
6569 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6573 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6574 * Hack -- display an object kind in the current window
6575 * @param k_idx ベースアイテムの参照ID
6578 * Include list of usable spells for readible books
6580 void display_koff(IDX k_idx)
6587 REALM_IDX use_realm;
6589 char o_name[MAX_NLEN];
6592 /* Erase the window */
6593 for (y = 0; y < Term->hgt; y++)
6595 /* Erase the line */
6596 Term_erase(0, y, 255);
6602 /* Get local object */
6605 /* Prepare the object */
6606 object_prep(q_ptr, k_idx);
6609 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6611 /* Mention the object name */
6612 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6614 /* Access the item's sval */
6616 use_realm = tval2realm(q_ptr->tval);
6618 /* Warriors are illiterate */
6619 if (p_ptr->realm1 || p_ptr->realm2)
6621 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6625 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6626 if (!is_magic(use_realm)) return;
6627 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6630 /* Display spells in readible books */
6634 SPELL_IDX spells[64];
6636 /* Extract spells */
6637 for (spell = 0; spell < 32; spell++)
6639 /* Check for this spell */
6640 if (fake_spell_flags[sval] & (1L << spell))
6642 /* Collect this spell */
6643 spells[num++] = spell;
6648 print_spells(0, spells, num, 2, 0, use_realm);
6653 * @brief 警告を放つアイテムを選択する /
6654 * Choose one of items that have warning flag
6655 * Calculate spell damages
6658 object_type *choose_warning_item(void)
6661 int choices[INVEN_TOTAL - INVEN_RARM];
6664 /* Paranoia -- Player has no warning ability */
6665 if (!p_ptr->warning) return NULL;
6667 /* Search Inventory */
6668 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6670 u32b flgs[TR_FLAG_SIZE];
6671 object_type *o_ptr = &inventory[i];
6673 object_flags(o_ptr, flgs);
6674 if (have_flag(flgs, TR_WARNING))
6676 choices[number] = i;
6681 /* Choice one of them */
6682 return number ? &inventory[choices[randint0(number)]] : NULL;
6686 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6687 * Calculate spell damages
6688 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6689 * @param typ 効果属性のID
6691 * @param max 算出した最大ダメージを返すポインタ
6694 static void spell_damcalc(monster_type *m_ptr, int typ, HIT_POINT dam, int *max)
6696 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6697 int rlev = r_ptr->level;
6698 bool ignore_wraith_form = FALSE;
6700 /* Vulnerability, resistance and immunity */
6704 if (p_ptr->immune_elec)
6707 ignore_wraith_form = TRUE;
6711 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6712 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6713 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6714 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6715 if (IS_OPPOSE_ELEC())
6716 dam = (dam + 2) / 3;
6721 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6722 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6726 if (p_ptr->immune_acid)
6729 ignore_wraith_form = TRUE;
6733 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6734 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6735 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6736 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6742 if (p_ptr->immune_cold)
6745 ignore_wraith_form = TRUE;
6749 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6750 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6751 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6752 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6757 if (p_ptr->immune_fire)
6760 ignore_wraith_form = TRUE;
6764 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6765 if (prace_is_(RACE_ENT)) dam += dam / 3;
6766 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6767 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6768 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6773 ignore_wraith_form = TRUE;
6777 if (!p_ptr->blind &&
6778 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6779 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6782 ignore_wraith_form = TRUE;
6787 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6788 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6789 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6792 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6793 * "dam *= 2;" for later "dam /= 2"
6795 if (p_ptr->wraith_form) dam *= 2;
6799 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6802 ignore_wraith_form = TRUE;
6804 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6808 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6812 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6816 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6820 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6824 if (prace_is_(RACE_SPECTRE))
6827 ignore_wraith_form = TRUE;
6829 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6833 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6837 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6841 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6845 if (p_ptr->levitation) dam = (dam * 2) / 3;
6849 if (p_ptr->resist_shard) dam /= 2;
6853 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6854 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6858 if (p_ptr->mimic_form)
6860 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6863 ignore_wraith_form = TRUE;
6868 switch (p_ptr->prace)
6877 ignore_wraith_form = TRUE;
6884 if (p_ptr->align > 10) dam /= 2;
6885 else if (p_ptr->align < -10) dam *= 2;
6889 if (p_ptr->align > 10) dam *= 2;
6893 case GF_BRAIN_SMASH:
6894 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6897 ignore_wraith_form = TRUE;
6905 if (100 + rlev / 2 <= p_ptr->skill_sav)
6908 ignore_wraith_form = TRUE;
6913 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6916 ignore_wraith_form = TRUE;
6921 if (p_ptr->wraith_form && !ignore_wraith_form)
6927 if (dam > *max) *max = dam;
6931 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6932 * Calculate spell damages
6933 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6934 * @param typ 効果属性のID
6935 * @param m_idx 魔法を行使するモンスターのID
6936 * @param max 算出した最大ダメージを返すポインタ
6939 void spell_damcalc_by_spellnum(int spell_num, int typ, MONSTER_IDX m_idx, int *max)
6941 monster_type *m_ptr = &m_list[m_idx];
6942 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6943 spell_damcalc(m_ptr, typ, dam, max);
6947 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6948 * Calculate blow damages
6949 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6950 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6951 * @return 算出された最大ダメージを返す。
6953 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6955 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6957 bool check_wraith_form = TRUE;
6959 if (blow_ptr->method != RBM_EXPLODE)
6961 int ac = p_ptr->ac + p_ptr->to_a;
6963 switch (blow_ptr->effect)
6967 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6968 dam = MAX(dam, tmp_dam * 2);
6974 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6978 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6980 check_wraith_form = FALSE;
6984 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6986 check_wraith_form = FALSE;
6990 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6992 check_wraith_form = FALSE;
6996 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6998 check_wraith_form = FALSE;
7003 check_wraith_form = FALSE;
7007 if (check_wraith_form && p_ptr->wraith_form)
7015 dam = (dam + 1) / 2;
7016 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
7024 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
7025 * Examine the grid (xx,yy) and warn the player if there are any danger
7026 * @param xx 危険性を調査するマスのX座標
7027 * @param yy 危険性を調査するマスのY座標
7028 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
7030 bool process_warning(int xx, int yy)
7034 char o_name[MAX_NLEN];
7036 #define WARNING_AWARE_RANGE 12
7038 static int old_damage = 0;
7040 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
7042 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
7045 monster_type *m_ptr;
7046 monster_race *r_ptr;
7048 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
7050 c_ptr = &cave[my][mx];
7052 if (!c_ptr->m_idx) continue;
7054 m_ptr = &m_list[c_ptr->m_idx];
7056 if (MON_CSLEEP(m_ptr)) continue;
7057 if (!is_hostile(m_ptr)) continue;
7059 r_ptr = &r_info[m_ptr->r_idx];
7061 /* Monster spells (only powerful ones)*/
7062 if (projectable(my, mx, yy, xx))
7064 u32b f4 = r_ptr->flags4;
7065 u32b f5 = r_ptr->a_ability_flags1;
7066 u32b f6 = r_ptr->a_ability_flags2;
7068 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
7070 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
7071 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
7072 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
7073 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, c_ptr->m_idx, &dam_max0);
7074 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, c_ptr->m_idx, &dam_max0);
7075 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, c_ptr->m_idx, &dam_max0);
7077 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, c_ptr->m_idx, &dam_max0);
7078 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, c_ptr->m_idx, &dam_max0);
7079 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, c_ptr->m_idx, &dam_max0);
7080 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, c_ptr->m_idx, &dam_max0);
7081 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, c_ptr->m_idx, &dam_max0);
7082 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, c_ptr->m_idx, &dam_max0);
7083 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, c_ptr->m_idx, &dam_max0);
7084 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, c_ptr->m_idx, &dam_max0);
7085 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
7086 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, c_ptr->m_idx, &dam_max0);
7087 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, c_ptr->m_idx, &dam_max0);
7088 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
7089 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, c_ptr->m_idx, &dam_max0);
7090 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, c_ptr->m_idx, &dam_max0);
7091 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, c_ptr->m_idx, &dam_max0);
7092 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, c_ptr->m_idx, &dam_max0);
7093 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, c_ptr->m_idx, &dam_max0);
7094 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, c_ptr->m_idx, &dam_max0);
7095 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, c_ptr->m_idx, &dam_max0);
7096 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, c_ptr->m_idx, &dam_max0);
7097 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
7098 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, c_ptr->m_idx, &dam_max0);
7099 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, c_ptr->m_idx, &dam_max0);
7102 /* Monster melee attacks */
7103 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
7105 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
7109 for (m = 0; m < 4; m++)
7111 /* Skip non-attacks */
7112 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
7114 /* Extract the attack info */
7115 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
7116 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
7118 if (dam_melee > dam_max0) dam_max0 = dam_melee;
7122 /* Contribution from this monster */
7123 dam_max += dam_max0;
7127 /* Prevent excessive warning */
7128 if (dam_max > old_damage)
7130 old_damage = dam_max * 3 / 2;
7132 if (dam_max > p_ptr->chp / 2)
7134 object_type *o_ptr = choose_warning_item();
7137 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7139 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7140 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7143 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7146 else old_damage = old_damage / 2;
7148 c_ptr = &cave[yy][xx];
7149 if (((!easy_disarm && is_trap(c_ptr->feat))
7150 || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
7152 object_type *o_ptr = choose_warning_item();
7155 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7157 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7158 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7160 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7167 * エッセンス情報の構造体 / A structure for smithing
7170 int add; /* TR flag number or special essence id */
7171 cptr add_name; /* Name of this ability */
7172 ESSENCE_IDX type; /* Menu number */
7173 int essence; /* Index for carrying essences */
7174 int value; /* Needed value to add this ability */
7179 * エッセンス情報テーブル Smithing type data for Weapon smith
7182 static essence_type essence_info[] =
7184 {TR_STR, "腕力", 4, TR_STR, 20},
7185 {TR_INT, "知能", 4, TR_INT, 20},
7186 {TR_WIS, "賢さ", 4, TR_WIS, 20},
7187 {TR_DEX, "器用さ", 4, TR_DEX, 20},
7188 {TR_CON, "耐久力", 4, TR_CON, 20},
7189 {TR_CHR, "魅力", 4, TR_CHR, 20},
7190 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
7191 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
7192 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
7193 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
7194 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
7195 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
7196 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
7197 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
7198 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
7199 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
7200 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
7201 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
7202 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
7203 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
7204 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
7205 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
7206 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
7207 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
7208 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
7209 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
7210 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
7211 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
7212 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
7213 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
7214 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
7215 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
7216 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
7217 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
7218 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
7219 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
7220 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
7221 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
7222 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
7223 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
7224 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
7225 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
7226 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
7227 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
7228 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
7229 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
7230 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
7231 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
7232 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
7233 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
7234 {TR_SH_FIRE, "", 0, -2, 0},
7235 {TR_SH_ELEC, "", 0, -2, 0},
7236 {TR_SH_COLD, "", 0, -2, 0},
7237 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
7238 {TR_WARNING, "警告", 3, TR_WARNING, 20},
7239 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
7240 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
7241 {TR_LITE_2, "", 0, -2, 0},
7242 {TR_LITE_3, "", 0, -2, 0},
7243 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
7244 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
7245 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
7246 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
7247 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
7249 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
7250 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
7251 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
7252 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
7253 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
7254 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
7255 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
7256 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
7257 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
7258 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
7259 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
7260 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
7261 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
7262 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
7263 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
7264 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
7265 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
7266 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
7268 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
7269 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
7270 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
7271 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
7272 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
7273 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
7274 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
7275 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
7277 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
7278 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
7279 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
7280 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
7281 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
7282 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
7283 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
7284 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
7285 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
7286 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
7287 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
7288 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
7290 {-1, NULL, 0, -1, 0}
7293 static essence_type essence_info[] =
7295 {TR_STR, "strength", 4, TR_STR, 20},
7296 {TR_INT, "intelligence", 4, TR_INT, 20},
7297 {TR_WIS, "wisdom", 4, TR_WIS, 20},
7298 {TR_DEX, "dexterity", 4, TR_DEX, 20},
7299 {TR_CON, "constitution", 4, TR_CON, 20},
7300 {TR_CHR, "charisma", 4, TR_CHR, 20},
7301 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
7302 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
7303 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
7304 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
7305 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
7306 {TR_SPEED, "speed", 4, TR_SPEED, 12},
7307 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
7308 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
7309 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
7310 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
7311 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
7312 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
7313 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
7314 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
7315 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
7316 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
7317 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
7318 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
7319 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
7320 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
7321 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
7322 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
7323 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
7324 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
7325 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
7326 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
7327 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
7328 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
7329 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
7330 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
7331 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
7332 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
7333 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
7334 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
7335 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
7336 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
7337 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
7338 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
7339 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
7340 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
7341 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
7342 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
7343 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
7344 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
7345 {TR_SH_FIRE, "", 0, -2, 0},
7346 {TR_SH_ELEC, "", 0, -2, 0},
7347 {TR_SH_COLD, "", 0, -2, 0},
7348 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
7349 {TR_WARNING, "warning", 3, TR_WARNING, 20},
7350 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
7351 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
7352 {TR_LITE_2, "", 0, -2, 0},
7353 {TR_LITE_3, "", 0, -2, 0},
7354 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7355 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7356 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7357 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7358 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7360 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7361 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7362 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7363 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7364 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7365 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7366 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7367 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7368 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7369 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7370 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7371 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7372 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7373 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
7374 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7375 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7376 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7377 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7379 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7380 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
7381 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
7382 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
7383 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
7384 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
7385 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7386 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7388 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7389 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7390 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7391 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7392 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7393 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7394 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7395 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7396 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7397 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7398 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7399 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7401 {-1, NULL, 0, -1, 0}
7407 * エッセンス名テーブル / Essense names for Weapon smith
7410 cptr essence_name[] =
7513 cptr essence_name[] =
7616 * @brief 所持しているエッセンス一覧を表示する
7619 static void display_essence(void)
7624 for (i = 1; i < 22; i++)
7628 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7629 "Essence Num Essence Num Essence Num "), 1, 8);
7630 for (i = 0; essence_name[i]; i++)
7632 if (!essence_name[i][0]) continue;
7633 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7636 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7646 static void drain_essence(void)
7648 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7652 bool observe = FALSE;
7653 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7654 TIME_EFFECT old_timeout;
7655 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7661 OBJECT_IDX next_o_idx;
7664 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7667 item_tester_hook = object_is_weapon_armour_ammo;
7668 item_tester_no_ryoute = TRUE;
7671 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7672 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7674 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7676 /* Get the item (in the pack) */
7679 o_ptr = &inventory[item];
7682 /* Get the item (on the floor) */
7685 o_ptr = &o_list[0 - item];
7688 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7690 char o_name[MAX_NLEN];
7691 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7692 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7695 p_ptr->energy_use = 100;
7697 object_flags(o_ptr, old_flgs);
7698 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7699 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7700 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7701 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7702 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7703 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7704 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7705 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7706 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7708 old_to_a = o_ptr->to_a;
7710 old_to_h = o_ptr->to_h;
7711 old_to_d = o_ptr->to_d;
7714 old_pval = o_ptr->pval;
7715 old_name2 = o_ptr->name2;
7716 old_timeout = o_ptr->timeout;
7717 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7718 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7719 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7720 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7721 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7722 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7723 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7724 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7725 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7726 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7727 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7728 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7729 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7730 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7731 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7732 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7733 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7734 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7735 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7739 next_o_idx = o_ptr->next_o_idx;
7740 marked = o_ptr->marked;
7741 weight = o_ptr->weight;
7742 number = o_ptr->number;
7744 object_prep(o_ptr, o_ptr->k_idx);
7748 o_ptr->next_o_idx=next_o_idx;
7749 o_ptr->marked=marked;
7750 o_ptr->number = number;
7751 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7752 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7753 o_ptr->ident |= (IDENT_MENTAL);
7754 object_aware(o_ptr);
7755 object_known(o_ptr);
7757 object_flags(o_ptr, new_flgs);
7759 for (i = 0; essence_info[i].add_name; i++)
7761 essence_type *es_ptr = &essence_info[i];
7762 PARAMETER_VALUE pval = 0;
7764 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7765 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7767 if (es_ptr->add < TR_FLAG_MAX &&
7768 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7769 have_flag(old_flgs, es_ptr->add))
7773 drain_value[es_ptr->essence] += 10 * pval;
7775 else if (es_ptr->essence != -2)
7777 drain_value[es_ptr->essence] += 10;
7779 else if (es_ptr->add == TR_SH_FIRE)
7781 drain_value[TR_BRAND_FIRE] += 10;
7782 drain_value[TR_RES_FIRE] += 10;
7784 else if (es_ptr->add == TR_SH_ELEC)
7786 drain_value[TR_BRAND_ELEC] += 10;
7787 drain_value[TR_RES_ELEC] += 10;
7789 else if (es_ptr->add == TR_SH_COLD)
7791 drain_value[TR_BRAND_COLD] += 10;
7792 drain_value[TR_RES_COLD] += 10;
7794 else if (es_ptr->add == TR_LITE_2)
7796 drain_value[TR_LITE_1] += 20;
7798 else if (es_ptr->add == TR_LITE_3)
7800 drain_value[TR_LITE_1] += 30;
7805 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7807 drain_value[TR_INT] += 5;
7808 drain_value[TR_WIS] += 5;
7810 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7812 drain_value[TR_BRAND_POIS] += 5;
7813 drain_value[TR_BRAND_ACID] += 5;
7814 drain_value[TR_BRAND_ELEC] += 5;
7815 drain_value[TR_BRAND_FIRE] += 5;
7816 drain_value[TR_BRAND_COLD] += 5;
7818 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7820 drain_value[TR_INT] += 10;
7822 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7824 drain_value[TR_STR] += 10;
7826 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7828 drain_value[TR_DEX] += 10;
7830 if (old_name2 == EGO_2WEAPON)
7832 drain_value[TR_DEX] += 20;
7834 if (object_is_weapon_ammo(o_ptr))
7836 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7838 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7840 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7841 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7842 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7843 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7845 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7847 drain_value[i] *= number;
7848 drain_value[i] = drain_value[i] * dec / 4;
7849 drain_value[i] = MAX(drain_value[i], 0);
7850 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7858 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7862 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7864 for (i = 0; essence_name[i]; i++)
7866 if (!essence_name[i][0]) continue;
7867 if (!drain_value[i]) continue;
7869 p_ptr->magic_num1[i] += drain_value[i];
7870 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7872 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7876 /* Apply autodestroy/inscription to the drained item */
7877 autopick_alter_item(item, TRUE);
7879 /* Combine the pack */
7880 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
7883 p_ptr->window |= (PW_INVEN);
7887 * @brief 付加するエッセンスの大別を選択する
7888 * @return 選んだエッセンスの大別ID
7890 static COMMAND_CODE choose_essence(void)
7892 COMMAND_CODE mode = 0;
7894 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7897 cptr menu_name[] = {
7907 cptr menu_name[] = {
7917 const COMMAND_CODE mode_max = 7;
7920 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7923 #endif /* ALLOW_REPEAT */
7932 for (i = 0; i < mode_max; i++)
7934 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7935 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7937 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7938 prt("Choose from menu.", 0, 0);
7957 menu_line += mode_max - 1;
7966 if (menu_line > mode_max) menu_line -= mode_max;
7977 for (i = 0; i < mode_max; i++)
7978 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7980 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7986 if (isupper(choice)) choice = (char)tolower(choice);
7988 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7989 mode = (int)choice - 'a' + 1;
7996 #endif /* ALLOW_REPEAT */
8001 * @brief エッセンスを実際に付加する
8002 * @param mode エッセンスの大別ID
8005 static void add_essence(ESSENCE_IDX mode)
8017 char o_name[MAX_NLEN];
8019 essence_type *es_ptr;
8020 bool able[22] = { 0 };
8022 int menu_line = (use_menu ? 1 : 0);
8024 for (i = 0; essence_info[i].add_name; i++)
8026 es_ptr = &essence_info[i];
8028 if (es_ptr->type != mode) continue;
8033 if (!repeat_pull(&i) || i<0 || i>=max_num)
8035 #endif /* ALLOW_REPEAT */
8038 /* Nothing chosen yet */
8044 /* Build a prompt */
8045 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
8046 if (use_menu) screen_save();
8048 /* Get a spell from the user */
8050 choice = (always_show_list || use_menu) ? ESCAPE:1;
8053 if( choice==ESCAPE ) choice = ' ';
8054 else if( !get_com(out_val, &choice, FALSE) )break;
8056 if (use_menu && choice != ' ')
8070 menu_line += (max_num-1);
8093 menu_line = max_num;
8107 if (menu_line > max_num) menu_line -= max_num;
8109 /* Request redraw */
8110 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
8113 if (!redraw || use_menu)
8117 char dummy[80], dummy2[80];
8125 /* Save the screen */
8126 if (!use_menu) screen_save();
8128 for (y = 1; y < 24; y++)
8131 /* Print header(s) */
8133 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
8136 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
8139 for (ctr = 0; ctr < max_num; ctr++)
8141 es_ptr = &essence_info[num[ctr]];
8145 if (ctr == (menu_line-1))
8146 strcpy(dummy, _("》 ", "> "));
8147 else strcpy(dummy, " ");
8150 /* letter/number for power selection */
8153 sprintf(dummy, "%c) ",I2A(ctr));
8156 strcat(dummy, es_ptr->add_name);
8161 if (es_ptr->essence != -1)
8163 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
8164 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
8170 case ESSENCE_SH_FIRE:
8171 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
8172 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
8173 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8175 case ESSENCE_SH_ELEC:
8176 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
8177 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
8178 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8180 case ESSENCE_SH_COLD:
8181 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
8182 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
8183 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8185 case ESSENCE_RESISTANCE:
8186 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8187 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8188 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8189 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8190 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8192 case ESSENCE_SUSTAIN:
8193 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8194 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8195 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8196 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8197 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8202 if (!able[ctr]) col = TERM_RED;
8204 if (es_ptr->essence != -1)
8206 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
8210 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
8213 c_prt(col, dummy2, ctr+2, x);
8223 /* Restore the screen */
8234 ask = (isupper(choice));
8237 if (ask) choice = (char)tolower(choice);
8239 /* Extract request */
8240 i = (islower(choice) ? A2I(choice) : -1);
8243 /* Totally Illegal */
8244 if ((i < 0) || (i >= max_num) || !able[i])
8256 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
8258 /* Belay that order */
8259 if (!get_check(tmp_val)) continue;
8266 /* Restore the screen */
8267 if (redraw) screen_load();
8274 #endif /* ALLOW_REPEAT */
8276 es_ptr = &essence_info[num[i]];
8278 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8279 item_tester_tval = TV_GLOVES;
8280 else if (mode == 1 || mode == 5)
8281 item_tester_hook = item_tester_hook_melee_ammo;
8282 else if (es_ptr->add == ESSENCE_ATTACK)
8283 item_tester_hook = object_allow_enchant_weapon;
8284 else if (es_ptr->add == ESSENCE_AC)
8285 item_tester_hook = object_is_armour;
8287 item_tester_hook = object_is_weapon_armour_ammo;
8288 item_tester_no_ryoute = TRUE;
8291 q = _("どのアイテムを改良しますか?", "Improve which item? ");
8292 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
8294 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8296 /* Get the item (in the pack) */
8299 o_ptr = &inventory[item];
8302 /* Get the item (on the floor) */
8305 o_ptr = &o_list[0 - item];
8308 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
8310 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
8314 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8316 use_essence = es_ptr->value;
8317 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
8318 if (o_ptr->number > 1)
8320 use_essence *= o_ptr->number;
8321 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
8324 if (es_ptr->essence != -1)
8326 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8328 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8331 if (is_pval_flag(es_ptr->add))
8333 if (o_ptr->pval < 0)
8335 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
8338 else if (es_ptr->add == TR_BLOWS)
8340 if (o_ptr->pval > 1)
8342 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
8346 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8348 else if (o_ptr->pval > 0)
8350 use_essence *= o_ptr->pval;
8351 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8357 PARAMETER_VALUE pval;
8358 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8360 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
8361 strcpy(tmp_val, "1");
8363 if (!get_string(tmp, tmp_val, 1)) return;
8364 pval = (PARAMETER_VALUE)atoi(tmp_val);
8365 if (pval > limit) pval = limit;
8366 else if (pval < 1) pval = 1;
8367 o_ptr->pval += pval;
8368 use_essence *= pval;
8369 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8372 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8374 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8378 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8385 strcpy(tmp_val, "1");
8386 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
8387 val = atoi(tmp_val);
8388 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8389 else if (val < 1) val = 1;
8391 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8392 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8394 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8397 get_to_h = ((val+1)/2+randint0(val/2+1));
8398 get_to_d = ((val+1)/2+randint0(val/2+1));
8399 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8400 o_ptr->to_h += get_to_h;
8401 o_ptr->to_d += get_to_d;
8403 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8404 if (es_ptr->add == ESSENCE_ATTACK)
8406 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8408 msg_print(_("改良に失敗した。", "You failed to enchant."));
8409 p_ptr->energy_use = 100;
8414 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8415 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8418 else if (es_ptr->add == ESSENCE_AC)
8420 if (o_ptr->to_a >= p_ptr->lev/5+5)
8422 msg_print(_("改良に失敗した。", "You failed to enchant."));
8423 p_ptr->energy_use = 100;
8428 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8433 o_ptr->xtra3 = es_ptr->add + 1;
8438 bool success = TRUE;
8442 case ESSENCE_SH_FIRE:
8443 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8448 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8449 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8451 case ESSENCE_SH_ELEC:
8452 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8457 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8458 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8460 case ESSENCE_SH_COLD:
8461 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8466 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8467 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8469 case ESSENCE_RESISTANCE:
8470 case ESSENCE_SUSTAIN:
8471 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))
8476 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8477 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8478 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8479 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8484 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8487 if (es_ptr->add == ESSENCE_SUSTAIN)
8489 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8490 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8491 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8492 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8496 o_ptr->xtra3 = es_ptr->add + 1;
8500 p_ptr->energy_use = 100;
8503 msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name);
8505 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8508 /* Combine the pack */
8509 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8512 p_ptr->window |= (PW_INVEN);
8519 static void erase_essence(void)
8524 char o_name[MAX_NLEN];
8525 BIT_FLAGS flgs[TR_FLAG_SIZE];
8527 item_tester_hook = object_is_smith;
8530 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
8531 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
8533 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8535 /* Get the item (in the pack) */
8538 o_ptr = &inventory[item];
8541 /* Get the item (on the floor) */
8544 o_ptr = &o_list[0 - item];
8547 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8548 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
8550 p_ptr->energy_use = 100;
8552 if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE)
8554 o_ptr->to_h -= (o_ptr->xtra4>>8);
8555 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8557 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8558 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8561 object_flags(o_ptr, flgs);
8562 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8563 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8565 /* Combine the pack */
8566 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8569 p_ptr->window |= (PW_INVEN);
8573 * @brief 鍛冶コマンドのメインルーチン
8574 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8577 void do_cmd_kaji(bool only_browse)
8579 COMMAND_CODE mode = 0;
8582 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8586 if (p_ptr->confused)
8588 msg_print(_("混乱していて作業できない!", "You are too confused!"));
8593 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8598 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8604 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8606 #endif /* ALLOW_REPEAT */
8608 if (only_browse) screen_save();
8610 if (!only_browse) screen_save();
8616 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8617 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8618 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8619 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8620 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8621 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8623 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8624 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8625 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8626 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8627 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8628 prt(format("Choose command from menu."), 0, 0);
8655 if (menu_line > 5) menu_line -= 5;
8664 prt(" a) エッセンス一覧", 2, 14);
8665 prt(" b) エッセンス抽出", 3, 14);
8666 prt(" c) エッセンス消去", 4, 14);
8667 prt(" d) エッセンス付加", 5, 14);
8668 prt(" e) 武器/防具強化", 6, 14);
8669 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8671 prt(" a) List essences", 2, 14);
8672 prt(" b) Extract essence", 3, 14);
8673 prt(" c) Remove essence", 4, 14);
8674 prt(" d) Add essence", 5, 14);
8675 prt(" e) Enchant weapon/armor", 6, 14);
8676 if (!get_com("Command :", &choice, TRUE))
8713 /* Clear lines, position cursor (really should use strlen here) */
8714 Term_erase(14, 21, 255);
8715 Term_erase(14, 20, 255);
8716 Term_erase(14, 19, 255);
8717 Term_erase(14, 18, 255);
8718 Term_erase(14, 17, 255);
8719 Term_erase(14, 16, 255);
8721 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8722 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8724 prt(&temp[j], line, 15);
8729 if (!only_browse) screen_load();
8730 } while (only_browse);
8734 #endif /* ALLOW_REPEAT */
8738 case 1: display_essence();break;
8739 case 2: drain_essence();break;
8740 case 3: erase_essence();break;
8742 mode = choose_essence();
8747 case 5: add_essence(10);break;
8753 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8754 * Torches have special abilities when they are flaming.
8755 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8756 * @param flgs 特別に追加するフラグを返す参照ポインタ
8759 void torch_flags(object_type *o_ptr, u32b *flgs)
8761 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8763 if (o_ptr->xtra4 > 0)
8765 add_flag(flgs, TR_BRAND_FIRE);
8766 add_flag(flgs, TR_KILL_UNDEAD);
8767 add_flag(flgs, TR_THROW);
8773 * @brief 投擲時たいまつにダイスを与える。
8774 * Torches have special abilities when they are flaming.
8775 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8776 * @param dd 特別なダイス数を返す参照ポインタ
8777 * @param ds 特別なダイス面数を返す参照ポインタ
8780 void torch_dice(object_type *o_ptr, int *dd, int *ds)
8782 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8784 if (o_ptr->xtra4 > 0)
8793 * @brief 投擲時命中したたいまつの寿命を縮める。
8794 * Torches have special abilities when they are flaming.
8795 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8798 void torch_lost_fuel(object_type *o_ptr)
8800 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8802 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8803 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;