OSDN Git Service

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