OSDN Git Service

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