OSDN Git Service

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