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 concptr const kaji_tips[5] =
24 "現在持っているエッセンスの一覧を表示する。",
25 "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。",
26 "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。",
27 "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。",
28 "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。",
30 "Display essences you have.",
31 "Extract essences from an item. The item become non magical.",
32 "Remove added essences from an equipment which was improved before. The removed essence will be ruined.",
33 "Add essences to an item. The improved items or artifacts cannot be reimprove.",
34 "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.",
39 * @brief 対象のオブジェクトにランダムな能力維持を一つ付加する。/ Choose one random sustain
41 * @param o_ptr 対象のオブジェクト構造体ポインタ
44 static void one_sustain(object_type *o_ptr)
48 case 0: add_flag(o_ptr->art_flags, TR_SUST_STR); break;
49 case 1: add_flag(o_ptr->art_flags, TR_SUST_INT); break;
50 case 2: add_flag(o_ptr->art_flags, TR_SUST_WIS); break;
51 case 3: add_flag(o_ptr->art_flags, TR_SUST_DEX); break;
52 case 4: add_flag(o_ptr->art_flags, TR_SUST_CON); break;
53 case 5: add_flag(o_ptr->art_flags, TR_SUST_CHR); break;
58 * @brief 床上、モンスター所持でスタックされたアイテムを削除しスタックを補完する / Excise a dungeon object from any stacks
59 * @param o_idx 削除対象のオブジェクト構造体ポインタ
62 void excise_object_idx(OBJECT_IDX o_idx)
66 OBJECT_IDX this_o_idx, next_o_idx = 0;
67 OBJECT_IDX prev_o_idx = 0;
70 j_ptr = &o_list[o_idx];
73 if (j_ptr->held_m_idx)
78 m_ptr = &m_list[j_ptr->held_m_idx];
80 /* Scan all objects in the grid */
81 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
84 o_ptr = &o_list[this_o_idx];
86 /* Acquire next object */
87 next_o_idx = o_ptr->next_o_idx;
89 if (this_o_idx == o_idx)
94 /* Remove from list */
95 m_ptr->hold_o_idx = next_o_idx;
103 /* Previous object */
104 k_ptr = &o_list[prev_o_idx];
106 /* Remove from list */
107 k_ptr->next_o_idx = next_o_idx;
110 /* Forget next pointer */
111 o_ptr->next_o_idx = 0;
116 /* Save prev_o_idx */
117 prev_o_idx = this_o_idx;
126 POSITION y = j_ptr->iy;
127 POSITION x = j_ptr->ix;
131 /* Scan all objects in the grid */
132 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
135 o_ptr = &o_list[this_o_idx];
137 /* Acquire next object */
138 next_o_idx = o_ptr->next_o_idx;
140 if (this_o_idx == o_idx)
145 /* Remove from list */
146 c_ptr->o_idx = next_o_idx;
154 /* Previous object */
155 k_ptr = &o_list[prev_o_idx];
157 /* Remove from list */
158 k_ptr->next_o_idx = next_o_idx;
161 /* Forget next pointer */
162 o_ptr->next_o_idx = 0;
167 /* Save prev_o_idx */
168 prev_o_idx = this_o_idx;
174 * @brief オブジェクトを削除する /
175 * Delete a dungeon object
176 * @param o_idx 削除対象のオブジェクト構造体ポインタ
179 * Handle "stacks" of objects correctly.
181 void delete_object_idx(OBJECT_IDX o_idx)
186 excise_object_idx(o_idx);
189 j_ptr = &o_list[o_idx];
192 if (!(j_ptr->held_m_idx))
210 * @brief フロアにマスに落ちているオブジェクトを全て削除する / Deletes all objects at given location
211 * Delete a dungeon object
212 * @param y 削除したフロアマスのY座標
213 * @param x 削除したフロアマスのX座標
216 void delete_object(POSITION y, POSITION x)
219 OBJECT_IDX this_o_idx, next_o_idx = 0;
221 /* Refuse "illegal" locations */
222 if (!in_bounds(y, x)) return;
226 /* Scan all objects in the grid */
227 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
230 o_ptr = &o_list[this_o_idx];
232 /* Acquire next object */
233 next_o_idx = o_ptr->next_o_idx;
240 /* Objects are gone */
249 * @brief グローバルオブジェクト配列に対し指定範囲のオブジェクトを整理してIDの若い順に寄せる /
250 * Move an object from index i1 to index i2 in the object list
251 * @param i1 整理したい配列の始点
252 * @param i2 整理したい配列の終点
255 static void compact_objects_aux(OBJECT_IDX i1, OBJECT_IDX i2)
262 if (i1 == i2) return;
265 for (i = 1; i < o_max; i++)
269 /* Skip "dead" objects */
270 if (!o_ptr->k_idx) continue;
272 /* Repair "next" pointers */
273 if (o_ptr->next_o_idx == i1)
276 o_ptr->next_o_idx = i2;
282 if (o_ptr->held_m_idx)
286 /* Acquire monster */
287 m_ptr = &m_list[o_ptr->held_m_idx];
290 if (m_ptr->hold_o_idx == i1)
293 m_ptr->hold_o_idx = i2;
302 /* Acquire location */
310 if (c_ptr->o_idx == i1)
318 o_list[i2] = o_list[i1];
326 * @brief グローバルオブジェクト配列から優先度の低いものを削除し、データを圧縮する。 /
327 * Compact and Reorder the object list.
328 * @param size 最低でも減らしたいオブジェクト数の水準
332 * This function can be very dangerous, use with caution!\n
334 * When actually "compacting" objects, we base the saving throw on a\n
335 * combination of object level, distance from player, and current\n
338 * After "compacting" (if needed), we "reorder" the objects into a more\n
339 * compact order, and we reset the allocation info, and the "live" array.\n
341 void compact_objects(int size)
346 int cur_lev, cur_dis, chance;
352 msg_print(_("アイテム情報を圧縮しています...", "Compacting objects..."));
353 p_ptr->redraw |= (PR_MAP);
354 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
358 /* Compact at least 'size' objects */
359 for (num = 0, cnt = 1; num < size; cnt++)
361 /* Get more vicious each iteration */
364 /* Get closer each iteration */
365 cur_dis = 5 * (20 - cnt);
367 /* Examine the objects */
368 for (i = 1; i < o_max; i++)
372 /* Skip dead objects */
373 if (!o_ptr->k_idx) continue;
375 /* Hack -- High level objects start out "immune" */
376 if (k_info[o_ptr->k_idx].level > cur_lev) continue;
379 if (o_ptr->held_m_idx)
383 /* Acquire monster */
384 m_ptr = &m_list[o_ptr->held_m_idx];
389 /* Monsters protect their objects */
390 if (randint0(100) < 90) continue;
400 /* Nearby objects start out "immune" */
401 if ((cur_dis > 0) && (distance(p_ptr->y, p_ptr->x, y, x) < cur_dis)) continue;
406 /* Hack -- only compact artifacts in emergencies */
407 if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
408 (cnt < 1000)) chance = 100;
410 /* Apply the saving throw */
411 if (randint0(100) < chance) continue;
413 delete_object_idx(i);
421 /* Excise dead objects (backwards!) */
422 for (i = o_max - 1; i >= 1; i--)
426 /* Skip real objects */
427 if (o_ptr->k_idx) continue;
429 /* Move last object into open hole */
430 compact_objects_aux(o_max - 1, i);
432 /* Compress "o_max" */
439 * @brief グローバルオブジェクト配列を初期化する /
440 * Delete all the items when player leaves the level
441 * @note we do NOT visually reflect these (irrelevant) changes
443 * Hack -- we clear the "c_ptr->o_idx" field for every grid,
444 * and the "m_ptr->next_o_idx" field for every monster, since
445 * we know we are clearing every object. Technically, we only
446 * clear those fields for grids/monsters containing objects,
447 * and we clear it once for every such object.
450 void wipe_o_list(void)
454 /* Delete the existing objects */
455 for (i = 1; i < o_max; i++)
457 object_type *o_ptr = &o_list[i];
459 /* Skip dead objects */
460 if (!o_ptr->k_idx) continue;
462 /* Mega-Hack -- preserve artifacts */
463 if (!character_dungeon || preserve_mode)
465 /* Hack -- Preserve unknown artifacts */
466 if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
468 /* Mega-Hack -- Preserve the artifact */
469 a_info[o_ptr->name1].cur_num = 0;
474 if (o_ptr->held_m_idx)
479 m_ptr = &m_list[o_ptr->held_m_idx];
481 /* Hack -- see above */
482 m_ptr->hold_o_idx = 0;
490 /* Access location */
491 POSITION y = o_ptr->iy;
492 POSITION x = o_ptr->ix;
497 /* Hack -- see above */
512 * @brief グローバルオブジェクト配列から空きを取得する /
513 * Acquires and returns the index of a "free" object.
514 * @return 開いているオブジェクト要素のID
516 * This routine should almost never fail, but in case it does,
517 * we must be sure to handle "failure" of this routine.
519 OBJECT_IDX o_pop(void)
523 /* Initial allocation */
524 if (o_max < max_o_idx)
529 /* Expand object array */
535 /* Use this object */
540 /* Recycle dead objects */
541 for (i = 1; i < o_max; i++)
546 /* Skip live objects */
547 if (o_ptr->k_idx) continue;
552 /* Use this object */
557 /* Warn the player (except during dungeon creation) */
558 if (character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!"));
565 * @brief オブジェクト生成テーブルに生成制約を加える /
566 * Apply a "object restriction function" to the "object allocation table"
568 * @details 生成の制約はグローバルのget_obj_num_hook関数ポインタで加える
570 static errr get_obj_num_prep(void)
575 alloc_entry *table = alloc_kind_table;
577 /* Scan the allocation table */
578 for (i = 0; i < alloc_kind_size; i++)
580 /* Accept objects which pass the restriction, if any */
581 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
583 /* Accept this object */
584 table[i].prob2 = table[i].prob1;
587 /* Do not use this object */
590 /* Decline this object */
601 * @brief オブジェクト生成テーブルからアイテムを取得する /
602 * Choose an object kind that seems "appropriate" to the given level
604 * @return 選ばれたオブジェクトベースID
606 * This function uses the "prob2" field of the "object allocation table",\n
607 * and various local information, to calculate the "prob3" field of the\n
608 * same table, which is then used to choose an "appropriate" object, in\n
609 * a relatively efficient manner.\n
611 * It is (slightly) more likely to acquire an object of the given level\n
612 * than one of a lower level. This is done by choosing several objects\n
613 * appropriate to the given level and keeping the "hardest" one.\n
615 * Note that if no objects are "appropriate", then this function will\n
616 * fail, and return zero, but this should *almost* never happen.\n
618 OBJECT_IDX get_obj_num(DEPTH level)
621 KIND_OBJECT_IDX k_idx;
624 alloc_entry *table = alloc_kind_table;
626 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
629 if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER))
631 /* Occasional "boost" */
632 if (one_in_(GREAT_OBJ))
634 /* What a bizarre calculation */
635 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
642 /* Process probabilities */
643 for (i = 0; i < alloc_kind_size; i++)
645 /* Objects are sorted by depth */
646 if (table[i].level > level) break;
651 /* Access the index */
652 k_idx = table[i].index;
654 /* Access the actual kind */
655 k_ptr = &k_info[k_idx];
657 /* Hack -- prevent embedded chests */
658 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
661 table[i].prob3 = table[i].prob2;
664 total += table[i].prob3;
667 /* No legal objects */
668 if (total <= 0) return (0);
672 value = randint0(total);
674 /* Find the object */
675 for (i = 0; i < alloc_kind_size; i++)
677 /* Found the entry */
678 if (value < table[i].prob3) break;
681 value = value - table[i].prob3;
688 /* Try for a "better" object once (50%) or twice (10%) */
695 value = randint0(total);
697 /* Find the object */
698 for (i = 0; i < alloc_kind_size; i++)
700 /* Found the entry */
701 if (value < table[i].prob3) break;
704 value = value - table[i].prob3;
707 /* Keep the "best" one */
708 if (table[i].level < table[j].level) i = j;
711 /* Try for a "better" object twice (10%) */
718 value = randint0(total);
720 /* Find the object */
721 for (i = 0; i < alloc_kind_size; i++)
723 /* Found the entry */
724 if (value < table[i].prob3) break;
727 value = value - table[i].prob3;
730 /* Keep the "best" one */
731 if (table[i].level < table[j].level) i = j;
734 return (table[i].index);
739 * @brief オブジェクトを鑑定済にする /
740 * Known is true when the "attributes" of an object are "known".
741 * @param o_ptr 鑑定済にするオブジェクトの構造体参照ポインタ
743 * These include tohit, todam, toac, cost, and pval (charges).\n
745 * Note that "knowing" an object gives you everything that an "awareness"\n
746 * gives you, and much more. In fact, the player is always "aware" of any\n
747 * item of which he has full "knowledge".\n
749 * But having full knowledge of, say, one "wand of wonder", does not, by\n
750 * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
751 * It happens that most "identify" routines (including "buying from a shop")\n
752 * will make the player "aware" of the object as well as fully "know" it.\n
754 * This routine also removes any inscriptions generated by "feelings".\n
756 void object_known(object_type *o_ptr)
758 /* Remove "default inscriptions" */
759 o_ptr->feeling = FEEL_NONE;
761 /* Clear the "Felt" info */
762 o_ptr->ident &= ~(IDENT_SENSE);
764 /* Clear the "Empty" info */
765 o_ptr->ident &= ~(IDENT_EMPTY);
767 /* Now we know about the item */
768 o_ptr->ident |= (IDENT_KNOWN);
772 * @brief オブジェクトを*鑑定*済にする /
773 * The player is now aware of the effects of the given object.
774 * @param o_ptr *鑑定*済にするオブジェクトの構造体参照ポインタ
777 void object_aware(object_type *o_ptr)
779 bool mihanmei = !object_is_aware(o_ptr);
781 /* Fully aware of the effects */
782 k_info[o_ptr->k_idx].aware = TRUE;
784 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
785 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
789 GAME_TEXT o_name[MAX_NLEN];
792 object_copy(q_ptr, o_ptr);
795 object_desc(o_name, q_ptr, OD_NAME_ONLY);
797 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
802 * @brief オブジェクトを試行済にする /
803 * Something has been "sampled"
804 * @param o_ptr 試行済にするオブジェクトの構造体参照ポインタ
807 void object_tried(object_type *o_ptr)
809 /* Mark it as tried (even if "aware") */
810 k_info[o_ptr->k_idx].tried = TRUE;
814 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
815 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
816 * @return 擬似鑑定結果のIDを返す。
818 byte value_check_aux1(object_type *o_ptr)
821 if (object_is_artifact(o_ptr))
824 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
831 if (object_is_ego(o_ptr))
834 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
837 return FEEL_EXCELLENT;
841 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
844 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
846 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
848 /* Good "armor" bonus */
849 if (o_ptr->to_a > 0) return FEEL_GOOD;
851 /* Good "weapon" bonus */
852 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
854 /* Default to "average" */
859 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 2 (Light).
860 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
861 * @return 擬似鑑定結果のIDを返す。
863 byte value_check_aux2(object_type *o_ptr)
865 /* Cursed items (all of them) */
866 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
868 /* Broken items (all of them) */
869 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
871 /* Artifacts -- except cursed/broken ones */
872 if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
874 /* Ego-Items -- except cursed/broken ones */
875 if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
877 /* Good armor bonus */
878 if (o_ptr->to_a > 0) return FEEL_UNCURSED;
880 /* Good weapon bonuses */
881 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
888 * @brief 未鑑定なベースアイテムの基本価格を返す /
889 * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
890 * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
891 * @return オブジェクトの未鑑定価格
893 static s32b object_value_base(object_type *o_ptr)
895 /* Aware item -- use template cost */
896 if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
898 /* Analyze the type */
903 case TV_FOOD: return (5L);
905 /* Un-aware Potions */
906 case TV_POTION: return (20L);
908 /* Un-aware Scrolls */
909 case TV_SCROLL: return (20L);
911 /* Un-aware Staffs */
912 case TV_STAFF: return (70L);
915 case TV_WAND: return (50L);
918 case TV_ROD: return (90L);
921 case TV_RING: return (45L);
923 /* Un-aware Amulets */
924 case TV_AMULET: return (45L);
926 /* Figurines, relative to monster level */
929 DEPTH level = r_info[o_ptr->pval].level;
930 if (level < 20) return level*50L;
931 else if (level < 30) return 1000+(level-20)*150L;
932 else if (level < 40) return 2500+(level-30)*350L;
933 else if (level < 50) return 6000+(level-40)*800L;
934 else return 14000+(level-50)*2000L;
938 if (!o_ptr->pval) return 1000L;
939 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
942 /* Paranoia -- Oops */
948 * @brief オブジェクトのフラグ類から価格を算出する /
949 * Return the value of the flags the object has...
950 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
951 * @param plusses フラグに与える価格の基本重み
952 * @return オブジェクトのフラグ価格
954 s32b flag_cost(object_type *o_ptr, int plusses)
957 BIT_FLAGS flgs[TR_FLAG_SIZE];
961 object_kind *k_ptr = &k_info[o_ptr->k_idx];
963 object_flags(o_ptr, flgs);
966 * Exclude fixed flags of the base item.
967 * pval bonuses of base item will be treated later.
969 for (i = 0; i < TR_FLAG_SIZE; i++)
970 flgs[i] &= ~(k_ptr->flags[i]);
972 /* Exclude fixed flags of the fixed artifact. */
973 if (object_is_fixed_artifact(o_ptr))
975 artifact_type *a_ptr = &a_info[o_ptr->name1];
977 for (i = 0; i < TR_FLAG_SIZE; i++)
978 flgs[i] &= ~(a_ptr->flags[i]);
981 /* Exclude fixed flags of the ego-item. */
982 else if (object_is_ego(o_ptr))
984 ego_item_type *e_ptr = &e_info[o_ptr->name2];
986 for (i = 0; i < TR_FLAG_SIZE; i++)
987 flgs[i] &= ~(e_ptr->flags[i]);
992 * Calucurate values of remaining flags
994 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
995 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
996 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
997 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
998 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
999 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
1000 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
1001 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
1002 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
1003 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
1004 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
1005 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
1006 total += (10000 + (2500 * plusses));
1007 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
1008 total += (10000 + (2500 * plusses));
1012 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
1013 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
1014 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
1015 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
1016 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
1017 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
1018 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
1019 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
1020 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
1021 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
1022 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
1023 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
1024 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
1025 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
1026 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
1027 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
1028 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
1029 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
1030 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
1031 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
1032 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
1034 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
1035 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
1036 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
1037 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
1038 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
1039 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
1040 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
1041 total += (tmp_cost * count);
1043 if (have_flag(flgs, TR_SUST_STR)) total += 850;
1044 if (have_flag(flgs, TR_SUST_INT)) total += 850;
1045 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
1046 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
1047 if (have_flag(flgs, TR_SUST_CON)) total += 850;
1048 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
1049 if (have_flag(flgs, TR_RIDING)) total += 0;
1050 if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
1051 if (have_flag(flgs, TR_THROW)) total += 5000;
1052 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
1053 if (have_flag(flgs, TR_HOLD_EXP)) total += 8500;
1057 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
1058 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
1059 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
1060 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
1061 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
1062 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
1063 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
1064 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
1065 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
1066 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
1067 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
1068 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
1069 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
1070 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
1071 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
1072 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
1073 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
1074 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
1075 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
1076 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
1077 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
1078 total += (tmp_cost * count);
1080 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
1081 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
1082 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1083 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1084 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1085 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1086 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1087 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1088 if (have_flag(flgs, TR_LEVITATION)) total += 1250;
1089 if (have_flag(flgs, TR_LITE_1)) total += 1500;
1090 if (have_flag(flgs, TR_LITE_2)) total += 2500;
1091 if (have_flag(flgs, TR_LITE_3)) total += 4000;
1092 if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
1093 if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
1094 if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
1095 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1096 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1097 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1098 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1099 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1100 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1101 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1102 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1103 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1104 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1105 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1106 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1107 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1108 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1109 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1110 if (have_flag(flgs, TR_REGEN)) total += 2500;
1111 if (have_flag(flgs, TR_WARNING)) total += 2000;
1112 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1113 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1114 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1115 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1116 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1117 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1118 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1119 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1120 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1121 if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
1122 if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
1123 if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
1124 if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
1125 if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
1126 if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
1127 if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
1128 if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
1129 if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
1130 if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
1131 if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
1132 if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
1133 if (have_flag(flgs, TR_TELEPORT))
1135 if (object_is_cursed(o_ptr))
1140 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1141 if (have_flag(flgs, TR_BLESSED)) total += 750;
1142 if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1143 if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1144 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1145 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1146 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1148 /* Also, give some extra for activatable powers... */
1149 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1151 const activation_type* const act_ptr = find_activation_info(o_ptr);
1153 total += act_ptr->value;
1162 * @brief オブジェクトの真の価格を算出する /
1163 * Return the value of the flags the object has...
1164 * @param o_ptr 本価格を確認したいオブジェクトの構造体参照ポインタ
1165 * @return オブジェクトの本価格
1167 * Return the "real" price of a "known" item, not including discounts\n
1169 * Wand and staffs get cost for each charge\n
1171 * Armor is worth an extra 100 gold per bonus point to armor class.\n
1173 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
1175 * Missiles are only worth 5 gold per bonus point, since they\n
1176 * usually appear in groups of 20, and we want the player to get\n
1177 * the same amount of cash for any "equivalent" item. Note that\n
1178 * missiles never have any of the "pval" flags, and in fact, they\n
1179 * only have a few of the available flags, primarily of the "slay"\n
1180 * and "brand" and "ignore" variety.\n
1182 * Armor with a negative armor bonus is worthless.\n
1183 * Weapons with negative hit+damage bonuses are worthless.\n
1185 * Every wearable item with a "pval" bonus is worth extra (see below).\n
1187 PRICE object_value_real(object_type *o_ptr)
1190 BIT_FLAGS flgs[TR_FLAG_SIZE];
1191 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1194 /* Hack -- "worthless" items */
1195 if (!k_info[o_ptr->k_idx].cost) return (0L);
1198 value = k_info[o_ptr->k_idx].cost;
1200 /* Extract some flags */
1201 object_flags(o_ptr, flgs);
1204 if (object_is_fixed_artifact(o_ptr))
1206 artifact_type *a_ptr = &a_info[o_ptr->name1];
1208 /* Hack -- "worthless" artifacts */
1209 if (!a_ptr->cost) return (0L);
1211 /* Hack -- Use the artifact cost instead */
1212 value = a_ptr->cost;
1213 value += flag_cost(o_ptr, o_ptr->pval);
1215 /* Don't add pval bonuses etc. */
1220 else if (object_is_ego(o_ptr))
1222 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1224 /* Hack -- "worthless" ego-items */
1225 if (!e_ptr->cost) return (0L);
1227 /* Hack -- Reward the ego-item with a bonus */
1228 value += e_ptr->cost;
1229 value += flag_cost(o_ptr, o_ptr->pval);
1237 for (i = 0; i < TR_FLAG_SIZE; i++)
1238 if (o_ptr->art_flags[i]) flag = TRUE;
1240 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1243 /* Analyze pval bonus for normal object */
1244 switch (o_ptr->tval)
1267 if (!o_ptr->pval) break;
1269 /* Hack -- Negative "pval" is always bad */
1270 if (o_ptr->pval < 0) return (0L);
1272 /* Give credit for stat bonuses */
1273 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1274 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1275 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1276 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1277 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1278 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1280 /* Give credit for stealth and searching */
1281 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1282 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1283 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1285 /* Give credit for infra-vision and tunneling */
1286 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1287 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1289 /* Give credit for extra attacks */
1290 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1292 /* Give credit for speed bonus */
1293 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1299 /* Analyze the item */
1300 switch (o_ptr->tval)
1305 /* Pay extra for charges, depending on standard number of
1306 * charges. Handle new-style wands correctly. -LM-
1308 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1314 /* Pay extra for charges, depending on standard number of
1317 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1326 /* Hack -- negative bonuses are bad */
1327 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1329 /* Give credit for bonuses */
1330 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1346 /* Hack -- negative armor bonus */
1347 if (o_ptr->to_a < 0) return (0L);
1349 /* Give credit for bonuses */
1350 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1362 /* Hack -- negative hit/damage bonuses */
1363 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1365 /* Factor in the bonuses */
1366 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1368 /* Hack -- Factor in extra damage dice and sides */
1369 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1370 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1380 /* Hack -- negative hit/damage bonuses */
1381 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1383 /* Factor in the bonuses */
1384 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1386 /* Hack -- Factor in extra damage dice and sides */
1387 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1388 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1393 /* Figurines, relative to monster level */
1396 DEPTH level = r_info[o_ptr->pval].level;
1397 if (level < 20) value = level*50L;
1398 else if (level < 30) value = 1000+(level-20)*150L;
1399 else if (level < 40) value = 2500+(level-30)*350L;
1400 else if (level < 50) value = 6000+(level-40)*800L;
1401 else value = 14000+(level-50)*2000L;
1407 if (!o_ptr->pval) value = 1000L;
1408 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1414 if (!o_ptr->pval) value = 0L;
1419 /* Worthless object */
1420 if (value < 0) return 0L;
1422 /* Return the value */
1428 * @brief オブジェクト価格算出のメインルーチン /
1429 * Return the price of an item including plusses (and charges)
1430 * @param o_ptr 判明している現価格を確認したいオブジェクトの構造体参照ポインタ
1431 * @return オブジェクトの判明している現価格
1433 * This function returns the "value" of the given item (qty one)\n
1435 * Never notice "unknown" bonuses or properties, including "curses",\n
1436 * since that would give the player information he did not have.\n
1438 * Note that discounted items stay discounted forever, even if\n
1439 * the discount is "forgotten" by the player via memory loss.\n
1441 PRICE object_value(object_type *o_ptr)
1445 /* Unknown items -- acquire a base value */
1446 if (object_is_known(o_ptr))
1448 /* Broken items -- worthless */
1449 if (object_is_broken(o_ptr)) return (0L);
1451 /* Cursed items -- worthless */
1452 if (object_is_cursed(o_ptr)) return (0L);
1454 /* Real value (see above) */
1455 value = object_value_real(o_ptr);
1458 /* Known items -- acquire the actual value */
1461 /* Hack -- Felt broken items */
1462 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1464 /* Hack -- Felt cursed items */
1465 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1467 /* Base value (see above) */
1468 value = object_value_base(o_ptr);
1472 /* Apply discount (if any) */
1473 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1476 /* Return the final value */
1483 * @brief 破壊可能なアイテムかを返す /
1484 * Determines whether an object can be destroyed, and makes fake inscription.
1485 * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
1486 * @return オブジェクトが破壊可能ならばTRUEを返す
1488 bool can_player_destroy_object(object_type *o_ptr)
1490 /* Artifacts cannot be destroyed */
1491 if (!object_is_artifact(o_ptr)) return TRUE;
1493 /* If object is unidentified, makes fake inscription */
1494 if (!object_is_known(o_ptr))
1496 byte feel = FEEL_SPECIAL;
1498 /* Hack -- Handle icky artifacts */
1499 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1501 /* Hack -- inscribe the artifact */
1502 o_ptr->feeling = feel;
1504 /* We have "felt" it (again) */
1505 o_ptr->ident |= (IDENT_SENSE);
1507 /* Combine the pack */
1508 p_ptr->update |= (PU_COMBINE);
1510 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1515 /* Identified artifact -- Nothing to do */
1521 * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
1522 * Distribute charges of rods or wands.
1523 * @param o_ptr 分割元オブジェクトの構造体参照ポインタ source item
1524 * @param q_ptr 分割先オブジェクトの構造体参照ポインタ target item, must be of the same type as o_ptr
1525 * @param amt 分割したい回数量 number of items that are transfered
1528 * Hack -- If rods or wands are dropped, the total maximum timeout or\n
1529 * charges need to be allocated between the two stacks. If all the items\n
1530 * are being dropped, it makes for a neater message to leave the original\n
1531 * stack's pval alone. -LM-\n
1533 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1535 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1537 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1538 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1540 /* Hack -- Rods also need to have their timeouts distributed. The
1541 * dropped stack will accept all time remaining to charge up to its
1544 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1546 if (q_ptr->pval > o_ptr->timeout)
1547 q_ptr->timeout = o_ptr->timeout;
1549 q_ptr->timeout = q_ptr->pval;
1551 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1557 * @brief 魔法棒やロッドの使用回数を減らす /
1558 * @param o_ptr オブジェクトの構造体参照ポインタ source item
1559 * @param amt 減らしたい回数量 number of items that are transfered
1562 * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1563 * charges of the stack needs to be reduced, unless all the items are\n
1564 * being destroyed. -LM-\n
1566 void reduce_charges(object_type *o_ptr, int amt)
1568 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1569 (amt < o_ptr->number))
1571 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1576 * Determine if an item can "absorb" a second item
1578 * See "object_absorb()" for the actual "absorption" code.
1580 * If permitted, we allow staffs (if they are known to have equal charges
1581 * and both are either known or confirmed empty) and wands (if both are
1582 * either known or confirmed empty) and rods (in all cases) to combine.
1583 * Staffs will unstack (if necessary) when they are used, but wands and
1584 * rods will only unstack if one is dropped. -LM-
1586 * If permitted, we allow weapons/armor to stack, if fully "known".
1588 * Missiles will combine if both stacks have the same "known" status.
1589 * This is done to make unidentified stacks of missiles useful.
1591 * Food, potions, scrolls, and "easy know" items always stack.
1593 * Chests, and activatable items, never stack (for various reasons).
1597 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1599 #define MAX_STACK_SIZE 99
1603 * @brief 両オブジェクトをスロットに重ね合わせ可能な最大数を返す。
1604 * Determine if an item can partly absorb a second item. Return maximum number of stack.
1605 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1606 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1607 * @return 重ね合わせ可能なアイテム数
1609 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1613 /* Default maximum number of stack */
1614 int max_num = MAX_STACK_SIZE;
1616 /* Require identical object types */
1617 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1620 /* Analyze the items */
1621 switch (o_ptr->tval)
1623 /* Chests and Statues*/
1634 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1635 if (o_ptr->pval != j_ptr->pval) return 0;
1639 /* Figurines and Corpses*/
1644 if (o_ptr->pval != j_ptr->pval) return 0;
1650 /* Food and Potions and Scrolls */
1662 /* Require either knowledge or known empty for both staffs. */
1663 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1664 !object_is_known(o_ptr)) ||
1665 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1666 !object_is_known(j_ptr))) return 0;
1668 /* Require identical charges, since staffs are bulky. */
1669 if (o_ptr->pval != j_ptr->pval) return 0;
1678 /* Require either knowledge or known empty for both wands. */
1679 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1680 !object_is_known(o_ptr)) ||
1681 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1682 !object_is_known(j_ptr))) return 0;
1684 /* Wand charges combine in O&ZAngband. */
1690 /* Staffs and Wands and Rods */
1693 /* Prevent overflaw of timeout */
1694 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1700 /* Weapons and Armor */
1716 /* Rings, Amulets, Lites */
1722 /* Require full knowledge of both items */
1723 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1733 /* Require identical knowledge of both items */
1734 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1735 if (o_ptr->feeling != j_ptr->feeling) return 0;
1737 /* Require identical "bonuses" */
1738 if (o_ptr->to_h != j_ptr->to_h) return 0;
1739 if (o_ptr->to_d != j_ptr->to_d) return 0;
1740 if (o_ptr->to_a != j_ptr->to_a) return 0;
1742 /* Require identical "pval" code */
1743 if (o_ptr->pval != j_ptr->pval) return 0;
1745 /* Artifacts never stack */
1746 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1748 /* Require identical "ego-item" names */
1749 if (o_ptr->name2 != j_ptr->name2) return 0;
1751 /* Require identical added essence */
1752 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1753 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1755 /* Hack -- Never stack "powerful" items */
1756 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1758 /* Hack -- Never stack recharging items */
1759 if (o_ptr->timeout || j_ptr->timeout) return 0;
1761 /* Require identical "values" */
1762 if (o_ptr->ac != j_ptr->ac) return 0;
1763 if (o_ptr->dd != j_ptr->dd) return 0;
1764 if (o_ptr->ds != j_ptr->ds) return 0;
1773 /* Require knowledge */
1774 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1782 /* Hack -- Identical art_flags! */
1783 for (i = 0; i < TR_FLAG_SIZE; i++)
1784 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1786 /* Hack -- Require identical "cursed" status */
1787 if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1789 /* Hack -- Require identical "broken" status */
1790 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1793 /* Hack -- require semi-matching "inscriptions" */
1794 if (o_ptr->inscription && j_ptr->inscription &&
1795 (o_ptr->inscription != j_ptr->inscription))
1798 /* Hack -- normally require matching "inscriptions" */
1799 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1801 /* Hack -- normally require matching "discounts" */
1802 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1805 /* They match, so they must be similar */
1810 * @brief 両オブジェクトをスロットに重ねることができるかどうかを返す。
1811 * Determine if an item can absorb a second item.
1812 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1813 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1814 * @return 重ね合わせ可能ならばTRUEを返す。
1816 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1818 int total = o_ptr->number + j_ptr->number;
1821 /* Are these objects similar? */
1822 max_num = object_similar_part(o_ptr, j_ptr);
1824 /* Return if not similar */
1825 if (!max_num) return FALSE;
1827 /* Maximal "stacking" limit */
1828 if (total > max_num) return (0);
1831 /* They match, so they must be similar */
1837 * @brief 両オブジェクトをスロットに重ね合わせる。
1838 * Allow one item to "absorb" another, assuming they are similar
1839 * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
1840 * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
1843 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1845 int max_num = object_similar_part(o_ptr, j_ptr);
1846 int total = o_ptr->number + j_ptr->number;
1847 int diff = (total > max_num) ? total - max_num : 0;
1849 /* Combine quantity, lose excess items */
1850 o_ptr->number = (total > max_num) ? max_num : total;
1852 /* Hack -- blend "known" status */
1853 if (object_is_known(j_ptr)) object_known(o_ptr);
1855 /* Hack -- clear "storebought" if only one has it */
1856 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1857 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1859 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1860 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1863 /* Hack -- blend "mental" status */
1864 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1866 /* Hack -- blend "inscriptions" */
1867 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1869 /* Hack -- blend "feelings" */
1870 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1872 /* Hack -- could average discounts */
1873 /* Hack -- save largest discount */
1874 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1876 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1877 if (o_ptr->tval == TV_ROD)
1879 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1880 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1883 /* Hack -- if wands are stacking, combine the charges. -LM- */
1884 if (o_ptr->tval == TV_WAND)
1886 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1892 * @brief tvalとsvalに対応するベースアイテムのIDを返す。
1893 * Find the index of the object_kind with the given tval and sval
1894 * @param tval 検索したいベースアイテムのtval
1895 * @param sval 検索したいベースアイテムのsval
1898 KIND_OBJECT_IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval)
1902 KIND_OBJECT_IDX bk = 0;
1905 for (k = 1; k < max_k_idx; k++)
1907 object_kind *k_ptr = &k_info[k];
1909 /* Require correct tval */
1910 if (k_ptr->tval != tval) continue;
1913 if (k_ptr->sval == sval) return (k);
1915 /* Ignore illegal items */
1916 if (sval != SV_ANY) continue;
1918 /* Apply the randomizer */
1919 if (!one_in_(++num)) continue;
1921 /* Use this value */
1925 /* Return this choice */
1932 msg_format(_("アイテムがない (%d,%d)", "No object (%d,%d)"), tval, sval);
1941 * @brief オブジェクトを初期化する
1942 * Wipe an object clean.
1943 * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
1946 void object_wipe(object_type *o_ptr)
1948 /* Wipe the structure */
1949 (void)WIPE(o_ptr, object_type);
1954 * @brief オブジェクトを複製する
1955 * Wipe an object clean.
1956 * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
1957 * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
1960 void object_copy(object_type *o_ptr, object_type *j_ptr)
1962 /* Copy the structure */
1963 (void)COPY(o_ptr, j_ptr, object_type);
1968 * @brief オブジェクト構造体にベースアイテムを作成する
1969 * Prepare an object based on an object kind.
1970 * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
1971 * @param k_idx 新たに作成したいベースアイテム情報のID
1974 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
1976 object_kind *k_ptr = &k_info[k_idx];
1978 /* Clear the record */
1981 /* Save the kind index */
1982 o_ptr->k_idx = k_idx;
1984 /* Efficiency -- tval/sval */
1985 o_ptr->tval = k_ptr->tval;
1986 o_ptr->sval = k_ptr->sval;
1988 /* Default "pval" */
1989 o_ptr->pval = k_ptr->pval;
1991 /* Default number */
1994 /* Default weight */
1995 o_ptr->weight = k_ptr->weight;
1998 o_ptr->to_h = k_ptr->to_h;
1999 o_ptr->to_d = k_ptr->to_d;
2000 o_ptr->to_a = k_ptr->to_a;
2003 o_ptr->ac = k_ptr->ac;
2004 o_ptr->dd = k_ptr->dd;
2005 o_ptr->ds = k_ptr->ds;
2007 /* Default activation */
2008 if (k_ptr->act_idx > 0) o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
2010 /* Hack -- worthless items are always "broken" */
2011 if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
2013 /* Hack -- cursed items are always "cursed" */
2014 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
2015 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2016 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
2017 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2018 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2019 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2024 * @brief 上質以上のオブジェクトに与えるための各種ボーナスを正規乱数も加えて算出する。
2025 * Help determine an "enchantment bonus" for an object.
2026 * @param max ボーナス値の限度
2027 * @param level ボーナス値に加味する基準生成階
2028 * @return 算出されたボーナス値
2030 * To avoid floating point but still provide a smooth distribution of bonuses,\n
2031 * we simply round the results of division in such a way as to "average" the\n
2032 * correct floating point value.\n
2034 * This function has been changed. It uses "randnor()" to choose values from\n
2035 * a normal distribution, whose mean moves from zero towards the max as the\n
2036 * level increases, and whose standard deviation is equal to 1/4 of the max,\n
2037 * and whose values are forced to lie between zero and the max, inclusive.\n
2039 * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
2040 * rare to get the "full" enchantment on an object, even a deep levels.\n
2042 * It is always possible (albeit unlikely) to get the "full" enchantment.\n
2044 * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
2046 * N 0 1 2 3 4 5 6 7 8 9 10\n
2047 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n
2048 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03\n
2049 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05\n
2050 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05\n
2051 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11\n
2052 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41\n
2053 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65\n
2054 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94\n
2055 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78\n
2056 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64\n
2057 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62\n
2058 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33\n
2059 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38\n
2060 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53\n
2061 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53\n
2062 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27\n
2063 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72\n
2064 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07\n
2066 int m_bonus(int max, DEPTH level)
2068 int bonus, stand, extra, value;
2071 /* Paranoia -- enforce maximal "level" */
2072 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
2075 /* The "bonus" moves towards the max */
2076 bonus = ((max * level) / MAX_DEPTH);
2078 /* Hack -- determine fraction of error */
2079 extra = ((max * level) % MAX_DEPTH);
2081 /* Hack -- simulate floating point computations */
2082 if (randint0(MAX_DEPTH) < extra) bonus++;
2085 /* The "stand" is equal to one quarter of the max */
2088 /* Hack -- determine fraction of error */
2091 /* Hack -- simulate floating point computations */
2092 if (randint0(4) < extra) stand++;
2095 /* Choose an "interesting" value */
2096 value = randnor(bonus, stand);
2098 /* Enforce the minimum value */
2099 if (value < 0) return (0);
2101 /* Enforce the maximum value */
2102 if (value > max) return (max);
2108 * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user
2109 * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ
2112 static void object_mention(object_type *o_ptr)
2114 GAME_TEXT o_name[MAX_NLEN];
2116 object_aware(o_ptr);
2117 object_known(o_ptr);
2119 /* Mark the item as fully known */
2120 o_ptr->ident |= (IDENT_MENTAL);
2121 object_desc(o_name, o_ptr, 0);
2122 msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name);
2126 * @brief INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2127 * Mega-Hack -- Attempt to create one of the "Special Objects"
2128 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2129 * @return 生成に成功したらTRUEを返す。
2131 * We are only called from "make_object()", and we assume that\n
2132 * "apply_magic()" is called immediately after we return.\n
2134 * Note -- see "make_artifact()" and "apply_magic()"\n
2136 static bool make_artifact_special(object_type *o_ptr)
2139 KIND_OBJECT_IDX k_idx = 0;
2141 /*! @note 地上ではキャンセルする / No artifacts in the town */
2142 if (!dun_level) return (FALSE);
2144 /*! @note get_obj_num_hookによる指定がある場合は生成をキャンセルする / Themed object */
2145 if (get_obj_num_hook) return (FALSE);
2147 /*! @note 全固定アーティファクト中からIDの若い順に生成対象とその確率を走査する / Check the artifact list (just the "specials") */
2148 for (i = 0; i < max_a_idx; i++)
2150 artifact_type *a_ptr = &a_info[i];
2152 /*! @note アーティファクト名が空の不正なデータは除外する / Skip "empty" artifacts */
2153 if (!a_ptr->name) continue;
2155 /*! @note 既に生成回数がカウントされたアーティファクト、QUESTITEMと非INSTA_ARTは除外 / Cannot make an artifact twice */
2156 if (a_ptr->cur_num) continue;
2157 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2158 if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue;
2160 /*! @note アーティファクト生成階が現在に対して足りない場合は高確率で1/(不足階層*2)を満たさないと生成リストに加えられない /
2161 * XXX XXX Enforce minimum "depth" (loosely) */
2162 if (a_ptr->level > object_level)
2164 /* @note / Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2165 int d = (a_ptr->level - object_level) * 2;
2166 if (!one_in_(d)) continue;
2169 /*! @note 1/(レア度)の確率を満たさないと除外される / Artifact "rarity roll" */
2170 if (!one_in_(a_ptr->rarity)) continue;
2172 /*! @note INSTA_ART型固定アーティファクトのベースアイテムもチェック対象とする。ベースアイテムの生成階層が足りない場合1/(不足階層*5) を満たさないと除外される。 /
2173 * Find the base object. XXX XXX Enforce minimum "object" level (loosely). Acquire the "out-of-depth factor". Roll for out-of-depth creation. */
2174 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2175 if (k_info[k_idx].level > object_level)
2177 int d = (k_info[k_idx].level - object_level) * 5;
2178 if (!one_in_(d)) continue;
2181 /*! @note 前述の条件を満たしたら、後のIDのアーティファクトはチェックせずすぐ確定し生成処理に移す /
2182 * Assign the template. Mega-Hack -- mark the item as an artifact. Hack: Some artifacts get random extra powers. Success. */
2183 object_prep(o_ptr, k_idx);
2186 random_artifact_resistance(o_ptr, a_ptr);
2190 /*! @note 全INSTA_ART固定アーティファクトを試行しても決まらなかった場合 FALSEを返す / Failure */
2196 * @brief 非INSTA_ART型の固定アーティファクトの生成を確率に応じて試行する。
2197 * Mega-Hack -- Attempt to create one of the "Special Objects"
2198 * @param o_ptr 生成に割り当てたいオブジェクトの構造体参照ポインタ
2199 * @return 生成に成功したらTRUEを返す。
2201 * Attempt to change an object into an artifact\n
2202 * This routine should only be called by "apply_magic()"\n
2203 * Note -- see "make_artifact_special()" and "apply_magic()"\n
2205 static bool make_artifact(object_type *o_ptr)
2209 /* No artifacts in the town */
2210 if (!dun_level) return (FALSE);
2212 /* Paranoia -- no "plural" artifacts */
2213 if (o_ptr->number != 1) return (FALSE);
2215 /* Check the artifact list (skip the "specials") */
2216 for (i = 0; i < max_a_idx; i++)
2218 artifact_type *a_ptr = &a_info[i];
2220 /* Skip "empty" items */
2221 if (!a_ptr->name) continue;
2223 /* Cannot make an artifact twice */
2224 if (a_ptr->cur_num) continue;
2226 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2228 if (a_ptr->gen_flags & TRG_INSTA_ART) continue;
2230 /* Must have the correct fields */
2231 if (a_ptr->tval != o_ptr->tval) continue;
2232 if (a_ptr->sval != o_ptr->sval) continue;
2234 /* XXX XXX Enforce minimum "depth" (loosely) */
2235 if (a_ptr->level > dun_level)
2237 /* Acquire the "out-of-depth factor" */
2238 int d = (a_ptr->level - dun_level) * 2;
2240 /* Roll for out-of-depth creation */
2241 if (!one_in_(d)) continue;
2244 /* We must make the "rarity roll" */
2245 if (!one_in_(a_ptr->rarity)) continue;
2247 /* Hack -- mark the item as an artifact */
2250 /* Hack: Some artifacts get random extra powers */
2251 random_artifact_resistance(o_ptr, a_ptr);
2263 * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
2264 * Choose random ego type
2265 * @param slot 取得したいエゴの装備部位
2266 * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
2267 * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
2269 static byte get_random_ego(byte slot, bool good)
2272 ego_item_type *e_ptr;
2276 for (i = 1; i < max_e_idx; i++)
2280 if (e_ptr->slot == slot
2281 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2284 total += (255 / e_ptr->rarity);
2288 value = randint1(total);
2290 for (i = 1; i < max_e_idx; i++)
2294 if (e_ptr->slot == slot
2295 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2298 value -= (255 / e_ptr->rarity);
2299 if (value <= 0L) break;
2307 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2308 * Apply magic to an item known to be a "weapon"
2309 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2310 * @param level 生成基準階
2311 * @param power 生成ランク
2314 * Hack -- note special base damage dice boosting\n
2315 * Hack -- note special processing for weapon/digger\n
2317 static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
2319 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
2320 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
2322 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
2323 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
2325 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2327 tohit2 = (tohit2+1)/2;
2328 todam2 = (todam2+1)/2;
2335 o_ptr->to_h += tohit1;
2336 o_ptr->to_d += todam1;
2342 o_ptr->to_h += tohit2;
2343 o_ptr->to_d += todam2;
2351 o_ptr->to_h -= tohit1;
2352 o_ptr->to_d -= todam1;
2357 /* Penalize again */
2358 o_ptr->to_h -= tohit2;
2359 o_ptr->to_d -= todam2;
2362 /* Cursed (if "bad") */
2363 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2366 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2369 switch (o_ptr->tval)
2376 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2377 create_artifact(o_ptr, FALSE);
2379 /* Special Ego-item */
2380 o_ptr->name2 = EGO_DIGGING;
2384 else if (power < -1)
2386 /* Hack -- Horrible digging bonus */
2387 o_ptr->pval = 0 - (5 + randint1(5));
2393 /* Hack -- Reverse digging bonus */
2394 o_ptr->pval = 0 - (o_ptr->pval);
2408 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2410 create_artifact(o_ptr, FALSE);
2415 /* Roll for an ego-item */
2416 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2417 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2419 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2421 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2426 switch (o_ptr->name2)
2429 if (one_in_(4) && (level > 40))
2430 add_flag(o_ptr->art_flags, TR_BLOWS);
2434 add_flag(o_ptr->art_flags, TR_RES_POIS);
2436 add_flag(o_ptr->art_flags, TR_WARNING);
2438 case EGO_KILL_DRAGON:
2440 add_flag(o_ptr->art_flags, TR_RES_POIS);
2444 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2446 case EGO_SLAYING_WEAPON:
2447 if (one_in_(3)) /* double damage */
2455 while (one_in_(o_ptr->dd));
2461 while (one_in_(o_ptr->ds));
2466 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2468 if (o_ptr->tval == TV_SWORD && one_in_(3))
2470 add_flag(o_ptr->art_flags, TR_VORPAL);
2475 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2481 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
2483 add_flag(o_ptr->art_flags, TR_DEX);
2485 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2488 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
2490 case EGO_EARTHQUAKES:
2491 if (one_in_(3) && (level > 60))
2492 add_flag(o_ptr->art_flags, TR_BLOWS);
2494 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
2498 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2502 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2504 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2506 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2507 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2510 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2511 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2512 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2513 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2517 if (!o_ptr->art_name)
2519 /* Hack -- Super-charge the damage dice */
2520 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2522 /* Hack -- Lower the damage dice */
2523 if (o_ptr->dd > 9) o_ptr->dd = 9;
2528 else if (power < -1)
2530 /* Roll for ego-item */
2531 if (randint0(MAX_DEPTH) < level)
2535 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2536 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2542 switch (o_ptr->name2)
2545 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2546 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2548 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2549 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2550 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2551 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2552 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2553 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2567 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2569 create_artifact(o_ptr, FALSE);
2572 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2586 if (power > 2) /* power > 2 is debug only */
2588 create_artifact(o_ptr, FALSE);
2592 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2594 switch (o_ptr->name2)
2596 case EGO_SLAYING_BOLT:
2601 /* Hack -- super-charge the damage dice */
2602 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2604 /* Hack -- restrict the damage dice */
2605 if (o_ptr->dd > 9) o_ptr->dd = 9;
2609 else if (power < -1)
2611 /* Roll for ego-item */
2612 if (randint0(MAX_DEPTH) < level)
2614 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2624 * @brief ドラゴン装備にランダムな耐性を与える
2625 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2628 static void dragon_resist(object_type * o_ptr)
2633 one_dragon_ele_resistance(o_ptr);
2635 one_high_resistance(o_ptr);
2641 * @brief オブジェクトにランダムな強いESPを与える
2642 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2645 static bool add_esp_strong(object_type *o_ptr)
2647 bool nonliv = FALSE;
2649 switch (randint1(3))
2651 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2652 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2653 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2660 * @brief オブジェクトにランダムな弱いESPを与える
2661 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2662 * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3)
2665 static void add_esp_weak(object_type *o_ptr, bool extra)
2668 u32b weak_esp_list[] = {
2680 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2681 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2683 /* Add unduplicated weak esp flags randomly */
2684 for (i = 0; i < add_count; ++ i)
2686 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2688 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2689 weak_esp_list[choice] = weak_esp_list[i];
2695 * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2696 * Apply magic to an item known to be "armor"
2697 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2698 * @param level 生成基準階
2699 * @param power 生成ランク
2702 * Hack -- note special processing for crown/helm\n
2703 * Hack -- note special processing for robe of permanence\n
2705 static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
2707 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
2708 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
2714 o_ptr->to_a += toac1;
2720 o_ptr->to_a += toac2;
2728 o_ptr->to_a -= toac1;
2733 /* Penalize again */
2734 o_ptr->to_a -= toac2;
2737 /* Cursed (if "bad") */
2738 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2743 switch (o_ptr->tval)
2747 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2748 create_artifact(o_ptr, FALSE);
2758 /* Hack -- Try for "Robes of the Magi" */
2759 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2760 (o_ptr->sval == SV_ROBE) &&
2761 (randint0(100) < 15))
2765 o_ptr->name2 = EGO_YOIYAMI;
2766 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2767 o_ptr->sval = SV_YOIYAMI_ROBE;
2773 o_ptr->name2 = EGO_PERMANENCE;
2778 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2780 create_artifact(o_ptr, FALSE);
2786 bool okay_flag = TRUE;
2788 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2790 switch (o_ptr->name2)
2793 if (o_ptr->tval != TV_HARD_ARMOR)
2799 if (o_ptr->tval != TV_SOFT_ARMOR)
2808 if (okay_flag) break;
2810 switch (o_ptr->name2)
2812 case EGO_RESISTANCE:
2814 add_flag(o_ptr->art_flags, TR_RES_POIS);
2817 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2818 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2822 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2824 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2826 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2827 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2829 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2830 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2831 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2832 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2833 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2834 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2835 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2836 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2839 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2840 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2841 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2842 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2843 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2844 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2857 if (o_ptr->sval == SV_DRAGON_SHIELD)
2859 dragon_resist(o_ptr);
2860 if (!one_in_(3)) break;
2866 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2868 create_artifact(o_ptr, FALSE);
2874 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2875 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
2876 && o_ptr->name2 == EGO_S_DWARVEN)
2883 switch (o_ptr->name2)
2886 if (!one_in_(3)) one_high_resistance(o_ptr);
2887 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2889 case EGO_REFLECTION:
2890 if (o_ptr->sval == SV_MIRROR_SHIELD)
2895 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2896 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2905 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2907 dragon_resist(o_ptr);
2908 if (!one_in_(3)) break;
2912 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2914 create_artifact(o_ptr, FALSE);
2917 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2921 else if (power < -1)
2923 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2931 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2933 dragon_resist(o_ptr);
2934 if (!one_in_(3)) break;
2939 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2941 create_artifact(o_ptr, FALSE);
2944 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
2946 switch (o_ptr->name2)
2948 case EGO_SLOW_DESCENT:
2951 one_high_resistance(o_ptr);
2957 else if (power < -1)
2959 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
2970 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2972 create_artifact(o_ptr, FALSE);
2977 bool ok_flag = TRUE;
2978 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
2980 switch (o_ptr->name2)
2983 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
2984 else add_esp_weak(o_ptr, FALSE);
2988 case EGO_REGENERATION:
2989 case EGO_LORDLINESS:
2995 if (one_in_(2)) add_esp_strong(o_ptr);
2996 else add_esp_weak(o_ptr, FALSE);
2999 default:/* not existing crown (wisdom,lite, etc...) */
3003 break; /* while (1) */
3009 else if (power < -1)
3013 bool ok_flag = TRUE;
3014 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3016 switch (o_ptr->name2)
3018 case EGO_ANCIENT_CURSE:
3019 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
3020 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
3021 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3022 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3023 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3024 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3028 break; /* while (1) */
3037 if (o_ptr->sval == SV_DRAGON_HELM)
3039 dragon_resist(o_ptr);
3040 if (!one_in_(3)) break;
3046 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3048 create_artifact(o_ptr, FALSE);
3053 bool ok_flag = TRUE;
3054 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3056 switch (o_ptr->name2)
3058 case EGO_BRILLIANCE:
3060 case EGO_INFRAVISION:
3061 case EGO_H_PROTECTION:
3066 if (one_in_(2)) add_esp_strong(o_ptr);
3067 else add_esp_weak(o_ptr, FALSE);
3071 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
3072 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
3075 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3077 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
3079 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
3080 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3082 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3083 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
3084 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
3085 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3086 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3087 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3088 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3089 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
3091 default:/* not existing helm (Magi, Might, etc...)*/
3095 break; /* while (1) */
3100 else if (power < -1)
3104 bool ok_flag = TRUE;
3105 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3107 switch (o_ptr->name2)
3109 case EGO_ANCIENT_CURSE:
3113 break; /* while (1) */
3124 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3126 create_artifact(o_ptr, FALSE);
3129 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
3131 switch (o_ptr->name2)
3140 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
3141 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
3142 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
3143 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3150 else if (power < -1)
3152 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3163 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
3164 * Apply magic to an item known to be a "ring" or "amulet"
3165 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3166 * @param level 生成基準階
3167 * @param power 生成ランク
3170 * Hack -- note special "pval boost" code for ring of speed\n
3171 * Hack -- note that some items must be cursed (or blessed)\n
3173 static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
3175 /* Apply magic (good or bad) according to type */
3176 switch (o_ptr->tval)
3181 switch (o_ptr->sval)
3183 case SV_RING_ATTACKS:
3186 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
3187 if (one_in_(15)) o_ptr->pval++;
3188 if (o_ptr->pval < 1) o_ptr->pval = 1;
3194 o_ptr->ident |= (IDENT_BROKEN);
3197 o_ptr->curse_flags |= TRC_CURSED;
3200 o_ptr->pval = 0 - (o_ptr->pval);
3211 /* Strength, Constitution, Dexterity, Intelligence */
3217 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3223 o_ptr->ident |= (IDENT_BROKEN);
3226 o_ptr->curse_flags |= TRC_CURSED;
3229 o_ptr->pval = 0 - (o_ptr->pval);
3235 /* Ring of Speed! */
3238 /* Base speed (1 to 10) */
3239 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3241 /* Super-charge the ring */
3242 while (randint0(100) < 50) o_ptr->pval++;
3248 o_ptr->ident |= (IDENT_BROKEN);
3251 o_ptr->curse_flags |= TRC_CURSED;
3254 o_ptr->pval = 0 - (o_ptr->pval);
3262 case SV_RING_LORDLY:
3266 one_lordly_high_resistance(o_ptr);
3270 /* Bonus to armor class */
3271 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3275 case SV_RING_WARNING:
3277 if (one_in_(3)) one_low_esp(o_ptr);
3282 case SV_RING_SEARCHING:
3284 /* Bonus to searching */
3285 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3291 o_ptr->ident |= (IDENT_BROKEN);
3294 o_ptr->curse_flags |= TRC_CURSED;
3297 o_ptr->pval = 0 - (o_ptr->pval);
3303 /* Flames, Acid, Ice */
3304 case SV_RING_FLAMES:
3309 /* Bonus to armor class */
3310 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3314 /* Weakness, Stupidity */
3315 case SV_RING_WEAKNESS:
3316 case SV_RING_STUPIDITY:
3319 o_ptr->ident |= (IDENT_BROKEN);
3322 o_ptr->curse_flags |= TRC_CURSED;
3325 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3326 if (power > 0) power = 0 - power;
3331 /* WOE, Stupidity */
3335 o_ptr->ident |= (IDENT_BROKEN);
3338 o_ptr->curse_flags |= TRC_CURSED;
3341 o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
3342 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3343 if (power > 0) power = 0 - power;
3348 /* Ring of damage */
3349 case SV_RING_DAMAGE:
3351 /* Bonus to damage */
3352 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
3358 o_ptr->ident |= (IDENT_BROKEN);
3361 o_ptr->curse_flags |= TRC_CURSED;
3364 o_ptr->to_d = 0 - o_ptr->to_d;
3370 /* Ring of Accuracy */
3371 case SV_RING_ACCURACY:
3374 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
3380 o_ptr->ident |= (IDENT_BROKEN);
3383 o_ptr->curse_flags |= TRC_CURSED;
3386 o_ptr->to_h = 0 - o_ptr->to_h;
3392 /* Ring of Protection */
3393 case SV_RING_PROTECTION:
3395 /* Bonus to armor class */
3396 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
3402 o_ptr->ident |= (IDENT_BROKEN);
3405 o_ptr->curse_flags |= TRC_CURSED;
3408 o_ptr->to_a = 0 - o_ptr->to_a;
3414 /* Ring of Slaying */
3415 case SV_RING_SLAYING:
3417 /* Bonus to damage and to hit */
3418 o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
3419 o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
3425 o_ptr->ident |= (IDENT_BROKEN);
3428 o_ptr->curse_flags |= TRC_CURSED;
3430 /* Reverse bonuses */
3431 o_ptr->to_h = 0 - o_ptr->to_h;
3432 o_ptr->to_d = 0 - o_ptr->to_d;
3438 case SV_RING_MUSCLE:
3440 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
3441 if (one_in_(4)) o_ptr->pval++;
3447 o_ptr->ident |= (IDENT_BROKEN);
3450 o_ptr->curse_flags |= TRC_CURSED;
3452 /* Reverse bonuses */
3453 o_ptr->pval = 0 - o_ptr->pval;
3458 case SV_RING_AGGRAVATION:
3461 o_ptr->ident |= (IDENT_BROKEN);
3464 o_ptr->curse_flags |= TRC_CURSED;
3466 if (power > 0) power = 0 - power;
3470 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3471 || (power > 2)) /* power > 2 is debug only */
3473 o_ptr->pval = MIN(o_ptr->pval, 4);
3474 /* Randart amulet */
3475 create_artifact(o_ptr, FALSE);
3477 else if ((power == 2) && one_in_(2))
3479 while(!o_ptr->name2)
3481 int tmp = m_bonus(10, level);
3482 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3483 switch(randint1(28))
3486 o_ptr->name2 = EGO_RING_THROW;
3489 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3490 o_ptr->name2 = EGO_RING_REGEN;
3493 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3494 o_ptr->name2 = EGO_RING_LITE;
3497 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3498 o_ptr->name2 = EGO_RING_TELEPORT;
3501 if (o_ptr->to_h) break;
3502 o_ptr->name2 = EGO_RING_TO_H;
3505 if (o_ptr->to_d) break;
3506 o_ptr->name2 = EGO_RING_TO_D;
3509 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3510 o_ptr->name2 = EGO_RING_SLAY;
3513 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3514 o_ptr->name2 = EGO_RING_WIZARD;
3517 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3518 o_ptr->name2 = EGO_RING_HERO;
3521 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3522 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3523 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3524 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3527 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3528 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;
3529 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3530 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3531 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3534 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3535 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;
3536 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3537 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3538 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3541 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3542 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;
3543 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3544 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3547 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3548 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;
3549 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3550 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3552 case 21: case 22: case 23: case 24: case 25: case 26:
3553 switch (o_ptr->sval)
3556 if (!one_in_(3)) break;
3557 o_ptr->name2 = EGO_RING_D_SPEED;
3559 case SV_RING_DAMAGE:
3560 case SV_RING_ACCURACY:
3561 case SV_RING_SLAYING:
3562 if (one_in_(2)) break;
3563 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3566 o_ptr->name2 = EGO_RING_BERSERKER;
3567 o_ptr->to_h -= 2+randint1(4);
3568 o_ptr->to_d += 2+randint1(4);
3571 case SV_RING_PROTECTION:
3572 o_ptr->name2 = EGO_RING_SUPER_AC;
3573 o_ptr->to_a += 7 + m_bonus(5, level);
3575 case SV_RING_RES_FEAR:
3576 o_ptr->name2 = EGO_RING_HERO;
3579 if (one_in_(2)) break;
3580 o_ptr->name2 = EGO_RING_HUNTER;
3582 case SV_RING_SEARCHING:
3583 o_ptr->name2 = EGO_RING_STEALTH;
3585 case SV_RING_TELEPORTATION:
3586 o_ptr->name2 = EGO_RING_TELE_AWAY;
3588 case SV_RING_RES_BLINDNESS:
3590 o_ptr->name2 = EGO_RING_RES_LITE;
3592 o_ptr->name2 = EGO_RING_RES_DARK;
3594 case SV_RING_LORDLY:
3595 if (!one_in_(20)) break;
3596 one_lordly_high_resistance(o_ptr);
3597 one_lordly_high_resistance(o_ptr);
3598 o_ptr->name2 = EGO_RING_TRUE;
3600 case SV_RING_SUSTAIN:
3601 if (!one_in_(4)) break;
3602 o_ptr->name2 = EGO_RING_RES_TIME;
3604 case SV_RING_FLAMES:
3605 if (!one_in_(2)) break;
3606 o_ptr->name2 = EGO_RING_DRAGON_F;
3609 if (!one_in_(2)) break;
3610 o_ptr->name2 = EGO_RING_DRAGON_C;
3612 case SV_RING_WARNING:
3613 if (!one_in_(2)) break;
3614 o_ptr->name2 = EGO_RING_M_DETECT;
3623 o_ptr->curse_flags = 0L;
3625 else if ((power == -2) && one_in_(2))
3627 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3628 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3629 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3630 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3631 o_ptr->art_flags[0] = 0;
3632 o_ptr->art_flags[1] = 0;
3633 while(!o_ptr->name2)
3635 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3639 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3640 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3643 o_ptr->name2 = EGO_RING_NO_MELEE;
3646 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3647 o_ptr->name2 = EGO_RING_AGGRAVATE;
3650 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3651 o_ptr->name2 = EGO_RING_TY_CURSE;
3654 o_ptr->name2 = EGO_RING_ALBINO;
3659 o_ptr->ident |= (IDENT_BROKEN);
3662 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3670 switch (o_ptr->sval)
3672 /* Amulet of wisdom/charisma */
3673 case SV_AMULET_INTELLIGENCE:
3674 case SV_AMULET_WISDOM:
3675 case SV_AMULET_CHARISMA:
3677 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3683 o_ptr->ident |= (IDENT_BROKEN);
3686 o_ptr->curse_flags |= (TRC_CURSED);
3688 /* Reverse bonuses */
3689 o_ptr->pval = 0 - o_ptr->pval;
3695 /* Amulet of brilliance */
3696 case SV_AMULET_BRILLIANCE:
3698 o_ptr->pval = 1 + m_bonus(3, level);
3699 if (one_in_(4)) o_ptr->pval++;
3705 o_ptr->ident |= (IDENT_BROKEN);
3708 o_ptr->curse_flags |= (TRC_CURSED);
3710 /* Reverse bonuses */
3711 o_ptr->pval = 0 - o_ptr->pval;
3717 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3721 o_ptr->curse_flags |= (TRC_CURSED);
3726 case SV_AMULET_RESISTANCE:
3728 if (one_in_(5)) one_high_resistance(o_ptr);
3729 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3733 /* Amulet of searching */
3734 case SV_AMULET_SEARCHING:
3736 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
3742 o_ptr->ident |= (IDENT_BROKEN);
3745 o_ptr->curse_flags |= (TRC_CURSED);
3747 /* Reverse bonuses */
3748 o_ptr->pval = 0 - (o_ptr->pval);
3754 /* Amulet of the Magi -- never cursed */
3755 case SV_AMULET_THE_MAGI:
3757 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3758 o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
3760 /* gain one low ESP */
3761 add_esp_weak(o_ptr, FALSE);
3766 /* Amulet of Doom -- always cursed */
3767 case SV_AMULET_DOOM:
3770 o_ptr->ident |= (IDENT_BROKEN);
3773 o_ptr->curse_flags |= (TRC_CURSED);
3776 o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
3777 o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
3778 if (power > 0) power = 0 - power;
3783 case SV_AMULET_MAGIC_MASTERY:
3785 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
3791 o_ptr->ident |= (IDENT_BROKEN);
3794 o_ptr->curse_flags |= (TRC_CURSED);
3796 /* Reverse bonuses */
3797 o_ptr->pval = 0 - o_ptr->pval;
3803 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3804 || (power > 2)) /* power > 2 is debug only */
3806 o_ptr->pval = MIN(o_ptr->pval, 4);
3807 /* Randart amulet */
3808 create_artifact(o_ptr, FALSE);
3810 else if ((power == 2) && one_in_(2))
3812 while(!o_ptr->name2)
3814 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3815 switch(randint1(21))
3818 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3819 o_ptr->name2 = EGO_AMU_SLOW_D;
3822 if (o_ptr->pval) break;
3823 o_ptr->name2 = EGO_AMU_INFRA;
3826 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3827 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3830 if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
3831 o_ptr->name2 = EGO_AMU_HOLD_EXP;
3834 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3835 o_ptr->name2 = EGO_AMU_LEVITATION;
3837 case 10: case 11: case 21:
3838 o_ptr->name2 = EGO_AMU_AC;
3841 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3842 if (m_bonus(10, level) > 8)
3843 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3845 o_ptr->name2 = EGO_AMU_RES_FIRE;
3848 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3849 if (m_bonus(10, level) > 8)
3850 o_ptr->name2 = EGO_AMU_RES_COLD_;
3852 o_ptr->name2 = EGO_AMU_RES_COLD;
3855 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3856 if (m_bonus(10, level) > 8)
3857 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3859 o_ptr->name2 = EGO_AMU_RES_ELEC;
3862 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3863 if (m_bonus(10, level) > 8)
3864 o_ptr->name2 = EGO_AMU_RES_ACID_;
3866 o_ptr->name2 = EGO_AMU_RES_ACID;
3868 case 16: case 17: case 18: case 19: case 20:
3869 switch (o_ptr->sval)
3871 case SV_AMULET_TELEPORT:
3872 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3873 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3874 else o_ptr->name2 = EGO_AMU_TELEPORT;
3876 case SV_AMULET_RESIST_ACID:
3877 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3879 case SV_AMULET_SEARCHING:
3880 o_ptr->name2 = EGO_AMU_STEALTH;
3882 case SV_AMULET_BRILLIANCE:
3883 if (!one_in_(3)) break;
3884 o_ptr->name2 = EGO_AMU_IDENT;
3886 case SV_AMULET_CHARISMA:
3887 if (!one_in_(3)) break;
3888 o_ptr->name2 = EGO_AMU_CHARM;
3890 case SV_AMULET_THE_MAGI:
3891 if (one_in_(2)) break;
3892 o_ptr->name2 = EGO_AMU_GREAT;
3894 case SV_AMULET_RESISTANCE:
3895 if (!one_in_(5)) break;
3896 o_ptr->name2 = EGO_AMU_DEFENDER;
3898 case SV_AMULET_TELEPATHY:
3899 if (!one_in_(3)) break;
3900 o_ptr->name2 = EGO_AMU_DETECTION;
3906 o_ptr->curse_flags = 0L;
3908 else if ((power == -2) && one_in_(2))
3910 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3911 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3912 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3913 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3914 o_ptr->art_flags[0] = 0;
3915 o_ptr->art_flags[1] = 0;
3916 while(!o_ptr->name2)
3918 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3922 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3923 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3926 o_ptr->name2 = EGO_AMU_FOOL;
3929 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3930 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3933 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3934 o_ptr->name2 = EGO_AMU_TY_CURSE;
3937 o_ptr->name2 = EGO_AMU_NAIVETY;
3942 o_ptr->ident |= (IDENT_BROKEN);
3945 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3953 * @brief モンスターが人形のベースにできるかを返す
3954 * @param r_idx チェックしたいモンスター種族のID
3955 * @return 人形にできるならTRUEを返す
3957 static bool item_monster_okay(MONRACE_IDX r_idx)
3959 monster_race *r_ptr = &r_info[r_idx];
3962 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
3963 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
3964 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
3965 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
3966 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
3967 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
3974 * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
3975 * Apply magic to an item known to be "boring"
3976 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3977 * @param level 生成基準階
3978 * @param power 生成ランク
3981 * Hack -- note the special code for various items
3983 static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
3985 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3990 /* Apply magic (good or bad) according to type */
3991 switch (o_ptr->tval)
4000 o_ptr->ident |= (IDENT_BROKEN);
4003 o_ptr->curse_flags |= (TRC_CURSED);
4010 o_ptr->xtra4 = o_ptr->pval;
4016 /* Hack -- Torches -- random fuel */
4017 if (o_ptr->sval == SV_LITE_TORCH)
4019 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4023 /* Hack -- Lanterns -- random fuel */
4024 if (o_ptr->sval == SV_LITE_LANTERN)
4026 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4030 if (power > 2) /* power > 2 is debug only */
4032 create_artifact(o_ptr, FALSE);
4034 else if ((power == 2) || ((power == 1) && one_in_(3)))
4036 while (!o_ptr->name2)
4040 bool okay_flag = TRUE;
4042 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
4044 switch (o_ptr->name2)
4047 if (o_ptr->sval == SV_LITE_FEANOR)
4055 else if (power == -2)
4057 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
4059 switch (o_ptr->name2)
4061 case EGO_LITE_DARKNESS:
4064 if (o_ptr->sval == SV_LITE_TORCH)
4066 add_flag(o_ptr->art_flags, TR_LITE_M1);
4068 else if (o_ptr->sval == SV_LITE_LANTERN)
4070 add_flag(o_ptr->art_flags, TR_LITE_M2);
4072 else if (o_ptr->sval == SV_LITE_FEANOR)
4074 add_flag(o_ptr->art_flags, TR_LITE_M3);
4086 /* The wand or staff gets a number of initial charges equal
4087 * to between 1/2 (+1) and the full object kind's pval. -LM-
4089 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
4095 /* Transfer the pval. -LM- */
4096 o_ptr->pval = k_ptr->pval;
4103 object_aware(o_ptr);
4104 object_known(o_ptr);
4110 PARAMETER_VALUE i = 1;
4113 monster_race *r_ptr;
4115 /* Pick a random non-unique monster race */
4118 i = randint1(max_r_idx - 1);
4120 if (!item_monster_okay(i)) continue;
4121 if (i == MON_TSUCHINOKO) continue;
4125 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4127 /* Ignore dead monsters */
4128 if (!r_ptr->rarity) continue;
4130 /* Ignore uncommon monsters */
4131 if (r_ptr->rarity > 100) continue;
4133 /* Prefer less out-of-depth monsters */
4134 if (randint0(check)) continue;
4141 /* Some figurines are cursed */
4142 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
4149 PARAMETER_VALUE i = 1;
4154 monster_race *r_ptr;
4156 if (o_ptr->sval == SV_SKELETON)
4158 match = RF9_DROP_SKELETON;
4160 else if (o_ptr->sval == SV_CORPSE)
4162 match = RF9_DROP_CORPSE;
4165 /* Hack -- Remove the monster restriction */
4166 get_mon_num_prep(item_monster_okay, NULL);
4168 /* Pick a random non-unique monster race */
4171 i = get_mon_num(dun_level);
4175 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4177 /* Ignore dead monsters */
4178 if (!r_ptr->rarity) continue;
4180 /* Ignore corpseless monsters */
4181 if (!(r_ptr->flags9 & match)) continue;
4183 /* Prefer less out-of-depth monsters */
4184 if (randint0(check)) continue;
4192 object_aware(o_ptr);
4193 object_known(o_ptr);
4199 PARAMETER_VALUE i = 1;
4201 monster_race *r_ptr;
4203 /* Pick a random monster race */
4206 i = randint1(max_r_idx - 1);
4210 /* Ignore dead monsters */
4211 if (!r_ptr->rarity) continue;
4220 msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
4222 object_aware(o_ptr);
4223 object_known(o_ptr);
4230 DEPTH obj_level = k_info[o_ptr->k_idx].level;
4232 /* Hack -- skip ruined chests */
4233 if (obj_level <= 0) break;
4235 /* Hack -- pick a "difficulty" */
4236 o_ptr->pval = randint1(obj_level);
4237 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4239 o_ptr->xtra3 = dun_level + 5;
4241 /* Never exceed "difficulty" of 55 to 59 */
4242 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4250 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
4251 * Complete the "creation" of an object by applying "magic" to the item
4252 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4254 * @param mode 生成オプション
4257 * This includes not only rolling for random bonuses, but also putting the\n
4258 * finishing touches on ego-items and artifacts, giving charges to wands and\n
4259 * staffs, giving fuel to lites, and placing traps on chests.\n
4261 * In particular, note that "Instant Artifacts", if "created" by an external\n
4262 * routine, must pass through this function to complete the actual creation.\n
4264 * The base "chance" of the item being "good" increases with the "level"\n
4265 * parameter, which is usually derived from the dungeon level, being equal\n
4266 * to the level plus 10, up to a maximum of 75. If "good" is true, then\n
4267 * the object is guaranteed to be "good". If an object is "good", then\n
4268 * the chance that the object will be "great" (ego-item or artifact), also\n
4269 * increases with the "level", being equal to half the level, plus 5, up to\n
4270 * a maximum of 20. If "great" is true, then the object is guaranteed to be\n
4271 * "great". At dungeon level 65 and below, 15/100 objects are "great".\n
4273 * If the object is not "good", there is a chance it will be "cursed", and\n
4274 * if it is "cursed", there is a chance it will be "broken". These chances\n
4275 * are related to the "good" / "great" chances above.\n
4277 * Otherwise "normal" rings and amulets will be "good" half the time and\n
4278 * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4280 * If "okay" is true, and the object is going to be "great", then there is\n
4281 * a chance that an artifact will be created. This is true even if both the\n
4282 * "good" and "great" arguments are false. As a total hack, if "great" is\n
4283 * true, then the item gets 3 extra "attempts" to become an artifact.\n
4285 void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
4287 int i, rolls, f1, f2, power;
4289 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4291 /* Maximum "level" for various things */
4292 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4294 /* Base chance of being "good" */
4297 /* Maximal chance of being "good" */
4298 if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4300 /* Base chance of being "great" */
4303 /* Maximal chance of being "great" */
4304 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4305 f2 = d_info[dungeon_type].obj_great;
4307 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4312 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4321 /* Roll for "good" */
4322 if ((mode & AM_GOOD) || magik(f1))
4327 /* Roll for "great" */
4328 if ((mode & AM_GREAT) || magik(f2))
4332 /* Roll for "special" */
4333 if (mode & AM_SPECIAL) power = 3;
4337 /* Roll for "cursed" */
4340 /* Assume "cursed" */
4343 /* Roll for "broken" */
4344 if (magik(f2)) power = -2;
4348 if (mode & AM_CURSED)
4350 /* Assume 'cursed' */
4355 /* Everything else gets more badly cursed */
4362 /* Assume no rolls */
4365 /* Get one roll if excellent */
4366 if (power >= 2) rolls = 1;
4368 /* Hack -- Get four rolls if forced great or special */
4369 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4371 /* Hack -- Get no rolls if not allowed */
4372 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4374 /* Roll for artifacts if allowed */
4375 for (i = 0; i < rolls; i++)
4377 /* Roll for an artifact */
4378 if (make_artifact(o_ptr)) break;
4379 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4381 if (make_artifact(o_ptr)) break;
4386 /* Hack -- analyze artifacts */
4387 if (object_is_fixed_artifact(o_ptr))
4389 artifact_type *a_ptr = &a_info[o_ptr->name1];
4391 /* Hack -- Mark the artifact as "created" */
4394 /* Hack -- Memorize location of artifact in saved floors */
4395 if (character_dungeon)
4396 a_ptr->floor_id = p_ptr->floor_id;
4398 /* Extract the other fields */
4399 o_ptr->pval = a_ptr->pval;
4400 o_ptr->ac = a_ptr->ac;
4401 o_ptr->dd = a_ptr->dd;
4402 o_ptr->ds = a_ptr->ds;
4403 o_ptr->to_a = a_ptr->to_a;
4404 o_ptr->to_h = a_ptr->to_h;
4405 o_ptr->to_d = a_ptr->to_d;
4406 o_ptr->weight = a_ptr->weight;
4407 o_ptr->xtra2 = a_ptr->act_idx;
4409 if (o_ptr->name1 == ART_MILIM)
4411 if(p_ptr->pseikaku == SEIKAKU_SEXY)
4417 /* Hack -- extract the "broken" flag */
4418 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4420 /* Hack -- extract the "cursed" flag */
4421 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4422 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4423 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4424 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4425 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4426 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4431 switch (o_ptr->tval)
4440 if (power) a_m_aux_1(o_ptr, lev, power);
4446 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4452 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4466 /* Elven Cloak and Black Clothes ... */
4467 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4468 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4469 o_ptr->pval = randint1(4);
4473 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4474 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4475 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4476 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4477 a_m_aux_2(o_ptr, lev, power);
4479 if (power) a_m_aux_2(o_ptr, lev, power);
4487 if (!power && (randint0(100) < 50)) power = -1;
4488 a_m_aux_3(o_ptr, lev, power);
4494 a_m_aux_4(o_ptr, lev, power);
4499 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4500 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4501 (p_ptr->pseikaku == SEIKAKU_SEXY))
4504 add_flag(o_ptr->art_flags, TR_STR);
4505 add_flag(o_ptr->art_flags, TR_INT);
4506 add_flag(o_ptr->art_flags, TR_WIS);
4507 add_flag(o_ptr->art_flags, TR_DEX);
4508 add_flag(o_ptr->art_flags, TR_CON);
4509 add_flag(o_ptr->art_flags, TR_CHR);
4512 /* Hack -- analyze ego-items */
4513 if (object_is_ego(o_ptr))
4515 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4517 /* Hack -- acquire "broken" flag */
4518 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4520 /* Hack -- acquire "cursed" flag */
4521 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4522 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4523 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4524 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4525 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4526 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4528 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4529 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4530 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4531 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4532 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4533 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4534 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4535 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4541 while (one_in_(o_ptr->dd));
4543 if (o_ptr->dd > 9) o_ptr->dd = 9;
4546 /* Hack -- apply activatin index if needed */
4547 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
4549 /* Hack -- apply extra penalties if needed */
4550 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4552 /* Hack -- obtain bonuses */
4553 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4554 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4555 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4557 /* Hack -- obtain pval */
4558 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4561 /* Hack -- apply extra bonuses if needed */
4564 /* Hack -- obtain bonuses */
4565 if (e_ptr->max_to_h)
4567 if (e_ptr->max_to_h > 127)
4568 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4569 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4571 if (e_ptr->max_to_d)
4573 if (e_ptr->max_to_d > 127)
4574 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4575 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4577 if (e_ptr->max_to_a)
4579 if (e_ptr->max_to_a > 127)
4580 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4581 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4584 /* Accuracy ego must have high to_h */
4585 if(o_ptr->name2 == EGO_ACCURACY)
4587 while(o_ptr->to_h < o_ptr->to_d + 10)
4592 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4595 /* Accuracy ego must have high to_h */
4596 if(o_ptr->name2 == EGO_VELOCITY)
4598 while(o_ptr->to_d < o_ptr->to_h + 10)
4603 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4606 /* Protection ego must have high to_a */
4607 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4609 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4612 /* Hack -- obtain pval */
4613 if (e_ptr->max_pval)
4615 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4618 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4620 else if (o_ptr->name2 == EGO_DEMON)
4622 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4624 o_ptr->pval += randint1(2);
4628 o_ptr->pval += randint1(e_ptr->max_pval);
4631 else if (o_ptr->name2 == EGO_ATTACKS)
4633 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4634 if (o_ptr->pval > 3) o_ptr->pval = 3;
4635 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4636 o_ptr->pval += randint1(2);
4638 else if (o_ptr->name2 == EGO_BAT)
4640 o_ptr->pval = randint1(e_ptr->max_pval);
4641 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4643 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4645 o_ptr->pval = randint1(e_ptr->max_pval);
4649 o_ptr->pval += randint1(e_ptr->max_pval);
4654 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4656 o_ptr->pval = randint1(o_ptr->pval);
4658 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4665 /* Examine real objects */
4668 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4670 /* Hack -- acquire "broken" flag */
4671 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4673 /* Hack -- acquire "cursed" flag */
4674 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4675 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4676 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4677 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4678 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4679 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4687 * @brief ベースアイテムが上質として扱われるかどうかを返す。
4688 * Hack -- determine if a template is "good"
4689 * @param k_idx 判定したいベースアイテムのID
4690 * @return ベースアイテムが上質ならばTRUEを返す。
4692 static bool kind_is_good(KIND_OBJECT_IDX k_idx)
4694 object_kind *k_ptr = &k_info[k_idx];
4696 /* Analyze the item type */
4697 switch (k_ptr->tval)
4699 /* Armor -- Good unless damaged */
4710 if (k_ptr->to_a < 0) return (FALSE);
4714 /* Weapons -- Good unless damaged */
4721 if (k_ptr->to_h < 0) return (FALSE);
4722 if (k_ptr->to_d < 0) return (FALSE);
4726 /* Ammo -- Arrows/Bolts are good */
4733 /* Books -- High level books are good (except Arcane books) */
4735 case TV_SORCERY_BOOK:
4736 case TV_NATURE_BOOK:
4741 case TV_DAEMON_BOOK:
4742 case TV_CRUSADE_BOOK:
4744 case TV_HISSATSU_BOOK:
4747 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4751 /* Rings -- Rings of Speed are good */
4754 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4755 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4759 /* Amulets -- Amulets of the Magi and Resistance are good */
4762 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4763 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4768 /* Assume not good */
4773 * @brief 生成階に応じたベースアイテムの生成を行う。
4774 * Attempt to make an object (normal or good/great)
4775 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4776 * @param mode オプションフラグ
4777 * @return 生成に成功したらTRUEを返す。
4779 * This routine plays nasty games to generate the "special artifacts".\n
4780 * This routine uses "object_level" for the "generation level".\n
4781 * We assume that the given object has been "wiped".\n
4783 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
4789 /* Chance of "special object" */
4790 prob = ((mode & AM_GOOD) ? 10 : 1000);
4792 /* Base level for the object */
4793 base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4796 /* Generate a special object, or a normal object */
4797 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4799 KIND_OBJECT_IDX k_idx;
4802 if ((mode & AM_GOOD) && !get_obj_num_hook)
4804 /* Activate restriction (if already specified, use that) */
4805 get_obj_num_hook = kind_is_good;
4808 /* Restricted objects - prepare allocation table */
4809 if (get_obj_num_hook) get_obj_num_prep();
4811 /* Pick a random object */
4812 k_idx = get_obj_num(base);
4814 /* Restricted objects */
4815 if (get_obj_num_hook)
4817 /* Clear restriction */
4818 get_obj_num_hook = NULL;
4820 /* Reset allocation table to default */
4824 /* Handle failure */
4825 if (!k_idx) return (FALSE);
4827 /* Prepare the object */
4828 object_prep(j_ptr, k_idx);
4831 /* Apply magic (allow artifacts) */
4832 apply_magic(j_ptr, object_level, mode);
4834 /* Hack -- generate multiple spikes/missiles */
4835 switch (j_ptr->tval)
4843 j_ptr->number = (byte)damroll(6, 7);
4847 if (cheat_peek) object_mention(j_ptr);
4855 * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
4856 * Attempt to place an object (normal or good/great) at the given location.
4857 * @param y 配置したいフロアのY座標
4858 * @param x 配置したいフロアのX座標
4859 * @param mode オプションフラグ
4860 * @return 生成に成功したらTRUEを返す。
4862 * This routine plays nasty games to generate the "special artifacts".\n
4863 * This routine uses "object_level" for the "generation level".\n
4864 * This routine requires a clean floor grid destination.\n
4866 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
4871 cave_type *c_ptr = &cave[y][x];
4877 /* Paranoia -- check bounds */
4878 if (!in_bounds(y, x)) return;
4880 /* Require floor space */
4881 if (!cave_drop_bold(y, x)) return;
4883 /* Avoid stacking on other objects */
4884 if (c_ptr->o_idx) return;
4889 /* Make an object (if possible) */
4890 if (!make_object(q_ptr, mode)) return;
4893 /* Make an object */
4900 o_ptr = &o_list[o_idx];
4902 /* Structure Copy */
4903 object_copy(o_ptr, q_ptr);
4909 o_ptr->next_o_idx = c_ptr->o_idx;
4911 /* Place the object */
4912 c_ptr->o_idx = o_idx;
4920 /* Hack -- Preserve artifacts */
4921 if (object_is_fixed_artifact(q_ptr))
4923 a_info[q_ptr->name1].cur_num = 0;
4930 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
4931 * Make a treasure object
4932 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4933 * @return 生成に成功したらTRUEを返す。
4935 * The location must be a legal, clean, floor grid.
4937 bool make_gold(object_type *j_ptr)
4942 /* Hack -- Pick a Treasure variety */
4943 i = ((randint1(object_level + 2) + 2) / 2) - 1;
4945 /* Apply "extra" magic */
4946 if (one_in_(GREAT_OBJ))
4948 i += randint1(object_level + 1);
4951 /* Hack -- Creeping Coins only generate "themselves" */
4952 if (coin_type) i = coin_type;
4954 /* Do not create "illegal" Treasure Types */
4955 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
4957 /* Prepare a gold object */
4958 object_prep(j_ptr, OBJ_GOLD_LIST + i);
4960 /* Hack -- Base coin cost */
4961 base = k_info[OBJ_GOLD_LIST + i].cost;
4963 /* Determine how much the treasure is "worth" */
4964 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
4972 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
4973 * Places a treasure (Gold or Gems) at given location
4974 * @param y 配置したいフロアのY座標
4975 * @param x 配置したいフロアのX座標
4976 * @return 生成に成功したらTRUEを返す。
4978 * The location must be a legal, clean, floor grid.
4980 void place_gold(POSITION y, POSITION x)
4985 cave_type *c_ptr = &cave[y][x];
4991 /* Paranoia -- check bounds */
4992 if (!in_bounds(y, x)) return;
4994 /* Require floor space */
4995 if (!cave_drop_bold(y, x)) return;
4997 /* Avoid stacking on other objects */
4998 if (c_ptr->o_idx) return;
5003 /* Make some gold */
5004 if (!make_gold(q_ptr)) return;
5006 /* Make an object */
5013 o_ptr = &o_list[o_idx];
5015 /* Copy the object */
5016 object_copy(o_ptr, q_ptr);
5023 o_ptr->next_o_idx = c_ptr->o_idx;
5025 /* Place the object */
5026 c_ptr->o_idx = o_idx;
5036 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
5037 * Let an object fall to the ground at or near a location.
5038 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
5039 * @param chance ドロップの成功率(%)
5040 * @param y 配置したいフロアのY座標
5041 * @param x 配置したいフロアのX座標
5042 * @return 生成に成功したらオブジェクトのIDを返す。
5044 * The initial location is assumed to be "in_bounds()".\n
5046 * This function takes a parameter "chance". This is the percentage\n
5047 * chance that the item will "disappear" instead of drop. If the object\n
5048 * has been thrown, then this is the chance of disappearance on contact.\n
5050 * Hack -- this function uses "chance" to determine if it should produce\n
5051 * some form of "description" of the drop event (under the player).\n
5053 * We check several locations to see if we can find a location at which\n
5054 * the object can combine, stack, or be placed. Artifacts will try very\n
5055 * hard to be placed, including "teleporting" to a useful grid if needed.\n
5057 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
5064 POSITION ty, tx = 0;
5066 OBJECT_IDX o_idx = 0;
5067 OBJECT_IDX this_o_idx, next_o_idx = 0;
5071 GAME_TEXT o_name[MAX_NLEN];
5077 /* Extract plural */
5078 bool plural = (j_ptr->number != 1);
5081 /* Describe object */
5082 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5085 /* Handle normal "breakage" */
5086 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
5089 msg_format("%sは消えた。", o_name);
5091 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5094 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
5111 /* Scan local grids */
5112 for (dy = -3; dy <= 3; dy++)
5114 /* Scan local grids */
5115 for (dx = -3; dx <= 3; dx++)
5119 /* Calculate actual distance */
5120 d = (dy * dy) + (dx * dx);
5122 /* Ignore distant grids */
5123 if (d > 10) continue;
5128 /* Skip illegal grids */
5129 if (!in_bounds(ty, tx)) continue;
5131 /* Require line of projection */
5132 if (!projectable(y, x, ty, tx)) continue;
5135 c_ptr = &cave[ty][tx];
5137 /* Require floor space */
5138 if (!cave_drop_bold(ty, tx)) continue;
5143 /* Scan objects in that grid */
5144 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5147 o_ptr = &o_list[this_o_idx];
5149 /* Acquire next object */
5150 next_o_idx = o_ptr->next_o_idx;
5152 /* Check for possible combination */
5153 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5159 /* Add new object */
5163 if (k > 99) continue;
5165 /* Calculate score */
5166 s = 1000 - (d + k * 5);
5168 /* Skip bad values */
5169 if (s < bs) continue;
5171 /* New best value */
5174 /* Apply the randomizer to equivalent values */
5175 if ((++bn >= 2) && !one_in_(bn)) continue;
5189 /* Handle lack of space */
5190 if (!flag && !object_is_artifact(j_ptr))
5193 msg_format("%sは消えた。", o_name);
5195 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5200 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5208 for (i = 0; !flag && (i < 1000); i++)
5211 ty = rand_spread(by, 1);
5212 tx = rand_spread(bx, 1);
5214 /* Verify location */
5215 if (!in_bounds(ty, tx)) continue;
5217 /* Bounce to that location */
5221 /* Require floor space */
5222 if (!cave_drop_bold(by, bx)) continue;
5230 int candidates = 0, pick;
5232 for (ty = 1; ty < cur_hgt - 1; ty++)
5234 for (tx = 1; tx < cur_wid - 1; tx++)
5236 /* A valid space found */
5237 if (cave_drop_bold(ty, tx)) candidates++;
5241 /* No valid place! */
5245 msg_format("%sは消えた。", o_name);
5247 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5251 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5253 /* Mega-Hack -- preserve artifacts */
5256 /* Hack -- Preserve unknown artifacts */
5257 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5259 /* Mega-Hack -- Preserve the artifact */
5260 a_info[j_ptr->name1].cur_num = 0;
5268 /* Choose a random one */
5269 pick = randint1(candidates);
5271 for (ty = 1; ty < cur_hgt - 1; ty++)
5273 for (tx = 1; tx < cur_wid - 1; tx++)
5275 if (cave_drop_bold(ty, tx))
5279 /* Is this a picked one? */
5292 c_ptr = &cave[by][bx];
5294 /* Scan objects in that grid for combination */
5295 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5298 o_ptr = &o_list[this_o_idx];
5300 /* Acquire next object */
5301 next_o_idx = o_ptr->next_o_idx;
5303 /* Check for combination */
5304 if (object_similar(o_ptr, j_ptr))
5306 object_absorb(o_ptr, j_ptr);
5315 if (!done) o_idx = o_pop();
5318 if (!done && !o_idx)
5321 msg_format("%sは消えた。", o_name);
5323 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5327 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5329 /* Hack -- Preserve artifacts */
5330 if (object_is_fixed_artifact(j_ptr))
5332 a_info[j_ptr->name1].cur_num = 0;
5342 /* Structure copy */
5343 object_copy(&o_list[o_idx], j_ptr);
5345 /* Access new object */
5346 j_ptr = &o_list[o_idx];
5353 j_ptr->held_m_idx = 0;
5356 j_ptr->next_o_idx = c_ptr->o_idx;
5358 /* Place the object */
5359 c_ptr->o_idx = o_idx;
5369 /* Mega-Hack -- no message if "dropped" by player */
5370 /* Message when an object falls under the player */
5371 if (chance && player_bold(by, bx))
5373 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5382 * Scatter some "great" objects near the player
5383 * @param y1 配置したいフロアのY座標
5384 * @param x1 配置したいフロアのX座標
5385 * @param num 獲得の処理回数
5386 * @param great TRUEならば必ず高級品以上を落とす
5387 * @param special TRUEならば必ず特別品を落とす
5388 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5391 void acquirement(POSITION y1, POSITION x1, int num, bool great, bool special, bool known)
5394 object_type object_type_body;
5395 BIT_FLAGS mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ;
5400 i_ptr = &object_type_body;
5403 /* Make a good (or great) object (if possible) */
5404 if (!make_object(i_ptr, mode)) continue;
5408 object_aware(i_ptr);
5409 object_known(i_ptr);
5412 /* Drop the object */
5413 (void)drop_near(i_ptr, -1, y1, x1);
5418 * Scatter some "amusing" objects near the player
5421 #define AMS_NOTHING 0x00 /* No restriction */
5422 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
5423 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
5424 #define AMS_MULTIPLE 0x04 /* Drop 1-3 objects for one type */
5425 #define AMS_PILE 0x08 /* Drop 1-99 pile objects for one type */
5429 OBJECT_TYPE_VALUE tval;
5430 OBJECT_SUBTYPE_VALUE sval;
5435 amuse_type amuse_info[] =
5437 { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
5438 { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
5439 { TV_SPIKE, SV_ANY, 10, AMS_PILE },
5440 { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
5441 { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
5442 { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
5443 { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
5444 { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
5445 { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
5446 { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
5447 { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
5448 { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
5449 { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
5456 * @param y1 配置したいフロアのY座標
5457 * @param x1 配置したいフロアのX座標
5458 * @param num 誰得の処理回数
5459 * @param known TRUEならばオブジェクトが必ず*鑑定*済になる
5462 void amusement(POSITION y1, POSITION x1, int num, bool known)
5465 object_type object_type_body;
5468 for (n = 0; amuse_info[n].tval != 0; n++)
5470 t += amuse_info[n].prob;
5477 KIND_OBJECT_IDX k_idx;
5478 ARTIFACT_IDX a_idx = 0;
5479 int r = randint0(t);
5480 bool insta_art, fixed_art;
5484 r -= amuse_info[i].prob;
5487 i_ptr = &object_type_body;
5489 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
5491 /* Paranoia - reroll if nothing */
5492 if (!k_idx) continue;
5494 /* Search an artifact index if need */
5495 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
5496 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
5498 if (insta_art || fixed_art)
5500 for (a_idx = 1; a_idx < max_a_idx; a_idx++)
5502 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
5503 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
5504 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
5505 if (a_info[a_idx].cur_num > 0) continue;
5509 if (a_idx >= max_a_idx) continue;
5512 /* Make an object (if possible) */
5513 object_prep(i_ptr, k_idx);
5514 if (a_idx) i_ptr->name1 = a_idx;
5515 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
5517 if (amuse_info[i].flag & AMS_NO_UNIQUE)
5519 if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
5522 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
5523 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
5527 object_aware(i_ptr);
5528 object_known(i_ptr);
5531 /* Paranoia - reroll if nothing */
5532 if (!(i_ptr->k_idx)) continue;
5534 /* Drop the object */
5535 (void)drop_near(i_ptr, -1, y1, x1);
5543 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5544 * Describe the charges on an item in the inventory.
5545 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5548 void inven_item_charges(INVENTORY_IDX item)
5550 object_type *o_ptr = &inventory[item];
5552 /* Require staff/wand */
5553 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5555 /* Require known item */
5556 if (!object_is_known(o_ptr)) return;
5559 if (o_ptr->pval <= 0)
5561 msg_print("もう魔力が残っていない。");
5565 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5568 /* Multiple charges */
5569 if (o_ptr->pval != 1)
5571 msg_format("You have %d charges remaining.", o_ptr->pval);
5577 msg_format("You have %d charge remaining.", o_ptr->pval);
5584 * @brief アイテムの残り所持数メッセージを表示する /
5585 * Describe an item in the inventory.
5586 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5589 void inven_item_describe(INVENTORY_IDX item)
5591 object_type *o_ptr = &inventory[item];
5592 GAME_TEXT o_name[MAX_NLEN];
5594 object_desc(o_name, o_ptr, 0);
5597 /* "no more" の場合はこちらで表示する */
5598 if (o_ptr->number <= 0)
5600 /*FIRST*//*ここはもう通らないかも */
5601 msg_format("もう%sを持っていない。", o_name);
5605 /* アイテム名を英日切り替え機能対応 */
5606 msg_format("まだ %sを持っている。", o_name);
5609 msg_format("You have %s.", o_name);
5615 * @brief アイテムを増減させ残り所持数メッセージを表示する /
5616 * Increase the "number" of an item in the inventory
5617 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5621 void inven_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
5623 object_type *o_ptr = &inventory[item];
5626 num += o_ptr->number;
5629 if (num > 255) num = 255;
5630 else if (num < 0) num = 0;
5633 num -= o_ptr->number;
5635 /* Change the number and weight */
5638 /* Add the number */
5639 o_ptr->number += num;
5641 /* Add the weight */
5642 p_ptr->total_weight += (num * o_ptr->weight);
5643 p_ptr->update |= (PU_BONUS);
5645 /* Recalculate mana XXX */
5646 p_ptr->update |= (PU_MANA);
5648 /* Combine the pack */
5649 p_ptr->update |= (PU_COMBINE);
5651 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5653 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5654 if (!o_ptr->number && p_ptr->ele_attack)
5656 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5658 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5660 /* Clear all temporary elemental brands */
5661 set_ele_attack(0, 0);
5669 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5670 * Erase an inventory slot if it has no more items
5671 * @param item 消去したいプレイヤーのアイテム所持スロット
5674 void inven_item_optimize(INVENTORY_IDX item)
5676 object_type *o_ptr = &inventory[item];
5678 /* Only optimize real items */
5679 if (!o_ptr->k_idx) return;
5681 /* Only optimize empty items */
5682 if (o_ptr->number) return;
5684 /* The item is in the pack */
5685 if (item < INVEN_RARM)
5692 /* Slide everything down */
5693 for (i = item; i < INVEN_PACK; i++)
5695 /* Structure copy */
5696 inventory[i] = inventory[i+1];
5699 /* Erase the "final" slot */
5700 object_wipe(&inventory[i]);
5702 p_ptr->window |= (PW_INVEN);
5705 /* The item is being wielded */
5711 /* Erase the empty slot */
5712 object_wipe(&inventory[item]);
5713 p_ptr->update |= (PU_BONUS);
5715 /* Recalculate torch */
5716 p_ptr->update |= (PU_TORCH);
5718 /* Recalculate mana XXX */
5719 p_ptr->update |= (PU_MANA);
5721 p_ptr->window |= (PW_EQUIP);
5724 p_ptr->window |= (PW_SPELL);
5728 * @brief 床上の魔道具の残り残量メッセージを表示する /
5729 * Describe the charges on an item on the floor.
5730 * @param item メッセージの対象にしたいアイテム所持スロット
5733 void floor_item_charges(INVENTORY_IDX item)
5735 object_type *o_ptr = &o_list[item];
5737 /* Require staff/wand */
5738 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5740 /* Require known item */
5741 if (!object_is_known(o_ptr)) return;
5744 if (o_ptr->pval <= 0)
5746 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5750 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5753 /* Multiple charges */
5754 if (o_ptr->pval != 1)
5756 msg_format("There are %d charges remaining.", o_ptr->pval);
5762 msg_format("There is %d charge remaining.", o_ptr->pval);
5769 * @brief 床上のアイテムの残り数メッセージを表示する /
5770 * Describe the charges on an item on the floor.
5771 * @param item メッセージの対象にしたいアイテム所持スロット
5774 void floor_item_describe(INVENTORY_IDX item)
5776 object_type *o_ptr = &o_list[item];
5777 GAME_TEXT o_name[MAX_NLEN];
5779 object_desc(o_name, o_ptr, 0);
5782 /* "no more" の場合はこちらで表示を分ける */
5783 if (o_ptr->number <= 0)
5785 msg_format("床上には、もう%sはない。", o_name);
5789 msg_format("床上には、まだ %sがある。", o_name);
5792 msg_format("You see %s.", o_name);
5799 * @brief 床上のアイテムの数を増やす /
5800 * Increase the "number" of an item on the floor
5801 * @param item 増やしたいアイテムの所持スロット
5802 * @param num 増やしたいアイテムの数
5805 void floor_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
5807 object_type *o_ptr = &o_list[item];
5810 num += o_ptr->number;
5813 if (num > 255) num = 255;
5814 else if (num < 0) num = 0;
5817 num -= o_ptr->number;
5819 /* Change the number */
5820 o_ptr->number += num;
5825 * @brief 床上の数の無くなったアイテムスロットを消去する /
5826 * Optimize an item on the floor (destroy "empty" items)
5827 * @param item 消去したいアイテムの所持スロット
5830 void floor_item_optimize(INVENTORY_IDX item)
5832 object_type *o_ptr = &o_list[item];
5834 /* Paranoia -- be sure it exists */
5835 if (!o_ptr->k_idx) return;
5837 /* Only optimize empty items */
5838 if (o_ptr->number) return;
5840 delete_object_idx(item);
5845 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5846 * Check if we have space for an item in the pack without overflow
5847 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5848 * @return 溢れずに済むならTRUEを返す
5850 bool inven_carry_okay(object_type *o_ptr)
5855 if (inven_cnt < INVEN_PACK) return (TRUE);
5858 for (j = 0; j < INVEN_PACK; j++)
5860 object_type *j_ptr = &inventory[j];
5862 /* Skip non-objects */
5863 if (!j_ptr->k_idx) continue;
5865 /* Check if the two items can be combined */
5866 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5873 * @brief オブジェクトを定義された基準に従いソートするための関数 /
5874 * Check if we have space for an item in the pack without overflow
5875 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
5876 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
5877 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
5878 * @return o_ptrの方が上位ならばTRUEを返す。
5880 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5884 /* Use empty slots */
5885 if (!j_ptr->k_idx) return TRUE;
5887 /* Hack -- readable books always come first */
5888 if ((o_ptr->tval == REALM1_BOOK) &&
5889 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5890 if ((j_ptr->tval == REALM1_BOOK) &&
5891 (o_ptr->tval != REALM1_BOOK)) return FALSE;
5893 if ((o_ptr->tval == REALM2_BOOK) &&
5894 (j_ptr->tval != REALM2_BOOK)) return TRUE;
5895 if ((j_ptr->tval == REALM2_BOOK) &&
5896 (o_ptr->tval != REALM2_BOOK)) return FALSE;
5898 /* Objects sort by decreasing type */
5899 if (o_ptr->tval > j_ptr->tval) return TRUE;
5900 if (o_ptr->tval < j_ptr->tval) return FALSE;
5902 /* Non-aware (flavored) items always come last */
5903 /* Can happen in the home */
5904 if (!object_is_aware(o_ptr)) return FALSE;
5905 if (!object_is_aware(j_ptr)) return TRUE;
5907 /* Objects sort by increasing sval */
5908 if (o_ptr->sval < j_ptr->sval) return TRUE;
5909 if (o_ptr->sval > j_ptr->sval) return FALSE;
5911 /* Unidentified objects always come last */
5912 /* Objects in the home can be unknown */
5913 if (!object_is_known(o_ptr)) return FALSE;
5914 if (!object_is_known(j_ptr)) return TRUE;
5916 /* Fixed artifacts, random artifacts and ego items */
5917 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
5918 else if (o_ptr->art_name) o_type = 2;
5919 else if (object_is_ego(o_ptr)) o_type = 1;
5922 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
5923 else if (j_ptr->art_name) j_type = 2;
5924 else if (object_is_ego(j_ptr)) j_type = 1;
5927 if (o_type < j_type) return TRUE;
5928 if (o_type > j_type) return FALSE;
5930 switch (o_ptr->tval)
5936 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
5937 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
5943 /* Objects sort by increasing hit/damage bonuses */
5944 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
5945 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
5948 /* Hack: otherwise identical rods sort by
5949 increasing recharge time --dsb */
5951 if (o_ptr->pval < j_ptr->pval) return TRUE;
5952 if (o_ptr->pval > j_ptr->pval) return FALSE;
5956 /* Objects sort by decreasing value */
5957 return o_value > object_value(j_ptr);
5962 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
5963 * Add an item to the players inventory, and return the slot used.
5964 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
5965 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
5967 * If the new item can combine with an existing item in the inventory,\n
5968 * it will do so, using "object_similar()" and "object_absorb()", else,\n
5969 * the item will be placed into the "proper" location in the inventory.\n
5971 * This function can be used to "over-fill" the player's pack, but only\n
5972 * once, and such an action must trigger the "overflow" code immediately.\n
5973 * Note that when the pack is being "over-filled", the new item must be\n
5974 * placed into the "overflow" slot, and the "overflow" must take place\n
5975 * before the pack is reordered, but (optionally) after the pack is\n
5976 * combined. This may be tricky. See "dungeon.c" for info.\n
5978 * Note that this code must remove any location/stack information\n
5979 * from the object once it is placed into the inventory.\n
5981 s16b inven_carry(object_type *o_ptr)
5983 INVENTORY_IDX i, j, k;
5984 INVENTORY_IDX n = -1;
5989 /* Check for combining */
5990 for (j = 0; j < INVEN_PACK; j++)
5992 j_ptr = &inventory[j];
5994 /* Skip non-objects */
5995 if (!j_ptr->k_idx) continue;
5997 /* Hack -- track last item */
6000 /* Check if the two items can be combined */
6001 if (object_similar(j_ptr, o_ptr))
6003 object_absorb(j_ptr, o_ptr);
6005 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6006 p_ptr->update |= (PU_BONUS);
6007 p_ptr->window |= (PW_INVEN);
6016 if (inven_cnt > INVEN_PACK) return (-1);
6018 /* Find an empty slot */
6019 for (j = 0; j <= INVEN_PACK; j++)
6021 j_ptr = &inventory[j];
6023 /* Use it if found */
6024 if (!j_ptr->k_idx) break;
6031 /* Reorder the pack */
6034 /* Get the "value" of the item */
6035 s32b o_value = object_value(o_ptr);
6037 /* Scan every occupied slot */
6038 for (j = 0; j < INVEN_PACK; j++)
6040 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6047 for (k = n; k >= i; k--)
6049 /* Hack -- Slide the item */
6050 object_copy(&inventory[k+1], &inventory[k]);
6053 /* Wipe the empty slot */
6054 object_wipe(&inventory[i]);
6059 object_copy(&inventory[i], o_ptr);
6061 /* Access new object */
6062 j_ptr = &inventory[i];
6065 j_ptr->next_o_idx = 0;
6067 /* Forget monster */
6068 j_ptr->held_m_idx = 0;
6070 /* Forget location */
6071 j_ptr->iy = j_ptr->ix = 0;
6073 /* Player touches it, and no longer marked */
6074 j_ptr->marked = OM_TOUCHED;
6076 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6078 /* Count the items */
6080 p_ptr->update |= (PU_BONUS | PU_COMBINE | PU_REORDER);
6081 p_ptr->window |= (PW_INVEN);
6083 /* Return the slot */
6089 * @brief 装備スロットからオブジェクトを外すメインルーチン /
6090 * Take off (some of) a non-cursed equipment item
6091 * @param item オブジェクトを外したい所持テーブルのID
6093 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
6095 * Note that only one item at a time can be wielded per slot.\n
6096 * Note that taking off an item when "full" may cause that item\n
6097 * to fall to the ground.\n
6098 * Return the inventory slot into which the item is placed.\n
6100 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
6111 GAME_TEXT o_name[MAX_NLEN];
6114 /* Get the item to take off */
6115 o_ptr = &inventory[item];
6118 if (amt <= 0) return (-1);
6121 if (amt > o_ptr->number) amt = o_ptr->number;
6124 /* Obtain a local object */
6125 object_copy(q_ptr, o_ptr);
6127 /* Modify quantity */
6128 q_ptr->number = amt;
6130 object_desc(o_name, q_ptr, 0);
6132 /* Took off weapon */
6133 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
6134 object_is_melee_weapon(o_ptr))
6136 act = _("を装備からはずした", "You were wielding");
6140 else if (item == INVEN_BOW)
6142 act = _("を装備からはずした", "You were holding");
6145 /* Took off light */
6146 else if (item == INVEN_LITE)
6148 act = _("を光源からはずした", "You were holding");
6151 /* Took off something */
6154 act = _("を装備からはずした", "You were wearing");
6157 /* Modify, Optimize */
6158 inven_item_increase(item, -amt);
6159 inven_item_optimize(item);
6161 /* Carry the object */
6162 slot = inven_carry(q_ptr);
6165 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
6167 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6177 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
6178 * Drop (some of) a non-cursed inventory/equipment item
6179 * @param item 所持テーブルのID
6180 * @param amt 落としたい個数
6183 * The object will be dropped "near" the current location
6185 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
6191 GAME_TEXT o_name[MAX_NLEN];
6193 /* Access original object */
6194 o_ptr = &inventory[item];
6197 if (amt <= 0) return;
6200 if (amt > o_ptr->number) amt = o_ptr->number;
6202 /* Take off equipment */
6203 if (item >= INVEN_RARM)
6205 /* Take off first */
6206 item = inven_takeoff(item, amt);
6208 /* Access original object */
6209 o_ptr = &inventory[item];
6214 /* Obtain local object */
6215 object_copy(q_ptr, o_ptr);
6217 /* Distribute charges of wands or rods */
6218 distribute_charges(o_ptr, q_ptr, amt);
6220 /* Modify quantity */
6221 q_ptr->number = amt;
6223 /* Describe local object */
6224 object_desc(o_name, q_ptr, 0);
6226 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
6228 /* Drop it near the player */
6229 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
6231 /* Modify, Describe, Optimize */
6232 inven_item_increase(item, -amt);
6233 inven_item_describe(item);
6234 inven_item_optimize(item);
6239 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
6240 * Combine items in the pack
6243 * Note special handling of the "overflow" slot
6245 void combine_pack(void)
6250 bool flag = FALSE, combined;
6256 /* Combine the pack (backwards) */
6257 for (i = INVEN_PACK; i > 0; i--)
6259 o_ptr = &inventory[i];
6261 /* Skip empty items */
6262 if (!o_ptr->k_idx) continue;
6264 /* Scan the items above that item */
6265 for (j = 0; j < i; j++)
6269 j_ptr = &inventory[j];
6271 /* Skip empty items */
6272 if (!j_ptr->k_idx) continue;
6275 * Get maximum number of the stack if these
6276 * are similar, get zero otherwise.
6278 max_num = object_similar_part(j_ptr, o_ptr);
6280 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6281 if (max_num && j_ptr->number < max_num)
6283 if (o_ptr->number + j_ptr->number <= max_num)
6288 /* Add together the item counts */
6289 object_absorb(j_ptr, o_ptr);
6291 /* One object is gone */
6294 /* Slide everything down */
6295 for (k = i; k < INVEN_PACK; k++)
6297 /* Structure copy */
6298 inventory[k] = inventory[k+1];
6301 /* Erase the "final" slot */
6302 object_wipe(&inventory[k]);
6306 int old_num = o_ptr->number;
6307 int remain = j_ptr->number + o_ptr->number - max_num;
6309 o_ptr->number -= remain;
6311 /* Add together the item counts */
6312 object_absorb(j_ptr, o_ptr);
6314 o_ptr->number = remain;
6316 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6317 if (o_ptr->tval == TV_ROD)
6319 o_ptr->pval = o_ptr->pval * remain / old_num;
6320 o_ptr->timeout = o_ptr->timeout * remain / old_num;
6323 /* Hack -- if wands are stacking, combine the charges. -LM- */
6324 if (o_ptr->tval == TV_WAND)
6326 o_ptr->pval = o_ptr->pval * remain / old_num;
6330 p_ptr->window |= (PW_INVEN);
6342 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6346 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6347 * Reorder items in the pack
6350 * Note special handling of the "overflow" slot
6352 void reorder_pack(void)
6362 /* Re-order the pack (forwards) */
6363 for (i = 0; i < INVEN_PACK; i++)
6365 /* Mega-Hack -- allow "proper" over-flow */
6366 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6368 o_ptr = &inventory[i];
6370 /* Skip empty slots */
6371 if (!o_ptr->k_idx) continue;
6373 /* Get the "value" of the item */
6374 o_value = object_value(o_ptr);
6376 /* Scan every occupied slot */
6377 for (j = 0; j < INVEN_PACK; j++)
6379 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6382 /* Never move down */
6383 if (j >= i) continue;
6389 /* Save a copy of the moving item */
6390 object_copy(q_ptr, &inventory[i]);
6392 /* Slide the objects */
6393 for (k = i; k > j; k--)
6395 /* Slide the item */
6396 object_copy(&inventory[k], &inventory[k-1]);
6399 /* Insert the moving item */
6400 object_copy(&inventory[j], q_ptr);
6402 p_ptr->window |= (PW_INVEN);
6405 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6409 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6410 * Hack -- display an object kind in the current window
6411 * @param k_idx ベースアイテムの参照ID
6414 * Include list of usable spells for readible books
6416 void display_koff(KIND_OBJECT_IDX k_idx)
6423 REALM_IDX use_realm;
6425 GAME_TEXT o_name[MAX_NLEN];
6428 /* Erase the window */
6429 for (y = 0; y < Term->hgt; y++)
6431 /* Erase the line */
6432 Term_erase(0, y, 255);
6439 /* Prepare the object */
6440 object_prep(q_ptr, k_idx);
6441 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6443 /* Mention the object name */
6444 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6446 /* Access the item's sval */
6448 use_realm = tval2realm(q_ptr->tval);
6450 /* Warriors are illiterate */
6451 if (p_ptr->realm1 || p_ptr->realm2)
6453 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6457 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6458 if (!is_magic(use_realm)) return;
6459 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6462 /* Display spells in readible books */
6466 SPELL_IDX spells[64];
6468 /* Extract spells */
6469 for (spell = 0; spell < 32; spell++)
6471 /* Check for this spell */
6472 if (fake_spell_flags[sval] & (1L << spell))
6474 /* Collect this spell */
6475 spells[num++] = spell;
6480 print_spells(0, spells, num, 2, 0, use_realm);
6485 * @brief 警告を放つアイテムを選択する /
6486 * Choose one of items that have warning flag
6487 * Calculate spell damages
6490 object_type *choose_warning_item(void)
6493 int choices[INVEN_TOTAL - INVEN_RARM];
6496 /* Paranoia -- Player has no warning ability */
6497 if (!p_ptr->warning) return NULL;
6499 /* Search Inventory */
6500 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6502 BIT_FLAGS flgs[TR_FLAG_SIZE];
6503 object_type *o_ptr = &inventory[i];
6505 object_flags(o_ptr, flgs);
6506 if (have_flag(flgs, TR_WARNING))
6508 choices[number] = i;
6513 /* Choice one of them */
6514 return number ? &inventory[choices[randint0(number)]] : NULL;
6518 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6519 * Calculate spell damages
6520 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6521 * @param typ 効果属性のID
6523 * @param max 算出した最大ダメージを返すポインタ
6526 static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
6528 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6529 int rlev = r_ptr->level;
6530 bool ignore_wraith_form = FALSE;
6532 /* Vulnerability, resistance and immunity */
6536 if (p_ptr->immune_elec)
6539 ignore_wraith_form = TRUE;
6543 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6544 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6545 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6546 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6547 if (IS_OPPOSE_ELEC())
6548 dam = (dam + 2) / 3;
6553 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6554 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6558 if (p_ptr->immune_acid)
6561 ignore_wraith_form = TRUE;
6565 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6566 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6567 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6568 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6574 if (p_ptr->immune_cold)
6577 ignore_wraith_form = TRUE;
6581 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6582 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6583 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6584 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6589 if (p_ptr->immune_fire)
6592 ignore_wraith_form = TRUE;
6596 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6597 if (prace_is_(RACE_ENT)) dam += dam / 3;
6598 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6599 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6600 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6605 ignore_wraith_form = TRUE;
6609 if (!p_ptr->blind &&
6610 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6611 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6614 ignore_wraith_form = TRUE;
6619 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6620 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6621 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6624 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6625 * "dam *= 2;" for later "dam /= 2"
6627 if (p_ptr->wraith_form) dam *= 2;
6631 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6634 ignore_wraith_form = TRUE;
6636 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6640 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6644 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6648 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6652 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6656 if (prace_is_(RACE_SPECTRE))
6659 ignore_wraith_form = TRUE;
6661 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6665 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6669 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6673 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6677 if (p_ptr->levitation) dam = (dam * 2) / 3;
6681 if (p_ptr->resist_shard) dam /= 2;
6685 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6686 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6690 if (p_ptr->mimic_form)
6692 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6695 ignore_wraith_form = TRUE;
6700 switch (p_ptr->prace)
6709 ignore_wraith_form = TRUE;
6716 if (p_ptr->align > 10) dam /= 2;
6717 else if (p_ptr->align < -10) dam *= 2;
6721 if (p_ptr->align > 10) dam *= 2;
6725 case GF_BRAIN_SMASH:
6726 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6729 ignore_wraith_form = TRUE;
6737 if (100 + rlev / 2 <= p_ptr->skill_sav)
6740 ignore_wraith_form = TRUE;
6745 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6748 ignore_wraith_form = TRUE;
6753 if (p_ptr->wraith_form && !ignore_wraith_form)
6759 if (dam > *max) *max = dam;
6763 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6764 * Calculate spell damages
6765 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6766 * @param typ 効果属性のID
6767 * @param m_idx 魔法を行使するモンスターのID
6768 * @param max 算出した最大ダメージを返すポインタ
6771 void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
6773 monster_type *m_ptr = &m_list[m_idx];
6774 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6775 spell_damcalc(m_ptr, typ, dam, max);
6779 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6780 * Calculate blow damages
6781 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6782 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6783 * @return 算出された最大ダメージを返す。
6785 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6787 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6789 bool check_wraith_form = TRUE;
6791 if (blow_ptr->method != RBM_EXPLODE)
6793 ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
6795 switch (blow_ptr->effect)
6799 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6800 dam = MAX(dam, tmp_dam * 2);
6806 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6810 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6812 check_wraith_form = FALSE;
6816 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6818 check_wraith_form = FALSE;
6822 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6824 check_wraith_form = FALSE;
6828 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6830 check_wraith_form = FALSE;
6835 check_wraith_form = FALSE;
6839 if (check_wraith_form && p_ptr->wraith_form)
6847 dam = (dam + 1) / 2;
6848 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
6856 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
6857 * Examine the grid (xx,yy) and warn the player if there are any danger
6858 * @param xx 危険性を調査するマスのX座標
6859 * @param yy 危険性を調査するマスのY座標
6860 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
6862 bool process_warning(POSITION xx, POSITION yy)
6866 GAME_TEXT o_name[MAX_NLEN];
6868 #define WARNING_AWARE_RANGE 12
6870 static int old_damage = 0;
6872 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
6874 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
6877 monster_type *m_ptr;
6878 monster_race *r_ptr;
6880 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
6882 c_ptr = &cave[my][mx];
6884 if (!c_ptr->m_idx) continue;
6886 m_ptr = &m_list[c_ptr->m_idx];
6888 if (MON_CSLEEP(m_ptr)) continue;
6889 if (!is_hostile(m_ptr)) continue;
6891 r_ptr = &r_info[m_ptr->r_idx];
6893 /* Monster spells (only powerful ones)*/
6894 if (projectable(my, mx, yy, xx))
6896 BIT_FLAGS f4 = r_ptr->flags4;
6897 BIT_FLAGS f5 = r_ptr->a_ability_flags1;
6898 BIT_FLAGS f6 = r_ptr->a_ability_flags2;
6900 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
6902 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
6903 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
6904 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
6905 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, c_ptr->m_idx, &dam_max0);
6906 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, c_ptr->m_idx, &dam_max0);
6907 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, c_ptr->m_idx, &dam_max0);
6909 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, c_ptr->m_idx, &dam_max0);
6910 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, c_ptr->m_idx, &dam_max0);
6911 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, c_ptr->m_idx, &dam_max0);
6912 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, c_ptr->m_idx, &dam_max0);
6913 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, c_ptr->m_idx, &dam_max0);
6914 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, c_ptr->m_idx, &dam_max0);
6915 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, c_ptr->m_idx, &dam_max0);
6916 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, c_ptr->m_idx, &dam_max0);
6917 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, c_ptr->m_idx, &dam_max0);
6918 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, c_ptr->m_idx, &dam_max0);
6919 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, c_ptr->m_idx, &dam_max0);
6920 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, c_ptr->m_idx, &dam_max0);
6921 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, c_ptr->m_idx, &dam_max0);
6922 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, c_ptr->m_idx, &dam_max0);
6923 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, c_ptr->m_idx, &dam_max0);
6924 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, c_ptr->m_idx, &dam_max0);
6925 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, c_ptr->m_idx, &dam_max0);
6926 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, c_ptr->m_idx, &dam_max0);
6927 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, c_ptr->m_idx, &dam_max0);
6928 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, c_ptr->m_idx, &dam_max0);
6929 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, c_ptr->m_idx, &dam_max0);
6930 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, c_ptr->m_idx, &dam_max0);
6931 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, c_ptr->m_idx, &dam_max0);
6934 /* Monster melee attacks */
6935 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
6937 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
6941 for (m = 0; m < 4; m++)
6943 /* Skip non-attacks */
6944 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
6946 /* Extract the attack info */
6947 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
6948 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
6950 if (dam_melee > dam_max0) dam_max0 = dam_melee;
6954 /* Contribution from this monster */
6955 dam_max += dam_max0;
6959 /* Prevent excessive warning */
6960 if (dam_max > old_damage)
6962 old_damage = dam_max * 3 / 2;
6964 if (dam_max > p_ptr->chp / 2)
6966 object_type *o_ptr = choose_warning_item();
6969 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6971 strcpy(o_name, _("体", "body")); /* Warning ability without item */
6972 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
6974 disturb(FALSE, TRUE);
6975 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
6978 else old_damage = old_damage / 2;
6980 c_ptr = &cave[yy][xx];
6981 if (((!easy_disarm && is_trap(c_ptr->feat))
6982 || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
6984 object_type *o_ptr = choose_warning_item();
6987 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6989 strcpy(o_name, _("体", "body")); /* Warning ability without item */
6990 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
6991 disturb(FALSE, TRUE);
6992 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
6999 * エッセンス情報の構造体 / A structure for smithing
7002 int add; /* TR flag number or special essence id */
7003 concptr add_name; /* Name of this ability */
7004 ESSENCE_IDX type; /* Menu number */
7005 int essence; /* Index for carrying essences */
7006 int value; /* Needed value to add this ability */
7011 * エッセンス情報テーブル Smithing type data for Weapon smith
7014 static essence_type essence_info[] =
7016 {TR_STR, "腕力", 4, TR_STR, 20},
7017 {TR_INT, "知能", 4, TR_INT, 20},
7018 {TR_WIS, "賢さ", 4, TR_WIS, 20},
7019 {TR_DEX, "器用さ", 4, TR_DEX, 20},
7020 {TR_CON, "耐久力", 4, TR_CON, 20},
7021 {TR_CHR, "魅力", 4, TR_CHR, 20},
7022 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
7023 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
7024 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
7025 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
7026 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
7027 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
7028 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
7029 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
7030 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
7031 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
7032 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
7033 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
7034 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
7035 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
7036 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
7037 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
7038 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
7039 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
7040 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
7041 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
7042 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
7043 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
7044 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
7045 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
7046 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
7047 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
7048 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
7049 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
7050 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
7051 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
7052 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
7053 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
7054 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
7055 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
7056 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
7057 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
7058 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
7059 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
7060 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
7061 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
7062 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
7063 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
7064 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
7065 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
7066 {TR_SH_FIRE, "", 0, -2, 0},
7067 {TR_SH_ELEC, "", 0, -2, 0},
7068 {TR_SH_COLD, "", 0, -2, 0},
7069 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
7070 {TR_WARNING, "警告", 3, TR_WARNING, 20},
7071 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
7072 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
7073 {TR_LITE_2, "", 0, -2, 0},
7074 {TR_LITE_3, "", 0, -2, 0},
7075 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
7076 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
7077 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
7078 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
7079 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
7081 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
7082 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
7083 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
7084 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
7085 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
7086 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
7087 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
7088 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
7089 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
7090 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
7091 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
7092 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
7093 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
7094 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
7095 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
7096 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
7097 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
7098 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
7100 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
7101 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
7102 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
7103 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
7104 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
7105 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
7106 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
7107 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
7109 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
7110 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
7111 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
7112 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
7113 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
7114 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
7115 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
7116 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
7117 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
7118 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
7119 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
7120 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
7122 {-1, NULL, 0, -1, 0}
7125 static essence_type essence_info[] =
7127 {TR_STR, "strength", 4, TR_STR, 20},
7128 {TR_INT, "intelligence", 4, TR_INT, 20},
7129 {TR_WIS, "wisdom", 4, TR_WIS, 20},
7130 {TR_DEX, "dexterity", 4, TR_DEX, 20},
7131 {TR_CON, "constitution", 4, TR_CON, 20},
7132 {TR_CHR, "charisma", 4, TR_CHR, 20},
7133 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
7134 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
7135 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
7136 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
7137 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
7138 {TR_SPEED, "speed", 4, TR_SPEED, 12},
7139 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
7140 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
7141 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
7142 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
7143 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
7144 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
7145 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
7146 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
7147 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
7148 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
7149 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
7150 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
7151 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
7152 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
7153 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
7154 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
7155 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
7156 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
7157 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
7158 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
7159 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
7160 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
7161 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
7162 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
7163 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
7164 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
7165 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
7166 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
7167 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
7168 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
7169 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
7170 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
7171 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
7172 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
7173 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
7174 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
7175 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
7176 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
7177 {TR_SH_FIRE, "", 0, -2, 0},
7178 {TR_SH_ELEC, "", 0, -2, 0},
7179 {TR_SH_COLD, "", 0, -2, 0},
7180 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
7181 {TR_WARNING, "warning", 3, TR_WARNING, 20},
7182 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
7183 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
7184 {TR_LITE_2, "", 0, -2, 0},
7185 {TR_LITE_3, "", 0, -2, 0},
7186 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7187 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7188 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7189 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7190 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7192 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7193 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7194 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7195 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7196 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7197 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7198 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7199 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7200 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7201 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7202 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7203 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7204 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7205 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
7206 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7207 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7208 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7209 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7211 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7212 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
7213 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
7214 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
7215 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
7216 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
7217 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7218 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7220 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7221 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7222 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7223 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7224 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7225 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7226 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7227 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7228 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7229 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7230 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7231 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7233 {-1, NULL, 0, -1, 0}
7239 * エッセンス名テーブル / Essense names for Weapon smith
7242 concptr essence_name[] =
7345 concptr essence_name[] =
7448 * @brief 所持しているエッセンス一覧を表示する
7451 static void display_essence(void)
7456 for (i = 1; i < 22; i++)
7460 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7461 "Essence Num Essence Num Essence Num "), 1, 8);
7462 for (i = 0; essence_name[i]; i++)
7464 if (!essence_name[i][0]) continue;
7465 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7468 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7478 static void drain_essence(void)
7480 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7484 bool observe = FALSE;
7485 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7486 TIME_EFFECT old_timeout;
7487 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7493 OBJECT_IDX next_o_idx;
7496 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7499 item_tester_hook = object_is_weapon_armour_ammo;
7501 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7502 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7504 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT));
7507 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7509 GAME_TEXT o_name[MAX_NLEN];
7510 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7511 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7514 p_ptr->energy_use = 100;
7516 object_flags(o_ptr, old_flgs);
7517 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7518 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7519 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7520 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7521 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7522 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7523 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7524 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7525 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7527 old_to_a = o_ptr->to_a;
7529 old_to_h = o_ptr->to_h;
7530 old_to_d = o_ptr->to_d;
7533 old_pval = o_ptr->pval;
7534 old_name2 = o_ptr->name2;
7535 old_timeout = o_ptr->timeout;
7536 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7537 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7538 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7539 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7540 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7541 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7542 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7543 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7544 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7545 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7546 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7547 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7548 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7549 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7550 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7551 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7552 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7553 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7554 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7558 next_o_idx = o_ptr->next_o_idx;
7559 marked = o_ptr->marked;
7560 weight = o_ptr->weight;
7561 number = o_ptr->number;
7563 object_prep(o_ptr, o_ptr->k_idx);
7567 o_ptr->next_o_idx=next_o_idx;
7568 o_ptr->marked=marked;
7569 o_ptr->number = number;
7570 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7571 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7572 o_ptr->ident |= (IDENT_MENTAL);
7573 object_aware(o_ptr);
7574 object_known(o_ptr);
7576 object_flags(o_ptr, new_flgs);
7578 for (i = 0; essence_info[i].add_name; i++)
7580 essence_type *es_ptr = &essence_info[i];
7581 PARAMETER_VALUE pval = 0;
7583 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7584 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7586 if (es_ptr->add < TR_FLAG_MAX &&
7587 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7588 have_flag(old_flgs, es_ptr->add))
7592 drain_value[es_ptr->essence] += 10 * pval;
7594 else if (es_ptr->essence != -2)
7596 drain_value[es_ptr->essence] += 10;
7598 else if (es_ptr->add == TR_SH_FIRE)
7600 drain_value[TR_BRAND_FIRE] += 10;
7601 drain_value[TR_RES_FIRE] += 10;
7603 else if (es_ptr->add == TR_SH_ELEC)
7605 drain_value[TR_BRAND_ELEC] += 10;
7606 drain_value[TR_RES_ELEC] += 10;
7608 else if (es_ptr->add == TR_SH_COLD)
7610 drain_value[TR_BRAND_COLD] += 10;
7611 drain_value[TR_RES_COLD] += 10;
7613 else if (es_ptr->add == TR_LITE_2)
7615 drain_value[TR_LITE_1] += 20;
7617 else if (es_ptr->add == TR_LITE_3)
7619 drain_value[TR_LITE_1] += 30;
7624 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7626 drain_value[TR_INT] += 5;
7627 drain_value[TR_WIS] += 5;
7629 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7631 drain_value[TR_BRAND_POIS] += 5;
7632 drain_value[TR_BRAND_ACID] += 5;
7633 drain_value[TR_BRAND_ELEC] += 5;
7634 drain_value[TR_BRAND_FIRE] += 5;
7635 drain_value[TR_BRAND_COLD] += 5;
7637 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7639 drain_value[TR_INT] += 10;
7641 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7643 drain_value[TR_STR] += 10;
7645 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7647 drain_value[TR_DEX] += 10;
7649 if (old_name2 == EGO_2WEAPON)
7651 drain_value[TR_DEX] += 20;
7653 if (object_is_weapon_ammo(o_ptr))
7655 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7657 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7659 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7660 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7661 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7662 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7664 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7666 drain_value[i] *= number;
7667 drain_value[i] = drain_value[i] * dec / 4;
7668 drain_value[i] = MAX(drain_value[i], 0);
7669 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7677 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7681 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7683 for (i = 0; essence_name[i]; i++)
7685 if (!essence_name[i][0]) continue;
7686 if (!drain_value[i]) continue;
7688 p_ptr->magic_num1[i] += drain_value[i];
7689 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7691 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7695 /* Apply autodestroy/inscription to the drained item */
7696 autopick_alter_item(item, TRUE);
7698 /* Combine the pack */
7699 p_ptr->update |= (PU_COMBINE | PU_REORDER);
7701 p_ptr->window |= (PW_INVEN);
7705 * @brief 付加するエッセンスの大別を選択する
7706 * @return 選んだエッセンスの大別ID
7708 static COMMAND_CODE choose_essence(void)
7710 COMMAND_CODE mode = 0;
7712 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7715 concptr menu_name[] = {
7725 concptr menu_name[] = {
7735 const COMMAND_CODE mode_max = 7;
7737 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7747 for (i = 0; i < mode_max; i++)
7749 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7750 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7752 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7753 prt("Choose from menu.", 0, 0);
7772 menu_line += mode_max - 1;
7781 if (menu_line > mode_max) menu_line -= mode_max;
7792 for (i = 0; i < mode_max; i++)
7793 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7795 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7801 if (isupper(choice)) choice = (char)tolower(choice);
7803 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7804 mode = (int)choice - 'a' + 1;
7814 * @brief エッセンスを実際に付加する
7815 * @param mode エッセンスの大別ID
7818 static void add_essence(ESSENCE_IDX mode)
7830 GAME_TEXT o_name[MAX_NLEN];
7832 essence_type *es_ptr;
7833 bool able[22] = { 0 };
7835 int menu_line = (use_menu ? 1 : 0);
7837 for (i = 0; essence_info[i].add_name; i++)
7839 es_ptr = &essence_info[i];
7841 if (es_ptr->type != mode) continue;
7845 if (!repeat_pull(&i) || i<0 || i>=max_num)
7848 /* Nothing chosen yet */
7854 /* Build a prompt */
7855 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
7856 if (use_menu) screen_save();
7858 /* Get a spell from the user */
7860 choice = (always_show_list || use_menu) ? ESCAPE:1;
7863 if( choice==ESCAPE ) choice = ' ';
7864 else if( !get_com(out_val, &choice, FALSE) )break;
7866 if (use_menu && choice != ' ')
7880 menu_line += (max_num-1);
7903 menu_line = max_num;
7917 if (menu_line > max_num) menu_line -= max_num;
7919 /* Request redraw */
7920 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
7923 if (!redraw || use_menu)
7927 char dummy[80], dummy2[80];
7934 if (!use_menu) screen_save();
7936 for (y = 1; y < 24; y++)
7939 /* Print header(s) */
7941 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
7944 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
7947 for (ctr = 0; ctr < max_num; ctr++)
7949 es_ptr = &essence_info[num[ctr]];
7953 if (ctr == (menu_line-1))
7954 strcpy(dummy, _("》 ", "> "));
7955 else strcpy(dummy, " ");
7958 /* letter/number for power selection */
7961 sprintf(dummy, "%c) ",I2A(ctr));
7964 strcat(dummy, es_ptr->add_name);
7969 if (es_ptr->essence != -1)
7971 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
7972 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
7978 case ESSENCE_SH_FIRE:
7979 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
7980 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
7981 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7983 case ESSENCE_SH_ELEC:
7984 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
7985 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
7986 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7988 case ESSENCE_SH_COLD:
7989 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
7990 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
7991 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7993 case ESSENCE_RESISTANCE:
7994 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
7995 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7996 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7997 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7998 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8000 case ESSENCE_SUSTAIN:
8001 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
8002 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8003 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8004 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8005 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8010 if (!able[ctr]) col = TERM_RED;
8012 if (es_ptr->essence != -1)
8014 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
8018 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
8021 c_prt(col, dummy2, ctr+2, x);
8040 ask = (isupper(choice));
8043 if (ask) choice = (char)tolower(choice);
8045 /* Extract request */
8046 i = (islower(choice) ? A2I(choice) : -1);
8049 /* Totally Illegal */
8050 if ((i < 0) || (i >= max_num) || !able[i])
8062 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
8064 /* Belay that order */
8065 if (!get_check(tmp_val)) continue;
8071 if (redraw) screen_load();
8077 es_ptr = &essence_info[num[i]];
8079 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8080 item_tester_tval = TV_GLOVES;
8081 else if (mode == 1 || mode == 5)
8082 item_tester_hook = item_tester_hook_melee_ammo;
8083 else if (es_ptr->add == ESSENCE_ATTACK)
8084 item_tester_hook = object_allow_enchant_weapon;
8085 else if (es_ptr->add == ESSENCE_AC)
8086 item_tester_hook = object_is_armour;
8088 item_tester_hook = object_is_weapon_armour_ammo;
8090 q = _("どのアイテムを改良しますか?", "Improve which item? ");
8091 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
8093 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT));
8096 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
8098 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
8102 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8104 use_essence = es_ptr->value;
8105 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
8106 if (o_ptr->number > 1)
8108 use_essence *= o_ptr->number;
8109 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
8112 if (es_ptr->essence != -1)
8114 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8116 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8119 if (is_pval_flag(es_ptr->add))
8121 if (o_ptr->pval < 0)
8123 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
8126 else if (es_ptr->add == TR_BLOWS)
8128 if (o_ptr->pval > 1)
8130 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
8134 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8136 else if (o_ptr->pval > 0)
8138 use_essence *= o_ptr->pval;
8139 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8145 PARAMETER_VALUE pval;
8146 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8148 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
8149 strcpy(tmp_val, "1");
8151 if (!get_string(tmp, tmp_val, 1)) return;
8152 pval = (PARAMETER_VALUE)atoi(tmp_val);
8153 if (pval > limit) pval = limit;
8154 else if (pval < 1) pval = 1;
8155 o_ptr->pval += pval;
8156 use_essence *= pval;
8157 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8160 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8162 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8166 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8173 strcpy(tmp_val, "1");
8174 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
8175 val = atoi(tmp_val);
8176 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8177 else if (val < 1) val = 1;
8179 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
8180 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8182 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8185 get_to_h = ((val+1)/2+randint0(val/2+1));
8186 get_to_d = ((val+1)/2+randint0(val/2+1));
8187 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8188 o_ptr->to_h += get_to_h;
8189 o_ptr->to_d += get_to_d;
8191 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8192 if (es_ptr->add == ESSENCE_ATTACK)
8194 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8196 msg_print(_("改良に失敗した。", "You failed to enchant."));
8197 p_ptr->energy_use = 100;
8202 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8203 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8206 else if (es_ptr->add == ESSENCE_AC)
8208 if (o_ptr->to_a >= p_ptr->lev/5+5)
8210 msg_print(_("改良に失敗した。", "You failed to enchant."));
8211 p_ptr->energy_use = 100;
8216 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8221 o_ptr->xtra3 = es_ptr->add + 1;
8226 bool success = TRUE;
8230 case ESSENCE_SH_FIRE:
8231 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8236 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8237 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8239 case ESSENCE_SH_ELEC:
8240 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8245 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8246 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8248 case ESSENCE_SH_COLD:
8249 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8254 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8255 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8257 case ESSENCE_RESISTANCE:
8258 case ESSENCE_SUSTAIN:
8259 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))
8264 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8265 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8266 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8267 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8272 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
8275 if (es_ptr->add == ESSENCE_SUSTAIN)
8277 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8278 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8279 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8280 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8284 o_ptr->xtra3 = es_ptr->add + 1;
8288 p_ptr->energy_use = 100;
8291 msg_format("%sに%sの能力を付加しました。", o_name, es_ptr->add_name);
8293 msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8296 /* Combine the pack */
8297 p_ptr->update |= (PU_COMBINE | PU_REORDER);
8299 p_ptr->window |= (PW_INVEN);
8306 static void erase_essence(void)
8311 GAME_TEXT o_name[MAX_NLEN];
8312 BIT_FLAGS flgs[TR_FLAG_SIZE];
8314 item_tester_hook = object_is_smith;
8316 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
8317 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
8319 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
8322 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8323 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
8325 p_ptr->energy_use = 100;
8327 if (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE)
8329 o_ptr->to_h -= (o_ptr->xtra4>>8);
8330 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8332 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8333 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8336 object_flags(o_ptr, flgs);
8337 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8338 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8340 /* Combine the pack */
8341 p_ptr->update |= (PU_COMBINE | PU_REORDER);
8343 p_ptr->window |= (PW_INVEN);
8347 * @brief 鍛冶コマンドのメインルーチン
8348 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8351 void do_cmd_kaji(bool only_browse)
8353 COMMAND_CODE mode = 0;
8356 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8360 if (p_ptr->confused)
8362 msg_print(_("混乱していて作業できない!", "You are too confused!"));
8367 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8372 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8377 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8379 if (only_browse) screen_save();
8381 if (!only_browse) screen_save();
8387 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8388 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8389 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8390 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8391 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8392 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8394 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8395 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8396 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8397 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8398 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8399 prt(format("Choose command from menu."), 0, 0);
8426 if (menu_line > 5) menu_line -= 5;
8434 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
8435 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
8436 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
8437 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
8438 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
8440 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8442 if (!get_com("Command :", &choice, TRUE))
8479 /* Clear lines, position cursor (really should use strlen here) */
8480 Term_erase(14, 21, 255);
8481 Term_erase(14, 20, 255);
8482 Term_erase(14, 19, 255);
8483 Term_erase(14, 18, 255);
8484 Term_erase(14, 17, 255);
8485 Term_erase(14, 16, 255);
8487 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8488 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8490 prt(&temp[j], line, 15);
8495 if (!only_browse) screen_load();
8496 } while (only_browse);
8501 case 1: display_essence();break;
8502 case 2: drain_essence();break;
8503 case 3: erase_essence();break;
8505 mode = choose_essence();
8510 case 5: add_essence(10);break;
8516 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8517 * Torches have special abilities when they are flaming.
8518 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8519 * @param flgs 特別に追加するフラグを返す参照ポインタ
8522 void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
8524 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8526 if (o_ptr->xtra4 > 0)
8528 add_flag(flgs, TR_BRAND_FIRE);
8529 add_flag(flgs, TR_KILL_UNDEAD);
8530 add_flag(flgs, TR_THROW);
8536 * @brief 投擲時たいまつにダイスを与える。
8537 * Torches have special abilities when they are flaming.
8538 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8539 * @param dd 特別なダイス数を返す参照ポインタ
8540 * @param ds 特別なダイス面数を返す参照ポインタ
8543 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
8545 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8547 if (o_ptr->xtra4 > 0)
8556 * @brief 投擲時命中したたいまつの寿命を縮める。
8557 * Torches have special abilities when they are flaming.
8558 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8561 void torch_lost_fuel(object_type *o_ptr)
8563 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8565 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8566 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;