OSDN Git Service

[Refactor] #37353 Renamed objectkind-hook.c/h to object-kind-hook.c/h
[hengband/hengband.git] / src / object2.c
1 /*!
2  * @file object2.c
3  * @brief オブジェクトの実装 / Object code, part 2
4  * @date 2014/01/11
5  * @author
6  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
7  *\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
12  */
13
14 #include "angband.h"
15 #include "util.h"
16 #include "main/sound-definitions-table.h"
17 #include "world.h"
18 #include "gameterm.h"
19
20 #include "object.h"
21
22 #include "io/write-diary.h"
23 #include "cmd/cmd-dump.h"
24 #include "cmd/cmd-spell.h"
25 #include "spells.h"
26 #include "dungeon.h"
27 #include "floor.h"
28 #include "grid.h"
29 #include "object/object-kind.h"
30 #include "object-boost.h"
31 #include "object-ego.h"
32 #include "object-flavor.h"
33 #include "object-hook.h"
34 #include "object-curse.h"
35 #include "object/object-kind-hook.h"
36 #include "artifact.h"
37 #include "feature.h"
38 #include "player-status.h"
39 #include "player-move.h"
40 #include "player-effects.h"
41 #include "player-class.h"
42 #include "player-personality.h"
43 #include "monster.h"
44 #include "monsterrace-hook.h"
45 #include "object-ego.h"
46 #include "view-mainwindow.h"
47
48  /*
49   * todo この説明長すぎ。何とかしたい
50   * Determine if an item can "absorb" a second item
51   *
52   * See "object_absorb()" for the actual "absorption" code.
53   *
54   * If permitted, we allow staffs (if they are known to have equal charges
55   * and both are either known or confirmed empty) and wands (if both are
56   * either known or confirmed empty) and rods (in all cases) to combine.
57   * Staffs will unstack (if necessary) when they are used, but wands and
58   * rods will only unstack if one is dropped. -LM-
59   *
60   * If permitted, we allow weapons/armor to stack, if fully "known".
61   *
62   * Missiles will combine if both stacks have the same "known" status.
63   * This is done to make unidentified stacks of missiles useful.
64   *
65   * Food, potions, scrolls, and "easy know" items always stack.
66   *
67   * Chests, and activatable items, never stack (for various reasons).
68   */
69
70   /*
71    * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
72    */
73 #define MAX_STACK_SIZE 99
74
75    /*!
76         * todo この関数ポインタは何とかならんのか?
77         * Hack -- function hook to restrict "get_obj_num_prep()" function
78         */
79 bool(*get_obj_num_hook)(KIND_OBJECT_IDX k_idx);
80
81 /*!
82 * todo これを消すとコンパイルは通るがリンカがエラーを吐く、何とか既存の構造に押し込みたい
83 */
84 OBJECT_SUBTYPE_VALUE coin_type; /* Hack -- force coin type */
85
86 void floor_item_describe(player_type *player_ptr, INVENTORY_IDX item);
87
88 /*!
89  * @brief 床上、モンスター所持でスタックされたアイテムを削除しスタックを補完する / Excise a dungeon object from any stacks
90  * @param floo_ptr 現在フロアへの参照ポインタ
91  * @param o_idx 削除対象のオブジェクト構造体ポインタ
92  * @return なし
93  */
94 void excise_object_idx(floor_type *floor_ptr, OBJECT_IDX o_idx)
95 {
96         OBJECT_IDX this_o_idx, next_o_idx = 0;
97         OBJECT_IDX prev_o_idx = 0;
98         object_type *j_ptr;
99         j_ptr = &floor_ptr->o_list[o_idx];
100
101         if (OBJECT_IS_HELD_MONSTER(j_ptr))
102         {
103                 monster_type *m_ptr;
104                 m_ptr = &floor_ptr->m_list[j_ptr->held_m_idx];
105                 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
106                 {
107                         object_type *o_ptr;
108                         o_ptr = &floor_ptr->o_list[this_o_idx];
109                         next_o_idx = o_ptr->next_o_idx;
110                         if (this_o_idx != o_idx)
111                         {
112                                 prev_o_idx = this_o_idx;
113                                 continue;
114                         }
115
116                         if (prev_o_idx == 0)
117                         {
118                                 m_ptr->hold_o_idx = next_o_idx;
119                         }
120                         else
121                         {
122                                 object_type *k_ptr;
123                                 k_ptr = &floor_ptr->o_list[prev_o_idx];
124                                 k_ptr->next_o_idx = next_o_idx;
125                         }
126
127                         o_ptr->next_o_idx = 0;
128                         break;
129                 }
130
131                 return;
132         }
133
134         grid_type *g_ptr;
135         POSITION y = j_ptr->iy;
136         POSITION x = j_ptr->ix;
137         g_ptr = &floor_ptr->grid_array[y][x];
138         for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
139         {
140                 object_type *o_ptr;
141                 o_ptr = &floor_ptr->o_list[this_o_idx];
142                 next_o_idx = o_ptr->next_o_idx;
143                 if (this_o_idx != o_idx)
144                 {
145                         prev_o_idx = this_o_idx;
146                         continue;
147                 }
148
149                 if (prev_o_idx == 0)
150                 {
151                         g_ptr->o_idx = next_o_idx;
152                 }
153                 else
154                 {
155                         object_type *k_ptr;
156                         k_ptr = &floor_ptr->o_list[prev_o_idx];
157                         k_ptr->next_o_idx = next_o_idx;
158                 }
159
160                 o_ptr->next_o_idx = 0;
161                 break;
162         }
163 }
164
165
166 /*!
167  * @brief オブジェクトを削除する /
168  * Delete a dungeon object
169  * @param player_ptr プレーヤーへの参照ポインタ
170  * @param o_idx 削除対象のオブジェクト構造体ポインタ
171  * @return なし
172  * @details
173  * Handle "stacks" of objects correctly.
174  */
175 void delete_object_idx(player_type *player_ptr, OBJECT_IDX o_idx)
176 {
177         object_type *j_ptr;
178         floor_type *floor_ptr = player_ptr->current_floor_ptr;
179         excise_object_idx(floor_ptr, o_idx);
180         j_ptr = &floor_ptr->o_list[o_idx];
181         if (!OBJECT_IS_HELD_MONSTER(j_ptr))
182         {
183                 POSITION y, x;
184                 y = j_ptr->iy;
185                 x = j_ptr->ix;
186                 lite_spot(player_ptr, y, x);
187         }
188
189         object_wipe(j_ptr);
190         floor_ptr->o_cnt--;
191 }
192
193
194 /*!
195  * @brief フロアにマスに落ちているオブジェクトを全て削除する / Deletes all objects at given location
196  * Delete a dungeon object
197  * @param player_ptr プレーヤーへの参照ポインタ
198  * @param y 削除したフロアマスのY座標
199  * @param x 削除したフロアマスのX座標
200  * @return なし
201  */
202 void delete_object(player_type *player_ptr, POSITION y, POSITION x)
203 {
204         grid_type *g_ptr;
205         OBJECT_IDX this_o_idx, next_o_idx = 0;
206         floor_type *floor_ptr = player_ptr->current_floor_ptr;
207         if (!in_bounds(floor_ptr, y, x)) return;
208
209         g_ptr = &floor_ptr->grid_array[y][x];
210         for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
211         {
212                 object_type *o_ptr;
213                 o_ptr = &floor_ptr->o_list[this_o_idx];
214                 next_o_idx = o_ptr->next_o_idx;
215                 object_wipe(o_ptr);
216                 floor_ptr->o_cnt--;
217         }
218
219         g_ptr->o_idx = 0;
220         lite_spot(player_ptr, y, x);
221 }
222
223
224 /*!
225  * @brief グローバルオブジェクト配列から空きを取得する /
226  * Acquires and returns the index of a "free" object.
227  * @param floo_ptr 現在フロアへの参照ポインタ
228  * @return 開いているオブジェクト要素のID
229  * @details
230  * This routine should almost never fail, but in case it does,
231  * we must be sure to handle "failure" of this routine.
232  */
233 OBJECT_IDX o_pop(floor_type *floor_ptr)
234 {
235         if (floor_ptr->o_max < current_world_ptr->max_o_idx)
236         {
237                 OBJECT_IDX i = floor_ptr->o_max;
238                 floor_ptr->o_max++;
239                 floor_ptr->o_cnt++;
240                 return i;
241         }
242
243         for (OBJECT_IDX i = 1; i < floor_ptr->o_max; i++)
244         {
245                 object_type *o_ptr;
246                 o_ptr = &floor_ptr->o_list[i];
247                 if (o_ptr->k_idx) continue;
248                 floor_ptr->o_cnt++;
249
250                 return i;
251         }
252
253         if (current_world_ptr->character_dungeon)
254                 msg_print(_("アイテムが多すぎる!", "Too many objects!"));
255
256         return 0;
257 }
258
259
260 /*!
261  * @brief オブジェクト生成テーブルに生成制約を加える /
262  * Apply a "object restriction function" to the "object allocation table"
263  * @return 常に0を返す。
264  * @details 生成の制約はグローバルのget_obj_num_hook関数ポインタで加える
265  */
266 static errr get_obj_num_prep(void)
267 {
268         alloc_entry *table = alloc_kind_table;
269         for (OBJECT_IDX i = 0; i < alloc_kind_size; i++)
270         {
271                 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
272                 {
273                         table[i].prob2 = table[i].prob1;
274                 }
275                 else
276                 {
277                         table[i].prob2 = 0;
278                 }
279         }
280
281         return 0;
282 }
283
284
285 /*!
286  * @brief オブジェクト生成テーブルからアイテムを取得する /
287  * Choose an object kind that seems "appropriate" to the given level
288  * @param owner_ptr プレーヤーへの参照ポインタ
289  * @param level 生成階
290  * @return 選ばれたオブジェクトベースID
291  * @details
292  * This function uses the "prob2" field of the "object allocation table",\n
293  * and various local information, to calculate the "prob3" field of the\n
294  * same table, which is then used to choose an "appropriate" object, in\n
295  * a relatively efficient manner.\n
296  *\n
297  * It is (slightly) more likely to acquire an object of the given level\n
298  * than one of a lower level.  This is done by choosing several objects\n
299  * appropriate to the given level and keeping the "hardest" one.\n
300  *\n
301  * Note that if no objects are "appropriate", then this function will\n
302  * fail, and return zero, but this should *almost* never happen.\n
303  */
304 OBJECT_IDX get_obj_num(player_type *owner_ptr, DEPTH level, BIT_FLAGS mode)
305 {
306         int i, j, p;
307         KIND_OBJECT_IDX k_idx;
308         long value, total;
309         object_kind     *k_ptr;
310         alloc_entry     *table = alloc_kind_table;
311
312         if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
313
314         if ((level > 0) && !(d_info[owner_ptr->dungeon_idx].flags1 & DF1_BEGINNER))
315         {
316                 if (one_in_(GREAT_OBJ))
317                 {
318                         level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
319                 }
320         }
321
322         total = 0L;
323         for (i = 0; i < alloc_kind_size; i++)
324         {
325                 if (table[i].level > level) break;
326
327                 table[i].prob3 = 0;
328                 k_idx = table[i].index;
329                 k_ptr = &k_info[k_idx];
330
331                 if ((mode & AM_FORBID_CHEST) && (k_ptr->tval == TV_CHEST)) continue;
332
333                 table[i].prob3 = table[i].prob2;
334                 total += table[i].prob3;
335         }
336
337         if (total <= 0) return 0;
338
339         value = randint0(total);
340         for (i = 0; i < alloc_kind_size; i++)
341         {
342                 if (value < table[i].prob3) break;
343
344                 value = value - table[i].prob3;
345         }
346
347         p = randint0(100);
348         if (p < 60)
349         {
350                 j = i;
351                 value = randint0(total);
352                 for (i = 0; i < alloc_kind_size; i++)
353                 {
354                         if (value < table[i].prob3) break;
355
356                         value = value - table[i].prob3;
357                 }
358
359                 if (table[i].level < table[j].level) i = j;
360         }
361
362         if (p >= 10) return (table[i].index);
363
364         j = i;
365         value = randint0(total);
366         for (i = 0; i < alloc_kind_size; i++)
367         {
368                 if (value < table[i].prob3) break;
369
370                 value = value - table[i].prob3;
371         }
372
373         if (table[i].level < table[j].level) i = j;
374         return (table[i].index);
375 }
376
377
378 /*!
379  * @brief オブジェクトを鑑定済にする /
380  * Known is true when the "attributes" of an object are "known".
381  * @param o_ptr 鑑定済にするオブジェクトの構造体参照ポインタ
382  * @return なし
383  * These include tohit, todam, toac, cost, and pval (charges).\n
384  *\n
385  * Note that "knowing" an object gives you everything that an "awareness"\n
386  * gives you, and much more.  In fact, the player is always "aware" of any\n
387  * item of which he has full "knowledge".\n
388  *\n
389  * But having full knowledge of, say, one "wand of wonder", does not, by\n
390  * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
391  * It happens that most "identify" routines (including "buying from a shop")\n
392  * will make the player "aware" of the object as well as fully "know" it.\n
393  *\n
394  * This routine also removes any inscriptions generated by "feelings".\n
395  */
396 void object_known(object_type *o_ptr)
397 {
398         o_ptr->feeling = FEEL_NONE;
399         o_ptr->ident &= ~(IDENT_SENSE);
400         o_ptr->ident &= ~(IDENT_EMPTY);
401         o_ptr->ident |= (IDENT_KNOWN);
402 }
403
404
405 /*!
406  * @brief オブジェクトを*鑑定*済にする /
407  * The player is now aware of the effects of the given object.
408  * @param owner_ptr プレーヤーへの参照ポインタ
409  * @param o_ptr *鑑定*済にするオブジェクトの構造体参照ポインタ
410  * @return なし
411  */
412 void object_aware(player_type *owner_ptr, object_type *o_ptr)
413 {
414         k_info[o_ptr->k_idx].aware = TRUE;
415
416         bool mihanmei = !object_is_aware(o_ptr);
417         bool is_undefined = mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
418                 !owner_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD));
419         if (!is_undefined) return;
420
421         object_type forge;
422         object_type *q_ptr;
423         GAME_TEXT o_name[MAX_NLEN];
424
425         q_ptr = &forge;
426         object_copy(q_ptr, o_ptr);
427
428         q_ptr->number = 1;
429         object_desc(owner_ptr, o_name, q_ptr, OD_NAME_ONLY);
430
431         exe_write_diary(owner_ptr, DIARY_FOUND, 0, o_name);
432 }
433
434
435 /*!
436  * @brief オブジェクトを試行済にする /
437  * Something has been "sampled"
438  * @param o_ptr 試行済にするオブジェクトの構造体参照ポインタ
439  * @return なし
440  */
441 void object_tried(object_type *o_ptr)
442 {
443         k_info[o_ptr->k_idx].tried = TRUE;
444 }
445
446
447 /*!
448 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item.  Method 1 (Heavy).
449 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
450 * @return 擬似鑑定結果のIDを返す。
451 */
452 byte value_check_aux1(object_type *o_ptr)
453 {
454         if (object_is_artifact(o_ptr))
455         {
456                 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
457
458                 return FEEL_SPECIAL;
459         }
460
461         if (object_is_ego(o_ptr))
462         {
463                 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
464
465                 return FEEL_EXCELLENT;
466         }
467
468         if (object_is_cursed(o_ptr)) return FEEL_CURSED;
469         if (object_is_broken(o_ptr)) return FEEL_BROKEN;
470         if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
471         if (o_ptr->to_a > 0) return FEEL_GOOD;
472         if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
473
474         return FEEL_AVERAGE;
475 }
476
477
478 /*!
479 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item.  Method 2 (Light).
480 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
481 * @return 擬似鑑定結果のIDを返す。
482 */
483 byte value_check_aux2(object_type *o_ptr)
484 {
485         if (object_is_cursed(o_ptr)) return FEEL_CURSED;
486         if (object_is_broken(o_ptr)) return FEEL_BROKEN;
487         if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
488         if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
489         if (o_ptr->to_a > 0) return FEEL_UNCURSED;
490         if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
491
492         return FEEL_NONE;
493 }
494
495
496 /*!
497  * @brief 未鑑定なベースアイテムの基本価格を返す /
498  * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
499  * @param o_ptr 未鑑定価格を確認したいオブジェクトの構造体参照ポインタ
500  * @return オブジェクトの未鑑定価格
501  */
502 static PRICE object_value_base(object_type *o_ptr)
503 {
504         if (object_is_aware(o_ptr))
505                 return (k_info[o_ptr->k_idx].cost);
506
507         switch (o_ptr->tval)
508         {
509         case TV_FOOD: return (5L);
510         case TV_POTION: return (20L);
511         case TV_SCROLL: return (20L);
512         case TV_STAFF: return (70L);
513         case TV_WAND: return (50L);
514         case TV_ROD: return (90L);
515         case TV_RING: return (45L);
516         case TV_AMULET: return (45L);
517         case TV_FIGURINE:
518         {
519                 DEPTH level = r_info[o_ptr->pval].level;
520                 if (level < 20) return level * 50L;
521                 else if (level < 30) return 1000 + (level - 20) * 150L;
522                 else if (level < 40) return 2500 + (level - 30) * 350L;
523                 else if (level < 50) return 6000 + (level - 40) * 800L;
524                 else return 14000 + (level - 50) * 2000L;
525         }
526         case TV_CAPTURE:
527                 if (!o_ptr->pval) return 1000L;
528                 else return ((r_info[o_ptr->pval].level) * 50L + 1000);
529         }
530
531         return (0L);
532 }
533
534
535 /*!
536  * @brief オブジェクトのフラグ類から価格を算出する /
537  * Return the value of the flags the object has...
538  * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
539  * @param plusses フラグに与える価格の基本重み
540  * @return オブジェクトのフラグ価格
541  */
542 PRICE flag_cost(object_type *o_ptr, int plusses)
543 {
544         PRICE total = 0;
545         BIT_FLAGS flgs[TR_FLAG_SIZE];
546         object_kind *k_ptr = &k_info[o_ptr->k_idx];
547         object_flags(o_ptr, flgs);
548
549         /*
550          * Exclude fixed flags of the base item.
551          * pval bonuses of base item will be treated later.
552          */
553         for (int i = 0; i < TR_FLAG_SIZE; i++)
554                 flgs[i] &= ~(k_ptr->flags[i]);
555
556         if (object_is_fixed_artifact(o_ptr))
557         {
558                 artifact_type *a_ptr = &a_info[o_ptr->name1];
559
560                 for (int i = 0; i < TR_FLAG_SIZE; i++)
561                         flgs[i] &= ~(a_ptr->flags[i]);
562         }
563         else if (object_is_ego(o_ptr))
564         {
565                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
566
567                 for (int i = 0; i < TR_FLAG_SIZE; i++)
568                         flgs[i] &= ~(e_ptr->flags[i]);
569         }
570
571         /*
572          * Calucurate values of remaining flags
573          */
574         if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
575         if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
576         if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
577         if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
578         if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
579         if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
580         if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
581         if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
582         if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
583         if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
584         if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
585         if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
586                 total += (10000 + (2500 * plusses));
587         if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
588                 total += (10000 + (2500 * plusses));
589
590         PRICE tmp_cost = 0;
591         int count = 0;
592         if (have_flag(flgs, TR_CHAOTIC)) { total += 5000; count++; }
593         if (have_flag(flgs, TR_VAMPIRIC)) { total += 6500; count++; }
594         if (have_flag(flgs, TR_FORCE_WEAPON)) { tmp_cost += 2500; count++; }
595         if (have_flag(flgs, TR_KILL_ANIMAL)) { tmp_cost += 2800; count++; }
596         else if (have_flag(flgs, TR_SLAY_ANIMAL)) { tmp_cost += 1800; count++; }
597         if (have_flag(flgs, TR_KILL_EVIL)) { tmp_cost += 3300; count++; }
598         else if (have_flag(flgs, TR_SLAY_EVIL)) { tmp_cost += 2300; count++; }
599         if (have_flag(flgs, TR_KILL_HUMAN)) { tmp_cost += 2800; count++; }
600         else if (have_flag(flgs, TR_SLAY_HUMAN)) { tmp_cost += 1800; count++; }
601         if (have_flag(flgs, TR_KILL_UNDEAD)) { tmp_cost += 2800; count++; }
602         else if (have_flag(flgs, TR_SLAY_UNDEAD)) { tmp_cost += 1800; count++; }
603         if (have_flag(flgs, TR_KILL_DEMON)) { tmp_cost += 2800; count++; }
604         else if (have_flag(flgs, TR_SLAY_DEMON)) { tmp_cost += 1800; count++; }
605         if (have_flag(flgs, TR_KILL_ORC)) { tmp_cost += 2500; count++; }
606         else if (have_flag(flgs, TR_SLAY_ORC)) { tmp_cost += 1500; count++; }
607         if (have_flag(flgs, TR_KILL_TROLL)) { tmp_cost += 2800; count++; }
608         else if (have_flag(flgs, TR_SLAY_TROLL)) { tmp_cost += 1800; count++; }
609         if (have_flag(flgs, TR_KILL_GIANT)) { tmp_cost += 2800; count++; }
610         else if (have_flag(flgs, TR_SLAY_GIANT)) { tmp_cost += 1800; count++; }
611         if (have_flag(flgs, TR_KILL_DRAGON)) { tmp_cost += 2800; count++; }
612         else if (have_flag(flgs, TR_SLAY_DRAGON)) { tmp_cost += 1800; count++; }
613
614         if (have_flag(flgs, TR_VORPAL)) { tmp_cost += 2500; count++; }
615         if (have_flag(flgs, TR_IMPACT)) { tmp_cost += 2500; count++; }
616         if (have_flag(flgs, TR_BRAND_POIS)) { tmp_cost += 3800; count++; }
617         if (have_flag(flgs, TR_BRAND_ACID)) { tmp_cost += 3800; count++; }
618         if (have_flag(flgs, TR_BRAND_ELEC)) { tmp_cost += 3800; count++; }
619         if (have_flag(flgs, TR_BRAND_FIRE)) { tmp_cost += 2500; count++; }
620         if (have_flag(flgs, TR_BRAND_COLD)) { tmp_cost += 2500; count++; }
621         total += (tmp_cost * count);
622
623         if (have_flag(flgs, TR_SUST_STR)) total += 850;
624         if (have_flag(flgs, TR_SUST_INT)) total += 850;
625         if (have_flag(flgs, TR_SUST_WIS)) total += 850;
626         if (have_flag(flgs, TR_SUST_DEX)) total += 850;
627         if (have_flag(flgs, TR_SUST_CON)) total += 850;
628         if (have_flag(flgs, TR_SUST_CHR)) total += 250;
629         if (have_flag(flgs, TR_RIDING)) total += 0;
630         if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
631         if (have_flag(flgs, TR_THROW)) total += 5000;
632         if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
633         if (have_flag(flgs, TR_HOLD_EXP)) total += 8500;
634
635         tmp_cost = 0;
636         count = 0;
637         if (have_flag(flgs, TR_IM_ACID)) { tmp_cost += 15000; count += 2; }
638         if (have_flag(flgs, TR_IM_ELEC)) { tmp_cost += 15000; count += 2; }
639         if (have_flag(flgs, TR_IM_FIRE)) { tmp_cost += 15000; count += 2; }
640         if (have_flag(flgs, TR_IM_COLD)) { tmp_cost += 15000; count += 2; }
641         if (have_flag(flgs, TR_REFLECT)) { tmp_cost += 5000; count += 2; }
642         if (have_flag(flgs, TR_RES_ACID)) { tmp_cost += 500; count++; }
643         if (have_flag(flgs, TR_RES_ELEC)) { tmp_cost += 500; count++; }
644         if (have_flag(flgs, TR_RES_FIRE)) { tmp_cost += 500; count++; }
645         if (have_flag(flgs, TR_RES_COLD)) { tmp_cost += 500; count++; }
646         if (have_flag(flgs, TR_RES_POIS)) { tmp_cost += 1000; count += 2; }
647         if (have_flag(flgs, TR_RES_FEAR)) { tmp_cost += 1000; count += 2; }
648         if (have_flag(flgs, TR_RES_LITE)) { tmp_cost += 800; count += 2; }
649         if (have_flag(flgs, TR_RES_DARK)) { tmp_cost += 800; count += 2; }
650         if (have_flag(flgs, TR_RES_BLIND)) { tmp_cost += 900; count += 2; }
651         if (have_flag(flgs, TR_RES_CONF)) { tmp_cost += 900; count += 2; }
652         if (have_flag(flgs, TR_RES_SOUND)) { tmp_cost += 900; count += 2; }
653         if (have_flag(flgs, TR_RES_SHARDS)) { tmp_cost += 900; count += 2; }
654         if (have_flag(flgs, TR_RES_NETHER)) { tmp_cost += 900; count += 2; }
655         if (have_flag(flgs, TR_RES_NEXUS)) { tmp_cost += 900; count += 2; }
656         if (have_flag(flgs, TR_RES_CHAOS)) { tmp_cost += 1000; count += 2; }
657         if (have_flag(flgs, TR_RES_DISEN)) { tmp_cost += 2000; count += 2; }
658         total += (tmp_cost * count);
659
660         if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
661         if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
662         if (have_flag(flgs, TR_SH_COLD)) total += 5000;
663         if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
664         if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
665         if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
666         if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
667         if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
668         if (have_flag(flgs, TR_LEVITATION)) total += 1250;
669         if (have_flag(flgs, TR_LITE_1)) total += 1500;
670         if (have_flag(flgs, TR_LITE_2)) total += 2500;
671         if (have_flag(flgs, TR_LITE_3)) total += 4000;
672         if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
673         if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
674         if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
675         if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
676         if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
677         if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
678         if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
679         if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
680         if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
681         if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
682         if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
683         if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
684         if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
685         if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
686         if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
687         if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
688         if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
689         if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
690         if (have_flag(flgs, TR_REGEN)) total += 2500;
691         if (have_flag(flgs, TR_WARNING)) total += 2000;
692         if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
693         if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
694         if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
695         if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
696         if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
697         if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
698         if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
699         if (have_flag(flgs, TR_ACTIVATE)) total += 100;
700         if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
701         if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
702         if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
703         if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
704         if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
705         if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
706         if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
707         if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
708         if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
709         if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
710         if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
711         if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
712         if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
713         if (have_flag(flgs, TR_TELEPORT))
714         {
715                 if (object_is_cursed(o_ptr))
716                         total -= 7500;
717                 else
718                         total += 250;
719         }
720
721         if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
722         if (have_flag(flgs, TR_BLESSED)) total += 750;
723         if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
724         if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
725         if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
726         if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
727         if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
728
729         /* Also, give some extra for activatable powers... */
730         if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
731         {
732                 const activation_type* const act_ptr = find_activation_info(o_ptr);
733                 if (act_ptr) {
734                         total += act_ptr->value;
735                 }
736         }
737
738         return total;
739 }
740
741
742 /*!
743  * @brief オブジェクトの真の価格を算出する /
744  * Return the value of the flags the object has...
745  * @param o_ptr 本価格を確認したいオブジェクトの構造体参照ポインタ
746  * @return オブジェクトの本価格
747  * @details
748  * Return the "real" price of a "known" item, not including discounts\n
749  *\n
750  * Wand and staffs get cost for each charge\n
751  *\n
752  * Armor is worth an extra 100 gold per bonus point to armor class.\n
753  *\n
754  * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
755  *\n
756  * Missiles are only worth 5 gold per bonus point, since they\n
757  * usually appear in groups of 20, and we want the player to get\n
758  * the same amount of cash for any "equivalent" item.  Note that\n
759  * missiles never have any of the "pval" flags, and in fact, they\n
760  * only have a few of the available flags, primarily of the "slay"\n
761  * and "brand" and "ignore" variety.\n
762  *\n
763  * Armor with a negative armor bonus is worthless.\n
764  * Weapons with negative hit+damage bonuses are worthless.\n
765  *\n
766  * Every wearable item with a "pval" bonus is worth extra (see below).\n
767  */
768 PRICE object_value_real(object_type *o_ptr)
769 {
770         BIT_FLAGS flgs[TR_FLAG_SIZE];
771         object_kind *k_ptr = &k_info[o_ptr->k_idx];
772
773         if (!k_info[o_ptr->k_idx].cost) return (0L);
774
775         PRICE value = k_info[o_ptr->k_idx].cost;
776         object_flags(o_ptr, flgs);
777         if (object_is_fixed_artifact(o_ptr))
778         {
779                 artifact_type *a_ptr = &a_info[o_ptr->name1];
780                 if (!a_ptr->cost) return (0L);
781
782                 value = a_ptr->cost;
783                 value += flag_cost(o_ptr, o_ptr->pval);
784                 return (value);
785         }
786         else if (object_is_ego(o_ptr))
787         {
788                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
789                 if (!e_ptr->cost) return (0L);
790
791                 value += e_ptr->cost;
792                 value += flag_cost(o_ptr, o_ptr->pval);
793         }
794         else
795         {
796                 bool flag = FALSE;
797                 for (int i = 0; i < TR_FLAG_SIZE; i++)
798                         if (o_ptr->art_flags[i]) flag = TRUE;
799
800                 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
801         }
802
803         /* Analyze pval bonus for normal object */
804         switch (o_ptr->tval)
805         {
806         case TV_SHOT:
807         case TV_ARROW:
808         case TV_BOLT:
809         case TV_BOW:
810         case TV_DIGGING:
811         case TV_HAFTED:
812         case TV_POLEARM:
813         case TV_SWORD:
814         case TV_BOOTS:
815         case TV_GLOVES:
816         case TV_HELM:
817         case TV_CROWN:
818         case TV_SHIELD:
819         case TV_CLOAK:
820         case TV_SOFT_ARMOR:
821         case TV_HARD_ARMOR:
822         case TV_DRAG_ARMOR:
823         case TV_LITE:
824         case TV_AMULET:
825         case TV_RING:
826                 if (!o_ptr->pval) break;
827                 if (o_ptr->pval < 0) return (0L);
828
829                 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
830                 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
831                 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
832                 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
833                 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
834                 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
835                 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
836                 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
837                 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
838                 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
839                 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
840                 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
841                 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
842                 break;
843         }
844
845         switch (o_ptr->tval)
846         {
847         case TV_WAND:
848         {
849                 /* Pay extra for charges, depending on standard number of
850                  * charges.  Handle new-style wands correctly. -LM-
851                  */
852                 value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
853                 break;
854         }
855         case TV_STAFF:
856         {
857                 /* Pay extra for charges, depending on standard number of
858                  * charges.  -LM-
859                  */
860                 value += (value * o_ptr->pval / (k_ptr->pval * 2));
861                 break;
862         }
863         case TV_RING:
864         case TV_AMULET:
865         {
866                 if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
867
868                 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
869                 break;
870         }
871         case TV_BOOTS:
872         case TV_GLOVES:
873         case TV_CLOAK:
874         case TV_CROWN:
875         case TV_HELM:
876         case TV_SHIELD:
877         case TV_SOFT_ARMOR:
878         case TV_HARD_ARMOR:
879         case TV_DRAG_ARMOR:
880         {
881                 if (o_ptr->to_a < 0) return (0L);
882
883                 value += (((o_ptr->to_h - k_ptr->to_h) + (o_ptr->to_d - k_ptr->to_d)) * 200L + (o_ptr->to_a) * 100L);
884                 break;
885         }
886         case TV_BOW:
887         case TV_DIGGING:
888         case TV_HAFTED:
889         case TV_SWORD:
890         case TV_POLEARM:
891         {
892                 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
893
894                 value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
895                 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
896                 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
897                 break;
898         }
899         case TV_SHOT:
900         case TV_ARROW:
901         case TV_BOLT:
902         {
903                 if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
904
905                 value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
906                 value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
907                 value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
908                 break;
909         }
910         case TV_FIGURINE:
911         {
912                 DEPTH level = r_info[o_ptr->pval].level;
913                 if (level < 20) value = level * 50L;
914                 else if (level < 30) value = 1000 + (level - 20) * 150L;
915                 else if (level < 40) value = 2500 + (level - 30) * 350L;
916                 else if (level < 50) value = 6000 + (level - 40) * 800L;
917                 else value = 14000 + (level - 50) * 2000L;
918                 break;
919         }
920         case TV_CAPTURE:
921         {
922                 if (!o_ptr->pval) value = 1000L;
923                 else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
924                 break;
925         }
926         case TV_CHEST:
927         {
928                 if (!o_ptr->pval) value = 0L;
929                 break;
930         }
931         }
932
933         if (value < 0) return 0L;
934
935         return (value);
936 }
937
938
939 /*!
940  * @brief オブジェクト価格算出のメインルーチン /
941  * Return the price of an item including plusses (and charges)
942  * @param o_ptr 判明している現価格を確認したいオブジェクトの構造体参照ポインタ
943  * @return オブジェクトの判明している現価格
944  * @details
945  * This function returns the "value" of the given item (qty one)\n
946  *\n
947  * Never notice "unknown" bonuses or properties, including "curses",\n
948  * since that would give the player information he did not have.\n
949  *\n
950  * Note that discounted items stay discounted forever, even if\n
951  * the discount is "forgotten" by the player via memory loss.\n
952  */
953 PRICE object_value(object_type *o_ptr)
954 {
955         PRICE value;
956
957         if (object_is_known(o_ptr))
958         {
959                 if (object_is_broken(o_ptr)) return (0L);
960                 if (object_is_cursed(o_ptr)) return (0L);
961
962                 value = object_value_real(o_ptr);
963         }
964         else
965         {
966                 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
967                 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
968
969                 value = object_value_base(o_ptr);
970         }
971
972         if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
973
974         return (value);
975 }
976
977
978 /*!
979  * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
980  * Distribute charges of rods or wands.
981  * @param o_ptr 分割元オブジェクトの構造体参照ポインタ source item
982  * @param q_ptr 分割先オブジェクトの構造体参照ポインタ target item, must be of the same type as o_ptr
983  * @param amt 分割したい回数量 number of items that are transfered
984  * @return なし
985  * @details
986  * Hack -- If rods or wands are dropped, the total maximum timeout or\n
987  * charges need to be allocated between the two stacks.  If all the items\n
988  * are being dropped, it makes for a neater message to leave the original\n
989  * stack's pval alone. -LM-\n
990  */
991 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
992 {
993         if ((o_ptr->tval != TV_WAND) && (o_ptr->tval != TV_ROD)) return;
994
995         q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
996         if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
997
998         if ((o_ptr->tval != TV_ROD) || !o_ptr->timeout) return;
999
1000         if (q_ptr->pval > o_ptr->timeout)
1001                 q_ptr->timeout = o_ptr->timeout;
1002         else
1003                 q_ptr->timeout = q_ptr->pval;
1004
1005         if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1006 }
1007
1008
1009 /*!
1010  * @brief 魔法棒やロッドの使用回数を減らす /
1011  * @param o_ptr オブジェクトの構造体参照ポインタ source item
1012  * @param amt 減らしたい回数量 number of items that are transfered
1013  * @return なし
1014  * @details
1015  * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1016  * charges of the stack needs to be reduced, unless all the items are\n
1017  * being destroyed. -LM-\n
1018  */
1019 void reduce_charges(object_type *o_ptr, int amt)
1020 {
1021         if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1022                 (amt < o_ptr->number))
1023         {
1024                 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1025         }
1026 }
1027
1028
1029 /*!
1030  * @brief 両オブジェクトをスロットに重ね合わせ可能な最大数を返す。
1031  * Determine if an item can partly absorb a second item. Return maximum number of stack.
1032  * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1033  * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1034  * @return 重ね合わせ可能なアイテム数
1035  */
1036 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1037 {
1038         int max_num = MAX_STACK_SIZE;
1039         if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1040
1041         switch (o_ptr->tval)
1042         {
1043         case TV_CHEST:
1044         case TV_CARD:
1045         case TV_CAPTURE:
1046         {
1047                 return 0;
1048         }
1049         case TV_STATUE:
1050         {
1051                 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1052                 if (o_ptr->pval != j_ptr->pval) return 0;
1053                 break;
1054         }
1055         case TV_FIGURINE:
1056         case TV_CORPSE:
1057         {
1058                 if (o_ptr->pval != j_ptr->pval) return 0;
1059
1060                 break;
1061         }
1062         case TV_FOOD:
1063         case TV_POTION:
1064         case TV_SCROLL:
1065         {
1066                 break;
1067         }
1068         case TV_STAFF:
1069         {
1070                 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1071                         !object_is_known(o_ptr)) ||
1072                         (!(j_ptr->ident & (IDENT_EMPTY)) &&
1073                                 !object_is_known(j_ptr))) return 0;
1074
1075                 if (o_ptr->pval != j_ptr->pval) return 0;
1076
1077                 break;
1078         }
1079         case TV_WAND:
1080         {
1081                 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1082                         !object_is_known(o_ptr)) ||
1083                         (!(j_ptr->ident & (IDENT_EMPTY)) &&
1084                                 !object_is_known(j_ptr))) return 0;
1085
1086                 break;
1087         }
1088         case TV_ROD:
1089         {
1090                 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1091                 break;
1092         }
1093         case TV_BOW:
1094         case TV_DIGGING:
1095         case TV_HAFTED:
1096         case TV_POLEARM:
1097         case TV_SWORD:
1098         case TV_BOOTS:
1099         case TV_GLOVES:
1100         case TV_HELM:
1101         case TV_CROWN:
1102         case TV_SHIELD:
1103         case TV_CLOAK:
1104         case TV_SOFT_ARMOR:
1105         case TV_HARD_ARMOR:
1106         case TV_DRAG_ARMOR:
1107         case TV_RING:
1108         case TV_AMULET:
1109         case TV_LITE:
1110         case TV_WHISTLE:
1111         {
1112                 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1113         }
1114                 /* Fall through */
1115         case TV_BOLT:
1116         case TV_ARROW:
1117         case TV_SHOT:
1118         {
1119                 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1120                 if (o_ptr->feeling != j_ptr->feeling) return 0;
1121                 if (o_ptr->to_h != j_ptr->to_h) return 0;
1122                 if (o_ptr->to_d != j_ptr->to_d) return 0;
1123                 if (o_ptr->to_a != j_ptr->to_a) return 0;
1124                 if (o_ptr->pval != j_ptr->pval) return 0;
1125                 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1126                 if (o_ptr->name2 != j_ptr->name2) return 0;
1127                 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1128                 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1129                 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1130                 if (o_ptr->timeout || j_ptr->timeout) return 0;
1131                 if (o_ptr->ac != j_ptr->ac) return 0;
1132                 if (o_ptr->dd != j_ptr->dd) return 0;
1133                 if (o_ptr->ds != j_ptr->ds) return 0;
1134                 break;
1135         }
1136         default:
1137         {
1138                 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1139
1140                 break;
1141         }
1142         }
1143
1144         for (int i = 0; i < TR_FLAG_SIZE; i++)
1145                 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1146
1147         if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1148         if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1149
1150         if (o_ptr->inscription && j_ptr->inscription &&
1151                 (o_ptr->inscription != j_ptr->inscription))
1152                 return 0;
1153
1154         if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1155         if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1156
1157         return max_num;
1158 }
1159
1160
1161 /*!
1162  * @brief 両オブジェクトをスロットに重ねることができるかどうかを返す。
1163  * Determine if an item can absorb a second item.
1164  * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
1165  * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
1166  * @return 重ね合わせ可能ならばTRUEを返す。
1167  */
1168 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1169 {
1170         int total = o_ptr->number + j_ptr->number;
1171         int max_num = object_similar_part(o_ptr, j_ptr);
1172         if (!max_num) return FALSE;
1173         if (total > max_num) return 0;
1174
1175         return TRUE;
1176 }
1177
1178
1179 /*!
1180  * @brief 両オブジェクトをスロットに重ね合わせる。
1181  * Allow one item to "absorb" another, assuming they are similar
1182  * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
1183  * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
1184  * @return なし
1185  */
1186 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1187 {
1188         int max_num = object_similar_part(o_ptr, j_ptr);
1189         int total = o_ptr->number + j_ptr->number;
1190         int diff = (total > max_num) ? total - max_num : 0;
1191
1192         o_ptr->number = (total > max_num) ? max_num : total;
1193         if (object_is_known(j_ptr)) object_known(o_ptr);
1194
1195         if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1196                 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1197         {
1198                 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1199                 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1200         }
1201
1202         if (OBJECT_IS_FULL_KNOWN(j_ptr)) o_ptr->ident |= (IDENT_FULL_KNOWN);
1203         if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1204         if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1205         if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1206         if (o_ptr->tval == TV_ROD)
1207         {
1208                 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1209                 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1210         }
1211
1212         if (o_ptr->tval == TV_WAND)
1213         {
1214                 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1215         }
1216 }
1217
1218
1219 /*!
1220  * @brief tvalとsvalに対応するベースアイテムのIDを返す。
1221  * Find the index of the object_kind with the given tval and sval
1222  * @param tval 検索したいベースアイテムのtval
1223  * @param sval 検索したいベースアイテムのsval
1224  * @return なし
1225  */
1226 KIND_OBJECT_IDX lookup_kind(OBJECT_TYPE_VALUE tval, OBJECT_SUBTYPE_VALUE sval)
1227 {
1228         int num = 0;
1229         KIND_OBJECT_IDX bk = 0;
1230
1231         for (KIND_OBJECT_IDX k = 1; k < max_k_idx; k++)
1232         {
1233                 object_kind *k_ptr = &k_info[k];
1234                 if (k_ptr->tval != tval) continue;
1235                 if (k_ptr->sval == sval) return (k);
1236                 if (sval != SV_ANY) continue;
1237                 if (!one_in_(++num)) continue;
1238
1239                 bk = k;
1240         }
1241
1242         if (sval == SV_ANY)
1243         {
1244                 return bk;
1245         }
1246
1247         return 0;
1248 }
1249
1250
1251 /*!
1252  * @brief オブジェクトを初期化する
1253  * Wipe an object clean.
1254  * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
1255  * @return なし
1256  */
1257 void object_wipe(object_type *o_ptr)
1258 {
1259         (void)WIPE(o_ptr, object_type);
1260 }
1261
1262
1263 /*!
1264  * @brief オブジェクトを複製する
1265  * Wipe an object clean.
1266  * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
1267  * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
1268  * @return なし
1269  */
1270 void object_copy(object_type *o_ptr, object_type *j_ptr)
1271 {
1272         (void)COPY(o_ptr, j_ptr, object_type);
1273 }
1274
1275
1276 /*!
1277  * @brief オブジェクト構造体にベースアイテムを作成する
1278  * Prepare an object based on an object kind.
1279  * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
1280  * @param k_idx 新たに作成したいベースアイテム情報のID
1281  * @return なし
1282  */
1283 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
1284 {
1285         object_kind *k_ptr = &k_info[k_idx];
1286         object_wipe(o_ptr);
1287         o_ptr->k_idx = k_idx;
1288         o_ptr->tval = k_ptr->tval;
1289         o_ptr->sval = k_ptr->sval;
1290         o_ptr->pval = k_ptr->pval;
1291         o_ptr->number = 1;
1292         o_ptr->weight = k_ptr->weight;
1293         o_ptr->to_h = k_ptr->to_h;
1294         o_ptr->to_d = k_ptr->to_d;
1295         o_ptr->to_a = k_ptr->to_a;
1296         o_ptr->ac = k_ptr->ac;
1297         o_ptr->dd = k_ptr->dd;
1298         o_ptr->ds = k_ptr->ds;
1299
1300         if (k_ptr->act_idx > 0) o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
1301         if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
1302
1303         if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
1304         if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1305         if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
1306         if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
1307         if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
1308         if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
1309 }
1310
1311
1312 /*!
1313  * @brief デバッグ時にアイテム生成情報をメッセージに出力する / Cheat -- describe a created object for the user
1314  * @param owner_ptr プレーヤーへの参照ポインタ
1315  * @param o_ptr デバッグ出力するオブジェクトの構造体参照ポインタ
1316  * @return なし
1317  */
1318 static void object_mention(player_type *owner_ptr, object_type *o_ptr)
1319 {
1320         object_aware(owner_ptr, o_ptr);
1321         object_known(o_ptr);
1322
1323         o_ptr->ident |= (IDENT_FULL_KNOWN);
1324         GAME_TEXT o_name[MAX_NLEN];
1325         object_desc(owner_ptr, o_name, o_ptr, 0);
1326         msg_format_wizard(CHEAT_OBJECT, _("%sを生成しました。", "%s was generated."), o_name);
1327 }
1328
1329
1330 /*!
1331  *
1332  * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
1333  * Choose random ego type
1334  * @param slot 取得したいエゴの装備部位
1335  * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
1336  * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
1337  */
1338 static byte get_random_ego(byte slot, bool good)
1339 {
1340         long total = 0L;
1341         for (int i = 1; i < max_e_idx; i++)
1342         {
1343                 ego_item_type *e_ptr;
1344                 e_ptr = &e_info[i];
1345                 if (e_ptr->slot == slot
1346                         && ((good && e_ptr->rating) || (!good && !e_ptr->rating)))
1347                 {
1348                         if (e_ptr->rarity)
1349                                 total += (255 / e_ptr->rarity);
1350                 }
1351         }
1352
1353         int value = randint1(total);
1354         int j;
1355         for (j = 1; j < max_e_idx; j++)
1356         {
1357                 ego_item_type *e_ptr;
1358                 e_ptr = &e_info[j];
1359                 if (e_ptr->slot == slot
1360                         && ((good && e_ptr->rating) || (!good && !e_ptr->rating)))
1361                 {
1362                         if (e_ptr->rarity)
1363                                 value -= (255 / e_ptr->rarity);
1364                         if (value <= 0L) break;
1365                 }
1366         }
1367
1368         return (byte)j;
1369 }
1370
1371
1372 /*!
1373  * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
1374  * Apply magic to an item known to be a "weapon"
1375  * @param owner_ptr プレーヤーへの参照ポインタ
1376  * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
1377  * @param level 生成基準階
1378  * @param power 生成ランク
1379  * @return なし
1380  * @details
1381  * Hack -- note special base damage dice boosting\n
1382  * Hack -- note special processing for weapon/digger\n
1383  */
1384 void apply_magic_weapon(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
1385 {
1386         HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
1387         HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
1388
1389         HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
1390         HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
1391
1392         if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
1393         {
1394                 tohit2 = (tohit2 + 1) / 2;
1395                 todam2 = (todam2 + 1) / 2;
1396         }
1397
1398         if (power > 0)
1399         {
1400                 o_ptr->to_h += tohit1;
1401                 o_ptr->to_d += todam1;
1402                 if (power > 1)
1403                 {
1404                         o_ptr->to_h += tohit2;
1405                         o_ptr->to_d += todam2;
1406                 }
1407         }
1408         else if (power < 0)
1409         {
1410                 o_ptr->to_h -= tohit1;
1411                 o_ptr->to_d -= todam1;
1412                 if (power < -1)
1413                 {
1414                         o_ptr->to_h -= tohit2;
1415                         o_ptr->to_d -= todam2;
1416                 }
1417
1418                 if (o_ptr->to_h + o_ptr->to_d < 0)
1419                         o_ptr->curse_flags |= TRC_CURSED;
1420         }
1421
1422         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
1423
1424         switch (o_ptr->tval)
1425         {
1426         case TV_DIGGING:
1427         {
1428                 if (power > 1)
1429                 {
1430                         /* power > 2 is debug only */
1431                         if (one_in_(30) || (power > 2))
1432                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1433                         else
1434                                 o_ptr->name2 = EGO_DIGGING;
1435                 }
1436                 else if (power < -1)
1437                 {
1438                         o_ptr->pval = 0 - (5 + randint1(5));
1439                 }
1440                 else if (power < 0)
1441                 {
1442                         o_ptr->pval = 0 - (o_ptr->pval);
1443                 }
1444
1445                 break;
1446         }
1447         case TV_HAFTED:
1448         case TV_POLEARM:
1449         case TV_SWORD:
1450         {
1451                 if (power > 1)
1452                 {
1453                         /* power > 2 is debug only */
1454                         if (one_in_(40) || (power > 2))
1455                         {
1456                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1457                                 break;
1458                         }
1459                         while (TRUE)
1460                         {
1461                                 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
1462                                 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
1463                                         continue;
1464                                 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
1465                                         continue;
1466                                 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
1467                                         continue;
1468                                 break;
1469                         }
1470
1471                         switch (o_ptr->name2)
1472                         {
1473                         case EGO_HA:
1474                                 if (one_in_(4) && (level > 40))
1475                                         add_flag(o_ptr->art_flags, TR_BLOWS);
1476                                 break;
1477                         case EGO_DF:
1478                                 if (one_in_(3))
1479                                         add_flag(o_ptr->art_flags, TR_RES_POIS);
1480                                 if (one_in_(3))
1481                                         add_flag(o_ptr->art_flags, TR_WARNING);
1482                                 break;
1483                         case EGO_KILL_DRAGON:
1484                                 if (one_in_(3))
1485                                         add_flag(o_ptr->art_flags, TR_RES_POIS);
1486                                 break;
1487                         case EGO_WEST:
1488                                 if (one_in_(3))
1489                                         add_flag(o_ptr->art_flags, TR_RES_FEAR);
1490                                 break;
1491                         case EGO_SLAYING_WEAPON:
1492                                 if (one_in_(3))
1493                                         o_ptr->dd *= 2;
1494                                 else
1495                                 {
1496                                         do
1497                                         {
1498                                                 o_ptr->dd++;
1499                                         } while (one_in_(o_ptr->dd));
1500
1501                                         do
1502                                         {
1503                                                 o_ptr->ds++;
1504                                         } while (one_in_(o_ptr->ds));
1505                                 }
1506
1507                                 if (one_in_(5))
1508                                 {
1509                                         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1510                                 }
1511                                 if (o_ptr->tval == TV_SWORD && one_in_(3))
1512                                 {
1513                                         add_flag(o_ptr->art_flags, TR_VORPAL);
1514                                 }
1515                                 break;
1516                         case EGO_TRUMP:
1517                                 if (one_in_(5))
1518                                         add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1519                                 if (one_in_(7))
1520                                         one_ability(o_ptr);
1521                                 break;
1522                         case EGO_PATTERN:
1523                                 if (one_in_(3))
1524                                         add_flag(o_ptr->art_flags, TR_HOLD_EXP);
1525                                 if (one_in_(3))
1526                                         add_flag(o_ptr->art_flags, TR_DEX);
1527                                 if (one_in_(5))
1528                                         add_flag(o_ptr->art_flags, TR_RES_FEAR);
1529                                 break;
1530                         case EGO_SHARPNESS:
1531                                 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
1532                                 break;
1533                         case EGO_EARTHQUAKES:
1534                                 if (one_in_(3) && (level > 60))
1535                                         add_flag(o_ptr->art_flags, TR_BLOWS);
1536                                 else
1537                                         o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
1538                                 break;
1539                         case EGO_VAMPIRIC:
1540                                 if (one_in_(5))
1541                                         add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
1542                                 break;
1543                         case EGO_DEMON:
1544
1545                                 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1546                                 one_in_(3) ?
1547                                         add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
1548                                         one_in_(2) ?
1549                                         add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
1550                                         add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
1551
1552
1553                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
1554                                 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
1555                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
1556                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
1557                                 break;
1558                         }
1559
1560                         if (!o_ptr->art_name)
1561                         {
1562                                 while (one_in_(10L * o_ptr->dd * o_ptr->ds))
1563                                         o_ptr->dd++;
1564
1565                                 if (o_ptr->dd > 9) o_ptr->dd = 9;
1566                         }
1567                 }
1568                 else if (power < -1)
1569                 {
1570                         if (randint0(MAX_DEPTH) < level)
1571                         {
1572                                 while (TRUE)
1573                                 {
1574                                         o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
1575                                         if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
1576                                         {
1577                                                 continue;
1578                                         }
1579
1580                                         break;
1581                                 }
1582
1583                                 switch (o_ptr->name2)
1584                                 {
1585                                 case EGO_MORGUL:
1586                                         if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
1587                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1588                                         break;
1589                                 case EGO_WEIRD:
1590                                         if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1591                                         if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
1592                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
1593                                         if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
1594                                         if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
1595                                         if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
1596                                         break;
1597                                 }
1598                         }
1599                 }
1600
1601                 break;
1602         }
1603         case TV_BOW:
1604         {
1605                 if (power > 1)
1606                 {
1607                         /* power > 2 is debug only */
1608                         if (one_in_(20) || (power > 2))
1609                         {
1610                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1611                                 break;
1612                         }
1613
1614                         o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
1615                 }
1616
1617                 break;
1618         }
1619         case TV_BOLT:
1620         case TV_ARROW:
1621         case TV_SHOT:
1622         {
1623                 if (power > 1)
1624                 {
1625                         /* power > 2 is debug only */
1626                         if (power > 2)
1627                         {
1628                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1629                                 break;
1630                         }
1631
1632                         o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
1633                         switch (o_ptr->name2)
1634                         {
1635                         case EGO_SLAYING_BOLT:
1636                                 o_ptr->dd++;
1637                                 break;
1638                         }
1639
1640                         while (one_in_(10L * o_ptr->dd * o_ptr->ds))
1641                                 o_ptr->dd++;
1642
1643                         if (o_ptr->dd > 9) o_ptr->dd = 9;
1644                 }
1645                 else if (power < -1)
1646                 {
1647                         if (randint0(MAX_DEPTH) < level)
1648                         {
1649                                 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
1650                         }
1651                 }
1652
1653                 break;
1654         }
1655         }
1656 }
1657
1658
1659 /*!
1660  * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
1661  * Apply magic to an item known to be "armor"
1662  * @param owner_ptr プレーヤーへの参照ポインタ
1663  * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
1664  * @param level 生成基準階
1665  * @param power 生成ランク
1666  * @return なし
1667  * @details
1668  * Hack -- note special processing for crown/helm\n
1669  * Hack -- note special processing for robe of permanence\n
1670  */
1671 static void a_m_aux_2(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
1672 {
1673         ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
1674         ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
1675         if (power > 0)
1676         {
1677                 o_ptr->to_a += toac1;
1678                 if (power > 1)
1679                 {
1680                         o_ptr->to_a += toac2;
1681                 }
1682         }
1683         else if (power < 0)
1684         {
1685                 o_ptr->to_a -= toac1;
1686                 if (power < -1)
1687                 {
1688                         o_ptr->to_a -= toac2;
1689                 }
1690
1691                 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
1692         }
1693
1694         switch (o_ptr->tval)
1695         {
1696         case TV_DRAG_ARMOR:
1697         {
1698                 /* power > 2 is debug only */
1699                 if (one_in_(50) || (power > 2))
1700                         become_random_artifact(owner_ptr, o_ptr, FALSE);
1701                 break;
1702         }
1703         case TV_HARD_ARMOR:
1704         case TV_SOFT_ARMOR:
1705         {
1706                 if (power > 1)
1707                 {
1708                         if ((o_ptr->tval == TV_SOFT_ARMOR) &&
1709                                 (o_ptr->sval == SV_ROBE) &&
1710                                 (randint0(100) < 15))
1711                         {
1712                                 if (one_in_(5))
1713                                 {
1714                                         o_ptr->name2 = EGO_YOIYAMI;
1715                                         o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
1716                                         o_ptr->sval = SV_YOIYAMI_ROBE;
1717                                         o_ptr->ac = 0;
1718                                         o_ptr->to_a = 0;
1719                                 }
1720                                 else
1721                                 {
1722                                         o_ptr->name2 = EGO_PERMANENCE;
1723                                 }
1724
1725                                 break;
1726                         }
1727
1728                         /* power > 2 is debug only */
1729                         if (one_in_(20) || (power > 2))
1730                         {
1731                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1732                                 break;
1733                         }
1734
1735                         while (TRUE)
1736                         {
1737                                 bool okay_flag = TRUE;
1738                                 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
1739                                 switch (o_ptr->name2)
1740                                 {
1741                                 case EGO_DWARVEN:
1742                                         if (o_ptr->tval != TV_HARD_ARMOR)
1743                                         {
1744                                                 okay_flag = FALSE;
1745                                         }
1746
1747                                         break;
1748                                 case EGO_DRUID:
1749                                         if (o_ptr->tval != TV_SOFT_ARMOR)
1750                                         {
1751                                                 okay_flag = FALSE;
1752                                         }
1753
1754                                         break;
1755                                 default:
1756                                         break;
1757                                 }
1758
1759                                 if (okay_flag) break;
1760                         }
1761
1762                         switch (o_ptr->name2)
1763                         {
1764                         case EGO_RESISTANCE:
1765                                 if (one_in_(4))
1766                                         add_flag(o_ptr->art_flags, TR_RES_POIS);
1767                                 break;
1768                         case EGO_DWARVEN:
1769                                 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
1770                                 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
1771                                 break;
1772
1773                         case EGO_A_DEMON:
1774                                 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1775                                 one_in_(3) ?
1776                                         add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
1777                                         one_in_(2) ?
1778                                         add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
1779                                         add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
1780
1781                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
1782                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
1783                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
1784                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
1785                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
1786                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
1787                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
1788                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
1789                                 break;
1790                         case EGO_A_MORGUL:
1791                                 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1792                                 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
1793                                 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
1794                                 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
1795                                 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
1796                                 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
1797                                 break;
1798                         default:
1799                                 break;
1800                         }
1801                 }
1802
1803                 break;
1804         }
1805         case TV_SHIELD:
1806         {
1807                 if (o_ptr->sval == SV_DRAGON_SHIELD)
1808                 {
1809                         dragon_resist(o_ptr);
1810                         if (!one_in_(3)) break;
1811                 }
1812
1813                 if (power > 1)
1814                 {
1815                         /* power > 2 is debug only */
1816                         if (one_in_(20) || (power > 2))
1817                         {
1818                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1819                                 break;
1820                         }
1821
1822                         while (TRUE)
1823                         {
1824                                 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
1825                                 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
1826                                         && o_ptr->name2 == EGO_S_DWARVEN)
1827                                 {
1828                                         continue;
1829                                 }
1830
1831                                 break;
1832                         }
1833
1834                         switch (o_ptr->name2)
1835                         {
1836                         case EGO_ENDURANCE:
1837                                 if (!one_in_(3)) one_high_resistance(o_ptr);
1838                                 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
1839                                 break;
1840                         case EGO_REFLECTION:
1841                                 if (o_ptr->sval == SV_MIRROR_SHIELD)
1842                                         o_ptr->name2 = 0;
1843                                 break;
1844
1845                         case EGO_S_DWARVEN:
1846                                 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
1847                                 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
1848                                 break;
1849                         }
1850                 }
1851
1852                 break;
1853         }
1854         case TV_GLOVES:
1855         {
1856                 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
1857                 {
1858                         dragon_resist(o_ptr);
1859                         if (!one_in_(3)) break;
1860                 }
1861
1862                 if (power > 1)
1863                 {
1864                         /* power > 2 is debug only */
1865                         if (one_in_(20) || (power > 2))
1866                         {
1867                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1868                                 break;
1869                         }
1870                         o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
1871                 }
1872                 else if (power < -1)
1873                 {
1874                         o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
1875                 }
1876
1877                 break;
1878         }
1879
1880         case TV_BOOTS:
1881         {
1882                 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
1883                 {
1884                         dragon_resist(o_ptr);
1885                         if (!one_in_(3)) break;
1886                 }
1887
1888                 if (power > 1)
1889                 {
1890                         /* power > 2 is debug only */
1891                         if (one_in_(20) || (power > 2))
1892                         {
1893                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1894                                 break;
1895                         }
1896
1897                         o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
1898                         switch (o_ptr->name2)
1899                         {
1900                         case EGO_SLOW_DESCENT:
1901                                 if (one_in_(2))
1902                                 {
1903                                         one_high_resistance(o_ptr);
1904                                 }
1905
1906                                 break;
1907                         }
1908                 }
1909                 else if (power < -1)
1910                 {
1911                         o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
1912                 }
1913
1914                 break;
1915         }
1916         case TV_CROWN:
1917         {
1918                 if (power > 1)
1919                 {
1920                         /* power > 2 is debug only */
1921                         if (one_in_(20) || (power > 2))
1922                         {
1923                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1924                                 break;
1925                         }
1926
1927                         while (TRUE)
1928                         {
1929                                 bool ok_flag = TRUE;
1930                                 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
1931
1932                                 switch (o_ptr->name2)
1933                                 {
1934                                 case EGO_TELEPATHY:
1935                                         if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
1936                                         else add_esp_weak(o_ptr, FALSE);
1937                                         break;
1938                                 case EGO_MAGI:
1939                                 case EGO_MIGHT:
1940                                 case EGO_REGENERATION:
1941                                 case EGO_LORDLINESS:
1942                                 case EGO_BASILISK:
1943                                         break;
1944                                 case EGO_SEEING:
1945                                         if (one_in_(3))
1946                                         {
1947                                                 if (one_in_(2)) add_esp_strong(o_ptr);
1948                                                 else add_esp_weak(o_ptr, FALSE);
1949                                         }
1950                                         break;
1951                                 default:
1952                                         /* not existing crown (wisdom,lite, etc...) */
1953                                         ok_flag = FALSE;
1954                                 }
1955
1956                                 if (ok_flag)
1957                                         break;
1958                         }
1959
1960                         break;
1961                 }
1962                 else if (power < -1)
1963                 {
1964                         while (TRUE)
1965                         {
1966                                 bool ok_flag = TRUE;
1967                                 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
1968
1969                                 switch (o_ptr->name2)
1970                                 {
1971                                 case EGO_ANCIENT_CURSE:
1972                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
1973                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
1974                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
1975                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
1976                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
1977                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
1978                                         break;
1979                                 }
1980
1981                                 if (ok_flag)
1982                                         break;
1983                         }
1984                 }
1985
1986                 break;
1987         }
1988         case TV_HELM:
1989         {
1990                 if (o_ptr->sval == SV_DRAGON_HELM)
1991                 {
1992                         dragon_resist(o_ptr);
1993                         if (!one_in_(3)) break;
1994                 }
1995
1996                 if (power > 1)
1997                 {
1998                         /* power > 2 is debug only */
1999                         if (one_in_(20) || (power > 2))
2000                         {
2001                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
2002                                 break;
2003                         }
2004
2005                         while (TRUE)
2006                         {
2007                                 bool ok_flag = TRUE;
2008                                 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
2009                                 switch (o_ptr->name2)
2010                                 {
2011                                 case EGO_BRILLIANCE:
2012                                 case EGO_DARK:
2013                                 case EGO_INFRAVISION:
2014                                 case EGO_H_PROTECTION:
2015                                         break;
2016                                 case EGO_SEEING:
2017                                         if (one_in_(7))
2018                                         {
2019                                                 if (one_in_(2)) add_esp_strong(o_ptr);
2020                                                 else add_esp_weak(o_ptr, FALSE);
2021                                         }
2022
2023                                         break;
2024                                 case EGO_LITE:
2025                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
2026                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
2027                                         break;
2028                                 case EGO_H_DEMON:
2029                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2030                                         one_in_(3) ?
2031                                                 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2032                                                 one_in_(2) ?
2033                                                 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2034                                                 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2035
2036                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2037                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2038                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2039                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2040                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2041                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2042                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2043                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2044                                         break;
2045                                 default:
2046                                         /* not existing helm (Magi, Might, etc...)*/
2047                                         ok_flag = FALSE;
2048                                 }
2049                                 if (ok_flag)
2050                                         break;
2051                         }
2052
2053                         break;
2054                 }
2055                 else if (power < -1)
2056                 {
2057                         while (TRUE)
2058                         {
2059                                 bool ok_flag = TRUE;
2060                                 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
2061
2062                                 switch (o_ptr->name2)
2063                                 {
2064                                 case EGO_ANCIENT_CURSE:
2065                                         ok_flag = FALSE;
2066                                 }
2067
2068                                 if (ok_flag)
2069                                         break;
2070                         }
2071                 }
2072
2073                 break;
2074         }
2075         case TV_CLOAK:
2076         {
2077                 if (power > 1)
2078                 {
2079                         /* power > 2 is debug only */
2080                         if (one_in_(20) || (power > 2))
2081                         {
2082                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
2083                                 break;
2084                         }
2085                         o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
2086
2087                         switch (o_ptr->name2)
2088                         {
2089                         case EGO_BAT:
2090                                 o_ptr->to_d -= 6;
2091                                 o_ptr->to_h -= 6;
2092                                 break;
2093                         case EGO_NAZGUL:
2094                                 o_ptr->to_d -= 3;
2095                                 o_ptr->to_h -= 3;
2096                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
2097                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
2098                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
2099                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2100                                 break;
2101                         }
2102
2103                 }
2104                 else if (power < -1)
2105                 {
2106                         o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
2107                 }
2108
2109                 break;
2110         }
2111         }
2112 }
2113
2114
2115 /*!
2116  * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
2117  * Apply magic to an item known to be a "ring" or "amulet"
2118  * @param owner_ptr プレーヤーへの参照ポインタ
2119  * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2120  * @param level 生成基準階
2121  * @param power 生成ランク
2122  * @return なし
2123  * @details
2124  * Hack -- note special "pval boost" code for ring of speed\n
2125  * Hack -- note that some items must be cursed (or blessed)\n
2126  */
2127 static void a_m_aux_3(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
2128 {
2129         switch (o_ptr->tval)
2130         {
2131         case TV_RING:
2132         {
2133                 switch (o_ptr->sval)
2134                 {
2135                 case SV_RING_ATTACKS:
2136                 {
2137                         o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
2138                         if (one_in_(15)) o_ptr->pval++;
2139                         if (o_ptr->pval < 1) o_ptr->pval = 1;
2140
2141                         if (power < 0)
2142                         {
2143                                 o_ptr->ident |= (IDENT_BROKEN);
2144                                 o_ptr->curse_flags |= TRC_CURSED;
2145                                 o_ptr->pval = 0 - (o_ptr->pval);
2146                         }
2147
2148                         break;
2149                 }
2150                 case SV_RING_SHOTS:
2151                 {
2152                         break;
2153                 }
2154                 case SV_RING_STR:
2155                 case SV_RING_CON:
2156                 case SV_RING_DEX:
2157                 {
2158                         o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
2159                         if (power < 0)
2160                         {
2161                                 o_ptr->ident |= (IDENT_BROKEN);
2162                                 o_ptr->curse_flags |= TRC_CURSED;
2163                                 o_ptr->pval = 0 - (o_ptr->pval);
2164                         }
2165
2166                         break;
2167                 }
2168                 case SV_RING_SPEED:
2169                 {
2170                         o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
2171                         while (randint0(100) < 50) o_ptr->pval++;
2172
2173                         if (power < 0)
2174                         {
2175                                 o_ptr->ident |= (IDENT_BROKEN);
2176                                 o_ptr->curse_flags |= TRC_CURSED;
2177                                 o_ptr->pval = 0 - (o_ptr->pval);
2178                                 break;
2179                         }
2180
2181                         break;
2182                 }
2183                 case SV_RING_LORDLY:
2184                 {
2185                         do
2186                         {
2187                                 one_lordly_high_resistance(o_ptr);
2188                         } while (one_in_(4));
2189
2190                         o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
2191                         break;
2192                 }
2193                 case SV_RING_WARNING:
2194                 {
2195                         if (one_in_(3)) one_low_esp(o_ptr);
2196                         break;
2197                 }
2198                 case SV_RING_SEARCHING:
2199                 {
2200                         o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
2201                         if (power < 0)
2202                         {
2203                                 o_ptr->ident |= (IDENT_BROKEN);
2204                                 o_ptr->curse_flags |= TRC_CURSED;
2205                                 o_ptr->pval = 0 - (o_ptr->pval);
2206                         }
2207
2208                         break;
2209                 }
2210                 case SV_RING_FLAMES:
2211                 case SV_RING_ACID:
2212                 case SV_RING_ICE:
2213                 case SV_RING_ELEC:
2214                 {
2215                         o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
2216                         break;
2217                 }
2218                 case SV_RING_WEAKNESS:
2219                 case SV_RING_STUPIDITY:
2220                 {
2221                         o_ptr->ident |= (IDENT_BROKEN);
2222                         o_ptr->curse_flags |= TRC_CURSED;
2223                         o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
2224                         if (power > 0) power = 0 - power;
2225
2226                         break;
2227                 }
2228                 case SV_RING_WOE:
2229                 {
2230                         o_ptr->ident |= (IDENT_BROKEN);
2231                         o_ptr->curse_flags |= TRC_CURSED;
2232                         o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
2233                         o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
2234                         if (power > 0) power = 0 - power;
2235
2236                         break;
2237                 }
2238                 case SV_RING_DAMAGE:
2239                 {
2240                         o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
2241                         if (power < 0)
2242                         {
2243                                 o_ptr->ident |= (IDENT_BROKEN);
2244                                 o_ptr->curse_flags |= TRC_CURSED;
2245                                 o_ptr->to_d = 0 - o_ptr->to_d;
2246                         }
2247
2248                         break;
2249                 }
2250                 case SV_RING_ACCURACY:
2251                 {
2252                         o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
2253                         if (power < 0)
2254                         {
2255                                 o_ptr->ident |= (IDENT_BROKEN);
2256                                 o_ptr->curse_flags |= TRC_CURSED;
2257                                 o_ptr->to_h = 0 - o_ptr->to_h;
2258                         }
2259
2260                         break;
2261                 }
2262                 case SV_RING_PROTECTION:
2263                 {
2264                         o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
2265                         if (power < 0)
2266                         {
2267                                 o_ptr->ident |= (IDENT_BROKEN);
2268                                 o_ptr->curse_flags |= TRC_CURSED;
2269                                 o_ptr->to_a = 0 - o_ptr->to_a;
2270                         }
2271
2272                         break;
2273                 }
2274                 case SV_RING_SLAYING:
2275                 {
2276                         o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
2277                         o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
2278
2279                         if (power < 0)
2280                         {
2281                                 o_ptr->ident |= (IDENT_BROKEN);
2282                                 o_ptr->curse_flags |= TRC_CURSED;
2283                                 o_ptr->to_h = 0 - o_ptr->to_h;
2284                                 o_ptr->to_d = 0 - o_ptr->to_d;
2285                         }
2286
2287                         break;
2288                 }
2289                 case SV_RING_MUSCLE:
2290                 {
2291                         o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
2292                         if (one_in_(4)) o_ptr->pval++;
2293
2294                         if (power < 0)
2295                         {
2296                                 o_ptr->ident |= (IDENT_BROKEN);
2297                                 o_ptr->curse_flags |= TRC_CURSED;
2298                                 o_ptr->pval = 0 - o_ptr->pval;
2299                         }
2300
2301                         break;
2302                 }
2303                 case SV_RING_AGGRAVATION:
2304                 {
2305                         o_ptr->ident |= (IDENT_BROKEN);
2306                         o_ptr->curse_flags |= TRC_CURSED;
2307                         if (power > 0) power = 0 - power;
2308                         break;
2309                 }
2310                 }
2311
2312                 /* power > 2 is debug only */
2313                 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79)) || (power > 2))
2314                 {
2315                         o_ptr->pval = MIN(o_ptr->pval, 4);
2316                         become_random_artifact(owner_ptr, o_ptr, FALSE);
2317                 }
2318                 else if ((power == 2) && one_in_(2))
2319                 {
2320                         while (!o_ptr->name2)
2321                         {
2322                                 int tmp = m_bonus(10, level);
2323                                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2324                                 switch (randint1(28))
2325                                 {
2326                                 case 1: case 2:
2327                                         o_ptr->name2 = EGO_RING_THROW;
2328                                         break;
2329                                 case 3: case 4:
2330                                         if (have_flag(k_ptr->flags, TR_REGEN)) break;
2331                                         o_ptr->name2 = EGO_RING_REGEN;
2332                                         break;
2333                                 case 5: case 6:
2334                                         if (have_flag(k_ptr->flags, TR_LITE_1)) break;
2335                                         o_ptr->name2 = EGO_RING_LITE;
2336                                         break;
2337                                 case 7: case 8:
2338                                         if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
2339                                         o_ptr->name2 = EGO_RING_TELEPORT;
2340                                         break;
2341                                 case 9: case 10:
2342                                         if (o_ptr->to_h) break;
2343                                         o_ptr->name2 = EGO_RING_TO_H;
2344                                         break;
2345                                 case 11: case 12:
2346                                         if (o_ptr->to_d) break;
2347                                         o_ptr->name2 = EGO_RING_TO_D;
2348                                         break;
2349                                 case 13:
2350                                         if ((o_ptr->to_h) || (o_ptr->to_d)) break;
2351                                         o_ptr->name2 = EGO_RING_SLAY;
2352                                         break;
2353                                 case 14:
2354                                         if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
2355                                         o_ptr->name2 = EGO_RING_WIZARD;
2356                                         break;
2357                                 case 15:
2358                                         if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
2359                                         o_ptr->name2 = EGO_RING_HERO;
2360                                         break;
2361                                 case 16:
2362                                         if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
2363                                         if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
2364                                         else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
2365                                         else o_ptr->name2 = EGO_RING_MAGIC_MIS;
2366                                         break;
2367                                 case 17:
2368                                         if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
2369                                         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;
2370                                         if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
2371                                         else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
2372                                         else o_ptr->name2 = EGO_RING_FIRE_BOLT;
2373                                         break;
2374                                 case 18:
2375                                         if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
2376                                         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;
2377                                         if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
2378                                         else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
2379                                         else o_ptr->name2 = EGO_RING_COLD_BOLT;
2380                                         break;
2381                                 case 19:
2382                                         if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
2383                                         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;
2384                                         if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
2385                                         else o_ptr->name2 = EGO_RING_ELEC_BOLT;
2386                                         break;
2387                                 case 20:
2388                                         if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
2389                                         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;
2390                                         if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
2391                                         else o_ptr->name2 = EGO_RING_ACID_BOLT;
2392                                         break;
2393                                 case 21: case 22: case 23: case 24: case 25: case 26:
2394                                         switch (o_ptr->sval)
2395                                         {
2396                                         case SV_RING_SPEED:
2397                                                 if (!one_in_(3)) break;
2398                                                 o_ptr->name2 = EGO_RING_D_SPEED;
2399                                                 break;
2400                                         case SV_RING_DAMAGE:
2401                                         case SV_RING_ACCURACY:
2402                                         case SV_RING_SLAYING:
2403                                                 if (one_in_(2)) break;
2404                                                 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
2405                                                 else
2406                                                 {
2407                                                         o_ptr->name2 = EGO_RING_BERSERKER;
2408                                                         o_ptr->to_h -= 2 + randint1(4);
2409                                                         o_ptr->to_d += 2 + randint1(4);
2410                                                 }
2411
2412                                                 break;
2413                                         case SV_RING_PROTECTION:
2414                                                 o_ptr->name2 = EGO_RING_SUPER_AC;
2415                                                 o_ptr->to_a += 7 + m_bonus(5, level);
2416                                                 break;
2417                                         case SV_RING_RES_FEAR:
2418                                                 o_ptr->name2 = EGO_RING_HERO;
2419                                                 break;
2420                                         case SV_RING_SHOTS:
2421                                                 if (one_in_(2)) break;
2422                                                 o_ptr->name2 = EGO_RING_HUNTER;
2423                                                 break;
2424                                         case SV_RING_SEARCHING:
2425                                                 o_ptr->name2 = EGO_RING_STEALTH;
2426                                                 break;
2427                                         case SV_RING_TELEPORTATION:
2428                                                 o_ptr->name2 = EGO_RING_TELE_AWAY;
2429                                                 break;
2430                                         case SV_RING_RES_BLINDNESS:
2431                                                 if (one_in_(2))
2432                                                         o_ptr->name2 = EGO_RING_RES_LITE;
2433                                                 else
2434                                                         o_ptr->name2 = EGO_RING_RES_DARK;
2435                                                 break;
2436                                         case SV_RING_LORDLY:
2437                                                 if (!one_in_(20)) break;
2438                                                 one_lordly_high_resistance(o_ptr);
2439                                                 one_lordly_high_resistance(o_ptr);
2440                                                 o_ptr->name2 = EGO_RING_TRUE;
2441                                                 break;
2442                                         case SV_RING_SUSTAIN:
2443                                                 if (!one_in_(4)) break;
2444                                                 o_ptr->name2 = EGO_RING_RES_TIME;
2445                                                 break;
2446                                         case SV_RING_FLAMES:
2447                                                 if (!one_in_(2)) break;
2448                                                 o_ptr->name2 = EGO_RING_DRAGON_F;
2449                                                 break;
2450                                         case SV_RING_ICE:
2451                                                 if (!one_in_(2)) break;
2452                                                 o_ptr->name2 = EGO_RING_DRAGON_C;
2453                                                 break;
2454                                         case SV_RING_WARNING:
2455                                                 if (!one_in_(2)) break;
2456                                                 o_ptr->name2 = EGO_RING_M_DETECT;
2457                                                 break;
2458                                         default:
2459                                                 break;
2460                                         }
2461
2462                                         break;
2463                                 }
2464                         }
2465
2466                         o_ptr->curse_flags = 0L;
2467                 }
2468                 else if ((power == -2) && one_in_(2))
2469                 {
2470                         if (o_ptr->to_h > 0) o_ptr->to_h = 0 - o_ptr->to_h;
2471                         if (o_ptr->to_d > 0) o_ptr->to_d = 0 - o_ptr->to_d;
2472                         if (o_ptr->to_a > 0) o_ptr->to_a = 0 - o_ptr->to_a;
2473                         if (o_ptr->pval > 0) o_ptr->pval = 0 - o_ptr->pval;
2474                         o_ptr->art_flags[0] = 0;
2475                         o_ptr->art_flags[1] = 0;
2476                         while (!o_ptr->name2)
2477                         {
2478                                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2479                                 switch (randint1(5))
2480                                 {
2481                                 case 1:
2482                                         if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
2483                                         o_ptr->name2 = EGO_RING_DRAIN_EXP;
2484                                         break;
2485                                 case 2:
2486                                         o_ptr->name2 = EGO_RING_NO_MELEE;
2487                                         break;
2488                                 case 3:
2489                                         if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
2490                                         o_ptr->name2 = EGO_RING_AGGRAVATE;
2491                                         break;
2492                                 case 4:
2493                                         if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
2494                                         o_ptr->name2 = EGO_RING_TY_CURSE;
2495                                         break;
2496                                 case 5:
2497                                         o_ptr->name2 = EGO_RING_ALBINO;
2498                                         break;
2499                                 }
2500                         }
2501
2502                         o_ptr->ident |= (IDENT_BROKEN);
2503                         o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
2504                 }
2505
2506                 break;
2507         }
2508         case TV_AMULET:
2509         {
2510                 switch (o_ptr->sval)
2511                 {
2512                 case SV_AMULET_INTELLIGENCE:
2513                 case SV_AMULET_WISDOM:
2514                 case SV_AMULET_CHARISMA:
2515                 {
2516                         o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
2517                         if (power < 0)
2518                         {
2519                                 o_ptr->ident |= (IDENT_BROKEN);
2520                                 o_ptr->curse_flags |= (TRC_CURSED);
2521                                 o_ptr->pval = 0 - o_ptr->pval;
2522                         }
2523
2524                         break;
2525                 }
2526                 case SV_AMULET_BRILLIANCE:
2527                 {
2528                         o_ptr->pval = 1 + m_bonus(3, level);
2529                         if (one_in_(4)) o_ptr->pval++;
2530
2531                         if (power < 0)
2532                         {
2533                                 o_ptr->ident |= (IDENT_BROKEN);
2534                                 o_ptr->curse_flags |= (TRC_CURSED);
2535                                 o_ptr->pval = 0 - o_ptr->pval;
2536                         }
2537
2538                         break;
2539                 }
2540                 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
2541                 {
2542                         if (power < 0)
2543                         {
2544                                 o_ptr->curse_flags |= (TRC_CURSED);
2545                         }
2546
2547                         break;
2548                 }
2549                 case SV_AMULET_RESISTANCE:
2550                 {
2551                         if (one_in_(5)) one_high_resistance(o_ptr);
2552                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2553                         break;
2554                 }
2555                 case SV_AMULET_SEARCHING:
2556                 {
2557                         o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
2558                         if (power < 0)
2559                         {
2560                                 o_ptr->ident |= (IDENT_BROKEN);
2561                                 o_ptr->curse_flags |= (TRC_CURSED);
2562                                 o_ptr->pval = 0 - (o_ptr->pval);
2563                         }
2564
2565                         break;
2566                 }
2567                 case SV_AMULET_THE_MAGI:
2568                 {
2569                         o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
2570                         o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
2571                         add_esp_weak(o_ptr, FALSE);
2572                         break;
2573                 }
2574                 case SV_AMULET_DOOM:
2575                 {
2576                         o_ptr->ident |= (IDENT_BROKEN);
2577                         o_ptr->curse_flags |= (TRC_CURSED);
2578                         o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
2579                         o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
2580                         if (power > 0) power = 0 - power;
2581
2582                         break;
2583                 }
2584                 case SV_AMULET_MAGIC_MASTERY:
2585                 {
2586                         o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
2587                         if (power < 0)
2588                         {
2589                                 o_ptr->ident |= (IDENT_BROKEN);
2590                                 o_ptr->curse_flags |= (TRC_CURSED);
2591                                 o_ptr->pval = 0 - o_ptr->pval;
2592                         }
2593
2594                         break;
2595                 }
2596                 }
2597
2598                 /* power > 2 is debug only */
2599                 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79)) || (power > 2))
2600                 {
2601                         o_ptr->pval = MIN(o_ptr->pval, 4);
2602                         become_random_artifact(owner_ptr, o_ptr, FALSE);
2603                 }
2604                 else if ((power == 2) && one_in_(2))
2605                 {
2606                         while (!o_ptr->name2)
2607                         {
2608                                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2609                                 switch (randint1(21))
2610                                 {
2611                                 case 1: case 2:
2612                                         if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
2613                                         o_ptr->name2 = EGO_AMU_SLOW_D;
2614                                         break;
2615                                 case 3: case 4:
2616                                         if (o_ptr->pval) break;
2617                                         o_ptr->name2 = EGO_AMU_INFRA;
2618                                         break;
2619                                 case 5: case 6:
2620                                         if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
2621                                         o_ptr->name2 = EGO_AMU_SEE_INVIS;
2622                                         break;
2623                                 case 7: case 8:
2624                                         if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
2625                                         o_ptr->name2 = EGO_AMU_HOLD_EXP;
2626                                         break;
2627                                 case 9:
2628                                         if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
2629                                         o_ptr->name2 = EGO_AMU_LEVITATION;
2630                                         break;
2631                                 case 10: case 11: case 21:
2632                                         o_ptr->name2 = EGO_AMU_AC;
2633                                         break;
2634                                 case 12:
2635                                         if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
2636                                         if (m_bonus(10, level) > 8)
2637                                                 o_ptr->name2 = EGO_AMU_RES_FIRE_;
2638                                         else
2639                                                 o_ptr->name2 = EGO_AMU_RES_FIRE;
2640                                         break;
2641                                 case 13:
2642                                         if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
2643                                         if (m_bonus(10, level) > 8)
2644                                                 o_ptr->name2 = EGO_AMU_RES_COLD_;
2645                                         else
2646                                                 o_ptr->name2 = EGO_AMU_RES_COLD;
2647                                         break;
2648                                 case 14:
2649                                         if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
2650                                         if (m_bonus(10, level) > 8)
2651                                                 o_ptr->name2 = EGO_AMU_RES_ELEC_;
2652                                         else
2653                                                 o_ptr->name2 = EGO_AMU_RES_ELEC;
2654                                         break;
2655                                 case 15:
2656                                         if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
2657                                         if (m_bonus(10, level) > 8)
2658                                                 o_ptr->name2 = EGO_AMU_RES_ACID_;
2659                                         else
2660                                                 o_ptr->name2 = EGO_AMU_RES_ACID;
2661                                         break;
2662                                 case 16: case 17: case 18: case 19: case 20:
2663                                         switch (o_ptr->sval)
2664                                         {
2665                                         case SV_AMULET_TELEPORT:
2666                                                 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
2667                                                 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
2668                                                 else o_ptr->name2 = EGO_AMU_TELEPORT;
2669                                                 break;
2670                                         case SV_AMULET_RESIST_ACID:
2671                                                 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
2672                                                 break;
2673                                         case SV_AMULET_SEARCHING:
2674                                                 o_ptr->name2 = EGO_AMU_STEALTH;
2675                                                 break;
2676                                         case SV_AMULET_BRILLIANCE:
2677                                                 if (!one_in_(3)) break;
2678                                                 o_ptr->name2 = EGO_AMU_IDENT;
2679                                                 break;
2680                                         case SV_AMULET_CHARISMA:
2681                                                 if (!one_in_(3)) break;
2682                                                 o_ptr->name2 = EGO_AMU_CHARM;
2683                                                 break;
2684                                         case SV_AMULET_THE_MAGI:
2685                                                 if (one_in_(2)) break;
2686                                                 o_ptr->name2 = EGO_AMU_GREAT;
2687                                                 break;
2688                                         case SV_AMULET_RESISTANCE:
2689                                                 if (!one_in_(5)) break;
2690                                                 o_ptr->name2 = EGO_AMU_DEFENDER;
2691                                                 break;
2692                                         case SV_AMULET_TELEPATHY:
2693                                                 if (!one_in_(3)) break;
2694                                                 o_ptr->name2 = EGO_AMU_DETECTION;
2695                                                 break;
2696                                         }
2697                                 }
2698                         }
2699                         o_ptr->curse_flags = 0L;
2700                 }
2701                 else if ((power == -2) && one_in_(2))
2702                 {
2703                         if (o_ptr->to_h > 0) o_ptr->to_h = 0 - o_ptr->to_h;
2704                         if (o_ptr->to_d > 0) o_ptr->to_d = 0 - o_ptr->to_d;
2705                         if (o_ptr->to_a > 0) o_ptr->to_a = 0 - o_ptr->to_a;
2706                         if (o_ptr->pval > 0) o_ptr->pval = 0 - o_ptr->pval;
2707                         o_ptr->art_flags[0] = 0;
2708                         o_ptr->art_flags[1] = 0;
2709                         while (!o_ptr->name2)
2710                         {
2711                                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2712                                 switch (randint1(5))
2713                                 {
2714                                 case 1:
2715                                         if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
2716                                         o_ptr->name2 = EGO_AMU_DRAIN_EXP;
2717                                         break;
2718                                 case 2:
2719                                         o_ptr->name2 = EGO_AMU_FOOL;
2720                                         break;
2721                                 case 3:
2722                                         if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
2723                                         o_ptr->name2 = EGO_AMU_AGGRAVATE;
2724                                         break;
2725                                 case 4:
2726                                         if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
2727                                         o_ptr->name2 = EGO_AMU_TY_CURSE;
2728                                         break;
2729                                 case 5:
2730                                         o_ptr->name2 = EGO_AMU_NAIVETY;
2731                                         break;
2732                                 }
2733                         }
2734
2735                         o_ptr->ident |= (IDENT_BROKEN);
2736                         o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
2737                 }
2738
2739                 break;
2740         }
2741         }
2742 }
2743
2744
2745 /*!
2746  * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
2747  * Apply magic to an item known to be "boring"
2748  * @param owner_ptr プレーヤーへの参照ポインタ
2749  * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2750  * @param power 生成ランク
2751  * @return なし
2752  * @details
2753  * Hack -- note the special code for various items
2754  */
2755 static void a_m_aux_4(player_type *owner_ptr, object_type *o_ptr, int power)
2756 {
2757         object_kind *k_ptr = &k_info[o_ptr->k_idx];
2758
2759         floor_type *floor_ptr = owner_ptr->current_floor_ptr;
2760         switch (o_ptr->tval)
2761         {
2762         case TV_WHISTLE:
2763         {
2764                 break;
2765         }
2766         case TV_FLASK:
2767         {
2768                 o_ptr->xtra4 = o_ptr->pval;
2769                 o_ptr->pval = 0;
2770                 break;
2771         }
2772         case TV_LITE:
2773         {
2774                 if (o_ptr->sval == SV_LITE_TORCH)
2775                 {
2776                         if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
2777                         o_ptr->pval = 0;
2778                 }
2779
2780                 if (o_ptr->sval == SV_LITE_LANTERN)
2781                 {
2782                         if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
2783                         o_ptr->pval = 0;
2784                 }
2785
2786                 /* power > 2 is debug only */
2787                 if (power > 2)
2788                 {
2789                         become_random_artifact(owner_ptr, o_ptr, FALSE);
2790                 }
2791                 else if ((power == 2) || ((power == 1) && one_in_(3)))
2792                 {
2793                         while (!o_ptr->name2)
2794                         {
2795                                 while (TRUE)
2796                                 {
2797                                         bool okay_flag = TRUE;
2798
2799                                         o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
2800
2801                                         switch (o_ptr->name2)
2802                                         {
2803                                         case EGO_LITE_LONG:
2804                                                 if (o_ptr->sval == SV_LITE_FEANOR)
2805                                                         okay_flag = FALSE;
2806                                         }
2807
2808                                         if (okay_flag)
2809                                                 break;
2810                                 }
2811                         }
2812                 }
2813                 else if (power == -2)
2814                 {
2815                         o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
2816                         switch (o_ptr->name2)
2817                         {
2818                         case EGO_LITE_DARKNESS:
2819                                 o_ptr->xtra4 = 0;
2820
2821                                 if (o_ptr->sval == SV_LITE_TORCH)
2822                                 {
2823                                         add_flag(o_ptr->art_flags, TR_LITE_M1);
2824                                 }
2825                                 else if (o_ptr->sval == SV_LITE_LANTERN)
2826                                 {
2827                                         add_flag(o_ptr->art_flags, TR_LITE_M2);
2828                                 }
2829                                 else if (o_ptr->sval == SV_LITE_FEANOR)
2830                                 {
2831                                         add_flag(o_ptr->art_flags, TR_LITE_M3);
2832                                 }
2833                                 break;
2834                         }
2835                 }
2836
2837                 break;
2838         }
2839         case TV_WAND:
2840         case TV_STAFF:
2841         {
2842                 /* The wand or staff gets a number of initial charges equal
2843                  * to between 1/2 (+1) and the full object kind's pval. -LM-
2844                  */
2845                 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
2846                 break;
2847         }
2848         case TV_ROD:
2849         {
2850                 o_ptr->pval = k_ptr->pval;
2851                 break;
2852         }
2853         case TV_CAPTURE:
2854         {
2855                 o_ptr->pval = 0;
2856                 object_aware(owner_ptr, o_ptr);
2857                 object_known(o_ptr);
2858                 break;
2859         }
2860         case TV_FIGURINE:
2861         {
2862                 PARAMETER_VALUE i = 1;
2863                 int check;
2864                 monster_race *r_ptr;
2865                 while (TRUE)
2866                 {
2867                         i = randint1(max_r_idx - 1);
2868
2869                         if (!item_monster_okay(i)) continue;
2870                         if (i == MON_TSUCHINOKO) continue;
2871
2872                         r_ptr = &r_info[i];
2873                         check = (floor_ptr->dun_level < r_ptr->level) ? (r_ptr->level - floor_ptr->dun_level) : 0;
2874                         if (!r_ptr->rarity) continue;
2875                         if (r_ptr->rarity > 100) continue;
2876                         if (randint0(check)) continue;
2877
2878                         break;
2879                 }
2880
2881                 o_ptr->pval = i;
2882                 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
2883
2884                 break;
2885         }
2886         case TV_CORPSE:
2887         {
2888                 PARAMETER_VALUE i = 1;
2889                 int check;
2890                 u32b match = 0;
2891                 monster_race *r_ptr;
2892                 if (o_ptr->sval == SV_SKELETON)
2893                 {
2894                         match = RF9_DROP_SKELETON;
2895                 }
2896                 else if (o_ptr->sval == SV_CORPSE)
2897                 {
2898                         match = RF9_DROP_CORPSE;
2899                 }
2900
2901                 get_mon_num_prep(owner_ptr, item_monster_okay, NULL);
2902                 while (TRUE)
2903                 {
2904                         i = get_mon_num(owner_ptr, floor_ptr->dun_level, 0);
2905                         r_ptr = &r_info[i];
2906                         check = (floor_ptr->dun_level < r_ptr->level) ? (r_ptr->level - floor_ptr->dun_level) : 0;
2907                         if (!r_ptr->rarity) continue;
2908                         if (!(r_ptr->flags9 & match)) continue;
2909                         if (randint0(check)) continue;
2910
2911                         break;
2912                 }
2913
2914                 o_ptr->pval = i;
2915                 object_aware(owner_ptr, o_ptr);
2916                 object_known(o_ptr);
2917                 break;
2918         }
2919         case TV_STATUE:
2920         {
2921                 PARAMETER_VALUE i = 1;
2922                 monster_race *r_ptr;
2923                 while (TRUE)
2924                 {
2925                         i = randint1(max_r_idx - 1);
2926                         r_ptr = &r_info[i];
2927                         if (!r_ptr->rarity) continue;
2928
2929                         break;
2930                 }
2931
2932                 o_ptr->pval = i;
2933                 if (cheat_peek)
2934                 {
2935                         msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
2936                 }
2937
2938                 object_aware(owner_ptr, o_ptr);
2939                 object_known(o_ptr);
2940                 break;
2941         }
2942         case TV_CHEST:
2943         {
2944                 DEPTH obj_level = k_info[o_ptr->k_idx].level;
2945                 if (obj_level <= 0) break;
2946
2947                 o_ptr->pval = randint1(obj_level);
2948                 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
2949
2950                 o_ptr->xtra3 = floor_ptr->dun_level + 5;
2951                 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
2952
2953                 break;
2954         }
2955         }
2956 }
2957
2958
2959 /*!
2960  * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
2961  * Complete the "creation" of an object by applying "magic" to the item
2962  * @param owner_ptr プレーヤーへの参照ポインタ
2963  * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2964  * @param lev 生成基準階
2965  * @param mode 生成オプション
2966  * @return なし
2967  * @details
2968  * This includes not only rolling for random bonuses, but also putting the\n
2969  * finishing touches on ego-items and artifacts, giving charges to wands and\n
2970  * staffs, giving fuel to lites, and placing traps on chests.\n
2971  *\n
2972  * In particular, note that "Instant Artifacts", if "created" by an external\n
2973  * routine, must pass through this function to complete the actual creation.\n
2974  *\n
2975  * The base "chance" of the item being "good" increases with the "level"\n
2976  * parameter, which is usually derived from the dungeon level, being equal\n
2977  * to the level plus 10, up to a maximum of 75.  If "good" is true, then\n
2978  * the object is guaranteed to be "good".  If an object is "good", then\n
2979  * the chance that the object will be "great" (ego-item or artifact), also\n
2980  * increases with the "level", being equal to half the level, plus 5, up to\n
2981  * a maximum of 20.  If "great" is true, then the object is guaranteed to be\n
2982  * "great".  At dungeon level 65 and below, 15/100 objects are "great".\n
2983  *\n
2984  * If the object is not "good", there is a chance it will be "cursed", and\n
2985  * if it is "cursed", there is a chance it will be "broken".  These chances\n
2986  * are related to the "good" / "great" chances above.\n
2987  *\n
2988  * Otherwise "normal" rings and amulets will be "good" half the time and\n
2989  * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
2990  *\n
2991  * If "okay" is true, and the object is going to be "great", then there is\n
2992  * a chance that an artifact will be created.  This is true even if both the\n
2993  * "good" and "great" arguments are false.  As a total hack, if "great" is\n
2994  * true, then the item gets 3 extra "attempts" to become an artifact.\n
2995  */
2996 void apply_magic(player_type *owner_ptr, object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
2997 {
2998         if (owner_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(owner_ptr->lev / 2 + 10);
2999         if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
3000
3001         int f1 = lev + 10;
3002         if (f1 > d_info[owner_ptr->dungeon_idx].obj_good) f1 = d_info[owner_ptr->dungeon_idx].obj_good;
3003
3004         int f2 = f1 * 2 / 3;
3005         if ((owner_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[owner_ptr->dungeon_idx].obj_great))
3006                 f2 = d_info[owner_ptr->dungeon_idx].obj_great;
3007
3008         if (owner_ptr->muta3 & MUT3_GOOD_LUCK)
3009         {
3010                 f1 += 5;
3011                 f2 += 2;
3012         }
3013         else if (owner_ptr->muta3 & MUT3_BAD_LUCK)
3014         {
3015                 f1 -= 5;
3016                 f2 -= 2;
3017         }
3018
3019         int power = 0;
3020         if ((mode & AM_GOOD) || magik(f1))
3021         {
3022                 power = 1;
3023                 if ((mode & AM_GREAT) || magik(f2))
3024                 {
3025                         power = 2;
3026                         if (mode & AM_SPECIAL) power = 3;
3027                 }
3028         }
3029         else if (magik(f1))
3030         {
3031                 power = -1;
3032                 if (magik(f2)) power = -2;
3033         }
3034         if (mode & AM_CURSED)
3035         {
3036                 if (power > 0)
3037                 {
3038                         power = 0 - power;
3039                 }
3040                 else
3041                 {
3042                         power--;
3043                 }
3044         }
3045
3046         int rolls = 0;
3047         if (power >= 2) rolls = 1;
3048
3049         if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
3050         if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
3051
3052         for (int i = 0; i < rolls; i++)
3053         {
3054                 if (make_artifact(owner_ptr, o_ptr)) break;
3055                 if ((owner_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
3056                 {
3057                         if (make_artifact(owner_ptr, o_ptr)) break;
3058                 }
3059         }
3060
3061         if (object_is_fixed_artifact(o_ptr))
3062         {
3063                 artifact_type *a_ptr = &a_info[o_ptr->name1];
3064                 a_ptr->cur_num = 1;
3065                 if (current_world_ptr->character_dungeon)
3066                         a_ptr->floor_id = owner_ptr->floor_id;
3067
3068                 o_ptr->pval = a_ptr->pval;
3069                 o_ptr->ac = a_ptr->ac;
3070                 o_ptr->dd = a_ptr->dd;
3071                 o_ptr->ds = a_ptr->ds;
3072                 o_ptr->to_a = a_ptr->to_a;
3073                 o_ptr->to_h = a_ptr->to_h;
3074                 o_ptr->to_d = a_ptr->to_d;
3075                 o_ptr->weight = a_ptr->weight;
3076                 o_ptr->xtra2 = a_ptr->act_idx;
3077
3078                 if (o_ptr->name1 == ART_MILIM)
3079                 {
3080                         if (owner_ptr->pseikaku == SEIKAKU_SEXY)
3081                         {
3082                                 o_ptr->pval = 3;
3083                         }
3084                 }
3085
3086                 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
3087                 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
3088                 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3089                 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
3090                 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
3091                 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
3092                 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
3093
3094                 return;
3095         }
3096
3097         switch (o_ptr->tval)
3098         {
3099         case TV_DIGGING:
3100         case TV_HAFTED:
3101         case TV_BOW:
3102         case TV_SHOT:
3103         case TV_ARROW:
3104         case TV_BOLT:
3105         {
3106                 if (power) apply_magic_weapon(owner_ptr, o_ptr, lev, power);
3107                 break;
3108         }
3109         case TV_POLEARM:
3110         {
3111                 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) apply_magic_weapon(owner_ptr, o_ptr, lev, power);
3112                 break;
3113         }
3114         case TV_SWORD:
3115         {
3116                 if (power && !(o_ptr->sval == SV_POISON_NEEDLE)) apply_magic_weapon(owner_ptr, o_ptr, lev, power);
3117                 break;
3118         }
3119         case TV_DRAG_ARMOR:
3120         case TV_HARD_ARMOR:
3121         case TV_SOFT_ARMOR:
3122         case TV_SHIELD:
3123         case TV_HELM:
3124         case TV_CROWN:
3125         case TV_CLOAK:
3126         case TV_GLOVES:
3127         case TV_BOOTS:
3128         {
3129                 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
3130                         ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
3131                         o_ptr->pval = randint1(4);
3132
3133                 if (power ||
3134                         ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
3135                         ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
3136                         ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
3137                         ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
3138                         a_m_aux_2(owner_ptr, o_ptr, lev, power);
3139
3140                 break;
3141         }
3142         case TV_RING:
3143         case TV_AMULET:
3144         {
3145                 if (!power && (randint0(100) < 50)) power = -1;
3146                 a_m_aux_3(owner_ptr, o_ptr, lev, power);
3147                 break;
3148         }
3149         default:
3150         {
3151                 a_m_aux_4(owner_ptr, o_ptr, power);
3152                 break;
3153         }
3154         }
3155
3156         if ((o_ptr->tval == TV_SOFT_ARMOR) &&
3157                 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
3158                 (owner_ptr->pseikaku == SEIKAKU_SEXY))
3159         {
3160                 o_ptr->pval = 3;
3161                 add_flag(o_ptr->art_flags, TR_STR);
3162                 add_flag(o_ptr->art_flags, TR_INT);
3163                 add_flag(o_ptr->art_flags, TR_WIS);
3164                 add_flag(o_ptr->art_flags, TR_DEX);
3165                 add_flag(o_ptr->art_flags, TR_CON);
3166                 add_flag(o_ptr->art_flags, TR_CHR);
3167         }
3168
3169         if (object_is_ego(o_ptr))
3170         {
3171                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
3172                 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
3173
3174                 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
3175                 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3176                 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
3177                 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
3178                 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
3179                 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
3180
3181                 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
3182                 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
3183                 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
3184                 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
3185                 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
3186                 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
3187                 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
3188                 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
3189                 {
3190                         do
3191                         {
3192                                 o_ptr->dd++;
3193                         } while (one_in_(o_ptr->dd));
3194
3195                         if (o_ptr->dd > 9) o_ptr->dd = 9;
3196                 }
3197
3198                 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
3199
3200                 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
3201                 {
3202                         if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
3203                         if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
3204                         if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
3205                         if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
3206                 }
3207                 else
3208                 {
3209                         if (e_ptr->max_to_h)
3210                         {
3211                                 if (e_ptr->max_to_h > 127)
3212                                         o_ptr->to_h -= randint1(256 - e_ptr->max_to_h);
3213                                 else o_ptr->to_h += randint1(e_ptr->max_to_h);
3214                         }
3215
3216                         if (e_ptr->max_to_d)
3217                         {
3218                                 if (e_ptr->max_to_d > 127)
3219                                         o_ptr->to_d -= randint1(256 - e_ptr->max_to_d);
3220                                 else o_ptr->to_d += randint1(e_ptr->max_to_d);
3221                         }
3222
3223                         if (e_ptr->max_to_a)
3224                         {
3225                                 if (e_ptr->max_to_a > 127)
3226                                         o_ptr->to_a -= randint1(256 - e_ptr->max_to_a);
3227                                 else o_ptr->to_a += randint1(e_ptr->max_to_a);
3228                         }
3229
3230                         if (o_ptr->name2 == EGO_ACCURACY)
3231                         {
3232                                 while (o_ptr->to_h < o_ptr->to_d + 10)
3233                                 {
3234                                         o_ptr->to_h += 5;
3235                                         o_ptr->to_d -= 5;
3236                                 }
3237                                 o_ptr->to_h = MAX(o_ptr->to_h, 15);
3238                         }
3239
3240                         if (o_ptr->name2 == EGO_VELOCITY)
3241                         {
3242                                 while (o_ptr->to_d < o_ptr->to_h + 10)
3243                                 {
3244                                         o_ptr->to_d += 5;
3245                                         o_ptr->to_h -= 5;
3246                                 }
3247                                 o_ptr->to_d = MAX(o_ptr->to_d, 15);
3248                         }
3249
3250                         if ((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
3251                         {
3252                                 o_ptr->to_a = MAX(o_ptr->to_a, 15);
3253                         }
3254
3255                         if (e_ptr->max_pval)
3256                         {
3257                                 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
3258                                 {
3259                                         o_ptr->pval++;
3260                                         if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds + 1)) < 15)) o_ptr->pval++;
3261                                 }
3262                                 else if (o_ptr->name2 == EGO_DEMON)
3263                                 {
3264                                         if (have_flag(o_ptr->art_flags, TR_BLOWS))
3265                                         {
3266                                                 o_ptr->pval += randint1(2);
3267                                         }
3268                                         else
3269                                         {
3270                                                 o_ptr->pval += randint1(e_ptr->max_pval);
3271                                         }
3272                                 }
3273                                 else if (o_ptr->name2 == EGO_ATTACKS)
3274                                 {
3275                                         o_ptr->pval = randint1(e_ptr->max_pval*lev / 100 + 1);
3276                                         if (o_ptr->pval > 3) o_ptr->pval = 3;
3277                                         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
3278                                                 o_ptr->pval += randint1(2);
3279                                 }
3280                                 else if (o_ptr->name2 == EGO_BAT)
3281                                 {
3282                                         o_ptr->pval = randint1(e_ptr->max_pval);
3283                                         if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
3284                                 }
3285                                 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
3286                                 {
3287                                         o_ptr->pval = randint1(e_ptr->max_pval);
3288                                 }
3289                                 else
3290                                 {
3291                                         o_ptr->pval += randint1(e_ptr->max_pval);
3292                                 }
3293                         }
3294
3295                         if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
3296                         {
3297                                 o_ptr->pval = randint1(o_ptr->pval);
3298                         }
3299
3300                         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
3301                                 o_ptr->pval = 2;
3302                 }
3303
3304                 return;
3305         }
3306
3307         if (o_ptr->k_idx)
3308         {
3309                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
3310                 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
3311
3312                 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
3313                 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
3314                 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
3315                 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
3316                 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
3317                 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
3318         }
3319 }
3320
3321
3322 /*!
3323  * @brief 生成階に応じたベースアイテムの生成を行う。
3324  * Attempt to make an object (normal or good/great)
3325  * @param owner_ptr プレーヤーへの参照ポインタ
3326  * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
3327  * @param mode オプションフラグ
3328  * @return 生成に成功したらTRUEを返す。
3329  * @details
3330  * This routine plays nasty games to generate the "special artifacts".\n
3331  * This routine uses "floor_ptr->object_level" for the "generation level".\n
3332  * We assume that the given object has been "wiped".\n
3333  */
3334 bool make_object(player_type *owner_ptr, object_type *j_ptr, BIT_FLAGS mode)
3335 {
3336         floor_type *floor_ptr = owner_ptr->current_floor_ptr;
3337         PERCENTAGE prob = ((mode & AM_GOOD) ? 10 : 1000);
3338         DEPTH base = ((mode & AM_GOOD) ? (floor_ptr->object_level + 10) : floor_ptr->object_level);
3339         if (!one_in_(prob) || !make_artifact_special(owner_ptr, j_ptr))
3340         {
3341                 KIND_OBJECT_IDX k_idx;
3342                 if ((mode & AM_GOOD) && !get_obj_num_hook)
3343                 {
3344                         get_obj_num_hook = kind_is_good;
3345                 }
3346
3347                 if (get_obj_num_hook) get_obj_num_prep();
3348
3349                 k_idx = get_obj_num(owner_ptr, base, mode);
3350                 if (get_obj_num_hook)
3351                 {
3352                         get_obj_num_hook = NULL;
3353                         get_obj_num_prep();
3354                 }
3355
3356                 if (!k_idx) return FALSE;
3357
3358                 object_prep(j_ptr, k_idx);
3359         }
3360
3361         apply_magic(owner_ptr, j_ptr, floor_ptr->object_level, mode);
3362         switch (j_ptr->tval)
3363         {
3364         case TV_SPIKE:
3365         case TV_SHOT:
3366         case TV_ARROW:
3367         case TV_BOLT:
3368         {
3369                 if (!j_ptr->name1)
3370                         j_ptr->number = (byte)damroll(6, 7);
3371         }
3372         }
3373
3374         if (cheat_peek) object_mention(owner_ptr, j_ptr);
3375
3376         return TRUE;
3377 }
3378
3379
3380 /*!
3381  * @brief 生成階に応じた財宝オブジェクトの生成を行う。
3382  * Make a treasure object
3383  * @param floor_ptr 現在フロアへの参照ポインタ
3384  * @param j_ptr 生成結果を収めたいオブジェクト構造体の参照ポインタ
3385  * @return 生成に成功したらTRUEを返す。
3386  * @details
3387  * The location must be a legal, clean, floor grid.
3388  */
3389 bool make_gold(floor_type *floor_ptr, object_type *j_ptr)
3390 {
3391         int i = ((randint1(floor_ptr->object_level + 2) + 2) / 2) - 1;
3392         if (one_in_(GREAT_OBJ))
3393         {
3394                 i += randint1(floor_ptr->object_level + 1);
3395         }
3396
3397         if (coin_type) i = coin_type;
3398         if (i >= MAX_GOLD) i = MAX_GOLD - 1;
3399         object_prep(j_ptr, OBJ_GOLD_LIST + i);
3400
3401         s32b base = k_info[OBJ_GOLD_LIST + i].cost;
3402         j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
3403
3404         return TRUE;
3405 }
3406
3407
3408 /*!
3409  * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
3410  * Let an object fall to the ground at or near a location.
3411  * @param owner_ptr プレーヤーへの参照ポインタ
3412  * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
3413  * @param chance ドロップの消滅率(%)
3414  * @param y 配置したいフロアのY座標
3415  * @param x 配置したいフロアのX座標
3416  * @return 生成に成功したらオブジェクトのIDを返す。
3417  * @details
3418  * The initial location is assumed to be "in_bounds(floor_ptr, )".\n
3419  *\n
3420  * This function takes a parameter "chance".  This is the percentage\n
3421  * chance that the item will "disappear" instead of drop.  If the object\n
3422  * has been thrown, then this is the chance of disappearance on contact.\n
3423  *\n
3424  * Hack -- this function uses "chance" to determine if it should produce\n
3425  * some form of "description" of the drop event (under the player).\n
3426  *\n
3427  * We check several locations to see if we can find a location at which\n
3428  * the object can combine, stack, or be placed.  Artifacts will try very\n
3429  * hard to be placed, including "teleporting" to a useful grid if needed.\n
3430  */
3431 OBJECT_IDX drop_near(player_type *owner_ptr, object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
3432 {
3433         int i, k, d, s;
3434         POSITION dy, dx;
3435         POSITION ty, tx = 0;
3436         OBJECT_IDX o_idx = 0;
3437         OBJECT_IDX this_o_idx, next_o_idx = 0;
3438         grid_type *g_ptr;
3439         GAME_TEXT o_name[MAX_NLEN];
3440         bool flag = FALSE;
3441         bool done = FALSE;
3442 #ifdef JP
3443 #else
3444         bool plural = (j_ptr->number != 1);
3445 #endif
3446         object_desc(owner_ptr, o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
3447         if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
3448         {
3449 #ifdef JP
3450                 msg_format("%sは消えた。", o_name);
3451 #else
3452                 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
3453 #endif
3454                 if (current_world_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
3455
3456                 return 0;
3457         }
3458
3459         int bs = -1;
3460         int bn = 0;
3461
3462         POSITION by = y;
3463         POSITION bx = x;
3464         floor_type *floor_ptr = owner_ptr->current_floor_ptr;
3465         for (dy = -3; dy <= 3; dy++)
3466         {
3467                 for (dx = -3; dx <= 3; dx++)
3468                 {
3469                         bool comb = FALSE;
3470                         d = (dy * dy) + (dx * dx);
3471                         if (d > 10) continue;
3472
3473                         ty = y + dy;
3474                         tx = x + dx;
3475                         if (!in_bounds(floor_ptr, ty, tx)) continue;
3476                         if (!projectable(owner_ptr, y, x, ty, tx)) continue;
3477
3478                         g_ptr = &floor_ptr->grid_array[ty][tx];
3479                         if (!cave_drop_bold(floor_ptr, ty, tx)) continue;
3480
3481                         k = 0;
3482                         for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
3483                         {
3484                                 object_type *o_ptr;
3485                                 o_ptr = &floor_ptr->o_list[this_o_idx];
3486                                 next_o_idx = o_ptr->next_o_idx;
3487                                 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
3488
3489                                 k++;
3490                         }
3491
3492                         if (!comb) k++;
3493                         if (k > 99) continue;
3494
3495                         s = 1000 - (d + k * 5);
3496                         if (s < bs) continue;
3497
3498                         if (s > bs) bn = 0;
3499
3500                         if ((++bn >= 2) && !one_in_(bn)) continue;
3501
3502                         bs = s;
3503                         by = ty;
3504                         bx = tx;
3505
3506                         flag = TRUE;
3507                 }
3508         }
3509
3510         if (!flag && !object_is_artifact(j_ptr))
3511         {
3512 #ifdef JP
3513                 msg_format("%sは消えた。", o_name);
3514 #else
3515                 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
3516 #endif
3517                 if (current_world_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
3518
3519                 return 0;
3520         }
3521
3522         for (i = 0; !flag && (i < 1000); i++)
3523         {
3524                 ty = rand_spread(by, 1);
3525                 tx = rand_spread(bx, 1);
3526
3527                 if (!in_bounds(floor_ptr, ty, tx)) continue;
3528
3529                 by = ty;
3530                 bx = tx;
3531
3532                 if (!cave_drop_bold(floor_ptr, by, bx)) continue;
3533
3534                 flag = TRUE;
3535         }
3536
3537         if (!flag)
3538         {
3539                 int candidates = 0, pick;
3540                 for (ty = 1; ty < floor_ptr->height - 1; ty++)
3541                 {
3542                         for (tx = 1; tx < floor_ptr->width - 1; tx++)
3543                         {
3544                                 if (cave_drop_bold(floor_ptr, ty, tx)) candidates++;
3545                         }
3546                 }
3547
3548                 if (!candidates)
3549                 {
3550 #ifdef JP
3551                         msg_format("%sは消えた。", o_name);
3552 #else
3553                         msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
3554 #endif
3555
3556                         if (current_world_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
3557
3558                         if (preserve_mode)
3559                         {
3560                                 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
3561                                 {
3562                                         a_info[j_ptr->name1].cur_num = 0;
3563                                 }
3564                         }
3565
3566                         return 0;
3567                 }
3568
3569                 pick = randint1(candidates);
3570                 for (ty = 1; ty < floor_ptr->height - 1; ty++)
3571                 {
3572                         for (tx = 1; tx < floor_ptr->width - 1; tx++)
3573                         {
3574                                 if (cave_drop_bold(floor_ptr, ty, tx))
3575                                 {
3576                                         pick--;
3577                                         if (!pick) break;
3578                                 }
3579                         }
3580
3581                         if (!pick) break;
3582                 }
3583
3584                 by = ty;
3585                 bx = tx;
3586         }
3587
3588
3589         g_ptr = &floor_ptr->grid_array[by][bx];
3590         for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
3591         {
3592                 object_type *o_ptr;
3593                 o_ptr = &floor_ptr->o_list[this_o_idx];
3594                 next_o_idx = o_ptr->next_o_idx;
3595                 if (object_similar(o_ptr, j_ptr))
3596                 {
3597                         object_absorb(o_ptr, j_ptr);
3598                         done = TRUE;
3599                         break;
3600                 }
3601         }
3602
3603         if (!done) o_idx = o_pop(floor_ptr);
3604
3605         if (!done && !o_idx)
3606         {
3607 #ifdef JP
3608                 msg_format("%sは消えた。", o_name);
3609 #else
3610                 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
3611 #endif
3612                 if (current_world_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
3613
3614                 if (object_is_fixed_artifact(j_ptr))
3615                 {
3616                         a_info[j_ptr->name1].cur_num = 0;
3617                 }
3618
3619                 return 0;
3620         }
3621
3622         if (!done)
3623         {
3624                 object_copy(&floor_ptr->o_list[o_idx], j_ptr);
3625                 j_ptr = &floor_ptr->o_list[o_idx];
3626                 j_ptr->iy = by;
3627                 j_ptr->ix = bx;
3628                 j_ptr->held_m_idx = 0;
3629                 j_ptr->next_o_idx = g_ptr->o_idx;
3630
3631                 g_ptr->o_idx = o_idx;
3632                 done = TRUE;
3633         }
3634
3635         note_spot(owner_ptr, by, bx);
3636         lite_spot(owner_ptr, by, bx);
3637         sound(SOUND_DROP);
3638
3639         if (chance && player_bold(owner_ptr, by, bx))
3640         {
3641                 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
3642         }
3643
3644         return o_idx;
3645 }
3646
3647
3648 /*!
3649  * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
3650  * Describe the charges on an item in the inventory.
3651  * @param owner_ptr プレーヤーへの参照ポインタ
3652  * @param item 残量を表示したいプレイヤーのアイテム所持スロット
3653  * @return なし
3654  */
3655 void inven_item_charges(player_type *owner_ptr, INVENTORY_IDX item)
3656 {
3657         object_type *o_ptr = &owner_ptr->inventory_list[item];
3658         if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
3659         if (!object_is_known(o_ptr)) return;
3660
3661 #ifdef JP
3662         if (o_ptr->pval <= 0)
3663         {
3664                 msg_print("もう魔力が残っていない。");
3665         }
3666         else
3667         {
3668                 msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
3669         }
3670 #else
3671         if (o_ptr->pval != 1)
3672         {
3673                 msg_format("You have %d charges remaining.", o_ptr->pval);
3674         }
3675
3676         else
3677         {
3678                 msg_format("You have %d charge remaining.", o_ptr->pval);
3679         }
3680 #endif
3681 }
3682
3683
3684 /*!
3685  * @brief アイテムの残り所持数メッセージを表示する /
3686  * Describe an item in the inventory.
3687  * @param owner_ptr プレーヤーへの参照ポインタ
3688  * @param item 残量を表示したいプレイヤーのアイテム所持スロット
3689  * @return なし
3690  */
3691 void inven_item_describe(player_type *owner_ptr, INVENTORY_IDX item)
3692 {
3693         object_type *o_ptr = &owner_ptr->inventory_list[item];
3694         GAME_TEXT o_name[MAX_NLEN];
3695         object_desc(owner_ptr, o_name, o_ptr, 0);
3696 #ifdef JP
3697         if (o_ptr->number <= 0)
3698         {
3699                 msg_format("もう%sを持っていない。", o_name);
3700         }
3701         else
3702         {
3703                 msg_format("まだ %sを持っている。", o_name);
3704         }
3705 #else
3706         msg_format("You have %s.", o_name);
3707 #endif
3708
3709 }
3710
3711
3712 void vary_item(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER num)
3713 {
3714         if (item >= 0)
3715         {
3716                 inven_item_increase(owner_ptr, item, num);
3717                 inven_item_describe(owner_ptr, item);
3718                 inven_item_optimize(owner_ptr, item);
3719                 return;
3720         }
3721
3722         floor_type *floor_ptr = owner_ptr->current_floor_ptr;
3723         floor_item_increase(floor_ptr, 0 - item, num);
3724         floor_item_describe(owner_ptr, 0 - item);
3725         floor_item_optimize(owner_ptr, 0 - item);
3726 }
3727
3728
3729 /*!
3730  * @brief アイテムを増減させ残り所持数メッセージを表示する /
3731  * Increase the "number" of an item in the inventory
3732  * @param owner_ptr プレーヤーへの参照ポインタ
3733  * @param item 所持数を増やしたいプレイヤーのアイテム所持スロット
3734  * @param num 増やしたい量
3735  * @return なし
3736  */
3737 void inven_item_increase(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER num)
3738 {
3739         object_type *o_ptr = &owner_ptr->inventory_list[item];
3740         num += o_ptr->number;
3741         if (num > 255) num = 255;
3742         else if (num < 0) num = 0;
3743
3744         num -= o_ptr->number;
3745         if (num == 0) return;
3746
3747         o_ptr->number += num;
3748         owner_ptr->total_weight += (num * o_ptr->weight);
3749         owner_ptr->update |= (PU_BONUS);
3750         owner_ptr->update |= (PU_MANA);
3751         owner_ptr->update |= (PU_COMBINE);
3752         owner_ptr->window |= (PW_INVEN | PW_EQUIP);
3753
3754         if (o_ptr->number || !owner_ptr->ele_attack) return;
3755         if (!(item == INVEN_RARM) && !(item == INVEN_LARM)) return;
3756         if (has_melee_weapon(owner_ptr, INVEN_RARM + INVEN_LARM - item)) return;
3757
3758         set_ele_attack(owner_ptr, 0, 0);
3759 }
3760
3761
3762 /*!
3763  * @brief 所持アイテムスロットから所持数のなくなったアイテムを消去する /
3764  * Erase an inventory slot if it has no more items
3765  * @param owner_ptr プレーヤーへの参照ポインタ
3766  * @param item 消去したいプレイヤーのアイテム所持スロット
3767  * @return なし
3768  */
3769 void inven_item_optimize(player_type *owner_ptr, INVENTORY_IDX item)
3770 {
3771         object_type *o_ptr = &owner_ptr->inventory_list[item];
3772         if (!o_ptr->k_idx) return;
3773         if (o_ptr->number) return;
3774
3775         if (item >= INVEN_RARM)
3776         {
3777                 owner_ptr->equip_cnt--;
3778                 object_wipe(&owner_ptr->inventory_list[item]);
3779                 owner_ptr->update |= PU_BONUS;
3780                 owner_ptr->update |= PU_TORCH;
3781                 owner_ptr->update |= PU_MANA;
3782
3783                 owner_ptr->window |= PW_EQUIP;
3784                 owner_ptr->window |= PW_SPELL;
3785                 return;
3786         }
3787
3788         owner_ptr->inven_cnt--;
3789         int i;
3790         for (i = item; i < INVEN_PACK; i++)
3791         {
3792                 owner_ptr->inventory_list[i] = owner_ptr->inventory_list[i + 1];
3793         }
3794
3795         object_wipe(&owner_ptr->inventory_list[i]);
3796         owner_ptr->window |= PW_INVEN;
3797         owner_ptr->window |= PW_SPELL;
3798 }
3799
3800
3801 /*!
3802  * @brief 床上の魔道具の残り残量メッセージを表示する /
3803  * Describe the charges on an item on the floor.
3804  * @param floo_ptr 現在フロアへの参照ポインタ
3805  * @param item メッセージの対象にしたいアイテム所持スロット
3806  * @return なし
3807  */
3808 void floor_item_charges(floor_type *floor_ptr, INVENTORY_IDX item)
3809 {
3810         object_type *o_ptr = &floor_ptr->o_list[item];
3811         if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
3812         if (!object_is_known(o_ptr)) return;
3813
3814 #ifdef JP
3815         if (o_ptr->pval <= 0)
3816         {
3817                 msg_print("この床上のアイテムは、もう魔力が残っていない。");
3818         }
3819         else
3820         {
3821                 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
3822         }
3823 #else
3824         if (o_ptr->pval != 1)
3825         {
3826                 msg_format("There are %d charges remaining.", o_ptr->pval);
3827         }
3828         else
3829         {
3830                 msg_format("There is %d charge remaining.", o_ptr->pval);
3831         }
3832 #endif
3833 }
3834
3835
3836 /*!
3837  * @brief 床上のアイテムの残り数メッセージを表示する /
3838  * Describe the charges on an item on the floor.
3839  * @param floo_ptr 現在フロアへの参照ポインタ
3840  * @param item メッセージの対象にしたいアイテム所持スロット
3841  * @return なし
3842  */
3843 void floor_item_describe(player_type *owner_ptr, INVENTORY_IDX item)
3844 {
3845         object_type *o_ptr = &owner_ptr->current_floor_ptr->o_list[item];
3846         GAME_TEXT o_name[MAX_NLEN];
3847         object_desc(owner_ptr, o_name, o_ptr, 0);
3848 #ifdef JP
3849         if (o_ptr->number <= 0)
3850         {
3851                 msg_format("床上には、もう%sはない。", o_name);
3852         }
3853         else
3854         {
3855                 msg_format("床上には、まだ %sがある。", o_name);
3856         }
3857 #else
3858         msg_format("You see %s.", o_name);
3859 #endif
3860 }
3861
3862
3863 /*!
3864  * @brief 床上のアイテムの数を増やす /
3865  * Increase the "number" of an item on the floor
3866  * @param floo_ptr 現在フロアへの参照ポインタ
3867  * @param item 増やしたいアイテムの所持スロット
3868  * @param num 増やしたいアイテムの数
3869  * @return なし
3870  */
3871 void floor_item_increase(floor_type *floor_ptr, INVENTORY_IDX item, ITEM_NUMBER num)
3872 {
3873         object_type *o_ptr = &floor_ptr->o_list[item];
3874         num += o_ptr->number;
3875         if (num > 255) num = 255;
3876         else if (num < 0) num = 0;
3877
3878         num -= o_ptr->number;
3879         o_ptr->number += num;
3880 }
3881
3882
3883 /*!
3884  * @brief 床上の数の無くなったアイテムスロットを消去する /
3885  * Optimize an item on the floor (destroy "empty" items)
3886  * @param player_ptr プレーヤーへの参照ポインタ
3887  * @param item 消去したいアイテムの所持スロット
3888  * @return なし
3889  */
3890 void floor_item_optimize(player_type *owner_ptr, INVENTORY_IDX item)
3891 {
3892         object_type *o_ptr = &owner_ptr->current_floor_ptr->o_list[item];
3893         if (!o_ptr->k_idx) return;
3894         if (o_ptr->number) return;
3895
3896         delete_object_idx(owner_ptr, item);
3897 }
3898
3899
3900 /*!
3901  * todo ここのp_ptrだけは抜けない……関数ポインタの嵐でにっちもさっちもいかない
3902  * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
3903  * Check if we have space for an item in the pack without overflow
3904  * @param owner_ptr プレーヤーへの参照ポインタ
3905  * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
3906  * @return 溢れずに済むならTRUEを返す
3907  */
3908 bool inven_carry_okay(object_type *o_ptr)
3909 {
3910         if (p_ptr->inven_cnt < INVEN_PACK) return TRUE;
3911
3912         for (int j = 0; j < INVEN_PACK; j++)
3913         {
3914                 object_type *j_ptr = &p_ptr->inventory_list[j];
3915                 if (!j_ptr->k_idx) continue;
3916
3917                 if (object_similar(j_ptr, o_ptr)) return TRUE;
3918         }
3919
3920         return FALSE;
3921 }
3922
3923
3924 /*!
3925  * @brief オブジェクトを定義された基準に従いソートするための関数 /
3926  * Check if we have space for an item in the pack without overflow
3927  * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
3928  * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
3929  * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
3930  * @return o_ptrの方が上位ならばTRUEを返す。
3931  */
3932 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
3933 {
3934         int o_type, j_type;
3935         if (!j_ptr->k_idx) return TRUE;
3936
3937         if ((o_ptr->tval == REALM1_BOOK) &&
3938                 (j_ptr->tval != REALM1_BOOK)) return TRUE;
3939         if ((j_ptr->tval == REALM1_BOOK) &&
3940                 (o_ptr->tval != REALM1_BOOK)) return FALSE;
3941
3942         if ((o_ptr->tval == REALM2_BOOK) &&
3943                 (j_ptr->tval != REALM2_BOOK)) return TRUE;
3944         if ((j_ptr->tval == REALM2_BOOK) &&
3945                 (o_ptr->tval != REALM2_BOOK)) return FALSE;
3946
3947         if (o_ptr->tval > j_ptr->tval) return TRUE;
3948         if (o_ptr->tval < j_ptr->tval) return FALSE;
3949
3950         if (!object_is_aware(o_ptr)) return FALSE;
3951         if (!object_is_aware(j_ptr)) return TRUE;
3952
3953         if (o_ptr->sval < j_ptr->sval) return TRUE;
3954         if (o_ptr->sval > j_ptr->sval) return FALSE;
3955
3956         if (!object_is_known(o_ptr)) return FALSE;
3957         if (!object_is_known(j_ptr)) return TRUE;
3958
3959         if (object_is_fixed_artifact(o_ptr)) o_type = 3;
3960         else if (o_ptr->art_name) o_type = 2;
3961         else if (object_is_ego(o_ptr)) o_type = 1;
3962         else o_type = 0;
3963
3964         if (object_is_fixed_artifact(j_ptr)) j_type = 3;
3965         else if (j_ptr->art_name) j_type = 2;
3966         else if (object_is_ego(j_ptr)) j_type = 1;
3967         else j_type = 0;
3968
3969         if (o_type < j_type) return TRUE;
3970         if (o_type > j_type) return FALSE;
3971
3972         switch (o_ptr->tval)
3973         {
3974         case TV_FIGURINE:
3975         case TV_STATUE:
3976         case TV_CORPSE:
3977         case TV_CAPTURE:
3978                 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
3979                 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
3980                 return FALSE;
3981
3982         case TV_SHOT:
3983         case TV_ARROW:
3984         case TV_BOLT:
3985                 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
3986                 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
3987                 break;
3988
3989         case TV_ROD:
3990                 if (o_ptr->pval < j_ptr->pval) return TRUE;
3991                 if (o_ptr->pval > j_ptr->pval) return FALSE;
3992                 break;
3993         }
3994
3995         return o_value > object_value(j_ptr);
3996 }
3997
3998
3999 /*!
4000  * @brief オブジェクトをプレイヤーが拾って所持スロットに納めるメインルーチン /
4001  * Add an item to the players inventory, and return the slot used.
4002  * @param o_ptr 拾うオブジェクトの構造体参照ポインタ
4003  * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
4004  * @details
4005  * If the new item can combine with an existing item in the inventory,\n
4006  * it will do so, using "object_similar()" and "object_absorb()", else,\n
4007  * the item will be placed into the "proper" location in the inventory.\n
4008  *\n
4009  * This function can be used to "over-fill" the player's pack, but only\n
4010  * once, and such an action must trigger the "overflow" code immediately.\n
4011  * Note that when the pack is being "over-filled", the new item must be\n
4012  * placed into the "overflow" slot, and the "overflow" must take place\n
4013  * before the pack is reordered, but (optionally) after the pack is\n
4014  * combined.  This may be tricky.  See "dungeon.c" for info.\n
4015  *\n
4016  * Note that this code must remove any location/stack information\n
4017  * from the object once it is placed into the inventory.\n
4018  */
4019 s16b inven_carry(player_type *owner_ptr, object_type *o_ptr)
4020 {
4021         INVENTORY_IDX i, j, k;
4022         INVENTORY_IDX n = -1;
4023
4024         object_type *j_ptr;
4025         for (j = 0; j < INVEN_PACK; j++)
4026         {
4027                 j_ptr = &owner_ptr->inventory_list[j];
4028                 if (!j_ptr->k_idx) continue;
4029
4030                 n = j;
4031                 if (object_similar(j_ptr, o_ptr))
4032                 {
4033                         object_absorb(j_ptr, o_ptr);
4034
4035                         owner_ptr->total_weight += (o_ptr->number * o_ptr->weight);
4036                         owner_ptr->update |= (PU_BONUS);
4037                         owner_ptr->window |= (PW_INVEN);
4038                         return (j);
4039                 }
4040         }
4041
4042         if (owner_ptr->inven_cnt > INVEN_PACK) return -1;
4043
4044         for (j = 0; j <= INVEN_PACK; j++)
4045         {
4046                 j_ptr = &owner_ptr->inventory_list[j];
4047                 if (!j_ptr->k_idx) break;
4048         }
4049
4050         i = j;
4051         if (i < INVEN_PACK)
4052         {
4053                 s32b o_value = object_value(o_ptr);
4054                 for (j = 0; j < INVEN_PACK; j++)
4055                 {
4056                         if (object_sort_comp(o_ptr, o_value, &owner_ptr->inventory_list[j])) break;
4057                 }
4058
4059                 i = j;
4060                 for (k = n; k >= i; k--)
4061                 {
4062                         object_copy(&owner_ptr->inventory_list[k + 1], &owner_ptr->inventory_list[k]);
4063                 }
4064
4065                 object_wipe(&owner_ptr->inventory_list[i]);
4066         }
4067
4068         object_copy(&owner_ptr->inventory_list[i], o_ptr);
4069         j_ptr = &owner_ptr->inventory_list[i];
4070         j_ptr->next_o_idx = 0;
4071         j_ptr->held_m_idx = 0;
4072         j_ptr->iy = j_ptr->ix = 0;
4073         j_ptr->marked = OM_TOUCHED;
4074
4075         owner_ptr->total_weight += (j_ptr->number * j_ptr->weight);
4076         owner_ptr->inven_cnt++;
4077         owner_ptr->update |= (PU_BONUS | PU_COMBINE | PU_REORDER);
4078         owner_ptr->window |= (PW_INVEN);
4079
4080         return i;
4081 }
4082
4083
4084 /*!
4085  * @brief 装備スロットからオブジェクトを外すメインルーチン /
4086  * Take off (some of) a non-cursed equipment item
4087  * @param owner_ptr プレーヤーへの参照ポインタ
4088  * @param item オブジェクトを外したい所持テーブルのID
4089  * @param amt 外したい個数
4090  * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
4091  * @details
4092  * Note that only one item at a time can be wielded per slot.\n
4093  * Note that taking off an item when "full" may cause that item\n
4094  * to fall to the ground.\n
4095  * Return the inventory slot into which the item is placed.\n
4096  */
4097 INVENTORY_IDX inven_takeoff(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER amt)
4098 {
4099         INVENTORY_IDX slot;
4100         object_type forge;
4101         object_type *q_ptr;
4102         object_type *o_ptr;
4103         concptr act;
4104         GAME_TEXT o_name[MAX_NLEN];
4105         o_ptr = &owner_ptr->inventory_list[item];
4106         if (amt <= 0) return -1;
4107
4108         if (amt > o_ptr->number) amt = o_ptr->number;
4109         q_ptr = &forge;
4110         object_copy(q_ptr, o_ptr);
4111         q_ptr->number = amt;
4112         object_desc(owner_ptr, o_name, q_ptr, 0);
4113         if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
4114                 object_is_melee_weapon(o_ptr))
4115         {
4116                 act = _("を装備からはずした", "You were wielding");
4117         }
4118         else if (item == INVEN_BOW)
4119         {
4120                 act = _("を装備からはずした", "You were holding");
4121         }
4122         else if (item == INVEN_LITE)
4123         {
4124                 act = _("を光源からはずした", "You were holding");
4125         }
4126         else
4127         {
4128                 act = _("を装備からはずした", "You were wearing");
4129         }
4130
4131         inven_item_increase(owner_ptr, item, -amt);
4132         inven_item_optimize(owner_ptr, item);
4133
4134         slot = inven_carry(owner_ptr, q_ptr);
4135 #ifdef JP
4136         msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
4137 #else
4138         msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
4139 #endif
4140
4141         return slot;
4142 }
4143
4144
4145 /*!
4146  * @brief 所持スロットから床下にオブジェクトを落とすメインルーチン /
4147  * Drop (some of) a non-cursed inventory/equipment item
4148  * @param owner_ptr プレーヤーへの参照ポインタ
4149  * @param item 所持テーブルのID
4150  * @param amt 落としたい個数
4151  * @return なし
4152  * @details
4153  * The object will be dropped "near" the current location
4154  */
4155 void drop_from_inventory(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER amt)
4156 {
4157         object_type forge;
4158         object_type *q_ptr;
4159         object_type *o_ptr;
4160         GAME_TEXT o_name[MAX_NLEN];
4161         o_ptr = &owner_ptr->inventory_list[item];
4162         if (amt <= 0) return;
4163
4164         if (amt > o_ptr->number) amt = o_ptr->number;
4165
4166         if (item >= INVEN_RARM)
4167         {
4168                 item = inven_takeoff(owner_ptr, item, amt);
4169                 o_ptr = &owner_ptr->inventory_list[item];
4170         }
4171
4172         q_ptr = &forge;
4173         object_copy(q_ptr, o_ptr);
4174         distribute_charges(o_ptr, q_ptr, amt);
4175
4176         q_ptr->number = amt;
4177         object_desc(owner_ptr, o_name, q_ptr, 0);
4178         msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(item));
4179         (void)drop_near(owner_ptr, q_ptr, 0, owner_ptr->y, owner_ptr->x);
4180         vary_item(owner_ptr, item, -amt);
4181 }
4182
4183
4184 /*!
4185  * @brief プレイヤーの所持スロットに存在するオブジェクトをまとめなおす /
4186  * Combine items in the pack
4187  * @return なし
4188  * @details
4189  * Note special handling of the "overflow" slot
4190  */
4191 void combine_pack(player_type *owner_ptr)
4192 {
4193         bool flag = FALSE;
4194         bool is_first_combination = TRUE;
4195         bool combined = TRUE;
4196         while (is_first_combination || combined)
4197         {
4198                 is_first_combination = FALSE;
4199                 combined = FALSE;
4200
4201                 for (int i = INVEN_PACK; i > 0; i--)
4202                 {
4203                         object_type *o_ptr;
4204                         o_ptr = &owner_ptr->inventory_list[i];
4205                         if (!o_ptr->k_idx) continue;
4206                         for (int j = 0; j < i; j++)
4207                         {
4208                                 object_type *j_ptr;
4209                                 j_ptr = &owner_ptr->inventory_list[j];
4210                                 if (!j_ptr->k_idx) continue;
4211
4212                                 /*
4213                                  * Get maximum number of the stack if these
4214                                  * are similar, get zero otherwise.
4215                                  */
4216                                 int max_num = object_similar_part(j_ptr, o_ptr);
4217
4218                                 bool is_max = (max_num != 0) && (j_ptr->number < max_num);
4219                                 if (!is_max) continue;
4220
4221                                 if (o_ptr->number + j_ptr->number <= max_num)
4222                                 {
4223                                         flag = TRUE;
4224                                         object_absorb(j_ptr, o_ptr);
4225                                         owner_ptr->inven_cnt--;
4226                                         int k;
4227                                         for (k = i; k < INVEN_PACK; k++)
4228                                         {
4229                                                 owner_ptr->inventory_list[k] = owner_ptr->inventory_list[k + 1];
4230                                         }
4231
4232                                         object_wipe(&owner_ptr->inventory_list[k]);
4233                                 }
4234                                 else
4235                                 {
4236                                         int old_num = o_ptr->number;
4237                                         int remain = j_ptr->number + o_ptr->number - max_num;
4238                                         object_absorb(j_ptr, o_ptr);
4239                                         o_ptr->number = remain;
4240                                         if (o_ptr->tval == TV_ROD)
4241                                         {
4242                                                 o_ptr->pval = o_ptr->pval * remain / old_num;
4243                                                 o_ptr->timeout = o_ptr->timeout * remain / old_num;
4244                                         }
4245
4246                                         if (o_ptr->tval == TV_WAND)
4247                                         {
4248                                                 o_ptr->pval = o_ptr->pval * remain / old_num;
4249                                         }
4250                                 }
4251
4252                                 owner_ptr->window |= (PW_INVEN);
4253                                 combined = TRUE;
4254                                 break;
4255                         }
4256                 }
4257         }
4258
4259         if (flag) msg_print(_("ザックの中のアイテムをまとめ直した。", "You combine some items in your pack."));
4260 }
4261
4262
4263 /*!
4264  * @brief プレイヤーの所持スロットに存在するオブジェクトを並び替える /
4265  * Reorder items in the pack
4266  * @param owner_ptr プレーヤーへの参照ポインタ
4267  * @return なし
4268  * @details
4269  * Note special handling of the "overflow" slot
4270  */
4271 void reorder_pack(player_type *owner_ptr)
4272 {
4273         int i, j, k;
4274         s32b o_value;
4275         object_type forge;
4276         object_type *q_ptr;
4277         object_type *o_ptr;
4278         bool flag = FALSE;
4279
4280         for (i = 0; i < INVEN_PACK; i++)
4281         {
4282                 if ((i == INVEN_PACK) && (owner_ptr->inven_cnt == INVEN_PACK)) break;
4283
4284                 o_ptr = &owner_ptr->inventory_list[i];
4285                 if (!o_ptr->k_idx) continue;
4286
4287                 o_value = object_value(o_ptr);
4288                 for (j = 0; j < INVEN_PACK; j++)
4289                 {
4290                         if (object_sort_comp(o_ptr, o_value, &owner_ptr->inventory_list[j])) break;
4291                 }
4292
4293                 if (j >= i) continue;
4294
4295                 flag = TRUE;
4296                 q_ptr = &forge;
4297                 object_copy(q_ptr, &owner_ptr->inventory_list[i]);
4298                 for (k = i; k > j; k--)
4299                 {
4300                         object_copy(&owner_ptr->inventory_list[k], &owner_ptr->inventory_list[k - 1]);
4301                 }
4302
4303                 object_copy(&owner_ptr->inventory_list[j], q_ptr);
4304                 owner_ptr->window |= (PW_INVEN);
4305         }
4306
4307         if (flag) msg_print(_("ザックの中のアイテムを並べ直した。", "You reorder some items in your pack."));
4308 }
4309
4310
4311 /*!
4312  * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
4313  * Hack -- display an object kind in the current window
4314  * @param owner_ptr プレーヤーへの参照ポインタ
4315  * @param k_idx ベースアイテムの参照ID
4316  * @return なし
4317  * @details
4318  * Include list of usable spells for readible books
4319  */
4320 void display_koff(player_type *owner_ptr, KIND_OBJECT_IDX k_idx)
4321 {
4322         object_type forge;
4323         object_type *q_ptr;
4324         int sval;
4325         REALM_IDX   use_realm;
4326         GAME_TEXT o_name[MAX_NLEN];
4327         for (int y = 0; y < Term->hgt; y++)
4328         {
4329                 Term_erase(0, y, 255);
4330         }
4331
4332         if (!k_idx) return;
4333         q_ptr = &forge;
4334
4335         object_prep(q_ptr, k_idx);
4336         object_desc(owner_ptr, o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
4337
4338         Term_putstr(0, 0, -1, TERM_WHITE, o_name);
4339         sval = q_ptr->sval;
4340         use_realm = tval2realm(q_ptr->tval);
4341
4342         if (owner_ptr->realm1 || owner_ptr->realm2)
4343         {
4344                 if ((use_realm != owner_ptr->realm1) && (use_realm != owner_ptr->realm2)) return;
4345         }
4346         else
4347         {
4348                 if ((owner_ptr->pclass != CLASS_SORCERER) && (owner_ptr->pclass != CLASS_RED_MAGE)) return;
4349                 if (!is_magic(use_realm)) return;
4350                 if ((owner_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
4351         }
4352
4353         int num = 0;
4354         SPELL_IDX spells[64];
4355
4356         for (int spell = 0; spell < 32; spell++)
4357         {
4358                 if (fake_spell_flags[sval] & (1L << spell))
4359                 {
4360                         spells[num++] = spell;
4361                 }
4362         }
4363
4364         print_spells(owner_ptr, 0, spells, num, 2, 0, use_realm);
4365 }
4366
4367
4368 /*!
4369  * @brief 投擲時たいまつに投げやすい/焼棄/アンデッドスレイの特別効果を返す。
4370  * Torches have special abilities when they are flaming.
4371  * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
4372  * @param flgs 特別に追加するフラグを返す参照ポインタ
4373  * @return なし
4374  */
4375 void torch_flags(object_type *o_ptr, BIT_FLAGS *flgs)
4376 {
4377         if ((o_ptr->tval != TV_LITE) || (o_ptr->sval != SV_LITE_TORCH)) return;
4378         if (o_ptr->xtra4 <= 0) return;
4379         add_flag(flgs, TR_BRAND_FIRE);
4380         add_flag(flgs, TR_KILL_UNDEAD);
4381         add_flag(flgs, TR_THROW);
4382 }
4383
4384
4385 /*!
4386  * @brief 投擲時たいまつにダイスを与える。
4387  * Torches have special abilities when they are flaming.
4388  * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
4389  * @param dd 特別なダイス数を返す参照ポインタ
4390  * @param ds 特別なダイス面数を返す参照ポインタ
4391  * @return なし
4392  */
4393 void torch_dice(object_type *o_ptr, DICE_NUMBER *dd, DICE_SID *ds)
4394 {
4395         if ((o_ptr->tval != TV_LITE) || (o_ptr->sval != SV_LITE_TORCH)) return;
4396         if (o_ptr->xtra4 <= 0) return;
4397         (*dd) = 1;
4398         (*ds) = 6;
4399 }
4400
4401
4402 /*!
4403  * @brief 投擲時命中したたいまつの寿命を縮める。
4404  * Torches have special abilities when they are flaming.
4405  * @param o_ptr 投擲するオブジェクトの構造体参照ポインタ
4406  * @return なし
4407  */
4408 void torch_lost_fuel(object_type *o_ptr)
4409 {
4410         if ((o_ptr->tval != TV_LITE) || (o_ptr->sval != SV_LITE_TORCH)) return;
4411         o_ptr->xtra4 -= (FUEL_TORCH / 25);
4412         if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;
4413 }
4414
4415
4416 /*!
4417  * @brief 射撃武器に対応する矢/弾薬のベースアイテムIDを返す /
4418  * @param o_ptr 判定する射撃武器のアイテム情報参照ポインタ
4419  * @return 対応する矢/弾薬のベースアイテムID
4420  */
4421 int bow_tval_ammo(object_type *o_ptr)
4422 {
4423         switch (o_ptr->sval)
4424         {
4425         case SV_SLING:
4426         {
4427                 return TV_SHOT;
4428         }
4429
4430         case SV_SHORT_BOW:
4431         case SV_LONG_BOW:
4432         case SV_NAMAKE_BOW:
4433         {
4434                 return TV_ARROW;
4435         }
4436
4437         case SV_LIGHT_XBOW:
4438         case SV_HEAVY_XBOW:
4439         {
4440                 return TV_BOLT;
4441         }
4442         case SV_CRIMSON:
4443         case SV_HARP:
4444         {
4445                 return TV_NO_AMMO;
4446         }
4447         }
4448
4449         return 0;
4450 }