3 * @brief オブジェクトの実装 / Object code, part 2
6 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
8 * This software may be copied and distributed for educational, research,\n
9 * and not for profit purposes provided that this copyright and statement\n
10 * are included in all such copies. Other copyrights may also apply.\n
11 * 2014 Deskull rearranged comment for Doxygen.\n
15 #include "object-hook.h"
16 #include "object-curse.h"
18 static void one_sustain(object_type *o_ptr);
21 static cptr const kaji_tips[5] =
24 "現在持っているエッセンスの一覧を表示する。",
25 "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。",
26 "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。",
27 "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。",
28 "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。",
30 "Display essences you have.",
31 "Extract essences from an item. The item become non magical.",
32 "Remove added essences from an equipment which was improved before. The removed essence will be ruined.",
33 "Add essences to an item. The improved items or artifacts cannot be reimprove.",
34 "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.",
39 * @brief 対象のオブジェクトにランダムな能力維持を一つ付加する。/ Choose one random sustain
41 * @param o_ptr 対象のオブジェクト構造体ポインタ
44 static void one_sustain(object_type *o_ptr)
48 case 0: add_flag(o_ptr->art_flags, TR_SUST_STR); break;
49 case 1: add_flag(o_ptr->art_flags, TR_SUST_INT); break;
50 case 2: add_flag(o_ptr->art_flags, TR_SUST_WIS); break;
51 case 3: add_flag(o_ptr->art_flags, TR_SUST_DEX); break;
52 case 4: add_flag(o_ptr->art_flags, TR_SUST_CON); break;
53 case 5: add_flag(o_ptr->art_flags, TR_SUST_CHR); break;
58 * @brief 床上、モンスター所持でスタックされたアイテムを削除しスタックを補完する / Excise a dungeon object from any stacks
59 * @param o_idx 削除対象のオブジェクト構造体ポインタ
62 void excise_object_idx(OBJECT_IDX o_idx)
66 OBJECT_IDX this_o_idx, next_o_idx = 0;
72 j_ptr = &o_list[o_idx];
75 if (j_ptr->held_m_idx)
80 m_ptr = &m_list[j_ptr->held_m_idx];
82 /* Scan all objects in the grid */
83 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
88 o_ptr = &o_list[this_o_idx];
90 /* Acquire next object */
91 next_o_idx = o_ptr->next_o_idx;
93 if (this_o_idx == o_idx)
98 /* Remove from list */
99 m_ptr->hold_o_idx = next_o_idx;
107 /* Previous object */
108 k_ptr = &o_list[prev_o_idx];
110 /* Remove from list */
111 k_ptr->next_o_idx = next_o_idx;
114 /* Forget next pointer */
115 o_ptr->next_o_idx = 0;
120 /* Save prev_o_idx */
121 prev_o_idx = this_o_idx;
130 POSITION y = j_ptr->iy;
131 POSITION x = j_ptr->ix;
136 /* Scan all objects in the grid */
137 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
142 o_ptr = &o_list[this_o_idx];
144 /* Acquire next object */
145 next_o_idx = o_ptr->next_o_idx;
147 if (this_o_idx == o_idx)
152 /* Remove from list */
153 c_ptr->o_idx = next_o_idx;
161 /* Previous object */
162 k_ptr = &o_list[prev_o_idx];
164 /* Remove from list */
165 k_ptr->next_o_idx = next_o_idx;
168 /* Forget next pointer */
169 o_ptr->next_o_idx = 0;
174 /* Save prev_o_idx */
175 prev_o_idx = this_o_idx;
181 * @brief オブジェクトを削除する /
182 * Delete a dungeon object
183 * @param o_idx 削除対象のオブジェクト構造体ポインタ
186 * Handle "stacks" of objects correctly.
188 void delete_object_idx(OBJECT_IDX o_idx)
193 excise_object_idx(o_idx);
196 j_ptr = &o_list[o_idx];
199 if (!(j_ptr->held_m_idx))
210 /* Wipe the object */
219 * @brief フロアにマスに落ちているオブジェクトを全て削除する / Deletes all objects at given location
220 * Delete a dungeon object
221 * @param y 削除したフロアマスのY座標
222 * @param x 削除したフロアマスのX座標
225 void delete_object(POSITION y, POSITION x)
228 OBJECT_IDX this_o_idx, next_o_idx = 0;
230 /* Refuse "illegal" locations */
231 if (!in_bounds(y, x)) return;
236 /* Scan all objects in the grid */
237 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
242 o_ptr = &o_list[this_o_idx];
244 /* Acquire next object */
245 next_o_idx = o_ptr->next_o_idx;
247 /* Wipe the object */
254 /* Objects are gone */
263 * @brief グローバルオブジェクト配列に対し指定範囲のオブジェクトを整理してIDの若い順に寄せる /
264 * Move an object from index i1 to index i2 in the object list
265 * @param i1 整理したい配列の始点
266 * @param i2 整理したい配列の終点
269 static void compact_objects_aux(IDX i1, IDX i2)
276 if (i1 == i2) return;
280 for (i = 1; i < o_max; i++)
285 /* Skip "dead" objects */
286 if (!o_ptr->k_idx) continue;
288 /* Repair "next" pointers */
289 if (o_ptr->next_o_idx == i1)
292 o_ptr->next_o_idx = i2;
302 if (o_ptr->held_m_idx)
306 /* Acquire monster */
307 m_ptr = &m_list[o_ptr->held_m_idx];
310 if (m_ptr->hold_o_idx == i1)
313 m_ptr->hold_o_idx = i2;
322 /* Acquire location */
330 if (c_ptr->o_idx == i1)
339 o_list[i2] = o_list[i1];
347 * @brief グローバルオブジェクト配列から優先度の低いものを削除し、データを圧縮する。 /
348 * Compact and Reorder the object list.
349 * @param size 最低でも減らしたいオブジェクト数の水準
353 * This function can be very dangerous, use with caution!\n
355 * When actually "compacting" objects, we base the saving throw on a\n
356 * combination of object level, distance from player, and current\n
359 * After "compacting" (if needed), we "reorder" the objects into a more\n
360 * compact order, and we reset the allocation info, and the "live" array.\n
362 void compact_objects(int size)
367 int cur_lev, cur_dis, chance;
374 msg_print(_("アイテム情報を圧縮しています...", "Compacting objects..."));
377 p_ptr->redraw |= (PR_MAP);
379 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
383 /* Compact at least 'size' objects */
384 for (num = 0, cnt = 1; num < size; cnt++)
386 /* Get more vicious each iteration */
389 /* Get closer each iteration */
390 cur_dis = 5 * (20 - cnt);
392 /* Examine the objects */
393 for (i = 1; i < o_max; i++)
397 /* Skip dead objects */
398 if (!o_ptr->k_idx) continue;
400 /* Hack -- High level objects start out "immune" */
401 if (k_info[o_ptr->k_idx].level > cur_lev) continue;
404 if (o_ptr->held_m_idx)
408 /* Acquire monster */
409 m_ptr = &m_list[o_ptr->held_m_idx];
411 /* Get the location */
415 /* Monsters protect their objects */
416 if (randint0(100) < 90) continue;
422 /* Get the location */
427 /* Nearby objects start out "immune" */
428 if ((cur_dis > 0) && (distance(p_ptr->y, p_ptr->x, y, x) < cur_dis)) continue;
433 /* Hack -- only compact artifacts in emergencies */
434 if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
435 (cnt < 1000)) chance = 100;
437 /* Apply the saving throw */
438 if (randint0(100) < chance) continue;
440 /* Delete the object */
441 delete_object_idx(i);
449 /* Excise dead objects (backwards!) */
450 for (i = o_max - 1; i >= 1; i--)
454 /* Skip real objects */
455 if (o_ptr->k_idx) continue;
457 /* Move last object into open hole */
458 compact_objects_aux(o_max - 1, i);
460 /* Compress "o_max" */
467 * @brief グローバルオブジェクト配列を初期化する /
468 * Delete all the items when player leaves the level
469 * @note we do NOT visually reflect these (irrelevant) changes
471 * Hack -- we clear the "c_ptr->o_idx" field for every grid,
472 * and the "m_ptr->next_o_idx" field for every monster, since
473 * we know we are clearing every object. Technically, we only
474 * clear those fields for grids/monsters containing objects,
475 * and we clear it once for every such object.
478 void wipe_o_list(void)
482 /* Delete the existing objects */
483 for (i = 1; i < o_max; i++)
485 object_type *o_ptr = &o_list[i];
487 /* Skip dead objects */
488 if (!o_ptr->k_idx) continue;
490 /* Mega-Hack -- preserve artifacts */
491 if (!character_dungeon || preserve_mode)
493 /* Hack -- Preserve unknown artifacts */
494 if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
496 /* Mega-Hack -- Preserve the artifact */
497 a_info[o_ptr->name1].cur_num = 0;
502 if (o_ptr->held_m_idx)
507 m_ptr = &m_list[o_ptr->held_m_idx];
509 /* Hack -- see above */
510 m_ptr->hold_o_idx = 0;
518 /* Access location */
519 POSITION y = o_ptr->iy;
520 POSITION x = o_ptr->ix;
525 /* Hack -- see above */
529 /* Wipe the object */
542 * @brief グローバルオブジェクト配列から空きを取得する /
543 * Acquires and returns the index of a "free" object.
544 * @return 開いているオブジェクト要素のID
546 * This routine should almost never fail, but in case it does,
547 * we must be sure to handle "failure" of this routine.
549 OBJECT_IDX o_pop(void)
553 /* Initial allocation */
554 if (o_max < max_o_idx)
559 /* Expand object array */
565 /* Use this object */
570 /* Recycle dead objects */
571 for (i = 1; i < o_max; i++)
578 /* Skip live objects */
579 if (o_ptr->k_idx) continue;
584 /* Use this object */
589 /* Warn the player (except during dungeon creation) */
590 if (character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!"));
597 * @brief オブジェクト生成テーブルに生成制約を加える /
598 * Apply a "object restriction function" to the "object allocation table"
600 * @details 生成の制約はグローバルのget_obj_num_hook関数ポインタで加える
602 static errr get_obj_num_prep(void)
607 alloc_entry *table = alloc_kind_table;
609 /* Scan the allocation table */
610 for (i = 0; i < alloc_kind_size; i++)
612 /* Accept objects which pass the restriction, if any */
613 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
615 /* Accept this object */
616 table[i].prob2 = table[i].prob1;
619 /* Do not use this object */
622 /* Decline this object */
633 * @brief オブジェクト生成テーブルからアイテムを取得する /
634 * Choose an object kind that seems "appropriate" to the given level
636 * @return 選ばれたオブジェクトベースID
638 * This function uses the "prob2" field of the "object allocation table",\n
639 * and various local information, to calculate the "prob3" field of the\n
640 * same table, which is then used to choose an "appropriate" object, in\n
641 * a relatively efficient manner.\n
643 * It is (slightly) more likely to acquire an object of the given level\n
644 * than one of a lower level. This is done by choosing several objects\n
645 * appropriate to the given level and keeping the "hardest" one.\n
647 * Note that if no objects are "appropriate", then this function will\n
648 * fail, and return zero, but this should *almost* never happen.\n
650 OBJECT_IDX get_obj_num(DEPTH level)
653 KIND_OBJECT_IDX k_idx;
656 alloc_entry *table = alloc_kind_table;
658 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
661 if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER))
663 /* Occasional "boost" */
664 if (one_in_(GREAT_OBJ))
666 /* What a bizarre calculation */
667 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
674 /* Process probabilities */
675 for (i = 0; i < alloc_kind_size; i++)
677 /* Objects are sorted by depth */
678 if (table[i].level > level) break;
683 /* Access the index */
684 k_idx = table[i].index;
686 /* Access the actual kind */
687 k_ptr = &k_info[k_idx];
689 /* Hack -- prevent embedded chests */
690 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
693 table[i].prob3 = table[i].prob2;
696 total += table[i].prob3;
699 /* No legal objects */
700 if (total <= 0) return (0);
704 value = randint0(total);
706 /* Find the object */
707 for (i = 0; i < alloc_kind_size; i++)
709 /* Found the entry */
710 if (value < table[i].prob3) break;
713 value = value - table[i].prob3;
720 /* Try for a "better" object once (50%) or twice (10%) */
727 value = randint0(total);
729 /* Find the object */
730 for (i = 0; i < alloc_kind_size; i++)
732 /* Found the entry */
733 if (value < table[i].prob3) break;
736 value = value - table[i].prob3;
739 /* Keep the "best" one */
740 if (table[i].level < table[j].level) i = j;
743 /* Try for a "better" object twice (10%) */
750 value = randint0(total);
752 /* Find the object */
753 for (i = 0; i < alloc_kind_size; i++)
755 /* Found the entry */
756 if (value < table[i].prob3) break;
759 value = value - table[i].prob3;
762 /* Keep the "best" one */
763 if (table[i].level < table[j].level) i = j;
766 return (table[i].index);
771 * @brief オブジェクトを鑑定済にする /
772 * Known is true when the "attributes" of an object are "known".
773 * @param o_ptr 鑑定済にするオブジェクトの構造体参照ポインタ
775 * These include tohit, todam, toac, cost, and pval (charges).\n
777 * Note that "knowing" an object gives you everything that an "awareness"\n
778 * gives you, and much more. In fact, the player is always "aware" of any\n
779 * item of which he has full "knowledge".\n
781 * But having full knowledge of, say, one "wand of wonder", does not, by\n
782 * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
783 * It happens that most "identify" routines (including "buying from a shop")\n
784 * will make the player "aware" of the object as well as fully "know" it.\n
786 * This routine also removes any inscriptions generated by "feelings".\n
788 void object_known(object_type *o_ptr)
790 /* Remove "default inscriptions" */
791 o_ptr->feeling = FEEL_NONE;
793 /* Clear the "Felt" info */
794 o_ptr->ident &= ~(IDENT_SENSE);
796 /* Clear the "Empty" info */
797 o_ptr->ident &= ~(IDENT_EMPTY);
799 /* Now we know about the item */
800 o_ptr->ident |= (IDENT_KNOWN);
804 * @brief オブジェクトを*鑑定*済にする /
805 * The player is now aware of the effects of the given object.
806 * @param o_ptr *鑑定*済にするオブジェクトの構造体参照ポインタ
809 void object_aware(object_type *o_ptr)
811 bool mihanmei = !object_is_aware(o_ptr);
813 /* Fully aware of the effects */
814 k_info[o_ptr->k_idx].aware = TRUE;
816 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
817 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
821 char o_name[MAX_NLEN];
824 object_copy(q_ptr, o_ptr);
827 object_desc(o_name, q_ptr, OD_NAME_ONLY);
829 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
834 * @brief オブジェクトを試行済にする /
835 * Something has been "sampled"
836 * @param o_ptr 試行済にするオブジェクトの構造体参照ポインタ
839 void object_tried(object_type *o_ptr)
841 /* Mark it as tried (even if "aware") */
842 k_info[o_ptr->k_idx].tried = TRUE;
846 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
847 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
848 * @return 擬似鑑定結果のIDを返す。
850 byte value_check_aux1(object_type *o_ptr)
853 if (object_is_artifact(o_ptr))
856 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
863 if (object_is_ego(o_ptr))
866 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
869 return FEEL_EXCELLENT;
873 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
876 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
878 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
880 /* Good "armor" bonus */
881 if (o_ptr->to_a > 0) return FEEL_GOOD;
883 /* Good "weapon" bonus */
884 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
886 /* Default to "average" */
891 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 2 (Light).
892 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
893 * @return 擬似鑑定結果のIDを返す。
895 byte value_check_aux2(object_type *o_ptr)
897 /* Cursed items (all of them) */
898 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
900 /* Broken items (all of them) */
901 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
903 /* Artifacts -- except cursed/broken ones */
904 if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
906 /* Ego-Items -- except cursed/broken ones */
907 if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
909 /* Good armor bonus */
910 if (o_ptr->to_a > 0) return FEEL_UNCURSED;
912 /* Good weapon bonuses */
913 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
920 * @brief 未鑑定なベースアイテムの基本価格を返す /
921 * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
922 * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
923 * @return オブジェクトの未鑑定価格
925 static s32b object_value_base(object_type *o_ptr)
927 /* Aware item -- use template cost */
928 if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
930 /* Analyze the type */
935 case TV_FOOD: return (5L);
937 /* Un-aware Potions */
938 case TV_POTION: return (20L);
940 /* Un-aware Scrolls */
941 case TV_SCROLL: return (20L);
943 /* Un-aware Staffs */
944 case TV_STAFF: return (70L);
947 case TV_WAND: return (50L);
950 case TV_ROD: return (90L);
953 case TV_RING: return (45L);
955 /* Un-aware Amulets */
956 case TV_AMULET: return (45L);
958 /* Figurines, relative to monster level */
961 DEPTH level = r_info[o_ptr->pval].level;
962 if (level < 20) return level*50L;
963 else if (level < 30) return 1000+(level-20)*150L;
964 else if (level < 40) return 2500+(level-30)*350L;
965 else if (level < 50) return 6000+(level-40)*800L;
966 else return 14000+(level-50)*2000L;
970 if (!o_ptr->pval) return 1000L;
971 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
974 /* Paranoia -- Oops */
980 * @brief オブジェクトのフラグ類から価格を算出する /
981 * Return the value of the flags the object has...
982 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
983 * @param plusses フラグに与える価格の基本重み
984 * @return オブジェクトのフラグ価格
986 s32b flag_cost(object_type *o_ptr, int plusses)
989 BIT_FLAGS flgs[TR_FLAG_SIZE];
993 object_kind *k_ptr = &k_info[o_ptr->k_idx];
995 object_flags(o_ptr, flgs);
998 * Exclude fixed flags of the base item.
999 * pval bonuses of base item will be treated later.
1001 for (i = 0; i < TR_FLAG_SIZE; i++)
1002 flgs[i] &= ~(k_ptr->flags[i]);
1004 /* Exclude fixed flags of the fixed artifact. */
1005 if (object_is_fixed_artifact(o_ptr))
1007 artifact_type *a_ptr = &a_info[o_ptr->name1];
1009 for (i = 0; i < TR_FLAG_SIZE; i++)
1010 flgs[i] &= ~(a_ptr->flags[i]);
1013 /* Exclude fixed flags of the ego-item. */
1014 else if (object_is_ego(o_ptr))
1016 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1018 for (i = 0; i < TR_FLAG_SIZE; i++)
1019 flgs[i] &= ~(e_ptr->flags[i]);
1024 * Calucurate values of remaining flags
1026 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
1027 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
1028 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
1029 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
1030 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
1031 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
1032 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
1033 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
1034 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
1035 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
1036 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
1037 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
1038 total += (10000 + (2500 * plusses));
1039 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
1040 total += (10000 + (2500 * plusses));
1044 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
1045 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
1046 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
1047 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
1048 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
1049 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
1050 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
1051 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
1052 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
1053 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
1054 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
1055 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
1056 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
1057 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
1058 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
1059 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
1060 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
1061 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
1062 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
1063 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
1064 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
1066 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
1067 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
1068 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
1069 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
1070 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
1071 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
1072 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
1073 total += (tmp_cost * count);
1075 if (have_flag(flgs, TR_SUST_STR)) total += 850;
1076 if (have_flag(flgs, TR_SUST_INT)) total += 850;
1077 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
1078 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
1079 if (have_flag(flgs, TR_SUST_CON)) total += 850;
1080 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
1081 if (have_flag(flgs, TR_RIDING)) total += 0;
1082 if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
1083 if (have_flag(flgs, TR_THROW)) total += 5000;
1084 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
1085 if (have_flag(flgs, TR_HOLD_EXP)) total += 8500;
1089 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
1090 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
1091 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
1092 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
1093 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
1094 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
1095 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
1096 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
1097 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
1098 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
1099 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
1100 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
1101 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
1102 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
1103 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
1104 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
1105 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
1106 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
1107 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
1108 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
1109 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
1110 total += (tmp_cost * count);
1112 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
1113 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
1114 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1115 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1116 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1117 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1118 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1119 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1120 if (have_flag(flgs, TR_LEVITATION)) total += 1250;
1121 if (have_flag(flgs, TR_LITE_1)) total += 1500;
1122 if (have_flag(flgs, TR_LITE_2)) total += 2500;
1123 if (have_flag(flgs, TR_LITE_3)) total += 4000;
1124 if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
1125 if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
1126 if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
1127 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1128 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1129 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1130 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1131 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1132 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1133 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1134 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1135 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1136 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1137 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1138 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1139 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1140 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1141 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1142 if (have_flag(flgs, TR_REGEN)) total += 2500;
1143 if (have_flag(flgs, TR_WARNING)) total += 2000;
1144 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1145 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1146 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1147 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1148 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1149 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1150 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1151 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1152 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1153 if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
1154 if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
1155 if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
1156 if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
1157 if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
1158 if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
1159 if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
1160 if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
1161 if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
1162 if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
1163 if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
1164 if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
1165 if (have_flag(flgs, TR_TELEPORT))
1167 if (object_is_cursed(o_ptr))
1172 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1173 if (have_flag(flgs, TR_BLESSED)) total += 750;
1174 if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1175 if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1176 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1177 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1178 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1180 /* Also, give some extra for activatable powers... */
1181 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1183 const activation_type* const act_ptr = find_activation_info(o_ptr);
1185 total += act_ptr->value;
1194 * @brief オブジェクトの真の価格を算出する /
1195 * Return the value of the flags the object has...
1196 * @param o_ptr 本価格を確認したいオブジェクトの構造体参照ポインタ
1197 * @return オブジェクトの本価格
1199 * Return the "real" price of a "known" item, not including discounts\n
1201 * Wand and staffs get cost for each charge\n
1203 * Armor is worth an extra 100 gold per bonus point to armor class.\n
1205 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
1207 * Missiles are only worth 5 gold per bonus point, since they\n
1208 * usually appear in groups of 20, and we want the player to get\n
1209 * the same amount of cash for any "equivalent" item. Note that\n
1210 * missiles never have any of the "pval" flags, and in fact, they\n
1211 * only have a few of the available flags, primarily of the "slay"\n
1212 * and "brand" and "ignore" variety.\n
1214 * Armor with a negative armor bonus is worthless.\n
1215 * Weapons with negative hit+damage bonuses are worthless.\n
1217 * Every wearable item with a "pval" bonus is worth extra (see below).\n
1219 PRICE object_value_real(object_type *o_ptr)
1222 BIT_FLAGS flgs[TR_FLAG_SIZE];
1223 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1226 /* Hack -- "worthless" items */
1227 if (!k_info[o_ptr->k_idx].cost) return (0L);
1230 value = k_info[o_ptr->k_idx].cost;
1232 /* Extract some flags */
1233 object_flags(o_ptr, flgs);
1236 if (object_is_fixed_artifact(o_ptr))
1238 artifact_type *a_ptr = &a_info[o_ptr->name1];
1240 /* Hack -- "worthless" artifacts */
1241 if (!a_ptr->cost) return (0L);
1243 /* Hack -- Use the artifact cost instead */
1244 value = a_ptr->cost;
1245 value += flag_cost(o_ptr, o_ptr->pval);
1247 /* Don't add pval bonuses etc. */
1252 else if (object_is_ego(o_ptr))
1254 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1256 /* Hack -- "worthless" ego-items */
1257 if (!e_ptr->cost) return (0L);
1259 /* Hack -- Reward the ego-item with a bonus */
1260 value += e_ptr->cost;
1261 value += flag_cost(o_ptr, o_ptr->pval);
1269 for (i = 0; i < TR_FLAG_SIZE; i++)
1270 if (o_ptr->art_flags[i]) flag = TRUE;
1272 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1275 /* Analyze pval bonus for normal object */
1276 switch (o_ptr->tval)
1299 if (!o_ptr->pval) break;
1301 /* Hack -- Negative "pval" is always bad */
1302 if (o_ptr->pval < 0) return (0L);
1304 /* Give credit for stat bonuses */
1305 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1306 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1307 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1308 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1309 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1310 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1312 /* Give credit for stealth and searching */
1313 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1314 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1315 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1317 /* Give credit for infra-vision and tunneling */
1318 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1319 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1321 /* Give credit for extra attacks */
1322 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1324 /* Give credit for speed bonus */
1325 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1331 /* Analyze the item */
1332 switch (o_ptr->tval)
1337 /* Pay extra for charges, depending on standard number of
1338 * charges. Handle new-style wands correctly. -LM-
1340 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1346 /* Pay extra for charges, depending on standard number of
1349 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1358 /* Hack -- negative bonuses are bad */
1359 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1361 /* Give credit for bonuses */
1362 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1378 /* Hack -- negative armor bonus */
1379 if (o_ptr->to_a < 0) return (0L);
1381 /* Give credit for bonuses */
1382 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1394 /* Hack -- negative hit/damage bonuses */
1395 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1397 /* Factor in the bonuses */
1398 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1400 /* Hack -- Factor in extra damage dice and sides */
1401 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1402 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1412 /* Hack -- negative hit/damage bonuses */
1413 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1415 /* Factor in the bonuses */
1416 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1418 /* Hack -- Factor in extra damage dice and sides */
1419 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1420 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1425 /* Figurines, relative to monster level */
1428 DEPTH level = r_info[o_ptr->pval].level;
1429 if (level < 20) value = level*50L;
1430 else if (level < 30) value = 1000+(level-20)*150L;
1431 else if (level < 40) value = 2500+(level-30)*350L;
1432 else if (level < 50) value = 6000+(level-40)*800L;
1433 else value = 14000+(level-50)*2000L;
1439 if (!o_ptr->pval) value = 1000L;
1440 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1446 if (!o_ptr->pval) value = 0L;
1451 /* Worthless object */
1452 if (value < 0) return 0L;
1454 /* Return the value */
1460 * @brief オブジェクト価格算出のメインルーチン /
1461 * Return the price of an item including plusses (and charges)
1462 * @param o_ptr 判明している現価格を確認したいオブジェクトの構造体参照ポインタ
1463 * @return オブジェクトの判明している現価格
1465 * This function returns the "value" of the given item (qty one)\n
1467 * Never notice "unknown" bonuses or properties, including "curses",\n
1468 * since that would give the player information he did not have.\n
1470 * Note that discounted items stay discounted forever, even if\n
1471 * the discount is "forgotten" by the player via memory loss.\n
1473 PRICE object_value(object_type *o_ptr)
1477 /* Unknown items -- acquire a base value */
1478 if (object_is_known(o_ptr))
1480 /* Broken items -- worthless */
1481 if (object_is_broken(o_ptr)) return (0L);
1483 /* Cursed items -- worthless */
1484 if (object_is_cursed(o_ptr)) return (0L);
1486 /* Real value (see above) */
1487 value = object_value_real(o_ptr);
1490 /* Known items -- acquire the actual value */
1493 /* Hack -- Felt broken items */
1494 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1496 /* Hack -- Felt cursed items */
1497 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1499 /* Base value (see above) */
1500 value = object_value_base(o_ptr);
1504 /* Apply discount (if any) */
1505 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1508 /* Return the final value */
1515 * @brief 破壊可能なアイテムかを返す /
1516 * Determines whether an object can be destroyed, and makes fake inscription.
1517 * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
1518 * @return オブジェクトが破壊可能ならばTRUEを返す
1520 bool can_player_destroy_object(object_type *o_ptr)
1522 /* Artifacts cannot be destroyed */
1523 if (!object_is_artifact(o_ptr)) return TRUE;
1525 /* If object is unidentified, makes fake inscription */
1526 if (!object_is_known(o_ptr))
1528 byte feel = FEEL_SPECIAL;
1530 /* Hack -- Handle icky artifacts */
1531 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1533 /* Hack -- inscribe the artifact */
1534 o_ptr->feeling = feel;
1536 /* We have "felt" it (again) */
1537 o_ptr->ident |= (IDENT_SENSE);
1539 /* Combine the pack */
1540 p_ptr->notice |= (PN_COMBINE);
1542 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1547 /* Identified artifact -- Nothing to do */
1553 * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
1554 * Distribute charges of rods or wands.
1555 * @param o_ptr 分割元オブジェクトの構造体参照ポインタ source item
1556 * @param q_ptr 分割先オブジェクトの構造体参照ポインタ target item, must be of the same type as o_ptr
1557 * @param amt 分割したい回数量 number of items that are transfered
1560 * Hack -- If rods or wands are dropped, the total maximum timeout or\n
1561 * charges need to be allocated between the two stacks. If all the items\n
1562 * are being dropped, it makes for a neater message to leave the original\n
1563 * stack's pval alone. -LM-\n
1565 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1567 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1569 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1570 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1572 /* Hack -- Rods also need to have their timeouts distributed. The
1573 * dropped stack will accept all time remaining to charge up to its
1576 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1578 if (q_ptr->pval > o_ptr->timeout)
1579 q_ptr->timeout = o_ptr->timeout;
1581 q_ptr->timeout = q_ptr->pval;
1583 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1589 * @brief 魔法棒やロッドの使用回数を減らす /
1590 * @param o_ptr オブジェクトの構造体参照ポインタ source item
1591 * @param amt 減らしたい回数量 number of items that are transfered
1594 * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1595 * charges of the stack needs to be reduced, unless all the items are\n
1596 * being destroyed. -LM-\n
1598 void reduce_charges(object_type *o_ptr, int amt)
1600 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1601 (amt < o_ptr->number))
1603 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1608 * Determine if an item can "absorb" a second item
1610 * See "object_absorb()" for the actual "absorption" code.
1612 * If permitted, we allow staffs (if they are known to have equal charges
1613 * and both are either known or confirmed empty) and wands (if both are
1614 * either known or confirmed empty) and rods (in all cases) to combine.
1615 * Staffs will unstack (if necessary) when they are used, but wands and
1616 * rods will only unstack if one is dropped. -LM-
1618 * If permitted, we allow weapons/armor to stack, if fully "known".
1620 * Missiles will combine if both stacks have the same "known" status.
1621 * This is done to make unidentified stacks of missiles useful.
1623 * Food, potions, scrolls, and "easy know" items always stack.
1625 * Chests, and activatable items, never stack (for various reasons).
1629 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1631 #define MAX_STACK_SIZE 99
1635 * @brief 両オブジェクトをスロットに重ね合わせ可能な最大数を返す。
1636 * Determine if an item can partly absorb a second item. Return maximum number of stack.
1637 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1638 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1639 * @return 重ね合わせ可能なアイテム数
1641 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1645 /* Default maximum number of stack */
1646 int max_num = MAX_STACK_SIZE;
1648 /* Require identical object types */
1649 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1652 /* Analyze the items */
1653 switch (o_ptr->tval)
1655 /* Chests and Statues*/
1666 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1667 if (o_ptr->pval != j_ptr->pval) return 0;
1671 /* Figurines and Corpses*/
1676 if (o_ptr->pval != j_ptr->pval) return 0;
1682 /* Food and Potions and Scrolls */
1694 /* Require either knowledge or known empty for both staffs. */
1695 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1696 !object_is_known(o_ptr)) ||
1697 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1698 !object_is_known(j_ptr))) return 0;
1700 /* Require identical charges, since staffs are bulky. */
1701 if (o_ptr->pval != j_ptr->pval) return 0;
1710 /* Require either knowledge or known empty for both wands. */
1711 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1712 !object_is_known(o_ptr)) ||
1713 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1714 !object_is_known(j_ptr))) return 0;
1716 /* Wand charges combine in O&ZAngband. */
1722 /* Staffs and Wands and Rods */
1725 /* Prevent overflaw of timeout */
1726 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1732 /* Weapons and Armor */
1748 /* Rings, Amulets, Lites */
1754 /* Require full knowledge of both items */
1755 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1765 /* Require identical knowledge of both items */
1766 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1767 if (o_ptr->feeling != j_ptr->feeling) return 0;
1769 /* Require identical "bonuses" */
1770 if (o_ptr->to_h != j_ptr->to_h) return 0;
1771 if (o_ptr->to_d != j_ptr->to_d) return 0;
1772 if (o_ptr->to_a != j_ptr->to_a) return 0;
1774 /* Require identical "pval" code */
1775 if (o_ptr->pval != j_ptr->pval) return 0;
1777 /* Artifacts never stack */
1778 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1780 /* Require identical "ego-item" names */
1781 if (o_ptr->name2 != j_ptr->name2) return 0;
1783 /* Require identical added essence */
1784 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1785 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1787 /* Hack -- Never stack "powerful" items */
1788 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1790 /* Hack -- Never stack recharging items */
1791 if (o_ptr->timeout || j_ptr->timeout) return 0;
1793 /* Require identical "values" */
1794 if (o_ptr->ac != j_ptr->ac) return 0;
1795 if (o_ptr->dd != j_ptr->dd) return 0;
1796 if (o_ptr->ds != j_ptr->ds) return 0;
1805 /* Require knowledge */
1806 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1814 /* Hack -- Identical art_flags! */
1815 for (i = 0; i < TR_FLAG_SIZE; i++)
1816 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1818 /* Hack -- Require identical "cursed" status */
1819 if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1821 /* Hack -- Require identical "broken" status */
1822 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1825 /* Hack -- require semi-matching "inscriptions" */
1826 if (o_ptr->inscription && j_ptr->inscription &&
1827 (o_ptr->inscription != j_ptr->inscription))
1830 /* Hack -- normally require matching "inscriptions" */
1831 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1833 /* Hack -- normally require matching "discounts" */
1834 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1837 /* They match, so they must be similar */
1842 * @brief 両オブジェクトをスロットに重ねることができるかどうかを返す。
1843 * Determine if an item can absorb a second item.
1844 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1845 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1846 * @return 重ね合わせ可能ならばTRUEを返す。
1848 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1850 int total = o_ptr->number + j_ptr->number;
1853 /* Are these objects similar? */
1854 max_num = object_similar_part(o_ptr, j_ptr);
1856 /* Return if not similar */
1857 if (!max_num) return FALSE;
1859 /* Maximal "stacking" limit */
1860 if (total > max_num) return (0);
1863 /* They match, so they must be similar */
1869 * @brief 両オブジェクトをスロットに重ね合わせる。
1870 * Allow one item to "absorb" another, assuming they are similar
1871 * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
1872 * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
1875 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1877 int max_num = object_similar_part(o_ptr, j_ptr);
1878 int total = o_ptr->number + j_ptr->number;
1879 int diff = (total > max_num) ? total - max_num : 0;
1881 /* Combine quantity, lose excess items */
1882 o_ptr->number = (total > max_num) ? max_num : total;
1884 /* Hack -- blend "known" status */
1885 if (object_is_known(j_ptr)) object_known(o_ptr);
1887 /* Hack -- clear "storebought" if only one has it */
1888 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1889 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1891 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1892 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1895 /* Hack -- blend "mental" status */
1896 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1898 /* Hack -- blend "inscriptions" */
1899 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1901 /* Hack -- blend "feelings" */
1902 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1904 /* Hack -- could average discounts */
1905 /* Hack -- save largest discount */
1906 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1908 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1909 if (o_ptr->tval == TV_ROD)
1911 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1912 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1915 /* Hack -- if wands are stacking, combine the charges. -LM- */
1916 if (o_ptr->tval == TV_WAND)
1918 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1924 * @brief tvalとsvalに対応するベースアイテムのIDを返す。
1925 * Find the index of the object_kind with the given tval and sval
1926 * @param tval 検索したいベースアイテムのtval
1927 * @param sval 検索したいベースアイテムのsval
1930 IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval)
1937 for (k = 1; k < max_k_idx; k++)
1939 object_kind *k_ptr = &k_info[k];
1941 /* Require correct tval */
1942 if (k_ptr->tval != tval) continue;
1945 if (k_ptr->sval == sval) return (k);
1947 /* Ignore illegal items */
1948 if (sval != SV_ANY) continue;
1950 /* Apply the randomizer */
1951 if (!one_in_(++num)) continue;
1953 /* Use this value */
1957 /* Return this choice */
1964 msg_format(_("アイテムがない (%d,%d)", "No object (%d,%d)"), tval, sval);
1973 * @brief オブジェクトを初期化する
1974 * Wipe an object clean.
1975 * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
1978 void object_wipe(object_type *o_ptr)
1980 /* Wipe the structure */
1981 (void)WIPE(o_ptr, object_type);
1986 * @brief オブジェクトを複製する
1987 * Wipe an object clean.
1988 * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
1989 * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
1992 void object_copy(object_type *o_ptr, object_type *j_ptr)
1994 /* Copy the structure */
1995 (void)COPY(o_ptr, j_ptr, object_type);
2000 * @brief オブジェクト構造体にベースアイテムを作成する
2001 * Prepare an object based on an object kind.
2002 * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
2003 * @param k_idx 新たに作成したいベースアイテム情報のID
2006 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
2008 object_kind *k_ptr = &k_info[k_idx];
2010 /* Clear the record */
2013 /* Save the kind index */
2014 o_ptr->k_idx = k_idx;
2016 /* Efficiency -- tval/sval */
2017 o_ptr->tval = k_ptr->tval;
2018 o_ptr->sval = k_ptr->sval;
2020 /* Default "pval" */
2021 o_ptr->pval = k_ptr->pval;
2023 /* Default number */
2026 /* Default weight */
2027 o_ptr->weight = k_ptr->weight;
2030 o_ptr->to_h = k_ptr->to_h;
2031 o_ptr->to_d = k_ptr->to_d;
2032 o_ptr->to_a = k_ptr->to_a;
2035 o_ptr->ac = k_ptr->ac;
2036 o_ptr->dd = k_ptr->dd;
2037 o_ptr->ds = k_ptr->ds;
2039 /* Default activation */
2040 if (k_ptr->act_idx > 0) o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
2042 /* Hack -- worthless items are always "broken" */
2043 if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
2045 /* Hack -- cursed items are always "cursed" */
2046 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
2047 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2048 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
2049 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2050 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2051 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2056 * @brief 上質以上のオブジェクトに与えるための各種ボーナスを正規乱数も加えて算出する。
2057 * Help determine an "enchantment bonus" for an object.
2058 * @param max ボーナス値の限度
2059 * @param level ボーナス値に加味する基準生成階
2060 * @return 算出されたボーナス値
2062 * To avoid floating point but still provide a smooth distribution of bonuses,\n
2063 * we simply round the results of division in such a way as to "average" the\n
2064 * correct floating point value.\n
2066 * This function has been changed. It uses "randnor()" to choose values from\n
2067 * a normal distribution, whose mean moves from zero towards the max as the\n
2068 * level increases, and whose standard deviation is equal to 1/4 of the max,\n
2069 * and whose values are forced to lie between zero and the max, inclusive.\n
2071 * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
2072 * rare to get the "full" enchantment on an object, even a deep levels.\n
2074 * It is always possible (albeit unlikely) to get the "full" enchantment.\n
2076 * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
2078 * N 0 1 2 3 4 5 6 7 8 9 10\n
2079 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n
2080 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03\n
2081 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05\n
2082 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05\n
2083 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11\n
2084 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41\n
2085 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65\n
2086 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94\n
2087 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78\n
2088 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64\n
2089 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62\n
2090 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33\n
2091 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38\n
2092 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53\n
2093 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53\n
2094 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27\n
2095 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72\n
2096 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07\n
2098 int m_bonus(int max, DEPTH level)
2100 int bonus, stand, extra, value;
2103 /* Paranoia -- enforce maximal "level" */
2104 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
2107 /* The "bonus" moves towards the max */
2108 bonus = ((max * level) / MAX_DEPTH);
2110 /* Hack -- determine fraction of error */
2111 extra = ((max * level) % MAX_DEPTH);
2113 /* Hack -- simulate floating point computations */
2114 if (randint0(MAX_DEPTH) < extra) bonus++;
2117 /* The "stand" is equal to one quarter of the max */
2120 /* Hack -- determine fraction of error */
2123 /* Hack -- simulate floating point computations */
2124 if (randint0(4) < extra) stand++;
2127 /* Choose an "interesting" value */
2128 value = randnor(bonus, stand);
2130 /* Enforce the minimum value */
2131 if (value < 0) return (0);
2133 /* Enforce the maximum value */
2134 if (value > max) return (max);
2140 * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user
2141 * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ
2144 static void object_mention(object_type *o_ptr)
2146 char o_name[MAX_NLEN];
2148 object_aware(o_ptr);
2149 object_known(o_ptr);
2151 /* Mark the item as fully known */
2152 o_ptr->ident |= (IDENT_MENTAL);
2155 object_desc(o_name, o_ptr, 0);
2156 msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name);
2160 * @brief INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2161 * Mega-Hack -- Attempt to create one of the "Special Objects"
2162 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2163 * @return 生成に成功したらTRUEを返す。
2165 * We are only called from "make_object()", and we assume that\n
2166 * "apply_magic()" is called immediately after we return.\n
2168 * Note -- see "make_artifact()" and "apply_magic()"\n
2170 static bool make_artifact_special(object_type *o_ptr)
2173 KIND_OBJECT_IDX k_idx = 0;
2175 /*! @note 地上ではキャンセルする / No artifacts in the town */
2176 if (!dun_level) return (FALSE);
2178 /*! @note get_obj_num_hookによる指定がある場合は生成をキャンセルする / Themed object */
2179 if (get_obj_num_hook) return (FALSE);
2181 /*! @note 全固定アーティファクト中からIDの若い順に生成対象とその確率を走査する / Check the artifact list (just the "specials") */
2182 for (i = 0; i < max_a_idx; i++)
2184 artifact_type *a_ptr = &a_info[i];
2186 /*! @note アーティファクト名が空の不正なデータは除外する / Skip "empty" artifacts */
2187 if (!a_ptr->name) continue;
2189 /*! @note 既に生成回数がカウントされたアーティファクト、QUESTITEMと非INSTA_ARTは除外 / Cannot make an artifact twice */
2190 if (a_ptr->cur_num) continue;
2191 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2192 if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue;
2194 /*! @note アーティファクト生成階が現在に対して足りない場合は高確率で1/(不足階層*2)を満たさないと生成リストに加えられない /
2195 * XXX XXX Enforce minimum "depth" (loosely) */
2196 if (a_ptr->level > object_level)
2198 /* @note / Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2199 int d = (a_ptr->level - object_level) * 2;
2200 if (!one_in_(d)) continue;
2203 /*! @note 1/(レア度)の確率を満たさないと除外される / Artifact "rarity roll" */
2204 if (!one_in_(a_ptr->rarity)) continue;
2206 /*! @note INSTA_ART型固定アーティファクトのベースアイテムもチェック対象とする。ベースアイテムの生成階層が足りない場合1/(不足階層*5) を満たさないと除外される。 /
2207 * Find the base object. XXX XXX Enforce minimum "object" level (loosely). Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2208 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2209 if (k_info[k_idx].level > object_level)
2211 int d = (k_info[k_idx].level - object_level) * 5;
2212 if (!one_in_(d)) continue;
2215 /*! @note 前述の条件を満たしたら、後のIDのアーティファクトはチェックせずすぐ確定し生成処理に移す /
2216 * Assign the template. Mega-Hack -- mark the item as an artifact. Hack: Some artifacts get random extra powers. Success. */
2217 object_prep(o_ptr, k_idx);
2220 random_artifact_resistance(o_ptr, a_ptr);
2224 /*! @note 全INSTA_ART固定アーティファクトを試行しても決まらなかった場合 FALSEを返す / Failure */
2230 * @brief 非INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2231 * Mega-Hack -- Attempt to create one of the "Special Objects"
2232 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2233 * @return 生成に成功したらTRUEを返す。
2235 * Attempt to change an object into an artifact\n
2236 * This routine should only be called by "apply_magic()"\n
2237 * Note -- see "make_artifact_special()" and "apply_magic()"\n
2239 static bool make_artifact(object_type *o_ptr)
2244 /* No artifacts in the town */
2245 if (!dun_level) return (FALSE);
2247 /* Paranoia -- no "plural" artifacts */
2248 if (o_ptr->number != 1) return (FALSE);
2250 /* Check the artifact list (skip the "specials") */
2251 for (i = 0; i < max_a_idx; i++)
2253 artifact_type *a_ptr = &a_info[i];
2255 /* Skip "empty" items */
2256 if (!a_ptr->name) continue;
2258 /* Cannot make an artifact twice */
2259 if (a_ptr->cur_num) continue;
2261 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2263 if (a_ptr->gen_flags & TRG_INSTA_ART) continue;
2265 /* Must have the correct fields */
2266 if (a_ptr->tval != o_ptr->tval) continue;
2267 if (a_ptr->sval != o_ptr->sval) continue;
2269 /* XXX XXX Enforce minimum "depth" (loosely) */
2270 if (a_ptr->level > dun_level)
2272 /* Acquire the "out-of-depth factor" */
2273 int d = (a_ptr->level - dun_level) * 2;
2275 /* Roll for out-of-depth creation */
2276 if (!one_in_(d)) continue;
2279 /* We must make the "rarity roll" */
2280 if (!one_in_(a_ptr->rarity)) continue;
2282 /* Hack -- mark the item as an artifact */
2285 /* Hack: Some artifacts get random extra powers */
2286 random_artifact_resistance(o_ptr, a_ptr);
2298 * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
2299 * Choose random ego type
2300 * @param slot 取得したいエゴの装備部位
2301 * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
2302 * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
2304 static byte get_random_ego(byte slot, bool good)
2307 ego_item_type *e_ptr;
2311 for (i = 1; i < max_e_idx; i++)
2315 if (e_ptr->slot == slot
2316 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2319 total += (255 / e_ptr->rarity);
2323 value = randint1(total);
2325 for (i = 1; i < max_e_idx; i++)
2329 if (e_ptr->slot == slot
2330 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2333 value -= (255 / e_ptr->rarity);
2334 if (value <= 0L) break;
2342 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2343 * Apply magic to an item known to be a "weapon"
2344 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2345 * @param level 生成基準階
2346 * @param power 生成ランク
2349 * Hack -- note special base damage dice boosting\n
2350 * Hack -- note special processing for weapon/digger\n
2352 static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
2354 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
2355 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
2357 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
2358 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
2360 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2362 tohit2 = (tohit2+1)/2;
2363 todam2 = (todam2+1)/2;
2370 o_ptr->to_h += tohit1;
2371 o_ptr->to_d += todam1;
2377 o_ptr->to_h += tohit2;
2378 o_ptr->to_d += todam2;
2386 o_ptr->to_h -= tohit1;
2387 o_ptr->to_d -= todam1;
2392 /* Penalize again */
2393 o_ptr->to_h -= tohit2;
2394 o_ptr->to_d -= todam2;
2397 /* Cursed (if "bad") */
2398 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2401 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2404 switch (o_ptr->tval)
2411 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2412 create_artifact(o_ptr, FALSE);
2414 /* Special Ego-item */
2415 o_ptr->name2 = EGO_DIGGING;
2419 else if (power < -1)
2421 /* Hack -- Horrible digging bonus */
2422 o_ptr->pval = 0 - (5 + randint1(5));
2428 /* Hack -- Reverse digging bonus */
2429 o_ptr->pval = 0 - (o_ptr->pval);
2443 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2445 create_artifact(o_ptr, FALSE);
2450 /* Roll for an ego-item */
2451 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2452 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2454 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2456 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2461 switch (o_ptr->name2)
2464 if (one_in_(4) && (level > 40))
2465 add_flag(o_ptr->art_flags, TR_BLOWS);
2469 add_flag(o_ptr->art_flags, TR_RES_POIS);
2471 add_flag(o_ptr->art_flags, TR_WARNING);
2473 case EGO_KILL_DRAGON:
2475 add_flag(o_ptr->art_flags, TR_RES_POIS);
2479 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2481 case EGO_SLAYING_WEAPON:
2482 if (one_in_(3)) /* double damage */
2490 while (one_in_(o_ptr->dd));
2496 while (one_in_(o_ptr->ds));
2501 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2503 if (o_ptr->tval == TV_SWORD && one_in_(3))
2505 add_flag(o_ptr->art_flags, TR_VORPAL);
2510 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2516 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
2518 add_flag(o_ptr->art_flags, TR_DEX);
2520 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2523 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
2525 case EGO_EARTHQUAKES:
2526 if (one_in_(3) && (level > 60))
2527 add_flag(o_ptr->art_flags, TR_BLOWS);
2529 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
2533 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2537 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2539 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2541 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2542 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2545 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2546 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2547 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2548 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2552 if (!o_ptr->art_name)
2554 /* Hack -- Super-charge the damage dice */
2555 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2557 /* Hack -- Lower the damage dice */
2558 if (o_ptr->dd > 9) o_ptr->dd = 9;
2563 else if (power < -1)
2565 /* Roll for ego-item */
2566 if (randint0(MAX_DEPTH) < level)
2570 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2571 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2577 switch (o_ptr->name2)
2580 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2581 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2583 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2584 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2585 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2586 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2587 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2588 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2602 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2604 create_artifact(o_ptr, FALSE);
2607 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2621 if (power > 2) /* power > 2 is debug only */
2623 create_artifact(o_ptr, FALSE);
2627 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2629 switch (o_ptr->name2)
2631 case EGO_SLAYING_BOLT:
2636 /* Hack -- super-charge the damage dice */
2637 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2639 /* Hack -- restrict the damage dice */
2640 if (o_ptr->dd > 9) o_ptr->dd = 9;
2644 else if (power < -1)
2646 /* Roll for ego-item */
2647 if (randint0(MAX_DEPTH) < level)
2649 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2659 * @brief ドラゴン装備にランダムな耐性を与える
2660 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2663 static void dragon_resist(object_type * o_ptr)
2668 one_dragon_ele_resistance(o_ptr);
2670 one_high_resistance(o_ptr);
2676 * @brief オブジェクトにランダムな強いESPを与える
2677 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2680 static bool add_esp_strong(object_type *o_ptr)
2682 bool nonliv = FALSE;
2684 switch (randint1(3))
2686 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2687 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2688 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2695 * @brief オブジェクトにランダムな弱いESPを与える
2696 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2697 * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3)
2700 static void add_esp_weak(object_type *o_ptr, bool extra)
2703 u32b weak_esp_list[] = {
2715 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2716 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2718 /* Add unduplicated weak esp flags randomly */
2719 for (i = 0; i < add_count; ++ i)
2721 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2723 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2724 weak_esp_list[choice] = weak_esp_list[i];
2730 * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2731 * Apply magic to an item known to be "armor"
2732 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2733 * @param level 生成基準階
2734 * @param power 生成ランク
2737 * Hack -- note special processing for crown/helm\n
2738 * Hack -- note special processing for robe of permanence\n
2740 static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
2742 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
2743 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
2749 o_ptr->to_a += toac1;
2755 o_ptr->to_a += toac2;
2763 o_ptr->to_a -= toac1;
2768 /* Penalize again */
2769 o_ptr->to_a -= toac2;
2772 /* Cursed (if "bad") */
2773 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2778 switch (o_ptr->tval)
2782 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2783 create_artifact(o_ptr, FALSE);
2793 /* Hack -- Try for "Robes of the Magi" */
2794 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2795 (o_ptr->sval == SV_ROBE) &&
2796 (randint0(100) < 15))
2800 o_ptr->name2 = EGO_YOIYAMI;
2801 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2802 o_ptr->sval = SV_YOIYAMI_ROBE;
2808 o_ptr->name2 = EGO_PERMANENCE;
2813 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2815 create_artifact(o_ptr, FALSE);
2821 bool okay_flag = TRUE;
2823 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2825 switch (o_ptr->name2)
2828 if (o_ptr->tval != TV_HARD_ARMOR)
2834 if (o_ptr->tval != TV_SOFT_ARMOR)
2843 if (okay_flag) break;
2845 switch (o_ptr->name2)
2847 case EGO_RESISTANCE:
2849 add_flag(o_ptr->art_flags, TR_RES_POIS);
2852 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2853 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2857 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2859 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2861 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2862 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2864 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2865 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2866 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2867 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2868 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2869 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2870 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2871 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2874 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2875 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2876 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2877 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2878 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2879 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2892 if (o_ptr->sval == SV_DRAGON_SHIELD)
2894 dragon_resist(o_ptr);
2895 if (!one_in_(3)) break;
2901 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2903 create_artifact(o_ptr, FALSE);
2909 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2910 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
2911 && o_ptr->name2 == EGO_S_DWARVEN)
2918 switch (o_ptr->name2)
2921 if (!one_in_(3)) one_high_resistance(o_ptr);
2922 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2924 case EGO_REFLECTION:
2925 if (o_ptr->sval == SV_MIRROR_SHIELD)
2930 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2931 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2940 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2942 dragon_resist(o_ptr);
2943 if (!one_in_(3)) break;
2947 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2949 create_artifact(o_ptr, FALSE);
2952 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2956 else if (power < -1)
2958 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2966 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2968 dragon_resist(o_ptr);
2969 if (!one_in_(3)) break;
2974 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2976 create_artifact(o_ptr, FALSE);
2979 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
2981 switch (o_ptr->name2)
2983 case EGO_SLOW_DESCENT:
2986 one_high_resistance(o_ptr);
2992 else if (power < -1)
2994 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
3005 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3007 create_artifact(o_ptr, FALSE);
3012 bool ok_flag = TRUE;
3013 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3015 switch (o_ptr->name2)
3018 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
3019 else add_esp_weak(o_ptr, FALSE);
3023 case EGO_REGENERATION:
3024 case EGO_LORDLINESS:
3030 if (one_in_(2)) add_esp_strong(o_ptr);
3031 else add_esp_weak(o_ptr, FALSE);
3034 default:/* not existing crown (wisdom,lite, etc...) */
3038 break; /* while (1) */
3044 else if (power < -1)
3048 bool ok_flag = TRUE;
3049 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3051 switch (o_ptr->name2)
3053 case EGO_ANCIENT_CURSE:
3054 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
3055 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
3056 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3057 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3058 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3059 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3063 break; /* while (1) */
3072 if (o_ptr->sval == SV_DRAGON_HELM)
3074 dragon_resist(o_ptr);
3075 if (!one_in_(3)) break;
3081 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3083 create_artifact(o_ptr, FALSE);
3088 bool ok_flag = TRUE;
3089 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3091 switch (o_ptr->name2)
3093 case EGO_BRILLIANCE:
3095 case EGO_INFRAVISION:
3096 case EGO_H_PROTECTION:
3101 if (one_in_(2)) add_esp_strong(o_ptr);
3102 else add_esp_weak(o_ptr, FALSE);
3106 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
3107 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
3110 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3112 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
3114 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
3115 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3117 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3118 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
3119 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
3120 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3121 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3122 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3123 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3124 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
3126 default:/* not existing helm (Magi, Might, etc...)*/
3130 break; /* while (1) */
3135 else if (power < -1)
3139 bool ok_flag = TRUE;
3140 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3142 switch (o_ptr->name2)
3144 case EGO_ANCIENT_CURSE:
3148 break; /* while (1) */
3159 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3161 create_artifact(o_ptr, FALSE);
3164 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
3166 switch (o_ptr->name2)
3175 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
3176 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
3177 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
3178 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3185 else if (power < -1)
3187 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3198 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
3199 * Apply magic to an item known to be a "ring" or "amulet"
3200 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3201 * @param level 生成基準階
3202 * @param power 生成ランク
3205 * Hack -- note special "pval boost" code for ring of speed\n
3206 * Hack -- note that some items must be cursed (or blessed)\n
3208 static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
3210 /* Apply magic (good or bad) according to type */
3211 switch (o_ptr->tval)
3216 switch (o_ptr->sval)
3218 case SV_RING_ATTACKS:
3221 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
3222 if (one_in_(15)) o_ptr->pval++;
3223 if (o_ptr->pval < 1) o_ptr->pval = 1;
3229 o_ptr->ident |= (IDENT_BROKEN);
3232 o_ptr->curse_flags |= TRC_CURSED;
3235 o_ptr->pval = 0 - (o_ptr->pval);
3246 /* Strength, Constitution, Dexterity, Intelligence */
3252 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3258 o_ptr->ident |= (IDENT_BROKEN);
3261 o_ptr->curse_flags |= TRC_CURSED;
3264 o_ptr->pval = 0 - (o_ptr->pval);
3270 /* Ring of Speed! */
3273 /* Base speed (1 to 10) */
3274 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3276 /* Super-charge the ring */
3277 while (randint0(100) < 50) o_ptr->pval++;
3283 o_ptr->ident |= (IDENT_BROKEN);
3286 o_ptr->curse_flags |= TRC_CURSED;
3289 o_ptr->pval = 0 - (o_ptr->pval);
3297 case SV_RING_LORDLY:
3301 one_lordly_high_resistance(o_ptr);
3305 /* Bonus to armor class */
3306 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3310 case SV_RING_WARNING:
3312 if (one_in_(3)) one_low_esp(o_ptr);
3317 case SV_RING_SEARCHING:
3319 /* Bonus to searching */
3320 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3326 o_ptr->ident |= (IDENT_BROKEN);
3329 o_ptr->curse_flags |= TRC_CURSED;
3332 o_ptr->pval = 0 - (o_ptr->pval);
3338 /* Flames, Acid, Ice */
3339 case SV_RING_FLAMES:
3344 /* Bonus to armor class */
3345 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3349 /* Weakness, Stupidity */
3350 case SV_RING_WEAKNESS:
3351 case SV_RING_STUPIDITY:
3354 o_ptr->ident |= (IDENT_BROKEN);
3357 o_ptr->curse_flags |= TRC_CURSED;
3360 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3361 if (power > 0) power = 0 - power;
3366 /* WOE, Stupidity */
3370 o_ptr->ident |= (IDENT_BROKEN);
3373 o_ptr->curse_flags |= TRC_CURSED;
3376 o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
3377 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3378 if (power > 0) power = 0 - power;
3383 /* Ring of damage */
3384 case SV_RING_DAMAGE:
3386 /* Bonus to damage */
3387 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
3393 o_ptr->ident |= (IDENT_BROKEN);
3396 o_ptr->curse_flags |= TRC_CURSED;
3399 o_ptr->to_d = 0 - o_ptr->to_d;
3405 /* Ring of Accuracy */
3406 case SV_RING_ACCURACY:
3409 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
3415 o_ptr->ident |= (IDENT_BROKEN);
3418 o_ptr->curse_flags |= TRC_CURSED;
3421 o_ptr->to_h = 0 - o_ptr->to_h;
3427 /* Ring of Protection */
3428 case SV_RING_PROTECTION:
3430 /* Bonus to armor class */
3431 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
3437 o_ptr->ident |= (IDENT_BROKEN);
3440 o_ptr->curse_flags |= TRC_CURSED;
3443 o_ptr->to_a = 0 - o_ptr->to_a;
3449 /* Ring of Slaying */
3450 case SV_RING_SLAYING:
3452 /* Bonus to damage and to hit */
3453 o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
3454 o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
3460 o_ptr->ident |= (IDENT_BROKEN);
3463 o_ptr->curse_flags |= TRC_CURSED;
3465 /* Reverse bonuses */
3466 o_ptr->to_h = 0 - o_ptr->to_h;
3467 o_ptr->to_d = 0 - o_ptr->to_d;
3473 case SV_RING_MUSCLE:
3475 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
3476 if (one_in_(4)) o_ptr->pval++;
3482 o_ptr->ident |= (IDENT_BROKEN);
3485 o_ptr->curse_flags |= TRC_CURSED;
3487 /* Reverse bonuses */
3488 o_ptr->pval = 0 - o_ptr->pval;
3493 case SV_RING_AGGRAVATION:
3496 o_ptr->ident |= (IDENT_BROKEN);
3499 o_ptr->curse_flags |= TRC_CURSED;
3501 if (power > 0) power = 0 - power;
3505 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3506 || (power > 2)) /* power > 2 is debug only */
3508 o_ptr->pval = MIN(o_ptr->pval, 4);
3509 /* Randart amulet */
3510 create_artifact(o_ptr, FALSE);
3512 else if ((power == 2) && one_in_(2))
3514 while(!o_ptr->name2)
3516 int tmp = m_bonus(10, level);
3517 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3518 switch(randint1(28))
3521 o_ptr->name2 = EGO_RING_THROW;
3524 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3525 o_ptr->name2 = EGO_RING_REGEN;
3528 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3529 o_ptr->name2 = EGO_RING_LITE;
3532 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3533 o_ptr->name2 = EGO_RING_TELEPORT;
3536 if (o_ptr->to_h) break;
3537 o_ptr->name2 = EGO_RING_TO_H;
3540 if (o_ptr->to_d) break;
3541 o_ptr->name2 = EGO_RING_TO_D;
3544 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3545 o_ptr->name2 = EGO_RING_SLAY;
3548 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3549 o_ptr->name2 = EGO_RING_WIZARD;
3552 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3553 o_ptr->name2 = EGO_RING_HERO;
3556 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3557 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3558 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3559 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3562 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3563 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;
3564 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3565 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3566 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3569 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3570 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;
3571 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3572 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3573 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3576 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3577 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;
3578 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3579 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3582 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3583 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;
3584 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3585 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3587 case 21: case 22: case 23: case 24: case 25: case 26:
3588 switch (o_ptr->sval)
3591 if (!one_in_(3)) break;
3592 o_ptr->name2 = EGO_RING_D_SPEED;
3594 case SV_RING_DAMAGE:
3595 case SV_RING_ACCURACY:
3596 case SV_RING_SLAYING:
3597 if (one_in_(2)) break;
3598 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3601 o_ptr->name2 = EGO_RING_BERSERKER;
3602 o_ptr->to_h -= 2+randint1(4);
3603 o_ptr->to_d += 2+randint1(4);
3606 case SV_RING_PROTECTION:
3607 o_ptr->name2 = EGO_RING_SUPER_AC;
3608 o_ptr->to_a += 7 + m_bonus(5, level);
3610 case SV_RING_RES_FEAR:
3611 o_ptr->name2 = EGO_RING_HERO;
3614 if (one_in_(2)) break;
3615 o_ptr->name2 = EGO_RING_HUNTER;
3617 case SV_RING_SEARCHING:
3618 o_ptr->name2 = EGO_RING_STEALTH;
3620 case SV_RING_TELEPORTATION:
3621 o_ptr->name2 = EGO_RING_TELE_AWAY;
3623 case SV_RING_RES_BLINDNESS:
3625 o_ptr->name2 = EGO_RING_RES_LITE;
3627 o_ptr->name2 = EGO_RING_RES_DARK;
3629 case SV_RING_LORDLY:
3630 if (!one_in_(20)) break;
3631 one_lordly_high_resistance(o_ptr);
3632 one_lordly_high_resistance(o_ptr);
3633 o_ptr->name2 = EGO_RING_TRUE;
3635 case SV_RING_SUSTAIN:
3636 if (!one_in_(4)) break;
3637 o_ptr->name2 = EGO_RING_RES_TIME;
3639 case SV_RING_FLAMES:
3640 if (!one_in_(2)) break;
3641 o_ptr->name2 = EGO_RING_DRAGON_F;
3644 if (!one_in_(2)) break;
3645 o_ptr->name2 = EGO_RING_DRAGON_C;
3647 case SV_RING_WARNING:
3648 if (!one_in_(2)) break;
3649 o_ptr->name2 = EGO_RING_M_DETECT;
3658 o_ptr->curse_flags = 0L;
3660 else if ((power == -2) && one_in_(2))
3662 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3663 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3664 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3665 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3666 o_ptr->art_flags[0] = 0;
3667 o_ptr->art_flags[1] = 0;
3668 while(!o_ptr->name2)
3670 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3674 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3675 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3678 o_ptr->name2 = EGO_RING_NO_MELEE;
3681 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3682 o_ptr->name2 = EGO_RING_AGGRAVATE;
3685 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3686 o_ptr->name2 = EGO_RING_TY_CURSE;
3689 o_ptr->name2 = EGO_RING_ALBINO;
3694 o_ptr->ident |= (IDENT_BROKEN);
3697 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3705 switch (o_ptr->sval)
3707 /* Amulet of wisdom/charisma */
3708 case SV_AMULET_INTELLIGENCE:
3709 case SV_AMULET_WISDOM:
3710 case SV_AMULET_CHARISMA:
3712 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3718 o_ptr->ident |= (IDENT_BROKEN);
3721 o_ptr->curse_flags |= (TRC_CURSED);
3723 /* Reverse bonuses */
3724 o_ptr->pval = 0 - o_ptr->pval;
3730 /* Amulet of brilliance */
3731 case SV_AMULET_BRILLIANCE:
3733 o_ptr->pval = 1 + m_bonus(3, level);
3734 if (one_in_(4)) o_ptr->pval++;
3740 o_ptr->ident |= (IDENT_BROKEN);
3743 o_ptr->curse_flags |= (TRC_CURSED);
3745 /* Reverse bonuses */
3746 o_ptr->pval = 0 - o_ptr->pval;
3752 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3756 o_ptr->curse_flags |= (TRC_CURSED);
3761 case SV_AMULET_RESISTANCE:
3763 if (one_in_(5)) one_high_resistance(o_ptr);
3764 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3768 /* Amulet of searching */
3769 case SV_AMULET_SEARCHING:
3771 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
3777 o_ptr->ident |= (IDENT_BROKEN);
3780 o_ptr->curse_flags |= (TRC_CURSED);
3782 /* Reverse bonuses */
3783 o_ptr->pval = 0 - (o_ptr->pval);
3789 /* Amulet of the Magi -- never cursed */
3790 case SV_AMULET_THE_MAGI:
3792 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3793 o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
3795 /* gain one low ESP */
3796 add_esp_weak(o_ptr, FALSE);
3801 /* Amulet of Doom -- always cursed */
3802 case SV_AMULET_DOOM:
3805 o_ptr->ident |= (IDENT_BROKEN);
3808 o_ptr->curse_flags |= (TRC_CURSED);
3811 o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
3812 o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
3813 if (power > 0) power = 0 - power;
3818 case SV_AMULET_MAGIC_MASTERY:
3820 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
3826 o_ptr->ident |= (IDENT_BROKEN);
3829 o_ptr->curse_flags |= (TRC_CURSED);
3831 /* Reverse bonuses */
3832 o_ptr->pval = 0 - o_ptr->pval;
3838 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3839 || (power > 2)) /* power > 2 is debug only */
3841 o_ptr->pval = MIN(o_ptr->pval, 4);
3842 /* Randart amulet */
3843 create_artifact(o_ptr, FALSE);
3845 else if ((power == 2) && one_in_(2))
3847 while(!o_ptr->name2)
3849 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3850 switch(randint1(21))
3853 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3854 o_ptr->name2 = EGO_AMU_SLOW_D;
3857 if (o_ptr->pval) break;
3858 o_ptr->name2 = EGO_AMU_INFRA;
3861 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3862 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3865 if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
3866 o_ptr->name2 = EGO_AMU_HOLD_EXP;
3869 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3870 o_ptr->name2 = EGO_AMU_LEVITATION;
3872 case 10: case 11: case 21:
3873 o_ptr->name2 = EGO_AMU_AC;
3876 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3877 if (m_bonus(10, level) > 8)
3878 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3880 o_ptr->name2 = EGO_AMU_RES_FIRE;
3883 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3884 if (m_bonus(10, level) > 8)
3885 o_ptr->name2 = EGO_AMU_RES_COLD_;
3887 o_ptr->name2 = EGO_AMU_RES_COLD;
3890 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3891 if (m_bonus(10, level) > 8)
3892 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3894 o_ptr->name2 = EGO_AMU_RES_ELEC;
3897 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3898 if (m_bonus(10, level) > 8)
3899 o_ptr->name2 = EGO_AMU_RES_ACID_;
3901 o_ptr->name2 = EGO_AMU_RES_ACID;
3903 case 16: case 17: case 18: case 19: case 20:
3904 switch (o_ptr->sval)
3906 case SV_AMULET_TELEPORT:
3907 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3908 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3909 else o_ptr->name2 = EGO_AMU_TELEPORT;
3911 case SV_AMULET_RESIST_ACID:
3912 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3914 case SV_AMULET_SEARCHING:
3915 o_ptr->name2 = EGO_AMU_STEALTH;
3917 case SV_AMULET_BRILLIANCE:
3918 if (!one_in_(3)) break;
3919 o_ptr->name2 = EGO_AMU_IDENT;
3921 case SV_AMULET_CHARISMA:
3922 if (!one_in_(3)) break;
3923 o_ptr->name2 = EGO_AMU_CHARM;
3925 case SV_AMULET_THE_MAGI:
3926 if (one_in_(2)) break;
3927 o_ptr->name2 = EGO_AMU_GREAT;
3929 case SV_AMULET_RESISTANCE:
3930 if (!one_in_(5)) break;
3931 o_ptr->name2 = EGO_AMU_DEFENDER;
3933 case SV_AMULET_TELEPATHY:
3934 if (!one_in_(3)) break;
3935 o_ptr->name2 = EGO_AMU_DETECTION;
3941 o_ptr->curse_flags = 0L;
3943 else if ((power == -2) && one_in_(2))
3945 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3946 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3947 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3948 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3949 o_ptr->art_flags[0] = 0;
3950 o_ptr->art_flags[1] = 0;
3951 while(!o_ptr->name2)
3953 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3957 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3958 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3961 o_ptr->name2 = EGO_AMU_FOOL;
3964 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3965 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3968 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3969 o_ptr->name2 = EGO_AMU_TY_CURSE;
3972 o_ptr->name2 = EGO_AMU_NAIVETY;
3977 o_ptr->ident |= (IDENT_BROKEN);
3980 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3988 * @brief モンスターが人形のベースにできるかを返す
3989 * @param r_idx チェックしたいモンスター種族のID
3990 * @return 人形にできるならTRUEを返す
3992 static bool item_monster_okay(MONRACE_IDX r_idx)
3994 monster_race *r_ptr = &r_info[r_idx];
3997 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
3998 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
3999 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
4000 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
4001 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
4002 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
4009 * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
4010 * Apply magic to an item known to be "boring"
4011 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4012 * @param level 生成基準階
4013 * @param power 生成ランク
4016 * Hack -- note the special code for various items
4018 static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
4020 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4025 /* Apply magic (good or bad) according to type */
4026 switch (o_ptr->tval)
4035 o_ptr->ident |= (IDENT_BROKEN);
4038 o_ptr->curse_flags |= (TRC_CURSED);
4045 o_ptr->xtra4 = o_ptr->pval;
4051 /* Hack -- Torches -- random fuel */
4052 if (o_ptr->sval == SV_LITE_TORCH)
4054 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4058 /* Hack -- Lanterns -- random fuel */
4059 if (o_ptr->sval == SV_LITE_LANTERN)
4061 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4065 if (power > 2) /* power > 2 is debug only */
4067 create_artifact(o_ptr, FALSE);
4069 else if ((power == 2) || ((power == 1) && one_in_(3)))
4071 while (!o_ptr->name2)
4075 bool okay_flag = TRUE;
4077 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
4079 switch (o_ptr->name2)
4082 if (o_ptr->sval == SV_LITE_FEANOR)
4090 else if (power == -2)
4092 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
4094 switch (o_ptr->name2)
4096 case EGO_LITE_DARKNESS:
4099 if (o_ptr->sval == SV_LITE_TORCH)
4101 add_flag(o_ptr->art_flags, TR_LITE_M1);
4103 else if (o_ptr->sval == SV_LITE_LANTERN)
4105 add_flag(o_ptr->art_flags, TR_LITE_M2);
4107 else if (o_ptr->sval == SV_LITE_FEANOR)
4109 add_flag(o_ptr->art_flags, TR_LITE_M3);
4121 /* The wand or staff gets a number of initial charges equal
4122 * to between 1/2 (+1) and the full object kind's pval. -LM-
4124 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
4130 /* Transfer the pval. -LM- */
4131 o_ptr->pval = k_ptr->pval;
4138 object_aware(o_ptr);
4139 object_known(o_ptr);
4145 PARAMETER_VALUE i = 1;
4148 monster_race *r_ptr;
4150 /* Pick a random non-unique monster race */
4153 i = randint1(max_r_idx - 1);
4155 if (!item_monster_okay(i)) continue;
4156 if (i == MON_TSUCHINOKO) continue;
4160 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4162 /* Ignore dead monsters */
4163 if (!r_ptr->rarity) continue;
4165 /* Ignore uncommon monsters */
4166 if (r_ptr->rarity > 100) continue;
4168 /* Prefer less out-of-depth monsters */
4169 if (randint0(check)) continue;
4176 /* Some figurines are cursed */
4177 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
4184 PARAMETER_VALUE i = 1;
4189 monster_race *r_ptr;
4191 if (o_ptr->sval == SV_SKELETON)
4193 match = RF9_DROP_SKELETON;
4195 else if (o_ptr->sval == SV_CORPSE)
4197 match = RF9_DROP_CORPSE;
4200 /* Hack -- Remove the monster restriction */
4201 get_mon_num_prep(item_monster_okay, NULL);
4203 /* Pick a random non-unique monster race */
4206 i = get_mon_num(dun_level);
4210 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4212 /* Ignore dead monsters */
4213 if (!r_ptr->rarity) continue;
4215 /* Ignore corpseless monsters */
4216 if (!(r_ptr->flags9 & match)) continue;
4218 /* Prefer less out-of-depth monsters */
4219 if (randint0(check)) continue;
4227 object_aware(o_ptr);
4228 object_known(o_ptr);
4234 PARAMETER_VALUE i = 1;
4236 monster_race *r_ptr;
4238 /* Pick a random monster race */
4241 i = randint1(max_r_idx - 1);
4245 /* Ignore dead monsters */
4246 if (!r_ptr->rarity) continue;
4255 msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
4257 object_aware(o_ptr);
4258 object_known(o_ptr);
4265 DEPTH obj_level = k_info[o_ptr->k_idx].level;
4267 /* Hack -- skip ruined chests */
4268 if (obj_level <= 0) break;
4270 /* Hack -- pick a "difficulty" */
4271 o_ptr->pval = randint1(obj_level);
4272 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4274 o_ptr->xtra3 = dun_level + 5;
4276 /* Never exceed "difficulty" of 55 to 59 */
4277 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4285 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
4286 * Complete the "creation" of an object by applying "magic" to the item
4287 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4289 * @param mode 生成オプション
4292 * This includes not only rolling for random bonuses, but also putting the\n
4293 * finishing touches on ego-items and artifacts, giving charges to wands and\n
4294 * staffs, giving fuel to lites, and placing traps on chests.\n
4296 * In particular, note that "Instant Artifacts", if "created" by an external\n
4297 * routine, must pass through this function to complete the actual creation.\n
4299 * The base "chance" of the item being "good" increases with the "level"\n
4300 * parameter, which is usually derived from the dungeon level, being equal\n
4301 * to the level plus 10, up to a maximum of 75. If "good" is true, then\n
4302 * the object is guaranteed to be "good". If an object is "good", then\n
4303 * the chance that the object will be "great" (ego-item or artifact), also\n
4304 * increases with the "level", being equal to half the level, plus 5, up to\n
4305 * a maximum of 20. If "great" is true, then the object is guaranteed to be\n
4306 * "great". At dungeon level 65 and below, 15/100 objects are "great".\n
4308 * If the object is not "good", there is a chance it will be "cursed", and\n
4309 * if it is "cursed", there is a chance it will be "broken". These chances\n
4310 * are related to the "good" / "great" chances above.\n
4312 * Otherwise "normal" rings and amulets will be "good" half the time and\n
4313 * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4315 * If "okay" is true, and the object is going to be "great", then there is\n
4316 * a chance that an artifact will be created. This is true even if both the\n
4317 * "good" and "great" arguments are false. As a total hack, if "great" is\n
4318 * true, then the item gets 3 extra "attempts" to become an artifact.\n
4320 void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
4322 int i, rolls, f1, f2, power;
4324 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4326 /* Maximum "level" for various things */
4327 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4329 /* Base chance of being "good" */
4332 /* Maximal chance of being "good" */
4333 if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4335 /* Base chance of being "great" */
4338 /* Maximal chance of being "great" */
4339 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4340 f2 = d_info[dungeon_type].obj_great;
4342 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4347 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4356 /* Roll for "good" */
4357 if ((mode & AM_GOOD) || magik(f1))
4362 /* Roll for "great" */
4363 if ((mode & AM_GREAT) || magik(f2))
4367 /* Roll for "special" */
4368 if (mode & AM_SPECIAL) power = 3;
4372 /* Roll for "cursed" */
4375 /* Assume "cursed" */
4378 /* Roll for "broken" */
4379 if (magik(f2)) power = -2;
4383 if (mode & AM_CURSED)
4385 /* Assume 'cursed' */
4390 /* Everything else gets more badly cursed */
4397 /* Assume no rolls */
4400 /* Get one roll if excellent */
4401 if (power >= 2) rolls = 1;
4403 /* Hack -- Get four rolls if forced great or special */
4404 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4406 /* Hack -- Get no rolls if not allowed */
4407 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4409 /* Roll for artifacts if allowed */
4410 for (i = 0; i < rolls; i++)
4412 /* Roll for an artifact */
4413 if (make_artifact(o_ptr)) break;
4414 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4416 if (make_artifact(o_ptr)) break;
4421 /* Hack -- analyze artifacts */
4422 if (object_is_fixed_artifact(o_ptr))
4424 artifact_type *a_ptr = &a_info[o_ptr->name1];
4426 /* Hack -- Mark the artifact as "created" */
4429 /* Hack -- Memorize location of artifact in saved floors */
4430 if (character_dungeon)
4431 a_ptr->floor_id = p_ptr->floor_id;
4433 /* Extract the other fields */
4434 o_ptr->pval = a_ptr->pval;
4435 o_ptr->ac = a_ptr->ac;
4436 o_ptr->dd = a_ptr->dd;
4437 o_ptr->ds = a_ptr->ds;
4438 o_ptr->to_a = a_ptr->to_a;
4439 o_ptr->to_h = a_ptr->to_h;
4440 o_ptr->to_d = a_ptr->to_d;
4441 o_ptr->weight = a_ptr->weight;
4442 o_ptr->xtra2 = a_ptr->act_idx;
4444 if (o_ptr->name1 == ART_MILIM)
4446 if(p_ptr->pseikaku == SEIKAKU_SEXY)
4452 /* Hack -- extract the "broken" flag */
4453 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4455 /* Hack -- extract the "cursed" flag */
4456 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4457 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4458 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4459 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4460 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4461 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4468 switch (o_ptr->tval)
4477 if (power) a_m_aux_1(o_ptr, lev, power);
4483 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4489 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4503 /* Elven Cloak and Black Clothes ... */
4504 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4505 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4506 o_ptr->pval = randint1(4);
4510 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4511 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4512 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4513 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4514 a_m_aux_2(o_ptr, lev, power);
4516 if (power) a_m_aux_2(o_ptr, lev, power);
4524 if (!power && (randint0(100) < 50)) power = -1;
4525 a_m_aux_3(o_ptr, lev, power);
4531 a_m_aux_4(o_ptr, lev, power);
4536 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4537 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4538 (p_ptr->pseikaku == SEIKAKU_SEXY))
4541 add_flag(o_ptr->art_flags, TR_STR);
4542 add_flag(o_ptr->art_flags, TR_INT);
4543 add_flag(o_ptr->art_flags, TR_WIS);
4544 add_flag(o_ptr->art_flags, TR_DEX);
4545 add_flag(o_ptr->art_flags, TR_CON);
4546 add_flag(o_ptr->art_flags, TR_CHR);
4549 /* Hack -- analyze ego-items */
4550 if (object_is_ego(o_ptr))
4552 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4554 /* Hack -- acquire "broken" flag */
4555 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4557 /* Hack -- acquire "cursed" flag */
4558 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4559 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4560 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4561 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4562 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4563 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4565 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4566 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4567 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4568 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4569 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4570 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4571 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4572 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4578 while (one_in_(o_ptr->dd));
4580 if (o_ptr->dd > 9) o_ptr->dd = 9;
4583 /* Hack -- apply activatin index if needed */
4584 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
4586 /* Hack -- apply extra penalties if needed */
4587 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4589 /* Hack -- obtain bonuses */
4590 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4591 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4592 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4594 /* Hack -- obtain pval */
4595 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4598 /* Hack -- apply extra bonuses if needed */
4601 /* Hack -- obtain bonuses */
4602 if (e_ptr->max_to_h)
4604 if (e_ptr->max_to_h > 127)
4605 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4606 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4608 if (e_ptr->max_to_d)
4610 if (e_ptr->max_to_d > 127)
4611 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4612 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4614 if (e_ptr->max_to_a)
4616 if (e_ptr->max_to_a > 127)
4617 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4618 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4621 /* Accuracy ego must have high to_h */
4622 if(o_ptr->name2 == EGO_ACCURACY)
4624 while(o_ptr->to_h < o_ptr->to_d + 10)
4629 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4632 /* Accuracy ego must have high to_h */
4633 if(o_ptr->name2 == EGO_VELOCITY)
4635 while(o_ptr->to_d < o_ptr->to_h + 10)
4640 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4643 /* Protection ego must have high to_a */
4644 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4646 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4649 /* Hack -- obtain pval */
4650 if (e_ptr->max_pval)
4652 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4655 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4657 else if (o_ptr->name2 == EGO_DEMON)
4659 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4661 o_ptr->pval += randint1(2);
4665 o_ptr->pval += randint1(e_ptr->max_pval);
4668 else if (o_ptr->name2 == EGO_ATTACKS)
4670 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4671 if (o_ptr->pval > 3) o_ptr->pval = 3;
4672 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4673 o_ptr->pval += randint1(2);
4675 else if (o_ptr->name2 == EGO_BAT)
4677 o_ptr->pval = randint1(e_ptr->max_pval);
4678 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4680 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4682 o_ptr->pval = randint1(e_ptr->max_pval);
4686 o_ptr->pval += randint1(e_ptr->max_pval);
4691 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4693 o_ptr->pval = randint1(o_ptr->pval);
4695 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4702 /* Examine real objects */
4705 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4707 /* Hack -- acquire "broken" flag */
4708 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4710 /* Hack -- acquire "cursed" flag */
4711 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4712 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4713 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4714 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4715 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4716 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4724 * @brief ベースアイテムが上質として扱われるかどうかを返す。
4725 * Hack -- determine if a template is "good"
4726 * @param k_idx 判定したいベースアイテムのID
4727 * @return ベースアイテムが上質ならばTRUEを返す。
4729 static bool kind_is_good(KIND_OBJECT_IDX k_idx)
4731 object_kind *k_ptr = &k_info[k_idx];
4733 /* Analyze the item type */
4734 switch (k_ptr->tval)
4736 /* Armor -- Good unless damaged */
4747 if (k_ptr->to_a < 0) return (FALSE);
4751 /* Weapons -- Good unless damaged */
4758 if (k_ptr->to_h < 0) return (FALSE);
4759 if (k_ptr->to_d < 0) return (FALSE);
4763 /* Ammo -- Arrows/Bolts are good */
4770 /* Books -- High level books are good (except Arcane books) */
4772 case TV_SORCERY_BOOK:
4773 case TV_NATURE_BOOK:
4778 case TV_DAEMON_BOOK:
4779 case TV_CRUSADE_BOOK:
4781 case TV_HISSATSU_BOOK:
4784 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4788 /* Rings -- Rings of Speed are good */
4791 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4792 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4796 /* Amulets -- Amulets of the Magi and Resistance are good */
4799 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4800 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4805 /* Assume not good */
4810 * @brief 生成階に応じたベースアイテムの生成を行う。
4811 * Attempt to make an object (normal or good/great)
4812 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4813 * @param mode オプションフラグ
4814 * @return 生成に成功したらTRUEを返す。
4816 * This routine plays nasty games to generate the "special artifacts".\n
4817 * This routine uses "object_level" for the "generation level".\n
4818 * We assume that the given object has been "wiped".\n
4820 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
4826 /* Chance of "special object" */
4827 prob = ((mode & AM_GOOD) ? 10 : 1000);
4829 /* Base level for the object */
4830 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4833 /* Generate a special object, or a normal object */
4834 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4836 KIND_OBJECT_IDX k_idx;
4839 if ((mode & AM_GOOD) && !get_obj_num_hook)
4841 /* Activate restriction (if already specified, use that) */
4842 get_obj_num_hook = kind_is_good;
4845 /* Restricted objects - prepare allocation table */
4846 if (get_obj_num_hook) get_obj_num_prep();
4848 /* Pick a random object */
4849 k_idx = get_obj_num(base);
4851 /* Restricted objects */
4852 if (get_obj_num_hook)
4854 /* Clear restriction */
4855 get_obj_num_hook = NULL;
4857 /* Reset allocation table to default */
4861 /* Handle failure */
4862 if (!k_idx) return (FALSE);
4864 /* Prepare the object */
4865 object_prep(j_ptr, k_idx);
4868 /* Apply magic (allow artifacts) */
4869 apply_magic(j_ptr, object_level, mode);
4871 /* Hack -- generate multiple spikes/missiles */
4872 switch (j_ptr->tval)
4880 j_ptr->number = (byte)damroll(6, 7);
4884 if (cheat_peek) object_mention(j_ptr);
4892 * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
4893 * Attempt to place an object (normal or good/great) at the given location.
4894 * @param y 配置したいフロアのY座標
4895 * @param x 配置したいフロアのX座標
4896 * @param mode オプションフラグ
4897 * @return 生成に成功したらTRUEを返す。
4899 * This routine plays nasty games to generate the "special artifacts".\n
4900 * This routine uses "object_level" for the "generation level".\n
4901 * This routine requires a clean floor grid destination.\n
4903 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
4908 cave_type *c_ptr = &cave[y][x];
4914 /* Paranoia -- check bounds */
4915 if (!in_bounds(y, x)) return;
4917 /* Require floor space */
4918 if (!cave_drop_bold(y, x)) return;
4920 /* Avoid stacking on other objects */
4921 if (c_ptr->o_idx) return;
4924 /* Get local object */
4927 /* Wipe the object */
4930 /* Make an object (if possible) */
4931 if (!make_object(q_ptr, mode)) return;
4934 /* Make an object */
4942 /* Acquire object */
4943 o_ptr = &o_list[o_idx];
4945 /* Structure Copy */
4946 object_copy(o_ptr, q_ptr);
4952 o_ptr->next_o_idx = c_ptr->o_idx;
4954 /* Place the object */
4955 c_ptr->o_idx = o_idx;
4964 /* Hack -- Preserve artifacts */
4965 if (object_is_fixed_artifact(q_ptr))
4967 a_info[q_ptr->name1].cur_num = 0;
4974 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
4975 * Make a treasure object
4976 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4977 * @return 生成に成功したらTRUEを返す。
4979 * The location must be a legal, clean, floor grid.
4981 bool make_gold(object_type *j_ptr)
4986 /* Hack -- Pick a Treasure variety */
4987 i = ((randint1(object_level + 2) + 2) / 2) - 1;
4989 /* Apply "extra" magic */
4990 if (one_in_(GREAT_OBJ))
4992 i += randint1(object_level + 1);
4995 /* Hack -- Creeping Coins only generate "themselves" */
4996 if (coin_type) i = coin_type;
4998 /* Do not create "illegal" Treasure Types */
4999 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
5001 /* Prepare a gold object */
5002 object_prep(j_ptr, OBJ_GOLD_LIST + i);
5004 /* Hack -- Base coin cost */
5005 base = k_info[OBJ_GOLD_LIST + i].cost;
5007 /* Determine how much the treasure is "worth" */
5008 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
5016 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
5017 * Places a treasure (Gold or Gems) at given location
5018 * @param y 配置したいフロアのY座標
5019 * @param x 配置したいフロアのX座標
5020 * @return 生成に成功したらTRUEを返す。
5022 * The location must be a legal, clean, floor grid.
5024 void place_gold(POSITION y, POSITION x)
5029 cave_type *c_ptr = &cave[y][x];
5035 /* Paranoia -- check bounds */
5036 if (!in_bounds(y, x)) return;
5038 /* Require floor space */
5039 if (!cave_drop_bold(y, x)) return;
5041 /* Avoid stacking on other objects */
5042 if (c_ptr->o_idx) return;
5045 /* Get local object */
5048 /* Wipe the object */
5051 /* Make some gold */
5052 if (!make_gold(q_ptr)) return;
5054 /* Make an object */
5062 /* Acquire object */
5063 o_ptr = &o_list[o_idx];
5065 /* Copy the object */
5066 object_copy(o_ptr, q_ptr);
5073 o_ptr->next_o_idx = c_ptr->o_idx;
5075 /* Place the object */
5076 c_ptr->o_idx = o_idx;
5087 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
5088 * Let an object fall to the ground at or near a location.
5089 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
5090 * @param chance ドロップの成功率(%)
5091 * @param y 配置したいフロアのY座標
5092 * @param x 配置したいフロアのX座標
5093 * @return 生成に成功したらオブジェクトのIDを返す。
5095 * The initial location is assumed to be "in_bounds()".\n
5097 * This function takes a parameter "chance". This is the percentage\n
5098 * chance that the item will "disappear" instead of drop. If the object\n
5099 * has been thrown, then this is the chance of disappearance on contact.\n
5101 * Hack -- this function uses "chance" to determine if it should produce\n
5102 * some form of "description" of the drop event (under the player).\n
5104 * We check several locations to see if we can find a location at which\n
5105 * the object can combine, stack, or be placed. Artifacts will try very\n
5106 * hard to be placed, including "teleporting" to a useful grid if needed.\n
5108 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
5115 POSITION ty, tx = 0;
5117 OBJECT_IDX o_idx = 0;
5118 OBJECT_IDX this_o_idx, next_o_idx = 0;
5122 char o_name[MAX_NLEN];
5128 /* Extract plural */
5129 bool plural = (j_ptr->number != 1);
5132 /* Describe object */
5133 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5136 /* Handle normal "breakage" */
5137 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
5140 msg_format("%sは消えた。", o_name);
5142 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5145 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
5162 /* Scan local grids */
5163 for (dy = -3; dy <= 3; dy++)
5165 /* Scan local grids */
5166 for (dx = -3; dx <= 3; dx++)
5170 /* Calculate actual distance */
5171 d = (dy * dy) + (dx * dx);
5173 /* Ignore distant grids */
5174 if (d > 10) continue;
5179 /* Skip illegal grids */
5180 if (!in_bounds(ty, tx)) continue;
5182 /* Require line of projection */
5183 if (!projectable(y, x, ty, tx)) continue;
5186 c_ptr = &cave[ty][tx];
5188 /* Require floor space */
5189 if (!cave_drop_bold(ty, tx)) continue;
5194 /* Scan objects in that grid */
5195 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5199 /* Acquire object */
5200 o_ptr = &o_list[this_o_idx];
5202 /* Acquire next object */
5203 next_o_idx = o_ptr->next_o_idx;
5205 /* Check for possible combination */
5206 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5212 /* Add new object */
5216 if (k > 99) continue;
5218 /* Calculate score */
5219 s = 1000 - (d + k * 5);
5221 /* Skip bad values */
5222 if (s < bs) continue;
5224 /* New best value */
5227 /* Apply the randomizer to equivalent values */
5228 if ((++bn >= 2) && !one_in_(bn)) continue;
5242 /* Handle lack of space */
5243 if (!flag && !object_is_artifact(j_ptr))
5246 msg_format("%sは消えた。", o_name);
5248 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5253 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5261 for (i = 0; !flag && (i < 1000); i++)
5264 ty = rand_spread(by, 1);
5265 tx = rand_spread(bx, 1);
5267 /* Verify location */
5268 if (!in_bounds(ty, tx)) continue;
5270 /* Bounce to that location */
5274 /* Require floor space */
5275 if (!cave_drop_bold(by, bx)) continue;
5283 int candidates = 0, pick;
5285 for (ty = 1; ty < cur_hgt - 1; ty++)
5287 for (tx = 1; tx < cur_wid - 1; tx++)
5289 /* A valid space found */
5290 if (cave_drop_bold(ty, tx)) candidates++;
5294 /* No valid place! */
5298 msg_format("%sは消えた。", o_name);
5300 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5304 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5306 /* Mega-Hack -- preserve artifacts */
5309 /* Hack -- Preserve unknown artifacts */
5310 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5312 /* Mega-Hack -- Preserve the artifact */
5313 a_info[j_ptr->name1].cur_num = 0;
5321 /* Choose a random one */
5322 pick = randint1(candidates);
5324 for (ty = 1; ty < cur_hgt - 1; ty++)
5326 for (tx = 1; tx < cur_wid - 1; tx++)
5328 if (cave_drop_bold(ty, tx))
5332 /* Is this a picked one? */
5346 c_ptr = &cave[by][bx];
5348 /* Scan objects in that grid for combination */
5349 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5353 /* Acquire object */
5354 o_ptr = &o_list[this_o_idx];
5356 /* Acquire next object */
5357 next_o_idx = o_ptr->next_o_idx;
5359 /* Check for combination */
5360 if (object_similar(o_ptr, j_ptr))
5362 /* Combine the items */
5363 object_absorb(o_ptr, j_ptr);
5372 /* Get new object */
5373 if (!done) o_idx = o_pop();
5376 if (!done && !o_idx)
5379 msg_format("%sは消えた。", o_name);
5381 msg_format("The %s disappear%s.",
5382 o_name, (plural ? "" : "s"));
5387 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5389 /* Hack -- Preserve artifacts */
5390 if (object_is_fixed_artifact(j_ptr))
5392 a_info[j_ptr->name1].cur_num = 0;
5402 /* Structure copy */
5403 object_copy(&o_list[o_idx], j_ptr);
5405 /* Access new object */
5406 j_ptr = &o_list[o_idx];
5413 j_ptr->held_m_idx = 0;
5416 j_ptr->next_o_idx = c_ptr->o_idx;
5418 /* Place the object */
5419 c_ptr->o_idx = o_idx;
5433 /* Mega-Hack -- no message if "dropped" by player */
5434 /* Message when an object falls under the player */
5435 if (chance && player_bold(by, bx))
5437 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5446 * Scatter some "great" objects near the player
5447 * @param y1 配置したいフロアのY座標
5448 * @param x1 配置したいフロアのX座標
5449 * @param num 獲得の処理回数
5450 * @param great TRUEならば必ず高級品以上を落とす
5451 * @param special TRUEならば必ず特別品を落とす
5452 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5455 void acquirement(POSITION y1, POSITION x1, int num, bool great, bool special, bool known)
5458 object_type object_type_body;
5459 BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ;
5464 /* Get local object */
5465 i_ptr = &object_type_body;
5467 /* Wipe the object */
5470 /* Make a good (or great) object (if possible) */
5471 if (!make_object(i_ptr, mode)) continue;
5475 object_aware(i_ptr);
5476 object_known(i_ptr);
5479 /* Drop the object */
5480 (void)drop_near(i_ptr, -1, y1, x1);
5485 * Scatter some "amusing" objects near the player
5488 #define AMS_NOTHING 0x00 /* No restriction */
5489 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
5490 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
5491 #define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */
5492 #define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */
5496 OBJECT_TYPE_VALUE tval;
5497 OBJECT_SUBTYPE_VALUE sval;
5502 amuse_type amuse_info[] =
5504 { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
5505 { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
5506 { TV_SPIKE, SV_ANY, 10, AMS_PILE },
5507 { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
5508 { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
5509 { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
5510 { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
5511 { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
5512 { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
5513 { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
5514 { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
5515 { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
5516 { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
5523 * @param y1 配置したいフロアのY座標
5524 * @param x1 配置したいフロアのX座標
5525 * @param num 誰得の処理回数
5526 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5529 void amusement(POSITION y1, POSITION x1, int num, bool known)
5532 object_type object_type_body;
5535 for (n = 0; amuse_info[n].tval != 0; n++)
5537 t += amuse_info[n].prob;
5544 KIND_OBJECT_IDX k_idx;
5545 ARTIFACT_IDX a_idx = 0;
5546 int r = randint0(t);
5547 bool insta_art, fixed_art;
5551 r -= amuse_info[i].prob;
5555 /* Get local object */
5556 i_ptr = &object_type_body;
5558 /* Wipe the object */
5561 /* Wipe the object */
5562 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
5564 /* Paranoia - reroll if nothing */
5565 if (!k_idx) continue;
5567 /* Search an artifact index if need */
5568 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
5569 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
5571 if (insta_art || fixed_art)
5573 for (a_idx = 1; a_idx < max_a_idx; a_idx++)
5575 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
5576 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
5577 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
5578 if (a_info[a_idx].cur_num > 0) continue;
5582 if (a_idx >= max_a_idx) continue;
5585 /* Make an object (if possible) */
5586 object_prep(i_ptr, k_idx);
5587 if (a_idx) i_ptr->name1 = a_idx;
5588 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
5590 if (amuse_info[i].flag & AMS_NO_UNIQUE)
5592 if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
5595 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
5596 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
5600 object_aware(i_ptr);
5601 object_known(i_ptr);
5604 /* Paranoia - reroll if nothing */
5605 if (!(i_ptr->k_idx)) continue;
5607 /* Drop the object */
5608 (void)drop_near(i_ptr, -1, y1, x1);
5616 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5617 * Describe the charges on an item in the inventory.
5618 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5621 void inven_item_charges(INVENTORY_IDX item)
5623 object_type *o_ptr = &inventory[item];
5625 /* Require staff/wand */
5626 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5628 /* Require known item */
5629 if (!object_is_known(o_ptr)) return;
5632 if (o_ptr->pval <= 0)
5634 msg_print("もう魔力が残っていない。");
5638 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5641 /* Multiple charges */
5642 if (o_ptr->pval != 1)
5644 msg_format("You have %d charges remaining.", o_ptr->pval);
5650 msg_format("You have %d charge remaining.", o_ptr->pval);
5657 * @brief アイテムの残り所持数メッセージを表示する /
5658 * Describe an item in the inventory.
5659 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5662 void inven_item_describe(INVENTORY_IDX item)
5664 object_type *o_ptr = &inventory[item];
5665 char o_name[MAX_NLEN];
5667 /* Get a description */
5668 object_desc(o_name, o_ptr, 0);
5671 /* "no more" の場合はこちらで表示する */
5672 if (o_ptr->number <= 0)
5674 /*FIRST*//*ここはもう通らないかも */
5675 msg_format("もう%sを持っていない。", o_name);
5679 /* アイテム名を英日切り替え機能対応 */
5680 msg_format("まだ %sを持っている。", o_name);
5683 msg_format("You have %s.", o_name);
5689 * @brief アイテムを増やし残り所持数メッセージを表示する /
5690 * Increase the "number" of an item in the inventory
5691 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5695 void inven_item_increase(INVENTORY_IDX item, int num)
5697 object_type *o_ptr = &inventory[item];
5700 num += o_ptr->number;
5703 if (num > 255) num = 255;
5704 else if (num < 0) num = 0;
5707 num -= (ITEM_NUMBER)o_ptr->number;
5709 /* Change the number and weight */
5712 /* Add the number */
5713 o_ptr->number += num;
5715 /* Add the weight */
5716 p_ptr->total_weight += (num * o_ptr->weight);
5718 /* Recalculate bonuses */
5719 p_ptr->update |= (PU_BONUS);
5721 /* Recalculate mana XXX */
5722 p_ptr->update |= (PU_MANA);
5724 /* Combine the pack */
5725 p_ptr->notice |= (PN_COMBINE);
5727 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5729 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5730 if (!o_ptr->number && p_ptr->ele_attack)
5732 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5734 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5736 /* Clear all temporary elemental brands */
5737 set_ele_attack(0, 0);
5745 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5746 * Erase an inventory slot if it has no more items
5747 * @param item 消去したいプレイヤーのアイテム所持スロット
5750 void inven_item_optimize(INVENTORY_IDX item)
5752 object_type *o_ptr = &inventory[item];
5754 /* Only optimize real items */
5755 if (!o_ptr->k_idx) return;
5757 /* Only optimize empty items */
5758 if (o_ptr->number) return;
5760 /* The item is in the pack */
5761 if (item < INVEN_RARM)
5768 /* Slide everything down */
5769 for (i = item; i < INVEN_PACK; i++)
5771 /* Structure copy */
5772 inventory[i] = inventory[i+1];
5775 /* Erase the "final" slot */
5776 object_wipe(&inventory[i]);
5778 p_ptr->window |= (PW_INVEN);
5781 /* The item is being wielded */
5787 /* Erase the empty slot */
5788 object_wipe(&inventory[item]);
5790 /* Recalculate bonuses */
5791 p_ptr->update |= (PU_BONUS);
5793 /* Recalculate torch */
5794 p_ptr->update |= (PU_TORCH);
5796 /* Recalculate mana XXX */
5797 p_ptr->update |= (PU_MANA);
5799 p_ptr->window |= (PW_EQUIP);
5802 p_ptr->window |= (PW_SPELL);
5806 * @brief 床上の魔道具の残り残量メッセージを表示する /
5807 * Describe the charges on an item on the floor.
5808 * @param item メッセージの対象にしたいアイテム所持スロット
5811 void floor_item_charges(INVENTORY_IDX item)
5813 object_type *o_ptr = &o_list[item];
5815 /* Require staff/wand */
5816 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5818 /* Require known item */
5819 if (!object_is_known(o_ptr)) return;
5822 if (o_ptr->pval <= 0)
5824 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5828 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5831 /* Multiple charges */
5832 if (o_ptr->pval != 1)
5834 msg_format("There are %d charges remaining.", o_ptr->pval);
5840 msg_format("There is %d charge remaining.", o_ptr->pval);
5847 * @brief 床上のアイテムの残り数メッセージを表示する /
5848 * Describe the charges on an item on the floor.
5849 * @param item メッセージの対象にしたいアイテム所持スロット
5852 void floor_item_describe(INVENTORY_IDX item)
5854 object_type *o_ptr = &o_list[item];
5855 char o_name[MAX_NLEN];
5857 /* Get a description */
5858 object_desc(o_name, o_ptr, 0);
5861 /* "no more" の場合はこちらで表示を分ける */
5862 if (o_ptr->number <= 0)
5864 msg_format("床上には、もう%sはない。", o_name);
5868 msg_format("床上には、まだ %sがある。", o_name);
5871 msg_format("You see %s.", o_name);
5878 * @brief 床上のアイテムの数を増やす /
5879 * Increase the "number" of an item on the floor
5880 * @param item 増やしたいアイテムの所持スロット
5881 * @param num 増やしたいアイテムの数
5884 void floor_item_increase(INVENTORY_IDX item, int num)
5886 object_type *o_ptr = &o_list[item];
5889 num += o_ptr->number;
5892 if (num > 255) num = 255;
5893 else if (num < 0) num = 0;
5896 num -= (int)o_ptr->number;
5898 /* Change the number */
5899 o_ptr->number += (ITEM_NUMBER)num;
5904 * @brief 床上の数の無くなったアイテムスロットを消去する /
5905 * Optimize an item on the floor (destroy "empty" items)
5906 * @param item 消去したいアイテムの所持スロット
5909 void floor_item_optimize(INVENTORY_IDX item)
5911 object_type *o_ptr = &o_list[item];
5913 /* Paranoia -- be sure it exists */
5914 if (!o_ptr->k_idx) return;
5916 /* Only optimize empty items */
5917 if (o_ptr->number) return;
5919 /* Delete the object */
5920 delete_object_idx(item);
5925 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5926 * Check if we have space for an item in the pack without overflow
5927 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5928 * @return 溢れずに済むならTRUEを返す
5930 bool inven_carry_okay(object_type *o_ptr)
5935 if (inven_cnt < INVEN_PACK) return (TRUE);
5938 for (j = 0; j < INVEN_PACK; j++)
5940 object_type *j_ptr = &inventory[j];
5942 /* Skip non-objects */
5943 if (!j_ptr->k_idx) continue;
5945 /* Check if the two items can be combined */
5946 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5953 * @brief オブジェクトを定義された基準に従いソートするための関数 /
5954 * Check if we have space for an item in the pack without overflow
5955 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
5956 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
5957 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
5958 * @return o_ptrの方が上位ならばTRUEを返す。
5960 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5964 /* Use empty slots */
5965 if (!j_ptr->k_idx) return TRUE;
5967 /* Hack -- readable books always come first */
5968 if ((o_ptr->tval == REALM1_BOOK) &&
5969 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5970 if ((j_ptr->tval == REALM1_BOOK) &&
5971 (o_ptr->tval != REALM1_BOOK)) return FALSE;
5973 if ((o_ptr->tval == REALM2_BOOK) &&
5974 (j_ptr->tval != REALM2_BOOK)) return TRUE;
5975 if ((j_ptr->tval == REALM2_BOOK) &&
5976 (o_ptr->tval != REALM2_BOOK)) return FALSE;
5978 /* Objects sort by decreasing type */
5979 if (o_ptr->tval > j_ptr->tval) return TRUE;
5980 if (o_ptr->tval < j_ptr->tval) return FALSE;
5982 /* Non-aware (flavored) items always come last */
5983 /* Can happen in the home */
5984 if (!object_is_aware(o_ptr)) return FALSE;
5985 if (!object_is_aware(j_ptr)) return TRUE;
5987 /* Objects sort by increasing sval */
5988 if (o_ptr->sval < j_ptr->sval) return TRUE;
5989 if (o_ptr->sval > j_ptr->sval) return FALSE;
5991 /* Unidentified objects always come last */
5992 /* Objects in the home can be unknown */
5993 if (!object_is_known(o_ptr)) return FALSE;
5994 if (!object_is_known(j_ptr)) return TRUE;
5996 /* Fixed artifacts, random artifacts and ego items */
5997 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
5998 else if (o_ptr->art_name) o_type = 2;
5999 else if (object_is_ego(o_ptr)) o_type = 1;
6002 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
6003 else if (j_ptr->art_name) j_type = 2;
6004 else if (object_is_ego(j_ptr)) j_type = 1;
6007 if (o_type < j_type) return TRUE;
6008 if (o_type > j_type) return FALSE;
6010 switch (o_ptr->tval)
6016 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
6017 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
6023 /* Objects sort by increasing hit/damage bonuses */
6024 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
6025 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
6028 /* Hack: otherwise identical rods sort by
6029 increasing recharge time --dsb */
6031 if (o_ptr->pval < j_ptr->pval) return TRUE;
6032 if (o_ptr->pval > j_ptr->pval) return FALSE;
6036 /* Objects sort by decreasing value */
6037 return o_value > object_value(j_ptr);
6042 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
6043 * Add an item to the players inventory, and return the slot used.
6044 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
6045 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6047 * If the new item can combine with an existing item in the inventory,\n
6048 * it will do so, using "object_similar()" and "object_absorb()", else,\n
6049 * the item will be placed into the "proper" location in the inventory.\n
6051 * This function can be used to "over-fill" the player's pack, but only\n
6052 * once, and such an action must trigger the "overflow" code immediately.\n
6053 * Note that when the pack is being "over-filled", the new item must be\n
6054 * placed into the "overflow" slot, and the "overflow" must take place\n
6055 * before the pack is reordered, but (optionally) after the pack is\n
6056 * combined. This may be tricky. See "dungeon.c" for info.\n
6058 * Note that this code must remove any location/stack information\n
6059 * from the object once it is placed into the inventory.\n
6061 s16b inven_carry(object_type *o_ptr)
6063 INVENTORY_IDX i, j, k;
6064 INVENTORY_IDX n = -1;
6069 /* Check for combining */
6070 for (j = 0; j < INVEN_PACK; j++)
6072 j_ptr = &inventory[j];
6074 /* Skip non-objects */
6075 if (!j_ptr->k_idx) continue;
6077 /* Hack -- track last item */
6080 /* Check if the two items can be combined */
6081 if (object_similar(j_ptr, o_ptr))
6083 /* Combine the items */
6084 object_absorb(j_ptr, o_ptr);
6086 /* Increase the weight */
6087 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6089 /* Recalculate bonuses */
6090 p_ptr->update |= (PU_BONUS);
6092 p_ptr->window |= (PW_INVEN);
6101 if (inven_cnt > INVEN_PACK) return (-1);
6103 /* Find an empty slot */
6104 for (j = 0; j <= INVEN_PACK; j++)
6106 j_ptr = &inventory[j];
6108 /* Use it if found */
6109 if (!j_ptr->k_idx) break;
6116 /* Reorder the pack */
6119 /* Get the "value" of the item */
6120 s32b o_value = object_value(o_ptr);
6122 /* Scan every occupied slot */
6123 for (j = 0; j < INVEN_PACK; j++)
6125 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6132 for (k = n; k >= i; k--)
6134 /* Hack -- Slide the item */
6135 object_copy(&inventory[k+1], &inventory[k]);
6138 /* Wipe the empty slot */
6139 object_wipe(&inventory[i]);
6144 object_copy(&inventory[i], o_ptr);
6146 /* Access new object */
6147 j_ptr = &inventory[i];
6150 j_ptr->next_o_idx = 0;
6152 /* Forget monster */
6153 j_ptr->held_m_idx = 0;
6155 /* Forget location */
6156 j_ptr->iy = j_ptr->ix = 0;
6158 /* Player touches it, and no longer marked */
6159 j_ptr->marked = OM_TOUCHED;
6161 /* Increase the weight */
6162 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6164 /* Count the items */
6167 /* Recalculate bonuses */
6168 p_ptr->update |= (PU_BONUS);
6170 /* Combine and Reorder pack */
6171 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
6173 p_ptr->window |= (PW_INVEN);
6175 /* Return the slot */
6181 * @brief 装備スロットからオブジェクトを外すメインルーチン /
6182 * Take off (some of) a non-cursed equipment item
6183 * @param item オブジェクトを外したい所持テーブルのID
6185 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6187 * Note that only one item at a time can be wielded per slot.\n
6188 * Note that taking off an item when "full" may cause that item\n
6189 * to fall to the ground.\n
6190 * Return the inventory slot into which the item is placed.\n
6192 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
6203 char o_name[MAX_NLEN];
6206 /* Get the item to take off */
6207 o_ptr = &inventory[item];
6210 if (amt <= 0) return (-1);
6213 if (amt > o_ptr->number) amt = o_ptr->number;
6215 /* Get local object */
6218 /* Obtain a local object */
6219 object_copy(q_ptr, o_ptr);
6221 /* Modify quantity */
6222 q_ptr->number = amt;
6224 /* Describe the object */
6225 object_desc(o_name, q_ptr, 0);
6227 /* Took off weapon */
6228 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
6229 object_is_melee_weapon(o_ptr))
6231 act = _("を装備からはずした", "You were wielding");
6235 else if (item == INVEN_BOW)
6237 act = _("を装備からはずした", "You were holding");
6240 /* Took off light */
6241 else if (item == INVEN_LITE)
6243 act = _("を光源からはずした", "You were holding");
6246 /* Took off something */
6249 act = _("を装備からはずした", "You were wearing");
6252 /* Modify, Optimize */
6253 inven_item_increase(item, -amt);
6254 inven_item_optimize(item);
6256 /* Carry the object */
6257 slot = inven_carry(q_ptr);
6260 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
6262 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6272 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
6273 * Drop (some of) a non-cursed inventory/equipment item
6274 * @param item 所持テーブルのID
6275 * @param amt 落としたい個数
6278 * The object will be dropped "near" the current location
6280 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
6286 char o_name[MAX_NLEN];
6289 /* Access original object */
6290 o_ptr = &inventory[item];
6293 if (amt <= 0) return;
6296 if (amt > o_ptr->number) amt = o_ptr->number;
6299 /* Take off equipment */
6300 if (item >= INVEN_RARM)
6302 /* Take off first */
6303 item = inven_takeoff(item, amt);
6305 /* Access original object */
6306 o_ptr = &inventory[item];
6310 /* Get local object */
6313 /* Obtain local object */
6314 object_copy(q_ptr, o_ptr);
6316 /* Distribute charges of wands or rods */
6317 distribute_charges(o_ptr, q_ptr, amt);
6319 /* Modify quantity */
6320 q_ptr->number = amt;
6322 /* Describe local object */
6323 object_desc(o_name, q_ptr, 0);
6325 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
6327 /* Drop it near the player */
6328 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
6330 /* Modify, Describe, Optimize */
6331 inven_item_increase(item, -amt);
6332 inven_item_describe(item);
6333 inven_item_optimize(item);
6338 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
6339 * Combine items in the pack
6342 * Note special handling of the "overflow" slot
6344 void combine_pack(void)
6349 bool flag = FALSE, combined;
6355 /* Combine the pack (backwards) */
6356 for (i = INVEN_PACK; i > 0; i--)
6358 o_ptr = &inventory[i];
6360 /* Skip empty items */
6361 if (!o_ptr->k_idx) continue;
6363 /* Scan the items above that item */
6364 for (j = 0; j < i; j++)
6368 j_ptr = &inventory[j];
6370 /* Skip empty items */
6371 if (!j_ptr->k_idx) continue;
6374 * Get maximum number of the stack if these
6375 * are similar, get zero otherwise.
6377 max_num = object_similar_part(j_ptr, o_ptr);
6379 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6380 if (max_num && j_ptr->number < max_num)
6382 if (o_ptr->number + j_ptr->number <= max_num)
6387 /* Add together the item counts */
6388 object_absorb(j_ptr, o_ptr);
6390 /* One object is gone */
6393 /* Slide everything down */
6394 for (k = i; k < INVEN_PACK; k++)
6396 /* Structure copy */
6397 inventory[k] = inventory[k+1];
6400 /* Erase the "final" slot */
6401 object_wipe(&inventory[k]);
6405 int old_num = o_ptr->number;
6406 int remain = j_ptr->number + o_ptr->number - max_num;
6408 o_ptr->number -= remain;
6410 /* Add together the item counts */
6411 object_absorb(j_ptr, o_ptr);
6413 o_ptr->number = remain;
6415 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6416 if (o_ptr->tval == TV_ROD)
6418 o_ptr->pval = o_ptr->pval * remain / old_num;
6419 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6422 /* Hack -- if wands are stacking, combine the charges. -LM- */
6423 if (o_ptr->tval == TV_WAND)
6425 o_ptr->pval = o_ptr->pval * remain / old_num;
6429 p_ptr->window |= (PW_INVEN);
6441 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6445 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6446 * Reorder items in the pack
6449 * Note special handling of the "overflow" slot
6451 void reorder_pack(void)
6461 /* Re-order the pack (forwards) */
6462 for (i = 0; i < INVEN_PACK; i++)
6464 /* Mega-Hack -- allow "proper" over-flow */
6465 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6467 o_ptr = &inventory[i];
6469 /* Skip empty slots */
6470 if (!o_ptr->k_idx) continue;
6472 /* Get the "value" of the item */
6473 o_value = object_value(o_ptr);
6475 /* Scan every occupied slot */
6476 for (j = 0; j < INVEN_PACK; j++)
6478 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6481 /* Never move down */
6482 if (j >= i) continue;
6487 /* Get local object */
6490 /* Save a copy of the moving item */
6491 object_copy(q_ptr, &inventory[i]);
6493 /* Slide the objects */
6494 for (k = i; k > j; k--)
6496 /* Slide the item */
6497 object_copy(&inventory[k], &inventory[k-1]);
6500 /* Insert the moving item */
6501 object_copy(&inventory[j], q_ptr);
6503 p_ptr->window |= (PW_INVEN);
6506 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6510 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6511 * Hack -- display an object kind in the current window
6512 * @param k_idx ベースアイテムの参照ID
6515 * Include list of usable spells for readible books
6517 void display_koff(KIND_OBJECT_IDX k_idx)
6524 REALM_IDX use_realm;
6526 char o_name[MAX_NLEN];
6529 /* Erase the window */
6530 for (y = 0; y < Term->hgt; y++)
6532 /* Erase the line */
6533 Term_erase(0, y, 255);
6539 /* Get local object */
6542 /* Prepare the object */
6543 object_prep(q_ptr, k_idx);
6546 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6548 /* Mention the object name */
6549 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6551 /* Access the item's sval */
6553 use_realm = tval2realm(q_ptr->tval);
6555 /* Warriors are illiterate */
6556 if (p_ptr->realm1 || p_ptr->realm2)
6558 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6562 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6563 if (!is_magic(use_realm)) return;
6564 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6567 /* Display spells in readible books */
6571 SPELL_IDX spells[64];
6573 /* Extract spells */
6574 for (spell = 0; spell < 32; spell++)
6576 /* Check for this spell */
6577 if (fake_spell_flags[sval] & (1L << spell))
6579 /* Collect this spell */
6580 spells[num++] = spell;
6585 print_spells(0, spells, num, 2, 0, use_realm);
6590 * @brief 警告を放つアイテムを選択する /
6591 * Choose one of items that have warning flag
6592 * Calculate spell damages
6595 object_type *choose_warning_item(void)
6598 int choices[INVEN_TOTAL - INVEN_RARM];
6601 /* Paranoia -- Player has no warning ability */
6602 if (!p_ptr->warning) return NULL;
6604 /* Search Inventory */
6605 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6607 BIT_FLAGS flgs[TR_FLAG_SIZE];
6608 object_type *o_ptr = &inventory[i];
6610 object_flags(o_ptr, flgs);
6611 if (have_flag(flgs, TR_WARNING))
6613 choices[number] = i;
6618 /* Choice one of them */
6619 return number ? &inventory[choices[randint0(number)]] : NULL;
6623 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6624 * Calculate spell damages
6625 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6626 * @param typ 効果属性のID
6628 * @param max 算出した最大ダメージを返すポインタ
6631 static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
6633 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6634 int rlev = r_ptr->level;
6635 bool ignore_wraith_form = FALSE;
6637 /* Vulnerability, resistance and immunity */
6641 if (p_ptr->immune_elec)
6644 ignore_wraith_form = TRUE;
6648 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6649 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6650 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6651 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6652 if (IS_OPPOSE_ELEC())
6653 dam = (dam + 2) / 3;
6658 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6659 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6663 if (p_ptr->immune_acid)
6666 ignore_wraith_form = TRUE;
6670 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6671 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6672 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6673 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6679 if (p_ptr->immune_cold)
6682 ignore_wraith_form = TRUE;
6686 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6687 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6688 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6689 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6694 if (p_ptr->immune_fire)
6697 ignore_wraith_form = TRUE;
6701 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6702 if (prace_is_(RACE_ENT)) dam += dam / 3;
6703 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6704 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6705 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6710 ignore_wraith_form = TRUE;
6714 if (!p_ptr->blind &&
6715 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6716 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6719 ignore_wraith_form = TRUE;
6724 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6725 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6726 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6729 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6730 * "dam *= 2;" for later "dam /= 2"
6732 if (p_ptr->wraith_form) dam *= 2;
6736 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6739 ignore_wraith_form = TRUE;
6741 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6745 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6749 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6753 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6757 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6761 if (prace_is_(RACE_SPECTRE))
6764 ignore_wraith_form = TRUE;
6766 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6770 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6774 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6778 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6782 if (p_ptr->levitation) dam = (dam * 2) / 3;
6786 if (p_ptr->resist_shard) dam /= 2;
6790 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6791 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6795 if (p_ptr->mimic_form)
6797 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6800 ignore_wraith_form = TRUE;
6805 switch (p_ptr->prace)
6814 ignore_wraith_form = TRUE;
6821 if (p_ptr->align > 10) dam /= 2;
6822 else if (p_ptr->align < -10) dam *= 2;
6826 if (p_ptr->align > 10) dam *= 2;
6830 case GF_BRAIN_SMASH:
6831 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6834 ignore_wraith_form = TRUE;
6842 if (100 + rlev / 2 <= p_ptr->skill_sav)
6845 ignore_wraith_form = TRUE;
6850 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6853 ignore_wraith_form = TRUE;
6858 if (p_ptr->wraith_form && !ignore_wraith_form)
6864 if (dam > *max) *max = dam;
6868 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6869 * Calculate spell damages
6870 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6871 * @param typ 効果属性のID
6872 * @param m_idx 魔法を行使するモンスターのID
6873 * @param max 算出した最大ダメージを返すポインタ
6876 void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
6878 monster_type *m_ptr = &m_list[m_idx];
6879 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6880 spell_damcalc(m_ptr, typ, dam, max);
6884 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6885 * Calculate blow damages
6886 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6887 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6888 * @return 算出された最大ダメージを返す。
6890 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6892 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6894 bool check_wraith_form = TRUE;
6896 if (blow_ptr->method != RBM_EXPLODE)
6898 ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
6900 switch (blow_ptr->effect)
6904 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6905 dam = MAX(dam, tmp_dam * 2);
6911 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6915 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6917 check_wraith_form = FALSE;
6921 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6923 check_wraith_form = FALSE;
6927 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6929 check_wraith_form = FALSE;
6933 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6935 check_wraith_form = FALSE;
6940 check_wraith_form = FALSE;
6944 if (check_wraith_form && p_ptr->wraith_form)
6952 dam = (dam + 1) / 2;
6953 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
6961 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
6962 * Examine the grid (xx,yy) and warn the player if there are any danger
6963 * @param xx 危険性を調査するマスのX座標
6964 * @param yy 危険性を調査するマスのY座標
6965 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
6967 bool process_warning(POSITION xx, POSITION yy)
6971 char o_name[MAX_NLEN];
6973 #define WARNING_AWARE_RANGE 12
6975 static int old_damage = 0;
6977 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
6979 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
6982 monster_type *m_ptr;
6983 monster_race *r_ptr;
6985 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
6987 c_ptr = &cave[my][mx];
6989 if (!c_ptr->m_idx) continue;
6991 m_ptr = &m_list[c_ptr->m_idx];
6993 if (MON_CSLEEP(m_ptr)) continue;
6994 if (!is_hostile(m_ptr)) continue;
6996 r_ptr = &r_info[m_ptr->r_idx];
6998 /* Monster spells (only powerful ones)*/
6999 if (projectable(my, mx, yy, xx))
7001 BIT_FLAGS f4 = r_ptr->flags4;
7002 BIT_FLAGS f5 = r_ptr->a_ability_flags1;
7003 BIT_FLAGS f6 = r_ptr->a_ability_flags2;
7005 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
7007 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
7008 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
7009 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
7010 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, c_ptr->m_idx, &dam_max0);
7011 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, c_ptr->m_idx, &dam_max0);
7012 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, c_ptr->m_idx, &dam_max0);
7014 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, c_ptr->m_idx, &dam_max0);
7015 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, c_ptr->m_idx, &dam_max0);
7016 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, c_ptr->m_idx, &dam_max0);
7017 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, c_ptr->m_idx, &dam_max0);
7018 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, c_ptr->m_idx, &dam_max0);
7019 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, c_ptr->m_idx, &dam_max0);
7020 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, c_ptr->m_idx, &dam_max0);
7021 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, c_ptr->m_idx, &dam_max0);
7022 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
7023 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, c_ptr->m_idx, &dam_max0);
7024 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, c_ptr->m_idx, &dam_max0);
7025 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
7026 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, c_ptr->m_idx, &dam_max0);
7027 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, c_ptr->m_idx, &dam_max0);
7028 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, c_ptr->m_idx, &dam_max0);
7029 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, c_ptr->m_idx, &dam_max0);
7030 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, c_ptr->m_idx, &dam_max0);
7031 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, c_ptr->m_idx, &dam_max0);
7032 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, c_ptr->m_idx, &dam_max0);
7033 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, c_ptr->m_idx, &dam_max0);
7034 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
7035 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, c_ptr->m_idx, &dam_max0);
7036 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, c_ptr->m_idx, &dam_max0);
7039 /* Monster melee attacks */
7040 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
7042 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
7046 for (m = 0; m < 4; m++)
7048 /* Skip non-attacks */
7049 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
7051 /* Extract the attack info */
7052 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
7053 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
7055 if (dam_melee > dam_max0) dam_max0 = dam_melee;
7059 /* Contribution from this monster */
7060 dam_max += dam_max0;
7064 /* Prevent excessive warning */
7065 if (dam_max > old_damage)
7067 old_damage = dam_max * 3 / 2;
7069 if (dam_max > p_ptr->chp / 2)
7071 object_type *o_ptr = choose_warning_item();
7074 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7076 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7077 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7079 disturb(FALSE, TRUE);
7080 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7083 else old_damage = old_damage / 2;
7085 c_ptr = &cave[yy][xx];
7086 if (((!easy_disarm && is_trap(c_ptr->feat))
7087 || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
7089 object_type *o_ptr = choose_warning_item();
7092 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7094 strcpy(o_name, _("体", "body")); /* Warning ability without item */
7095 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
7096 disturb(FALSE, TRUE);
7097 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
7104 * エッセンス情報の構造体 / A structure for smithing
7107 int add; /* TR flag number or special essence id */
7108 cptr add_name; /* Name of this ability */
7109 ESSENCE_IDX type; /* Menu number */
7110 int essence; /* Index for carrying essences */
7111 int value; /* Needed value to add this ability */
7116 * エッセンス情報テーブル Smithing type data for Weapon smith
7119 static essence_type essence_info[] =
7121 {TR_STR, "腕力", 4, TR_STR, 20},
7122 {TR_INT, "知能", 4, TR_INT, 20},
7123 {TR_WIS, "賢さ", 4, TR_WIS, 20},
7124 {TR_DEX, "器用さ", 4, TR_DEX, 20},
7125 {TR_CON, "耐久力", 4, TR_CON, 20},
7126 {TR_CHR, "魅力", 4, TR_CHR, 20},
7127 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
7128 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
7129 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
7130 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
7131 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
7132 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
7133 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
7134 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
7135 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
7136 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
7137 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
7138 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
7139 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
7140 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
7141 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
7142 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
7143 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
7144 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
7145 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
7146 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
7147 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
7148 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
7149 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
7150 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
7151 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
7152 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
7153 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
7154 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
7155 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
7156 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
7157 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
7158 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
7159 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
7160 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
7161 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
7162 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
7163 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
7164 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
7165 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
7166 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
7167 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
7168 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
7169 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
7170 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
7171 {TR_SH_FIRE, "", 0, -2, 0},
7172 {TR_SH_ELEC, "", 0, -2, 0},
7173 {TR_SH_COLD, "", 0, -2, 0},
7174 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
7175 {TR_WARNING, "警告", 3, TR_WARNING, 20},
7176 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
7177 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
7178 {TR_LITE_2, "", 0, -2, 0},
7179 {TR_LITE_3, "", 0, -2, 0},
7180 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
7181 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
7182 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
7183 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
7184 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
7186 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
7187 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
7188 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
7189 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
7190 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
7191 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
7192 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
7193 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
7194 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
7195 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
7196 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
7197 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
7198 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
7199 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
7200 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
7201 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
7202 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
7203 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
7205 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
7206 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
7207 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
7208 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
7209 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
7210 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
7211 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
7212 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
7214 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
7215 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
7216 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
7217 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
7218 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
7219 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
7220 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
7221 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
7222 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
7223 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
7224 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
7225 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
7227 {-1, NULL, 0, -1, 0}
7230 static essence_type essence_info[] =
7232 {TR_STR, "strength", 4, TR_STR, 20},
7233 {TR_INT, "intelligence", 4, TR_INT, 20},
7234 {TR_WIS, "wisdom", 4, TR_WIS, 20},
7235 {TR_DEX, "dexterity", 4, TR_DEX, 20},
7236 {TR_CON, "constitution", 4, TR_CON, 20},
7237 {TR_CHR, "charisma", 4, TR_CHR, 20},
7238 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
7239 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
7240 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
7241 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
7242 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
7243 {TR_SPEED, "speed", 4, TR_SPEED, 12},
7244 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
7245 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
7246 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
7247 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
7248 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
7249 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
7250 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
7251 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
7252 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
7253 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
7254 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
7255 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
7256 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
7257 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
7258 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
7259 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
7260 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
7261 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
7262 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
7263 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
7264 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
7265 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
7266 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
7267 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
7268 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
7269 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
7270 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
7271 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
7272 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
7273 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
7274 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
7275 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
7276 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
7277 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
7278 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
7279 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
7280 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
7281 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
7282 {TR_SH_FIRE, "", 0, -2, 0},
7283 {TR_SH_ELEC, "", 0, -2, 0},
7284 {TR_SH_COLD, "", 0, -2, 0},
7285 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
7286 {TR_WARNING, "warning", 3, TR_WARNING, 20},
7287 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
7288 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
7289 {TR_LITE_2, "", 0, -2, 0},
7290 {TR_LITE_3, "", 0, -2, 0},
7291 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7292 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7293 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7294 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7295 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7297 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7298 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7299 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7300 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7301 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7302 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7303 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7304 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7305 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7306 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7307 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7308 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7309 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7310 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
7311 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7312 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7313 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7314 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7316 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7317 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
7318 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
7319 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
7320 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
7321 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
7322 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7323 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7325 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7326 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7327 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7328 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7329 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7330 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7331 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7332 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7333 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7334 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7335 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7336 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7338 {-1, NULL, 0, -1, 0}
7344 * エッセンス名テーブル / Essense names for Weapon smith
7347 cptr essence_name[] =
7450 cptr essence_name[] =
7553 * @brief 所持しているエッセンス一覧を表示する
7556 static void display_essence(void)
7561 for (i = 1; i < 22; i++)
7565 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7566 "Essence Num Essence Num Essence Num "), 1, 8);
7567 for (i = 0; essence_name[i]; i++)
7569 if (!essence_name[i][0]) continue;
7570 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7573 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7583 static void drain_essence(void)
7585 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7589 bool observe = FALSE;
7590 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7591 TIME_EFFECT old_timeout;
7592 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7598 OBJECT_IDX next_o_idx;
7601 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7604 item_tester_hook = object_is_weapon_armour_ammo;
7605 item_tester_no_ryoute = TRUE;
7607 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7608 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7610 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7612 /* Get the item (in the pack) */
7615 o_ptr = &inventory[item];
7618 /* Get the item (on the floor) */
7621 o_ptr = &o_list[0 - item];
7624 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7626 char o_name[MAX_NLEN];
7627 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7628 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7631 p_ptr->energy_use = 100;
7633 object_flags(o_ptr, old_flgs);
7634 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7635 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7636 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7637 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7638 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7639 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7640 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7641 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7642 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7644 old_to_a = o_ptr->to_a;
7646 old_to_h = o_ptr->to_h;
7647 old_to_d = o_ptr->to_d;
7650 old_pval = o_ptr->pval;
7651 old_name2 = o_ptr->name2;
7652 old_timeout = o_ptr->timeout;
7653 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7654 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7655 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7656 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7657 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7658 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7659 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7660 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7661 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7662 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7663 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7664 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7665 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7666 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7667 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7668 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7669 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7670 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7671 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7675 next_o_idx = o_ptr->next_o_idx;
7676 marked = o_ptr->marked;
7677 weight = o_ptr->weight;
7678 number = o_ptr->number;
7680 object_prep(o_ptr, o_ptr->k_idx);
7684 o_ptr->next_o_idx=next_o_idx;
7685 o_ptr->marked=marked;
7686 o_ptr->number = number;
7687 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7688 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7689 o_ptr->ident |= (IDENT_MENTAL);
7690 object_aware(o_ptr);
7691 object_known(o_ptr);
7693 object_flags(o_ptr, new_flgs);
7695 for (i = 0; essence_info[i].add_name; i++)
7697 essence_type *es_ptr = &essence_info[i];
7698 PARAMETER_VALUE pval = 0;
7700 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7701 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7703 if (es_ptr->add < TR_FLAG_MAX &&
7704 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7705 have_flag(old_flgs, es_ptr->add))
7709 drain_value[es_ptr->essence] += 10 * pval;
7711 else if (es_ptr->essence != -2)
7713 drain_value[es_ptr->essence] += 10;
7715 else if (es_ptr->add == TR_SH_FIRE)
7717 drain_value[TR_BRAND_FIRE] += 10;
7718 drain_value[TR_RES_FIRE] += 10;
7720 else if (es_ptr->add == TR_SH_ELEC)
7722 drain_value[TR_BRAND_ELEC] += 10;
7723 drain_value[TR_RES_ELEC] += 10;
7725 else if (es_ptr->add == TR_SH_COLD)
7727 drain_value[TR_BRAND_COLD] += 10;
7728 drain_value[TR_RES_COLD] += 10;
7730 else if (es_ptr->add == TR_LITE_2)
7732 drain_value[TR_LITE_1] += 20;
7734 else if (es_ptr->add == TR_LITE_3)
7736 drain_value[TR_LITE_1] += 30;
7741 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7743 drain_value[TR_INT] += 5;
7744 drain_value[TR_WIS] += 5;
7746 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7748 drain_value[TR_BRAND_POIS] += 5;
7749 drain_value[TR_BRAND_ACID] += 5;
7750 drain_value[TR_BRAND_ELEC] += 5;
7751 drain_value[TR_BRAND_FIRE] += 5;
7752 drain_value[TR_BRAND_COLD] += 5;
7754 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7756 drain_value[TR_INT] += 10;
7758 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7760 drain_value[TR_STR] += 10;
7762 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7764 drain_value[TR_DEX] += 10;
7766 if (old_name2 == EGO_2WEAPON)
7768 drain_value[TR_DEX] += 20;
7770 if (object_is_weapon_ammo(o_ptr))
7772 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7774 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7776 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7777 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7778 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7779 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7781 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7783 drain_value[i] *= number;
7784 drain_value[i] = drain_value[i] * dec / 4;
7785 drain_value[i] = MAX(drain_value[i], 0);
7786 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7794 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7798 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7800 for (i = 0; essence_name[i]; i++)
7802 if (!essence_name[i][0]) continue;
7803 if (!drain_value[i]) continue;
7805 p_ptr->magic_num1[i] += drain_value[i];
7806 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7808 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7812 /* Apply autodestroy/inscription to the drained item */
7813 autopick_alter_item(item, TRUE);
7815 /* Combine the pack */
7816 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
7818 p_ptr->window |= (PW_INVEN);
7822 * @brief 付加するエッセンスの大別を選択する
7823 * @return 選んだエッセンスの大別ID
7825 static COMMAND_CODE choose_essence(void)
7827 COMMAND_CODE mode = 0;
7829 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7832 cptr menu_name[] = {
7842 cptr menu_name[] = {
7852 const COMMAND_CODE mode_max = 7;
7854 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7864 for (i = 0; i < mode_max; i++)
7866 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7867 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7869 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7870 prt("Choose from menu.", 0, 0);
7889 menu_line += mode_max - 1;
7898 if (menu_line > mode_max) menu_line -= mode_max;
7909 for (i = 0; i < mode_max; i++)
7910 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7912 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7918 if (isupper(choice)) choice = (char)tolower(choice);
7920 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7921 mode = (int)choice - 'a' + 1;
7931 * @brief エッセンスを実際に付加する
7932 * @param mode エッセンスの大別ID
7935 static void add_essence(ESSENCE_IDX mode)
7947 char o_name[MAX_NLEN];
7949 essence_type *es_ptr;
7950 bool able[22] = { 0 };
7952 int menu_line = (use_menu ? 1 : 0);
7954 for (i = 0; essence_info[i].add_name; i++)
7956 es_ptr = &essence_info[i];
7958 if (es_ptr->type != mode) continue;
7962 if (!repeat_pull(&i) || i<0 || i>=max_num)
7965 /* Nothing chosen yet */
7971 /* Build a prompt */
7972 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
7973 if (use_menu) screen_save();
7975 /* Get a spell from the user */
7977 choice = (always_show_list || use_menu) ? ESCAPE:1;
7980 if( choice==ESCAPE ) choice = ' ';
7981 else if( !get_com(out_val, &choice, FALSE) )break;
7983 if (use_menu && choice != ' ')
7997 menu_line += (max_num-1);
8020 menu_line = max_num;
8034 if (menu_line > max_num) menu_line -= max_num;
8036 /* Request redraw */
8037 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
8040 if (!redraw || use_menu)
8044 char dummy[80], dummy2[80];
8052 /* Save the screen */
8053 if (!use_menu) screen_save();
8055 for (y = 1; y < 24; y++)
8058 /* Print header(s) */
8060 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
8063 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
8066 for (ctr = 0; ctr < max_num; ctr++)
8068 es_ptr = &essence_info[num[ctr]];
8072 if (ctr == (menu_line-1))
8073 strcpy(dummy, _("》 ", "> "));
8074 else strcpy(dummy, " ");
8077 /* letter/number for power selection */
8080 sprintf(dummy, "%c) ",I2A(ctr));
8083 strcat(dummy, es_ptr->add_name);
8088 if (es_ptr->essence != -1)
8090 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
8091 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
8097 case ESSENCE_SH_FIRE:
8098 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
8099 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
8100 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8102 case ESSENCE_SH_ELEC:
8103 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
8104 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
8105 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8107 case ESSENCE_SH_COLD:
8108 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
8109 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
8110 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8112 case ESSENCE_RESISTANCE:
8113 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8114 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8115 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8116 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8117 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8119 case ESSENCE_SUSTAIN:
8120 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8121 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8122 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8123 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8124 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8129 if (!able[ctr]) col = TERM_RED;
8131 if (es_ptr->essence != -1)
8133 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
8137 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
8140 c_prt(col, dummy2, ctr+2, x);
8150 /* Restore the screen */
8161 ask = (isupper(choice));
8164 if (ask) choice = (char)tolower(choice);
8166 /* Extract request */
8167 i = (islower(choice) ? A2I(choice) : -1);
8170 /* Totally Illegal */
8171 if ((i < 0) || (i >= max_num) || !able[i])
8183 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
8185 /* Belay that order */
8186 if (!get_check(tmp_val)) continue;
8193 /* Restore the screen */
8194 if (redraw) screen_load();
8200 es_ptr = &essence_info[num[i]];
8202 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8203 item_tester_tval = TV_GLOVES;
8204 else if (mode == 1 || mode == 5)
8205 item_tester_hook = item_tester_hook_melee_ammo;
8206 else if (es_ptr->add == ESSENCE_ATTACK)
8207 item_tester_hook = object_allow_enchant_weapon;
8208 else if (es_ptr->add == ESSENCE_AC)
8209 item_tester_hook = object_is_armour;
8211 item_tester_hook = object_is_weapon_armour_ammo;
8212 item_tester_no_ryoute = TRUE;
8214 q = _("どのアイテムを改良しますか?", "Improve which item? ");
8215 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
8217 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8219 /* Get the item (in the pack) */
8222 o_ptr = &inventory[item];
8225 /* Get the item (on the floor) */
8228 o_ptr = &o_list[0 - item];
8231 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
8233 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
8237 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8239 use_essence = es_ptr->value;
8240 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
8241 if (o_ptr->number > 1)
8243 use_essence *= o_ptr->number;
8244 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
8247 if (es_ptr->essence != -1)
8249 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8251 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8254 if (is_pval_flag(es_ptr->add))
8256 if (o_ptr->pval < 0)
8258 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
8261 else if (es_ptr->add == TR_BLOWS)
8263 if (o_ptr->pval > 1)
8265 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
8269 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8271 else if (o_ptr->pval > 0)
8273 use_essence *= o_ptr->pval;
8274 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8280 PARAMETER_VALUE pval;
8281 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8283 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
8284 strcpy(tmp_val, "1");
8286 if (!get_string(tmp, tmp_val, 1)) return;
8287 pval = (PARAMETER_VALUE)atoi(tmp_val);
8288 if (pval > limit) pval = limit;
8289 else if (pval < 1) pval = 1;
8290 o_ptr->pval += pval;
8291 use_essence *= pval;
8292 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8295 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8297 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8301 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8308 strcpy(tmp_val, "1");
8309 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
8310 val = atoi(tmp_val);
8311 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8312 else if (val < 1) val = 1;
8314 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8315 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8317 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8320 get_to_h = ((val+1)/2+randint0(val/2+1));
8321 get_to_d = ((val+1)/2+randint0(val/2+1));
8322 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8323 o_ptr->to_h += get_to_h;
8324 o_ptr->to_d += get_to_d;
8326 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8327 if (es_ptr->add == ESSENCE_ATTACK)
8329 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8331 msg_print(_("改良に失敗した。", "You failed to enchant."));
8332 p_ptr->energy_use = 100;
8337 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8338 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8341 else if (es_ptr->add == ESSENCE_AC)
8343 if (o_ptr->to_a >= p_ptr->lev/5+5)
8345 msg_print(_("改良に失敗した。", "You failed to enchant."));
8346 p_ptr->energy_use = 100;
8351 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8356 o_ptr->xtra3 = es_ptr->add + 1;
8361 bool success = TRUE;
8365 case ESSENCE_SH_FIRE:
8366 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8371 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8372 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8374 case ESSENCE_SH_ELEC:
8375 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8380 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8381 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8383 case ESSENCE_SH_COLD:
8384 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8389 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8390 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8392 case ESSENCE_RESISTANCE:
8393 case ESSENCE_SUSTAIN:
8394 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))
8399 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8400 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8401 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8402 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8407 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8410 if (es_ptr->add == ESSENCE_SUSTAIN)
8412 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8413 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8414 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8415 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8419 o_ptr->xtra3 = es_ptr->add + 1;
8423 p_ptr->energy_use = 100;
8426 msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name);
8428 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8431 /* Combine the pack */
8432 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8434 p_ptr->window |= (PW_INVEN);
8441 static void erase_essence(void)
8446 char o_name[MAX_NLEN];
8447 BIT_FLAGS flgs[TR_FLAG_SIZE];
8449 item_tester_hook = object_is_smith;
8451 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
8452 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
8454 if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8456 /* Get the item (in the pack) */
8459 o_ptr = &inventory[item];
8462 /* Get the item (on the floor) */
8465 o_ptr = &o_list[0 - item];
8468 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8469 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
8471 p_ptr->energy_use = 100;
8473 if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE)
8475 o_ptr->to_h -= (o_ptr->xtra4>>8);
8476 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8478 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8479 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8482 object_flags(o_ptr, flgs);
8483 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8484 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8486 /* Combine the pack */
8487 p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8489 p_ptr->window |= (PW_INVEN);
8493 * @brief 鍛冶コマンドのメインルーチン
8494 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8497 void do_cmd_kaji(bool only_browse)
8499 COMMAND_CODE mode = 0;
8502 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8506 if (p_ptr->confused)
8508 msg_print(_("混乱していて作業できない!", "You are too confused!"));
8513 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8518 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8523 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8525 if (only_browse) screen_save();
8527 if (!only_browse) screen_save();
8533 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8534 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8535 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8536 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8537 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8538 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8540 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8541 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8542 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8543 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8544 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8545 prt(format("Choose command from menu."), 0, 0);
8572 if (menu_line > 5) menu_line -= 5;
8580 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
8581 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
8582 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
8583 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
8584 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
8586 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8588 if (!get_com("Command :", &choice, TRUE))
8625 /* Clear lines, position cursor (really should use strlen here) */
8626 Term_erase(14, 21, 255);
8627 Term_erase(14, 20, 255);
8628 Term_erase(14, 19, 255);
8629 Term_erase(14, 18, 255);
8630 Term_erase(14, 17, 255);
8631 Term_erase(14, 16, 255);
8633 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8634 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8636 prt(&temp[j], line, 15);
8641 if (!only_browse) screen_load();
8642 } while (only_browse);
8647 case 1: display_essence();break;
8648 case 2: drain_essence();break;
8649 case 3: erase_essence();break;
8651 mode = choose_essence();
8656 case 5: add_essence(10);break;
8662 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8663 * Torches have special abilities when they are flaming.
8664 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8665 * @param flgs 特別に追加するフラグを返す参照ポインタ
8668 void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
8670 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8672 if (o_ptr->xtra4 > 0)
8674 add_flag(flgs, TR_BRAND_FIRE);
8675 add_flag(flgs, TR_KILL_UNDEAD);
8676 add_flag(flgs, TR_THROW);
8682 * @brief 投擲時たいまつにダイスを与える。
8683 * Torches have special abilities when they are flaming.
8684 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8685 * @param dd 特別なダイス数を返す参照ポインタ
8686 * @param ds 特別なダイス面数を返す参照ポインタ
8689 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
8691 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8693 if (o_ptr->xtra4 > 0)
8702 * @brief 投擲時命中したたいまつの寿命を縮める。
8703 * Torches have special abilities when they are flaming.
8704 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8707 void torch_lost_fuel(object_type *o_ptr)
8709 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8711 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8712 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;