OSDN Git Service

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