OSDN Git Service

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