OSDN Git Service

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