OSDN Git Service

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