OSDN Git Service

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