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 #include "player-status.h"
20 #include "player-move.h"
22 static void one_sustain(object_type *o_ptr);
25 static concptr const kaji_tips[5] =
28 "現在持っているエッセンスの一覧を表示する。",
29 "アイテムからエッセンスを取り出す。エッセンスを取られたアイテムは全く魔法がかかっていない初期状態に戻る。",
30 "既にエッセンスが付加されたアイテムからエッセンスのみ消し去る。エッセンスは手に入らない。",
31 "アイテムにエッセンスを付加する。既にエッセンスが付加されたアイテムやアーティファクトには付加できない。",
32 "武器や防具を強化したり、攻撃で傷つかないようにしたりする。エッセンスが付加されたアイテムやアーティファクトに対しても使用できる。",
34 "Display essences you have.",
35 "Extract essences from an item. The item become non magical.",
36 "Remove added essences from an equipment which was improved before. The removed essence will be ruined.",
37 "Add essences to an item. The improved items or artifacts cannot be reimprove.",
38 "Enchant an equipment or make an equiment element-proofed. The improved items and artifacts can be enchanted too.",
43 * @brief 対象のオブジェクトにランダムな能力維持を一つ付加する。/ Choose one random sustain
45 * @param o_ptr 対象のオブジェクト構造体ポインタ
48 static void one_sustain(object_type *o_ptr)
50 switch (randint0(A_MAX))
52 case 0: add_flag(o_ptr->art_flags, TR_SUST_STR); break;
53 case 1: add_flag(o_ptr->art_flags, TR_SUST_INT); break;
54 case 2: add_flag(o_ptr->art_flags, TR_SUST_WIS); break;
55 case 3: add_flag(o_ptr->art_flags, TR_SUST_DEX); break;
56 case 4: add_flag(o_ptr->art_flags, TR_SUST_CON); break;
57 case 5: add_flag(o_ptr->art_flags, TR_SUST_CHR); break;
62 * @brief 床上、モンスター所持でスタックされたアイテムを削除しスタックを補完する / Excise a dungeon object from any stacks
63 * @param o_idx 削除対象のオブジェクト構造体ポインタ
66 void excise_object_idx(OBJECT_IDX o_idx)
70 OBJECT_IDX this_o_idx, next_o_idx = 0;
71 OBJECT_IDX prev_o_idx = 0;
74 j_ptr = ¤t_floor_ptr->o_list[o_idx];
76 if (j_ptr->held_m_idx)
79 m_ptr = ¤t_floor_ptr->m_list[j_ptr->held_m_idx];
81 /* Scan all objects in the grid */
82 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
85 o_ptr = ¤t_floor_ptr->o_list[this_o_idx];
86 next_o_idx = o_ptr->next_o_idx;
88 if (this_o_idx == o_idx)
93 /* Remove from list */
94 m_ptr->hold_o_idx = next_o_idx;
102 /* Previous object */
103 k_ptr = ¤t_floor_ptr->o_list[prev_o_idx];
105 /* Remove from list */
106 k_ptr->next_o_idx = next_o_idx;
109 /* Forget next pointer */
110 o_ptr->next_o_idx = 0;
115 /* Save prev_o_idx */
116 prev_o_idx = this_o_idx;
125 POSITION y = j_ptr->iy;
126 POSITION x = j_ptr->ix;
128 g_ptr = ¤t_floor_ptr->grid_array[y][x];
130 /* Scan all objects in the grid */
131 for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
134 o_ptr = ¤t_floor_ptr->o_list[this_o_idx];
135 next_o_idx = o_ptr->next_o_idx;
137 if (this_o_idx == o_idx)
142 /* Remove from list */
143 g_ptr->o_idx = next_o_idx;
151 /* Previous object */
152 k_ptr = ¤t_floor_ptr->o_list[prev_o_idx];
154 /* Remove from list */
155 k_ptr->next_o_idx = next_o_idx;
158 /* Forget next pointer */
159 o_ptr->next_o_idx = 0;
164 /* Save prev_o_idx */
165 prev_o_idx = this_o_idx;
171 * @brief オブジェクトを削除する /
172 * Delete a dungeon object
173 * @param o_idx 削除対象のオブジェクト構造体ポインタ
176 * Handle "stacks" of objects correctly.
178 void delete_object_idx(OBJECT_IDX o_idx)
183 excise_object_idx(o_idx);
186 j_ptr = ¤t_floor_ptr->o_list[o_idx];
189 if (!(j_ptr->held_m_idx))
207 * @brief フロアにマスに落ちているオブジェクトを全て削除する / Deletes all objects at given location
208 * Delete a dungeon object
209 * @param y 削除したフロアマスのY座標
210 * @param x 削除したフロアマスのX座標
213 void delete_object(POSITION y, POSITION x)
216 OBJECT_IDX this_o_idx, next_o_idx = 0;
218 /* Refuse "illegal" locations */
219 if (!in_bounds(y, x)) return;
221 g_ptr = ¤t_floor_ptr->grid_array[y][x];
223 /* Scan all objects in the grid */
224 for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
227 o_ptr = ¤t_floor_ptr->o_list[this_o_idx];
228 next_o_idx = o_ptr->next_o_idx;
235 /* Objects are gone */
244 * @brief グローバルオブジェクト配列に対し指定範囲のオブジェクトを整理してIDの若い順に寄せる /
245 * Move an object from index i1 to index i2 in the object list
246 * @param i1 整理したい配列の始点
247 * @param i2 整理したい配列の終点
250 static void compact_objects_aux(OBJECT_IDX i1, OBJECT_IDX i2)
257 if (i1 == i2) return;
260 for (i = 1; i < o_max; i++)
262 o_ptr = ¤t_floor_ptr->o_list[i];
264 /* Skip "dead" objects */
265 if (!o_ptr->k_idx) continue;
267 /* Repair "next" pointers */
268 if (o_ptr->next_o_idx == i1)
271 o_ptr->next_o_idx = i2;
274 o_ptr = ¤t_floor_ptr->o_list[i1];
276 if (o_ptr->held_m_idx)
280 /* Acquire monster */
281 m_ptr = ¤t_floor_ptr->m_list[o_ptr->held_m_idx];
284 if (m_ptr->hold_o_idx == i1)
287 m_ptr->hold_o_idx = i2;
296 /* Acquire location */
301 g_ptr = ¤t_floor_ptr->grid_array[y][x];
304 if (g_ptr->o_idx == i1)
312 current_floor_ptr->o_list[i2] = current_floor_ptr->o_list[i1];
320 * @brief グローバルオブジェクト配列から優先度の低いものを削除し、データを圧縮する。 /
321 * Compact and Reorder the object list.
322 * @param size 最低でも減らしたいオブジェクト数の水準
326 * This function can be very dangerous, use with caution!\n
328 * When actually "compacting" objects, we base the saving throw on a\n
329 * combination of object level, distance from player, and current\n
332 * After "compacting" (if needed), we "reorder" the objects into a more\n
333 * compact order, and we reset the allocation info, and the "live" array.\n
335 void compact_objects(int size)
340 int cur_lev, cur_dis, chance;
346 msg_print(_("アイテム情報を圧縮しています...", "Compacting objects..."));
347 p_ptr->redraw |= (PR_MAP);
348 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
352 /* Compact at least 'size' objects */
353 for (num = 0, cnt = 1; num < size; cnt++)
355 /* Get more vicious each iteration */
358 /* Get closer each iteration */
359 cur_dis = 5 * (20 - cnt);
361 /* Examine the objects */
362 for (i = 1; i < o_max; i++)
364 o_ptr = ¤t_floor_ptr->o_list[i];
366 /* Skip dead objects */
367 if (!o_ptr->k_idx) continue;
369 /* Hack -- High level objects start out "immune" */
370 if (k_info[o_ptr->k_idx].level > cur_lev) continue;
372 if (o_ptr->held_m_idx)
376 /* Acquire monster */
377 m_ptr = ¤t_floor_ptr->m_list[o_ptr->held_m_idx];
382 /* Monsters protect their objects */
383 if (randint0(100) < 90) continue;
393 /* Nearby objects start out "immune" */
394 if ((cur_dis > 0) && (distance(p_ptr->y, p_ptr->x, y, x) < cur_dis)) continue;
399 /* Hack -- only compact artifacts in emergencies */
400 if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
401 (cnt < 1000)) chance = 100;
403 /* Apply the saving throw */
404 if (randint0(100) < chance) continue;
406 delete_object_idx(i);
414 /* Excise dead objects (backwards!) */
415 for (i = o_max - 1; i >= 1; i--)
417 o_ptr = ¤t_floor_ptr->o_list[i];
419 /* Skip real objects */
420 if (o_ptr->k_idx) continue;
422 /* Move last object into open hole */
423 compact_objects_aux(o_max - 1, i);
425 /* Compress "o_max" */
432 * @brief グローバルオブジェクト配列を初期化する /
433 * Delete all the items when player leaves the level
434 * @note we do NOT visually reflect these (irrelevant) changes
436 * Hack -- we clear the "g_ptr->o_idx" field for every grid,
437 * and the "m_ptr->next_o_idx" field for every monster, since
438 * we know we are clearing every object. Technically, we only
439 * clear those fields for grids/monsters containing objects,
440 * and we clear it once for every such object.
443 void wipe_o_list(void)
447 /* Delete the existing objects */
448 for (i = 1; i < o_max; i++)
450 object_type *o_ptr = ¤t_floor_ptr->o_list[i];
452 /* Skip dead objects */
453 if (!o_ptr->k_idx) continue;
455 /* Mega-Hack -- preserve artifacts */
456 if (!character_dungeon || preserve_mode)
458 /* Hack -- Preserve unknown artifacts */
459 if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
461 /* Mega-Hack -- Preserve the artifact */
462 a_info[o_ptr->name1].cur_num = 0;
466 if (o_ptr->held_m_idx)
469 m_ptr = ¤t_floor_ptr->m_list[o_ptr->held_m_idx];
471 /* Hack -- see above */
472 m_ptr->hold_o_idx = 0;
480 /* Access location */
481 POSITION y = o_ptr->iy;
482 POSITION x = o_ptr->ix;
485 g_ptr = ¤t_floor_ptr->grid_array[y][x];
487 /* Hack -- see above */
502 * @brief グローバルオブジェクト配列から空きを取得する /
503 * Acquires and returns the index of a "free" object.
504 * @return 開いているオブジェクト要素のID
506 * This routine should almost never fail, but in case it does,
507 * we must be sure to handle "failure" of this routine.
509 OBJECT_IDX o_pop(void)
513 /* Initial allocation */
514 if (o_max < current_floor_ptr->max_o_idx)
519 /* Expand object array */
525 /* Use this object */
530 /* Recycle dead objects */
531 for (i = 1; i < o_max; i++)
534 o_ptr = ¤t_floor_ptr->o_list[i];
536 /* Skip live objects */
537 if (o_ptr->k_idx) continue;
542 /* Use this object */
547 /* Warn the player (except during dungeon creation) */
548 if (character_dungeon) msg_print(_("アイテムが多すぎる!", "Too many objects!"));
555 * @brief オブジェクト生成テーブルに生成制約を加える /
556 * Apply a "object restriction function" to the "object allocation table"
558 * @details 生成の制約はグローバルのget_obj_num_hook関数ポインタで加える
560 static errr get_obj_num_prep(void)
565 alloc_entry *table = alloc_kind_table;
567 /* Scan the allocation table */
568 for (i = 0; i < alloc_kind_size; i++)
570 /* Accept objects which pass the restriction, if any */
571 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
573 /* Accept this object */
574 table[i].prob2 = table[i].prob1;
577 /* Do not use this object */
580 /* Decline this object */
591 * @brief オブジェクト生成テーブルからアイテムを取得する /
592 * Choose an object kind that seems "appropriate" to the given level
594 * @return 選ばれたオブジェクトベースID
596 * This function uses the "prob2" field of the "object allocation table",\n
597 * and various local information, to calculate the "prob3" field of the\n
598 * same table, which is then used to choose an "appropriate" object, in\n
599 * a relatively efficient manner.\n
601 * It is (slightly) more likely to acquire an object of the given level\n
602 * than one of a lower level. This is done by choosing several objects\n
603 * appropriate to the given level and keeping the "hardest" one.\n
605 * Note that if no objects are "appropriate", then this function will\n
606 * fail, and return zero, but this should *almost* never happen.\n
608 OBJECT_IDX get_obj_num(DEPTH level)
611 KIND_OBJECT_IDX k_idx;
614 alloc_entry *table = alloc_kind_table;
616 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
619 if ((level > 0) && !(d_info[p_ptr->dungeon_idx].flags1 & DF1_BEGINNER))
621 /* Occasional "boost" */
622 if (one_in_(GREAT_OBJ))
624 /* What a bizarre calculation */
625 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
632 /* Process probabilities */
633 for (i = 0; i < alloc_kind_size; i++)
635 /* Objects are sorted by depth */
636 if (table[i].level > level) break;
641 /* Access the index */
642 k_idx = table[i].index;
644 /* Access the actual kind */
645 k_ptr = &k_info[k_idx];
647 /* Hack -- prevent embedded chests */
648 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
651 table[i].prob3 = table[i].prob2;
654 total += table[i].prob3;
657 /* No legal objects */
658 if (total <= 0) return (0);
662 value = randint0(total);
664 /* Find the object */
665 for (i = 0; i < alloc_kind_size; i++)
667 /* Found the entry */
668 if (value < table[i].prob3) break;
671 value = value - table[i].prob3;
678 /* Try for a "better" object once (50%) or twice (10%) */
685 value = randint0(total);
687 /* Find the object */
688 for (i = 0; i < alloc_kind_size; i++)
690 /* Found the entry */
691 if (value < table[i].prob3) break;
694 value = value - table[i].prob3;
697 /* Keep the "best" one */
698 if (table[i].level < table[j].level) i = j;
701 /* Try for a "better" object twice (10%) */
708 value = randint0(total);
710 /* Find the object */
711 for (i = 0; i < alloc_kind_size; i++)
713 /* Found the entry */
714 if (value < table[i].prob3) break;
717 value = value - table[i].prob3;
720 /* Keep the "best" one */
721 if (table[i].level < table[j].level) i = j;
724 return (table[i].index);
729 * @brief オブジェクトを鑑定済にする /
730 * Known is true when the "attributes" of an object are "known".
731 * @param o_ptr 鑑定済にするオブジェクトの構造体参照ポインタ
733 * These include tohit, todam, toac, cost, and pval (charges).\n
735 * Note that "knowing" an object gives you everything that an "awareness"\n
736 * gives you, and much more. In fact, the player is always "aware" of any\n
737 * item of which he has full "knowledge".\n
739 * But having full knowledge of, say, one "wand of wonder", does not, by\n
740 * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
741 * It happens that most "identify" routines (including "buying from a shop")\n
742 * will make the player "aware" of the object as well as fully "know" it.\n
744 * This routine also removes any inscriptions generated by "feelings".\n
746 void object_known(object_type *o_ptr)
748 /* Remove "default inscriptions" */
749 o_ptr->feeling = FEEL_NONE;
751 /* Clear the "Felt" info */
752 o_ptr->ident &= ~(IDENT_SENSE);
754 /* Clear the "Empty" info */
755 o_ptr->ident &= ~(IDENT_EMPTY);
757 /* Now we know about the item */
758 o_ptr->ident |= (IDENT_KNOWN);
762 * @brief オブジェクトを*鑑定*済にする /
763 * The player is now aware of the effects of the given object.
764 * @param o_ptr *鑑定*済にするオブジェクトの構造体参照ポインタ
767 void object_aware(object_type *o_ptr)
769 bool mihanmei = !object_is_aware(o_ptr);
771 /* Fully aware of the effects */
772 k_info[o_ptr->k_idx].aware = TRUE;
774 if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
775 !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
779 GAME_TEXT o_name[MAX_NLEN];
782 object_copy(q_ptr, o_ptr);
785 object_desc(o_name, q_ptr, OD_NAME_ONLY);
787 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
792 * @brief オブジェクトを試行済にする /
793 * Something has been "sampled"
794 * @param o_ptr 試行済にするオブジェクトの構造体参照ポインタ
797 void object_tried(object_type *o_ptr)
799 /* Mark it as tried (even if "aware") */
800 k_info[o_ptr->k_idx].tried = TRUE;
804 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
805 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
806 * @return 擬似鑑定結果のIDを返す。
808 byte value_check_aux1(object_type *o_ptr)
811 if (object_is_artifact(o_ptr))
814 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
821 if (object_is_ego(o_ptr))
824 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
827 return FEEL_EXCELLENT;
831 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
834 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
836 if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
838 /* Good "armor" bonus */
839 if (o_ptr->to_a > 0) return FEEL_GOOD;
841 /* Good "weapon" bonus */
842 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
844 /* Default to "average" */
849 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 2 (Light).
850 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
851 * @return 擬似鑑定結果のIDを返す。
853 byte value_check_aux2(object_type *o_ptr)
855 /* Cursed items (all of them) */
856 if (object_is_cursed(o_ptr)) return FEEL_CURSED;
858 /* Broken items (all of them) */
859 if (object_is_broken(o_ptr)) return FEEL_BROKEN;
861 /* Artifacts -- except cursed/broken ones */
862 if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
864 /* Ego-Items -- except cursed/broken ones */
865 if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
867 /* Good armor bonus */
868 if (o_ptr->to_a > 0) return FEEL_UNCURSED;
870 /* Good weapon bonuses */
871 if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
878 * @brief 未鑑定なベースアイテムの基本価格を返す /
879 * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
880 * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
881 * @return オブジェクトの未鑑定価格
883 static PRICE object_value_base(object_type *o_ptr)
885 /* Aware item -- use template cost */
886 if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
888 /* Analyze the type */
893 case TV_FOOD: return (5L);
895 /* Un-aware Potions */
896 case TV_POTION: return (20L);
898 /* Un-aware Scrolls */
899 case TV_SCROLL: return (20L);
901 /* Un-aware Staffs */
902 case TV_STAFF: return (70L);
905 case TV_WAND: return (50L);
908 case TV_ROD: return (90L);
911 case TV_RING: return (45L);
913 /* Un-aware Amulets */
914 case TV_AMULET: return (45L);
916 /* Figurines, relative to monster level */
919 DEPTH level = r_info[o_ptr->pval].level;
920 if (level < 20) return level*50L;
921 else if (level < 30) return 1000+(level-20)*150L;
922 else if (level < 40) return 2500+(level-30)*350L;
923 else if (level < 50) return 6000+(level-40)*800L;
924 else return 14000+(level-50)*2000L;
928 if (!o_ptr->pval) return 1000L;
929 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
932 /* Paranoia -- Oops */
938 * @brief オブジェクトのフラグ類から価格を算出する /
939 * Return the value of the flags the object has...
940 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
941 * @param plusses フラグに与える価格の基本重み
942 * @return オブジェクトのフラグ価格
944 PRICE flag_cost(object_type *o_ptr, int plusses)
947 BIT_FLAGS flgs[TR_FLAG_SIZE];
951 object_kind *k_ptr = &k_info[o_ptr->k_idx];
953 object_flags(o_ptr, flgs);
956 * Exclude fixed flags of the base item.
957 * pval bonuses of base item will be treated later.
959 for (i = 0; i < TR_FLAG_SIZE; i++)
960 flgs[i] &= ~(k_ptr->flags[i]);
962 /* Exclude fixed flags of the fixed artifact. */
963 if (object_is_fixed_artifact(o_ptr))
965 artifact_type *a_ptr = &a_info[o_ptr->name1];
967 for (i = 0; i < TR_FLAG_SIZE; i++)
968 flgs[i] &= ~(a_ptr->flags[i]);
971 /* Exclude fixed flags of the ego-item. */
972 else if (object_is_ego(o_ptr))
974 ego_item_type *e_ptr = &e_info[o_ptr->name2];
976 for (i = 0; i < TR_FLAG_SIZE; i++)
977 flgs[i] &= ~(e_ptr->flags[i]);
982 * Calucurate values of remaining flags
984 if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
985 if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
986 if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
987 if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
988 if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
989 if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
990 if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
991 if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
992 if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
993 if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
994 if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
995 if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
996 total += (10000 + (2500 * plusses));
997 if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
998 total += (10000 + (2500 * plusses));
1002 if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
1003 if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
1004 if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
1005 if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
1006 else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
1007 if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
1008 else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
1009 if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
1010 else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
1011 if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
1012 else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
1013 if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
1014 else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
1015 if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
1016 else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
1017 if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
1018 else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
1019 if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
1020 else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
1021 if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
1022 else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
1024 if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
1025 if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
1026 if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
1027 if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
1028 if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
1029 if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
1030 if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
1031 total += (tmp_cost * count);
1033 if (have_flag(flgs, TR_SUST_STR)) total += 850;
1034 if (have_flag(flgs, TR_SUST_INT)) total += 850;
1035 if (have_flag(flgs, TR_SUST_WIS)) total += 850;
1036 if (have_flag(flgs, TR_SUST_DEX)) total += 850;
1037 if (have_flag(flgs, TR_SUST_CON)) total += 850;
1038 if (have_flag(flgs, TR_SUST_CHR)) total += 250;
1039 if (have_flag(flgs, TR_RIDING)) total += 0;
1040 if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
1041 if (have_flag(flgs, TR_THROW)) total += 5000;
1042 if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
1043 if (have_flag(flgs, TR_HOLD_EXP)) total += 8500;
1047 if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
1048 if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
1049 if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
1050 if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
1051 if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
1052 if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
1053 if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
1054 if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
1055 if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
1056 if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
1057 if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
1058 if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
1059 if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
1060 if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
1061 if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
1062 if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
1063 if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
1064 if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
1065 if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
1066 if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
1067 if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
1068 total += (tmp_cost * count);
1070 if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
1071 if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
1072 if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1073 if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1074 if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1075 if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1076 if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1077 if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1078 if (have_flag(flgs, TR_LEVITATION)) total += 1250;
1079 if (have_flag(flgs, TR_LITE_1)) total += 1500;
1080 if (have_flag(flgs, TR_LITE_2)) total += 2500;
1081 if (have_flag(flgs, TR_LITE_3)) total += 4000;
1082 if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
1083 if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
1084 if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
1085 if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1086 if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1087 if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1088 if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1089 if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1090 if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1091 if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1092 if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1093 if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1094 if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1095 if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1096 if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1097 if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1098 if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1099 if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1100 if (have_flag(flgs, TR_REGEN)) total += 2500;
1101 if (have_flag(flgs, TR_WARNING)) total += 2000;
1102 if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1103 if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1104 if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1105 if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1106 if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1107 if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1108 if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1109 if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1110 if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1111 if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
1112 if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
1113 if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
1114 if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
1115 if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
1116 if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
1117 if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
1118 if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
1119 if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
1120 if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
1121 if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
1122 if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
1123 if (have_flag(flgs, TR_TELEPORT))
1125 if (object_is_cursed(o_ptr))
1130 if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1131 if (have_flag(flgs, TR_BLESSED)) total += 750;
1132 if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1133 if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1134 if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1135 if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1136 if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1138 /* Also, give some extra for activatable powers... */
1139 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1141 const activation_type* const act_ptr = find_activation_info(o_ptr);
1143 total += act_ptr->value;
1152 * @brief オブジェクトの真の価格を算出する /
1153 * Return the value of the flags the object has...
1154 * @param o_ptr 本価格を確認したいオブジェクトの構造体参照ポインタ
1155 * @return オブジェクトの本価格
1157 * Return the "real" price of a "known" item, not including discounts\n
1159 * Wand and staffs get cost for each charge\n
1161 * Armor is worth an extra 100 gold per bonus point to armor class.\n
1163 * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
1165 * Missiles are only worth 5 gold per bonus point, since they\n
1166 * usually appear in groups of 20, and we want the player to get\n
1167 * the same amount of cash for any "equivalent" item. Note that\n
1168 * missiles never have any of the "pval" flags, and in fact, they\n
1169 * only have a few of the available flags, primarily of the "slay"\n
1170 * and "brand" and "ignore" variety.\n
1172 * Armor with a negative armor bonus is worthless.\n
1173 * Weapons with negative hit+damage bonuses are worthless.\n
1175 * Every wearable item with a "pval" bonus is worth extra (see below).\n
1177 PRICE object_value_real(object_type *o_ptr)
1180 BIT_FLAGS flgs[TR_FLAG_SIZE];
1181 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1184 /* Hack -- "worthless" items */
1185 if (!k_info[o_ptr->k_idx].cost) return (0L);
1188 value = k_info[o_ptr->k_idx].cost;
1190 /* Extract some flags */
1191 object_flags(o_ptr, flgs);
1194 if (object_is_fixed_artifact(o_ptr))
1196 artifact_type *a_ptr = &a_info[o_ptr->name1];
1198 /* Hack -- "worthless" artifacts */
1199 if (!a_ptr->cost) return (0L);
1201 /* Hack -- Use the artifact cost instead */
1202 value = a_ptr->cost;
1203 value += flag_cost(o_ptr, o_ptr->pval);
1205 /* Don't add pval bonuses etc. */
1210 else if (object_is_ego(o_ptr))
1212 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1214 /* Hack -- "worthless" ego-items */
1215 if (!e_ptr->cost) return (0L);
1217 /* Hack -- Reward the ego-item with a bonus */
1218 value += e_ptr->cost;
1219 value += flag_cost(o_ptr, o_ptr->pval);
1227 for (i = 0; i < TR_FLAG_SIZE; i++)
1228 if (o_ptr->art_flags[i]) flag = TRUE;
1230 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1233 /* Analyze pval bonus for normal object */
1234 switch (o_ptr->tval)
1257 if (!o_ptr->pval) break;
1259 /* Hack -- Negative "pval" is always bad */
1260 if (o_ptr->pval < 0) return (0L);
1262 /* Give credit for stat bonuses */
1263 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1264 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1265 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1266 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1267 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1268 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1270 /* Give credit for stealth and searching */
1271 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1272 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1273 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1275 /* Give credit for infra-vision and tunneling */
1276 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1277 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1279 /* Give credit for extra attacks */
1280 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1282 /* Give credit for speed bonus */
1283 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1289 /* Analyze the item */
1290 switch (o_ptr->tval)
1295 /* Pay extra for charges, depending on standard number of
1296 * charges. Handle new-style wands correctly. -LM-
1298 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1304 /* Pay extra for charges, depending on standard number of
1307 value += (value * o_ptr->pval / (k_ptr->pval * 2));
1316 /* Hack -- negative bonuses are bad */
1317 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1319 /* Give credit for bonuses */
1320 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1336 /* Hack -- negative armor bonus */
1337 if (o_ptr->to_a < 0) return (0L);
1339 /* Give credit for bonuses */
1340 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
1352 /* Hack -- negative hit/damage bonuses */
1353 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1355 /* Factor in the bonuses */
1356 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1358 /* Hack -- Factor in extra damage dice and sides */
1359 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1360 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1370 /* Hack -- negative hit/damage bonuses */
1371 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1373 /* Factor in the bonuses */
1374 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1376 /* Hack -- Factor in extra damage dice and sides */
1377 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1378 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1383 /* Figurines, relative to monster level */
1386 DEPTH level = r_info[o_ptr->pval].level;
1387 if (level < 20) value = level*50L;
1388 else if (level < 30) value = 1000+(level-20)*150L;
1389 else if (level < 40) value = 2500+(level-30)*350L;
1390 else if (level < 50) value = 6000+(level-40)*800L;
1391 else value = 14000+(level-50)*2000L;
1397 if (!o_ptr->pval) value = 1000L;
1398 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1404 if (!o_ptr->pval) value = 0L;
1409 /* Worthless object */
1410 if (value < 0) return 0L;
1412 /* Return the value */
1418 * @brief オブジェクト価格算出のメインルーチン /
1419 * Return the price of an item including plusses (and charges)
1420 * @param o_ptr 判明している現価格を確認したいオブジェクトの構造体参照ポインタ
1421 * @return オブジェクトの判明している現価格
1423 * This function returns the "value" of the given item (qty one)\n
1425 * Never notice "unknown" bonuses or properties, including "curses",\n
1426 * since that would give the player information he did not have.\n
1428 * Note that discounted items stay discounted forever, even if\n
1429 * the discount is "forgotten" by the player via memory loss.\n
1431 PRICE object_value(object_type *o_ptr)
1435 /* Unknown items -- acquire a base value */
1436 if (object_is_known(o_ptr))
1438 /* Broken items -- worthless */
1439 if (object_is_broken(o_ptr)) return (0L);
1441 /* Cursed items -- worthless */
1442 if (object_is_cursed(o_ptr)) return (0L);
1444 /* Real value (see above) */
1445 value = object_value_real(o_ptr);
1448 /* Known items -- acquire the actual value */
1451 /* Hack -- Felt broken items */
1452 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1454 /* Hack -- Felt cursed items */
1455 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1457 /* Base value (see above) */
1458 value = object_value_base(o_ptr);
1461 /* Apply discount (if any) */
1462 if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1464 /* Return the final value */
1471 * @brief 破壊可能なアイテムかを返す /
1472 * Determines whether an object can be destroyed, and makes fake inscription.
1473 * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
1474 * @return オブジェクトが破壊可能ならばTRUEを返す
1476 bool can_player_destroy_object(object_type *o_ptr)
1478 /* Artifacts cannot be destroyed */
1479 if (!object_is_artifact(o_ptr)) return TRUE;
1481 /* If object is unidentified, makes fake inscription */
1482 if (!object_is_known(o_ptr))
1484 byte feel = FEEL_SPECIAL;
1486 /* Hack -- Handle icky artifacts */
1487 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1489 /* Hack -- inscribe the artifact */
1490 o_ptr->feeling = feel;
1492 /* We have "felt" it (again) */
1493 o_ptr->ident |= (IDENT_SENSE);
1494 p_ptr->update |= (PU_COMBINE);
1495 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1500 /* Identified artifact -- Nothing to do */
1506 * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
1507 * Distribute charges of rods or wands.
1508 * @param o_ptr 分割元オブジェクトの構造体参照ポインタ source item
1509 * @param q_ptr 分割先オブジェクトの構造体参照ポインタ target item, must be of the same type as o_ptr
1510 * @param amt 分割したい回数量 number of items that are transfered
1513 * Hack -- If rods or wands are dropped, the total maximum timeout or\n
1514 * charges need to be allocated between the two stacks. If all the items\n
1515 * are being dropped, it makes for a neater message to leave the original\n
1516 * stack's pval alone. -LM-\n
1518 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1520 if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1522 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1523 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1525 /* Hack -- Rods also need to have their timeouts distributed. The
1526 * dropped stack will accept all time remaining to charge up to its
1529 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1531 if (q_ptr->pval > o_ptr->timeout)
1532 q_ptr->timeout = o_ptr->timeout;
1534 q_ptr->timeout = q_ptr->pval;
1536 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1542 * @brief 魔法棒やロッドの使用回数を減らす /
1543 * @param o_ptr オブジェクトの構造体参照ポインタ source item
1544 * @param amt 減らしたい回数量 number of items that are transfered
1547 * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1548 * charges of the stack needs to be reduced, unless all the items are\n
1549 * being destroyed. -LM-\n
1551 void reduce_charges(object_type *o_ptr, int amt)
1553 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1554 (amt < o_ptr->number))
1556 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1561 * Determine if an item can "absorb" a second item
1563 * See "object_absorb()" for the actual "absorption" code.
1565 * If permitted, we allow staffs (if they are known to have equal charges
1566 * and both are either known or confirmed empty) and wands (if both are
1567 * either known or confirmed empty) and rods (in all cases) to combine.
1568 * Staffs will unstack (if necessary) when they are used, but wands and
1569 * rods will only unstack if one is dropped. -LM-
1571 * If permitted, we allow weapons/armor to stack, if fully "known".
1573 * Missiles will combine if both stacks have the same "known" status.
1574 * This is done to make unidentified stacks of missiles useful.
1576 * Food, potions, scrolls, and "easy know" items always stack.
1578 * Chests, and activatable items, never stack (for various reasons).
1582 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1584 #define MAX_STACK_SIZE 99
1588 * @brief 両オブジェクトをスロットに重ね合わせ可能な最大数を返す。
1589 * Determine if an item can partly absorb a second item. Return maximum number of stack.
1590 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1591 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1592 * @return 重ね合わせ可能なアイテム数
1594 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1598 /* Default maximum number of stack */
1599 int max_num = MAX_STACK_SIZE;
1601 /* Require identical object types */
1602 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1605 /* Analyze the items */
1606 switch (o_ptr->tval)
1608 /* Chests and Statues*/
1619 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1620 if (o_ptr->pval != j_ptr->pval) return 0;
1624 /* Figurines and Corpses*/
1629 if (o_ptr->pval != j_ptr->pval) return 0;
1635 /* Food and Potions and Scrolls */
1647 /* Require either knowledge or known empty for both staffs. */
1648 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1649 !object_is_known(o_ptr)) ||
1650 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1651 !object_is_known(j_ptr))) return 0;
1653 /* Require identical charges, since staffs are bulky. */
1654 if (o_ptr->pval != j_ptr->pval) return 0;
1663 /* Require either knowledge or known empty for both wands. */
1664 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1665 !object_is_known(o_ptr)) ||
1666 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1667 !object_is_known(j_ptr))) return 0;
1669 /* Wand charges combine in O&ZAngband. */
1675 /* Staffs and Wands and Rods */
1678 /* Prevent overflaw of timeout */
1679 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1685 /* Weapons and Armor */
1701 /* Rings, Amulets, Lites */
1707 /* Require full knowledge of both items */
1708 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1718 /* Require identical knowledge of both items */
1719 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1720 if (o_ptr->feeling != j_ptr->feeling) return 0;
1722 /* Require identical "bonuses" */
1723 if (o_ptr->to_h != j_ptr->to_h) return 0;
1724 if (o_ptr->to_d != j_ptr->to_d) return 0;
1725 if (o_ptr->to_a != j_ptr->to_a) return 0;
1727 /* Require identical "pval" code */
1728 if (o_ptr->pval != j_ptr->pval) return 0;
1730 /* Artifacts never stack */
1731 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1733 /* Require identical "ego-item" names */
1734 if (o_ptr->name2 != j_ptr->name2) return 0;
1736 /* Require identical added essence */
1737 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1738 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1740 /* Hack -- Never stack "powerful" items */
1741 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1743 /* Hack -- Never stack recharging items */
1744 if (o_ptr->timeout || j_ptr->timeout) return 0;
1746 /* Require identical "values" */
1747 if (o_ptr->ac != j_ptr->ac) return 0;
1748 if (o_ptr->dd != j_ptr->dd) return 0;
1749 if (o_ptr->ds != j_ptr->ds) return 0;
1758 /* Require knowledge */
1759 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1767 /* Hack -- Identical art_flags! */
1768 for (i = 0; i < TR_FLAG_SIZE; i++)
1769 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1771 /* Hack -- Require identical "cursed" status */
1772 if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1774 /* Hack -- Require identical "broken" status */
1775 if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1778 /* Hack -- require semi-matching "inscriptions" */
1779 if (o_ptr->inscription && j_ptr->inscription &&
1780 (o_ptr->inscription != j_ptr->inscription))
1783 /* Hack -- normally require matching "inscriptions" */
1784 if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1786 /* Hack -- normally require matching "discounts" */
1787 if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1790 /* They match, so they must be similar */
1795 * @brief 両オブジェクトをスロットに重ねることができるかどうかを返す。
1796 * Determine if an item can absorb a second item.
1797 * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1798 * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1799 * @return 重ね合わせ可能ならばTRUEを返す。
1801 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1803 int total = o_ptr->number + j_ptr->number;
1806 /* Are these objects similar? */
1807 max_num = object_similar_part(o_ptr, j_ptr);
1809 /* Return if not similar */
1810 if (!max_num) return FALSE;
1812 /* Maximal "stacking" limit */
1813 if (total > max_num) return (0);
1816 /* They match, so they must be similar */
1822 * @brief 両オブジェクトをスロットに重ね合わせる。
1823 * Allow one item to "absorb" another, assuming they are similar
1824 * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
1825 * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
1828 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1830 int max_num = object_similar_part(o_ptr, j_ptr);
1831 int total = o_ptr->number + j_ptr->number;
1832 int diff = (total > max_num) ? total - max_num : 0;
1834 /* Combine quantity, lose excess items */
1835 o_ptr->number = (total > max_num) ? max_num : total;
1837 /* Hack -- blend "known" status */
1838 if (object_is_known(j_ptr)) object_known(o_ptr);
1840 /* Hack -- clear "storebought" if only one has it */
1841 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1842 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1844 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1845 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1848 /* Hack -- blend "mental" status */
1849 if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1851 /* Hack -- blend "inscriptions" */
1852 if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1854 /* Hack -- blend "feelings" */
1855 if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1857 /* Hack -- could average discounts */
1858 /* Hack -- save largest discount */
1859 if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1861 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1862 if (o_ptr->tval == TV_ROD)
1864 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1865 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1868 /* Hack -- if wands are stacking, combine the charges. -LM- */
1869 if (o_ptr->tval == TV_WAND)
1871 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1877 * @brief tvalとsvalに対応するベースアイテムのIDを返す。
1878 * Find the index of the object_kind with the given tval and sval
1879 * @param tval 検索したいベースアイテムのtval
1880 * @param sval 検索したいベースアイテムのsval
1883 KIND_OBJECT_IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval)
1887 KIND_OBJECT_IDX bk = 0;
1890 for (k = 1; k < max_k_idx; k++)
1892 object_kind *k_ptr = &k_info[k];
1894 /* Require correct tval */
1895 if (k_ptr->tval != tval) continue;
1898 if (k_ptr->sval == sval) return (k);
1900 /* Ignore illegal items */
1901 if (sval != SV_ANY) continue;
1903 /* Apply the randomizer */
1904 if (!one_in_(++num)) continue;
1906 /* Use this value */
1910 /* Return this choice */
1917 msg_format(_("アイテムがない (%d,%d)", "No object (%d,%d)"), tval, sval);
1926 * @brief オブジェクトを初期化する
1927 * Wipe an object clean.
1928 * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
1931 void object_wipe(object_type *o_ptr)
1933 /* Wipe the structure */
1934 (void)WIPE(o_ptr, object_type);
1939 * @brief オブジェクトを複製する
1940 * Wipe an object clean.
1941 * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
1942 * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
1945 void object_copy(object_type *o_ptr, object_type *j_ptr)
1947 /* Copy the structure */
1948 (void)COPY(o_ptr, j_ptr, object_type);
1953 * @brief オブジェクト構造体にベースアイテムを作成する
1954 * Prepare an object based on an object kind.
1955 * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
1956 * @param k_idx 新たに作成したいベースアイテム情報のID
1959 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
1961 object_kind *k_ptr = &k_info[k_idx];
1963 /* Clear the record */
1966 /* Save the kind index */
1967 o_ptr->k_idx = k_idx;
1969 /* Efficiency -- tval/sval */
1970 o_ptr->tval = k_ptr->tval;
1971 o_ptr->sval = k_ptr->sval;
1973 /* Default "pval" */
1974 o_ptr->pval = k_ptr->pval;
1976 /* Default number */
1979 /* Default weight */
1980 o_ptr->weight = k_ptr->weight;
1983 o_ptr->to_h = k_ptr->to_h;
1984 o_ptr->to_d = k_ptr->to_d;
1985 o_ptr->to_a = k_ptr->to_a;
1988 o_ptr->ac = k_ptr->ac;
1989 o_ptr->dd = k_ptr->dd;
1990 o_ptr->ds = k_ptr->ds;
1992 /* Default activation */
1993 if (k_ptr->act_idx > 0) o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
1995 /* Hack -- worthless items are always "broken" */
1996 if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
1998 /* Hack -- cursed items are always "cursed" */
1999 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
2000 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2001 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
2002 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2003 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2004 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2009 * @brief 上質以上のオブジェクトに与えるための各種ボーナスを正規乱数も加えて算出する。
2010 * Help determine an "enchantment bonus" for an object.
2011 * @param max ボーナス値の限度
2012 * @param level ボーナス値に加味する基準生成階
2013 * @return 算出されたボーナス値
2015 * To avoid floating point but still provide a smooth distribution of bonuses,\n
2016 * we simply round the results of division in such a way as to "average" the\n
2017 * correct floating point value.\n
2019 * This function has been changed. It uses "randnor()" to choose values from\n
2020 * a normal distribution, whose mean moves from zero towards the max as the\n
2021 * level increases, and whose standard deviation is equal to 1/4 of the max,\n
2022 * and whose values are forced to lie between zero and the max, inclusive.\n
2024 * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
2025 * rare to get the "full" enchantment on an object, even a deep levels.\n
2027 * It is always possible (albeit unlikely) to get the "full" enchantment.\n
2029 * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
2031 * N 0 1 2 3 4 5 6 7 8 9 10\n
2032 * --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n
2033 * 0 66.37 13.01 9.73 5.47 2.89 1.31 0.72 0.26 0.12 0.09 0.03\n
2034 * 8 46.85 24.66 12.13 8.13 4.20 2.30 1.05 0.36 0.19 0.08 0.05\n
2035 * 16 30.12 27.62 18.52 10.52 6.34 3.52 1.95 0.90 0.31 0.15 0.05\n
2036 * 24 22.44 15.62 30.14 12.92 8.55 5.30 2.39 1.63 0.62 0.28 0.11\n
2037 * 32 16.23 11.43 23.01 22.31 11.19 7.18 4.46 2.13 1.20 0.45 0.41\n
2038 * 40 10.76 8.91 12.80 29.51 16.00 9.69 5.90 3.43 1.47 0.88 0.65\n
2039 * 48 7.28 6.81 10.51 18.27 27.57 11.76 7.85 4.99 2.80 1.22 0.94\n
2040 * 56 4.41 4.73 8.52 11.96 24.94 19.78 11.06 7.18 3.68 1.96 1.78\n
2041 * 64 2.81 3.07 5.65 9.17 13.01 31.57 13.70 9.30 6.04 3.04 2.64\n
2042 * 72 1.87 1.99 3.68 7.15 10.56 20.24 25.78 12.17 7.52 4.42 4.62\n
2043 * 80 1.02 1.23 2.78 4.75 8.37 12.04 27.61 18.07 10.28 6.52 7.33\n
2044 * 88 0.70 0.57 1.56 3.12 6.34 10.06 15.76 30.46 12.58 8.47 10.38\n
2045 * 96 0.27 0.60 1.25 2.28 4.30 7.60 10.77 22.52 22.51 11.37 16.53\n
2046 * 104 0.22 0.42 0.77 1.36 2.62 5.33 8.93 13.05 29.54 15.23 22.53\n
2047 * 112 0.15 0.20 0.56 0.87 2.00 3.83 6.86 10.06 17.89 27.31 30.27\n
2048 * 120 0.03 0.11 0.31 0.46 1.31 2.48 4.60 7.78 11.67 25.53 45.72\n
2049 * 128 0.02 0.01 0.13 0.33 0.83 1.41 3.24 6.17 9.57 14.22 64.07\n
2051 int m_bonus(int max, DEPTH level)
2053 int bonus, stand, extra, value;
2056 /* Paranoia -- enforce maximal "level" */
2057 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
2060 /* The "bonus" moves towards the max */
2061 bonus = ((max * level) / MAX_DEPTH);
2063 /* Hack -- determine fraction of error */
2064 extra = ((max * level) % MAX_DEPTH);
2066 /* Hack -- simulate floating point computations */
2067 if (randint0(MAX_DEPTH) < extra) bonus++;
2070 /* The "stand" is equal to one quarter of the max */
2073 /* Hack -- determine fraction of error */
2076 /* Hack -- simulate floating point computations */
2077 if (randint0(4) < extra) stand++;
2080 /* Choose an "interesting" value */
2081 value = randnor(bonus, stand);
2083 /* Enforce the minimum value */
2084 if (value < 0) return (0);
2086 /* Enforce the maximum value */
2087 if (value > max) return (max);
2093 * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user
2094 * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ
2097 static void object_mention(object_type *o_ptr)
2099 GAME_TEXT o_name[MAX_NLEN];
2101 object_aware(o_ptr);
2102 object_known(o_ptr);
2104 /* Mark the item as fully known */
2105 o_ptr->ident |= (IDENT_MENTAL);
2106 object_desc(o_name, o_ptr, 0);
2107 msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name);
2112 * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
2113 * Choose random ego type
2114 * @param slot 取得したいエゴの装備部位
2115 * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
2116 * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
2118 static byte get_random_ego(byte slot, bool good)
2121 ego_item_type *e_ptr;
2125 for (i = 1; i < max_e_idx; i++)
2129 if (e_ptr->slot == slot
2130 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2133 total += (255 / e_ptr->rarity);
2137 value = randint1(total);
2139 for (i = 1; i < max_e_idx; i++)
2143 if (e_ptr->slot == slot
2144 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2147 value -= (255 / e_ptr->rarity);
2148 if (value <= 0L) break;
2156 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2157 * Apply magic to an item known to be a "weapon"
2158 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2159 * @param level 生成基準階
2160 * @param power 生成ランク
2163 * Hack -- note special base damage dice boosting\n
2164 * Hack -- note special processing for weapon/digger\n
2166 static void a_m_aux_1(object_type *o_ptr, DEPTH level, int power)
2168 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
2169 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
2171 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
2172 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
2174 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2176 tohit2 = (tohit2+1)/2;
2177 todam2 = (todam2+1)/2;
2184 o_ptr->to_h += tohit1;
2185 o_ptr->to_d += todam1;
2191 o_ptr->to_h += tohit2;
2192 o_ptr->to_d += todam2;
2200 o_ptr->to_h -= tohit1;
2201 o_ptr->to_d -= todam1;
2206 /* Penalize again */
2207 o_ptr->to_h -= tohit2;
2208 o_ptr->to_d -= todam2;
2211 /* Cursed (if "bad") */
2212 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2215 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2218 switch (o_ptr->tval)
2225 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2226 create_artifact(o_ptr, FALSE);
2228 /* Special Ego-item */
2229 o_ptr->name2 = EGO_DIGGING;
2233 else if (power < -1)
2235 /* Hack -- Horrible digging bonus */
2236 o_ptr->pval = 0 - (5 + randint1(5));
2242 /* Hack -- Reverse digging bonus */
2243 o_ptr->pval = 0 - (o_ptr->pval);
2257 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2259 create_artifact(o_ptr, FALSE);
2264 /* Roll for an ego-item */
2265 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2266 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2268 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2270 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2275 switch (o_ptr->name2)
2278 if (one_in_(4) && (level > 40))
2279 add_flag(o_ptr->art_flags, TR_BLOWS);
2283 add_flag(o_ptr->art_flags, TR_RES_POIS);
2285 add_flag(o_ptr->art_flags, TR_WARNING);
2287 case EGO_KILL_DRAGON:
2289 add_flag(o_ptr->art_flags, TR_RES_POIS);
2293 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2295 case EGO_SLAYING_WEAPON:
2296 if (one_in_(3)) /* double damage */
2304 while (one_in_(o_ptr->dd));
2310 while (one_in_(o_ptr->ds));
2315 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2317 if (o_ptr->tval == TV_SWORD && one_in_(3))
2319 add_flag(o_ptr->art_flags, TR_VORPAL);
2324 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2330 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
2332 add_flag(o_ptr->art_flags, TR_DEX);
2334 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2337 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
2339 case EGO_EARTHQUAKES:
2340 if (one_in_(3) && (level > 60))
2341 add_flag(o_ptr->art_flags, TR_BLOWS);
2343 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
2347 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2351 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2353 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2355 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2356 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2359 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2360 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2361 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2362 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2366 if (!o_ptr->art_name)
2368 /* Hack -- Super-charge the damage dice */
2369 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2371 /* Hack -- Lower the damage dice */
2372 if (o_ptr->dd > 9) o_ptr->dd = 9;
2377 else if (power < -1)
2379 /* Roll for ego-item */
2380 if (randint0(MAX_DEPTH) < level)
2384 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2385 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2391 switch (o_ptr->name2)
2394 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2395 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2397 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2398 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2399 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2400 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2401 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2402 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2416 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2418 create_artifact(o_ptr, FALSE);
2421 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2435 if (power > 2) /* power > 2 is debug only */
2437 create_artifact(o_ptr, FALSE);
2441 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2443 switch (o_ptr->name2)
2445 case EGO_SLAYING_BOLT:
2450 /* Hack -- super-charge the damage dice */
2451 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2453 /* Hack -- restrict the damage dice */
2454 if (o_ptr->dd > 9) o_ptr->dd = 9;
2458 else if (power < -1)
2460 /* Roll for ego-item */
2461 if (randint0(MAX_DEPTH) < level)
2463 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2473 * @brief ドラゴン装備にランダムな耐性を与える
2474 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2477 static void dragon_resist(object_type * o_ptr)
2482 one_dragon_ele_resistance(o_ptr);
2484 one_high_resistance(o_ptr);
2490 * @brief オブジェクトにランダムな強いESPを与える
2491 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2494 static bool add_esp_strong(object_type *o_ptr)
2496 bool nonliv = FALSE;
2498 switch (randint1(3))
2500 case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2501 case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2502 case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2509 * @brief オブジェクトにランダムな弱いESPを与える
2510 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2511 * @param extra TRUEならばESPの最大付与数が増える(TRUE -> 3+1d6 / FALSE -> 1d3)
2514 static void add_esp_weak(object_type *o_ptr, bool extra)
2517 u32b weak_esp_list[] = {
2529 const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2530 const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2532 /* Add unduplicated weak esp flags randomly */
2533 for (i = 0; i < add_count; ++ i)
2535 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2537 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2538 weak_esp_list[choice] = weak_esp_list[i];
2544 * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2545 * Apply magic to an item known to be "armor"
2546 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2547 * @param level 生成基準階
2548 * @param power 生成ランク
2551 * Hack -- note special processing for crown/helm\n
2552 * Hack -- note special processing for robe of permanence\n
2554 static void a_m_aux_2(object_type *o_ptr, DEPTH level, int power)
2556 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
2557 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
2563 o_ptr->to_a += toac1;
2569 o_ptr->to_a += toac2;
2577 o_ptr->to_a -= toac1;
2582 /* Penalize again */
2583 o_ptr->to_a -= toac2;
2586 /* Cursed (if "bad") */
2587 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2592 switch (o_ptr->tval)
2596 if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2597 create_artifact(o_ptr, FALSE);
2607 /* Hack -- Try for "Robes of the Magi" */
2608 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2609 (o_ptr->sval == SV_ROBE) &&
2610 (randint0(100) < 15))
2614 o_ptr->name2 = EGO_YOIYAMI;
2615 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2616 o_ptr->sval = SV_YOIYAMI_ROBE;
2622 o_ptr->name2 = EGO_PERMANENCE;
2627 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2629 create_artifact(o_ptr, FALSE);
2635 bool okay_flag = TRUE;
2637 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2639 switch (o_ptr->name2)
2642 if (o_ptr->tval != TV_HARD_ARMOR)
2648 if (o_ptr->tval != TV_SOFT_ARMOR)
2657 if (okay_flag) break;
2659 switch (o_ptr->name2)
2661 case EGO_RESISTANCE:
2663 add_flag(o_ptr->art_flags, TR_RES_POIS);
2666 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2667 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2671 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2673 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2675 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2676 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2678 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2679 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2680 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2681 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2682 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2683 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2684 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2685 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2688 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2689 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2690 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2691 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2692 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2693 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2706 if (o_ptr->sval == SV_DRAGON_SHIELD)
2708 dragon_resist(o_ptr);
2709 if (!one_in_(3)) break;
2715 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2717 create_artifact(o_ptr, FALSE);
2723 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2724 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
2725 && o_ptr->name2 == EGO_S_DWARVEN)
2732 switch (o_ptr->name2)
2735 if (!one_in_(3)) one_high_resistance(o_ptr);
2736 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2738 case EGO_REFLECTION:
2739 if (o_ptr->sval == SV_MIRROR_SHIELD)
2744 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2745 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2754 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2756 dragon_resist(o_ptr);
2757 if (!one_in_(3)) break;
2761 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2763 create_artifact(o_ptr, FALSE);
2766 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2770 else if (power < -1)
2772 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2780 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2782 dragon_resist(o_ptr);
2783 if (!one_in_(3)) break;
2788 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2790 create_artifact(o_ptr, FALSE);
2793 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
2795 switch (o_ptr->name2)
2797 case EGO_SLOW_DESCENT:
2800 one_high_resistance(o_ptr);
2806 else if (power < -1)
2808 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
2819 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2821 create_artifact(o_ptr, FALSE);
2826 bool ok_flag = TRUE;
2827 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
2829 switch (o_ptr->name2)
2832 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
2833 else add_esp_weak(o_ptr, FALSE);
2837 case EGO_REGENERATION:
2838 case EGO_LORDLINESS:
2844 if (one_in_(2)) add_esp_strong(o_ptr);
2845 else add_esp_weak(o_ptr, FALSE);
2848 default:/* not existing crown (wisdom,lite, etc...) */
2852 break; /* while (1) */
2858 else if (power < -1)
2862 bool ok_flag = TRUE;
2863 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
2865 switch (o_ptr->name2)
2867 case EGO_ANCIENT_CURSE:
2868 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2869 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2870 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2871 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2872 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2873 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2877 break; /* while (1) */
2886 if (o_ptr->sval == SV_DRAGON_HELM)
2888 dragon_resist(o_ptr);
2889 if (!one_in_(3)) break;
2895 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2897 create_artifact(o_ptr, FALSE);
2902 bool ok_flag = TRUE;
2903 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
2905 switch (o_ptr->name2)
2907 case EGO_BRILLIANCE:
2909 case EGO_INFRAVISION:
2910 case EGO_H_PROTECTION:
2915 if (one_in_(2)) add_esp_strong(o_ptr);
2916 else add_esp_weak(o_ptr, FALSE);
2920 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
2921 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
2924 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2926 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2928 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2929 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2931 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2932 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2933 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2934 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2935 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2936 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2937 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2938 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2940 default:/* not existing helm (Magi, Might, etc...)*/
2944 break; /* while (1) */
2949 else if (power < -1)
2953 bool ok_flag = TRUE;
2954 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
2956 switch (o_ptr->name2)
2958 case EGO_ANCIENT_CURSE:
2962 break; /* while (1) */
2973 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2975 create_artifact(o_ptr, FALSE);
2978 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
2980 switch (o_ptr->name2)
2989 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
2990 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
2991 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
2992 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2999 else if (power < -1)
3001 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3012 * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
3013 * Apply magic to an item known to be a "ring" or "amulet"
3014 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3015 * @param level 生成基準階
3016 * @param power 生成ランク
3019 * Hack -- note special "pval boost" code for ring of speed\n
3020 * Hack -- note that some items must be cursed (or blessed)\n
3022 static void a_m_aux_3(object_type *o_ptr, DEPTH level, int power)
3024 /* Apply magic (good or bad) according to type */
3025 switch (o_ptr->tval)
3030 switch (o_ptr->sval)
3032 case SV_RING_ATTACKS:
3035 o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
3036 if (one_in_(15)) o_ptr->pval++;
3037 if (o_ptr->pval < 1) o_ptr->pval = 1;
3043 o_ptr->ident |= (IDENT_BROKEN);
3046 o_ptr->curse_flags |= TRC_CURSED;
3049 o_ptr->pval = 0 - (o_ptr->pval);
3060 /* Strength, Constitution, Dexterity, Intelligence */
3066 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3072 o_ptr->ident |= (IDENT_BROKEN);
3075 o_ptr->curse_flags |= TRC_CURSED;
3078 o_ptr->pval = 0 - (o_ptr->pval);
3084 /* Ring of Speed! */
3087 /* Base speed (1 to 10) */
3088 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3090 /* Super-charge the ring */
3091 while (randint0(100) < 50) o_ptr->pval++;
3097 o_ptr->ident |= (IDENT_BROKEN);
3100 o_ptr->curse_flags |= TRC_CURSED;
3103 o_ptr->pval = 0 - (o_ptr->pval);
3111 case SV_RING_LORDLY:
3115 one_lordly_high_resistance(o_ptr);
3119 /* Bonus to armor class */
3120 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3124 case SV_RING_WARNING:
3126 if (one_in_(3)) one_low_esp(o_ptr);
3131 case SV_RING_SEARCHING:
3133 /* Bonus to searching */
3134 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3140 o_ptr->ident |= (IDENT_BROKEN);
3143 o_ptr->curse_flags |= TRC_CURSED;
3146 o_ptr->pval = 0 - (o_ptr->pval);
3152 /* Flames, Acid, Ice */
3153 case SV_RING_FLAMES:
3158 /* Bonus to armor class */
3159 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
3163 /* Weakness, Stupidity */
3164 case SV_RING_WEAKNESS:
3165 case SV_RING_STUPIDITY:
3168 o_ptr->ident |= (IDENT_BROKEN);
3171 o_ptr->curse_flags |= TRC_CURSED;
3174 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3175 if (power > 0) power = 0 - power;
3180 /* WOE, Stupidity */
3184 o_ptr->ident |= (IDENT_BROKEN);
3187 o_ptr->curse_flags |= TRC_CURSED;
3190 o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
3191 o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
3192 if (power > 0) power = 0 - power;
3197 /* Ring of damage */
3198 case SV_RING_DAMAGE:
3200 /* Bonus to damage */
3201 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
3207 o_ptr->ident |= (IDENT_BROKEN);
3210 o_ptr->curse_flags |= TRC_CURSED;
3213 o_ptr->to_d = 0 - o_ptr->to_d;
3219 /* Ring of Accuracy */
3220 case SV_RING_ACCURACY:
3223 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
3229 o_ptr->ident |= (IDENT_BROKEN);
3232 o_ptr->curse_flags |= TRC_CURSED;
3235 o_ptr->to_h = 0 - o_ptr->to_h;
3241 /* Ring of Protection */
3242 case SV_RING_PROTECTION:
3244 /* Bonus to armor class */
3245 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
3251 o_ptr->ident |= (IDENT_BROKEN);
3254 o_ptr->curse_flags |= TRC_CURSED;
3257 o_ptr->to_a = 0 - o_ptr->to_a;
3263 /* Ring of Slaying */
3264 case SV_RING_SLAYING:
3266 /* Bonus to damage and to hit */
3267 o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
3268 o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
3274 o_ptr->ident |= (IDENT_BROKEN);
3277 o_ptr->curse_flags |= TRC_CURSED;
3279 /* Reverse bonuses */
3280 o_ptr->to_h = 0 - o_ptr->to_h;
3281 o_ptr->to_d = 0 - o_ptr->to_d;
3287 case SV_RING_MUSCLE:
3289 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
3290 if (one_in_(4)) o_ptr->pval++;
3296 o_ptr->ident |= (IDENT_BROKEN);
3299 o_ptr->curse_flags |= TRC_CURSED;
3301 /* Reverse bonuses */
3302 o_ptr->pval = 0 - o_ptr->pval;
3307 case SV_RING_AGGRAVATION:
3310 o_ptr->ident |= (IDENT_BROKEN);
3313 o_ptr->curse_flags |= TRC_CURSED;
3315 if (power > 0) power = 0 - power;
3319 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3320 || (power > 2)) /* power > 2 is debug only */
3322 o_ptr->pval = MIN(o_ptr->pval, 4);
3323 /* Randart amulet */
3324 create_artifact(o_ptr, FALSE);
3326 else if ((power == 2) && one_in_(2))
3328 while(!o_ptr->name2)
3330 int tmp = m_bonus(10, level);
3331 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3332 switch(randint1(28))
3335 o_ptr->name2 = EGO_RING_THROW;
3338 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3339 o_ptr->name2 = EGO_RING_REGEN;
3342 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3343 o_ptr->name2 = EGO_RING_LITE;
3346 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3347 o_ptr->name2 = EGO_RING_TELEPORT;
3350 if (o_ptr->to_h) break;
3351 o_ptr->name2 = EGO_RING_TO_H;
3354 if (o_ptr->to_d) break;
3355 o_ptr->name2 = EGO_RING_TO_D;
3358 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3359 o_ptr->name2 = EGO_RING_SLAY;
3362 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3363 o_ptr->name2 = EGO_RING_WIZARD;
3366 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3367 o_ptr->name2 = EGO_RING_HERO;
3370 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3371 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3372 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3373 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3376 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3377 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;
3378 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3379 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3380 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3383 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3384 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;
3385 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3386 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3387 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3390 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3391 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;
3392 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3393 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3396 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3397 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;
3398 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3399 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3401 case 21: case 22: case 23: case 24: case 25: case 26:
3402 switch (o_ptr->sval)
3405 if (!one_in_(3)) break;
3406 o_ptr->name2 = EGO_RING_D_SPEED;
3408 case SV_RING_DAMAGE:
3409 case SV_RING_ACCURACY:
3410 case SV_RING_SLAYING:
3411 if (one_in_(2)) break;
3412 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3415 o_ptr->name2 = EGO_RING_BERSERKER;
3416 o_ptr->to_h -= 2+randint1(4);
3417 o_ptr->to_d += 2+randint1(4);
3420 case SV_RING_PROTECTION:
3421 o_ptr->name2 = EGO_RING_SUPER_AC;
3422 o_ptr->to_a += 7 + m_bonus(5, level);
3424 case SV_RING_RES_FEAR:
3425 o_ptr->name2 = EGO_RING_HERO;
3428 if (one_in_(2)) break;
3429 o_ptr->name2 = EGO_RING_HUNTER;
3431 case SV_RING_SEARCHING:
3432 o_ptr->name2 = EGO_RING_STEALTH;
3434 case SV_RING_TELEPORTATION:
3435 o_ptr->name2 = EGO_RING_TELE_AWAY;
3437 case SV_RING_RES_BLINDNESS:
3439 o_ptr->name2 = EGO_RING_RES_LITE;
3441 o_ptr->name2 = EGO_RING_RES_DARK;
3443 case SV_RING_LORDLY:
3444 if (!one_in_(20)) break;
3445 one_lordly_high_resistance(o_ptr);
3446 one_lordly_high_resistance(o_ptr);
3447 o_ptr->name2 = EGO_RING_TRUE;
3449 case SV_RING_SUSTAIN:
3450 if (!one_in_(4)) break;
3451 o_ptr->name2 = EGO_RING_RES_TIME;
3453 case SV_RING_FLAMES:
3454 if (!one_in_(2)) break;
3455 o_ptr->name2 = EGO_RING_DRAGON_F;
3458 if (!one_in_(2)) break;
3459 o_ptr->name2 = EGO_RING_DRAGON_C;
3461 case SV_RING_WARNING:
3462 if (!one_in_(2)) break;
3463 o_ptr->name2 = EGO_RING_M_DETECT;
3471 o_ptr->curse_flags = 0L;
3473 else if ((power == -2) && one_in_(2))
3475 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3476 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3477 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3478 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3479 o_ptr->art_flags[0] = 0;
3480 o_ptr->art_flags[1] = 0;
3481 while(!o_ptr->name2)
3483 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3487 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3488 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3491 o_ptr->name2 = EGO_RING_NO_MELEE;
3494 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3495 o_ptr->name2 = EGO_RING_AGGRAVATE;
3498 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3499 o_ptr->name2 = EGO_RING_TY_CURSE;
3502 o_ptr->name2 = EGO_RING_ALBINO;
3507 o_ptr->ident |= (IDENT_BROKEN);
3510 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3518 switch (o_ptr->sval)
3520 /* Amulet of wisdom/charisma */
3521 case SV_AMULET_INTELLIGENCE:
3522 case SV_AMULET_WISDOM:
3523 case SV_AMULET_CHARISMA:
3525 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
3531 o_ptr->ident |= (IDENT_BROKEN);
3534 o_ptr->curse_flags |= (TRC_CURSED);
3536 /* Reverse bonuses */
3537 o_ptr->pval = 0 - o_ptr->pval;
3543 /* Amulet of brilliance */
3544 case SV_AMULET_BRILLIANCE:
3546 o_ptr->pval = 1 + m_bonus(3, level);
3547 if (one_in_(4)) o_ptr->pval++;
3553 o_ptr->ident |= (IDENT_BROKEN);
3556 o_ptr->curse_flags |= (TRC_CURSED);
3558 /* Reverse bonuses */
3559 o_ptr->pval = 0 - o_ptr->pval;
3565 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3569 o_ptr->curse_flags |= (TRC_CURSED);
3574 case SV_AMULET_RESISTANCE:
3576 if (one_in_(5)) one_high_resistance(o_ptr);
3577 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3581 /* Amulet of searching */
3582 case SV_AMULET_SEARCHING:
3584 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
3590 o_ptr->ident |= (IDENT_BROKEN);
3593 o_ptr->curse_flags |= (TRC_CURSED);
3595 /* Reverse bonuses */
3596 o_ptr->pval = 0 - (o_ptr->pval);
3602 /* Amulet of the Magi -- never cursed */
3603 case SV_AMULET_THE_MAGI:
3605 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
3606 o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
3608 /* gain one low ESP */
3609 add_esp_weak(o_ptr, FALSE);
3614 /* Amulet of Doom -- always cursed */
3615 case SV_AMULET_DOOM:
3618 o_ptr->ident |= (IDENT_BROKEN);
3621 o_ptr->curse_flags |= (TRC_CURSED);
3624 o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
3625 o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
3626 if (power > 0) power = 0 - power;
3631 case SV_AMULET_MAGIC_MASTERY:
3633 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
3639 o_ptr->ident |= (IDENT_BROKEN);
3642 o_ptr->curse_flags |= (TRC_CURSED);
3644 /* Reverse bonuses */
3645 o_ptr->pval = 0 - o_ptr->pval;
3651 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3652 || (power > 2)) /* power > 2 is debug only */
3654 o_ptr->pval = MIN(o_ptr->pval, 4);
3655 /* Randart amulet */
3656 create_artifact(o_ptr, FALSE);
3658 else if ((power == 2) && one_in_(2))
3660 while(!o_ptr->name2)
3662 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3663 switch(randint1(21))
3666 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3667 o_ptr->name2 = EGO_AMU_SLOW_D;
3670 if (o_ptr->pval) break;
3671 o_ptr->name2 = EGO_AMU_INFRA;
3674 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3675 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3678 if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
3679 o_ptr->name2 = EGO_AMU_HOLD_EXP;
3682 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3683 o_ptr->name2 = EGO_AMU_LEVITATION;
3685 case 10: case 11: case 21:
3686 o_ptr->name2 = EGO_AMU_AC;
3689 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3690 if (m_bonus(10, level) > 8)
3691 o_ptr->name2 = EGO_AMU_RES_FIRE_;
3693 o_ptr->name2 = EGO_AMU_RES_FIRE;
3696 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3697 if (m_bonus(10, level) > 8)
3698 o_ptr->name2 = EGO_AMU_RES_COLD_;
3700 o_ptr->name2 = EGO_AMU_RES_COLD;
3703 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3704 if (m_bonus(10, level) > 8)
3705 o_ptr->name2 = EGO_AMU_RES_ELEC_;
3707 o_ptr->name2 = EGO_AMU_RES_ELEC;
3710 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3711 if (m_bonus(10, level) > 8)
3712 o_ptr->name2 = EGO_AMU_RES_ACID_;
3714 o_ptr->name2 = EGO_AMU_RES_ACID;
3716 case 16: case 17: case 18: case 19: case 20:
3717 switch (o_ptr->sval)
3719 case SV_AMULET_TELEPORT:
3720 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3721 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3722 else o_ptr->name2 = EGO_AMU_TELEPORT;
3724 case SV_AMULET_RESIST_ACID:
3725 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3727 case SV_AMULET_SEARCHING:
3728 o_ptr->name2 = EGO_AMU_STEALTH;
3730 case SV_AMULET_BRILLIANCE:
3731 if (!one_in_(3)) break;
3732 o_ptr->name2 = EGO_AMU_IDENT;
3734 case SV_AMULET_CHARISMA:
3735 if (!one_in_(3)) break;
3736 o_ptr->name2 = EGO_AMU_CHARM;
3738 case SV_AMULET_THE_MAGI:
3739 if (one_in_(2)) break;
3740 o_ptr->name2 = EGO_AMU_GREAT;
3742 case SV_AMULET_RESISTANCE:
3743 if (!one_in_(5)) break;
3744 o_ptr->name2 = EGO_AMU_DEFENDER;
3746 case SV_AMULET_TELEPATHY:
3747 if (!one_in_(3)) break;
3748 o_ptr->name2 = EGO_AMU_DETECTION;
3753 o_ptr->curse_flags = 0L;
3755 else if ((power == -2) && one_in_(2))
3757 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3758 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3759 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3760 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3761 o_ptr->art_flags[0] = 0;
3762 o_ptr->art_flags[1] = 0;
3763 while(!o_ptr->name2)
3765 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3769 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3770 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3773 o_ptr->name2 = EGO_AMU_FOOL;
3776 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3777 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3780 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3781 o_ptr->name2 = EGO_AMU_TY_CURSE;
3784 o_ptr->name2 = EGO_AMU_NAIVETY;
3789 o_ptr->ident |= (IDENT_BROKEN);
3792 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3800 * @brief モンスターが人形のベースにできるかを返す
3801 * @param r_idx チェックしたいモンスター種族のID
3802 * @return 人形にできるならTRUEを返す
3804 static bool item_monster_okay(MONRACE_IDX r_idx)
3806 monster_race *r_ptr = &r_info[r_idx];
3809 if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
3810 if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
3811 if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
3812 if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
3813 if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
3814 if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
3821 * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
3822 * Apply magic to an item known to be "boring"
3823 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
3824 * @param level 生成基準階
3825 * @param power 生成ランク
3828 * Hack -- note the special code for various items
3830 static void a_m_aux_4(object_type *o_ptr, DEPTH level, int power)
3832 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3837 /* Apply magic (good or bad) according to type */
3838 switch (o_ptr->tval)
3847 o_ptr->ident |= (IDENT_BROKEN);
3850 o_ptr->curse_flags |= (TRC_CURSED);
3857 o_ptr->xtra4 = o_ptr->pval;
3863 /* Hack -- Torches -- random fuel */
3864 if (o_ptr->sval == SV_LITE_TORCH)
3866 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
3870 /* Hack -- Lanterns -- random fuel */
3871 if (o_ptr->sval == SV_LITE_LANTERN)
3873 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
3877 if (power > 2) /* power > 2 is debug only */
3879 create_artifact(o_ptr, FALSE);
3881 else if ((power == 2) || ((power == 1) && one_in_(3)))
3883 while (!o_ptr->name2)
3887 bool okay_flag = TRUE;
3889 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
3891 switch (o_ptr->name2)
3894 if (o_ptr->sval == SV_LITE_FEANOR)
3902 else if (power == -2)
3904 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
3906 switch (o_ptr->name2)
3908 case EGO_LITE_DARKNESS:
3911 if (o_ptr->sval == SV_LITE_TORCH)
3913 add_flag(o_ptr->art_flags, TR_LITE_M1);
3915 else if (o_ptr->sval == SV_LITE_LANTERN)
3917 add_flag(o_ptr->art_flags, TR_LITE_M2);
3919 else if (o_ptr->sval == SV_LITE_FEANOR)
3921 add_flag(o_ptr->art_flags, TR_LITE_M3);
3933 /* The wand or staff gets a number of initial charges equal
3934 * to between 1/2 (+1) and the full object kind's pval. -LM-
3936 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
3942 /* Transfer the pval. -LM- */
3943 o_ptr->pval = k_ptr->pval;
3950 object_aware(o_ptr);
3951 object_known(o_ptr);
3957 PARAMETER_VALUE i = 1;
3960 monster_race *r_ptr;
3962 /* Pick a random non-unique monster race */
3965 i = randint1(max_r_idx - 1);
3967 if (!item_monster_okay(i)) continue;
3968 if (i == MON_TSUCHINOKO) continue;
3972 check = (current_floor_ptr->dun_level < r_ptr->level) ? (r_ptr->level - current_floor_ptr->dun_level) : 0;
3974 /* Ignore dead monsters */
3975 if (!r_ptr->rarity) continue;
3977 /* Ignore uncommon monsters */
3978 if (r_ptr->rarity > 100) continue;
3980 /* Prefer less out-of-depth monsters */
3981 if (randint0(check)) continue;
3988 /* Some figurines are cursed */
3989 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
3996 PARAMETER_VALUE i = 1;
4001 monster_race *r_ptr;
4003 if (o_ptr->sval == SV_SKELETON)
4005 match = RF9_DROP_SKELETON;
4007 else if (o_ptr->sval == SV_CORPSE)
4009 match = RF9_DROP_CORPSE;
4012 /* Hack -- Remove the monster restriction */
4013 get_mon_num_prep(item_monster_okay, NULL);
4015 /* Pick a random non-unique monster race */
4018 i = get_mon_num(current_floor_ptr->dun_level);
4022 check = (current_floor_ptr->dun_level < r_ptr->level) ? (r_ptr->level - current_floor_ptr->dun_level) : 0;
4024 /* Ignore dead monsters */
4025 if (!r_ptr->rarity) continue;
4027 /* Ignore corpseless monsters */
4028 if (!(r_ptr->flags9 & match)) continue;
4030 /* Prefer less out-of-depth monsters */
4031 if (randint0(check)) continue;
4039 object_aware(o_ptr);
4040 object_known(o_ptr);
4046 PARAMETER_VALUE i = 1;
4048 monster_race *r_ptr;
4050 /* Pick a random monster race */
4053 i = randint1(max_r_idx - 1);
4057 /* Ignore dead monsters */
4058 if (!r_ptr->rarity) continue;
4067 msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
4069 object_aware(o_ptr);
4070 object_known(o_ptr);
4077 DEPTH obj_level = k_info[o_ptr->k_idx].level;
4079 /* Hack -- skip ruined chests */
4080 if (obj_level <= 0) break;
4082 /* Hack -- pick a "difficulty" */
4083 o_ptr->pval = randint1(obj_level);
4084 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4086 o_ptr->xtra3 = current_floor_ptr->dun_level + 5;
4088 /* Never exceed "difficulty" of 55 to 59 */
4089 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4097 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
4098 * Complete the "creation" of an object by applying "magic" to the item
4099 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
4101 * @param mode 生成オプション
4104 * This includes not only rolling for random bonuses, but also putting the\n
4105 * finishing touches on ego-items and artifacts, giving charges to wands and\n
4106 * staffs, giving fuel to lites, and placing traps on chests.\n
4108 * In particular, note that "Instant Artifacts", if "created" by an external\n
4109 * routine, must pass through this function to complete the actual creation.\n
4111 * The base "chance" of the item being "good" increases with the "level"\n
4112 * parameter, which is usually derived from the dungeon level, being equal\n
4113 * to the level plus 10, up to a maximum of 75. If "good" is true, then\n
4114 * the object is guaranteed to be "good". If an object is "good", then\n
4115 * the chance that the object will be "great" (ego-item or artifact), also\n
4116 * increases with the "level", being equal to half the level, plus 5, up to\n
4117 * a maximum of 20. If "great" is true, then the object is guaranteed to be\n
4118 * "great". At dungeon level 65 and below, 15/100 objects are "great".\n
4120 * If the object is not "good", there is a chance it will be "cursed", and\n
4121 * if it is "cursed", there is a chance it will be "broken". These chances\n
4122 * are related to the "good" / "great" chances above.\n
4124 * Otherwise "normal" rings and amulets will be "good" half the time and\n
4125 * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4127 * If "okay" is true, and the object is going to be "great", then there is\n
4128 * a chance that an artifact will be created. This is true even if both the\n
4129 * "good" and "great" arguments are false. As a total hack, if "great" is\n
4130 * true, then the item gets 3 extra "attempts" to become an artifact.\n
4132 void apply_magic(object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
4134 int i, rolls, f1, f2, power;
4136 if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4138 /* Maximum "level" for various things */
4139 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4141 /* Base chance of being "good" */
4144 /* Maximal chance of being "good" */
4145 if (f1 > d_info[p_ptr->dungeon_idx].obj_good) f1 = d_info[p_ptr->dungeon_idx].obj_good;
4147 /* Base chance of being "great" */
4150 /* Maximal chance of being "great" */
4151 if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[p_ptr->dungeon_idx].obj_great))
4152 f2 = d_info[p_ptr->dungeon_idx].obj_great;
4154 if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4159 else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4168 /* Roll for "good" */
4169 if ((mode & AM_GOOD) || magik(f1))
4174 /* Roll for "great" */
4175 if ((mode & AM_GREAT) || magik(f2))
4179 /* Roll for "special" */
4180 if (mode & AM_SPECIAL) power = 3;
4184 /* Roll for "cursed" */
4187 /* Assume "cursed" */
4190 /* Roll for "broken" */
4191 if (magik(f2)) power = -2;
4195 if (mode & AM_CURSED)
4197 /* Assume 'cursed' */
4202 /* Everything else gets more badly cursed */
4209 /* Assume no rolls */
4212 /* Get one roll if excellent */
4213 if (power >= 2) rolls = 1;
4215 /* Hack -- Get four rolls if forced great or special */
4216 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4218 /* Hack -- Get no rolls if not allowed */
4219 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4221 /* Roll for artifacts if allowed */
4222 for (i = 0; i < rolls; i++)
4224 /* Roll for an artifact */
4225 if (make_artifact(o_ptr)) break;
4226 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4228 if (make_artifact(o_ptr)) break;
4233 /* Hack -- analyze artifacts */
4234 if (object_is_fixed_artifact(o_ptr))
4236 artifact_type *a_ptr = &a_info[o_ptr->name1];
4238 /* Hack -- Mark the artifact as "created" */
4241 /* Hack -- Memorize location of artifact in saved floors */
4242 if (character_dungeon)
4243 a_ptr->floor_id = p_ptr->floor_id;
4245 /* Extract the other fields */
4246 o_ptr->pval = a_ptr->pval;
4247 o_ptr->ac = a_ptr->ac;
4248 o_ptr->dd = a_ptr->dd;
4249 o_ptr->ds = a_ptr->ds;
4250 o_ptr->to_a = a_ptr->to_a;
4251 o_ptr->to_h = a_ptr->to_h;
4252 o_ptr->to_d = a_ptr->to_d;
4253 o_ptr->weight = a_ptr->weight;
4254 o_ptr->xtra2 = a_ptr->act_idx;
4256 if (o_ptr->name1 == ART_MILIM)
4258 if(p_ptr->pseikaku == SEIKAKU_SEXY)
4264 /* Hack -- extract the "broken" flag */
4265 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4267 /* Hack -- extract the "cursed" flag */
4268 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4269 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4270 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4271 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4272 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4273 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4278 switch (o_ptr->tval)
4287 if (power) a_m_aux_1(o_ptr, lev, power);
4293 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4299 if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4313 /* Elven Cloak and Black Clothes ... */
4314 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4315 ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4316 o_ptr->pval = randint1(4);
4320 ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4321 ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4322 ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4323 ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4324 a_m_aux_2(o_ptr, lev, power);
4326 if (power) a_m_aux_2(o_ptr, lev, power);
4334 if (!power && (randint0(100) < 50)) power = -1;
4335 a_m_aux_3(o_ptr, lev, power);
4341 a_m_aux_4(o_ptr, lev, power);
4346 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4347 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4348 (p_ptr->pseikaku == SEIKAKU_SEXY))
4351 add_flag(o_ptr->art_flags, TR_STR);
4352 add_flag(o_ptr->art_flags, TR_INT);
4353 add_flag(o_ptr->art_flags, TR_WIS);
4354 add_flag(o_ptr->art_flags, TR_DEX);
4355 add_flag(o_ptr->art_flags, TR_CON);
4356 add_flag(o_ptr->art_flags, TR_CHR);
4359 /* Hack -- analyze ego-items */
4360 if (object_is_ego(o_ptr))
4362 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4364 /* Hack -- acquire "broken" flag */
4365 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4367 /* Hack -- acquire "cursed" flag */
4368 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4369 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4370 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4371 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4372 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4373 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4375 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4376 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4377 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4378 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4379 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4380 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4381 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4382 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4388 while (one_in_(o_ptr->dd));
4390 if (o_ptr->dd > 9) o_ptr->dd = 9;
4393 /* Hack -- apply activatin index if needed */
4394 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
4396 /* Hack -- apply extra penalties if needed */
4397 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4399 /* Hack -- obtain bonuses */
4400 if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4401 if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4402 if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4404 /* Hack -- obtain pval */
4405 if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4408 /* Hack -- apply extra bonuses if needed */
4411 /* Hack -- obtain bonuses */
4412 if (e_ptr->max_to_h)
4414 if (e_ptr->max_to_h > 127)
4415 o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4416 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4418 if (e_ptr->max_to_d)
4420 if (e_ptr->max_to_d > 127)
4421 o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4422 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4424 if (e_ptr->max_to_a)
4426 if (e_ptr->max_to_a > 127)
4427 o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4428 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4431 /* Accuracy ego must have high to_h */
4432 if(o_ptr->name2 == EGO_ACCURACY)
4434 while(o_ptr->to_h < o_ptr->to_d + 10)
4439 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4442 /* Accuracy ego must have high to_h */
4443 if(o_ptr->name2 == EGO_VELOCITY)
4445 while(o_ptr->to_d < o_ptr->to_h + 10)
4450 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4453 /* Protection ego must have high to_a */
4454 if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4456 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4459 /* Hack -- obtain pval */
4460 if (e_ptr->max_pval)
4462 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4465 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4467 else if (o_ptr->name2 == EGO_DEMON)
4469 if(have_flag(o_ptr->art_flags, TR_BLOWS))
4471 o_ptr->pval += randint1(2);
4475 o_ptr->pval += randint1(e_ptr->max_pval);
4478 else if (o_ptr->name2 == EGO_ATTACKS)
4480 o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4481 if (o_ptr->pval > 3) o_ptr->pval = 3;
4482 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4483 o_ptr->pval += randint1(2);
4485 else if (o_ptr->name2 == EGO_BAT)
4487 o_ptr->pval = randint1(e_ptr->max_pval);
4488 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4490 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4492 o_ptr->pval = randint1(e_ptr->max_pval);
4496 o_ptr->pval += randint1(e_ptr->max_pval);
4501 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4503 o_ptr->pval = randint1(o_ptr->pval);
4505 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4512 /* Examine real objects */
4515 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4517 /* Hack -- acquire "broken" flag */
4518 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4520 /* Hack -- acquire "cursed" flag */
4521 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4522 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4523 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4524 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4525 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4526 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4534 * @brief ベースアイテムが上質として扱われるかどうかを返す。
4535 * Hack -- determine if a template is "good"
4536 * @param k_idx 判定したいベースアイテムのID
4537 * @return ベースアイテムが上質ならばTRUEを返す。
4539 static bool kind_is_good(KIND_OBJECT_IDX k_idx)
4541 object_kind *k_ptr = &k_info[k_idx];
4543 /* Analyze the item type */
4544 switch (k_ptr->tval)
4546 /* Armor -- Good unless damaged */
4557 if (k_ptr->to_a < 0) return (FALSE);
4561 /* Weapons -- Good unless damaged */
4568 if (k_ptr->to_h < 0) return (FALSE);
4569 if (k_ptr->to_d < 0) return (FALSE);
4573 /* Ammo -- Arrows/Bolts are good */
4580 /* Books -- High level books are good (except Arcane books) */
4582 case TV_SORCERY_BOOK:
4583 case TV_NATURE_BOOK:
4588 case TV_DAEMON_BOOK:
4589 case TV_CRUSADE_BOOK:
4591 case TV_HISSATSU_BOOK:
4594 if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4598 /* Rings -- Rings of Speed are good */
4601 if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4602 if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4606 /* Amulets -- Amulets of the Magi and Resistance are good */
4609 if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4610 if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4615 /* Assume not good */
4620 * @brief 生成階に応じたベースアイテムの生成を行う。
4621 * Attempt to make an object (normal or good/great)
4622 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4623 * @param mode オプションフラグ
4624 * @return 生成に成功したらTRUEを返す。
4626 * This routine plays nasty games to generate the "special artifacts".\n
4627 * This routine uses "current_floor_ptr->object_level" for the "generation level".\n
4628 * We assume that the given object has been "wiped".\n
4630 bool make_object(object_type *j_ptr, BIT_FLAGS mode)
4636 /* Chance of "special object" */
4637 prob = ((mode & AM_GOOD) ? 10 : 1000);
4639 /* Base level for the object */
4640 base = ((mode & AM_GOOD) ? (current_floor_ptr->object_level + 10) : current_floor_ptr->object_level);
4643 /* Generate a special object, or a normal object */
4644 if (!one_in_(prob) || !make_artifact_special(j_ptr))
4646 KIND_OBJECT_IDX k_idx;
4649 if ((mode & AM_GOOD) && !get_obj_num_hook)
4651 /* Activate restriction (if already specified, use that) */
4652 get_obj_num_hook = kind_is_good;
4655 /* Restricted objects - prepare allocation table */
4656 if (get_obj_num_hook) get_obj_num_prep();
4658 /* Pick a random object */
4659 k_idx = get_obj_num(base);
4661 /* Restricted objects */
4662 if (get_obj_num_hook)
4664 /* Clear restriction */
4665 get_obj_num_hook = NULL;
4667 /* Reset allocation table to default */
4671 /* Handle failure */
4672 if (!k_idx) return (FALSE);
4674 /* Prepare the object */
4675 object_prep(j_ptr, k_idx);
4678 /* Apply magic (allow artifacts) */
4679 apply_magic(j_ptr, current_floor_ptr->object_level, mode);
4681 /* Hack -- generate multiple spikes/missiles */
4682 switch (j_ptr->tval)
4690 j_ptr->number = (byte)damroll(6, 7);
4694 if (cheat_peek) object_mention(j_ptr);
4702 * @brief フロアの指定位置に生成階に応じたベースアイテムの生成を行う。
4703 * Attempt to place an object (normal or good/great) at the given location.
4704 * @param y 配置したいフロアのY座標
4705 * @param x 配置したいフロアのX座標
4706 * @param mode オプションフラグ
4707 * @return 生成に成功したらTRUEを返す。
4709 * This routine plays nasty games to generate the "special artifacts".\n
4710 * This routine uses "current_floor_ptr->object_level" for the "generation level".\n
4711 * This routine requires a clean floor grid destination.\n
4713 void place_object(POSITION y, POSITION x, BIT_FLAGS mode)
4718 grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x];
4724 /* Paranoia -- check bounds */
4725 if (!in_bounds(y, x)) return;
4727 /* Require floor space */
4728 if (!cave_drop_bold(y, x)) return;
4730 /* Avoid stacking on other objects */
4731 if (g_ptr->o_idx) return;
4736 /* Make an object (if possible) */
4737 if (!make_object(q_ptr, mode)) return;
4740 /* Make an object */
4747 o_ptr = ¤t_floor_ptr->o_list[o_idx];
4749 /* Structure Copy */
4750 object_copy(o_ptr, q_ptr);
4756 o_ptr->next_o_idx = g_ptr->o_idx;
4758 /* Place the object */
4759 g_ptr->o_idx = o_idx;
4767 /* Hack -- Preserve artifacts */
4768 if (object_is_fixed_artifact(q_ptr))
4770 a_info[q_ptr->name1].cur_num = 0;
4777 * @brief 生成階に応じた財宝オブジェクトの生成を行う。
4778 * Make a treasure object
4779 * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
4780 * @return 生成に成功したらTRUEを返す。
4782 * The location must be a legal, clean, floor grid.
4784 bool make_gold(object_type *j_ptr)
4789 /* Hack -- Pick a Treasure variety */
4790 i = ((randint1(current_floor_ptr->object_level + 2) + 2) / 2) - 1;
4792 /* Apply "extra" magic */
4793 if (one_in_(GREAT_OBJ))
4795 i += randint1(current_floor_ptr->object_level + 1);
4798 /* Hack -- Creeping Coins only generate "themselves" */
4799 if (coin_type) i = coin_type;
4801 /* Do not create "illegal" Treasure Types */
4802 if (i >= MAX_GOLD) i = MAX_GOLD - 1;
4804 /* Prepare a gold object */
4805 object_prep(j_ptr, OBJ_GOLD_LIST + i);
4807 /* Hack -- Base coin cost */
4808 base = k_info[OBJ_GOLD_LIST + i].cost;
4810 /* Determine how much the treasure is "worth" */
4811 j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
4819 * @brief フロアの指定位置に生成階に応じた財宝オブジェクトの生成を行う。
4820 * Places a treasure (Gold or Gems) at given location
4821 * @param y 配置したいフロアのY座標
4822 * @param x 配置したいフロアのX座標
4823 * @return 生成に成功したらTRUEを返す。
4825 * The location must be a legal, clean, floor grid.
4827 void place_gold(POSITION y, POSITION x)
4832 grid_type *g_ptr = ¤t_floor_ptr->grid_array[y][x];
4838 /* Paranoia -- check bounds */
4839 if (!in_bounds(y, x)) return;
4841 /* Require floor space */
4842 if (!cave_drop_bold(y, x)) return;
4844 /* Avoid stacking on other objects */
4845 if (g_ptr->o_idx) return;
4850 /* Make some gold */
4851 if (!make_gold(q_ptr)) return;
4853 /* Make an object */
4860 o_ptr = ¤t_floor_ptr->o_list[o_idx];
4862 /* Copy the object */
4863 object_copy(o_ptr, q_ptr);
4870 o_ptr->next_o_idx = g_ptr->o_idx;
4872 /* Place the object */
4873 g_ptr->o_idx = o_idx;
4883 * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
4884 * Let an object fall to the ground at or near a location.
4885 * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
4886 * @param chance ドロップの成功率(%)
4887 * @param y 配置したいフロアのY座標
4888 * @param x 配置したいフロアのX座標
4889 * @return 生成に成功したらオブジェクトのIDを返す。
4891 * The initial location is assumed to be "in_bounds()".\n
4893 * This function takes a parameter "chance". This is the percentage\n
4894 * chance that the item will "disappear" instead of drop. If the object\n
4895 * has been thrown, then this is the chance of disappearance on contact.\n
4897 * Hack -- this function uses "chance" to determine if it should produce\n
4898 * some form of "description" of the drop event (under the player).\n
4900 * We check several locations to see if we can find a location at which\n
4901 * the object can combine, stack, or be placed. Artifacts will try very\n
4902 * hard to be placed, including "teleporting" to a useful grid if needed.\n
4904 OBJECT_IDX drop_near(object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
4911 POSITION ty, tx = 0;
4913 OBJECT_IDX o_idx = 0;
4914 OBJECT_IDX this_o_idx, next_o_idx = 0;
4918 GAME_TEXT o_name[MAX_NLEN];
4924 /* Extract plural */
4925 bool plural = (j_ptr->number != 1);
4928 /* Describe object */
4929 object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
4932 /* Handle normal "breakage" */
4933 if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
4936 msg_format("%sは消えた。", o_name);
4938 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
4941 if (p_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
4958 /* Scan local grids */
4959 for (dy = -3; dy <= 3; dy++)
4961 /* Scan local grids */
4962 for (dx = -3; dx <= 3; dx++)
4966 /* Calculate actual distance */
4967 d = (dy * dy) + (dx * dx);
4969 /* Ignore distant grids */
4970 if (d > 10) continue;
4975 /* Skip illegal grids */
4976 if (!in_bounds(ty, tx)) continue;
4978 /* Require line of projection */
4979 if (!projectable(y, x, ty, tx)) continue;
4982 g_ptr = ¤t_floor_ptr->grid_array[ty][tx];
4984 /* Require floor space */
4985 if (!cave_drop_bold(ty, tx)) continue;
4990 /* Scan objects in that grid */
4991 for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
4994 o_ptr = ¤t_floor_ptr->o_list[this_o_idx];
4995 next_o_idx = o_ptr->next_o_idx;
4997 /* Check for possible combination */
4998 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5004 /* Add new object */
5008 if (k > 99) continue;
5010 /* Calculate score */
5011 s = 1000 - (d + k * 5);
5013 /* Skip bad values */
5014 if (s < bs) continue;
5016 /* New best value */
5019 /* Apply the randomizer to equivalent values */
5020 if ((++bn >= 2) && !one_in_(bn)) continue;
5034 /* Handle lack of space */
5035 if (!flag && !object_is_artifact(j_ptr))
5038 msg_format("%sは消えた。", o_name);
5040 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5045 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5053 for (i = 0; !flag && (i < 1000); i++)
5056 ty = rand_spread(by, 1);
5057 tx = rand_spread(bx, 1);
5059 /* Verify location */
5060 if (!in_bounds(ty, tx)) continue;
5062 /* Bounce to that location */
5066 /* Require floor space */
5067 if (!cave_drop_bold(by, bx)) continue;
5075 int candidates = 0, pick;
5077 for (ty = 1; ty < current_floor_ptr->height - 1; ty++)
5079 for (tx = 1; tx < current_floor_ptr->width - 1; tx++)
5081 /* A valid space found */
5082 if (cave_drop_bold(ty, tx)) candidates++;
5086 /* No valid place! */
5090 msg_format("%sは消えた。", o_name);
5092 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5096 if (p_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
5098 /* Mega-Hack -- preserve artifacts */
5101 /* Hack -- Preserve unknown artifacts */
5102 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5104 /* Mega-Hack -- Preserve the artifact */
5105 a_info[j_ptr->name1].cur_num = 0;
5113 /* Choose a random one */
5114 pick = randint1(candidates);
5116 for (ty = 1; ty < current_floor_ptr->height - 1; ty++)
5118 for (tx = 1; tx < current_floor_ptr->width - 1; tx++)
5120 if (cave_drop_bold(ty, tx))
5124 /* Is this a picked one? */
5137 g_ptr = ¤t_floor_ptr->grid_array[by][bx];
5139 /* Scan objects in that grid for combination */
5140 for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5143 o_ptr = ¤t_floor_ptr->o_list[this_o_idx];
5144 next_o_idx = o_ptr->next_o_idx;
5146 /* Check for combination */
5147 if (object_similar(o_ptr, j_ptr))
5149 object_absorb(o_ptr, j_ptr);
5158 if (!done) o_idx = o_pop();
5161 if (!done && !o_idx)
5164 msg_format("%sは消えた。", o_name);
5166 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5170 if (p_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
5172 /* Hack -- Preserve artifacts */
5173 if (object_is_fixed_artifact(j_ptr))
5175 a_info[j_ptr->name1].cur_num = 0;
5185 /* Structure copy */
5186 object_copy(¤t_floor_ptr->o_list[o_idx], j_ptr);
5188 /* Access new object */
5189 j_ptr = ¤t_floor_ptr->o_list[o_idx];
5196 j_ptr->held_m_idx = 0;
5199 j_ptr->next_o_idx = g_ptr->o_idx;
5201 /* Place the object */
5202 g_ptr->o_idx = o_idx;
5212 /* Mega-Hack -- no message if "dropped" by player */
5213 /* Message when an object falls under the player */
5214 if (chance && player_bold(by, bx))
5216 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
5223 * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
5224 * Describe the charges on an item in the inventory.
5225 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5228 void inven_item_charges(INVENTORY_IDX item)
5230 object_type *o_ptr = &inventory[item];
5232 /* Require staff/wand */
5233 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5235 /* Require known item */
5236 if (!object_is_known(o_ptr)) return;
5239 if (o_ptr->pval <= 0)
5241 msg_print("もう魔力が残っていない。");
5245 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
5248 /* Multiple charges */
5249 if (o_ptr->pval != 1)
5251 msg_format("You have %d charges remaining.", o_ptr->pval);
5257 msg_format("You have %d charge remaining.", o_ptr->pval);
5264 * @brief アイテムの残り所持数メッセージを表示する /
5265 * Describe an item in the inventory.
5266 * @param item 残量を表示したいプレイヤーのアイテム所持スロット
5269 void inven_item_describe(INVENTORY_IDX item)
5271 object_type *o_ptr = &inventory[item];
5272 GAME_TEXT o_name[MAX_NLEN];
5274 object_desc(o_name, o_ptr, 0);
5277 /* "no more" の場合はこちらで表示する */
5278 if (o_ptr->number <= 0)
5280 /*FIRST*//*ここはもう通らないかも */
5281 msg_format("もう%sを持っていない。", o_name);
5285 /* アイテム名を英日切り替え機能対応 */
5286 msg_format("まだ %sを持っている。", o_name);
5289 msg_format("You have %s.", o_name);
5295 * @brief アイテムを増減させ残り所持数メッセージを表示する /
5296 * Increase the "number" of an item in the inventory
5297 * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
5301 void inven_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
5303 object_type *o_ptr = &inventory[item];
5306 num += o_ptr->number;
5309 if (num > 255) num = 255;
5310 else if (num < 0) num = 0;
5313 num -= o_ptr->number;
5315 /* Change the number and weight */
5318 /* Add the number */
5319 o_ptr->number += num;
5321 /* Add the weight */
5322 p_ptr->total_weight += (num * o_ptr->weight);
5323 p_ptr->update |= (PU_BONUS);
5325 /* Recalculate mana XXX */
5326 p_ptr->update |= (PU_MANA);
5327 p_ptr->update |= (PU_COMBINE);
5328 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5330 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5331 if (!o_ptr->number && p_ptr->ele_attack)
5333 if ((item == INVEN_RARM) || (item == INVEN_LARM))
5335 if (!has_melee_weapon(INVEN_RARM + INVEN_LARM - item))
5337 /* Clear all temporary elemental brands */
5338 set_ele_attack(0, 0);
5346 * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
5347 * Erase an inventory slot if it has no more items
5348 * @param item 消去したいプレイヤーのアイテム所持スロット
5351 void inven_item_optimize(INVENTORY_IDX item)
5353 object_type *o_ptr = &inventory[item];
5355 /* Only optimize real items */
5356 if (!o_ptr->k_idx) return;
5358 /* Only optimize empty items */
5359 if (o_ptr->number) return;
5361 /* The item is in the pack */
5362 if (item < INVEN_RARM)
5369 /* Slide everything down */
5370 for (i = item; i < INVEN_PACK; i++)
5372 /* Structure copy */
5373 inventory[i] = inventory[i+1];
5376 /* Erase the "final" slot */
5377 object_wipe(&inventory[i]);
5379 p_ptr->window |= (PW_INVEN);
5382 /* The item is being wielded */
5388 /* Erase the empty slot */
5389 object_wipe(&inventory[item]);
5390 p_ptr->update |= (PU_BONUS);
5392 p_ptr->update |= (PU_TORCH);
5394 /* Recalculate mana XXX */
5395 p_ptr->update |= (PU_MANA);
5397 p_ptr->window |= (PW_EQUIP);
5400 p_ptr->window |= (PW_SPELL);
5404 * @brief 床上の魔道具の残り残量メッセージを表示する /
5405 * Describe the charges on an item on the floor.
5406 * @param item メッセージの対象にしたいアイテム所持スロット
5409 void floor_item_charges(INVENTORY_IDX item)
5411 object_type *o_ptr = ¤t_floor_ptr->o_list[item];
5413 /* Require staff/wand */
5414 if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5416 /* Require known item */
5417 if (!object_is_known(o_ptr)) return;
5420 if (o_ptr->pval <= 0)
5422 msg_print("この床上のアイテムは、もう魔力が残っていない。");
5426 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
5429 /* Multiple charges */
5430 if (o_ptr->pval != 1)
5432 msg_format("There are %d charges remaining.", o_ptr->pval);
5438 msg_format("There is %d charge remaining.", o_ptr->pval);
5445 * @brief 床上のアイテムの残り数メッセージを表示する /
5446 * Describe the charges on an item on the floor.
5447 * @param item メッセージの対象にしたいアイテム所持スロット
5450 void floor_item_describe(INVENTORY_IDX item)
5452 object_type *o_ptr = ¤t_floor_ptr->o_list[item];
5453 GAME_TEXT o_name[MAX_NLEN];
5455 object_desc(o_name, o_ptr, 0);
5458 /* "no more" の場合はこちらで表示を分ける */
5459 if (o_ptr->number <= 0)
5461 msg_format("床上には、もう%sはない。", o_name);
5465 msg_format("床上には、まだ %sがある。", o_name);
5468 msg_format("You see %s.", o_name);
5475 * @brief 床上のアイテムの数を増やす /
5476 * Increase the "number" of an item on the floor
5477 * @param item 増やしたいアイテムの所持スロット
5478 * @param num 増やしたいアイテムの数
5481 void floor_item_increase(INVENTORY_IDX item, ITEM_NUMBER num)
5483 object_type *o_ptr = ¤t_floor_ptr->o_list[item];
5486 num += o_ptr->number;
5489 if (num > 255) num = 255;
5490 else if (num < 0) num = 0;
5493 num -= o_ptr->number;
5495 /* Change the number */
5496 o_ptr->number += num;
5501 * @brief 床上の数の無くなったアイテムスロットを消去する /
5502 * Optimize an item on the floor (destroy "empty" items)
5503 * @param item 消去したいアイテムの所持スロット
5506 void floor_item_optimize(INVENTORY_IDX item)
5508 object_type *o_ptr = ¤t_floor_ptr->o_list[item];
5510 /* Paranoia -- be sure it exists */
5511 if (!o_ptr->k_idx) return;
5513 /* Only optimize empty items */
5514 if (o_ptr->number) return;
5516 delete_object_idx(item);
5521 * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
5522 * Check if we have space for an item in the pack without overflow
5523 * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
5524 * @return 溢れずに済むならTRUEを返す
5526 bool inven_carry_okay(object_type *o_ptr)
5531 if (inven_cnt < INVEN_PACK) return (TRUE);
5534 for (j = 0; j < INVEN_PACK; j++)
5536 object_type *j_ptr = &inventory[j];
5538 /* Skip non-objects */
5539 if (!j_ptr->k_idx) continue;
5541 /* Check if the two items can be combined */
5542 if (object_similar(j_ptr, o_ptr)) return (TRUE);
5549 * @brief オブジェクトを定義された基準に従いソートするための関数 /
5550 * Check if we have space for an item in the pack without overflow
5551 * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
5552 * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
5553 * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
5554 * @return o_ptrの方が上位ならばTRUEを返す。
5556 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
5560 /* Use empty slots */
5561 if (!j_ptr->k_idx) return TRUE;
5563 /* Hack -- readable books always come first */
5564 if ((o_ptr->tval == REALM1_BOOK) &&
5565 (j_ptr->tval != REALM1_BOOK)) return TRUE;
5566 if ((j_ptr->tval == REALM1_BOOK) &&
5567 (o_ptr->tval != REALM1_BOOK)) return FALSE;
5569 if ((o_ptr->tval == REALM2_BOOK) &&
5570 (j_ptr->tval != REALM2_BOOK)) return TRUE;
5571 if ((j_ptr->tval == REALM2_BOOK) &&
5572 (o_ptr->tval != REALM2_BOOK)) return FALSE;
5574 /* Objects sort by decreasing type */
5575 if (o_ptr->tval > j_ptr->tval) return TRUE;
5576 if (o_ptr->tval < j_ptr->tval) return FALSE;
5578 /* Non-aware (flavored) items always come last */
5579 /* Can happen in the home */
5580 if (!object_is_aware(o_ptr)) return FALSE;
5581 if (!object_is_aware(j_ptr)) return TRUE;
5583 /* Objects sort by increasing sval */
5584 if (o_ptr->sval < j_ptr->sval) return TRUE;
5585 if (o_ptr->sval > j_ptr->sval) return FALSE;
5587 /* Unidentified objects always come last */
5588 /* Objects in the home can be unknown */
5589 if (!object_is_known(o_ptr)) return FALSE;
5590 if (!object_is_known(j_ptr)) return TRUE;
5592 /* Fixed artifacts, random artifacts and ego items */
5593 if (object_is_fixed_artifact(o_ptr)) o_type = 3;
5594 else if (o_ptr->art_name) o_type = 2;
5595 else if (object_is_ego(o_ptr)) o_type = 1;
5598 if (object_is_fixed_artifact(j_ptr)) j_type = 3;
5599 else if (j_ptr->art_name) j_type = 2;
5600 else if (object_is_ego(j_ptr)) j_type = 1;
5603 if (o_type < j_type) return TRUE;
5604 if (o_type > j_type) return FALSE;
5606 switch (o_ptr->tval)
5612 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
5613 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
5619 /* Objects sort by increasing hit/damage bonuses */
5620 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
5621 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
5624 /* Hack: otherwise identical rods sort by
5625 increasing recharge time --dsb */
5627 if (o_ptr->pval < j_ptr->pval) return TRUE;
5628 if (o_ptr->pval > j_ptr->pval) return FALSE;
5632 /* Objects sort by decreasing value */
5633 return o_value > object_value(j_ptr);
5638 * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
5639 * Add an item to the players inventory, and return the slot used.
5640 * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
5641 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
5643 * If the new item can combine with an existing item in the inventory,\n
5644 * it will do so, using "object_similar()" and "object_absorb()", else,\n
5645 * the item will be placed into the "proper" location in the inventory.\n
5647 * This function can be used to "over-fill" the player's pack, but only\n
5648 * once, and such an action must trigger the "overflow" code immediately.\n
5649 * Note that when the pack is being "over-filled", the new item must be\n
5650 * placed into the "overflow" slot, and the "overflow" must take place\n
5651 * before the pack is reordered, but (optionally) after the pack is\n
5652 * combined. This may be tricky. See "dungeon.c" for info.\n
5654 * Note that this code must remove any location/stack information\n
5655 * from the object once it is placed into the inventory.\n
5657 s16b inven_carry(object_type *o_ptr)
5659 INVENTORY_IDX i, j, k;
5660 INVENTORY_IDX n = -1;
5665 /* Check for combining */
5666 for (j = 0; j < INVEN_PACK; j++)
5668 j_ptr = &inventory[j];
5670 /* Skip non-objects */
5671 if (!j_ptr->k_idx) continue;
5673 /* Hack -- track last item */
5676 /* Check if the two items can be combined */
5677 if (object_similar(j_ptr, o_ptr))
5679 object_absorb(j_ptr, o_ptr);
5681 p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
5682 p_ptr->update |= (PU_BONUS);
5683 p_ptr->window |= (PW_INVEN);
5692 if (inven_cnt > INVEN_PACK) return (-1);
5694 /* Find an empty slot */
5695 for (j = 0; j <= INVEN_PACK; j++)
5697 j_ptr = &inventory[j];
5699 /* Use it if found */
5700 if (!j_ptr->k_idx) break;
5707 /* Reorder the pack */
5710 /* Get the "value" of the item */
5711 s32b o_value = object_value(o_ptr);
5713 /* Scan every occupied slot */
5714 for (j = 0; j < INVEN_PACK; j++)
5716 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
5723 for (k = n; k >= i; k--)
5725 /* Hack -- Slide the item */
5726 object_copy(&inventory[k+1], &inventory[k]);
5729 /* Wipe the empty slot */
5730 object_wipe(&inventory[i]);
5735 object_copy(&inventory[i], o_ptr);
5737 /* Access new object */
5738 j_ptr = &inventory[i];
5741 j_ptr->next_o_idx = 0;
5743 /* Forget monster */
5744 j_ptr->held_m_idx = 0;
5746 /* Forget location */
5747 j_ptr->iy = j_ptr->ix = 0;
5749 /* Player touches it, and no longer marked */
5750 j_ptr->marked = OM_TOUCHED;
5752 p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
5754 /* Count the items */
5756 p_ptr->update |= (PU_BONUS | PU_COMBINE | PU_REORDER);
5757 p_ptr->window |= (PW_INVEN);
5759 /* Return the slot */
5765 * @brief 装備スロットからオブジェクトを外すメインルーチン /
5766 * Take off (some of) a non-cursed equipment item
5767 * @param item オブジェクトを外したい所持テーブルのID
5769 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
5771 * Note that only one item at a time can be wielded per slot.\n
5772 * Note that taking off an item when "full" may cause that item\n
5773 * to fall to the ground.\n
5774 * Return the inventory slot into which the item is placed.\n
5776 INVENTORY_IDX inven_takeoff(INVENTORY_IDX item, ITEM_NUMBER amt)
5787 GAME_TEXT o_name[MAX_NLEN];
5790 /* Get the item to take off */
5791 o_ptr = &inventory[item];
5794 if (amt <= 0) return (-1);
5797 if (amt > o_ptr->number) amt = o_ptr->number;
5800 /* Obtain a local object */
5801 object_copy(q_ptr, o_ptr);
5803 /* Modify quantity */
5804 q_ptr->number = amt;
5806 object_desc(o_name, q_ptr, 0);
5808 /* Took off weapon */
5809 if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
5810 object_is_melee_weapon(o_ptr))
5812 act = _("を装備からはずした", "You were wielding");
5816 else if (item == INVEN_BOW)
5818 act = _("を装備からはずした", "You were holding");
5821 /* Took off light */
5822 else if (item == INVEN_LITE)
5824 act = _("を光源からはずした", "You were holding");
5827 /* Took off something */
5830 act = _("を装備からはずした", "You were wearing");
5833 /* Modify, Optimize */
5834 inven_item_increase(item, -amt);
5835 inven_item_optimize(item);
5837 /* Carry the object */
5838 slot = inven_carry(q_ptr);
5841 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
5843 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
5853 * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
5854 * Drop (some of) a non-cursed inventory/equipment item
5855 * @param item 所持テーブルのID
5856 * @param amt 落としたい個数
5859 * The object will be dropped "near" the current location
5861 void inven_drop(INVENTORY_IDX item, ITEM_NUMBER amt)
5867 GAME_TEXT o_name[MAX_NLEN];
5869 /* Access original object */
5870 o_ptr = &inventory[item];
5873 if (amt <= 0) return;
5876 if (amt > o_ptr->number) amt = o_ptr->number;
5878 /* Take off equipment */
5879 if (item >= INVEN_RARM)
5881 /* Take off first */
5882 item = inven_takeoff(item, amt);
5884 /* Access original object */
5885 o_ptr = &inventory[item];
5890 /* Obtain local object */
5891 object_copy(q_ptr, o_ptr);
5893 /* Distribute charges of wands or rods */
5894 distribute_charges(o_ptr, q_ptr, amt);
5896 /* Modify quantity */
5897 q_ptr->number = amt;
5899 /* Describe local object */
5900 object_desc(o_name, q_ptr, 0);
5902 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
5904 /* Drop it near the player */
5905 (void)drop_near(q_ptr, 0, p_ptr->y, p_ptr->x);
5907 /* Modify, Describe, Optimize */
5908 inven_item_increase(item, -amt);
5909 inven_item_describe(item);
5910 inven_item_optimize(item);
5915 * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
5916 * Combine items in the pack
5919 * Note special handling of the "overflow" slot
5921 void combine_pack(void)
5926 bool flag = FALSE, combined;
5932 /* Combine the pack (backwards) */
5933 for (i = INVEN_PACK; i > 0; i--)
5935 o_ptr = &inventory[i];
5937 /* Skip empty items */
5938 if (!o_ptr->k_idx) continue;
5940 /* Scan the items above that item */
5941 for (j = 0; j < i; j++)
5945 j_ptr = &inventory[j];
5947 /* Skip empty items */
5948 if (!j_ptr->k_idx) continue;
5951 * Get maximum number of the stack if these
5952 * are similar, get zero otherwise.
5954 max_num = object_similar_part(j_ptr, o_ptr);
5956 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
5957 if (max_num && j_ptr->number < max_num)
5959 if (o_ptr->number + j_ptr->number <= max_num)
5964 /* Add together the item counts */
5965 object_absorb(j_ptr, o_ptr);
5967 /* One object is gone */
5970 /* Slide everything down */
5971 for (k = i; k < INVEN_PACK; k++)
5973 /* Structure copy */
5974 inventory[k] = inventory[k+1];
5977 /* Erase the "final" slot */
5978 object_wipe(&inventory[k]);
5982 int old_num = o_ptr->number;
5983 int remain = j_ptr->number + o_ptr->number - max_num;
5985 o_ptr->number -= remain;
5987 /* Add together the item counts */
5988 object_absorb(j_ptr, o_ptr);
5990 o_ptr->number = remain;
5992 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
5993 if (o_ptr->tval == TV_ROD)
5995 o_ptr->pval = o_ptr->pval * remain / old_num;
5996 o_ptr->timeout = o_ptr->timeout * remain / old_num;
5999 /* Hack -- if wands are stacking, combine the charges. -LM- */
6000 if (o_ptr->tval == TV_WAND)
6002 o_ptr->pval = o_ptr->pval * remain / old_num;
6006 p_ptr->window |= (PW_INVEN);
6018 if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
6022 * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
6023 * Reorder items in the pack
6026 * Note special handling of the "overflow" slot
6028 void reorder_pack(void)
6038 /* Re-order the pack (forwards) */
6039 for (i = 0; i < INVEN_PACK; i++)
6041 /* Mega-Hack -- allow "proper" over-flow */
6042 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6044 o_ptr = &inventory[i];
6046 /* Skip empty slots */
6047 if (!o_ptr->k_idx) continue;
6049 /* Get the "value" of the item */
6050 o_value = object_value(o_ptr);
6052 /* Scan every occupied slot */
6053 for (j = 0; j < INVEN_PACK; j++)
6055 if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6058 /* Never move down */
6059 if (j >= i) continue;
6065 /* Save a copy of the moving item */
6066 object_copy(q_ptr, &inventory[i]);
6068 /* Slide the objects */
6069 for (k = i; k > j; k--)
6071 /* Slide the item */
6072 object_copy(&inventory[k], &inventory[k-1]);
6075 /* Insert the moving item */
6076 object_copy(&inventory[j], q_ptr);
6078 p_ptr->window |= (PW_INVEN);
6081 if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
6085 * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
6086 * Hack -- display an object kind in the current window
6087 * @param k_idx ベースアイテムの参照ID
6090 * Include list of usable spells for readible books
6092 void display_koff(KIND_OBJECT_IDX k_idx)
6099 REALM_IDX use_realm;
6101 GAME_TEXT o_name[MAX_NLEN];
6104 /* Erase the window */
6105 for (y = 0; y < Term->hgt; y++)
6107 /* Erase the line */
6108 Term_erase(0, y, 255);
6115 /* Prepare the object */
6116 object_prep(q_ptr, k_idx);
6117 object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6119 /* Mention the object name */
6120 Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6122 /* Access the item's sval */
6124 use_realm = tval2realm(q_ptr->tval);
6126 /* Warriors are illiterate */
6127 if (p_ptr->realm1 || p_ptr->realm2)
6129 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6133 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6134 if (!is_magic(use_realm)) return;
6135 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6138 /* Display spells in readible books */
6142 SPELL_IDX spells[64];
6144 /* Extract spells */
6145 for (spell = 0; spell < 32; spell++)
6147 /* Check for this spell */
6148 if (fake_spell_flags[sval] & (1L << spell))
6150 /* Collect this spell */
6151 spells[num++] = spell;
6156 print_spells(0, spells, num, 2, 0, use_realm);
6161 * @brief 警告を放つアイテムを選択する /
6162 * Choose one of items that have warning flag
6163 * Calculate spell damages
6166 object_type *choose_warning_item(void)
6169 int choices[INVEN_TOTAL - INVEN_RARM];
6172 /* Paranoia -- Player has no warning ability */
6173 if (!p_ptr->warning) return NULL;
6175 /* Search Inventory */
6176 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6178 BIT_FLAGS flgs[TR_FLAG_SIZE];
6179 object_type *o_ptr = &inventory[i];
6181 object_flags(o_ptr, flgs);
6182 if (have_flag(flgs, TR_WARNING))
6184 choices[number] = i;
6189 /* Choice one of them */
6190 return number ? &inventory[choices[randint0(number)]] : NULL;
6194 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する /
6195 * Calculate spell damages
6196 * @param m_ptr 魔法を行使するモンスターの構造体参照ポインタ
6197 * @param typ 効果属性のID
6199 * @param max 算出した最大ダメージを返すポインタ
6202 static void spell_damcalc(monster_type *m_ptr, EFFECT_ID typ, HIT_POINT dam, int *max)
6204 monster_race *r_ptr = &r_info[m_ptr->r_idx];
6205 int rlev = r_ptr->level;
6206 bool ignore_wraith_form = FALSE;
6208 /* Vulnerability, resistance and immunity */
6212 if (p_ptr->immune_elec)
6215 ignore_wraith_form = TRUE;
6219 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6220 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6221 if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6222 if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6223 if (IS_OPPOSE_ELEC())
6224 dam = (dam + 2) / 3;
6229 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6230 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6234 if (p_ptr->immune_acid)
6237 ignore_wraith_form = TRUE;
6241 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6242 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6243 if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6244 if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6250 if (p_ptr->immune_cold)
6253 ignore_wraith_form = TRUE;
6257 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6258 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6259 if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6260 if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6265 if (p_ptr->immune_fire)
6268 ignore_wraith_form = TRUE;
6272 if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6273 if (prace_is_(RACE_ENT)) dam += dam / 3;
6274 if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6275 if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6276 if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6281 ignore_wraith_form = TRUE;
6285 if (!p_ptr->blind &&
6286 ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6287 (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6290 ignore_wraith_form = TRUE;
6295 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6296 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6297 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6300 * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6301 * "dam *= 2;" for later "dam /= 2"
6303 if (p_ptr->wraith_form) dam *= 2;
6307 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6310 ignore_wraith_form = TRUE;
6312 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6316 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6320 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6324 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6328 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6332 if (prace_is_(RACE_SPECTRE))
6335 ignore_wraith_form = TRUE;
6337 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6341 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6345 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6349 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6353 if (p_ptr->levitation) dam = (dam * 2) / 3;
6357 if (p_ptr->resist_shard) dam /= 2;
6361 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
6362 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
6366 if (p_ptr->mimic_form)
6368 if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
6371 ignore_wraith_form = TRUE;
6376 switch (p_ptr->prace)
6385 ignore_wraith_form = TRUE;
6392 if (p_ptr->align > 10) dam /= 2;
6393 else if (p_ptr->align < -10) dam *= 2;
6397 if (p_ptr->align > 10) dam *= 2;
6401 case GF_BRAIN_SMASH:
6402 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
6405 ignore_wraith_form = TRUE;
6413 if (100 + rlev / 2 <= p_ptr->skill_sav)
6416 ignore_wraith_form = TRUE;
6421 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
6424 ignore_wraith_form = TRUE;
6429 if (p_ptr->wraith_form && !ignore_wraith_form)
6435 if (dam > *max) *max = dam;
6439 * @brief 警告基準を定めるために魔法の効果属性に基づいて最大魔法ダメージを計算する。 /
6440 * Calculate spell damages
6441 * @param spell_num RF4ならRF4_SPELL_STARTのように32区切りのベースとなる数値
6442 * @param typ 効果属性のID
6443 * @param m_idx 魔法を行使するモンスターのID
6444 * @param max 算出した最大ダメージを返すポインタ
6447 void spell_damcalc_by_spellnum(int spell_num, EFFECT_ID typ, MONSTER_IDX m_idx, int *max)
6449 monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
6450 HIT_POINT dam = monspell_damage((spell_num), m_idx, DAM_MAX);
6451 spell_damcalc(m_ptr, typ, dam, max);
6455 * @brief 警告基準を定めるためにモンスターの打撃最大ダメージを算出する /
6456 * Calculate blow damages
6457 * @param m_ptr 打撃を行使するモンスターの構造体参照ポインタ
6458 * @param blow_ptr モンスターの打撃能力の構造体参照ポインタ
6459 * @return 算出された最大ダメージを返す。
6461 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
6463 int dam = blow_ptr->d_dice * blow_ptr->d_side;
6465 bool check_wraith_form = TRUE;
6467 if (blow_ptr->method != RBM_EXPLODE)
6469 ARMOUR_CLASS ac = p_ptr->ac + p_ptr->to_a;
6471 switch (blow_ptr->effect)
6475 int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
6476 dam = MAX(dam, tmp_dam * 2);
6482 dam -= (dam * ((ac < 150) ? ac : 150) / 250);
6486 spell_damcalc(m_ptr, GF_ACID, dam, &dummy_max);
6488 check_wraith_form = FALSE;
6492 spell_damcalc(m_ptr, GF_ELEC, dam, &dummy_max);
6494 check_wraith_form = FALSE;
6498 spell_damcalc(m_ptr, GF_FIRE, dam, &dummy_max);
6500 check_wraith_form = FALSE;
6504 spell_damcalc(m_ptr, GF_COLD, dam, &dummy_max);
6506 check_wraith_form = FALSE;
6511 check_wraith_form = FALSE;
6515 if (check_wraith_form && p_ptr->wraith_form)
6523 dam = (dam + 1) / 2;
6524 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, &dummy_max);
6532 * @brief プレイヤーが特定地点へ移動した場合に警告を発する処理 /
6533 * Examine the grid (xx,yy) and warn the player if there are any danger
6534 * @param xx 危険性を調査するマスのX座標
6535 * @param yy 危険性を調査するマスのY座標
6536 * @return 警告を無視して進むことを選択するかか問題が無ければTRUE、警告に従ったならFALSEを返す。
6538 bool process_warning(POSITION xx, POSITION yy)
6542 GAME_TEXT o_name[MAX_NLEN];
6544 #define WARNING_AWARE_RANGE 12
6546 static int old_damage = 0;
6548 for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
6550 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
6553 monster_type *m_ptr;
6554 monster_race *r_ptr;
6556 if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
6558 g_ptr = ¤t_floor_ptr->grid_array[my][mx];
6560 if (!g_ptr->m_idx) continue;
6562 m_ptr = ¤t_floor_ptr->m_list[g_ptr->m_idx];
6564 if (MON_CSLEEP(m_ptr)) continue;
6565 if (!is_hostile(m_ptr)) continue;
6567 r_ptr = &r_info[m_ptr->r_idx];
6569 /* Monster spells (only powerful ones)*/
6570 if (projectable(my, mx, yy, xx))
6572 BIT_FLAGS f4 = r_ptr->flags4;
6573 BIT_FLAGS f5 = r_ptr->a_ability_flags1;
6574 BIT_FLAGS f6 = r_ptr->a_ability_flags2;
6576 if (!(d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC))
6578 if (f4 & RF4_BA_CHAO) spell_damcalc_by_spellnum(MS_BALL_CHAOS, GF_CHAOS, g_ptr->m_idx, &dam_max0);
6579 if (f5 & RF5_BA_MANA) spell_damcalc_by_spellnum(MS_BALL_MANA, GF_MANA, g_ptr->m_idx, &dam_max0);
6580 if (f5 & RF5_BA_DARK) spell_damcalc_by_spellnum(MS_BALL_DARK, GF_DARK, g_ptr->m_idx, &dam_max0);
6581 if (f5 & RF5_BA_LITE) spell_damcalc_by_spellnum(MS_STARBURST, GF_LITE, g_ptr->m_idx, &dam_max0);
6582 if (f6 & RF6_HAND_DOOM) spell_damcalc_by_spellnum(MS_HAND_DOOM, GF_HAND_DOOM, g_ptr->m_idx, &dam_max0);
6583 if (f6 & RF6_PSY_SPEAR) spell_damcalc_by_spellnum(MS_PSY_SPEAR, GF_PSY_SPEAR, g_ptr->m_idx, &dam_max0);
6585 if (f4 & RF4_ROCKET) spell_damcalc_by_spellnum(MS_ROCKET, GF_ROCKET, g_ptr->m_idx, &dam_max0);
6586 if (f4 & RF4_BR_ACID) spell_damcalc_by_spellnum(MS_BR_ACID, GF_ACID, g_ptr->m_idx, &dam_max0);
6587 if (f4 & RF4_BR_ELEC) spell_damcalc_by_spellnum(MS_BR_ELEC, GF_ELEC, g_ptr->m_idx, &dam_max0);
6588 if (f4 & RF4_BR_FIRE) spell_damcalc_by_spellnum(MS_BR_FIRE, GF_FIRE, g_ptr->m_idx, &dam_max0);
6589 if (f4 & RF4_BR_COLD) spell_damcalc_by_spellnum(MS_BR_COLD, GF_COLD, g_ptr->m_idx, &dam_max0);
6590 if (f4 & RF4_BR_POIS) spell_damcalc_by_spellnum(MS_BR_POIS, GF_POIS, g_ptr->m_idx, &dam_max0);
6591 if (f4 & RF4_BR_NETH) spell_damcalc_by_spellnum(MS_BR_NETHER, GF_NETHER, g_ptr->m_idx, &dam_max0);
6592 if (f4 & RF4_BR_LITE) spell_damcalc_by_spellnum(MS_BR_LITE, GF_LITE, g_ptr->m_idx, &dam_max0);
6593 if (f4 & RF4_BR_DARK) spell_damcalc_by_spellnum(MS_BR_DARK, GF_DARK, g_ptr->m_idx, &dam_max0);
6594 if (f4 & RF4_BR_CONF) spell_damcalc_by_spellnum(MS_BR_CONF, GF_CONFUSION, g_ptr->m_idx, &dam_max0);
6595 if (f4 & RF4_BR_SOUN) spell_damcalc_by_spellnum(MS_BR_SOUND, GF_SOUND, g_ptr->m_idx, &dam_max0);
6596 if (f4 & RF4_BR_CHAO) spell_damcalc_by_spellnum(MS_BR_CHAOS, GF_CHAOS, g_ptr->m_idx, &dam_max0);
6597 if (f4 & RF4_BR_DISE) spell_damcalc_by_spellnum(MS_BR_DISEN, GF_DISENCHANT, g_ptr->m_idx, &dam_max0);
6598 if (f4 & RF4_BR_NEXU) spell_damcalc_by_spellnum(MS_BR_NEXUS, GF_NEXUS, g_ptr->m_idx, &dam_max0);
6599 if (f4 & RF4_BR_TIME) spell_damcalc_by_spellnum(MS_BR_TIME, GF_TIME, g_ptr->m_idx, &dam_max0);
6600 if (f4 & RF4_BR_INER) spell_damcalc_by_spellnum(MS_BR_INERTIA, GF_INERTIAL, g_ptr->m_idx, &dam_max0);
6601 if (f4 & RF4_BR_GRAV) spell_damcalc_by_spellnum(MS_BR_GRAVITY, GF_GRAVITY, g_ptr->m_idx, &dam_max0);
6602 if (f4 & RF4_BR_SHAR) spell_damcalc_by_spellnum(MS_BR_SHARDS, GF_SHARDS, g_ptr->m_idx, &dam_max0);
6603 if (f4 & RF4_BR_PLAS) spell_damcalc_by_spellnum(MS_BR_PLASMA, GF_PLASMA, g_ptr->m_idx, &dam_max0);
6604 if (f4 & RF4_BR_WALL) spell_damcalc_by_spellnum(MS_BR_FORCE, GF_FORCE, g_ptr->m_idx, &dam_max0);
6605 if (f4 & RF4_BR_MANA) spell_damcalc_by_spellnum(MS_BR_MANA, GF_MANA, g_ptr->m_idx, &dam_max0);
6606 if (f4 & RF4_BR_NUKE) spell_damcalc_by_spellnum(MS_BR_NUKE, GF_NUKE, g_ptr->m_idx, &dam_max0);
6607 if (f4 & RF4_BR_DISI) spell_damcalc_by_spellnum(MS_BR_DISI, GF_DISINTEGRATE, g_ptr->m_idx, &dam_max0);
6610 /* Monster melee attacks */
6611 if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MELEE))
6613 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
6617 for (m = 0; m < 4; m++)
6619 /* Skip non-attacks */
6620 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
6622 /* Extract the attack info */
6623 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
6624 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
6626 if (dam_melee > dam_max0) dam_max0 = dam_melee;
6630 /* Contribution from this monster */
6631 dam_max += dam_max0;
6635 /* Prevent excessive warning */
6636 if (dam_max > old_damage)
6638 old_damage = dam_max * 3 / 2;
6640 if (dam_max > p_ptr->chp / 2)
6642 object_type *o_ptr = choose_warning_item();
6645 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6647 strcpy(o_name, _("体", "body")); /* Warning ability without item */
6648 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
6650 disturb(FALSE, TRUE);
6651 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
6654 else old_damage = old_damage / 2;
6656 g_ptr = ¤t_floor_ptr->grid_array[yy][xx];
6657 if (((!easy_disarm && is_trap(g_ptr->feat))
6658 || (g_ptr->mimic && is_trap(g_ptr->feat))) && !one_in_(13))
6660 object_type *o_ptr = choose_warning_item();
6663 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
6665 strcpy(o_name, _("体", "body")); /* Warning ability without item */
6666 msg_format(_("%sが鋭く震えた!", "Your %s pulsates sharply!"), o_name);
6667 disturb(FALSE, TRUE);
6668 return get_check(_("本当にこのまま進むか?", "Really want to go ahead? "));
6675 * エッセンス情報の構造体 / A structure for smithing
6678 int add; /* TR flag number or special essence id */
6679 concptr add_name; /* Name of this ability */
6680 ESSENCE_IDX type; /* Menu number */
6681 int essence; /* Index for carrying essences */
6682 int value; /* Needed value to add this ability */
6687 * エッセンス情報テーブル Smithing type data for Weapon smith
6690 static essence_type essence_info[] =
6692 {TR_STR, "腕力", 4, TR_STR, 20},
6693 {TR_INT, "知能", 4, TR_INT, 20},
6694 {TR_WIS, "賢さ", 4, TR_WIS, 20},
6695 {TR_DEX, "器用さ", 4, TR_DEX, 20},
6696 {TR_CON, "耐久力", 4, TR_CON, 20},
6697 {TR_CHR, "魅力", 4, TR_CHR, 20},
6698 {TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20},
6699 {TR_STEALTH, "隠密", 4, TR_STEALTH, 40},
6700 {TR_SEARCH, "探索", 4, TR_SEARCH, 15},
6701 {TR_INFRA, "赤外線視力", 4, TR_INFRA, 15},
6702 {TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15},
6703 {TR_SPEED, "スピード", 4, TR_SPEED, 12},
6704 {TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20},
6705 {TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15},
6706 {TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60},
6707 {TR_IMPACT, "地震発動", 7, TR_IMPACT, 15},
6708 {TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20},
6709 {TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20},
6710 {TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20},
6711 {TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20},
6712 {TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20},
6713 {TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15},
6714 {TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15},
6715 {TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15},
6716 {TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15},
6717 {TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15},
6718 {TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15},
6719 {TR_IM_ACID, "酸免疫", 2, TR_IM_ACID, 20},
6720 {TR_IM_ELEC, "電撃免疫", 2, TR_IM_ACID, 20},
6721 {TR_IM_FIRE, "火炎免疫", 2, TR_IM_ACID, 20},
6722 {TR_IM_COLD, "冷気免疫", 2, TR_IM_ACID, 20},
6723 {TR_REFLECT, "反射", 2, TR_REFLECT, 20},
6724 {TR_FREE_ACT, "麻痺知らず", 3, TR_FREE_ACT, 20},
6725 {TR_HOLD_EXP, "経験値維持", 3, TR_HOLD_EXP, 20},
6726 {TR_RES_ACID, "耐酸", 2, TR_RES_ACID, 15},
6727 {TR_RES_ELEC, "耐電撃", 2, TR_RES_ELEC, 15},
6728 {TR_RES_FIRE, "耐火炎", 2, TR_RES_FIRE, 15},
6729 {TR_RES_COLD, "耐冷気", 2, TR_RES_COLD, 15},
6730 {TR_RES_POIS, "耐毒", 2, TR_RES_POIS, 25},
6731 {TR_RES_FEAR, "耐恐怖", 2, TR_RES_FEAR, 20},
6732 {TR_RES_LITE, "耐閃光", 2, TR_RES_LITE, 20},
6733 {TR_RES_DARK, "耐暗黒", 2, TR_RES_DARK, 20},
6734 {TR_RES_BLIND, "耐盲目", 2, TR_RES_BLIND, 20},
6735 {TR_RES_CONF, "耐混乱", 2, TR_RES_CONF, 20},
6736 {TR_RES_SOUND, "耐轟音", 2, TR_RES_SOUND, 20},
6737 {TR_RES_SHARDS, "耐破片", 2, TR_RES_SHARDS, 20},
6738 {TR_RES_NETHER, "耐地獄", 2, TR_RES_NETHER, 20},
6739 {TR_RES_NEXUS, "耐因果混乱", 2, TR_RES_NEXUS, 20},
6740 {TR_RES_CHAOS, "耐カオス", 2, TR_RES_CHAOS, 20},
6741 {TR_RES_DISEN, "耐劣化", 2, TR_RES_DISEN, 20},
6742 {TR_SH_FIRE, "", 0, -2, 0},
6743 {TR_SH_ELEC, "", 0, -2, 0},
6744 {TR_SH_COLD, "", 0, -2, 0},
6745 {TR_NO_MAGIC, "反魔法", 3, TR_NO_MAGIC, 15},
6746 {TR_WARNING, "警告", 3, TR_WARNING, 20},
6747 {TR_LEVITATION, "浮遊", 3, TR_LEVITATION, 20},
6748 {TR_LITE_1, "永久光源", 3, TR_LITE_1, 15},
6749 {TR_LITE_2, "", 0, -2, 0},
6750 {TR_LITE_3, "", 0, -2, 0},
6751 {TR_SEE_INVIS, "可視透明", 3, TR_SEE_INVIS, 20},
6752 {TR_TELEPATHY, "テレパシー", 6, TR_TELEPATHY, 15},
6753 {TR_SLOW_DIGEST, "遅消化", 3, TR_SLOW_DIGEST, 15},
6754 {TR_REGEN, "急速回復", 3, TR_REGEN, 20},
6755 {TR_TELEPORT, "テレポート", 3, TR_TELEPORT, 25},
6757 {TR_SLAY_EVIL, "邪悪倍打", 5, TR_SLAY_EVIL, 100},
6758 {TR_KILL_EVIL, "邪悪倍倍打", 0, TR_SLAY_EVIL, 60},
6759 {TR_SLAY_ANIMAL, "動物倍打", 5, TR_SLAY_ANIMAL, 20},
6760 {TR_KILL_ANIMAL, "動物倍倍打", 5, TR_SLAY_ANIMAL, 60},
6761 {TR_SLAY_UNDEAD, "不死倍打", 5, TR_SLAY_UNDEAD, 20},
6762 {TR_KILL_UNDEAD, "不死倍倍打", 5, TR_SLAY_UNDEAD, 60},
6763 {TR_SLAY_DEMON, "悪魔倍打", 5, TR_SLAY_DEMON, 20},
6764 {TR_KILL_DEMON, "悪魔倍倍打", 5, TR_SLAY_DEMON, 60},
6765 {TR_SLAY_ORC, "オーク倍打", 5, TR_SLAY_ORC, 15},
6766 {TR_KILL_ORC, "オーク倍倍打", 5, TR_SLAY_ORC, 60},
6767 {TR_SLAY_TROLL, "トロル倍打", 5, TR_SLAY_TROLL, 15},
6768 {TR_KILL_TROLL, "トロル倍倍打", 5, TR_SLAY_TROLL, 60},
6769 {TR_SLAY_GIANT, "巨人倍打", 5, TR_SLAY_GIANT, 20},
6770 {TR_KILL_GIANT, "巨人倍倍打", 5, TR_SLAY_GIANT, 60},
6771 {TR_SLAY_DRAGON, "竜倍打", 5, TR_SLAY_DRAGON, 20},
6772 {TR_KILL_DRAGON, "竜倍倍打", 5, TR_SLAY_DRAGON, 60},
6773 {TR_SLAY_HUMAN, "人間倍打", 5, TR_SLAY_HUMAN, 20},
6774 {TR_KILL_HUMAN, "人間倍倍打", 5, TR_SLAY_HUMAN, 60},
6776 {TR_ESP_ANIMAL, "動物ESP", 6, TR_SLAY_ANIMAL, 40},
6777 {TR_ESP_UNDEAD, "不死ESP", 6, TR_SLAY_UNDEAD, 40},
6778 {TR_ESP_DEMON, "悪魔ESP", 6, TR_SLAY_DEMON, 40},
6779 {TR_ESP_ORC, "オークESP", 6, TR_SLAY_ORC, 40},
6780 {TR_ESP_TROLL, "トロルESP", 6, TR_SLAY_TROLL, 40},
6781 {TR_ESP_GIANT, "巨人ESP", 6, TR_SLAY_GIANT, 40},
6782 {TR_ESP_DRAGON, "竜ESP", 6, TR_SLAY_DRAGON, 40},
6783 {TR_ESP_HUMAN, "人間ESP", 6, TR_SLAY_HUMAN, 40},
6785 {ESSENCE_ATTACK, "攻撃", 10, TR_ES_ATTACK, 30},
6786 {ESSENCE_AC, "防御", 10, TR_ES_AC, 15},
6787 {ESSENCE_TMP_RES_ACID, "酸耐性発動", 7, TR_RES_ACID, 50},
6788 {ESSENCE_TMP_RES_ELEC, "電撃耐性発動", 7, TR_RES_ELEC, 50},
6789 {ESSENCE_TMP_RES_FIRE, "火炎耐性発動", 7, TR_RES_FIRE, 50},
6790 {ESSENCE_TMP_RES_COLD, "冷気耐性発動", 7, TR_RES_COLD, 50},
6791 {ESSENCE_SH_FIRE, "火炎オーラ", 7, -1, 50},
6792 {ESSENCE_SH_ELEC, "電撃オーラ", 7, -1, 50},
6793 {ESSENCE_SH_COLD, "冷気オーラ", 7, -1, 50},
6794 {ESSENCE_RESISTANCE, "全耐性", 2, -1, 150},
6795 {ESSENCE_SUSTAIN, "装備保持", 10, -1, 10},
6796 {ESSENCE_SLAY_GLOVE, "殺戮の小手", 1, TR_ES_ATTACK, 200},
6798 {-1, NULL, 0, -1, 0}
6801 static essence_type essence_info[] =
6803 {TR_STR, "strength", 4, TR_STR, 20},
6804 {TR_INT, "intelligence", 4, TR_INT, 20},
6805 {TR_WIS, "wisdom", 4, TR_WIS, 20},
6806 {TR_DEX, "dexterity", 4, TR_DEX, 20},
6807 {TR_CON, "constitution", 4, TR_CON, 20},
6808 {TR_CHR, "charisma", 4, TR_CHR, 20},
6809 {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
6810 {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
6811 {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
6812 {TR_INFRA, "infravision", 4, TR_INFRA, 15},
6813 {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
6814 {TR_SPEED, "speed", 4, TR_SPEED, 12},
6815 {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
6816 {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
6817 {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
6818 {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
6819 {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
6820 {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
6821 {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
6822 {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
6823 {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
6824 {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
6825 {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
6826 {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
6827 {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
6828 {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
6829 {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
6830 {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
6831 {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
6832 {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
6833 {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
6834 {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
6835 {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
6836 {TR_HOLD_EXP, "hold experience", 3, TR_HOLD_EXP, 20},
6837 {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
6838 {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
6839 {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
6840 {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
6841 {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
6842 {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
6843 {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
6844 {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
6845 {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
6846 {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
6847 {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
6848 {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
6849 {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
6850 {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
6851 {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
6852 {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
6853 {TR_SH_FIRE, "", 0, -2, 0},
6854 {TR_SH_ELEC, "", 0, -2, 0},
6855 {TR_SH_COLD, "", 0, -2, 0},
6856 {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
6857 {TR_WARNING, "warning", 3, TR_WARNING, 20},
6858 {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
6859 {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
6860 {TR_LITE_2, "", 0, -2, 0},
6861 {TR_LITE_3, "", 0, -2, 0},
6862 {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
6863 {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
6864 {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
6865 {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
6866 {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
6868 {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
6869 {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
6870 {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
6871 {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
6872 {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
6873 {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
6874 {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
6875 {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
6876 {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
6877 {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
6878 {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
6879 {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
6880 {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
6881 {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},
6882 {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
6883 {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
6884 {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
6885 {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
6887 {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
6888 {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40},
6889 {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},
6890 {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},
6891 {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},
6892 {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},
6893 {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
6894 {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
6896 {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
6897 {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
6898 {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
6899 {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
6900 {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
6901 {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
6902 {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
6903 {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
6904 {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
6905 {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
6906 {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
6907 {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
6909 {-1, NULL, 0, -1, 0}
6915 * エッセンス名テーブル / Essense names for Weapon smith
6918 concptr essence_name[] =
7021 concptr essence_name[] =
7124 * @brief 所持しているエッセンス一覧を表示する
7127 static void display_essence(void)
7132 for (i = 1; i < 22; i++)
7136 prt(_("エッセンス 個数 エッセンス 個数 エッセンス 個数",
7137 "Essence Num Essence Num Essence Num "), 1, 8);
7138 for (i = 0; essence_name[i]; i++)
7140 if (!essence_name[i][0]) continue;
7141 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7144 prt(_("現在所持しているエッセンス", "List of all essences you have."), 0, 0);
7154 static void drain_essence(void)
7156 int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7160 bool observe = FALSE;
7161 int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2;
7162 TIME_EFFECT old_timeout;
7163 BIT_FLAGS old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7169 OBJECT_IDX next_o_idx;
7172 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7175 item_tester_hook = object_is_weapon_armour_ammo;
7177 q = _("どのアイテムから抽出しますか?", "Extract from which item? ");
7178 s = _("抽出できるアイテムがありません。", "You have nothing you can extract from.");
7180 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT));
7183 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7185 GAME_TEXT o_name[MAX_NLEN];
7186 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7187 if (!get_check(format(_("本当に%sから抽出してよろしいですか?", "Really extract from %s? "), o_name))) return;
7190 take_turn(p_ptr, 100);
7192 object_flags(o_ptr, old_flgs);
7193 if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7194 if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7195 if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7196 if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7197 if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7198 if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7199 if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7200 if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7201 if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7203 old_to_a = o_ptr->to_a;
7205 old_to_h = o_ptr->to_h;
7206 old_to_d = o_ptr->to_d;
7209 old_pval = o_ptr->pval;
7210 old_name2 = o_ptr->name2;
7211 old_timeout = o_ptr->timeout;
7212 if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7213 if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7214 if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7215 if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7216 if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7217 if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7218 if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7219 if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7220 if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7221 if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7222 if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7223 if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7224 if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7225 if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7226 if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7227 if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7228 if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7229 if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7230 if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7234 next_o_idx = o_ptr->next_o_idx;
7235 marked = o_ptr->marked;
7236 weight = o_ptr->weight;
7237 number = o_ptr->number;
7239 object_prep(o_ptr, o_ptr->k_idx);
7243 o_ptr->next_o_idx=next_o_idx;
7244 o_ptr->marked=marked;
7245 o_ptr->number = number;
7246 if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7247 if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7248 o_ptr->ident |= (IDENT_MENTAL);
7249 object_aware(o_ptr);
7250 object_known(o_ptr);
7252 object_flags(o_ptr, new_flgs);
7254 for (i = 0; essence_info[i].add_name; i++)
7256 essence_type *es_ptr = &essence_info[i];
7257 PARAMETER_VALUE pval = 0;
7259 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7260 pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7262 if (es_ptr->add < TR_FLAG_MAX &&
7263 (!have_flag(new_flgs, es_ptr->add) || pval) &&
7264 have_flag(old_flgs, es_ptr->add))
7268 drain_value[es_ptr->essence] += 10 * pval;
7270 else if (es_ptr->essence != -2)
7272 drain_value[es_ptr->essence] += 10;
7274 else if (es_ptr->add == TR_SH_FIRE)
7276 drain_value[TR_BRAND_FIRE] += 10;
7277 drain_value[TR_RES_FIRE] += 10;
7279 else if (es_ptr->add == TR_SH_ELEC)
7281 drain_value[TR_BRAND_ELEC] += 10;
7282 drain_value[TR_RES_ELEC] += 10;
7284 else if (es_ptr->add == TR_SH_COLD)
7286 drain_value[TR_BRAND_COLD] += 10;
7287 drain_value[TR_RES_COLD] += 10;
7289 else if (es_ptr->add == TR_LITE_2)
7291 drain_value[TR_LITE_1] += 20;
7293 else if (es_ptr->add == TR_LITE_3)
7295 drain_value[TR_LITE_1] += 30;
7300 if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
7302 drain_value[TR_INT] += 5;
7303 drain_value[TR_WIS] += 5;
7305 if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
7307 drain_value[TR_BRAND_POIS] += 5;
7308 drain_value[TR_BRAND_ACID] += 5;
7309 drain_value[TR_BRAND_ELEC] += 5;
7310 drain_value[TR_BRAND_FIRE] += 5;
7311 drain_value[TR_BRAND_COLD] += 5;
7313 if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
7315 drain_value[TR_INT] += 10;
7317 if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
7319 drain_value[TR_STR] += 10;
7321 if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
7323 drain_value[TR_DEX] += 10;
7325 if (old_name2 == EGO_2WEAPON)
7327 drain_value[TR_DEX] += 20;
7329 if (object_is_weapon_ammo(o_ptr))
7331 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
7333 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
7335 if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
7336 if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
7337 if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
7338 if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
7340 for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7342 drain_value[i] *= number;
7343 drain_value[i] = drain_value[i] * dec / 4;
7344 drain_value[i] = MAX(drain_value[i], 0);
7345 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
7353 msg_print(_("エッセンスは抽出できませんでした。", "You were not able to extract any essence."));
7357 msg_print(_("抽出したエッセンス:", "Extracted essences:"));
7359 for (i = 0; essence_name[i]; i++)
7361 if (!essence_name[i][0]) continue;
7362 if (!drain_value[i]) continue;
7364 p_ptr->magic_num1[i] += drain_value[i];
7365 p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
7367 msg_format("%s...%d%s", essence_name[i], drain_value[i], _("。", ". "));
7371 /* Apply autodestroy/inscription to the drained item */
7372 autopick_alter_item(item, TRUE);
7373 p_ptr->update |= (PU_COMBINE | PU_REORDER);
7374 p_ptr->window |= (PW_INVEN);
7378 * @brief 付加するエッセンスの大別を選択する
7379 * @return 選んだエッセンスの大別ID
7381 static COMMAND_CODE choose_essence(void)
7383 COMMAND_CODE mode = 0;
7385 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
7388 concptr menu_name[] = {
7398 concptr menu_name[] = {
7408 const COMMAND_CODE mode_max = 7;
7410 if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
7420 for (i = 0; i < mode_max; i++)
7422 prt(format(" %s %s", (menu_line == 1+i) ? "》" : " ", menu_name[i]), 2 + i, 14);
7423 prt("どの種類のエッセンス付加を行いますか?", 0, 0);
7425 prt(format(" %s %s", (menu_line == 1+i) ? "> " : " ", menu_name[i]), 2 + i, 14);
7426 prt("Choose from menu.", 0, 0);
7445 menu_line += mode_max - 1;
7454 if (menu_line > mode_max) menu_line -= mode_max;
7465 for (i = 0; i < mode_max; i++)
7466 prt(format(" %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
7468 if (!get_com(_("何を付加しますか:", "Command :"), &choice, TRUE))
7474 if (isupper(choice)) choice = (char)tolower(choice);
7476 if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
7477 mode = (int)choice - 'a' + 1;
7487 * @brief エッセンスを実際に付加する
7488 * @param mode エッセンスの大別ID
7491 static void add_essence(ESSENCE_IDX mode)
7503 GAME_TEXT o_name[MAX_NLEN];
7505 essence_type *es_ptr;
7506 bool able[22] = { 0 };
7508 int menu_line = (use_menu ? 1 : 0);
7510 for (i = 0; essence_info[i].add_name; i++)
7512 es_ptr = &essence_info[i];
7514 if (es_ptr->type != mode) continue;
7518 if (!repeat_pull(&i) || i<0 || i>=max_num)
7521 /* Nothing chosen yet */
7527 /* Build a prompt */
7528 (void) strnfmt(out_val, 78, _("('*'で一覧, ESCで中断) どの能力を付加しますか?", "(*=List, ESC=exit) Add which ability? "));
7529 if (use_menu) screen_save();
7531 /* Get a spell from the user */
7533 choice = (always_show_list || use_menu) ? ESCAPE:1;
7536 if( choice==ESCAPE ) choice = ' ';
7537 else if( !get_com(out_val, &choice, FALSE) )break;
7539 if (use_menu && choice != ' ')
7553 menu_line += (max_num-1);
7576 menu_line = max_num;
7590 if (menu_line > max_num) menu_line -= max_num;
7592 /* Request redraw */
7593 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
7596 if (!redraw || use_menu)
7600 char dummy[80], dummy2[80];
7605 if (!use_menu) screen_save();
7607 for (y = 1; y < 24; y++)
7610 /* Print header(s) */
7612 prt(format(" %-43s %6s/%s", "能力(必要エッセンス)", "必要数", "所持数"), 1, x);
7615 prt(format(" %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
7618 for (ctr = 0; ctr < max_num; ctr++)
7620 es_ptr = &essence_info[num[ctr]];
7624 if (ctr == (menu_line-1))
7625 strcpy(dummy, _("》 ", "> "));
7626 else strcpy(dummy, " ");
7629 /* letter/number for power selection */
7632 sprintf(dummy, "%c) ",I2A(ctr));
7635 strcat(dummy, es_ptr->add_name);
7640 if (es_ptr->essence != -1)
7642 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
7643 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
7649 case ESSENCE_SH_FIRE:
7650 strcat(dummy, _("(焼棄+耐火炎)", "(brand fire + res.fire)"));
7651 if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
7652 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7654 case ESSENCE_SH_ELEC:
7655 strcat(dummy, _("(電撃+耐電撃)", "(brand elec. + res. elec.)"));
7656 if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
7657 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7659 case ESSENCE_SH_COLD:
7660 strcat(dummy, _("(凍結+耐冷気)", "(brand cold + res. cold)"));
7661 if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
7662 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7664 case ESSENCE_RESISTANCE:
7665 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
7666 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7667 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7668 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7669 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
7671 case ESSENCE_SUSTAIN:
7672 strcat(dummy, _("(耐火炎+耐冷気+耐電撃+耐酸)", "(r.fire+r.cold+r.elec+r.acid)"));
7673 if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
7674 if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
7675 if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
7676 if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
7681 if (!able[ctr]) col = TERM_RED;
7683 if (es_ptr->essence != -1)
7685 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
7689 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
7692 c_prt(col, dummy2, ctr+2, x);
7711 ask = (isupper(choice));
7714 if (ask) choice = (char)tolower(choice);
7716 /* Extract request */
7717 i = (islower(choice) ? A2I(choice) : -1);
7720 /* Totally Illegal */
7721 if ((i < 0) || (i >= max_num) || !able[i])
7733 (void) strnfmt(tmp_val, 78, _("%sを付加しますか? ", "Add the abilitiy of %s? "), essence_info[num[i]].add_name);
7735 /* Belay that order */
7736 if (!get_check(tmp_val)) continue;
7742 if (redraw) screen_load();
7748 es_ptr = &essence_info[num[i]];
7750 if (es_ptr->add == ESSENCE_SLAY_GLOVE)
7751 item_tester_tval = TV_GLOVES;
7752 else if (mode == 1 || mode == 5)
7753 item_tester_hook = item_tester_hook_melee_ammo;
7754 else if (es_ptr->add == ESSENCE_ATTACK)
7755 item_tester_hook = object_allow_enchant_weapon;
7756 else if (es_ptr->add == ESSENCE_AC)
7757 item_tester_hook = object_is_armour;
7759 item_tester_hook = object_is_weapon_armour_ammo;
7761 q = _("どのアイテムを改良しますか?", "Improve which item? ");
7762 s = _("改良できるアイテムがありません。", "You have nothing to improve.");
7764 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT));
7767 if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
7769 msg_print(_("そのアイテムはこれ以上改良できない。", "This item is no more able to be improved."));
7773 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7775 use_essence = es_ptr->value;
7776 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
7777 if (o_ptr->number > 1)
7779 use_essence *= o_ptr->number;
7780 msg_format(_("%d個あるのでエッセンスは%d必要です。", "It will take %d essences."), o_ptr->number, use_essence);
7783 if (es_ptr->essence != -1)
7785 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
7787 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
7790 if (is_pval_flag(es_ptr->add))
7792 if (o_ptr->pval < 0)
7794 msg_print(_("このアイテムの能力修正を強化することはできない。", "You cannot increase magic number of this item."));
7797 else if (es_ptr->add == TR_BLOWS)
7799 if (o_ptr->pval > 1)
7801 if (!get_check(_("修正値は1になります。よろしいですか?", "The magic number of this weapon will become 1. Are you sure? "))) return;
7805 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
7807 else if (o_ptr->pval > 0)
7809 use_essence *= o_ptr->pval;
7810 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
7816 PARAMETER_VALUE pval;
7817 PARAMETER_VALUE limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
7819 sprintf(tmp, _("いくつ付加しますか? (1-%d): ", "Enchant how many? (1-%d): "), limit);
7820 strcpy(tmp_val, "1");
7822 if (!get_string(tmp, tmp_val, 1)) return;
7823 pval = (PARAMETER_VALUE)atoi(tmp_val);
7824 if (pval > limit) pval = limit;
7825 else if (pval < 1) pval = 1;
7826 o_ptr->pval += pval;
7827 use_essence *= pval;
7828 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
7831 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
7833 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
7837 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
7844 strcpy(tmp_val, "1");
7845 if (!get_string(format(_("いくつ付加しますか? (1-%d):", "Enchant how many? (1-%d):"), p_ptr->lev/7+3), tmp_val, 2)) return;
7846 val = atoi(tmp_val);
7847 if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
7848 else if (val < 1) val = 1;
7850 msg_format(_("エッセンスを%d個使用します。", "It will take %d essences."), use_essence);
7851 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
7853 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
7856 get_to_h = ((val+1)/2+randint0(val/2+1));
7857 get_to_d = ((val+1)/2+randint0(val/2+1));
7858 o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
7859 o_ptr->to_h += get_to_h;
7860 o_ptr->to_d += get_to_d;
7862 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
7863 if (es_ptr->add == ESSENCE_ATTACK)
7865 if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
7867 msg_print(_("改良に失敗した。", "You failed to enchant."));
7868 take_turn(p_ptr, 100);
7873 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
7874 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
7877 else if (es_ptr->add == ESSENCE_AC)
7879 if (o_ptr->to_a >= p_ptr->lev/5+5)
7881 msg_print(_("改良に失敗した。", "You failed to enchant."));
7882 take_turn(p_ptr, 100);
7887 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
7892 o_ptr->xtra3 = es_ptr->add + 1;
7897 bool success = TRUE;
7901 case ESSENCE_SH_FIRE:
7902 if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
7907 p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
7908 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
7910 case ESSENCE_SH_ELEC:
7911 if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
7916 p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
7917 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
7919 case ESSENCE_SH_COLD:
7920 if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
7925 p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
7926 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
7928 case ESSENCE_RESISTANCE:
7929 case ESSENCE_SUSTAIN:
7930 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))
7935 p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
7936 p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
7937 p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
7938 p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
7943 msg_print(_("エッセンスが足りない。", "You don't have enough essences."));
7946 if (es_ptr->add == ESSENCE_SUSTAIN)
7948 add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
7949 add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
7950 add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
7951 add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
7955 o_ptr->xtra3 = es_ptr->add + 1;
7959 take_turn(p_ptr, 100);
7962 msg_format(_("%sに%sの能力を付加しました。", "You have added ability of %s to %s."), o_name, es_ptr->add_name);
7964 msg_format(, es_ptr->add_name, o_name);
7966 p_ptr->update |= (PU_COMBINE | PU_REORDER);
7967 p_ptr->window |= (PW_INVEN);
7974 static void erase_essence(void)
7979 GAME_TEXT o_name[MAX_NLEN];
7980 BIT_FLAGS flgs[TR_FLAG_SIZE];
7982 item_tester_hook = object_is_smith;
7984 q = _("どのアイテムのエッセンスを消去しますか?", "Remove from which item? ");
7985 s = _("エッセンスを付加したアイテムがありません。", "You have nothing to remove essence.");
7987 o_ptr = choose_object(&item, q, s, (USE_INVEN | USE_FLOOR));
7990 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7991 if (!get_check(format(_("よろしいですか? [%s]", "Are you sure? [%s]"), o_name))) return;
7993 take_turn(p_ptr, 100);
7995 if (o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE)
7997 o_ptr->to_h -= (o_ptr->xtra4>>8);
7998 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8000 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8001 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8004 object_flags(o_ptr, flgs);
8005 if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8006 msg_print(_("エッセンスを取り去った。", "You removed all essence you have added."));
8007 p_ptr->update |= (PU_COMBINE | PU_REORDER);
8008 p_ptr->window |= (PW_INVEN);
8012 * @brief 鍛冶コマンドのメインルーチン
8013 * @param only_browse TRUEならばエッセンス一覧の表示のみを行う
8016 void do_cmd_kaji(bool only_browse)
8018 COMMAND_CODE mode = 0;
8021 COMMAND_CODE menu_line = (use_menu ? 1 : 0);
8025 if (cmd_limit_confused(p_ptr)) return;
8028 msg_print(_("目が見えなくて作業できない!", "You are blind!"));
8033 msg_print(_("うまく見えなくて作業できない!", "You are hallucinating!"));
8038 if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8040 if (only_browse) screen_save();
8042 if (!only_browse) screen_save();
8048 prt(format(" %s エッセンス一覧", (menu_line == 1) ? "》" : " "), 2, 14);
8049 prt(format(" %s エッセンス抽出", (menu_line == 2) ? "》" : " "), 3, 14);
8050 prt(format(" %s エッセンス消去", (menu_line == 3) ? "》" : " "), 4, 14);
8051 prt(format(" %s エッセンス付加", (menu_line == 4) ? "》" : " "), 5, 14);
8052 prt(format(" %s 武器/防具強化", (menu_line == 5) ? "》" : " "), 6, 14);
8053 prt(format("どの種類の技術を%sますか?", only_browse ? "調べ" : "使い"), 0, 0);
8055 prt(format(" %s List essences", (menu_line == 1) ? "> " : " "), 2, 14);
8056 prt(format(" %s Extract essence", (menu_line == 2) ? "> " : " "), 3, 14);
8057 prt(format(" %s Remove essence", (menu_line == 3) ? "> " : " "), 4, 14);
8058 prt(format(" %s Add essence", (menu_line == 4) ? "> " : " "), 5, 14);
8059 prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : " "), 6, 14);
8060 prt(format("Choose command from menu."), 0, 0);
8087 if (menu_line > 5) menu_line -= 5;
8095 prt(_(" a) エッセンス一覧", " a) List essences"), 2, 14);
8096 prt(_(" b) エッセンス抽出", " b) Extract essence"), 3, 14);
8097 prt(_(" c) エッセンス消去", " c) Remove essence"), 4, 14);
8098 prt(_(" d) エッセンス付加", " d) Add essence"), 5, 14);
8099 prt(_(" e) 武器/防具強化", " e) Enchant weapon/armor"), 6, 14);
8101 if (!get_com(format("どの能力を%sますか:", only_browse ? "調べ" : "使い"), &choice, TRUE))
8103 if (!get_com("Command :", &choice, TRUE))
8140 /* Clear lines, position cursor (really should use strlen here) */
8141 Term_erase(14, 21, 255);
8142 Term_erase(14, 20, 255);
8143 Term_erase(14, 19, 255);
8144 Term_erase(14, 18, 255);
8145 Term_erase(14, 17, 255);
8146 Term_erase(14, 16, 255);
8148 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
8149 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
8151 prt(&temp[j], line, 15);
8156 if (!only_browse) screen_load();
8157 } while (only_browse);
8162 case 1: display_essence();break;
8163 case 2: drain_essence();break;
8164 case 3: erase_essence();break;
8166 mode = choose_essence();
8171 case 5: add_essence(10);break;
8177 * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
8178 * Torches have special abilities when they are flaming.
8179 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8180 * @param flgs 特別に追加するフラグを返す参照ポインタ
8183 void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
8185 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8187 if (o_ptr->xtra4 > 0)
8189 add_flag(flgs, TR_BRAND_FIRE);
8190 add_flag(flgs, TR_KILL_UNDEAD);
8191 add_flag(flgs, TR_THROW);
8197 * @brief 投擲時たいまつにダイスを与える。
8198 * Torches have special abilities when they are flaming.
8199 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8200 * @param dd 特別なダイス数を返す参照ポインタ
8201 * @param ds 特別なダイス面数を返す参照ポインタ
8204 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
8206 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8208 if (o_ptr->xtra4 > 0)
8217 * @brief 投擲時命中したたいまつの寿命を縮める。
8218 * Torches have special abilities when they are flaming.
8219 * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
8222 void torch_lost_fuel(object_type *o_ptr)
8224 if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
8226 o_ptr->xtra4 -= (FUEL_TORCH / 25);
8227 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;