OSDN Git Service

Fix Doxygen warning in object2.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
16 #include "kajitips.h"
17
18 /*!
19  * @brief ¾²¾å¡¢¥â¥ó¥¹¥¿¡¼½ê»ý¤Ç¥¹¥¿¥Ã¥¯¤µ¤ì¤¿¥¢¥¤¥Æ¥à¤òºï½ü¤·¥¹¥¿¥Ã¥¯¤òÊä´°¤¹¤ë / Excise a dungeon object from any stacks
20  * @param o_idx ºï½üÂоݤΥª¥Ö¥¸¥§¥¯¥È¹½Â¤ÂΥݥ¤¥ó¥¿
21  * @return ¤Ê¤·
22  */
23 void excise_object_idx(int o_idx)
24 {
25         object_type *j_ptr;
26
27         s16b this_o_idx, next_o_idx = 0;
28
29         s16b prev_o_idx = 0;
30
31
32         /* Object */
33         j_ptr = &o_list[o_idx];
34
35         /* Monster */
36         if (j_ptr->held_m_idx)
37         {
38                 monster_type *m_ptr;
39
40                 /* Monster */
41                 m_ptr = &m_list[j_ptr->held_m_idx];
42
43                 /* Scan all objects in the grid */
44                 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
45                 {
46                         object_type *o_ptr;
47
48                         /* Acquire object */
49                         o_ptr = &o_list[this_o_idx];
50
51                         /* Acquire next object */
52                         next_o_idx = o_ptr->next_o_idx;
53
54                         /* Done */
55                         if (this_o_idx == o_idx)
56                         {
57                                 /* No previous */
58                                 if (prev_o_idx == 0)
59                                 {
60                                         /* Remove from list */
61                                         m_ptr->hold_o_idx = next_o_idx;
62                                 }
63
64                                 /* Real previous */
65                                 else
66                                 {
67                                         object_type *k_ptr;
68
69                                         /* Previous object */
70                                         k_ptr = &o_list[prev_o_idx];
71
72                                         /* Remove from list */
73                                         k_ptr->next_o_idx = next_o_idx;
74                                 }
75
76                                 /* Forget next pointer */
77                                 o_ptr->next_o_idx = 0;
78
79                                 /* Done */
80                                 break;
81                         }
82
83                         /* Save prev_o_idx */
84                         prev_o_idx = this_o_idx;
85                 }
86         }
87
88         /* Dungeon */
89         else
90         {
91                 cave_type *c_ptr;
92
93                 int y = j_ptr->iy;
94                 int x = j_ptr->ix;
95
96                 /* Grid */
97                 c_ptr = &cave[y][x];
98
99                 /* Scan all objects in the grid */
100                 for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
101                 {
102                         object_type *o_ptr;
103
104                         /* Acquire object */
105                         o_ptr = &o_list[this_o_idx];
106
107                         /* Acquire next object */
108                         next_o_idx = o_ptr->next_o_idx;
109
110                         /* Done */
111                         if (this_o_idx == o_idx)
112                         {
113                                 /* No previous */
114                                 if (prev_o_idx == 0)
115                                 {
116                                         /* Remove from list */
117                                         c_ptr->o_idx = next_o_idx;
118                                 }
119
120                                 /* Real previous */
121                                 else
122                                 {
123                                         object_type *k_ptr;
124
125                                         /* Previous object */
126                                         k_ptr = &o_list[prev_o_idx];
127
128                                         /* Remove from list */
129                                         k_ptr->next_o_idx = next_o_idx;
130                                 }
131
132                                 /* Forget next pointer */
133                                 o_ptr->next_o_idx = 0;
134
135                                 /* Done */
136                                 break;
137                         }
138
139                         /* Save prev_o_idx */
140                         prev_o_idx = this_o_idx;
141                 }
142         }
143 }
144
145 /*!
146  * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤òºï½ü¤¹¤ë /
147  * Delete a dungeon object
148  * @param o_idx ºï½üÂоݤΥª¥Ö¥¸¥§¥¯¥È¹½Â¤ÂΥݥ¤¥ó¥¿
149  * @return ¤Ê¤·
150  * @details
151  * Handle "stacks" of objects correctly.
152  */
153 void delete_object_idx(int o_idx)
154 {
155         object_type *j_ptr;
156
157         /* Excise */
158         excise_object_idx(o_idx);
159
160         /* Object */
161         j_ptr = &o_list[o_idx];
162
163         /* Dungeon floor */
164         if (!(j_ptr->held_m_idx))
165         {
166                 int y, x;
167
168                 /* Location */
169                 y = j_ptr->iy;
170                 x = j_ptr->ix;
171
172                 /* Visual update */
173                 lite_spot(y, x);
174         }
175
176         /* Wipe the object */
177         object_wipe(j_ptr);
178
179         /* Count objects */
180         o_cnt--;
181 }
182
183
184 /*!
185  * @brief ¥Õ¥í¥¢¤Ë¥Þ¥¹¤ËÍî¤Á¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¤òÁ´¤Æºï½ü¤¹¤ë / Deletes all objects at given location
186  * Delete a dungeon object
187  * @param y ºï½ü¤·¤¿¥Õ¥í¥¢¥Þ¥¹¤ÎYºÂɸ
188  * @param x ºï½ü¤·¤¿¥Õ¥í¥¢¥Þ¥¹¤ÎXºÂɸ
189  * @return ¤Ê¤·
190  */
191 void delete_object(int y, int x)
192 {
193         cave_type *c_ptr;
194
195         s16b this_o_idx, next_o_idx = 0;
196
197
198         /* Refuse "illegal" locations */
199         if (!in_bounds(y, x)) return;
200
201
202         /* Grid */
203         c_ptr = &cave[y][x];
204
205         /* Scan all objects in the grid */
206         for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
207         {
208                 object_type *o_ptr;
209
210                 /* Acquire object */
211                 o_ptr = &o_list[this_o_idx];
212
213                 /* Acquire next object */
214                 next_o_idx = o_ptr->next_o_idx;
215
216                 /* Wipe the object */
217                 object_wipe(o_ptr);
218
219                 /* Count objects */
220                 o_cnt--;
221         }
222
223         /* Objects are gone */
224         c_ptr->o_idx = 0;
225
226         /* Visual update */
227         lite_spot(y, x);
228 }
229
230
231 /*!
232  * @brief ¥°¥í¡¼¥Ð¥ë¥ª¥Ö¥¸¥§¥¯¥ÈÇÛÎó¤ËÂФ·»ØÄêÈϰϤΥª¥Ö¥¸¥§¥¯¥È¤òÀ°Íý¤·¤ÆID¤Î¼ã¤¤½ç¤Ë´ó¤»¤ë /
233  * Move an object from index i1 to index i2 in the object list
234  * @param i1 À°Íý¤·¤¿¤¤ÇÛÎó¤Î»ÏÅÀ
235  * @param i2 À°Íý¤·¤¿¤¤ÇÛÎó¤Î½ªÅÀ
236  * @return ¤Ê¤·
237  */
238 static void compact_objects_aux(int i1, int i2)
239 {
240         int i;
241
242         cave_type *c_ptr;
243
244         object_type *o_ptr;
245
246
247         /* Do nothing */
248         if (i1 == i2) return;
249
250
251         /* Repair objects */
252         for (i = 1; i < o_max; i++)
253         {
254                 /* Acquire object */
255                 o_ptr = &o_list[i];
256
257                 /* Skip "dead" objects */
258                 if (!o_ptr->k_idx) continue;
259
260                 /* Repair "next" pointers */
261                 if (o_ptr->next_o_idx == i1)
262                 {
263                         /* Repair */
264                         o_ptr->next_o_idx = i2;
265                 }
266         }
267
268
269         /* Acquire object */
270         o_ptr = &o_list[i1];
271
272
273         /* Monster */
274         if (o_ptr->held_m_idx)
275         {
276                 monster_type *m_ptr;
277
278                 /* Acquire monster */
279                 m_ptr = &m_list[o_ptr->held_m_idx];
280
281                 /* Repair monster */
282                 if (m_ptr->hold_o_idx == i1)
283                 {
284                         /* Repair */
285                         m_ptr->hold_o_idx = i2;
286                 }
287         }
288
289         /* Dungeon */
290         else
291         {
292                 int y, x;
293
294                 /* Acquire location */
295                 y = o_ptr->iy;
296                 x = o_ptr->ix;
297
298                 /* Acquire grid */
299                 c_ptr = &cave[y][x];
300
301                 /* Repair grid */
302                 if (c_ptr->o_idx == i1)
303                 {
304                         /* Repair */
305                         c_ptr->o_idx = i2;
306                 }
307         }
308
309
310         /* Structure copy */
311         o_list[i2] = o_list[i1];
312
313         /* Wipe the hole */
314         object_wipe(o_ptr);
315 }
316
317
318 /*!
319  * @brief ¥°¥í¡¼¥Ð¥ë¥ª¥Ö¥¸¥§¥¯¥ÈÇÛÎ󤫤éÍ¥ÀèÅÙ¤ÎÄ㤤¤â¤Î¤òºï½ü¤·¡¢¥Ç¡¼¥¿¤ò°µ½Ì¤¹¤ë¡£ /
320  * Compact and Reorder the object list.
321  * @size ºÇÄã¤Ç¤â¸º¤é¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¿ô¤Î¿å½à
322  * @return ¤Ê¤·
323  * @details
324  * ¡Ê´í¸±¤Ê¤Î¤Ç»ÈÍѤˤÏÃí°Õ¤¹¤ë¤³¤È¡Ë
325  * This function can be very dangerous, use with caution!\n
326  *\n
327  * When actually "compacting" objects, we base the saving throw on a\n
328  * combination of object level, distance from player, and current\n
329  * "desperation".\n
330  *\n
331  * After "compacting" (if needed), we "reorder" the objects into a more\n
332  * compact order, and we reset the allocation info, and the "live" array.\n
333  */
334 void compact_objects(int size)
335 {
336         int i, y, x, num, cnt;
337         int cur_lev, cur_dis, chance;
338         object_type *o_ptr;
339
340
341         /* Compact */
342         if (size)
343         {
344                 /* Message */
345 #ifdef JP
346                 msg_print("¥¢¥¤¥Æ¥à¾ðÊó¤ò°µ½Ì¤·¤Æ¤¤¤Þ¤¹...");
347 #else
348                 msg_print("Compacting objects...");
349 #endif
350
351
352                 /* Redraw map */
353                 p_ptr->redraw |= (PR_MAP);
354
355                 /* Window stuff */
356                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
357         }
358
359
360         /* Compact at least 'size' objects */
361         for (num = 0, cnt = 1; num < size; cnt++)
362         {
363                 /* Get more vicious each iteration */
364                 cur_lev = 5 * cnt;
365
366                 /* Get closer each iteration */
367                 cur_dis = 5 * (20 - cnt);
368
369                 /* Examine the objects */
370                 for (i = 1; i < o_max; i++)
371                 {
372                         o_ptr = &o_list[i];
373
374                         /* Skip dead objects */
375                         if (!o_ptr->k_idx) continue;
376
377                         /* Hack -- High level objects start out "immune" */
378                         if (k_info[o_ptr->k_idx].level > cur_lev) continue;
379
380                         /* Monster */
381                         if (o_ptr->held_m_idx)
382                         {
383                                 monster_type *m_ptr;
384
385                                 /* Acquire monster */
386                                 m_ptr = &m_list[o_ptr->held_m_idx];
387
388                                 /* Get the location */
389                                 y = m_ptr->fy;
390                                 x = m_ptr->fx;
391
392                                 /* Monsters protect their objects */
393                                 if (randint0(100) < 90) continue;
394                         }
395
396                         /* Dungeon */
397                         else
398                         {
399                                 /* Get the location */
400                                 y = o_ptr->iy;
401                                 x = o_ptr->ix;
402                         }
403
404                         /* Nearby objects start out "immune" */
405                         if ((cur_dis > 0) && (distance(py, px, y, x) < cur_dis)) continue;
406
407                         /* Saving throw */
408                         chance = 90;
409
410                         /* Hack -- only compact artifacts in emergencies */
411                         if ((object_is_fixed_artifact(o_ptr) || o_ptr->art_name) &&
412                             (cnt < 1000)) chance = 100;
413
414                         /* Apply the saving throw */
415                         if (randint0(100) < chance) continue;
416
417                         /* Delete the object */
418                         delete_object_idx(i);
419
420                         /* Count it */
421                         num++;
422                 }
423         }
424
425
426         /* Excise dead objects (backwards!) */
427         for (i = o_max - 1; i >= 1; i--)
428         {
429                 o_ptr = &o_list[i];
430
431                 /* Skip real objects */
432                 if (o_ptr->k_idx) continue;
433
434                 /* Move last object into open hole */
435                 compact_objects_aux(o_max - 1, i);
436
437                 /* Compress "o_max" */
438                 o_max--;
439         }
440 }
441
442
443 /*!
444  * @brief ¥°¥í¡¼¥Ð¥ë¥ª¥Ö¥¸¥§¥¯¥ÈÇÛÎó¤ò½é´ü²½¤¹¤ë /
445  * Delete all the items when player leaves the level
446  * @note we do NOT visually reflect these (irrelevant) changes
447  * @details
448  * Hack -- we clear the "c_ptr->o_idx" field for every grid,
449  * and the "m_ptr->next_o_idx" field for every monster, since
450  * we know we are clearing every object.  Technically, we only
451  * clear those fields for grids/monsters containing objects,
452  * and we clear it once for every such object.
453  * @return ¤Ê¤·
454  */
455 void wipe_o_list(void)
456 {
457         int i;
458
459         /* Delete the existing objects */
460         for (i = 1; i < o_max; i++)
461         {
462                 object_type *o_ptr = &o_list[i];
463
464                 /* Skip dead objects */
465                 if (!o_ptr->k_idx) continue;
466
467                 /* Mega-Hack -- preserve artifacts */
468                 if (!character_dungeon || preserve_mode)
469                 {
470                         /* Hack -- Preserve unknown artifacts */
471                         if (object_is_fixed_artifact(o_ptr) && !object_is_known(o_ptr))
472                         {
473                                 /* Mega-Hack -- Preserve the artifact */
474                                 a_info[o_ptr->name1].cur_num = 0;
475                         }
476                 }
477
478                 /* Monster */
479                 if (o_ptr->held_m_idx)
480                 {
481                         monster_type *m_ptr;
482
483                         /* Monster */
484                         m_ptr = &m_list[o_ptr->held_m_idx];
485
486                         /* Hack -- see above */
487                         m_ptr->hold_o_idx = 0;
488                 }
489
490                 /* Dungeon */
491                 else
492                 {
493                         cave_type *c_ptr;
494
495                         /* Access location */
496                         int y = o_ptr->iy;
497                         int x = o_ptr->ix;
498
499                         /* Access grid */
500                         c_ptr = &cave[y][x];
501
502                         /* Hack -- see above */
503                         c_ptr->o_idx = 0;
504                 }
505
506                 /* Wipe the object */
507                 object_wipe(o_ptr);
508         }
509
510         /* Reset "o_max" */
511         o_max = 1;
512
513         /* Reset "o_cnt" */
514         o_cnt = 0;
515 }
516
517
518 /*!
519  * @brief ¥°¥í¡¼¥Ð¥ë¥ª¥Ö¥¸¥§¥¯¥ÈÇÛÎ󤫤é¶õ¤­¤ò¼èÆÀ¤¹¤ë /
520  * Acquires and returns the index of a "free" object.
521  * @return ³«¤¤¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥ÈÍ×ÁǤÎID
522  * @details
523  * This routine should almost never fail, but in case it does,
524  * we must be sure to handle "failure" of this routine.
525  */
526 s16b o_pop(void)
527 {
528         int i;
529
530
531         /* Initial allocation */
532         if (o_max < max_o_idx)
533         {
534                 /* Get next space */
535                 i = o_max;
536
537                 /* Expand object array */
538                 o_max++;
539
540                 /* Count objects */
541                 o_cnt++;
542
543                 /* Use this object */
544                 return (i);
545         }
546
547
548         /* Recycle dead objects */
549         for (i = 1; i < o_max; i++)
550         {
551                 object_type *o_ptr;
552
553                 /* Acquire object */
554                 o_ptr = &o_list[i];
555
556                 /* Skip live objects */
557                 if (o_ptr->k_idx) continue;
558
559                 /* Count objects */
560                 o_cnt++;
561
562                 /* Use this object */
563                 return (i);
564         }
565
566
567         /* Warn the player (except during dungeon creation) */
568 #ifdef JP
569         if (character_dungeon) msg_print("¥¢¥¤¥Æ¥à¤¬Â¿¤¹¤®¤ë¡ª");
570 #else
571         if (character_dungeon) msg_print("Too many objects!");
572 #endif
573
574
575         /* Oops */
576         return (0);
577 }
578
579
580 /*!
581  * @brief ¥ª¥Ö¥¸¥§¥¯¥ÈÀ¸À®¥Æ¡¼¥Ö¥ë¤ËÀ¸À®À©Ìó¤ò²Ã¤¨¤ë /
582  * Apply a "object restriction function" to the "object allocation table"
583  * @return ¾ï¤Ë0¤òÊÖ¤¹¡£
584  * @details À¸À®¤ÎÀ©Ìó¤Ï¥°¥í¡¼¥Ð¥ë¤Îget_obj_num_hook´Ø¿ô¥Ý¥¤¥ó¥¿¤Ç²Ã¤¨¤ë
585  */
586 static errr get_obj_num_prep(void)
587 {
588         int i;
589
590         /* Get the entry */
591         alloc_entry *table = alloc_kind_table;
592
593         /* Scan the allocation table */
594         for (i = 0; i < alloc_kind_size; i++)
595         {
596                 /* Accept objects which pass the restriction, if any */
597                 if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index))
598                 {
599                         /* Accept this object */
600                         table[i].prob2 = table[i].prob1;
601                 }
602
603                 /* Do not use this object */
604                 else
605                 {
606                         /* Decline this object */
607                         table[i].prob2 = 0;
608                 }
609         }
610
611         /* Success */
612         return (0);
613 }
614
615
616 /*!
617  * @brief ¥ª¥Ö¥¸¥§¥¯¥ÈÀ¸À®¥Æ¡¼¥Ö¥ë¤«¤é¥¢¥¤¥Æ¥à¤ò¼èÆÀ¤¹¤ë /
618  * Choose an object kind that seems "appropriate" to the given level
619  * @param À¸À®³¬
620  * @return Áª¤Ð¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¥Ù¡¼¥¹ID
621  * @details
622  * This function uses the "prob2" field of the "object allocation table",\n
623  * and various local information, to calculate the "prob3" field of the\n
624  * same table, which is then used to choose an "appropriate" object, in\n
625  * a relatively efficient manner.\n
626  *\n
627  * It is (slightly) more likely to acquire an object of the given level\n
628  * than one of a lower level.  This is done by choosing several objects\n
629  * appropriate to the given level and keeping the "hardest" one.\n
630  *\n
631  * Note that if no objects are "appropriate", then this function will\n
632  * fail, and return zero, but this should *almost* never happen.\n
633  */
634 s16b get_obj_num(int level)
635 {
636         int             i, j, p;
637         int             k_idx;
638         long            value, total;
639         object_kind     *k_ptr;
640         alloc_entry     *table = alloc_kind_table;
641
642         if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
643
644         /* Boost level */
645         if ((level > 0) && !(d_info[dungeon_type].flags1 & DF1_BEGINNER))
646         {
647                 /* Occasional "boost" */
648                 if (one_in_(GREAT_OBJ))
649                 {
650                         /* What a bizarre calculation */
651                         level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
652                 }
653         }
654
655         /* Reset total */
656         total = 0L;
657
658         /* Process probabilities */
659         for (i = 0; i < alloc_kind_size; i++)
660         {
661                 /* Objects are sorted by depth */
662                 if (table[i].level > level) break;
663
664                 /* Default */
665                 table[i].prob3 = 0;
666
667                 /* Access the index */
668                 k_idx = table[i].index;
669
670                 /* Access the actual kind */
671                 k_ptr = &k_info[k_idx];
672
673                 /* Hack -- prevent embedded chests */
674                 if (opening_chest && (k_ptr->tval == TV_CHEST)) continue;
675
676                 /* Accept */
677                 table[i].prob3 = table[i].prob2;
678
679                 /* Total */
680                 total += table[i].prob3;
681         }
682
683         /* No legal objects */
684         if (total <= 0) return (0);
685
686
687         /* Pick an object */
688         value = randint0(total);
689
690         /* Find the object */
691         for (i = 0; i < alloc_kind_size; i++)
692         {
693                 /* Found the entry */
694                 if (value < table[i].prob3) break;
695
696                 /* Decrement */
697                 value = value - table[i].prob3;
698         }
699
700
701         /* Power boost */
702         p = randint0(100);
703
704         /* Try for a "better" object once (50%) or twice (10%) */
705         if (p < 60)
706         {
707                 /* Save old */
708                 j = i;
709
710                 /* Pick a object */
711                 value = randint0(total);
712
713                 /* Find the object */
714                 for (i = 0; i < alloc_kind_size; i++)
715                 {
716                         /* Found the entry */
717                         if (value < table[i].prob3) break;
718
719                         /* Decrement */
720                         value = value - table[i].prob3;
721                 }
722
723                 /* Keep the "best" one */
724                 if (table[i].level < table[j].level) i = j;
725         }
726
727         /* Try for a "better" object twice (10%) */
728         if (p < 10)
729         {
730                 /* Save old */
731                 j = i;
732
733                 /* Pick a object */
734                 value = randint0(total);
735
736                 /* Find the object */
737                 for (i = 0; i < alloc_kind_size; i++)
738                 {
739                         /* Found the entry */
740                         if (value < table[i].prob3) break;
741
742                         /* Decrement */
743                         value = value - table[i].prob3;
744                 }
745
746                 /* Keep the "best" one */
747                 if (table[i].level < table[j].level) i = j;
748         }
749
750
751         /* Result */
752         return (table[i].index);
753 }
754
755
756 /*!
757  * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤ò´ÕÄêºÑ¤Ë¤¹¤ë /
758  * Known is true when the "attributes" of an object are "known".
759  * @param o_ptr ´ÕÄêºÑ¤Ë¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
760  * @return ¤Ê¤·
761  * These include tohit, todam, toac, cost, and pval (charges).\n
762  *\n
763  * Note that "knowing" an object gives you everything that an "awareness"\n
764  * gives you, and much more.  In fact, the player is always "aware" of any\n
765  * item of which he has full "knowledge".\n
766  *\n
767  * But having full knowledge of, say, one "wand of wonder", does not, by\n
768  * itself, give you knowledge, or even awareness, of other "wands of wonder".\n
769  * It happens that most "identify" routines (including "buying from a shop")\n
770  * will make the player "aware" of the object as well as fully "know" it.\n
771  *\n
772  * This routine also removes any inscriptions generated by "feelings".\n
773  */
774 void object_known(object_type *o_ptr)
775 {
776         /* Remove "default inscriptions" */
777         o_ptr->feeling = FEEL_NONE;
778
779         /* Clear the "Felt" info */
780         o_ptr->ident &= ~(IDENT_SENSE);
781
782         /* Clear the "Empty" info */
783         o_ptr->ident &= ~(IDENT_EMPTY);
784
785         /* Now we know about the item */
786         o_ptr->ident |= (IDENT_KNOWN);
787 }
788
789 /*!
790  * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤ò¡ö´ÕÄê¡öºÑ¤Ë¤¹¤ë /
791  * The player is now aware of the effects of the given object.
792  * @param o_ptr ¡ö´ÕÄê¡öºÑ¤Ë¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
793  * @return ¤Ê¤·
794  */
795 void object_aware(object_type *o_ptr)
796 {
797         bool mihanmei = !object_is_aware(o_ptr);
798
799         /* Fully aware of the effects */
800         k_info[o_ptr->k_idx].aware = TRUE;
801
802         if(mihanmei && !(k_info[o_ptr->k_idx].gen_flags & TRG_INSTA_ART) && record_ident &&
803            !p_ptr->is_dead && ((o_ptr->tval >= TV_AMULET && o_ptr->tval <= TV_POTION) || (o_ptr->tval == TV_FOOD)))
804         {
805                 object_type forge;
806                 object_type *q_ptr;
807                 char o_name[MAX_NLEN];
808
809                 q_ptr = &forge;
810                 object_copy(q_ptr, o_ptr);
811
812                 q_ptr->number = 1;
813                 object_desc(o_name, q_ptr, OD_NAME_ONLY);
814                 
815                 do_cmd_write_nikki(NIKKI_HANMEI, 0, o_name);
816         }
817 }
818
819
820 /*!
821  * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤ò»î¹ÔºÑ¤Ë¤¹¤ë /
822  * Something has been "sampled"
823  * @param o_ptr »î¹ÔºÑ¤Ë¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
824  * @return ¤Ê¤·
825  */
826 void object_tried(object_type *o_ptr)
827 {
828         /* Mark it as tried (even if "aware") */
829         k_info[o_ptr->k_idx].tried = TRUE;
830 }
831
832
833 /*!
834  * @brief Ì¤´ÕÄê¤Ê¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤Î´ðËܲÁ³Ê¤òÊÖ¤¹ /
835  * Return the "value" of an "unknown" item Make a guess at the value of non-aware items
836  * @param o_ptr Ì¤´ÕÄê²Á³Ê¤ò³Îǧ¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
837  * @return ¥ª¥Ö¥¸¥§¥¯¥È¤Î̤´ÕÄê²Á³Ê
838  */
839 static s32b object_value_base(object_type *o_ptr)
840 {
841         /* Aware item -- use template cost */
842         if (object_is_aware(o_ptr)) return (k_info[o_ptr->k_idx].cost);
843
844         /* Analyze the type */
845         switch (o_ptr->tval)
846         {
847
848                 /* Un-aware Food */
849                 case TV_FOOD: return (5L);
850
851                 /* Un-aware Potions */
852                 case TV_POTION: return (20L);
853
854                 /* Un-aware Scrolls */
855                 case TV_SCROLL: return (20L);
856
857                 /* Un-aware Staffs */
858                 case TV_STAFF: return (70L);
859
860                 /* Un-aware Wands */
861                 case TV_WAND: return (50L);
862
863                 /* Un-aware Rods */
864                 case TV_ROD: return (90L);
865
866                 /* Un-aware Rings */
867                 case TV_RING: return (45L);
868
869                 /* Un-aware Amulets */
870                 case TV_AMULET: return (45L);
871
872                 /* Figurines, relative to monster level */
873                 case TV_FIGURINE:
874                 {
875                         int level = r_info[o_ptr->pval].level;
876                         if (level < 20) return level*50L;
877                         else if (level < 30) return 1000+(level-20)*150L;
878                         else if (level < 40) return 2500+(level-30)*350L;
879                         else if (level < 50) return 6000+(level-40)*800L;
880                         else return 14000+(level-50)*2000L;
881                 }
882
883                 case TV_CAPTURE:
884                         if (!o_ptr->pval) return 1000L;
885                         else return ((r_info[o_ptr->pval].level) * 50L + 1000);
886         }
887
888         /* Paranoia -- Oops */
889         return (0L);
890 }
891
892
893 /*!
894  * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤Î¥Õ¥é¥°Îफ¤é²Á³Ê¤ò»»½Ð¤¹¤ë /
895  * Return the value of the flags the object has...
896  * @param o_ptr ¥Õ¥é¥°²Á³Ê¤ò³Îǧ¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
897  * @param plusses ¥Õ¥é¥°¤ËÍ¿¤¨¤ë²Á³Ê¤Î´ðËܽŤß
898  * @return ¥ª¥Ö¥¸¥§¥¯¥È¤Î¥Õ¥é¥°²Á³Ê
899  */
900 s32b flag_cost(object_type *o_ptr, int plusses)
901 {
902         s32b total = 0;
903         u32b flgs[TR_FLAG_SIZE];
904         s32b tmp_cost;
905         int count;
906         int i;
907         object_kind *k_ptr = &k_info[o_ptr->k_idx];
908
909         object_flags(o_ptr, flgs);
910
911         /*
912          * Exclude fixed flags of the base item.
913          * pval bonuses of base item will be treated later.
914          */
915         for (i = 0; i < TR_FLAG_SIZE; i++)
916                 flgs[i] &= ~(k_ptr->flags[i]);
917
918         /* Exclude fixed flags of the fixed artifact. */
919         if (object_is_fixed_artifact(o_ptr))
920         {
921                 artifact_type *a_ptr = &a_info[o_ptr->name1];
922
923                 for (i = 0; i < TR_FLAG_SIZE; i++)
924                         flgs[i] &= ~(a_ptr->flags[i]);
925         }
926
927         /* Exclude fixed flags of the ego-item. */
928         else if (object_is_ego(o_ptr))
929         {
930                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
931
932                 for (i = 0; i < TR_FLAG_SIZE; i++)
933                         flgs[i] &= ~(e_ptr->flags[i]);
934         }
935
936
937         /*
938          * Calucurate values of remaining flags
939          */
940         if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
941         if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
942         if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
943         if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
944         if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
945         if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
946         if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
947         if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
948         if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
949         if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
950         if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
951         if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
952                 total += (10000 + (2500 * plusses));
953         if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
954                 total += (10000 + (2500 * plusses));
955
956         tmp_cost = 0;
957         count = 0;
958         if (have_flag(flgs, TR_CHAOTIC)) {total += 5000;count++;}
959         if (have_flag(flgs, TR_VAMPIRIC)) {total += 6500;count++;}
960         if (have_flag(flgs, TR_FORCE_WEAPON)) {tmp_cost += 2500;count++;}
961         if (have_flag(flgs, TR_KILL_ANIMAL)) {tmp_cost += 2800;count++;}
962         else if (have_flag(flgs, TR_SLAY_ANIMAL)) {tmp_cost += 1800;count++;}
963         if (have_flag(flgs, TR_KILL_EVIL)) {tmp_cost += 3300;count++;}
964         else if (have_flag(flgs, TR_SLAY_EVIL)) {tmp_cost += 2300;count++;}
965         if (have_flag(flgs, TR_KILL_HUMAN)) {tmp_cost += 2800;count++;}
966         else if (have_flag(flgs, TR_SLAY_HUMAN)) {tmp_cost += 1800;count++;}
967         if (have_flag(flgs, TR_KILL_UNDEAD)) {tmp_cost += 2800;count++;}
968         else if (have_flag(flgs, TR_SLAY_UNDEAD)) {tmp_cost += 1800;count++;}
969         if (have_flag(flgs, TR_KILL_DEMON)) {tmp_cost += 2800;count++;}
970         else if (have_flag(flgs, TR_SLAY_DEMON)) {tmp_cost += 1800;count++;}
971         if (have_flag(flgs, TR_KILL_ORC)) {tmp_cost += 2500;count++;}
972         else if (have_flag(flgs, TR_SLAY_ORC)) {tmp_cost += 1500;count++;}
973         if (have_flag(flgs, TR_KILL_TROLL)) {tmp_cost += 2800;count++;}
974         else if (have_flag(flgs, TR_SLAY_TROLL)) {tmp_cost += 1800;count++;}
975         if (have_flag(flgs, TR_KILL_GIANT)) {tmp_cost += 2800;count++;}
976         else if (have_flag(flgs, TR_SLAY_GIANT)) {tmp_cost += 1800;count++;}
977         if (have_flag(flgs, TR_KILL_DRAGON)) {tmp_cost += 2800;count++;}
978         else if (have_flag(flgs, TR_SLAY_DRAGON)) {tmp_cost += 1800;count++;}
979
980         if (have_flag(flgs, TR_VORPAL)) {tmp_cost += 2500;count++;}
981         if (have_flag(flgs, TR_IMPACT)) {tmp_cost += 2500;count++;}
982         if (have_flag(flgs, TR_BRAND_POIS)) {tmp_cost += 3800;count++;}
983         if (have_flag(flgs, TR_BRAND_ACID)) {tmp_cost += 3800;count++;}
984         if (have_flag(flgs, TR_BRAND_ELEC)) {tmp_cost += 3800;count++;}
985         if (have_flag(flgs, TR_BRAND_FIRE)) {tmp_cost += 2500;count++;}
986         if (have_flag(flgs, TR_BRAND_COLD)) {tmp_cost += 2500;count++;}
987         total += (tmp_cost * count);
988
989         if (have_flag(flgs, TR_SUST_STR)) total += 850;
990         if (have_flag(flgs, TR_SUST_INT)) total += 850;
991         if (have_flag(flgs, TR_SUST_WIS)) total += 850;
992         if (have_flag(flgs, TR_SUST_DEX)) total += 850;
993         if (have_flag(flgs, TR_SUST_CON)) total += 850;
994         if (have_flag(flgs, TR_SUST_CHR)) total += 250;
995         if (have_flag(flgs, TR_RIDING)) total += 0;
996         if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
997         if (have_flag(flgs, TR_THROW)) total += 5000;
998         if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
999         if (have_flag(flgs, TR_HOLD_LIFE)) total += 8500;
1000
1001         tmp_cost = 0;
1002         count = 0;
1003         if (have_flag(flgs, TR_IM_ACID)) {tmp_cost += 15000;count += 2;}
1004         if (have_flag(flgs, TR_IM_ELEC)) {tmp_cost += 15000;count += 2;}
1005         if (have_flag(flgs, TR_IM_FIRE)) {tmp_cost += 15000;count += 2;}
1006         if (have_flag(flgs, TR_IM_COLD)) {tmp_cost += 15000;count += 2;}
1007         if (have_flag(flgs, TR_REFLECT)) {tmp_cost += 5000;count += 2;}
1008         if (have_flag(flgs, TR_RES_ACID)) {tmp_cost += 500;count++;}
1009         if (have_flag(flgs, TR_RES_ELEC)) {tmp_cost += 500;count++;}
1010         if (have_flag(flgs, TR_RES_FIRE)) {tmp_cost += 500;count++;}
1011         if (have_flag(flgs, TR_RES_COLD)) {tmp_cost += 500;count++;}
1012         if (have_flag(flgs, TR_RES_POIS)) {tmp_cost += 1000;count += 2;}
1013         if (have_flag(flgs, TR_RES_FEAR)) {tmp_cost += 1000;count += 2;}
1014         if (have_flag(flgs, TR_RES_LITE)) {tmp_cost += 800;count += 2;}
1015         if (have_flag(flgs, TR_RES_DARK)) {tmp_cost += 800;count += 2;}
1016         if (have_flag(flgs, TR_RES_BLIND)) {tmp_cost += 900;count += 2;}
1017         if (have_flag(flgs, TR_RES_CONF)) {tmp_cost += 900;count += 2;}
1018         if (have_flag(flgs, TR_RES_SOUND)) {tmp_cost += 900;count += 2;}
1019         if (have_flag(flgs, TR_RES_SHARDS)) {tmp_cost += 900;count += 2;}
1020         if (have_flag(flgs, TR_RES_NETHER)) {tmp_cost += 900;count += 2;}
1021         if (have_flag(flgs, TR_RES_NEXUS)) {tmp_cost += 900;count += 2;}
1022         if (have_flag(flgs, TR_RES_CHAOS)) {tmp_cost += 1000;count += 2;}
1023         if (have_flag(flgs, TR_RES_DISEN)) {tmp_cost += 2000;count += 2;}
1024         total += (tmp_cost * count);
1025
1026         if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
1027         if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
1028         if (have_flag(flgs, TR_SH_COLD)) total += 5000;
1029         if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
1030         if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
1031         if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
1032         if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
1033         if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
1034         if (have_flag(flgs, TR_LEVITATION)) total += 1250;
1035         if (have_flag(flgs, TR_LITE_1)) total += 1500;
1036         if (have_flag(flgs, TR_LITE_2)) total += 2500;
1037         if (have_flag(flgs, TR_LITE_3)) total += 4000;
1038         if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
1039         if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
1040         if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
1041         if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
1042         if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
1043         if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
1044         if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
1045         if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
1046         if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
1047         if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
1048         if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
1049         if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
1050         if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
1051         if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
1052         if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
1053         if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
1054         if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
1055         if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
1056         if (have_flag(flgs, TR_REGEN)) total += 2500;
1057         if (have_flag(flgs, TR_WARNING)) total += 2000;
1058         if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
1059         if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
1060         if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
1061         if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
1062         if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
1063         if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
1064         if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
1065         if (have_flag(flgs, TR_ACTIVATE)) total += 100;
1066         if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
1067         if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
1068         if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
1069         if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
1070         if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
1071         if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
1072         if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
1073         if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
1074         if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
1075         if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
1076         if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
1077         if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
1078         if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
1079         if (have_flag(flgs, TR_TELEPORT))
1080         {
1081                 if (object_is_cursed(o_ptr))
1082                         total -= 7500;
1083                 else
1084                         total += 250;
1085         }
1086         if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
1087         if (have_flag(flgs, TR_BLESSED)) total += 750;
1088         if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
1089         if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
1090         if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
1091         if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
1092         if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
1093
1094         /* Also, give some extra for activatable powers... */
1095         if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
1096         {
1097                 const activation_type* const act_ptr = find_activation_info(o_ptr);
1098                 if (act_ptr) {
1099                         total += act_ptr->value;
1100                 }
1101         }
1102
1103         return total;
1104 }
1105
1106
1107 /*!
1108  * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤Î¿¿¤Î²Á³Ê¤ò»»½Ð¤¹¤ë /
1109  * Return the value of the flags the object has...
1110  * @param o_ptr ËܲÁ³Ê¤ò³Îǧ¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1111  * @return ¥ª¥Ö¥¸¥§¥¯¥È¤ÎËܲÁ³Ê
1112  * @details
1113  * Return the "real" price of a "known" item, not including discounts\n
1114  *\n
1115  * Wand and staffs get cost for each charge\n
1116  *\n
1117  * Armor is worth an extra 100 gold per bonus point to armor class.\n
1118  *\n
1119  * Weapons are worth an extra 100 gold per bonus point (AC,TH,TD).\n
1120  *\n
1121  * Missiles are only worth 5 gold per bonus point, since they\n
1122  * usually appear in groups of 20, and we want the player to get\n
1123  * the same amount of cash for any "equivalent" item.  Note that\n
1124  * missiles never have any of the "pval" flags, and in fact, they\n
1125  * only have a few of the available flags, primarily of the "slay"\n
1126  * and "brand" and "ignore" variety.\n
1127  *\n
1128  * Armor with a negative armor bonus is worthless.\n
1129  * Weapons with negative hit+damage bonuses are worthless.\n
1130  *\n
1131  * Every wearable item with a "pval" bonus is worth extra (see below).\n
1132  */
1133 s32b object_value_real(object_type *o_ptr)
1134 {
1135         s32b value;
1136
1137         u32b flgs[TR_FLAG_SIZE];
1138
1139         object_kind *k_ptr = &k_info[o_ptr->k_idx];
1140
1141
1142         /* Hack -- "worthless" items */
1143         if (!k_info[o_ptr->k_idx].cost) return (0L);
1144
1145         /* Base cost */
1146         value = k_info[o_ptr->k_idx].cost;
1147
1148         /* Extract some flags */
1149         object_flags(o_ptr, flgs);
1150
1151         /* Artifact */
1152         if (object_is_fixed_artifact(o_ptr))
1153         {
1154                 artifact_type *a_ptr = &a_info[o_ptr->name1];
1155
1156                 /* Hack -- "worthless" artifacts */
1157                 if (!a_ptr->cost) return (0L);
1158
1159                 /* Hack -- Use the artifact cost instead */
1160                 value = a_ptr->cost;
1161                 value += flag_cost(o_ptr, o_ptr->pval);
1162
1163                 /* Don't add pval bonuses etc. */
1164                 return (value);
1165         }
1166
1167         /* Ego-Item */
1168         else if (object_is_ego(o_ptr))
1169         {
1170                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
1171
1172                 /* Hack -- "worthless" ego-items */
1173                 if (!e_ptr->cost) return (0L);
1174
1175                 /* Hack -- Reward the ego-item with a bonus */
1176                 value += e_ptr->cost;
1177                 value += flag_cost(o_ptr, o_ptr->pval);
1178         }
1179
1180         else
1181         {
1182                 int i;
1183                 bool flag = FALSE;
1184
1185                 for (i = 0; i < TR_FLAG_SIZE; i++) 
1186                         if (o_ptr->art_flags[i]) flag = TRUE;
1187
1188                 if (flag) value += flag_cost(o_ptr, o_ptr->pval);
1189         }
1190
1191         /* Analyze pval bonus for normal object */
1192         switch (o_ptr->tval)
1193         {
1194         case TV_SHOT:
1195         case TV_ARROW:
1196         case TV_BOLT:
1197         case TV_BOW:
1198         case TV_DIGGING:
1199         case TV_HAFTED:
1200         case TV_POLEARM:
1201         case TV_SWORD:
1202         case TV_BOOTS:
1203         case TV_GLOVES:
1204         case TV_HELM:
1205         case TV_CROWN:
1206         case TV_SHIELD:
1207         case TV_CLOAK:
1208         case TV_SOFT_ARMOR:
1209         case TV_HARD_ARMOR:
1210         case TV_DRAG_ARMOR:
1211         case TV_LITE:
1212         case TV_AMULET:
1213         case TV_RING:
1214                 /* No pval */
1215                 if (!o_ptr->pval) break;
1216
1217                 /* Hack -- Negative "pval" is always bad */
1218                 if (o_ptr->pval < 0) return (0L);
1219
1220                 /* Give credit for stat bonuses */
1221                 if (have_flag(flgs, TR_STR)) value += (o_ptr->pval * 200L);
1222                 if (have_flag(flgs, TR_INT)) value += (o_ptr->pval * 200L);
1223                 if (have_flag(flgs, TR_WIS)) value += (o_ptr->pval * 200L);
1224                 if (have_flag(flgs, TR_DEX)) value += (o_ptr->pval * 200L);
1225                 if (have_flag(flgs, TR_CON)) value += (o_ptr->pval * 200L);
1226                 if (have_flag(flgs, TR_CHR)) value += (o_ptr->pval * 200L);
1227
1228                 /* Give credit for stealth and searching */
1229                 if (have_flag(flgs, TR_MAGIC_MASTERY)) value += (o_ptr->pval * 100);
1230                 if (have_flag(flgs, TR_STEALTH)) value += (o_ptr->pval * 100L);
1231                 if (have_flag(flgs, TR_SEARCH)) value += (o_ptr->pval * 100L);
1232
1233                 /* Give credit for infra-vision and tunneling */
1234                 if (have_flag(flgs, TR_INFRA)) value += (o_ptr->pval * 50L);
1235                 if (have_flag(flgs, TR_TUNNEL)) value += (o_ptr->pval * 50L);
1236
1237                 /* Give credit for extra attacks */
1238                 if (have_flag(flgs, TR_BLOWS)) value += (o_ptr->pval * 5000L);
1239
1240                 /* Give credit for speed bonus */
1241                 if (have_flag(flgs, TR_SPEED)) value += (o_ptr->pval * 10000L);
1242
1243                 break;
1244         }
1245
1246
1247         /* Analyze the item */
1248         switch (o_ptr->tval)
1249         {
1250                 /* Wands/Staffs */
1251                 case TV_WAND:
1252                 {
1253                         /* Pay extra for charges, depending on standard number of
1254                          * charges.  Handle new-style wands correctly. -LM-
1255                          */
1256                         value += (value * o_ptr->pval / o_ptr->number / (k_ptr->pval * 2));
1257
1258                         /* Done */
1259                         break;
1260                 }
1261                 case TV_STAFF:
1262                 {
1263                         /* Pay extra for charges, depending on standard number of
1264                          * charges.  -LM-
1265                          */
1266                         value += (value * o_ptr->pval / (k_ptr->pval * 2));
1267
1268                         /* Done */
1269                         break;
1270                 }
1271
1272                 /* Rings/Amulets */
1273                 case TV_RING:
1274                 case TV_AMULET:
1275                 {
1276                         /* Hack -- negative bonuses are bad */
1277                         if (o_ptr->to_h + o_ptr->to_d + o_ptr->to_a < 0) return (0L);
1278
1279                         /* Give credit for bonuses */
1280                         value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 200L);
1281
1282                         /* Done */
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                         /* Done */
1304                         break;
1305                 }
1306
1307                 /* Bows/Weapons */
1308                 case TV_BOW:
1309                 case TV_DIGGING:
1310                 case TV_HAFTED:
1311                 case TV_SWORD:
1312                 case TV_POLEARM:
1313                 {
1314                         /* Hack -- negative hit/damage bonuses */
1315                         if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1316
1317                         /* Factor in the bonuses */
1318                         value += ((o_ptr->to_h + o_ptr->to_d + o_ptr->to_a) * 100L);
1319
1320                         /* Hack -- Factor in extra damage dice and sides */
1321                         value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 250L;
1322                         value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 250L;
1323
1324                         /* Done */
1325                         break;
1326                 }
1327
1328                 /* Ammo */
1329                 case TV_SHOT:
1330                 case TV_ARROW:
1331                 case TV_BOLT:
1332                 {
1333                         /* Hack -- negative hit/damage bonuses */
1334                         if (o_ptr->to_h + o_ptr->to_d < 0) return (0L);
1335
1336                         /* Factor in the bonuses */
1337                         value += ((o_ptr->to_h + o_ptr->to_d) * 5L);
1338
1339                         /* Hack -- Factor in extra damage dice and sides */
1340                         value += (o_ptr->dd - k_ptr->dd) * o_ptr->ds * 5L;
1341                         value += (o_ptr->ds - k_ptr->ds) * o_ptr->dd * 5L;
1342
1343                         /* Done */
1344                         break;
1345                 }
1346
1347                 /* Figurines, relative to monster level */
1348                 case TV_FIGURINE:
1349                 {
1350                         int level = r_info[o_ptr->pval].level;
1351                         if (level < 20) value = level*50L;
1352                         else if (level < 30) value = 1000+(level-20)*150L;
1353                         else if (level < 40) value = 2500+(level-30)*350L;
1354                         else if (level < 50) value = 6000+(level-40)*800L;
1355                         else value = 14000+(level-50)*2000L;
1356                         break;
1357                 }
1358
1359                 case TV_CAPTURE:
1360                 {
1361                         if (!o_ptr->pval) value = 1000L;
1362                         else value = ((r_info[o_ptr->pval].level) * 50L + 1000);
1363                         break;
1364                 }
1365
1366                 case TV_CHEST:
1367                 {
1368                         if (!o_ptr->pval) value = 0L;
1369                         break;
1370                 }
1371         }
1372
1373         /* Worthless object */
1374         if (value < 0) return 0L;
1375
1376         /* Return the value */
1377         return (value);
1378 }
1379
1380
1381 /*!
1382  * @brief ¥ª¥Ö¥¸¥§¥¯¥È²Á³Ê»»½Ð¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó /
1383  * Return the price of an item including plusses (and charges)
1384  * @param o_ptr È½ÌÀ¤·¤Æ¤¤¤ë¸½²Á³Ê¤ò³Îǧ¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1385  * @return ¥ª¥Ö¥¸¥§¥¯¥È¤ÎȽÌÀ¤·¤Æ¤¤¤ë¸½²Á³Ê
1386  * @details
1387  * This function returns the "value" of the given item (qty one)\n
1388  *\n
1389  * Never notice "unknown" bonuses or properties, including "curses",\n
1390  * since that would give the player information he did not have.\n
1391  *\n
1392  * Note that discounted items stay discounted forever, even if\n
1393  * the discount is "forgotten" by the player via memory loss.\n
1394  */
1395 s32b object_value(object_type *o_ptr)
1396 {
1397         s32b value;
1398
1399
1400         /* Unknown items -- acquire a base value */
1401         if (object_is_known(o_ptr))
1402         {
1403                 /* Broken items -- worthless */
1404                 if (object_is_broken(o_ptr)) return (0L);
1405
1406                 /* Cursed items -- worthless */
1407                 if (object_is_cursed(o_ptr)) return (0L);
1408
1409                 /* Real value (see above) */
1410                 value = object_value_real(o_ptr);
1411         }
1412
1413         /* Known items -- acquire the actual value */
1414         else
1415         {
1416                 /* Hack -- Felt broken items */
1417                 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_broken(o_ptr)) return (0L);
1418
1419                 /* Hack -- Felt cursed items */
1420                 if ((o_ptr->ident & (IDENT_SENSE)) && object_is_cursed(o_ptr)) return (0L);
1421
1422                 /* Base value (see above) */
1423                 value = object_value_base(o_ptr);
1424         }
1425
1426
1427         /* Apply discount (if any) */
1428         if (o_ptr->discount) value -= (value * o_ptr->discount / 100L);
1429
1430
1431         /* Return the final value */
1432         return (value);
1433 }
1434
1435
1436
1437 /*!
1438  * @brief Ç˲õ²Äǽ¤Ê¥¢¥¤¥Æ¥à¤«¤òÊÖ¤¹ /
1439  * Determines whether an object can be destroyed, and makes fake inscription.
1440  * @param o_ptr Ç˲õ²Äǽ¤«¤ò³Îǧ¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1441  * @return ¥ª¥Ö¥¸¥§¥¯¥È¤¬Ç˲õ²Äǽ¤Ê¤é¤ÐTRUE¤òÊÖ¤¹
1442  */
1443 bool can_player_destroy_object(object_type *o_ptr)
1444 {
1445         /* Artifacts cannot be destroyed */
1446         if (!object_is_artifact(o_ptr)) return TRUE;
1447
1448         /* If object is unidentified, makes fake inscription */
1449         if (!object_is_known(o_ptr))
1450         {
1451                 byte feel = FEEL_SPECIAL;
1452
1453                 /* Hack -- Handle icky artifacts */
1454                 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
1455
1456                 /* Hack -- inscribe the artifact */
1457                 o_ptr->feeling = feel;
1458
1459                 /* We have "felt" it (again) */
1460                 o_ptr->ident |= (IDENT_SENSE);
1461
1462                 /* Combine the pack */
1463                 p_ptr->notice |= (PN_COMBINE);
1464
1465                 /* Window stuff */
1466                 p_ptr->window |= (PW_INVEN | PW_EQUIP);
1467
1468                 /* Done */
1469                 return FALSE;
1470         }
1471
1472         /* Identified artifact -- Nothing to do */
1473         return FALSE;
1474 }
1475
1476
1477 /*!
1478  * @brief ËâË¡ËÀ¤ä¥í¥Ã¥É¤Î¥¹¥í¥Ã¥Èʬ³ä»þ¤Ë»ÈÍѲó¿ô¤òʬÇÛ¤¹¤ë /
1479  * Distribute charges of rods or wands.
1480  * @param o_ptr Ê¬³ä¸µ¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿ source item
1481  * @param q_ptr Ê¬³äÀ襪¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿ target item, must be of the same type as o_ptr
1482  * @param amt Ê¬³ä¤·¤¿¤¤²ó¿ôÎÌ number of items that are transfered
1483  * @return ¤Ê¤·
1484  * @details
1485  * Hack -- If rods or wands are dropped, the total maximum timeout or\n
1486  * charges need to be allocated between the two stacks.  If all the items\n
1487  * are being dropped, it makes for a neater message to leave the original\n
1488  * stack's pval alone. -LM-\n
1489  */
1490 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
1491 {
1492         if ((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD))
1493         {
1494                 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
1495                 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
1496
1497                 /* Hack -- Rods also need to have their timeouts distributed.  The
1498                  * dropped stack will accept all time remaining to charge up to its
1499                  * maximum.
1500                  */
1501                 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
1502                 {
1503                         if (q_ptr->pval > o_ptr->timeout)
1504                                 q_ptr->timeout = o_ptr->timeout;
1505                         else
1506                                 q_ptr->timeout = q_ptr->pval;
1507
1508                         if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
1509                 }
1510         }
1511 }
1512
1513 /*!
1514  * @brief ËâË¡ËÀ¤ä¥í¥Ã¥É¤Î»ÈÍѲó¿ô¤ò¸º¤é¤¹ /
1515  * @param o_ptr ¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿ source item
1516  * @param amt ¸º¤é¤·¤¿¤¤²ó¿ôÎÌ number of items that are transfered
1517  * @return ¤Ê¤·
1518  * @details
1519  * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
1520  * charges of the stack needs to be reduced, unless all the items are\n
1521  * being destroyed. -LM-\n
1522  */
1523 void reduce_charges(object_type *o_ptr, int amt)
1524 {
1525         if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
1526                 (amt < o_ptr->number))
1527         {
1528                 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
1529         }
1530 }
1531
1532 /*
1533  * Determine if an item can "absorb" a second item
1534  *
1535  * See "object_absorb()" for the actual "absorption" code.
1536  *
1537  * If permitted, we allow staffs (if they are known to have equal charges
1538  * and both are either known or confirmed empty) and wands (if both are
1539  * either known or confirmed empty) and rods (in all cases) to combine.
1540  * Staffs will unstack (if necessary) when they are used, but wands and
1541  * rods will only unstack if one is dropped. -LM-
1542  *
1543  * If permitted, we allow weapons/armor to stack, if fully "known".
1544  *
1545  * Missiles will combine if both stacks have the same "known" status.
1546  * This is done to make unidentified stacks of missiles useful.
1547  *
1548  * Food, potions, scrolls, and "easy know" items always stack.
1549  *
1550  * Chests, and activatable items, never stack (for various reasons).
1551  */
1552
1553 /*
1554  * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
1555  */
1556 #define MAX_STACK_SIZE 99
1557
1558
1559 /*!
1560  * @brief Î¾¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¹¥í¥Ã¥È¤Ë½Å¤Í¹ç¤ï¤»²Äǽ¤ÊºÇÂç¿ô¤òÊÖ¤¹¡£
1561  * Determine if an item can partly absorb a second item. Return maximum number of stack.
1562  * @param o_ptr ¸¡¾Ú¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿1
1563  * @param j_ptr ¸¡¾Ú¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿2
1564  * @return ½Å¤Í¹ç¤ï¤»²Äǽ¤Ê¥¢¥¤¥Æ¥à¿ô
1565  */
1566 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
1567 {
1568         int i;
1569
1570         /* Default maximum number of stack */
1571         int max_num = MAX_STACK_SIZE;
1572
1573         /* Require identical object types */
1574         if (o_ptr->k_idx != j_ptr->k_idx) return 0;
1575
1576
1577         /* Analyze the items */
1578         switch (o_ptr->tval)
1579         {
1580                 /* Chests and Statues*/
1581                 case TV_CHEST:
1582                 case TV_CARD:
1583                 case TV_CAPTURE:
1584                 {
1585                         /* Never okay */
1586                         return 0;
1587                 }
1588
1589                 case TV_STATUE:
1590                 {
1591                         if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
1592                         if (o_ptr->pval != j_ptr->pval) return 0;
1593                         break;
1594                 }
1595
1596                 /* Figurines and Corpses*/
1597                 case TV_FIGURINE:
1598                 case TV_CORPSE:
1599                 {
1600                         /* Same monster */
1601                         if (o_ptr->pval != j_ptr->pval) return 0;
1602
1603                         /* Assume okay */
1604                         break;
1605                 }
1606
1607                 /* Food and Potions and Scrolls */
1608                 case TV_FOOD:
1609                 case TV_POTION:
1610                 case TV_SCROLL:
1611                 {
1612                         /* Assume okay */
1613                         break;
1614                 }
1615
1616                 /* Staffs */
1617                 case TV_STAFF:
1618                 {
1619                         /* Require either knowledge or known empty for both staffs. */
1620                         if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1621                                 !object_is_known(o_ptr)) ||
1622                                 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1623                                 !object_is_known(j_ptr))) return 0;
1624
1625                         /* Require identical charges, since staffs are bulky. */
1626                         if (o_ptr->pval != j_ptr->pval) return 0;
1627
1628                         /* Assume okay */
1629                         break;
1630                 }
1631
1632                 /* Wands */
1633                 case TV_WAND:
1634                 {
1635                         /* Require either knowledge or known empty for both wands. */
1636                         if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
1637                                 !object_is_known(o_ptr)) ||
1638                                 (!(j_ptr->ident & (IDENT_EMPTY)) &&
1639                                 !object_is_known(j_ptr))) return 0;
1640
1641                         /* Wand charges combine in O&ZAngband.  */
1642
1643                         /* Assume okay */
1644                         break;
1645                 }
1646
1647                 /* Staffs and Wands and Rods */
1648                 case TV_ROD:
1649                 {
1650                         /* Prevent overflaw of timeout */
1651                         max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
1652
1653                         /* Assume okay */
1654                         break;
1655                 }
1656
1657                 /* Weapons and Armor */
1658                 case TV_BOW:
1659                 case TV_DIGGING:
1660                 case TV_HAFTED:
1661                 case TV_POLEARM:
1662                 case TV_SWORD:
1663                 case TV_BOOTS:
1664                 case TV_GLOVES:
1665                 case TV_HELM:
1666                 case TV_CROWN:
1667                 case TV_SHIELD:
1668                 case TV_CLOAK:
1669                 case TV_SOFT_ARMOR:
1670                 case TV_HARD_ARMOR:
1671                 case TV_DRAG_ARMOR:
1672
1673                 /* Rings, Amulets, Lites */
1674                 case TV_RING:
1675                 case TV_AMULET:
1676                 case TV_LITE:
1677                 case TV_WHISTLE:
1678                 {
1679                         /* Require full knowledge of both items */
1680                         if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1681
1682                         /* Fall through */
1683                 }
1684
1685                 /* Missiles */
1686                 case TV_BOLT:
1687                 case TV_ARROW:
1688                 case TV_SHOT:
1689                 {
1690                         /* Require identical knowledge of both items */
1691                         if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
1692                         if (o_ptr->feeling != j_ptr->feeling) return 0;
1693
1694                         /* Require identical "bonuses" */
1695                         if (o_ptr->to_h != j_ptr->to_h) return 0;
1696                         if (o_ptr->to_d != j_ptr->to_d) return 0;
1697                         if (o_ptr->to_a != j_ptr->to_a) return 0;
1698
1699                         /* Require identical "pval" code */
1700                         if (o_ptr->pval != j_ptr->pval) return 0;
1701
1702                         /* Artifacts never stack */
1703                         if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
1704
1705                         /* Require identical "ego-item" names */
1706                         if (o_ptr->name2 != j_ptr->name2) return 0;
1707
1708                         /* Require identical added essence  */
1709                         if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
1710                         if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
1711
1712                         /* Hack -- Never stack "powerful" items */
1713                         if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
1714
1715                         /* Hack -- Never stack recharging items */
1716                         if (o_ptr->timeout || j_ptr->timeout) return 0;
1717
1718                         /* Require identical "values" */
1719                         if (o_ptr->ac != j_ptr->ac) return 0;
1720                         if (o_ptr->dd != j_ptr->dd) return 0;
1721                         if (o_ptr->ds != j_ptr->ds) return 0;
1722
1723                         /* Probably okay */
1724                         break;
1725                 }
1726
1727                 /* Various */
1728                 default:
1729                 {
1730                         /* Require knowledge */
1731                         if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
1732
1733                         /* Probably okay */
1734                         break;
1735                 }
1736         }
1737
1738
1739         /* Hack -- Identical art_flags! */
1740         for (i = 0; i < TR_FLAG_SIZE; i++)
1741                 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
1742
1743         /* Hack -- Require identical "cursed" status */
1744         if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
1745
1746         /* Hack -- Require identical "broken" status */
1747         if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
1748
1749
1750         /* Hack -- require semi-matching "inscriptions" */
1751         if (o_ptr->inscription && j_ptr->inscription &&
1752             (o_ptr->inscription != j_ptr->inscription))
1753                 return 0;
1754
1755         /* Hack -- normally require matching "inscriptions" */
1756         if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
1757
1758         /* Hack -- normally require matching "discounts" */
1759         if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
1760
1761
1762         /* They match, so they must be similar */
1763         return max_num;
1764 }
1765
1766 /*!
1767  * @brief Î¾¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¹¥í¥Ã¥È¤Ë½Å¤Í¤ë¤³¤È¤¬¤Ç¤­¤ë¤«¤É¤¦¤«¤òÊÖ¤¹¡£
1768  * Determine if an item can absorb a second item.
1769  * @param o_ptr ¸¡¾Ú¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿1
1770  * @param j_ptr ¸¡¾Ú¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿2
1771  * @return ½Å¤Í¹ç¤ï¤»²Äǽ¤Ê¤é¤ÐTRUE¤òÊÖ¤¹¡£
1772  */
1773 bool object_similar(object_type *o_ptr, object_type *j_ptr)
1774 {
1775         int total = o_ptr->number + j_ptr->number;
1776         int max_num;
1777
1778         /* Are these objects similar? */
1779         max_num = object_similar_part(o_ptr, j_ptr);
1780
1781         /* Return if not similar */
1782         if (!max_num) return FALSE;
1783
1784         /* Maximal "stacking" limit */
1785         if (total > max_num) return (0);
1786
1787
1788         /* They match, so they must be similar */
1789         return (TRUE);
1790 }
1791
1792
1793 /*!
1794  * @brief Î¾¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¹¥í¥Ã¥È¤Ë½Å¤Í¹ç¤ï¤»¤ë¡£
1795  * Allow one item to "absorb" another, assuming they are similar
1796  * @param o_ptr ½Å¤Í¹ç¤ï¤»Àè¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1797  * @param j_ptr ½Å¤Í¹ç¤ï¤»¸µ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1798  * @return ¤Ê¤·
1799  */
1800 void object_absorb(object_type *o_ptr, object_type *j_ptr)
1801 {
1802         int max_num = object_similar_part(o_ptr, j_ptr);
1803         int total = o_ptr->number + j_ptr->number;
1804         int diff = (total > max_num) ? total - max_num : 0;
1805
1806         /* Combine quantity, lose excess items */
1807         o_ptr->number = (total > max_num) ? max_num : total;
1808
1809         /* Hack -- blend "known" status */
1810         if (object_is_known(j_ptr)) object_known(o_ptr);
1811
1812         /* Hack -- clear "storebought" if only one has it */
1813         if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
1814             (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
1815         {
1816                 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
1817                 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
1818         }
1819
1820         /* Hack -- blend "mental" status */
1821         if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL);
1822
1823         /* Hack -- blend "inscriptions" */
1824         if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
1825
1826         /* Hack -- blend "feelings" */
1827         if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
1828
1829         /* Hack -- could average discounts XXX XXX XXX */
1830         /* Hack -- save largest discount XXX XXX XXX */
1831         if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
1832
1833         /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
1834         if (o_ptr->tval == TV_ROD)
1835         {
1836                 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1837                 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
1838         }
1839
1840         /* Hack -- if wands are stacking, combine the charges. -LM- */
1841         if (o_ptr->tval == TV_WAND)
1842         {
1843                 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
1844         }
1845 }
1846
1847
1848 /*!
1849  * @brief tval¤Èsval¤ËÂбþ¤¹¤ë¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤ÎID¤òÊÖ¤¹¡£
1850  * Find the index of the object_kind with the given tval and sval
1851  * @param tval ¸¡º÷¤·¤¿¤¤¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤Îtval
1852  * @param sval ¸¡º÷¤·¤¿¤¤¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤Îsval
1853  * @return ¤Ê¤·
1854  */
1855 s16b lookup_kind(int tval, int sval)
1856 {
1857         int k;
1858         int num = 0;
1859         int bk = 0;
1860
1861         /* Look for it */
1862         for (k = 1; k < max_k_idx; k++)
1863         {
1864                 object_kind *k_ptr = &k_info[k];
1865
1866                 /* Require correct tval */
1867                 if (k_ptr->tval != tval) continue;
1868
1869                 /* Found a match */
1870                 if (k_ptr->sval == sval) return (k);
1871
1872                 /* Ignore illegal items */
1873                 if (sval != SV_ANY) continue;
1874
1875                 /* Apply the randomizer */
1876                 if (!one_in_(++num)) continue;
1877
1878                 /* Use this value */
1879                 bk = k;
1880         }
1881
1882         /* Return this choice */
1883         if (sval == SV_ANY)
1884         {
1885                 return bk;
1886         }
1887
1888 #if 0
1889         /* Oops */
1890 #ifdef JP
1891         msg_format("¥¢¥¤¥Æ¥à¤¬¤Ê¤¤ (%d,%d)", tval, sval);
1892 #else
1893         msg_format("No object (%d,%d)", tval, sval);
1894 #endif
1895 #endif
1896
1897
1898         /* Oops */
1899         return (0);
1900 }
1901
1902
1903 /*!
1904  * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤ò½é´ü²½¤¹¤ë
1905  * Wipe an object clean.
1906  * @param o_ptr ½é´ü²½¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1907  * @return ¤Ê¤·
1908  */
1909 void object_wipe(object_type *o_ptr)
1910 {
1911         /* Wipe the structure */
1912         (void)WIPE(o_ptr, object_type);
1913 }
1914
1915
1916 /*!
1917  * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤òÊ£À½¤¹¤ë
1918  * Wipe an object clean.
1919  * @param o_ptr Ê£À½¸µ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1920  * @param j_ptr Ê£À½Àè¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1921  * @return ¤Ê¤·
1922  */
1923 void object_copy(object_type *o_ptr, object_type *j_ptr)
1924 {
1925         /* Copy the structure */
1926         (void)COPY(o_ptr, j_ptr, object_type);
1927 }
1928
1929
1930 /*!
1931  * @brief ¥ª¥Ö¥¸¥§¥¯¥È¹½Â¤ÂΤ˥١¼¥¹¥¢¥¤¥Æ¥à¤òºîÀ®¤¹¤ë
1932  * Prepare an object based on an object kind.
1933  * @param o_ptr ÂåÆþ¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
1934  * @param k_idx ¿·¤¿¤ËºîÀ®¤·¤¿¤¤¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¾ðÊó¤ÎID
1935  * @return ¤Ê¤·
1936  */
1937 void object_prep(object_type *o_ptr, int k_idx)
1938 {
1939         object_kind *k_ptr = &k_info[k_idx];
1940
1941         /* Clear the record */
1942         object_wipe(o_ptr);
1943
1944         /* Save the kind index */
1945         o_ptr->k_idx = k_idx;
1946
1947         /* Efficiency -- tval/sval */
1948         o_ptr->tval = k_ptr->tval;
1949         o_ptr->sval = k_ptr->sval;
1950
1951         /* Default "pval" */
1952         o_ptr->pval = k_ptr->pval;
1953
1954         /* Default number */
1955         o_ptr->number = 1;
1956
1957         /* Default weight */
1958         o_ptr->weight = k_ptr->weight;
1959
1960         /* Default magic */
1961         o_ptr->to_h = k_ptr->to_h;
1962         o_ptr->to_d = k_ptr->to_d;
1963         o_ptr->to_a = k_ptr->to_a;
1964
1965         /* Default power */
1966         o_ptr->ac = k_ptr->ac;
1967         o_ptr->dd = k_ptr->dd;
1968         o_ptr->ds = k_ptr->ds;
1969
1970         /* Default activation */
1971         if (k_ptr->act_idx > 0) o_ptr->xtra2 = k_ptr->act_idx;
1972
1973         /* Hack -- worthless items are always "broken" */
1974         if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
1975
1976         /* Hack -- cursed items are always "cursed" */
1977         if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
1978         if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1979         if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
1980         if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
1981         if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
1982         if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
1983 }
1984
1985
1986 /*!
1987  * @brief ¾å¼Á°Ê¾å¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ËÍ¿¤¨¤ë¤¿¤á¤Î³Æ¼ï¥Ü¡¼¥Ê¥¹¤òÀµµ¬Íð¿ô¤â²Ã¤¨¤Æ»»½Ð¤¹¤ë¡£
1988  * Help determine an "enchantment bonus" for an object.
1989  * @param max ¥Ü¡¼¥Ê¥¹ÃͤθÂÅÙ
1990  * @param level ¥Ü¡¼¥Ê¥¹Ãͤ˲ÃÌ£¤¹¤ë´ð½àÀ¸À®³¬
1991  * @return »»½Ð¤µ¤ì¤¿¥Ü¡¼¥Ê¥¹ÃÍ
1992  * @details
1993  * To avoid floating point but still provide a smooth distribution of bonuses,\n
1994  * we simply round the results of division in such a way as to "average" the\n
1995  * correct floating point value.\n
1996  *\n
1997  * This function has been changed.  It uses "randnor()" to choose values from\n
1998  * a normal distribution, whose mean moves from zero towards the max as the\n
1999  * level increases, and whose standard deviation is equal to 1/4 of the max,\n
2000  * and whose values are forced to lie between zero and the max, inclusive.\n
2001  *\n
2002  * Since the "level" rarely passes 100 before Morgoth is dead, it is very\n
2003  * rare to get the "full" enchantment on an object, even a deep levels.\n
2004  *\n
2005  * It is always possible (albeit unlikely) to get the "full" enchantment.\n
2006  *\n
2007  * A sample distribution of values from "m_bonus(10, N)" is shown below:\n
2008  *\n
2009  *   N       0     1     2     3     4     5     6     7     8     9    10\n
2010  * ---    ----  ----  ----  ----  ----  ----  ----  ----  ----  ----  ----\n
2011  *   0   66.37 13.01  9.73  5.47  2.89  1.31  0.72  0.26  0.12  0.09  0.03\n
2012  *   8   46.85 24.66 12.13  8.13  4.20  2.30  1.05  0.36  0.19  0.08  0.05\n
2013  *  16   30.12 27.62 18.52 10.52  6.34  3.52  1.95  0.90  0.31  0.15  0.05\n
2014  *  24   22.44 15.62 30.14 12.92  8.55  5.30  2.39  1.63  0.62  0.28  0.11\n
2015  *  32   16.23 11.43 23.01 22.31 11.19  7.18  4.46  2.13  1.20  0.45  0.41\n
2016  *  40   10.76  8.91 12.80 29.51 16.00  9.69  5.90  3.43  1.47  0.88  0.65\n
2017  *  48    7.28  6.81 10.51 18.27 27.57 11.76  7.85  4.99  2.80  1.22  0.94\n
2018  *  56    4.41  4.73  8.52 11.96 24.94 19.78 11.06  7.18  3.68  1.96  1.78\n
2019  *  64    2.81  3.07  5.65  9.17 13.01 31.57 13.70  9.30  6.04  3.04  2.64\n
2020  *  72    1.87  1.99  3.68  7.15 10.56 20.24 25.78 12.17  7.52  4.42  4.62\n
2021  *  80    1.02  1.23  2.78  4.75  8.37 12.04 27.61 18.07 10.28  6.52  7.33\n
2022  *  88    0.70  0.57  1.56  3.12  6.34 10.06 15.76 30.46 12.58  8.47 10.38\n
2023  *  96    0.27  0.60  1.25  2.28  4.30  7.60 10.77 22.52 22.51 11.37 16.53\n
2024  * 104    0.22  0.42  0.77  1.36  2.62  5.33  8.93 13.05 29.54 15.23 22.53\n
2025  * 112    0.15  0.20  0.56  0.87  2.00  3.83  6.86 10.06 17.89 27.31 30.27\n
2026  * 120    0.03  0.11  0.31  0.46  1.31  2.48  4.60  7.78 11.67 25.53 45.72\n
2027  * 128    0.02  0.01  0.13  0.33  0.83  1.41  3.24  6.17  9.57 14.22 64.07\n
2028  */
2029 s16b m_bonus(int max, int level)
2030 {
2031         int bonus, stand, extra, value;
2032
2033
2034         /* Paranoia -- enforce maximal "level" */
2035         if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
2036
2037
2038         /* The "bonus" moves towards the max */
2039         bonus = ((max * level) / MAX_DEPTH);
2040
2041         /* Hack -- determine fraction of error */
2042         extra = ((max * level) % MAX_DEPTH);
2043
2044         /* Hack -- simulate floating point computations */
2045         if (randint0(MAX_DEPTH) < extra) bonus++;
2046
2047
2048         /* The "stand" is equal to one quarter of the max */
2049         stand = (max / 4);
2050
2051         /* Hack -- determine fraction of error */
2052         extra = (max % 4);
2053
2054         /* Hack -- simulate floating point computations */
2055         if (randint0(4) < extra) stand++;
2056
2057
2058         /* Choose an "interesting" value */
2059         value = randnor(bonus, stand);
2060
2061         /* Enforce the minimum value */
2062         if (value < 0) return (0);
2063
2064         /* Enforce the maximum value */
2065         if (value > max) return (max);
2066
2067         /* Result */
2068         return (value);
2069 }
2070
2071
2072 /*!
2073  * @brief ¥Ç¥Ð¥Ã¥°»þ¤Ë¥¢¥¤¥Æ¥àÀ¸À®¾ðÊó¤ò¥á¥Ã¥»¡¼¥¸¤Ë½ÐÎϤ¹¤ë / Cheat -- describe a created object for the user
2074  * @param o_ptr ¥Ç¥Ð¥Ã¥°½ÐÎϤ¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2075  * @return ¤Ê¤·
2076  */
2077 static void object_mention(object_type *o_ptr)
2078 {
2079         char o_name[MAX_NLEN];
2080
2081         /* Describe */
2082         object_desc(o_name, o_ptr, (OD_NAME_ONLY | OD_STORE));
2083
2084         /* Artifact */
2085         if (object_is_fixed_artifact(o_ptr))
2086         {
2087                 /* Silly message */
2088 #ifdef JP
2089                 msg_format("ÅÁÀâ¤Î¥¢¥¤¥Æ¥à (%s)", o_name);
2090 #else
2091                 msg_format("Artifact (%s)", o_name);
2092 #endif
2093
2094         }
2095
2096         /* Random Artifact */
2097         else if (o_ptr->art_name)
2098         {
2099 #ifdef JP
2100                 msg_print("¥é¥ó¥À¥à¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È");
2101 #else
2102                 msg_print("Random artifact");
2103 #endif
2104
2105         }
2106
2107         /* Ego-item */
2108         else if (object_is_ego(o_ptr))
2109         {
2110                 /* Silly message */
2111 #ifdef JP
2112                 msg_format("̾¤Î¤¢¤ë¥¢¥¤¥Æ¥à (%s)", o_name);
2113 #else
2114                 msg_format("Ego-item (%s)", o_name);
2115 #endif
2116
2117         }
2118
2119         /* Normal item */
2120         else
2121         {
2122                 /* Silly message */
2123 #ifdef JP
2124                 msg_format("¥¢¥¤¥Æ¥à (%s)", o_name);
2125 #else
2126                 msg_format("Object (%s)", o_name);
2127 #endif
2128
2129         }
2130 }
2131
2132 /*!
2133  * @brief INSTA_ART·¿¤Î¸ÇÄꥢ¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤ÎÀ¸À®¤ò³ÎΨ¤Ë±þ¤¸¤Æ»î¹Ô¤¹¤ë¡£
2134  * Mega-Hack -- Attempt to create one of the "Special Objects"
2135  * @param o_ptr À¸À®¤Ë³ä¤êÅö¤Æ¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2136  * @return À¸À®¤ËÀ®¸ù¤·¤¿¤éTRUE¤òÊÖ¤¹¡£
2137  * @details
2138  * We are only called from "make_object()", and we assume that\n
2139  * "apply_magic()" is called immediately after we return.\n
2140  *\n
2141  * Note -- see "make_artifact()" and "apply_magic()"\n
2142  */
2143 static bool make_artifact_special(object_type *o_ptr)
2144 {
2145         int i;
2146         int k_idx = 0;
2147
2148
2149         /* No artifacts in the town */
2150         if (!dun_level) return (FALSE);
2151
2152         /* Themed object */
2153         if (get_obj_num_hook) return (FALSE);
2154
2155         /* Check the artifact list (just the "specials") */
2156         for (i = 0; i < max_a_idx; i++)
2157         {
2158                 artifact_type *a_ptr = &a_info[i];
2159
2160                 /* Skip "empty" artifacts */
2161                 if (!a_ptr->name) continue;
2162
2163                 /* Cannot make an artifact twice */
2164                 if (a_ptr->cur_num) continue;
2165
2166                 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2167                 if (!(a_ptr->gen_flags & TRG_INSTA_ART)) continue;
2168
2169                 /* XXX XXX Enforce minimum "depth" (loosely) */
2170                 if (a_ptr->level > dun_level)
2171                 {
2172                         /* Acquire the "out-of-depth factor" */
2173                         int d = (a_ptr->level - dun_level) * 2;
2174
2175                         /* Roll for out-of-depth creation */
2176                         if (!one_in_(d)) continue;
2177                 }
2178
2179                 /* Artifact "rarity roll" */
2180                 if (!one_in_(a_ptr->rarity)) continue;
2181
2182                 /* Find the base object */
2183                 k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
2184
2185                 /* XXX XXX Enforce minimum "object" level (loosely) */
2186                 if (k_info[k_idx].level > object_level)
2187                 {
2188                         /* Acquire the "out-of-depth factor" */
2189                         int d = (k_info[k_idx].level - object_level) * 5;
2190
2191                         /* Roll for out-of-depth creation */
2192                         if (!one_in_(d)) continue;
2193                 }
2194
2195                 /* Assign the template */
2196                 object_prep(o_ptr, k_idx);
2197
2198                 /* Mega-Hack -- mark the item as an artifact */
2199                 o_ptr->name1 = i;
2200
2201                 /* Hack: Some artifacts get random extra powers */
2202                 random_artifact_resistance(o_ptr, a_ptr);
2203
2204                 /* Success */
2205                 return (TRUE);
2206         }
2207
2208         /* Failure */
2209         return (FALSE);
2210 }
2211
2212
2213 /*!
2214  * @brief ÈóINSTA_ART·¿¤Î¸ÇÄꥢ¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤ÎÀ¸À®¤ò³ÎΨ¤Ë±þ¤¸¤Æ»î¹Ô¤¹¤ë¡£
2215  * Mega-Hack -- Attempt to create one of the "Special Objects"
2216  * @param o_ptr À¸À®¤Ë³ä¤êÅö¤Æ¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2217  * @return À¸À®¤ËÀ®¸ù¤·¤¿¤éTRUE¤òÊÖ¤¹¡£
2218  * @details
2219  * Attempt to change an object into an artifact\n
2220  * This routine should only be called by "apply_magic()"\n
2221  * Note -- see "make_artifact_special()" and "apply_magic()"\n
2222  */
2223 static bool make_artifact(object_type *o_ptr)
2224 {
2225         int i;
2226
2227
2228         /* No artifacts in the town */
2229         if (!dun_level) return (FALSE);
2230
2231         /* Paranoia -- no "plural" artifacts */
2232         if (o_ptr->number != 1) return (FALSE);
2233
2234         /* Check the artifact list (skip the "specials") */
2235         for (i = 0; i < max_a_idx; i++)
2236         {
2237                 artifact_type *a_ptr = &a_info[i];
2238
2239                 /* Skip "empty" items */
2240                 if (!a_ptr->name) continue;
2241
2242                 /* Cannot make an artifact twice */
2243                 if (a_ptr->cur_num) continue;
2244
2245                 if (a_ptr->gen_flags & TRG_QUESTITEM) continue;
2246
2247                 if (a_ptr->gen_flags & TRG_INSTA_ART) continue;
2248
2249                 /* Must have the correct fields */
2250                 if (a_ptr->tval != o_ptr->tval) continue;
2251                 if (a_ptr->sval != o_ptr->sval) continue;
2252
2253                 /* XXX XXX Enforce minimum "depth" (loosely) */
2254                 if (a_ptr->level > dun_level)
2255                 {
2256                         /* Acquire the "out-of-depth factor" */
2257                         int d = (a_ptr->level - dun_level) * 2;
2258
2259                         /* Roll for out-of-depth creation */
2260                         if (!one_in_(d)) continue;
2261                 }
2262
2263                 /* We must make the "rarity roll" */
2264                 if (!one_in_(a_ptr->rarity)) continue;
2265
2266                 /* Hack -- mark the item as an artifact */
2267                 o_ptr->name1 = i;
2268
2269                 /* Hack: Some artifacts get random extra powers */
2270                 random_artifact_resistance(o_ptr, a_ptr);
2271
2272                 /* Success */
2273                 return (TRUE);
2274         }
2275
2276         /* Failure */
2277         return (FALSE);
2278 }
2279
2280
2281 /*!
2282  * @brief ¥¢¥¤¥Æ¥à¤Î¥¨¥´¤ò¥ì¥¢Å٤νŤߤ˹ç¤ï¤»¤Æ¥é¥ó¥À¥à¤ËÁªÂò¤¹¤ë
2283  * Choose random ego type
2284  * @param slot ¼èÆÀ¤·¤¿¤¤¥¨¥´¤ÎÁõÈ÷Éô°Ì
2285  * @param good TRUE¤Ê¤é¤ÐÄ̾ï¤Î¥¨¥´¡¢FALSE¤Ê¤é¤Ð¼ö¤¤¤Î¥¨¥´¤¬ÁªÂòÂоݤȤʤ롣
2286  * @return ÁªÂò¤µ¤ì¤¿¥¨¥´¾ðÊó¤ÎID¡¢Ëü°ìÁªÂò¤Ç¤­¤Ê¤«¤Ã¤¿¾ì¹ç¤Ïmax_e_idx¤¬Ê֤롣
2287  */
2288 static byte get_random_ego(byte slot, bool good)
2289 {
2290         int i, value;
2291         ego_item_type *e_ptr;
2292
2293         long total = 0L;
2294         
2295         for (i = 1; i < max_e_idx; i++)
2296         {
2297                 e_ptr = &e_info[i];
2298                 
2299                 if (e_ptr->slot == slot
2300                     && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2301                 {
2302                         if (e_ptr->rarity)
2303                                 total += (255 / e_ptr->rarity);
2304                 }
2305         }
2306
2307         value = randint1(total);
2308
2309         for (i = 1; i < max_e_idx; i++)
2310         {
2311                 e_ptr = &e_info[i];
2312                 
2313                 if (e_ptr->slot == slot
2314                     && ((good && e_ptr->rating) || (!good && !e_ptr->rating)) )
2315                 {
2316                         if (e_ptr->rarity)
2317                                 value -= (255 / e_ptr->rarity);
2318                         if (value <= 0L) break;
2319                 }
2320         }
2321         return (byte)i;
2322 }
2323
2324
2325 /*!
2326  * @brief Éð´ï·Ï¥ª¥Ö¥¸¥§¥¯¥È¤ËÀ¸À®¥é¥ó¥¯¤´¤È¤Î¶¯²½¤òÍ¿¤¨¤ë¥µ¥Ö¥ë¡¼¥Á¥ó
2327  * Apply magic to an item known to be a "weapon"
2328  * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2329  * @param level À¸À®´ð½à³¬
2330  * @param power À¸À®¥é¥ó¥¯
2331  * @return ¤Ê¤·
2332  * @details
2333  * Hack -- note special base damage dice boosting\n
2334  * Hack -- note special processing for weapon/digger\n
2335  */
2336 static void a_m_aux_1(object_type *o_ptr, int level, int power)
2337 {
2338         int tohit1 = randint1(5) + m_bonus(5, level);
2339         int todam1 = randint1(5) + m_bonus(5, level);
2340
2341         int tohit2 = m_bonus(10, level);
2342         int todam2 = m_bonus(10, level);
2343
2344         if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
2345         {
2346                 tohit2 = (tohit2+1)/2;
2347                 todam2 = (todam2+1)/2;
2348         }
2349
2350         /* Good */
2351         if (power > 0)
2352         {
2353                 /* Enchant */
2354                 o_ptr->to_h += tohit1;
2355                 o_ptr->to_d += todam1;
2356
2357                 /* Very good */
2358                 if (power > 1)
2359                 {
2360                         /* Enchant again */
2361                         o_ptr->to_h += tohit2;
2362                         o_ptr->to_d += todam2;
2363                 }
2364         }
2365
2366         /* Cursed */
2367         else if (power < 0)
2368         {
2369                 /* Penalize */
2370                 o_ptr->to_h -= tohit1;
2371                 o_ptr->to_d -= todam1;
2372
2373                 /* Very cursed */
2374                 if (power < -1)
2375                 {
2376                         /* Penalize again */
2377                         o_ptr->to_h -= tohit2;
2378                         o_ptr->to_d -= todam2;
2379                 }
2380
2381                 /* Cursed (if "bad") */
2382                 if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
2383         }
2384
2385         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
2386
2387         /* Analyze type */
2388         switch (o_ptr->tval)
2389         {
2390                 case TV_DIGGING:
2391                 {
2392                         /* Very good */
2393                         if (power > 1)
2394                         {
2395                                 if (one_in_(30) || (power > 2)) /* power > 2 is debug only */
2396                                         create_artifact(o_ptr, FALSE);
2397                                 else
2398                                         /* Special Ego-item */
2399                                         o_ptr->name2 = EGO_DIGGING;
2400                         }
2401
2402                         /* Very bad */
2403                         else if (power < -1)
2404                         {
2405                                 /* Hack -- Horrible digging bonus */
2406                                 o_ptr->pval = 0 - (5 + randint1(5));
2407                         }
2408
2409                         /* Bad */
2410                         else if (power < 0)
2411                         {
2412                                 /* Hack -- Reverse digging bonus */
2413                                 o_ptr->pval = 0 - (o_ptr->pval);
2414                         }
2415
2416                         break;
2417                 }
2418
2419
2420                 case TV_HAFTED:
2421                 case TV_POLEARM:
2422                 case TV_SWORD:
2423                 {
2424                         /* Very Good */
2425                         if (power > 1)
2426                         {
2427                                 if (one_in_(40) || (power > 2)) /* power > 2 is debug only */
2428                                 {
2429                                         create_artifact(o_ptr, FALSE);
2430                                         break;
2431                                 }
2432                                 while (1)
2433                                 {
2434                                         /* Roll for an ego-item */
2435                                         o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
2436                                         if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
2437                                                 continue;
2438                                         if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
2439                                                 continue;
2440                                         if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2441                                                 continue;
2442                                         break;
2443                                 }
2444
2445                                 switch (o_ptr->name2)
2446                                 {
2447                                 case EGO_HA:
2448                                         if (one_in_(4) && (level > 40))
2449                                                 add_flag(o_ptr->art_flags, TR_BLOWS);
2450                                         break;
2451                                 case EGO_DF:
2452                                         if (one_in_(3))
2453                                                 add_flag(o_ptr->art_flags, TR_RES_POIS);
2454                                         if (one_in_(3))
2455                                                 add_flag(o_ptr->art_flags, TR_WARNING);
2456                                         break;
2457                                 case EGO_KILL_DRAGON:
2458                                         if (one_in_(3))
2459                                                 add_flag(o_ptr->art_flags, TR_RES_POIS);
2460                                         break;
2461                                 case EGO_WEST:
2462                                         if (one_in_(3))
2463                                                 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2464                                         break;
2465                                 case EGO_SLAYING_WEAPON:
2466                                         if (one_in_(3)) /* double damage */
2467                                                 o_ptr->dd *= 2;
2468                                         else
2469                                         {
2470                                                 do
2471                                                 {
2472                                                         o_ptr->dd++;
2473                                                 }
2474                                                 while (one_in_(o_ptr->dd));
2475                                                 
2476                                                 do
2477                                                 {
2478                                                         o_ptr->ds++;
2479                                                 }
2480                                                 while (one_in_(o_ptr->ds));
2481                                         }
2482                                         
2483                                         if (one_in_(5))
2484                                         {
2485                                                 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2486                                         }
2487                                         if (o_ptr->tval == TV_SWORD && one_in_(3))
2488                                         {
2489                                                 add_flag(o_ptr->art_flags, TR_VORPAL);
2490                                         }
2491                                         break;
2492                                 case EGO_TRUMP:
2493                                         if (one_in_(5))
2494                                                 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
2495                                         if (one_in_(7))
2496                                                 one_ability(o_ptr);
2497                                         break;
2498                                 case EGO_PATTERN:
2499                                         if (one_in_(3))
2500                                                 add_flag(o_ptr->art_flags, TR_HOLD_LIFE);
2501                                         if (one_in_(3))
2502                                                 add_flag(o_ptr->art_flags, TR_DEX);
2503                                         if (one_in_(5))
2504                                                 add_flag(o_ptr->art_flags, TR_RES_FEAR);
2505                                         break;
2506                                 case EGO_SHARPNESS:
2507                                         o_ptr->pval = m_bonus(5, level) + 1;
2508                                         break;
2509                                 case EGO_EARTHQUAKES:
2510                                         if (one_in_(3) && (level > 60))
2511                                                 add_flag(o_ptr->art_flags, TR_BLOWS);
2512                                         else
2513                                                 o_ptr->pval = m_bonus(3, level);
2514                                         break;
2515                                 case EGO_VAMPIRIC:
2516                                         if (one_in_(5))
2517                                                 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
2518                                         break;
2519                                 case EGO_DEMON:
2520                                         
2521                                         if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2522                                         one_in_(3) ? 
2523                                                 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2524                                                 one_in_(2) ?
2525                                                         add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2526                                                         add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2527                                                 
2528                                         
2529                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
2530                                         if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
2531                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2532                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2533                                         break;
2534                                 }
2535
2536                                 if (!o_ptr->art_name)
2537                                 {
2538                                         /* Hack -- Super-charge the damage dice */
2539                                         while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2540
2541                                         /* Hack -- Lower the damage dice */
2542                                         if (o_ptr->dd > 9) o_ptr->dd = 9;
2543                                 }
2544                         }
2545
2546                         /* Very cursed */
2547                         else if (power < -1)
2548                         {
2549                                 /* Roll for ego-item */
2550                                 if (randint0(MAX_DEPTH) < level)
2551                                 {
2552                                         while(1)
2553                                         {
2554                                                 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
2555                                                 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
2556                                                 {
2557                                                         continue;
2558                                                 }
2559                                                 break;
2560                                         }
2561                                         switch (o_ptr->name2)
2562                                         {
2563                                         case EGO_MORGUL:
2564                                                 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2565                                                 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2566                                         case EGO_WEIRD:
2567                                                 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
2568                                                 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
2569                                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2570                                                 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2571                                                 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2572                                                 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2573                                         }
2574                                 }
2575                         }
2576
2577                         break;
2578                 }
2579
2580
2581                 case TV_BOW:
2582                 {
2583                         /* Very good */
2584                         if (power > 1)
2585                         {
2586                                 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2587                                 {
2588                                         create_artifact(o_ptr, FALSE);
2589                                         break;
2590                                 }
2591                                 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
2592                         }
2593
2594                         break;
2595                 }
2596
2597
2598                 case TV_BOLT:
2599                 case TV_ARROW:
2600                 case TV_SHOT:
2601                 {
2602                         /* Very good */
2603                         if (power > 1)
2604                         {
2605                                 if (power > 2) /* power > 2 is debug only */
2606                                 {
2607                                         create_artifact(o_ptr, FALSE);
2608                                         break;
2609                                 }
2610
2611                                 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
2612
2613                                 switch (o_ptr->name2)
2614                                 {
2615                                 case EGO_SLAYING_BOLT:
2616                                         o_ptr->dd++;
2617                                         break;
2618                                 }
2619
2620                                 /* Hack -- super-charge the damage dice */
2621                                 while (one_in_(10L * o_ptr->dd * o_ptr->ds)) o_ptr->dd++;
2622
2623                                 /* Hack -- restrict the damage dice */
2624                                 if (o_ptr->dd > 9) o_ptr->dd = 9;
2625                         }
2626
2627                         /* Very cursed */
2628                         else if (power < -1)
2629                         {
2630                                 /* Roll for ego-item */
2631                                 if (randint0(MAX_DEPTH) < level)
2632                                 {
2633                                         o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
2634                                 }
2635                         }
2636
2637                         break;
2638                 }
2639         }
2640 }
2641
2642 /*!
2643  * @brief ¥É¥é¥´¥óÁõÈ÷¤Ë¥é¥ó¥À¥à¤ÊÂÑÀ­¤òÍ¿¤¨¤ë
2644  * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2645  * @return ¤Ê¤·
2646  */
2647 static void dragon_resist(object_type * o_ptr)
2648 {
2649         do
2650         {
2651                 if (one_in_(4))
2652                         one_dragon_ele_resistance(o_ptr);
2653                 else
2654                         one_high_resistance(o_ptr);
2655         }
2656         while (one_in_(2));
2657 }
2658
2659 /*!
2660  * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥é¥ó¥À¥à¤Ê¶¯¤¤ESP¤òÍ¿¤¨¤ë
2661  * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2662  * @return ¤Ê¤·
2663  */
2664 static bool add_esp_strong(object_type *o_ptr)
2665 {
2666         bool nonliv = FALSE;
2667
2668         switch (randint1(3))
2669         {
2670         case 1: add_flag(o_ptr->art_flags, TR_ESP_EVIL); break;
2671         case 2: add_flag(o_ptr->art_flags, TR_TELEPATHY); break;
2672         case 3: add_flag(o_ptr->art_flags, TR_ESP_NONLIVING); nonliv = TRUE; break;
2673         }
2674
2675         return nonliv;
2676 }
2677
2678 /*!
2679  * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥é¥ó¥À¥à¤Ê¼å¤¤ESP¤òÍ¿¤¨¤ë
2680  * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2681  * @return ¤Ê¤·
2682  */
2683 static void add_esp_weak(object_type *o_ptr, bool extra)
2684 {
2685         int i;
2686         u32b weak_esp_list[] = {
2687                 TR_ESP_ANIMAL,
2688                 TR_ESP_UNDEAD,
2689                 TR_ESP_DEMON,
2690                 TR_ESP_ORC,
2691                 TR_ESP_TROLL,
2692                 TR_ESP_GIANT,
2693                 TR_ESP_DRAGON,
2694                 TR_ESP_HUMAN,
2695                 TR_ESP_GOOD,
2696                 TR_ESP_UNIQUE,
2697         };
2698         const int MAX_ESP_WEAK = sizeof(weak_esp_list) / sizeof(weak_esp_list[0]);
2699         const int add_count = MIN(MAX_ESP_WEAK, (extra) ? (3 + randint1(randint1(6))) : randint1(3));
2700
2701         /* Add unduplicated weak esp flags randomly */
2702         for (i = 0; i < add_count; ++ i)
2703         {
2704                 int choice = rand_range(i, MAX_ESP_WEAK - 1);
2705
2706                 add_flag(o_ptr->art_flags, weak_esp_list[choice]);
2707                 weak_esp_list[choice] = weak_esp_list[i];
2708         }
2709 }
2710
2711
2712 /*!
2713  * @brief Ëɶñ·Ï¥ª¥Ö¥¸¥§¥¯¥È¤ËÀ¸À®¥é¥ó¥¯¤´¤È¤Î¶¯²½¤òÍ¿¤¨¤ë¥µ¥Ö¥ë¡¼¥Á¥ó
2714  * Apply magic to an item known to be "armor"
2715  * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
2716  * @param level À¸À®´ð½à³¬
2717  * @param power À¸À®¥é¥ó¥¯
2718  * @return ¤Ê¤·
2719  * @details
2720  * Hack -- note special processing for crown/helm\n
2721  * Hack -- note special processing for robe of permanence\n
2722  */
2723 static void a_m_aux_2(object_type *o_ptr, int level, int power)
2724 {
2725         int toac1 = randint1(5) + m_bonus(5, level);
2726
2727         int toac2 = m_bonus(10, level);
2728
2729         /* Good */
2730         if (power > 0)
2731         {
2732                 /* Enchant */
2733                 o_ptr->to_a += toac1;
2734
2735                 /* Very good */
2736                 if (power > 1)
2737                 {
2738                         /* Enchant again */
2739                         o_ptr->to_a += toac2;
2740                 }
2741         }
2742
2743         /* Cursed */
2744         else if (power < 0)
2745         {
2746                 /* Penalize */
2747                 o_ptr->to_a -= toac1;
2748
2749                 /* Very cursed */
2750                 if (power < -1)
2751                 {
2752                         /* Penalize again */
2753                         o_ptr->to_a -= toac2;
2754                 }
2755
2756                 /* Cursed (if "bad") */
2757                 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
2758         }
2759
2760
2761         /* Analyze type */
2762         switch (o_ptr->tval)
2763         {
2764                 case TV_DRAG_ARMOR:
2765                 {
2766                         if (one_in_(50) || (power > 2)) /* power > 2 is debug only */
2767                                 create_artifact(o_ptr, FALSE);
2768
2769                         /* Mention the item */
2770                         if (cheat_peek) object_mention(o_ptr);
2771
2772                         break;
2773                 }
2774
2775                 case TV_HARD_ARMOR:
2776                 case TV_SOFT_ARMOR:
2777                 {
2778                         /* Very good */
2779                         if (power > 1)
2780                         {
2781                                 /* Hack -- Try for "Robes of the Magi" */
2782                                 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2783                                     (o_ptr->sval == SV_ROBE) &&
2784                                     (randint0(100) < 15))
2785                                 {
2786                                         if (one_in_(5))
2787                                         {
2788                                                 o_ptr->name2 = EGO_YOIYAMI;
2789                                                 o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
2790                                                 o_ptr->sval = SV_YOIYAMI_ROBE;
2791                                                 o_ptr->ac = 0;
2792                                                 o_ptr->to_a = 0;
2793                                         }
2794                                         else
2795                                         {
2796                                                 o_ptr->name2 = EGO_PERMANENCE;
2797                                         }
2798                                         break;
2799                                 }
2800
2801                                 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2802                                 {
2803                                         create_artifact(o_ptr, FALSE);
2804                                         break;
2805                                 }
2806
2807                                 while (1)
2808                                 {
2809                                         bool okay_flag = TRUE;
2810
2811                                         o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
2812
2813                                         switch (o_ptr->name2)
2814                                         {
2815                                           case EGO_DWARVEN:
2816                                                 if (o_ptr->tval != TV_HARD_ARMOR)
2817                                                 {
2818                                                         okay_flag = FALSE;
2819                                                         break;
2820                                                 }
2821                                           case EGO_DRUID:
2822                                                 if (o_ptr->tval != TV_SOFT_ARMOR)
2823                                                 {
2824                                                         okay_flag = FALSE;
2825                                                         break;
2826                                                 }
2827                                           default:
2828                                                 break;
2829                                         }
2830
2831                                         if (okay_flag)
2832                                                 break;
2833                                 }
2834                                 switch (o_ptr->name2)
2835                                 {
2836                                   case EGO_RESISTANCE:
2837                                         if (one_in_(4))
2838                                                 add_flag(o_ptr->art_flags, TR_RES_POIS);
2839                                                 break;
2840                                   case EGO_DWARVEN:
2841                                         o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2842                                         o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
2843                                         break;
2844                                         
2845                                   case EGO_A_DEMON:
2846                                         if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2847                                         one_in_(3) ? 
2848                                                 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
2849                                                 one_in_(2) ?
2850                                                         add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
2851                                                         add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2852                                                 
2853                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2854                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
2855                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2856                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
2857                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
2858                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
2859                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2860                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
2861                                         break;
2862                                   case EGO_A_MORGUL:
2863                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2864                                         if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
2865                                         if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
2866                                         if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
2867                                         if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
2868                                         if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
2869                                         break;
2870                                   default:
2871                                         break;
2872                                 }
2873                         }
2874
2875                         break;
2876                 }
2877
2878                 case TV_SHIELD:
2879                 {
2880
2881                         if (o_ptr->sval == SV_DRAGON_SHIELD)
2882                         {
2883                                 /* Mention the item */
2884                                 if (cheat_peek) object_mention(o_ptr);
2885                                 dragon_resist(o_ptr);
2886                                 if (!one_in_(3)) break;
2887                         }
2888
2889                         /* Very good */
2890                         if (power > 1)
2891                         {
2892                                 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2893                                 {
2894                                         create_artifact(o_ptr, FALSE);
2895                                         break;
2896                                 }
2897                                 
2898                                 while(1)
2899                                 {
2900                                         o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
2901                                         if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD 
2902                                                                 && o_ptr->name2 == EGO_S_DWARVEN)
2903                                         {
2904                                                 continue;
2905                                         }
2906                                         break;
2907                                 }
2908                                 
2909                                 switch (o_ptr->name2)
2910                                 {
2911                                 case EGO_ENDURANCE:
2912                                         if (!one_in_(3)) one_high_resistance(o_ptr);
2913                                         if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2914                                         break;
2915                                 case EGO_REFLECTION:
2916                                         if (o_ptr->sval == SV_MIRROR_SHIELD)
2917                                                 o_ptr->name2 = 0;
2918                                         break;
2919                                         
2920                                 case EGO_S_DWARVEN:
2921                                         o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
2922                                         o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
2923                                         break;
2924                                 }
2925                         }
2926                         break;
2927                 }
2928
2929                 case TV_GLOVES:
2930                 {
2931                         if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
2932                         {
2933                                 /* Mention the item */
2934                                 if (cheat_peek) object_mention(o_ptr);
2935                                 dragon_resist(o_ptr);
2936                                 if (!one_in_(3)) break;
2937                         }
2938                         if (power > 1)
2939                         {
2940                                 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2941                                 {
2942                                         create_artifact(o_ptr, FALSE);
2943                                         break;
2944                                 }
2945                                 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
2946                         }
2947                         
2948                         /* Very cursed */
2949                         else if (power < -1)
2950                         {
2951                                 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
2952                         }
2953
2954                         break;
2955                 }
2956
2957                 case TV_BOOTS:
2958                 {
2959                         if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
2960                         {
2961                                 /* Mention the item */
2962                                 if (cheat_peek) object_mention(o_ptr);
2963                                 dragon_resist(o_ptr);
2964                                 if (!one_in_(3)) break;
2965                         }
2966                         /* Very good */
2967                         if (power > 1)
2968                         {
2969                                 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
2970                                 {
2971                                         create_artifact(o_ptr, FALSE);
2972                                         break;
2973                                 }
2974                                 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
2975
2976                                 switch (o_ptr->name2)
2977                                 {
2978                                 case EGO_SLOW_DESCENT:
2979                                         if (one_in_(2))
2980                                         {
2981                                                 one_high_resistance(o_ptr);
2982                                         }
2983                                         break;
2984                                 }
2985                         }
2986                         /* Very cursed */
2987                         else if (power < -1)
2988                         {
2989                                 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
2990                         }
2991
2992                         break;
2993                 }
2994
2995                 case TV_CROWN:
2996                 {
2997                         /* Very good */
2998                         if (power > 1)
2999                         {
3000                                 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3001                                 {
3002                                         create_artifact(o_ptr, FALSE);
3003                                         break;
3004                                 }
3005                                 while (1)
3006                                 {
3007                                         bool ok_flag = TRUE;
3008                                         o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3009
3010                                         switch (o_ptr->name2)
3011                                         {
3012                                         case EGO_TELEPATHY:
3013                                                 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
3014                                                 else add_esp_weak(o_ptr, FALSE);
3015                                                 break;
3016                                         case EGO_MAGI:
3017                                         case EGO_MIGHT:
3018                                         case EGO_REGENERATION:
3019                                         case EGO_LORDLINESS:
3020                                         case EGO_BASILISK:
3021                                                 break;
3022                                         case EGO_SEEING:
3023                                                 if (one_in_(3))
3024                                                 {
3025                                                         if (one_in_(2)) add_esp_strong(o_ptr);
3026                                                         else add_esp_weak(o_ptr, FALSE);
3027                                                 }
3028                                                 break;
3029                                         default:/* not existing crown (wisdom,lite, etc...) */
3030                                                 ok_flag = FALSE;
3031                                         }
3032                                         if (ok_flag)
3033                                                 break; /* while (1) */
3034                                 }
3035                                 break;
3036                         }
3037
3038                         /* Very cursed */
3039                         else if (power < -1)
3040                         {       
3041                                 while (1)
3042                                 {
3043                                         bool ok_flag = TRUE;
3044                                         o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3045
3046                                         switch (o_ptr->name2)
3047                                         {
3048                                           case EGO_ANCIENT_CURSE:
3049                                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
3050                                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
3051                                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3052                                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3053                                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3054                                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3055                                                 break;
3056                                         }
3057                                         if (ok_flag)
3058                                                 break; /* while (1) */
3059                                 }
3060                         }
3061
3062                         break;
3063                 }
3064
3065                 case TV_HELM:
3066                 {
3067                         if (o_ptr->sval == SV_DRAGON_HELM)
3068                         {
3069                                 /* Mention the item */
3070                                 if (cheat_peek) object_mention(o_ptr);
3071                                 dragon_resist(o_ptr);
3072                                 if (!one_in_(3)) break;
3073                         }
3074
3075                         /* Very good */
3076                         if (power > 1)
3077                         {
3078                                 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3079                                 {
3080                                         create_artifact(o_ptr, FALSE);
3081                                         break;
3082                                 }
3083                                 while (1)
3084                                 {
3085                                         bool ok_flag = TRUE;
3086                                         o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
3087
3088                                         switch (o_ptr->name2)
3089                                         {
3090                                         case EGO_BRILLIANCE:
3091                                         case EGO_DARK:
3092                                         case EGO_INFRAVISION:
3093                                         case EGO_H_PROTECTION:
3094                                                 break;
3095                                         case EGO_SEEING:
3096                                                 if (one_in_(7))
3097                                                 {
3098                                                         if (one_in_(2)) add_esp_strong(o_ptr);
3099                                                         else add_esp_weak(o_ptr, FALSE);
3100                                                 }
3101                                                 break;
3102                                         case EGO_LITE:
3103                                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
3104                                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
3105                                                 break;
3106                                         case EGO_H_DEMON:
3107                                                 if(one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
3108                                                 one_in_(3) ? 
3109                                                         add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
3110                                                         one_in_(2) ?
3111                                                                 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
3112                                                                 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3113                                                 
3114                                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
3115                                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
3116                                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
3117                                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
3118                                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
3119                                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3120                                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
3121                                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
3122                                                 break;
3123                                         default:/* not existing helm (Magi, Might, etc...)*/
3124                                                 ok_flag = FALSE;
3125                                         }
3126                                         if (ok_flag)
3127                                                 break; /* while (1) */
3128                                 }
3129                                 break;
3130                         }
3131                         /* Very cursed */
3132                         else if (power < -1)
3133                         {
3134                                 while (1)
3135                                 {
3136                                         bool ok_flag = TRUE;
3137                                         o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
3138
3139                                         switch (o_ptr->name2)
3140                                         {
3141                                           case EGO_ANCIENT_CURSE:
3142                                                 ok_flag = FALSE;
3143                                         }
3144                                         if (ok_flag)
3145                                                 break; /* while (1) */
3146                                 }
3147                         }
3148                         break;
3149                 }
3150
3151                 case TV_CLOAK:
3152                 {
3153                         /* Very good */
3154                         if (power > 1)
3155                         {
3156                                 if (one_in_(20) || (power > 2)) /* power > 2 is debug only */
3157                                 {
3158                                         create_artifact(o_ptr, FALSE);
3159                                         break;
3160                                 }
3161                                 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
3162
3163                                 switch (o_ptr->name2)
3164                                 {
3165                                 case EGO_BAT:
3166                                         o_ptr->to_d -= 6;
3167                                         o_ptr->to_h -= 6;
3168                                         break;
3169                                   case EGO_NAZGUL:
3170                                         o_ptr->to_d -= 3;
3171                                         o_ptr->to_h -= 3;
3172                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
3173                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
3174                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
3175                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
3176                                         break;
3177                                 }
3178
3179                         }
3180
3181                         /* Very cursed */
3182                         else if (power < -1)
3183                         {
3184                                 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
3185                         }
3186
3187                         break;
3188                 }
3189         }
3190 }
3191
3192
3193 /*!
3194  * @brief Áõ¾þÉÊ·Ï¥ª¥Ö¥¸¥§¥¯¥È¤ËÀ¸À®¥é¥ó¥¯¤´¤È¤Î¶¯²½¤òÍ¿¤¨¤ë¥µ¥Ö¥ë¡¼¥Á¥ó
3195  * Apply magic to an item known to be a "ring" or "amulet"
3196  * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
3197  * @param level À¸À®´ð½à³¬
3198  * @param power À¸À®¥é¥ó¥¯
3199  * @return ¤Ê¤·
3200  * @details
3201  * Hack -- note special "pval boost" code for ring of speed\n
3202  * Hack -- note that some items must be cursed (or blessed)\n
3203  */
3204 static void a_m_aux_3(object_type *o_ptr, int level, int power)
3205 {
3206         /* Apply magic (good or bad) according to type */
3207         switch (o_ptr->tval)
3208         {
3209                 case TV_RING:
3210                 {
3211                         /* Analyze */
3212                         switch (o_ptr->sval)
3213                         {
3214                                 case SV_RING_ATTACKS:
3215                                 {
3216                                         /* Stat bonus */
3217                                         o_ptr->pval = m_bonus(2, level);
3218                                         if (one_in_(15)) o_ptr->pval++;
3219                                         if (o_ptr->pval < 1) o_ptr->pval = 1;
3220
3221                                         /* Cursed */
3222                                         if (power < 0)
3223                                         {
3224                                                 /* Broken */
3225                                                 o_ptr->ident |= (IDENT_BROKEN);
3226
3227                                                 /* Cursed */
3228                                                 o_ptr->curse_flags |= TRC_CURSED;
3229
3230                                                 /* Reverse pval */
3231                                                 o_ptr->pval = 0 - (o_ptr->pval);
3232                                         }
3233
3234                                         break;
3235                                 }
3236
3237                                 case SV_RING_SHOTS:
3238                                 {
3239                                         break;
3240                                 }
3241
3242                                 /* Strength, Constitution, Dexterity, Intelligence */
3243                                 case SV_RING_STR:
3244                                 case SV_RING_CON:
3245                                 case SV_RING_DEX:
3246                                 {
3247                                         /* Stat bonus */
3248                                         o_ptr->pval = 1 + m_bonus(5, level);
3249
3250                                         /* Cursed */
3251                                         if (power < 0)
3252                                         {
3253                                                 /* Broken */
3254                                                 o_ptr->ident |= (IDENT_BROKEN);
3255
3256                                                 /* Cursed */
3257                                                 o_ptr->curse_flags |= TRC_CURSED;
3258
3259                                                 /* Reverse pval */
3260                                                 o_ptr->pval = 0 - (o_ptr->pval);
3261                                         }
3262
3263                                         break;
3264                                 }
3265
3266                                 /* Ring of Speed! */
3267                                 case SV_RING_SPEED:
3268                                 {
3269                                         /* Base speed (1 to 10) */
3270                                         o_ptr->pval = randint1(5) + m_bonus(5, level);
3271
3272                                         /* Super-charge the ring */
3273                                         while (randint0(100) < 50) o_ptr->pval++;
3274
3275                                         /* Cursed Ring */
3276                                         if (power < 0)
3277                                         {
3278                                                 /* Broken */
3279                                                 o_ptr->ident |= (IDENT_BROKEN);
3280
3281                                                 /* Cursed */
3282                                                 o_ptr->curse_flags |= TRC_CURSED;
3283
3284                                                 /* Reverse pval */
3285                                                 o_ptr->pval = 0 - (o_ptr->pval);
3286
3287                                                 break;
3288                                         }
3289
3290                                         /* Mention the item */
3291                                         if (cheat_peek) object_mention(o_ptr);
3292
3293                                         break;
3294                                 }
3295
3296                                 case SV_RING_LORDLY:
3297                                 {
3298                                         do
3299                                         {
3300                                                 one_lordly_high_resistance(o_ptr);
3301                                         }
3302                                         while (one_in_(4));
3303
3304                                         /* Bonus to armor class */
3305                                         o_ptr->to_a = 10 + randint1(5) + m_bonus(10, level);
3306                                 }
3307                                 break;
3308
3309                                 case SV_RING_WARNING:
3310                                 {
3311                                         if (one_in_(3)) one_low_esp(o_ptr);
3312                                         break;
3313                                 }
3314
3315                                 /* Searching */
3316                                 case SV_RING_SEARCHING:
3317                                 {
3318                                         /* Bonus to searching */
3319                                         o_ptr->pval = 1 + m_bonus(5, level);
3320
3321                                         /* Cursed */
3322                                         if (power < 0)
3323                                         {
3324                                                 /* Broken */
3325                                                 o_ptr->ident |= (IDENT_BROKEN);
3326
3327                                                 /* Cursed */
3328                                                 o_ptr->curse_flags |= TRC_CURSED;
3329
3330                                                 /* Reverse pval */
3331                                                 o_ptr->pval = 0 - (o_ptr->pval);
3332                                         }
3333
3334                                         break;
3335                                 }
3336
3337                                 /* Flames, Acid, Ice */
3338                                 case SV_RING_FLAMES:
3339                                 case SV_RING_ACID:
3340                                 case SV_RING_ICE:
3341                                 case SV_RING_ELEC:
3342                                 {
3343                                         /* Bonus to armor class */
3344                                         o_ptr->to_a = 5 + randint1(5) + m_bonus(10, level);
3345                                         break;
3346                                 }
3347
3348                                 /* Weakness, Stupidity */
3349                                 case SV_RING_WEAKNESS:
3350                                 case SV_RING_STUPIDITY:
3351                                 {
3352                                         /* Broken */
3353                                         o_ptr->ident |= (IDENT_BROKEN);
3354
3355                                         /* Cursed */
3356                                         o_ptr->curse_flags |= TRC_CURSED;
3357
3358                                         /* Penalize */
3359                                         o_ptr->pval = 0 - (1 + m_bonus(5, level));
3360                                         if (power > 0) power = 0 - power;
3361
3362                                         break;
3363                                 }
3364
3365                                 /* WOE, Stupidity */
3366                                 case SV_RING_WOE:
3367                                 {
3368                                         /* Broken */
3369                                         o_ptr->ident |= (IDENT_BROKEN);
3370
3371                                         /* Cursed */
3372                                         o_ptr->curse_flags |= TRC_CURSED;
3373
3374                                         /* Penalize */
3375                                         o_ptr->to_a = 0 - (5 + m_bonus(10, level));
3376                                         o_ptr->pval = 0 - (1 + m_bonus(5, level));
3377                                         if (power > 0) power = 0 - power;
3378
3379                                         break;
3380                                 }
3381
3382                                 /* Ring of damage */
3383                                 case SV_RING_DAMAGE:
3384                                 {
3385                                         /* Bonus to damage */
3386                                         o_ptr->to_d = 1 + randint1(5) + m_bonus(16, level);
3387
3388                                         /* Cursed */
3389                                         if (power < 0)
3390                                         {
3391                                                 /* Broken */
3392                                                 o_ptr->ident |= (IDENT_BROKEN);
3393
3394                                                 /* Cursed */
3395                                                 o_ptr->curse_flags |= TRC_CURSED;
3396
3397                                                 /* Reverse bonus */
3398                                                 o_ptr->to_d = 0 - o_ptr->to_d;
3399                                         }
3400
3401                                         break;
3402                                 }
3403
3404                                 /* Ring of Accuracy */
3405                                 case SV_RING_ACCURACY:
3406                                 {
3407                                         /* Bonus to hit */
3408                                         o_ptr->to_h = 1 + randint1(5) + m_bonus(16, level);
3409
3410                                         /* Cursed */
3411                                         if (power < 0)
3412                                         {
3413                                                 /* Broken */
3414                                                 o_ptr->ident |= (IDENT_BROKEN);
3415
3416                                                 /* Cursed */
3417                                                 o_ptr->curse_flags |= TRC_CURSED;
3418
3419                                                 /* Reverse tohit */
3420                                                 o_ptr->to_h = 0 - o_ptr->to_h;
3421                                         }
3422
3423                                         break;
3424                                 }
3425
3426                                 /* Ring of Protection */
3427                                 case SV_RING_PROTECTION:
3428                                 {
3429                                         /* Bonus to armor class */
3430                                         o_ptr->to_a = 5 + randint1(8) + m_bonus(10, level);
3431
3432                                         /* Cursed */
3433                                         if (power < 0)
3434                                         {
3435                                                 /* Broken */
3436                                                 o_ptr->ident |= (IDENT_BROKEN);
3437
3438                                                 /* Cursed */
3439                                                 o_ptr->curse_flags |= TRC_CURSED;
3440
3441                                                 /* Reverse toac */
3442                                                 o_ptr->to_a = 0 - o_ptr->to_a;
3443                                         }
3444
3445                                         break;
3446                                 }
3447
3448                                 /* Ring of Slaying */
3449                                 case SV_RING_SLAYING:
3450                                 {
3451                                         /* Bonus to damage and to hit */
3452                                         o_ptr->to_d = randint1(5) + m_bonus(12, level);
3453                                         o_ptr->to_h = randint1(5) + m_bonus(12, level);
3454
3455                                         /* Cursed */
3456                                         if (power < 0)
3457                                         {
3458                                                 /* Broken */
3459                                                 o_ptr->ident |= (IDENT_BROKEN);
3460
3461                                                 /* Cursed */
3462                                                 o_ptr->curse_flags |= TRC_CURSED;
3463
3464                                                 /* Reverse bonuses */
3465                                                 o_ptr->to_h = 0 - o_ptr->to_h;
3466                                                 o_ptr->to_d = 0 - o_ptr->to_d;
3467                                         }
3468
3469                                         break;
3470                                 }
3471
3472                                 case SV_RING_MUSCLE:
3473                                 {
3474                                         o_ptr->pval = 1 + m_bonus(3, level);
3475                                         if (one_in_(4)) o_ptr->pval++;
3476
3477                                         /* Cursed */
3478                                         if (power < 0)
3479                                         {
3480                                                 /* Broken */
3481                                                 o_ptr->ident |= (IDENT_BROKEN);
3482
3483                                                 /* Cursed */
3484                                                 o_ptr->curse_flags |= TRC_CURSED;
3485
3486                                                 /* Reverse bonuses */
3487                                                 o_ptr->pval = 0 - o_ptr->pval;
3488                                         }
3489
3490                                         break;
3491                                 }
3492                                 case SV_RING_AGGRAVATION:
3493                                 {
3494                                         /* Broken */
3495                                         o_ptr->ident |= (IDENT_BROKEN);
3496
3497                                         /* Cursed */
3498                                         o_ptr->curse_flags |= TRC_CURSED;
3499
3500                                         if (power > 0) power = 0 - power;
3501                                         break;
3502                                 }
3503                         }
3504                         if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3505                             || (power > 2)) /* power > 2 is debug only */
3506                         {
3507                                 o_ptr->pval = MIN(o_ptr->pval, 4);
3508                                 /* Randart amulet */
3509                                 create_artifact(o_ptr, FALSE);
3510                         }
3511                         else if ((power == 2) && one_in_(2))
3512                         {
3513                                 while(!o_ptr->name2)
3514                                 {
3515                                         int tmp = m_bonus(10, level);
3516                                         object_kind *k_ptr = &k_info[o_ptr->k_idx];
3517                                         switch(randint1(28))
3518                                         {
3519                                         case 1: case 2:
3520                                                 o_ptr->name2 = EGO_RING_THROW;
3521                                                 break;
3522                                         case 3: case 4:
3523                                                 if (have_flag(k_ptr->flags, TR_REGEN)) break;
3524                                                 o_ptr->name2 = EGO_RING_REGEN;
3525                                                 break;
3526                                         case 5: case 6:
3527                                                 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
3528                                                 o_ptr->name2 = EGO_RING_LITE;
3529                                                 break;
3530                                         case 7: case 8:
3531                                                 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
3532                                                 o_ptr->name2 = EGO_RING_TELEPORT;
3533                                                 break;
3534                                         case 9: case 10:
3535                                                 if (o_ptr->to_h) break;
3536                                                 o_ptr->name2 = EGO_RING_TO_H;
3537                                                 break;
3538                                         case 11: case 12:
3539                                                 if (o_ptr->to_d) break;
3540                                                 o_ptr->name2 = EGO_RING_TO_D;
3541                                                 break;
3542                                         case 13:
3543                                                 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
3544                                                 o_ptr->name2 = EGO_RING_SLAY;
3545                                                 break;
3546                                         case 14:
3547                                                 if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
3548                                                 o_ptr->name2 = EGO_RING_WIZARD;
3549                                                 break;
3550                                         case 15:
3551                                                 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3552                                                 o_ptr->name2 = EGO_RING_HERO;
3553                                                 break;
3554                                         case 16:
3555                                                 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3556                                                 if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
3557                                                 else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
3558                                                 else o_ptr->name2 = EGO_RING_MAGIC_MIS;
3559                                                 break;
3560                                         case 17:
3561                                                 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3562                                                 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;
3563                                                 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
3564                                                 else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
3565                                                 else o_ptr->name2 = EGO_RING_FIRE_BOLT;
3566                                                 break;
3567                                         case 18:
3568                                                 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3569                                                 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;
3570                                                 if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
3571                                                 else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
3572                                                 else o_ptr->name2 = EGO_RING_COLD_BOLT;
3573                                                 break;
3574                                         case 19:
3575                                                 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3576                                                 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;
3577                                                 if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
3578                                                 else o_ptr->name2 = EGO_RING_ELEC_BOLT;
3579                                                 break;
3580                                         case 20:
3581                                                 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
3582                                                 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;
3583                                                 if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
3584                                                 else o_ptr->name2 = EGO_RING_ACID_BOLT;
3585                                                 break;
3586                                         case 21: case 22: case 23: case 24: case 25: case 26:
3587                                                 switch (o_ptr->sval)
3588                                                 {
3589                                                 case SV_RING_SPEED:
3590                                                         if (!one_in_(3)) break;
3591                                                         o_ptr->name2 = EGO_RING_D_SPEED;
3592                                                         break;
3593                                                 case SV_RING_DAMAGE:
3594                                                 case SV_RING_ACCURACY:
3595                                                 case SV_RING_SLAYING:
3596                                                         if (one_in_(2)) break;
3597                                                         if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
3598                                                         else
3599                                                         {
3600                                                                 o_ptr->name2 = EGO_RING_BERSERKER;
3601                                                                 o_ptr->to_h -= 2+randint1(4);
3602                                                                 o_ptr->to_d += 2+randint1(4);
3603                                                         }
3604                                                         break;
3605                                                 case SV_RING_PROTECTION:
3606                                                         o_ptr->name2 = EGO_RING_SUPER_AC;
3607                                                         o_ptr->to_a += 7 + m_bonus(5, level);
3608                                                         break;
3609                                                 case SV_RING_RES_FEAR:
3610                                                         o_ptr->name2 = EGO_RING_HERO;
3611                                                         break;
3612                                                 case SV_RING_SHOTS:
3613                                                         if (one_in_(2)) break;
3614                                                         o_ptr->name2 = EGO_RING_HUNTER;
3615                                                         break;
3616                                                 case SV_RING_SEARCHING:
3617                                                         o_ptr->name2 = EGO_RING_STEALTH;
3618                                                         break;
3619                                                 case SV_RING_TELEPORTATION:
3620                                                         o_ptr->name2 = EGO_RING_TELE_AWAY;
3621                                                         break;
3622                                                 case SV_RING_RES_BLINDNESS:
3623                                                         if (one_in_(2))
3624                                                                 o_ptr->name2 = EGO_RING_RES_LITE;
3625                                                         else
3626                                                                 o_ptr->name2 = EGO_RING_RES_DARK;
3627                                                         break;
3628                                                 case SV_RING_LORDLY:
3629                                                         if (!one_in_(20)) break;
3630                                                         one_lordly_high_resistance(o_ptr);
3631                                                         one_lordly_high_resistance(o_ptr);
3632                                                         o_ptr->name2 = EGO_RING_TRUE;
3633                                                         break;
3634                                                 case SV_RING_SUSTAIN:
3635                                                         if (!one_in_(4)) break;
3636                                                         o_ptr->name2 = EGO_RING_RES_TIME;
3637                                                         break;
3638                                                 case SV_RING_FLAMES:
3639                                                         if (!one_in_(2)) break;
3640                                                         o_ptr->name2 = EGO_RING_DRAGON_F;
3641                                                         break;
3642                                                 case SV_RING_ICE:
3643                                                         if (!one_in_(2)) break;
3644                                                         o_ptr->name2 = EGO_RING_DRAGON_C;
3645                                                         break;
3646                                                 case SV_RING_WARNING:
3647                                                         if (!one_in_(2)) break;
3648                                                         o_ptr->name2 = EGO_RING_M_DETECT;
3649                                                         break;
3650                                                 default:
3651                                                         break;
3652                                                 }
3653                                                 break;
3654                                         }
3655                                 }
3656                                 /* Uncurse it */
3657                                 o_ptr->curse_flags = 0L;
3658                         }
3659                         else if ((power == -2) && one_in_(2))
3660                         {
3661                                 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3662                                 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3663                                 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3664                                 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3665                                 o_ptr->art_flags[0] = 0;
3666                                 o_ptr->art_flags[1] = 0;
3667                                 while(!o_ptr->name2)
3668                                 {
3669                                         object_kind *k_ptr = &k_info[o_ptr->k_idx];
3670                                         switch(randint1(5))
3671                                         {
3672                                         case 1:
3673                                                 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3674                                                 o_ptr->name2 = EGO_RING_DRAIN_EXP;
3675                                                 break;
3676                                         case 2:
3677                                                 o_ptr->name2 = EGO_RING_NO_MELEE;
3678                                                 break;
3679                                         case 3:
3680                                                 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3681                                                 o_ptr->name2 = EGO_RING_AGGRAVATE;
3682                                                 break;
3683                                         case 4:
3684                                                 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3685                                                 o_ptr->name2 = EGO_RING_TY_CURSE;
3686                                                 break;
3687                                         case 5:
3688                                                 o_ptr->name2 = EGO_RING_ALBINO;
3689                                                 break;
3690                                         }
3691                                 }
3692                                 /* Broken */
3693                                 o_ptr->ident |= (IDENT_BROKEN);
3694
3695                                 /* Cursed */
3696                                 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3697                         }
3698                         break;
3699                 }
3700
3701                 case TV_AMULET:
3702                 {
3703                         /* Analyze */
3704                         switch (o_ptr->sval)
3705                         {
3706                                 /* Amulet of wisdom/charisma */
3707                                 case SV_AMULET_INTELLIGENCE:
3708                                 case SV_AMULET_WISDOM:
3709                                 case SV_AMULET_CHARISMA:
3710                                 {
3711                                         o_ptr->pval = 1 + m_bonus(5, level);
3712
3713                                         /* Cursed */
3714                                         if (power < 0)
3715                                         {
3716                                                 /* Broken */
3717                                                 o_ptr->ident |= (IDENT_BROKEN);
3718
3719                                                 /* Cursed */
3720                                                 o_ptr->curse_flags |= (TRC_CURSED);
3721
3722                                                 /* Reverse bonuses */
3723                                                 o_ptr->pval = 0 - o_ptr->pval;
3724                                         }
3725
3726                                         break;
3727                                 }
3728
3729                                 /* Amulet of brilliance */
3730                                 case SV_AMULET_BRILLIANCE:
3731                                 {
3732                                         o_ptr->pval = 1 + m_bonus(3, level);
3733                                         if (one_in_(4)) o_ptr->pval++;
3734
3735                                         /* Cursed */
3736                                         if (power < 0)
3737                                         {
3738                                                 /* Broken */
3739                                                 o_ptr->ident |= (IDENT_BROKEN);
3740
3741                                                 /* Cursed */
3742                                                 o_ptr->curse_flags |= (TRC_CURSED);
3743
3744                                                 /* Reverse bonuses */
3745                                                 o_ptr->pval = 0 - o_ptr->pval;
3746                                         }
3747
3748                                         break;
3749                                 }
3750
3751                                 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
3752                                 {
3753                                         if (power < 0)
3754                                         {
3755                                                 o_ptr->curse_flags |= (TRC_CURSED);
3756                                         }
3757                                         break;
3758                                 }
3759
3760                                 case SV_AMULET_RESISTANCE:
3761                                 {
3762                                         if (one_in_(5)) one_high_resistance(o_ptr);
3763                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
3764                                 }
3765                                 break;
3766
3767                                 /* Amulet of searching */
3768                                 case SV_AMULET_SEARCHING:
3769                                 {
3770                                         o_ptr->pval = randint1(2) + m_bonus(4, level);
3771
3772                                         /* Cursed */
3773                                         if (power < 0)
3774                                         {
3775                                                 /* Broken */
3776                                                 o_ptr->ident |= (IDENT_BROKEN);
3777
3778                                                 /* Cursed */
3779                                                 o_ptr->curse_flags |= (TRC_CURSED);
3780
3781                                                 /* Reverse bonuses */
3782                                                 o_ptr->pval = 0 - (o_ptr->pval);
3783                                         }
3784
3785                                         break;
3786                                 }
3787
3788                                 /* Amulet of the Magi -- never cursed */
3789                                 case SV_AMULET_THE_MAGI:
3790                                 {
3791                                         o_ptr->pval = randint1(5) + m_bonus(5, level);
3792                                         o_ptr->to_a = randint1(5) + m_bonus(5, level);
3793
3794                                         /* gain one low ESP */
3795                                         add_esp_weak(o_ptr, FALSE);
3796
3797                                         /* Mention the item */
3798                                         if (cheat_peek) object_mention(o_ptr);
3799
3800                                         break;
3801                                 }
3802
3803                                 /* Amulet of Doom -- always cursed */
3804                                 case SV_AMULET_DOOM:
3805                                 {
3806                                         /* Broken */
3807                                         o_ptr->ident |= (IDENT_BROKEN);
3808
3809                                         /* Cursed */
3810                                         o_ptr->curse_flags |= (TRC_CURSED);
3811
3812                                         /* Penalize */
3813                                         o_ptr->pval = 0 - (randint1(5) + m_bonus(5, level));
3814                                         o_ptr->to_a = 0 - (randint1(5) + m_bonus(5, level));
3815                                         if (power > 0) power = 0 - power;
3816
3817                                         break;
3818                                 }
3819
3820                                 case SV_AMULET_MAGIC_MASTERY:
3821                                 {
3822                                         o_ptr->pval = 1 + m_bonus(4, level);
3823
3824                                         /* Cursed */
3825                                         if (power < 0)
3826                                         {
3827                                                 /* Broken */
3828                                                 o_ptr->ident |= (IDENT_BROKEN);
3829
3830                                                 /* Cursed */
3831                                                 o_ptr->curse_flags |= (TRC_CURSED);
3832
3833                                                 /* Reverse bonuses */
3834                                                 o_ptr->pval = 0 - o_ptr->pval;
3835                                         }
3836
3837                                         break;
3838                                 }
3839                         }
3840                         if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79))
3841                             || (power > 2)) /* power > 2 is debug only */
3842                         {
3843                                 o_ptr->pval = MIN(o_ptr->pval, 4);
3844                                 /* Randart amulet */
3845                                 create_artifact(o_ptr, FALSE);
3846                         }
3847                         else if ((power == 2) && one_in_(2))
3848                         {
3849                                 while(!o_ptr->name2)
3850                                 {
3851                                         object_kind *k_ptr = &k_info[o_ptr->k_idx];
3852                                         switch(randint1(21))
3853                                         {
3854                                         case 1: case 2:
3855                                                 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
3856                                                 o_ptr->name2 = EGO_AMU_SLOW_D;
3857                                                 break;
3858                                         case 3: case 4:
3859                                                 if (o_ptr->pval) break;
3860                                                 o_ptr->name2 = EGO_AMU_INFRA;
3861                                                 break;
3862                                         case 5: case 6:
3863                                                 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
3864                                                 o_ptr->name2 = EGO_AMU_SEE_INVIS;
3865                                                 break;
3866                                         case 7: case 8:
3867                                                 if (have_flag(k_ptr->flags, TR_HOLD_LIFE)) break;
3868                                                 o_ptr->name2 = EGO_AMU_HOLD_LIFE;
3869                                                 break;
3870                                         case 9:
3871                                                 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
3872                                                 o_ptr->name2 = EGO_AMU_LEVITATION;
3873                                                 break;
3874                                         case 10: case 11: case 21:
3875                                                 o_ptr->name2 = EGO_AMU_AC;
3876                                                 break;
3877                                         case 12:
3878                                                 if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
3879                                                 if (m_bonus(10, level) > 8)
3880                                                         o_ptr->name2 = EGO_AMU_RES_FIRE_;
3881                                                 else
3882                                                         o_ptr->name2 = EGO_AMU_RES_FIRE;
3883                                                 break;
3884                                         case 13:
3885                                                 if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
3886                                                 if (m_bonus(10, level) > 8)
3887                                                         o_ptr->name2 = EGO_AMU_RES_COLD_;
3888                                                 else
3889                                                         o_ptr->name2 = EGO_AMU_RES_COLD;
3890                                                 break;
3891                                         case 14:
3892                                                 if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
3893                                                 if (m_bonus(10, level) > 8)
3894                                                         o_ptr->name2 = EGO_AMU_RES_ELEC_;
3895                                                 else
3896                                                         o_ptr->name2 = EGO_AMU_RES_ELEC;
3897                                                 break;
3898                                         case 15:
3899                                                 if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
3900                                                 if (m_bonus(10, level) > 8)
3901                                                         o_ptr->name2 = EGO_AMU_RES_ACID_;
3902                                                 else
3903                                                         o_ptr->name2 = EGO_AMU_RES_ACID;
3904                                                 break;
3905                                         case 16: case 17: case 18: case 19: case 20:
3906                                                 switch (o_ptr->sval)
3907                                                 {
3908                                                 case SV_AMULET_TELEPORT:
3909                                                         if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
3910                                                         else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
3911                                                         else o_ptr->name2 = EGO_AMU_TELEPORT;
3912                                                         break;
3913                                                 case SV_AMULET_RESIST_ACID:
3914                                                         if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
3915                                                         break;
3916                                                 case SV_AMULET_SEARCHING:
3917                                                         o_ptr->name2 = EGO_AMU_STEALTH;
3918                                                         break;
3919                                                 case SV_AMULET_BRILLIANCE:
3920                                                         if (!one_in_(3)) break;
3921                                                         o_ptr->name2 = EGO_AMU_IDENT;
3922                                                         break;
3923                                                 case SV_AMULET_CHARISMA:
3924                                                         if (!one_in_(3)) break;
3925                                                         o_ptr->name2 = EGO_AMU_CHARM;
3926                                                         break;
3927                                                 case SV_AMULET_THE_MAGI:
3928                                                         if (one_in_(2)) break;
3929                                                         o_ptr->name2 = EGO_AMU_GREAT;
3930                                                         break;
3931                                                 case SV_AMULET_RESISTANCE:
3932                                                         if (!one_in_(5)) break;
3933                                                         o_ptr->name2 = EGO_AMU_DEFENDER;
3934                                                         break;
3935                                                 case SV_AMULET_TELEPATHY:
3936                                                         if (!one_in_(3)) break;
3937                                                         o_ptr->name2 = EGO_AMU_DETECTION;
3938                                                         break;
3939                                                 }
3940                                         }
3941                                 }
3942                                 /* Uncurse it */
3943                                 o_ptr->curse_flags = 0L;
3944                         }
3945                         else if ((power == -2) && one_in_(2))
3946                         {
3947                                 if (o_ptr->to_h > 0) o_ptr->to_h = 0-o_ptr->to_h;
3948                                 if (o_ptr->to_d > 0) o_ptr->to_d = 0-o_ptr->to_d;
3949                                 if (o_ptr->to_a > 0) o_ptr->to_a = 0-o_ptr->to_a;
3950                                 if (o_ptr->pval > 0) o_ptr->pval = 0-o_ptr->pval;
3951                                 o_ptr->art_flags[0] = 0;
3952                                 o_ptr->art_flags[1] = 0;
3953                                 while(!o_ptr->name2)
3954                                 {
3955                                         object_kind *k_ptr = &k_info[o_ptr->k_idx];
3956                                         switch(randint1(5))
3957                                         {
3958                                         case 1:
3959                                                 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
3960                                                 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
3961                                                 break;
3962                                         case 2:
3963                                                 o_ptr->name2 = EGO_AMU_FOOL;
3964                                                 break;
3965                                         case 3:
3966                                                 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
3967                                                 o_ptr->name2 = EGO_AMU_AGGRAVATE;
3968                                                 break;
3969                                         case 4:
3970                                                 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
3971                                                 o_ptr->name2 = EGO_AMU_TY_CURSE;
3972                                                 break;
3973                                         case 5:
3974                                                 o_ptr->name2 = EGO_AMU_NAIVETY;
3975                                                 break;
3976                                         }
3977                                 }
3978                                 /* Broken */
3979                                 o_ptr->ident |= (IDENT_BROKEN);
3980
3981                                 /* Cursed */
3982                                 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
3983                         }
3984                         break;
3985                 }
3986         }
3987 }
3988
3989 /*!
3990  * @brief ¥â¥ó¥¹¥¿¡¼¤¬¿Í·Á¤Î¥Ù¡¼¥¹¤Ë¤Ç¤­¤ë¤«¤òÊÖ¤¹
3991  * @param r_idx ¥Á¥§¥Ã¥¯¤·¤¿¤¤¥â¥ó¥¹¥¿¡¼¼ï²¤ÎID
3992  * @return ¿Í·Á¤Ë¤Ç¤­¤ë¤Ê¤éTRUE¤òÊÖ¤¹
3993  */
3994 static bool item_monster_okay(int r_idx)
3995 {
3996         monster_race *r_ptr = &r_info[r_idx];
3997
3998         /* No uniques */
3999         if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE);
4000         if (r_ptr->flags7 & RF7_KAGE) return (FALSE);
4001         if (r_ptr->flagsr & RFR_RES_ALL) return (FALSE);
4002         if (r_ptr->flags7 & RF7_NAZGUL) return (FALSE);
4003         if (r_ptr->flags1 & RF1_FORCE_DEPTH) return (FALSE);
4004         if (r_ptr->flags7 & RF7_UNIQUE2) return (FALSE);
4005
4006         /* Okay */
4007         return (TRUE);
4008 }
4009
4010
4011 /*!
4012  * @brief ¤½¤Î¾»¨Â¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ËÀ¸À®¥é¥ó¥¯¤´¤È¤Î¶¯²½¤òÍ¿¤¨¤ë¥µ¥Ö¥ë¡¼¥Á¥ó
4013  * Apply magic to an item known to be "boring"
4014  * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
4015  * @param level À¸À®´ð½à³¬
4016  * @param power À¸À®¥é¥ó¥¯
4017  * @return ¤Ê¤·
4018  * @details
4019  * Hack -- note the special code for various items
4020  */
4021 static void a_m_aux_4(object_type *o_ptr, int level, int power)
4022 {
4023         object_kind *k_ptr = &k_info[o_ptr->k_idx];
4024
4025         /* Unused */
4026         (void)level;
4027
4028         /* Apply magic (good or bad) according to type */
4029         switch (o_ptr->tval)
4030         {
4031                 case TV_WHISTLE:
4032                 {
4033 #if 0
4034                         /* Cursed */
4035                         if (power < 0)
4036                         {
4037                                 /* Broken */
4038                                 o_ptr->ident |= (IDENT_BROKEN);
4039
4040                                 /* Cursed */
4041                                 o_ptr->curse_flags |= (TRC_CURSED);
4042                         }
4043 #endif
4044                         break;
4045                 }
4046                 case TV_FLASK:
4047                 {
4048                         o_ptr->xtra4 = o_ptr->pval;
4049                         o_ptr->pval = 0;
4050                         break;
4051                 }
4052                 case TV_LITE:
4053                 {
4054                         /* Hack -- Torches -- random fuel */
4055                         if (o_ptr->sval == SV_LITE_TORCH)
4056                         {
4057                                 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4058                                 o_ptr->pval = 0;
4059                         }
4060
4061                         /* Hack -- Lanterns -- random fuel */
4062                         if (o_ptr->sval == SV_LITE_LANTERN)
4063                         {
4064                                 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
4065                                 o_ptr->pval = 0;
4066                         }
4067
4068                         if (power > 2) /* power > 2 is debug only */
4069                         {
4070                                 create_artifact(o_ptr, FALSE);
4071                         }
4072                         else if ((power == 2) || ((power == 1) && one_in_(3)))
4073                         {
4074                                 while (!o_ptr->name2)
4075                                 {
4076                                         while (1)
4077                                         {
4078                                                 bool okay_flag = TRUE;
4079
4080                                                 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
4081
4082                                                 switch (o_ptr->name2)
4083                                                 {
4084                                                 case EGO_LITE_LONG:
4085                                                         if (o_ptr->sval == SV_LITE_FEANOR)
4086                                                                 okay_flag = FALSE;
4087                                                 }
4088                                                 if (okay_flag)
4089                                                         break;
4090                                         }
4091                                 }
4092                         }
4093                         else if (power == -2)
4094                         {
4095                                 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
4096
4097                                 switch (o_ptr->name2)
4098                                 {
4099                                 case EGO_LITE_DARKNESS:
4100                                         o_ptr->xtra4 = 0;
4101                                         
4102                                         if (o_ptr->sval == SV_LITE_TORCH)
4103                                         {
4104                                                 add_flag(o_ptr->art_flags, TR_LITE_M1);
4105                                         }
4106                                         else if (o_ptr->sval == SV_LITE_LANTERN)
4107                                         {
4108                                                 add_flag(o_ptr->art_flags, TR_LITE_M2);
4109                                         }
4110                                         else if (o_ptr->sval == SV_LITE_FEANOR)
4111                                         {
4112                                                 add_flag(o_ptr->art_flags, TR_LITE_M3);
4113                                         }
4114                                         break;
4115                                 }
4116                         }
4117
4118                         break;
4119                 }
4120
4121                 case TV_WAND:
4122                 case TV_STAFF:
4123                 {
4124                         /* The wand or staff gets a number of initial charges equal
4125                          * to between 1/2 (+1) and the full object kind's pval. -LM-
4126                          */
4127                         o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
4128                         break;
4129                 }
4130
4131                 case TV_ROD:
4132                 {
4133                         /* Transfer the pval. -LM- */
4134                         o_ptr->pval = k_ptr->pval;
4135                         break;
4136                 }
4137
4138                 case TV_CAPTURE:
4139                 {
4140                         o_ptr->pval = 0;
4141                         object_aware(o_ptr);
4142                         object_known(o_ptr);
4143                         break;
4144                 }
4145
4146                 case TV_FIGURINE:
4147                 {
4148                         int i = 1;
4149                         int check;
4150
4151                         monster_race *r_ptr;
4152
4153                         /* Pick a random non-unique monster race */
4154                         while (1)
4155                         {
4156                                 i = randint1(max_r_idx - 1);
4157
4158                                 if (!item_monster_okay(i)) continue;
4159                                 if (i == MON_TSUCHINOKO) continue;
4160
4161                                 r_ptr = &r_info[i];
4162
4163                                 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4164
4165                                 /* Ignore dead monsters */
4166                                 if (!r_ptr->rarity) continue;
4167
4168                                 /* Ignore uncommon monsters */
4169                                 if (r_ptr->rarity > 100) continue;
4170
4171                                 /* Prefer less out-of-depth monsters */
4172                                 if (randint0(check)) continue;
4173
4174                                 break;
4175                         }
4176
4177                         o_ptr->pval = i;
4178
4179                         /* Some figurines are cursed */
4180                         if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
4181
4182                         if (cheat_peek)
4183                         {
4184 #ifdef JP
4185                                 msg_format("%s¤Î¿Í·Á, ¿¼¤µ +%d%s",
4186 #else
4187                                 msg_format("Figurine of %s, depth +%d%s",
4188 #endif
4189
4190                                                           r_name + r_ptr->name, check - 1,
4191                                                           !object_is_cursed(o_ptr) ? "" : " {cursed}");
4192                         }
4193
4194                         break;
4195                 }
4196
4197                 case TV_CORPSE:
4198                 {
4199                         int i = 1;
4200                         int check;
4201
4202                         u32b match = 0;
4203
4204                         monster_race *r_ptr;
4205
4206                         if (o_ptr->sval == SV_SKELETON)
4207                         {
4208                                 match = RF9_DROP_SKELETON;
4209                         }
4210                         else if (o_ptr->sval == SV_CORPSE)
4211                         {
4212                                 match = RF9_DROP_CORPSE;
4213                         }
4214
4215                         /* Hack -- Remove the monster restriction */
4216                         get_mon_num_prep(item_monster_okay, NULL);
4217
4218                         /* Pick a random non-unique monster race */
4219                         while (1)
4220                         {
4221                                 i = get_mon_num(dun_level);
4222
4223                                 r_ptr = &r_info[i];
4224
4225                                 check = (dun_level < r_ptr->level) ? (r_ptr->level - dun_level) : 0;
4226
4227                                 /* Ignore dead monsters */
4228                                 if (!r_ptr->rarity) continue;
4229
4230                                 /* Ignore corpseless monsters */
4231                                 if (!(r_ptr->flags9 & match)) continue;
4232
4233                                 /* Prefer less out-of-depth monsters */
4234                                 if (randint0(check)) continue;
4235
4236                                 break;
4237                         }
4238
4239                         o_ptr->pval = i;
4240
4241                         if (cheat_peek)
4242                         {
4243 #ifdef JP
4244                                 msg_format("%s¤Î»àÂÎ, ¿¼¤µ +%d",
4245 #else
4246                                 msg_format("Corpse of %s, depth +%d",
4247 #endif
4248
4249                                                           r_name + r_ptr->name, check - 1);
4250                         }
4251
4252                         object_aware(o_ptr);
4253                         object_known(o_ptr);
4254                         break;
4255                 }
4256
4257                 case TV_STATUE:
4258                 {
4259                         int i = 1;
4260
4261                         monster_race *r_ptr;
4262
4263                         /* Pick a random monster race */
4264                         while (1)
4265                         {
4266                                 i = randint1(max_r_idx - 1);
4267
4268                                 r_ptr = &r_info[i];
4269
4270                                 /* Ignore dead monsters */
4271                                 if (!r_ptr->rarity) continue;
4272
4273                                 break;
4274                         }
4275
4276                         o_ptr->pval = i;
4277
4278                         if (cheat_peek)
4279                         {
4280 #ifdef JP
4281                                 msg_format("%s¤ÎÁü", r_name + r_ptr->name);
4282 #else
4283                                 msg_format("Statue of %s", r_name + r_ptr->name);
4284 #endif
4285
4286                         }
4287                         object_aware(o_ptr);
4288                         object_known(o_ptr);
4289
4290                         break;
4291                 }
4292
4293                 case TV_CHEST:
4294                 {
4295                         byte obj_level = k_info[o_ptr->k_idx].level;
4296
4297                         /* Hack -- skip ruined chests */
4298                         if (obj_level <= 0) break;
4299
4300                         /* Hack -- pick a "difficulty" */
4301                         o_ptr->pval = randint1(obj_level);
4302                         if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
4303
4304                         o_ptr->xtra3 = dun_level + 5;
4305
4306                         /* Never exceed "difficulty" of 55 to 59 */
4307                         if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
4308
4309                         break;
4310                 }
4311         }
4312 }
4313
4314 /*!
4315  * @brief À¸À®¤µ¤ì¤¿¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤ËËâˡŪ¤Ê¶¯²½¤òÍ¿¤¨¤ë¥á¥¤¥ó¥ë¡¼¥Á¥ó
4316  * Complete the "creation" of an object by applying "magic" to the item
4317  * @param o_ptr ¶¯²½¤òÍ¿¤¨¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
4318  * @param lev À¸À®´ð½à³¬
4319  * @param mode À¸À®¥ª¥×¥·¥ç¥ó
4320  * @return ¤Ê¤·
4321  * @details
4322  * This includes not only rolling for random bonuses, but also putting the\n
4323  * finishing touches on ego-items and artifacts, giving charges to wands and\n
4324  * staffs, giving fuel to lites, and placing traps on chests.\n
4325  *\n
4326  * In particular, note that "Instant Artifacts", if "created" by an external\n
4327  * routine, must pass through this function to complete the actual creation.\n
4328  *\n
4329  * The base "chance" of the item being "good" increases with the "level"\n
4330  * parameter, which is usually derived from the dungeon level, being equal\n
4331  * to the level plus 10, up to a maximum of 75.  If "good" is true, then\n
4332  * the object is guaranteed to be "good".  If an object is "good", then\n
4333  * the chance that the object will be "great" (ego-item or artifact), also\n
4334  * increases with the "level", being equal to half the level, plus 5, up to\n
4335  * a maximum of 20.  If "great" is true, then the object is guaranteed to be\n
4336  * "great".  At dungeon level 65 and below, 15/100 objects are "great".\n
4337  *\n
4338  * If the object is not "good", there is a chance it will be "cursed", and\n
4339  * if it is "cursed", there is a chance it will be "broken".  These chances\n
4340  * are related to the "good" / "great" chances above.\n
4341  *\n
4342  * Otherwise "normal" rings and amulets will be "good" half the time and\n
4343  * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
4344  *\n
4345  * If "okay" is true, and the object is going to be "great", then there is\n
4346  * a chance that an artifact will be created.  This is true even if both the\n
4347  * "good" and "great" arguments are false.  As a total hack, if "great" is\n
4348  * true, then the item gets 3 extra "attempts" to become an artifact.\n
4349  */
4350 void apply_magic(object_type *o_ptr, int lev, u32b mode)
4351 {
4352         int i, rolls, f1, f2, power;
4353
4354         if (p_ptr->pseikaku == SEIKAKU_MUNCHKIN) lev += randint0(p_ptr->lev/2+10);
4355
4356         /* Maximum "level" for various things */
4357         if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
4358
4359         /* Base chance of being "good" */
4360         f1 = lev + 10;
4361
4362         /* Maximal chance of being "good" */
4363         if (f1 > d_info[dungeon_type].obj_good) f1 = d_info[dungeon_type].obj_good;
4364
4365         /* Base chance of being "great" */
4366         f2 = f1 * 2 / 3;
4367
4368         /* Maximal chance of being "great" */
4369         if ((p_ptr->pseikaku != SEIKAKU_MUNCHKIN) && (f2 > d_info[dungeon_type].obj_great))
4370                 f2 = d_info[dungeon_type].obj_great;
4371
4372         if (p_ptr->muta3 & MUT3_GOOD_LUCK)
4373         {
4374                 f1 += 5;
4375                 f2 += 2;
4376         }
4377         else if(p_ptr->muta3 & MUT3_BAD_LUCK)
4378         {
4379                 f1 -= 5;
4380                 f2 -= 2;
4381         }
4382
4383         /* Assume normal */
4384         power = 0;
4385
4386         /* Roll for "good" */
4387         if ((mode & AM_GOOD) || magik(f1))
4388         {
4389                 /* Assume "good" */
4390                 power = 1;
4391
4392                 /* Roll for "great" */
4393                 if ((mode & AM_GREAT) || magik(f2))
4394                 {
4395                         power = 2;
4396
4397                         /* Roll for "special" */
4398                         if (mode & AM_SPECIAL) power = 3;
4399                 }
4400         }
4401
4402         /* Roll for "cursed" */
4403         else if (magik(f1))
4404         {
4405                 /* Assume "cursed" */
4406                 power = -1;
4407
4408                 /* Roll for "broken" */
4409                 if (magik(f2)) power = -2;
4410         }
4411
4412         /* Apply curse */
4413         if (mode & AM_CURSED)
4414         {
4415                 /* Assume 'cursed' */
4416                 if (power > 0)
4417                 {
4418                         power = 0 - power;
4419                 }
4420                 /* Everything else gets more badly cursed */
4421                 else
4422                 {
4423                         power--;
4424                 }
4425         }
4426
4427         /* Assume no rolls */
4428         rolls = 0;
4429
4430         /* Get one roll if excellent */
4431         if (power >= 2) rolls = 1;
4432
4433         /* Hack -- Get four rolls if forced great or special */
4434         if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
4435
4436         /* Hack -- Get no rolls if not allowed */
4437         if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
4438
4439         /* Roll for artifacts if allowed */
4440         for (i = 0; i < rolls; i++)
4441         {
4442                 /* Roll for an artifact */
4443                 if (make_artifact(o_ptr)) break;
4444                 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
4445                 {
4446                         if (make_artifact(o_ptr)) break;
4447                 }
4448         }
4449
4450
4451         /* Hack -- analyze artifacts */
4452         if (object_is_fixed_artifact(o_ptr))
4453         {
4454                 artifact_type *a_ptr = &a_info[o_ptr->name1];
4455
4456                 /* Hack -- Mark the artifact as "created" */
4457                 a_ptr->cur_num = 1;
4458
4459                 /* Hack -- Memorize location of artifact in saved floors */
4460                 if (character_dungeon)
4461                         a_ptr->floor_id = p_ptr->floor_id;
4462
4463                 /* Extract the other fields */
4464                 o_ptr->pval = a_ptr->pval;
4465                 o_ptr->ac = a_ptr->ac;
4466                 o_ptr->dd = a_ptr->dd;
4467                 o_ptr->ds = a_ptr->ds;
4468                 o_ptr->to_a = a_ptr->to_a;
4469                 o_ptr->to_h = a_ptr->to_h;
4470                 o_ptr->to_d = a_ptr->to_d;
4471                 o_ptr->weight = a_ptr->weight;
4472                 o_ptr->xtra2 = a_ptr->act_idx;
4473
4474                 if (o_ptr->name1 == ART_MILIM)
4475                 {
4476                     if(p_ptr->pseikaku == SEIKAKU_SEXY)
4477                     {
4478                         o_ptr->pval = 3;
4479                     }
4480                 }
4481
4482                 /* Hack -- extract the "broken" flag */
4483                 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4484
4485                 /* Hack -- extract the "cursed" flag */
4486                 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4487                 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4488                 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4489                 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4490                 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4491                 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4492
4493
4494                 /* Cheat -- peek at the item */
4495                 if (cheat_peek) object_mention(o_ptr);
4496
4497                 /* Done */
4498                 return;
4499         }
4500
4501
4502         /* Apply magic */
4503         switch (o_ptr->tval)
4504         {
4505                 case TV_DIGGING:
4506                 case TV_HAFTED:
4507                 case TV_BOW:
4508                 case TV_SHOT:
4509                 case TV_ARROW:
4510                 case TV_BOLT:
4511                 {
4512                         if (power) a_m_aux_1(o_ptr, lev, power);
4513                         break;
4514                 }
4515
4516                 case TV_POLEARM:
4517                 {
4518                         if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) a_m_aux_1(o_ptr, lev, power);
4519                         break;
4520                 }
4521
4522                 case TV_SWORD:
4523                 {
4524                         if (power && !(o_ptr->sval == SV_DOKUBARI)) a_m_aux_1(o_ptr, lev, power);
4525                         break;
4526                 }
4527
4528                 case TV_DRAG_ARMOR:
4529                 case TV_HARD_ARMOR:
4530                 case TV_SOFT_ARMOR:
4531                 case TV_SHIELD:
4532                 case TV_HELM:
4533                 case TV_CROWN:
4534                 case TV_CLOAK:
4535                 case TV_GLOVES:
4536                 case TV_BOOTS:
4537                 {
4538                         /* Elven Cloak and Black Clothes ... */
4539                         if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
4540                             ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
4541                                 o_ptr->pval = randint1(4);
4542
4543 #if 1
4544                         if (power ||
4545                              ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4546                              ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4547                              ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4548                              ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
4549                                 a_m_aux_2(o_ptr, lev, power);
4550 #else
4551                         if (power) a_m_aux_2(o_ptr, lev, power);
4552 #endif
4553                         break;
4554                 }
4555
4556                 case TV_RING:
4557                 case TV_AMULET:
4558                 {
4559                         if (!power && (randint0(100) < 50)) power = -1;
4560                         a_m_aux_3(o_ptr, lev, power);
4561                         break;
4562                 }
4563
4564                 default:
4565                 {
4566                         a_m_aux_4(o_ptr, lev, power);
4567                         break;
4568                 }
4569         }
4570
4571         if ((o_ptr->tval == TV_SOFT_ARMOR) &&
4572             (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
4573             (p_ptr->pseikaku == SEIKAKU_SEXY))
4574         {
4575                 o_ptr->pval = 3;
4576                 add_flag(o_ptr->art_flags, TR_STR);
4577                 add_flag(o_ptr->art_flags, TR_INT);
4578                 add_flag(o_ptr->art_flags, TR_WIS);
4579                 add_flag(o_ptr->art_flags, TR_DEX);
4580                 add_flag(o_ptr->art_flags, TR_CON);
4581                 add_flag(o_ptr->art_flags, TR_CHR);
4582         }
4583
4584         /* Hack -- analyze ego-items */
4585         if (object_is_ego(o_ptr))
4586         {
4587                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
4588
4589                 /* Hack -- acquire "broken" flag */
4590                 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
4591
4592                 /* Hack -- acquire "cursed" flag */
4593                 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
4594                 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
4595                 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
4596                 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4597                 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4598                 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4599
4600                 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
4601                 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
4602                 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
4603                 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
4604                 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
4605                 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
4606                 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
4607                 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
4608                 {
4609                         do
4610                         {
4611                                 o_ptr->dd++;
4612                         }
4613                         while (one_in_(o_ptr->dd));
4614
4615                         if (o_ptr->dd > 9) o_ptr->dd = 9;
4616                 }
4617
4618                 /* Hack -- apply activatin index if needed */
4619                 if (e_ptr->act_idx) o_ptr->xtra2 = e_ptr->act_idx;
4620
4621                 /* Hack -- apply extra penalties if needed */
4622                 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
4623                 {
4624                         /* Hack -- obtain bonuses */
4625                         if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
4626                         if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
4627                         if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
4628
4629                         /* Hack -- obtain pval */
4630                         if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
4631                 }
4632
4633                 /* Hack -- apply extra bonuses if needed */
4634                 else
4635                 {
4636                         /* Hack -- obtain bonuses */
4637                         if (e_ptr->max_to_h)
4638                         {
4639                                 if (e_ptr->max_to_h > 127)
4640                                         o_ptr->to_h -= randint1(256-e_ptr->max_to_h);
4641                                 else o_ptr->to_h += randint1(e_ptr->max_to_h);
4642                         }
4643                         if (e_ptr->max_to_d)
4644                         {
4645                                 if (e_ptr->max_to_d > 127)
4646                                         o_ptr->to_d -= randint1(256-e_ptr->max_to_d);
4647                                 else o_ptr->to_d += randint1(e_ptr->max_to_d);
4648                         }
4649                         if (e_ptr->max_to_a)
4650                         {
4651                                 if (e_ptr->max_to_a > 127)
4652                                         o_ptr->to_a -= randint1(256-e_ptr->max_to_a);
4653                                 else o_ptr->to_a += randint1(e_ptr->max_to_a);
4654                         }
4655                         
4656                         /* Accuracy ego must have high to_h */
4657                         if(o_ptr->name2 == EGO_ACCURACY)
4658                         {
4659                                 while(o_ptr->to_h < o_ptr->to_d + 10)
4660                                 {
4661                                         o_ptr->to_h += 5;
4662                                         o_ptr->to_d -= 5;
4663                                 }
4664                                 o_ptr->to_h = MAX(o_ptr->to_h, 15);
4665                         }
4666                         
4667                         /* Accuracy ego must have high to_h */
4668                         if(o_ptr->name2 == EGO_VELOCITY)
4669                         {
4670                                 while(o_ptr->to_d < o_ptr->to_h + 10)
4671                                 {
4672                                         o_ptr->to_d += 5;
4673                                         o_ptr->to_h -= 5;
4674                                 }
4675                                 o_ptr->to_d = MAX(o_ptr->to_d, 15);
4676                         }
4677                         
4678                         /* Protection ego must have high to_a */
4679                         if((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
4680                         {
4681                                 o_ptr->to_a = MAX(o_ptr->to_a, 15);
4682                         }
4683
4684                         /* Hack -- obtain pval */
4685                         if (e_ptr->max_pval)
4686                         {
4687                                 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
4688                                 {
4689                                         o_ptr->pval++;
4690                                         if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds+1)) < 15)) o_ptr->pval++;
4691                                 }
4692                                 else if (o_ptr->name2 == EGO_DEMON)
4693                                 {
4694                                         if(have_flag(o_ptr->art_flags, TR_BLOWS))
4695                                         {
4696                                                 o_ptr->pval += randint1(2);
4697                                         }
4698                                         else
4699                                         {
4700                                                 o_ptr->pval += randint1(e_ptr->max_pval);
4701                                         }
4702                                 }
4703                                 else if (o_ptr->name2 == EGO_ATTACKS)
4704                                 {
4705                                         o_ptr->pval = randint1(e_ptr->max_pval*lev/100+1);
4706                                         if (o_ptr->pval > 3) o_ptr->pval = 3;
4707                                         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
4708                                                 o_ptr->pval += randint1(2);
4709                                 }
4710                                 else if (o_ptr->name2 == EGO_BAT)
4711                                 {
4712                                         o_ptr->pval = randint1(e_ptr->max_pval);
4713                                         if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
4714                                 }
4715                                 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
4716                                 {
4717                                         o_ptr->pval = randint1(e_ptr->max_pval);
4718                                 }
4719                                 else
4720                                 {
4721                                         o_ptr->pval += randint1(e_ptr->max_pval);
4722                                 }
4723                                 
4724                                 
4725                         }
4726                         if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
4727                         {
4728                                 o_ptr->pval = randint1(o_ptr->pval);
4729                         }
4730                         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
4731                                 o_ptr->pval = 2;
4732                 }
4733
4734                 /* Cheat -- describe the item */
4735                 if (cheat_peek) object_mention(o_ptr);
4736                 
4737                 /* Done */
4738                 return;
4739         }
4740
4741         /* Examine real objects */
4742         if (o_ptr->k_idx)
4743         {
4744                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
4745
4746                 /* Hack -- acquire "broken" flag */
4747                 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
4748
4749                 /* Hack -- acquire "cursed" flag */
4750                 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
4751                 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
4752                 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
4753                 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
4754                 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
4755                 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
4756         }
4757 }
4758
4759
4760 /*!
4761  * @brief ¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤¬¾å¼Á¤È¤·¤Æ°·¤ï¤ì¤ë¤«¤É¤¦¤«¤òÊÖ¤¹¡£
4762  * Hack -- determine if a template is "good"
4763  * @param k_idx È½Äꤷ¤¿¤¤¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤ÎID
4764  * @return ¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤¬¾å¼Á¤Ê¤é¤ÐTRUE¤òÊÖ¤¹¡£
4765  */
4766 static bool kind_is_good(int k_idx)
4767 {
4768         object_kind *k_ptr = &k_info[k_idx];
4769
4770         /* Analyze the item type */
4771         switch (k_ptr->tval)
4772         {
4773                 /* Armor -- Good unless damaged */
4774                 case TV_HARD_ARMOR:
4775                 case TV_SOFT_ARMOR:
4776                 case TV_DRAG_ARMOR:
4777                 case TV_SHIELD:
4778                 case TV_CLOAK:
4779                 case TV_BOOTS:
4780                 case TV_GLOVES:
4781                 case TV_HELM:
4782                 case TV_CROWN:
4783                 {
4784                         if (k_ptr->to_a < 0) return (FALSE);
4785                         return (TRUE);
4786                 }
4787
4788                 /* Weapons -- Good unless damaged */
4789                 case TV_BOW:
4790                 case TV_SWORD:
4791                 case TV_HAFTED:
4792                 case TV_POLEARM:
4793                 case TV_DIGGING:
4794                 {
4795                         if (k_ptr->to_h < 0) return (FALSE);
4796                         if (k_ptr->to_d < 0) return (FALSE);
4797                         return (TRUE);
4798                 }
4799
4800                 /* Ammo -- Arrows/Bolts are good */
4801                 case TV_BOLT:
4802                 case TV_ARROW:
4803                 {
4804                         return (TRUE);
4805                 }
4806
4807                 /* Books -- High level books are good (except Arcane books) */
4808                 case TV_LIFE_BOOK:
4809                 case TV_SORCERY_BOOK:
4810                 case TV_NATURE_BOOK:
4811                 case TV_CHAOS_BOOK:
4812                 case TV_DEATH_BOOK:
4813                 case TV_TRUMP_BOOK:
4814                 case TV_CRAFT_BOOK:
4815                 case TV_DAEMON_BOOK:
4816                 case TV_CRUSADE_BOOK:
4817                 case TV_MUSIC_BOOK:
4818                 case TV_HISSATSU_BOOK:
4819                 case TV_HEX_BOOK:
4820                 {
4821                         if (k_ptr->sval >= SV_BOOK_MIN_GOOD) return (TRUE);
4822                         return (FALSE);
4823                 }
4824
4825                 /* Rings -- Rings of Speed are good */
4826                 case TV_RING:
4827                 {
4828                         if (k_ptr->sval == SV_RING_SPEED) return (TRUE);
4829                         if (k_ptr->sval == SV_RING_LORDLY) return (TRUE);
4830                         return (FALSE);
4831                 }
4832
4833                 /* Amulets -- Amulets of the Magi and Resistance are good */
4834                 case TV_AMULET:
4835                 {
4836                         if (k_ptr->sval == SV_AMULET_THE_MAGI) return (TRUE);
4837                         if (k_ptr->sval == SV_AMULET_RESISTANCE) return (TRUE);
4838                         return (FALSE);
4839                 }
4840         }
4841
4842         /* Assume not good */
4843         return (FALSE);
4844 }
4845
4846 /*!
4847  * @brief À¸À®³¬¤Ë±þ¤¸¤¿¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤ÎÀ¸À®¤ò¹Ô¤¦¡£
4848  * Attempt to make an object (normal or good/great)
4849  * @param j_ptr À¸À®·ë²Ì¤ò¼ý¤á¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¹½Â¤ÂΤλ²¾È¥Ý¥¤¥ó¥¿
4850  * @param mode ¥ª¥×¥·¥ç¥ó¥Õ¥é¥°
4851  * @return À¸À®¤ËÀ®¸ù¤·¤¿¤éTRUE¤òÊÖ¤¹¡£
4852  * @details
4853  * This routine plays nasty games to generate the "special artifacts".\n
4854  * This routine uses "object_level" for the "generation level".\n
4855  * We assume that the given object has been "wiped".\n
4856  */
4857 bool make_object(object_type *j_ptr, u32b mode)
4858 {
4859         int prob, base;
4860         byte obj_level;
4861
4862
4863         /* Chance of "special object" */
4864         prob = ((mode & AM_GOOD) ? 10 : 1000);
4865
4866         /* Base level for the object */
4867         base = ((mode & AM_GOOD) ? (object_level + 10) : object_level);
4868
4869
4870         /* Generate a special object, or a normal object */
4871         if (!one_in_(prob) || !make_artifact_special(j_ptr))
4872         {
4873                 int k_idx;
4874
4875                 /* Good objects */
4876                 if ((mode & AM_GOOD) && !get_obj_num_hook)
4877                 {
4878                         /* Activate restriction (if already specified, use that) */
4879                         get_obj_num_hook = kind_is_good;
4880                 }
4881
4882                 /* Restricted objects - prepare allocation table */
4883                 if (get_obj_num_hook) get_obj_num_prep();
4884
4885                 /* Pick a random object */
4886                 k_idx = get_obj_num(base);
4887
4888                 /* Restricted objects */
4889                 if (get_obj_num_hook)
4890                 {
4891                         /* Clear restriction */
4892                         get_obj_num_hook = NULL;
4893
4894                         /* Reset allocation table to default */
4895                         get_obj_num_prep();
4896                 }
4897
4898                 /* Handle failure */
4899                 if (!k_idx) return (FALSE);
4900
4901                 /* Prepare the object */
4902                 object_prep(j_ptr, k_idx);
4903         }
4904
4905         /* Apply magic (allow artifacts) */
4906         apply_magic(j_ptr, object_level, mode);
4907
4908         /* Hack -- generate multiple spikes/missiles */
4909         switch (j_ptr->tval)
4910         {
4911                 case TV_SPIKE:
4912                 case TV_SHOT:
4913                 case TV_ARROW:
4914                 case TV_BOLT:
4915                 {
4916                         if (!j_ptr->name1)
4917                                 j_ptr->number = (byte)damroll(6, 7);
4918                 }
4919         }
4920
4921         obj_level = k_info[j_ptr->k_idx].level;
4922         if (object_is_fixed_artifact(j_ptr)) obj_level = a_info[j_ptr->name1].level;
4923
4924         /* Notice "okay" out-of-depth objects */
4925         if (!object_is_cursed(j_ptr) && !object_is_broken(j_ptr) &&
4926             (obj_level > dun_level))
4927         {
4928                 /* Cheat -- peek at items */
4929                 if (cheat_peek) object_mention(j_ptr);
4930         }
4931
4932         /* Success */
4933         return (TRUE);
4934 }
4935
4936
4937 /*!
4938  * @brief ¥Õ¥í¥¢¤Î»ØÄê°ÌÃÖ¤ËÀ¸À®³¬¤Ë±þ¤¸¤¿¥Ù¡¼¥¹¥¢¥¤¥Æ¥à¤ÎÀ¸À®¤ò¹Ô¤¦¡£
4939  * Attempt to place an object (normal or good/great) at the given location.
4940  * @param y ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎYºÂɸ
4941  * @param x ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎXºÂɸ
4942  * @param mode ¥ª¥×¥·¥ç¥ó¥Õ¥é¥°
4943  * @return À¸À®¤ËÀ®¸ù¤·¤¿¤éTRUE¤òÊÖ¤¹¡£
4944  * @details
4945  * This routine plays nasty games to generate the "special artifacts".\n
4946  * This routine uses "object_level" for the "generation level".\n
4947  * This routine requires a clean floor grid destination.\n
4948  */
4949 void place_object(int y, int x, u32b mode)
4950 {
4951         s16b o_idx;
4952
4953         /* Acquire grid */
4954         cave_type *c_ptr = &cave[y][x];
4955
4956         object_type forge;
4957         object_type *q_ptr;
4958
4959
4960         /* Paranoia -- check bounds */
4961         if (!in_bounds(y, x)) return;
4962
4963         /* Require floor space */
4964         if (!cave_drop_bold(y, x)) return;
4965
4966         /* Avoid stacking on other objects */
4967         if (c_ptr->o_idx) return;
4968
4969
4970         /* Get local object */
4971         q_ptr = &forge;
4972
4973         /* Wipe the object */
4974         object_wipe(q_ptr);
4975
4976         /* Make an object (if possible) */
4977         if (!make_object(q_ptr, mode)) return;
4978
4979
4980         /* Make an object */
4981         o_idx = o_pop();
4982
4983         /* Success */
4984         if (o_idx)
4985         {
4986                 object_type *o_ptr;
4987
4988                 /* Acquire object */
4989                 o_ptr = &o_list[o_idx];
4990
4991                 /* Structure Copy */
4992                 object_copy(o_ptr, q_ptr);
4993
4994                 /* Location */
4995                 o_ptr->iy = y;
4996                 o_ptr->ix = x;
4997
4998                 /* Build a stack */
4999                 o_ptr->next_o_idx = c_ptr->o_idx;
5000
5001                 /* Place the object */
5002                 c_ptr->o_idx = o_idx;
5003
5004                 /* Notice */
5005                 note_spot(y, x);
5006
5007                 /* Redraw */
5008                 lite_spot(y, x);
5009         }
5010         else
5011         {
5012                 /* Hack -- Preserve artifacts */
5013                 if (object_is_fixed_artifact(q_ptr))
5014                 {
5015                         a_info[q_ptr->name1].cur_num = 0;
5016                 }
5017         }
5018 }
5019
5020
5021 /*!
5022  * @brief À¸À®³¬¤Ë±þ¤¸¤¿ºâÊõ¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸À®¤ò¹Ô¤¦¡£
5023  * Make a treasure object
5024  * @param j_ptr À¸À®·ë²Ì¤ò¼ý¤á¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¹½Â¤ÂΤλ²¾È¥Ý¥¤¥ó¥¿
5025  * @return À¸À®¤ËÀ®¸ù¤·¤¿¤éTRUE¤òÊÖ¤¹¡£
5026  * @details
5027  * The location must be a legal, clean, floor grid.
5028  */
5029 bool make_gold(object_type *j_ptr)
5030 {
5031         int i;
5032
5033         s32b base;
5034
5035
5036         /* Hack -- Pick a Treasure variety */
5037         i = ((randint1(object_level + 2) + 2) / 2) - 1;
5038
5039         /* Apply "extra" magic */
5040         if (one_in_(GREAT_OBJ))
5041         {
5042                 i += randint1(object_level + 1);
5043         }
5044
5045         /* Hack -- Creeping Coins only generate "themselves" */
5046         if (coin_type) i = coin_type;
5047
5048         /* Do not create "illegal" Treasure Types */
5049         if (i >= MAX_GOLD) i = MAX_GOLD - 1;
5050
5051         /* Prepare a gold object */
5052         object_prep(j_ptr, OBJ_GOLD_LIST + i);
5053
5054         /* Hack -- Base coin cost */
5055         base = k_info[OBJ_GOLD_LIST+i].cost;
5056
5057         /* Determine how much the treasure is "worth" */
5058         j_ptr->pval = (base + (8L * randint1(base)) + randint1(8));
5059
5060         /* Success */
5061         return (TRUE);
5062 }
5063
5064
5065 /*!
5066  * @brief ¥Õ¥í¥¢¤Î»ØÄê°ÌÃÖ¤ËÀ¸À®³¬¤Ë±þ¤¸¤¿ºâÊõ¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸À®¤ò¹Ô¤¦¡£
5067  * Places a treasure (Gold or Gems) at given location
5068  * @param y ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎYºÂɸ
5069  * @param x ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎXºÂɸ
5070  * @return À¸À®¤ËÀ®¸ù¤·¤¿¤éTRUE¤òÊÖ¤¹¡£
5071  * @details
5072  * The location must be a legal, clean, floor grid.
5073  */
5074 void place_gold(int y, int x)
5075 {
5076         s16b o_idx;
5077
5078         /* Acquire grid */
5079         cave_type *c_ptr = &cave[y][x];
5080
5081
5082         object_type forge;
5083         object_type *q_ptr;
5084
5085
5086         /* Paranoia -- check bounds */
5087         if (!in_bounds(y, x)) return;
5088
5089         /* Require floor space */
5090         if (!cave_drop_bold(y, x)) return;
5091
5092         /* Avoid stacking on other objects */
5093         if (c_ptr->o_idx) return;
5094
5095
5096         /* Get local object */
5097         q_ptr = &forge;
5098
5099         /* Wipe the object */
5100         object_wipe(q_ptr);
5101
5102         /* Make some gold */
5103         if (!make_gold(q_ptr)) return;
5104
5105
5106         /* Make an object */
5107         o_idx = o_pop();
5108
5109         /* Success */
5110         if (o_idx)
5111         {
5112                 object_type *o_ptr;
5113
5114                 /* Acquire object */
5115                 o_ptr = &o_list[o_idx];
5116
5117                 /* Copy the object */
5118                 object_copy(o_ptr, q_ptr);
5119
5120                 /* Save location */
5121                 o_ptr->iy = y;
5122                 o_ptr->ix = x;
5123
5124                 /* Build a stack */
5125                 o_ptr->next_o_idx = c_ptr->o_idx;
5126
5127                 /* Place the object */
5128                 c_ptr->o_idx = o_idx;
5129
5130                 /* Notice */
5131                 note_spot(y, x);
5132
5133                 /* Redraw */
5134                 lite_spot(y, x);
5135         }
5136 }
5137
5138
5139 /*!
5140  * @brief À¸À®ºÑ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¥Õ¥í¥¢¤Î½êÄê¤Î°ÌÃÖ¤ËÍî¤È¤¹¡£
5141  * Let an object fall to the ground at or near a location.
5142  * @param j_ptr Íî¤È¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¹½Â¤ÂΤλ²¾È¥Ý¥¤¥ó¥¿
5143  * @param chance ¥É¥í¥Ã¥×¤ÎÀ®¸ùΨ(%)
5144  * @param y ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎYºÂɸ
5145  * @param x ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎXºÂɸ
5146  * @return À¸À®¤ËÀ®¸ù¤·¤¿¤éTRUE¤òÊÖ¤¹¡£
5147  * @details
5148  * The initial location is assumed to be "in_bounds()".\n
5149  *\n
5150  * This function takes a parameter "chance".  This is the percentage\n
5151  * chance that the item will "disappear" instead of drop.  If the object\n
5152  * has been thrown, then this is the chance of disappearance on contact.\n
5153  *\n
5154  * Hack -- this function uses "chance" to determine if it should produce\n
5155  * some form of "description" of the drop event (under the player).\n
5156  *\n
5157  * We check several locations to see if we can find a location at which\n
5158  * the object can combine, stack, or be placed.  Artifacts will try very\n
5159  * hard to be placed, including "teleporting" to a useful grid if needed.\n
5160  */
5161 s16b drop_near(object_type *j_ptr, int chance, int y, int x)
5162 {
5163         int i, k, d, s;
5164
5165         int bs, bn;
5166         int by, bx;
5167         int dy, dx;
5168         int ty, tx = 0;
5169
5170         s16b o_idx = 0;
5171
5172         s16b this_o_idx, next_o_idx = 0;
5173
5174         cave_type *c_ptr;
5175
5176         char o_name[MAX_NLEN];
5177
5178         bool flag = FALSE;
5179         bool done = FALSE;
5180
5181 #ifndef JP
5182         /* Extract plural */
5183         bool plural = (j_ptr->number != 1);
5184 #endif
5185
5186         /* Describe object */
5187         object_desc(o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
5188
5189
5190         /* Handle normal "breakage" */
5191         if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
5192         {
5193                 /* Message */
5194 #ifdef JP
5195                 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
5196 #else
5197                 msg_format("The %s disappear%s.",
5198                            o_name, (plural ? "" : "s"));
5199 #endif
5200
5201
5202                 /* Debug */
5203 #ifdef JP
5204                 if (p_ptr->wizard) msg_print("(ÇË»)");
5205 #else
5206                 if (p_ptr->wizard) msg_print("(breakage)");
5207 #endif
5208
5209
5210                 /* Failure */
5211                 return (0);
5212         }
5213
5214
5215         /* Score */
5216         bs = -1;
5217
5218         /* Picker */
5219         bn = 0;
5220
5221         /* Default */
5222         by = y;
5223         bx = x;
5224
5225         /* Scan local grids */
5226         for (dy = -3; dy <= 3; dy++)
5227         {
5228                 /* Scan local grids */
5229                 for (dx = -3; dx <= 3; dx++)
5230                 {
5231                         bool comb = FALSE;
5232
5233                         /* Calculate actual distance */
5234                         d = (dy * dy) + (dx * dx);
5235
5236                         /* Ignore distant grids */
5237                         if (d > 10) continue;
5238
5239                         /* Location */
5240                         ty = y + dy;
5241                         tx = x + dx;
5242
5243                         /* Skip illegal grids */
5244                         if (!in_bounds(ty, tx)) continue;
5245
5246                         /* Require line of projection */
5247                         if (!projectable(y, x, ty, tx)) continue;
5248
5249                         /* Obtain grid */
5250                         c_ptr = &cave[ty][tx];
5251
5252                         /* Require floor space */
5253                         if (!cave_drop_bold(ty, tx)) continue;
5254
5255                         /* No objects */
5256                         k = 0;
5257
5258                         /* Scan objects in that grid */
5259                         for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5260                         {
5261                                 object_type *o_ptr;
5262
5263                                 /* Acquire object */
5264                                 o_ptr = &o_list[this_o_idx];
5265
5266                                 /* Acquire next object */
5267                                 next_o_idx = o_ptr->next_o_idx;
5268
5269                                 /* Check for possible combination */
5270                                 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
5271
5272                                 /* Count objects */
5273                                 k++;
5274                         }
5275
5276                         /* Add new object */
5277                         if (!comb) k++;
5278
5279                         /* Paranoia */
5280                         if (k > 99) continue;
5281
5282                         /* Calculate score */
5283                         s = 1000 - (d + k * 5);
5284
5285                         /* Skip bad values */
5286                         if (s < bs) continue;
5287
5288                         /* New best value */
5289                         if (s > bs) bn = 0;
5290
5291                         /* Apply the randomizer to equivalent values */
5292                         if ((++bn >= 2) && !one_in_(bn)) continue;
5293
5294                         /* Keep score */
5295                         bs = s;
5296
5297                         /* Track it */
5298                         by = ty;
5299                         bx = tx;
5300
5301                         /* Okay */
5302                         flag = TRUE;
5303                 }
5304         }
5305
5306
5307         /* Handle lack of space */
5308         if (!flag && !object_is_artifact(j_ptr))
5309         {
5310                 /* Message */
5311 #ifdef JP
5312                 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
5313 #else
5314                 msg_format("The %s disappear%s.",
5315                            o_name, (plural ? "" : "s"));
5316 #endif
5317
5318
5319                 /* Debug */
5320 #ifdef JP
5321                 if (p_ptr->wizard) msg_print("(¾²¥¹¥Ú¡¼¥¹¤¬¤Ê¤¤)");
5322 #else
5323                 if (p_ptr->wizard) msg_print("(no floor space)");
5324 #endif
5325
5326
5327                 /* Failure */
5328                 return (0);
5329         }
5330
5331
5332         /* Find a grid */
5333         for (i = 0; !flag && (i < 1000); i++)
5334         {
5335                 /* Bounce around */
5336                 ty = rand_spread(by, 1);
5337                 tx = rand_spread(bx, 1);
5338
5339                 /* Verify location */
5340                 if (!in_bounds(ty, tx)) continue;
5341
5342                 /* Bounce to that location */
5343                 by = ty;
5344                 bx = tx;
5345
5346                 /* Require floor space */
5347                 if (!cave_drop_bold(by, bx)) continue;
5348
5349                 /* Okay */
5350                 flag = TRUE;
5351         }
5352
5353
5354         if (!flag)
5355         {
5356                 int candidates = 0, pick;
5357
5358                 for (ty = 1; ty < cur_hgt - 1; ty++)
5359                 {
5360                         for (tx = 1; tx < cur_wid - 1; tx++)
5361                         {
5362                                 /* A valid space found */
5363                                 if (cave_drop_bold(ty, tx)) candidates++;
5364                         }
5365                 }
5366
5367                 /* No valid place! */
5368                 if (!candidates)
5369                 {
5370                         /* Message */
5371 #ifdef JP
5372                         msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
5373 #else
5374                         msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
5375 #endif
5376
5377                         /* Debug */
5378 #ifdef JP
5379                         if (p_ptr->wizard) msg_print("(¾²¥¹¥Ú¡¼¥¹¤¬¤Ê¤¤)");
5380 #else
5381                         if (p_ptr->wizard) msg_print("(no floor space)");
5382 #endif
5383
5384                         /* Mega-Hack -- preserve artifacts */
5385                         if (preserve_mode)
5386                         {
5387                                 /* Hack -- Preserve unknown artifacts */
5388                                 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
5389                                 {
5390                                         /* Mega-Hack -- Preserve the artifact */
5391                                         a_info[j_ptr->name1].cur_num = 0;
5392                                 }
5393                         }
5394
5395                         /* Failure */
5396                         return 0;
5397                 }
5398
5399                 /* Choose a random one */
5400                 pick = randint1(candidates);
5401
5402                 for (ty = 1; ty < cur_hgt - 1; ty++)
5403                 {
5404                         for (tx = 1; tx < cur_wid - 1; tx++)
5405                         {
5406                                 if (cave_drop_bold(ty, tx))
5407                                 {
5408                                         pick--;
5409
5410                                         /* Is this a picked one? */
5411                                         if (!pick) break;
5412                                 }
5413                         }
5414
5415                         if (!pick) break;
5416                 }
5417
5418                 by = ty;
5419                 bx = tx;
5420         }
5421
5422
5423         /* Grid */
5424         c_ptr = &cave[by][bx];
5425
5426         /* Scan objects in that grid for combination */
5427         for (this_o_idx = c_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
5428         {
5429                 object_type *o_ptr;
5430
5431                 /* Acquire object */
5432                 o_ptr = &o_list[this_o_idx];
5433
5434                 /* Acquire next object */
5435                 next_o_idx = o_ptr->next_o_idx;
5436
5437                 /* Check for combination */
5438                 if (object_similar(o_ptr, j_ptr))
5439                 {
5440                         /* Combine the items */
5441                         object_absorb(o_ptr, j_ptr);
5442
5443                         /* Success */
5444                         done = TRUE;
5445
5446                         /* Done */
5447                         break;
5448                 }
5449         }
5450
5451         /* Get new object */
5452         if (!done) o_idx = o_pop();
5453
5454         /* Failure */
5455         if (!done && !o_idx)
5456         {
5457                 /* Message */
5458 #ifdef JP
5459                 msg_format("%s¤Ï¾Ã¤¨¤¿¡£", o_name);
5460 #else
5461                 msg_format("The %s disappear%s.",
5462                            o_name, (plural ? "" : "s"));
5463 #endif
5464
5465
5466                 /* Debug */
5467 #ifdef JP
5468                 if (p_ptr->wizard) msg_print("(¥¢¥¤¥Æ¥à¤¬Â¿²á¤®¤ë)");
5469 #else
5470                 if (p_ptr->wizard) msg_print("(too many objects)");
5471 #endif
5472
5473
5474                 /* Hack -- Preserve artifacts */
5475                 if (object_is_fixed_artifact(j_ptr))
5476                 {
5477                         a_info[j_ptr->name1].cur_num = 0;
5478                 }
5479
5480                 /* Failure */
5481                 return (0);
5482         }
5483
5484         /* Stack */
5485         if (!done)
5486         {
5487                 /* Structure copy */
5488                 object_copy(&o_list[o_idx], j_ptr);
5489
5490                 /* Access new object */
5491                 j_ptr = &o_list[o_idx];
5492
5493                 /* Locate */
5494                 j_ptr->iy = by;
5495                 j_ptr->ix = bx;
5496
5497                 /* No monster */
5498                 j_ptr->held_m_idx = 0;
5499
5500                 /* Build a stack */
5501                 j_ptr->next_o_idx = c_ptr->o_idx;
5502
5503                 /* Place the object */
5504                 c_ptr->o_idx = o_idx;
5505
5506                 /* Success */
5507                 done = TRUE;
5508         }
5509
5510         /* Note the spot */
5511         note_spot(by, bx);
5512
5513         /* Draw the spot */
5514         lite_spot(by, bx);
5515
5516         /* Sound */
5517         sound(SOUND_DROP);
5518
5519         /* Mega-Hack -- no message if "dropped" by player */
5520         /* Message when an object falls under the player */
5521         if (chance && player_bold(by, bx))
5522         {
5523 #ifdef JP
5524                 msg_print("²¿¤«¤¬Â­²¼¤Ëž¤¬¤Ã¤Æ¤­¤¿¡£");
5525 #else
5526                 msg_print("You feel something roll beneath your feet.");
5527 #endif
5528
5529         }
5530
5531         /* XXX XXX XXX */
5532
5533         /* Result */
5534         return (o_idx);
5535 }
5536
5537
5538 /*!
5539  * @brief ³ÍÆÀ¥É¥í¥Ã¥×¤ò¹Ô¤¦¡£
5540  * Scatter some "great" objects near the player
5541  * @param y ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎYºÂɸ
5542  * @param x ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎXºÂɸ
5543  * @param num ³ÍÆÀ¤Î½èÍý²ó¿ô
5544  * @param great TRUE¤Ê¤é¤Ðɬ¤º¹âµéÉʰʾå¤òÍî¤È¤¹
5545  * @param special TRUE¤Ê¤é¤Ðɬ¤ºÆÃÊÌÉʤòÍî¤È¤¹
5546  * @param known TRUE¤Ê¤é¤Ð¥ª¥Ö¥¸¥§¥¯¥È¤¬É¬¤º¡ö´ÕÄê¡öºÑ¤Ë¤Ê¤ë
5547  * @return ¤Ê¤·
5548  */
5549 void acquirement(int y1, int x1, int num, bool great, bool special, bool known)
5550 {
5551         object_type *i_ptr;
5552         object_type object_type_body;
5553         u32b mode = AM_GOOD | (great || special ? AM_GREAT : 0L) | (special ? AM_SPECIAL : 0L) ;
5554
5555         /* Acquirement */
5556         while (num--)
5557         {
5558                 /* Get local object */
5559                 i_ptr = &object_type_body;
5560
5561                 /* Wipe the object */
5562                 object_wipe(i_ptr);
5563
5564                 /* Make a good (or great) object (if possible) */
5565                 if (!make_object(i_ptr, mode)) continue;
5566
5567                 if (known)
5568                 {
5569                         object_aware(i_ptr);
5570                         object_known(i_ptr);
5571                 }
5572
5573                 /* Drop the object */
5574                 (void)drop_near(i_ptr, -1, y1, x1);
5575         }
5576 }
5577
5578 /*
5579  * Scatter some "amusing" objects near the player
5580  */
5581
5582 #define AMS_NOTHING   0x00 /* No restriction */
5583 #define AMS_NO_UNIQUE 0x01 /* Don't make the amusing object of uniques */
5584 #define AMS_FIXED_ART 0x02 /* Make a fixed artifact based on the amusing object */
5585 #define AMS_MULTIPLE  0x04 /* Drop 1-3 objects for one type */
5586 #define AMS_PILE      0x08 /* Drop 1-99 pile objects for one type */
5587
5588 typedef struct
5589 {
5590         int tval;
5591         int sval;
5592         int prob;
5593         byte flag;
5594 } amuse_type;
5595
5596 amuse_type amuse_info[] =
5597 {
5598         { TV_BOTTLE, SV_ANY, 5, AMS_NOTHING },
5599         { TV_JUNK, SV_ANY, 3, AMS_MULTIPLE },
5600         { TV_SPIKE, SV_ANY, 10, AMS_PILE },
5601         { TV_STATUE, SV_ANY, 15, AMS_NOTHING },
5602         { TV_CORPSE, SV_ANY, 15, AMS_NO_UNIQUE },
5603         { TV_SKELETON, SV_ANY, 10, AMS_NO_UNIQUE },
5604         { TV_FIGURINE, SV_ANY, 10, AMS_NO_UNIQUE },
5605         { TV_PARCHMENT, SV_ANY, 1, AMS_NOTHING },
5606         { TV_POLEARM, SV_TSURIZAO, 3, AMS_NOTHING }, //Fishing Pole of Taikobo
5607         { TV_SWORD, SV_BROKEN_DAGGER, 3, AMS_FIXED_ART }, //Broken Dagger of Magician
5608         { TV_SWORD, SV_BROKEN_DAGGER, 10, AMS_NOTHING },
5609         { TV_SWORD, SV_BROKEN_SWORD, 5, AMS_NOTHING },
5610         { TV_SCROLL, SV_SCROLL_AMUSEMENT, 10, AMS_NOTHING },
5611
5612         { 0, 0, 0 }
5613 };
5614
5615 /*!
5616  * @brief Ã¯ÆÀ¥É¥í¥Ã¥×¤ò¹Ô¤¦¡£
5617  * @param y ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎYºÂɸ
5618  * @param x ÇÛÃÖ¤·¤¿¤¤¥Õ¥í¥¢¤ÎXºÂɸ
5619  * @param num Ã¯ÆÀ¤Î½èÍý²ó¿ô
5620  * @param known TRUE¤Ê¤é¤Ð¥ª¥Ö¥¸¥§¥¯¥È¤¬É¬¤º¡ö´ÕÄê¡öºÑ¤Ë¤Ê¤ë
5621  * @return ¤Ê¤·
5622  */
5623 void amusement(int y1, int x1, int num, bool known)
5624 {
5625         object_type *i_ptr;
5626         object_type object_type_body;
5627         int n, t = 0;
5628
5629         for (n = 0; amuse_info[n].tval != 0; n++)
5630         {
5631                 t += amuse_info[n].prob;
5632         }
5633
5634         /* Acquirement */
5635         while (num)
5636         {
5637                 int i, k_idx, a_idx = 0;
5638                 int r = randint0(t);
5639                 bool insta_art, fixed_art;
5640
5641                 for (i = 0; ; i++)
5642                 {
5643                         r -= amuse_info[i].prob;
5644                         if (r <= 0) break;
5645                 }
5646
5647                 /* Get local object */
5648                 i_ptr = &object_type_body;
5649
5650                 /* Wipe the object */
5651                 object_wipe(i_ptr);
5652
5653                 /* Wipe the object */
5654                 k_idx = lookup_kind(amuse_info[i].tval, amuse_info[i].sval);
5655
5656                 /* Paranoia - reroll if nothing */
5657                 if (!k_idx) continue;
5658
5659                 /* Search an artifact index if need */
5660                 insta_art = (k_info[k_idx].gen_flags & TRG_INSTA_ART);
5661                 fixed_art = (amuse_info[i].flag & AMS_FIXED_ART);
5662
5663                 if (insta_art || fixed_art)
5664                 {
5665                         for (a_idx = 1; a_idx < max_a_idx; a_idx++)
5666                         {
5667                                 if (insta_art && !(a_info[a_idx].gen_flags & TRG_INSTA_ART)) continue;
5668                                 if (a_info[a_idx].tval != k_info[k_idx].tval) continue;
5669                                 if (a_info[a_idx].sval != k_info[k_idx].sval) continue;
5670                                 if (a_info[a_idx].cur_num > 0) continue;
5671                                 break;
5672                         }
5673
5674                         if (a_idx >= max_a_idx) continue;
5675                 }
5676
5677                 /* Make an object (if possible) */
5678                 object_prep(i_ptr, k_idx);
5679                 if (a_idx) i_ptr->name1 = a_idx;
5680                 apply_magic(i_ptr, 1, AM_NO_FIXED_ART);
5681
5682                 if (amuse_info[i].flag & AMS_NO_UNIQUE)
5683                 {
5684                         if (r_info[i_ptr->pval].flags1 & RF1_UNIQUE) continue;
5685                 }
5686
5687                 if (amuse_info[i].flag & AMS_MULTIPLE) i_ptr->number = randint1(3);
5688                 if (amuse_info[i].flag & AMS_PILE) i_ptr->number = randint1(99);
5689
5690                 if (known)
5691                 {
5692                         object_aware(i_ptr);
5693                         object_known(i_ptr);
5694                 }
5695
5696                 /* Paranoia - reroll if nothing */
5697                 if (!(i_ptr->k_idx)) continue;
5698
5699                 /* Drop the object */
5700                 (void)drop_near(i_ptr, -1, y1, x1);
5701
5702                 num--;
5703         }
5704 }
5705
5706
5707 #define MAX_NORMAL_TRAPS 18
5708
5709 /* See init_feat_variables() in init2.c */
5710 static s16b normal_traps[MAX_NORMAL_TRAPS];
5711
5712 /*!
5713  * @brief ¥¿¥°¤Ë½¾¤Ã¤Æ¡¢´ðËܥȥé¥Ã¥×¥Æ¡¼¥Ö¥ë¤ò½é´ü²½¤¹¤ë / Initialize arrays for normal traps
5714  * @return ¤Ê¤·
5715  */
5716 void init_normal_traps(void)
5717 {
5718         int cur_trap = 0;
5719
5720         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TRAPDOOR");
5721         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_PIT");
5722         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SPIKED_PIT");
5723         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_POISON_PIT");
5724         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TY_CURSE");
5725         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TELEPORT");
5726         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_FIRE");
5727         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_ACID");
5728         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SLOW");
5729         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_STR");
5730         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_DEX");
5731         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_CON");
5732         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_BLIND");
5733         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_CONFUSE");
5734         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_POISON");
5735         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SLEEP");
5736         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TRAPS");
5737         normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_ALARM");
5738 }
5739
5740 /*!
5741  * @brief ´ðËܥȥé¥Ã¥×¤ò¥é¥ó¥À¥à¤ËÁªÂò¤¹¤ë /
5742  * Get random trap
5743  * @return ÁªÂò¤·¤¿¥È¥é¥Ã¥×¤ÎID
5744  * @details
5745  * XXX XXX XXX This routine should be redone to reflect trap "level".\n
5746  * That is, it does not make sense to have spiked pits at 50 feet.\n
5747  * Actually, it is not this routine, but the "trap instantiation"\n
5748  * code, which should also check for "trap doors" on quest levels.\n
5749  */
5750 s16b choose_random_trap(void)
5751 {
5752         s16b feat;
5753
5754         /* Pick a trap */
5755         while (1)
5756         {
5757                 /* Hack -- pick a trap */
5758                 feat = normal_traps[randint0(MAX_NORMAL_TRAPS)];
5759
5760                 /* Accept non-trapdoors */
5761                 if (!have_flag(f_info[feat].flags, FF_MORE)) break;
5762
5763                 /* Hack -- no trap doors on special levels */
5764                 if (p_ptr->inside_arena || quest_number(dun_level)) continue;
5765
5766                 /* Hack -- no trap doors on the deepest level */
5767                 if (dun_level >= d_info[dungeon_type].maxdepth) continue;
5768
5769                 break;
5770         }
5771
5772         return feat;
5773 }
5774
5775 /*!
5776  * @brief ¥Þ¥¹¤Ë¸ºß¤¹¤ë¥È¥é¥Ã¥×¤òÈëÆ¿¤¹¤ë /
5777  * Disclose an invisible trap
5778  * @param y ÈëÆ¿¤·¤¿¤¤¥Þ¥¹¤ÎYºÂɸ
5779  * @param x ÈëÆ¿¤·¤¿¤¤¥Þ¥¹¤ÎXºÂɸ
5780  * @return ¤Ê¤·
5781  */
5782 void disclose_grid(int y, int x)
5783 {
5784         cave_type *c_ptr = &cave[y][x];
5785
5786         if (cave_have_flag_grid(c_ptr, FF_SECRET))
5787         {
5788                 /* No longer hidden */
5789                 cave_alter_feat(y, x, FF_SECRET);
5790         }
5791         else if (c_ptr->mimic)
5792         {
5793                 /* No longer hidden */
5794                 c_ptr->mimic = 0;
5795
5796                 /* Notice */
5797                 note_spot(y, x);
5798
5799                 /* Redraw */
5800                 lite_spot(y, x);
5801         }
5802 }
5803
5804 /*!
5805  * @brief ¥Þ¥¹¤ò¥È¥é¥Ã¥×¤òÇÛÃÖ¤¹¤ë /
5806  * The location must be a legal, naked, floor grid.
5807  * @param y ÇÛÃÖ¤·¤¿¤¤¥Þ¥¹¤ÎYºÂɸ
5808  * @param x ÇÛÃÖ¤·¤¿¤¤¥Þ¥¹¤ÎXºÂɸ
5809  * @return
5810  * Note that all traps start out as "invisible" and "untyped", and then\n
5811  * when they are "discovered" (by detecting them or setting them off),\n
5812  * the trap is "instantiated" as a visible, "typed", trap.\n
5813  */
5814 void place_trap(int y, int x)
5815 {
5816         cave_type *c_ptr = &cave[y][x];
5817
5818         /* Paranoia -- verify location */
5819         if (!in_bounds(y, x)) return;
5820
5821         /* Require empty, clean, floor grid */
5822         if (!cave_clean_bold(y, x)) return;
5823
5824         /* Place an invisible trap */
5825         c_ptr->mimic = c_ptr->feat;
5826         c_ptr->feat = choose_random_trap();
5827 }
5828
5829 /*!
5830  * @brief ËâÆ»¶ñ¤Î»ÈÍѲó¿ô¤Î»ÄÎ̤ò¼¨¤¹¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤¹¤ë /
5831  * Describe the charges on an item in the inventory.
5832  * @param item »ÄÎ̤òɽ¼¨¤·¤¿¤¤¥×¥ì¥¤¥ä¡¼¤Î¥¢¥¤¥Æ¥à½ê»ý¥¹¥í¥Ã¥È
5833  * @return ¤Ê¤·
5834  */
5835 void inven_item_charges(int item)
5836 {
5837         object_type *o_ptr = &inventory[item];
5838
5839         /* Require staff/wand */
5840         if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
5841
5842         /* Require known item */
5843         if (!object_is_known(o_ptr)) return;
5844
5845 #ifdef JP
5846         if (o_ptr->pval <= 0)
5847         {
5848                 msg_print("¤â¤¦ËâÎϤ¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£");
5849         }
5850         else
5851         {
5852                 msg_format("¤¢¤È %d ²óʬ¤ÎËâÎϤ¬»Ä¤Ã¤Æ¤¤¤ë¡£", o_ptr->pval);
5853         }
5854 #else
5855         /* Multiple charges */
5856         if (o_ptr->pval != 1)
5857         {
5858                 /* Print a message */
5859                 msg_format("You have %d charges remaining.", o_ptr->pval);
5860         }
5861
5862         /* Single charge */
5863         else
5864         {
5865                 /* Print a message */
5866                 msg_format("You have %d charge remaining.", o_ptr->pval);
5867         }
5868 #endif
5869
5870 }
5871
5872 /*!
5873  * @brief ¥¢¥¤¥Æ¥à¤Î»Ä¤ê½ê»ý¿ô¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤¹¤ë /
5874  * Describe an item in the inventory.
5875  * @param item »ÄÎ̤òɽ¼¨¤·¤¿¤¤¥×¥ì¥¤¥ä¡¼¤Î¥¢¥¤¥Æ¥à½ê»ý¥¹¥í¥Ã¥È
5876  * @return ¤Ê¤·
5877  */
5878 void inven_item_describe(int item)
5879 {
5880         object_type *o_ptr = &inventory[item];
5881         char        o_name[MAX_NLEN];
5882
5883         /* Get a description */
5884         object_desc(o_name, o_ptr, 0);
5885
5886         /* Print a message */
5887 #ifdef JP
5888         /* "no more" ¤Î¾ì¹ç¤Ï¤³¤Á¤é¤Çɽ¼¨¤¹¤ë */
5889         if (o_ptr->number <= 0)
5890         {
5891                 /*FIRST*//*¤³¤³¤Ï¤â¤¦Ä̤é¤Ê¤¤¤«¤â */
5892                 msg_format("¤â¤¦%s¤ò»ý¤Ã¤Æ¤¤¤Ê¤¤¡£", o_name);
5893         }
5894         else
5895         {
5896                 /* ¥¢¥¤¥Æ¥à̾¤ò±ÑÆüÀÚ¤êÂؤ¨µ¡Ç½Âбþ */
5897                 msg_format("¤Þ¤À %s¤ò»ý¤Ã¤Æ¤¤¤ë¡£", o_name);
5898         }
5899 #else
5900         msg_format("You have %s.", o_name);
5901 #endif
5902
5903 }
5904
5905 /*!
5906  * @brief ¥¢¥¤¥Æ¥à¤Î»Ä¤ê½ê»ý¿ô¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤¹¤ë /
5907  * Increase the "number" of an item in the inventory
5908  * @param item ½ê»ý¿ô¤òÁý¤ä¤·¤¿¤¤¥×¥ì¥¤¥ä¡¼¤Î¥¢¥¤¥Æ¥à½ê»ý¥¹¥í¥Ã¥È
5909  * @param num Áý¤ä¤·¤¿¤¤ÎÌ
5910  * @return ¤Ê¤·
5911  */
5912 void inven_item_increase(int item, int num)
5913 {
5914         object_type *o_ptr = &inventory[item];
5915
5916         /* Apply */
5917         num += o_ptr->number;
5918
5919         /* Bounds check */
5920         if (num > 255) num = 255;
5921         else if (num < 0) num = 0;
5922
5923         /* Un-apply */
5924         num -= o_ptr->number;
5925
5926         /* Change the number and weight */
5927         if (num)
5928         {
5929                 /* Add the number */
5930                 o_ptr->number += num;
5931
5932                 /* Add the weight */
5933                 p_ptr->total_weight += (num * o_ptr->weight);
5934
5935                 /* Recalculate bonuses */
5936                 p_ptr->update |= (PU_BONUS);
5937
5938                 /* Recalculate mana XXX */
5939                 p_ptr->update |= (PU_MANA);
5940
5941                 /* Combine the pack */
5942                 p_ptr->notice |= (PN_COMBINE);
5943
5944                 /* Window stuff */
5945                 p_ptr->window |= (PW_INVEN | PW_EQUIP);
5946
5947                 /* Hack -- Clear temporary elemental brands if player takes off weapons */
5948                 if (!o_ptr->number && p_ptr->ele_attack)
5949                 {
5950                         if ((item == INVEN_RARM) || (item == INVEN_LARM))
5951                         {
5952                                 if (!buki_motteruka(INVEN_RARM + INVEN_LARM - item))
5953                                 {
5954                                         /* Clear all temporary elemental brands */
5955                                         set_ele_attack(0, 0);
5956                                 }
5957                         }
5958                 }
5959         }
5960 }
5961
5962 /*!
5963  * @brief ½ê»ý¥¢¥¤¥Æ¥à¥¹¥í¥Ã¥È¤«¤é½ê»ý¿ô¤Î¤Ê¤¯¤Ê¤Ã¤¿¥¢¥¤¥Æ¥à¤ò¾Ãµî¤¹¤ë /
5964  * Erase an inventory slot if it has no more items
5965  * @param item ¾Ãµî¤·¤¿¤¤¥×¥ì¥¤¥ä¡¼¤Î¥¢¥¤¥Æ¥à½ê»ý¥¹¥í¥Ã¥È
5966  * @return ¤Ê¤·
5967  */
5968 void inven_item_optimize(int item)
5969 {
5970         object_type *o_ptr = &inventory[item];
5971
5972         /* Only optimize real items */
5973         if (!o_ptr->k_idx) return;
5974
5975         /* Only optimize empty items */
5976         if (o_ptr->number) return;
5977
5978         /* The item is in the pack */
5979         if (item < INVEN_RARM)
5980         {
5981                 int i;
5982
5983                 /* One less item */
5984                 inven_cnt--;
5985
5986                 /* Slide everything down */
5987                 for (i = item; i < INVEN_PACK; i++)
5988                 {
5989                         /* Structure copy */
5990                         inventory[i] = inventory[i+1];
5991                 }
5992
5993                 /* Erase the "final" slot */
5994                 object_wipe(&inventory[i]);
5995
5996                 /* Window stuff */
5997                 p_ptr->window |= (PW_INVEN);
5998         }
5999
6000         /* The item is being wielded */
6001         else
6002         {
6003                 /* One less item */
6004                 equip_cnt--;
6005
6006                 /* Erase the empty slot */
6007                 object_wipe(&inventory[item]);
6008
6009                 /* Recalculate bonuses */
6010                 p_ptr->update |= (PU_BONUS);
6011
6012                 /* Recalculate torch */
6013                 p_ptr->update |= (PU_TORCH);
6014
6015                 /* Recalculate mana XXX */
6016                 p_ptr->update |= (PU_MANA);
6017
6018                 /* Window stuff */
6019                 p_ptr->window |= (PW_EQUIP);
6020         }
6021
6022         /* Window stuff */
6023         p_ptr->window |= (PW_SPELL);
6024 }
6025
6026 /*!
6027  * @brief ¾²¾å¤ÎËâÆ»¶ñ¤Î»Ä¤ê»ÄÎÌ¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤¹¤ë /
6028  * Describe the charges on an item on the floor.
6029  * @param item ¥á¥Ã¥»¡¼¥¸¤ÎÂоݤˤ·¤¿¤¤¥¢¥¤¥Æ¥à½ê»ý¥¹¥í¥Ã¥È
6030  * @return ¤Ê¤·
6031  */
6032 void floor_item_charges(int item)
6033 {
6034         object_type *o_ptr = &o_list[item];
6035
6036         /* Require staff/wand */
6037         if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
6038
6039         /* Require known item */
6040         if (!object_is_known(o_ptr)) return;
6041
6042 #ifdef JP
6043         if (o_ptr->pval <= 0)
6044         {
6045                 msg_print("¤³¤Î¾²¾å¤Î¥¢¥¤¥Æ¥à¤Ï¡¢¤â¤¦ËâÎϤ¬»Ä¤Ã¤Æ¤¤¤Ê¤¤¡£");
6046         }
6047         else
6048         {
6049                 msg_format("¤³¤Î¾²¾å¤Î¥¢¥¤¥Æ¥à¤Ï¡¢¤¢¤È %d ²óʬ¤ÎËâÎϤ¬»Ä¤Ã¤Æ¤¤¤ë¡£", o_ptr->pval);
6050         }
6051 #else
6052         /* Multiple charges */
6053         if (o_ptr->pval != 1)
6054         {
6055                 /* Print a message */
6056                 msg_format("There are %d charges remaining.", o_ptr->pval);
6057         }
6058
6059         /* Single charge */
6060         else
6061         {
6062                 /* Print a message */
6063                 msg_format("There is %d charge remaining.", o_ptr->pval);
6064         }
6065 #endif
6066
6067 }
6068
6069 /*!
6070  * @brief ¾²¾å¤Î¥¢¥¤¥Æ¥à¤Î»Ä¤ê¿ô¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤¹¤ë /
6071  * Describe the charges on an item on the floor.
6072  * @param item ¥á¥Ã¥»¡¼¥¸¤ÎÂоݤˤ·¤¿¤¤¥¢¥¤¥Æ¥à½ê»ý¥¹¥í¥Ã¥È
6073  * @return ¤Ê¤·
6074  */
6075 void floor_item_describe(int item)
6076 {
6077         object_type *o_ptr = &o_list[item];
6078         char        o_name[MAX_NLEN];
6079
6080         /* Get a description */
6081         object_desc(o_name, o_ptr, 0);
6082
6083         /* Print a message */
6084 #ifdef JP
6085         /* "no more" ¤Î¾ì¹ç¤Ï¤³¤Á¤é¤Çɽ¼¨¤òʬ¤±¤ë */
6086         if (o_ptr->number <= 0)
6087         {
6088                 msg_format("¾²¾å¤Ë¤Ï¡¢¤â¤¦%s¤Ï¤Ê¤¤¡£", o_name);
6089         }
6090         else
6091         {
6092                 msg_format("¾²¾å¤Ë¤Ï¡¢¤Þ¤À %s¤¬¤¢¤ë¡£", o_name);
6093         }
6094 #else
6095         msg_format("You see %s.", o_name);
6096 #endif
6097
6098 }
6099
6100
6101 /*!
6102  * @brief ¾²¾å¤Î¥¢¥¤¥Æ¥à¤Î¿ô¤òÁý¤ä¤¹ /
6103  * Increase the "number" of an item on the floor
6104  * @param item Áý¤ä¤·¤¿¤¤¥¢¥¤¥Æ¥à¤Î½ê»ý¥¹¥í¥Ã¥È
6105  * @param num Áý¤ä¤·¤¿¤¤¥¢¥¤¥Æ¥à¤Î¿ô
6106  * @return ¤Ê¤·
6107  */
6108 void floor_item_increase(int item, int num)
6109 {
6110         object_type *o_ptr = &o_list[item];
6111
6112         /* Apply */
6113         num += o_ptr->number;
6114
6115         /* Bounds check */
6116         if (num > 255) num = 255;
6117         else if (num < 0) num = 0;
6118
6119         /* Un-apply */
6120         num -= o_ptr->number;
6121
6122         /* Change the number */
6123         o_ptr->number += num;
6124 }
6125
6126
6127 /*!
6128  * @brief ¾²¾å¤Î¿ô¤Î̵¤¯¤Ê¤Ã¤¿¥¢¥¤¥Æ¥à¥¹¥í¥Ã¥È¤ò¾Ãµî¤¹¤ë /
6129  * Optimize an item on the floor (destroy "empty" items)
6130  * @param item ¾Ãµî¤·¤¿¤¤¥¢¥¤¥Æ¥à¤Î½ê»ý¥¹¥í¥Ã¥È
6131  * @return ¤Ê¤·
6132  */
6133 void floor_item_optimize(int item)
6134 {
6135         object_type *o_ptr = &o_list[item];
6136
6137         /* Paranoia -- be sure it exists */
6138         if (!o_ptr->k_idx) return;
6139
6140         /* Only optimize empty items */
6141         if (o_ptr->number) return;
6142
6143         /* Delete the object */
6144         delete_object_idx(item);
6145 }
6146
6147
6148 /*!
6149  * @brief ¥¢¥¤¥Æ¥à¤ò½¦¤¦ºÝ¤Ë¥¶¥Ã¥¯¤«¤é°î¤ì¤º¤ËºÑ¤à¤«¤òȽÄꤹ¤ë /
6150  * Check if we have space for an item in the pack without overflow
6151  * @param o_ptr ½¦¤¤¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿
6152  * @return °î¤ì¤º¤ËºÑ¤à¤Ê¤éTRUE¤òÊÖ¤¹
6153  */
6154 bool inven_carry_okay(object_type *o_ptr)
6155 {
6156         int j;
6157
6158         /* Empty slot? */
6159         if (inven_cnt < INVEN_PACK) return (TRUE);
6160
6161         /* Similar slot? */
6162         for (j = 0; j < INVEN_PACK; j++)
6163         {
6164                 object_type *j_ptr = &inventory[j];
6165
6166                 /* Skip non-objects */
6167                 if (!j_ptr->k_idx) continue;
6168
6169                 /* Check if the two items can be combined */
6170                 if (object_similar(j_ptr, o_ptr)) return (TRUE);
6171         }
6172
6173         /* Nope */
6174         return (FALSE);
6175 }
6176
6177 /*!
6178  * @brief ¥ª¥Ö¥¸¥§¥¯¥È¤òÄêµÁ¤µ¤ì¤¿´ð½à¤Ë½¾¤¤¥½¡¼¥È¤¹¤ë¤¿¤á¤Î´Ø¿ô /
6179  * Check if we have space for an item in the pack without overflow
6180  * @param o_ptr Èæ³ÓÂоݥª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤Âλ²¾È¥Ý¥¤¥ó¥¿1
6181  * @param o_value o_ptr¤Î¥¢¥¤¥Æ¥à²ÁÃ͡ʼêÆ°¤Ç¤¢¤é¤«¤¸¤áÂåÆþ¤¹¤ëɬÍפ¬¤¢¤ë¡©¡Ë
6182  * @return o_ptr¤ÎÊý¤¬¾å°Ì¤Ê¤é¤ÐTRUE¤òÊÖ¤¹¡£
6183  */
6184 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
6185 {
6186         int o_type, j_type;
6187
6188         /* Use empty slots */
6189         if (!j_ptr->k_idx) return TRUE;
6190
6191         /* Hack -- readable books always come first */
6192         if ((o_ptr->tval == REALM1_BOOK) &&
6193             (j_ptr->tval != REALM1_BOOK)) return TRUE;
6194         if ((j_ptr->tval == REALM1_BOOK) &&
6195             (o_ptr->tval != REALM1_BOOK)) return FALSE;
6196
6197         if ((o_ptr->tval == REALM2_BOOK) &&
6198             (j_ptr->tval != REALM2_BOOK)) return TRUE;
6199         if ((j_ptr->tval == REALM2_BOOK) &&
6200             (o_ptr->tval != REALM2_BOOK)) return FALSE;
6201
6202         /* Objects sort by decreasing type */
6203         if (o_ptr->tval > j_ptr->tval) return TRUE;
6204         if (o_ptr->tval < j_ptr->tval) return FALSE;
6205
6206         /* Non-aware (flavored) items always come last */
6207         /* Can happen in the home */
6208         if (!object_is_aware(o_ptr)) return FALSE;
6209         if (!object_is_aware(j_ptr)) return TRUE;
6210
6211         /* Objects sort by increasing sval */
6212         if (o_ptr->sval < j_ptr->sval) return TRUE;
6213         if (o_ptr->sval > j_ptr->sval) return FALSE;
6214
6215         /* Unidentified objects always come last */
6216         /* Objects in the home can be unknown */
6217         if (!object_is_known(o_ptr)) return FALSE;
6218         if (!object_is_known(j_ptr)) return TRUE;
6219
6220         /* Fixed artifacts, random artifacts and ego items */
6221         if (object_is_fixed_artifact(o_ptr)) o_type = 3;
6222         else if (o_ptr->art_name) o_type = 2;
6223         else if (object_is_ego(o_ptr)) o_type = 1;
6224         else o_type = 0;
6225
6226         if (object_is_fixed_artifact(j_ptr)) j_type = 3;
6227         else if (j_ptr->art_name) j_type = 2;
6228         else if (object_is_ego(j_ptr)) j_type = 1;
6229         else j_type = 0;
6230
6231         if (o_type < j_type) return TRUE;
6232         if (o_type > j_type) return FALSE;
6233
6234         switch (o_ptr->tval)
6235         {
6236         case TV_FIGURINE:
6237         case TV_STATUE:
6238         case TV_CORPSE:
6239         case TV_CAPTURE:
6240                 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
6241                 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
6242                 return FALSE;
6243
6244         case TV_SHOT:
6245         case TV_ARROW:
6246         case TV_BOLT:
6247                 /* Objects sort by increasing hit/damage bonuses */
6248                 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
6249                 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
6250                 break;
6251
6252         /* Hack:  otherwise identical rods sort by
6253         increasing recharge time --dsb */
6254         case TV_ROD:
6255                 if (o_ptr->pval < j_ptr->pval) return TRUE;
6256                 if (o_ptr->pval > j_ptr->pval) return FALSE;
6257                 break;
6258         }
6259
6260         /* Objects sort by decreasing value */
6261         return o_value > object_value(j_ptr);
6262 }
6263
6264
6265 /*
6266  * Add an item to the players inventory, and return the slot used.
6267  *
6268  * If the new item can combine with an existing item in the inventory,
6269  * it will do so, using "object_similar()" and "object_absorb()", else,
6270  * the item will be placed into the "proper" location in the inventory.
6271  *
6272  * This function can be used to "over-fill" the player's pack, but only
6273  * once, and such an action must trigger the "overflow" code immediately.
6274  * Note that when the pack is being "over-filled", the new item must be
6275  * placed into the "overflow" slot, and the "overflow" must take place
6276  * before the pack is reordered, but (optionally) after the pack is
6277  * combined.  This may be tricky.  See "dungeon.c" for info.
6278  *
6279  * Note that this code must remove any location/stack information
6280  * from the object once it is placed into the inventory.
6281  */
6282 s16b inven_carry(object_type *o_ptr)
6283 {
6284         int i, j, k;
6285         int n = -1;
6286
6287         object_type *j_ptr;
6288
6289
6290         /* Check for combining */
6291         for (j = 0; j < INVEN_PACK; j++)
6292         {
6293                 j_ptr = &inventory[j];
6294
6295                 /* Skip non-objects */
6296                 if (!j_ptr->k_idx) continue;
6297
6298                 /* Hack -- track last item */
6299                 n = j;
6300
6301                 /* Check if the two items can be combined */
6302                 if (object_similar(j_ptr, o_ptr))
6303                 {
6304                         /* Combine the items */
6305                         object_absorb(j_ptr, o_ptr);
6306
6307                         /* Increase the weight */
6308                         p_ptr->total_weight += (o_ptr->number * o_ptr->weight);
6309
6310                         /* Recalculate bonuses */
6311                         p_ptr->update |= (PU_BONUS);
6312
6313                         /* Window stuff */
6314                         p_ptr->window |= (PW_INVEN);
6315
6316                         /* Success */
6317                         return (j);
6318                 }
6319         }
6320
6321
6322         /* Paranoia */
6323         if (inven_cnt > INVEN_PACK) return (-1);
6324
6325         /* Find an empty slot */
6326         for (j = 0; j <= INVEN_PACK; j++)
6327         {
6328                 j_ptr = &inventory[j];
6329
6330                 /* Use it if found */
6331                 if (!j_ptr->k_idx) break;
6332         }
6333
6334         /* Use that slot */
6335         i = j;
6336
6337
6338         /* Reorder the pack */
6339         if (i < INVEN_PACK)
6340         {
6341                 /* Get the "value" of the item */
6342                 s32b o_value = object_value(o_ptr);
6343
6344                 /* Scan every occupied slot */
6345                 for (j = 0; j < INVEN_PACK; j++)
6346                 {
6347                         if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6348                 }
6349
6350                 /* Use that slot */
6351                 i = j;
6352
6353                 /* Slide objects */
6354                 for (k = n; k >= i; k--)
6355                 {
6356                         /* Hack -- Slide the item */
6357                         object_copy(&inventory[k+1], &inventory[k]);
6358                 }
6359
6360                 /* Wipe the empty slot */
6361                 object_wipe(&inventory[i]);
6362         }
6363
6364
6365         /* Copy the item */
6366         object_copy(&inventory[i], o_ptr);
6367
6368         /* Access new object */
6369         j_ptr = &inventory[i];
6370
6371         /* Forget stack */
6372         j_ptr->next_o_idx = 0;
6373
6374         /* Forget monster */
6375         j_ptr->held_m_idx = 0;
6376
6377         /* Forget location */
6378         j_ptr->iy = j_ptr->ix = 0;
6379
6380         /* Player touches it, and no longer marked */
6381         j_ptr->marked = OM_TOUCHED;
6382
6383         /* Increase the weight */
6384         p_ptr->total_weight += (j_ptr->number * j_ptr->weight);
6385
6386         /* Count the items */
6387         inven_cnt++;
6388
6389         /* Recalculate bonuses */
6390         p_ptr->update |= (PU_BONUS);
6391
6392         /* Combine and Reorder pack */
6393         p_ptr->notice |= (PN_COMBINE | PN_REORDER);
6394
6395         /* Window stuff */
6396         p_ptr->window |= (PW_INVEN);
6397
6398         /* Return the slot */
6399         return (i);
6400 }
6401
6402
6403 /*
6404  * Take off (some of) a non-cursed equipment item
6405  *
6406  * Note that only one item at a time can be wielded per slot.
6407  *
6408  * Note that taking off an item when "full" may cause that item
6409  * to fall to the ground.
6410  *
6411  * Return the inventory slot into which the item is placed.
6412  */
6413 s16b inven_takeoff(int item, int amt)
6414 {
6415         int slot;
6416
6417         object_type forge;
6418         object_type *q_ptr;
6419
6420         object_type *o_ptr;
6421
6422         cptr act;
6423
6424         char o_name[MAX_NLEN];
6425
6426
6427         /* Get the item to take off */
6428         o_ptr = &inventory[item];
6429
6430         /* Paranoia */
6431         if (amt <= 0) return (-1);
6432
6433         /* Verify */
6434         if (amt > o_ptr->number) amt = o_ptr->number;
6435
6436         /* Get local object */
6437         q_ptr = &forge;
6438
6439         /* Obtain a local object */
6440         object_copy(q_ptr, o_ptr);
6441
6442         /* Modify quantity */
6443         q_ptr->number = amt;
6444
6445         /* Describe the object */
6446         object_desc(o_name, q_ptr, 0);
6447
6448         /* Took off weapon */
6449         if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
6450             object_is_melee_weapon(o_ptr))
6451         {
6452 #ifdef JP
6453                 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
6454 #else
6455                 act = "You were wielding";
6456 #endif
6457
6458         }
6459
6460         /* Took off bow */
6461         else if (item == INVEN_BOW)
6462         {
6463 #ifdef JP
6464                 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
6465 #else
6466                 act = "You were holding";
6467 #endif
6468
6469         }
6470
6471         /* Took off light */
6472         else if (item == INVEN_LITE)
6473         {
6474 #ifdef JP
6475                 act = "¤ò¸÷¸»¤«¤é¤Ï¤º¤·¤¿";
6476 #else
6477                 act = "You were holding";
6478 #endif
6479
6480         }
6481
6482         /* Took off something */
6483         else
6484         {
6485 #ifdef JP
6486                 act = "¤òÁõÈ÷¤«¤é¤Ï¤º¤·¤¿";
6487 #else
6488                 act = "You were wearing";
6489 #endif
6490
6491         }
6492
6493         /* Modify, Optimize */
6494         inven_item_increase(item, -amt);
6495         inven_item_optimize(item);
6496
6497         /* Carry the object */
6498         slot = inven_carry(q_ptr);
6499
6500         /* Message */
6501 #ifdef JP
6502         msg_format("%s(%c)%s¡£", o_name, index_to_label(slot), act);
6503 #else
6504         msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
6505 #endif
6506
6507
6508         /* Return slot */
6509         return (slot);
6510 }
6511
6512
6513 /*
6514  * Drop (some of) a non-cursed inventory/equipment item
6515  *
6516  * The object will be dropped "near" the current location
6517  */
6518 void inven_drop(int item, int amt)
6519 {
6520         object_type forge;
6521         object_type *q_ptr;
6522
6523         object_type *o_ptr;
6524
6525         char o_name[MAX_NLEN];
6526
6527
6528         /* Access original object */
6529         o_ptr = &inventory[item];
6530
6531         /* Error check */
6532         if (amt <= 0) return;
6533
6534         /* Not too many */
6535         if (amt > o_ptr->number) amt = o_ptr->number;
6536
6537
6538         /* Take off equipment */
6539         if (item >= INVEN_RARM)
6540         {
6541                 /* Take off first */
6542                 item = inven_takeoff(item, amt);
6543
6544                 /* Access original object */
6545                 o_ptr = &inventory[item];
6546         }
6547
6548
6549         /* Get local object */
6550         q_ptr = &forge;
6551
6552         /* Obtain local object */
6553         object_copy(q_ptr, o_ptr);
6554
6555         /* Distribute charges of wands or rods */
6556         distribute_charges(o_ptr, q_ptr, amt);
6557
6558         /* Modify quantity */
6559         q_ptr->number = amt;
6560
6561         /* Describe local object */
6562         object_desc(o_name, q_ptr, 0);
6563
6564         /* Message */
6565 #ifdef JP
6566         msg_format("%s(%c)¤òÍî¤È¤·¤¿¡£", o_name, index_to_label(item));
6567 #else
6568         msg_format("You drop %s (%c).", o_name, index_to_label(item));
6569 #endif
6570
6571
6572         /* Drop it near the player */
6573         (void)drop_near(q_ptr, 0, py, px);
6574
6575         /* Modify, Describe, Optimize */
6576         inven_item_increase(item, -amt);
6577         inven_item_describe(item);
6578         inven_item_optimize(item);
6579 }
6580
6581
6582 /*
6583  * Combine items in the pack
6584  *
6585  * Note special handling of the "overflow" slot
6586  */
6587 void combine_pack(void)
6588 {
6589         int             i, j, k;
6590         object_type     *o_ptr;
6591         object_type     *j_ptr;
6592         bool            flag = FALSE, combined;
6593
6594         do
6595         {
6596                 combined = FALSE;
6597
6598                 /* Combine the pack (backwards) */
6599                 for (i = INVEN_PACK; i > 0; i--)
6600                 {
6601                         /* Get the item */
6602                         o_ptr = &inventory[i];
6603
6604                         /* Skip empty items */
6605                         if (!o_ptr->k_idx) continue;
6606
6607                         /* Scan the items above that item */
6608                         for (j = 0; j < i; j++)
6609                         {
6610                                 int max_num;
6611
6612                                 /* Get the item */
6613                                 j_ptr = &inventory[j];
6614
6615                                 /* Skip empty items */
6616                                 if (!j_ptr->k_idx) continue;
6617
6618                                 /*
6619                                  * Get maximum number of the stack if these
6620                                  * are similar, get zero otherwise.
6621                                  */
6622                                 max_num = object_similar_part(j_ptr, o_ptr);
6623
6624                                 /* Can we (partialy) drop "o_ptr" onto "j_ptr"? */
6625                                 if (max_num && j_ptr->number < max_num)
6626                                 {
6627                                         if (o_ptr->number + j_ptr->number <= max_num)
6628                                         {
6629                                                 /* Take note */
6630                                                 flag = TRUE;
6631
6632                                                 /* Add together the item counts */
6633                                                 object_absorb(j_ptr, o_ptr);
6634
6635                                                 /* One object is gone */
6636                                                 inven_cnt--;
6637
6638                                                 /* Slide everything down */
6639                                                 for (k = i; k < INVEN_PACK; k++)
6640                                                 {
6641                                                         /* Structure copy */
6642                                                         inventory[k] = inventory[k+1];
6643                                                 }
6644
6645                                                 /* Erase the "final" slot */
6646                                                 object_wipe(&inventory[k]);
6647                                         }
6648                                         else
6649                                         {
6650                                                 int old_num = o_ptr->number;
6651                                                 int remain = j_ptr->number + o_ptr->number - max_num;
6652 #if 0
6653                                                 o_ptr->number -= remain;
6654 #endif
6655                                                 /* Add together the item counts */
6656                                                 object_absorb(j_ptr, o_ptr);
6657
6658                                                 o_ptr->number = remain;
6659
6660                                                 /* Hack -- if rods are stacking, add the pvals (maximum timeouts) and current timeouts together. -LM- */
6661                                                 if (o_ptr->tval == TV_ROD)
6662                                                 {
6663                                                         o_ptr->pval =  o_ptr->pval * remain / old_num;
6664                                                         o_ptr->timeout = o_ptr->timeout * remain / old_num;
6665                                                 }
6666
6667                                                 /* Hack -- if wands are stacking, combine the charges. -LM- */
6668                                                 if (o_ptr->tval == TV_WAND)
6669                                                 {
6670                                                         o_ptr->pval = o_ptr->pval * remain / old_num;
6671                                                 }
6672                                         }
6673
6674                                         /* Window stuff */
6675                                         p_ptr->window |= (PW_INVEN);
6676
6677                                         /* Take note */
6678                                         combined = TRUE;
6679
6680                                         /* Done */
6681                                         break;
6682                                 }
6683                         }
6684                 }
6685         }
6686         while (combined);
6687
6688         /* Message */
6689 #ifdef JP
6690         if (flag) msg_print("¥¶¥Ã¥¯¤ÎÃæ¤Î¥¢¥¤¥Æ¥à¤ò¤Þ¤È¤áľ¤·¤¿¡£");
6691 #else
6692         if (flag) msg_print("You combine some items in your pack.");
6693 #endif
6694 }
6695
6696
6697 /*
6698  * Reorder items in the pack
6699  *
6700  * Note special handling of the "overflow" slot
6701  */
6702 void reorder_pack(void)
6703 {
6704         int             i, j, k;
6705         s32b            o_value;
6706         object_type     forge;
6707         object_type     *q_ptr;
6708         object_type     *o_ptr;
6709         bool            flag = FALSE;
6710
6711
6712         /* Re-order the pack (forwards) */
6713         for (i = 0; i < INVEN_PACK; i++)
6714         {
6715                 /* Mega-Hack -- allow "proper" over-flow */
6716                 if ((i == INVEN_PACK) && (inven_cnt == INVEN_PACK)) break;
6717
6718                 /* Get the item */
6719                 o_ptr = &inventory[i];
6720
6721                 /* Skip empty slots */
6722                 if (!o_ptr->k_idx) continue;
6723
6724                 /* Get the "value" of the item */
6725                 o_value = object_value(o_ptr);
6726
6727                 /* Scan every occupied slot */
6728                 for (j = 0; j < INVEN_PACK; j++)
6729                 {
6730                         if (object_sort_comp(o_ptr, o_value, &inventory[j])) break;
6731                 }
6732
6733                 /* Never move down */
6734                 if (j >= i) continue;
6735
6736                 /* Take note */
6737                 flag = TRUE;
6738
6739                 /* Get local object */
6740                 q_ptr = &forge;
6741
6742                 /* Save a copy of the moving item */
6743                 object_copy(q_ptr, &inventory[i]);
6744
6745                 /* Slide the objects */
6746                 for (k = i; k > j; k--)
6747                 {
6748                         /* Slide the item */
6749                         object_copy(&inventory[k], &inventory[k-1]);
6750                 }
6751
6752                 /* Insert the moving item */
6753                 object_copy(&inventory[j], q_ptr);
6754
6755                 /* Window stuff */
6756                 p_ptr->window |= (PW_INVEN);
6757         }
6758
6759         /* Message */
6760 #ifdef JP
6761         if (flag) msg_print("¥¶¥Ã¥¯¤ÎÃæ¤Î¥¢¥¤¥Æ¥à¤òÊ¤Ùľ¤·¤¿¡£");
6762 #else
6763         if (flag) msg_print("You reorder some items in your pack.");
6764 #endif
6765
6766 }
6767
6768
6769 /*
6770  * Hack -- display an object kind in the current window
6771  *
6772  * Include list of usable spells for readible books
6773  */
6774 void display_koff(int k_idx)
6775 {
6776         int y;
6777
6778         object_type forge;
6779         object_type *q_ptr;
6780         int         sval;
6781         int         use_realm;
6782
6783         char o_name[MAX_NLEN];
6784
6785
6786         /* Erase the window */
6787         for (y = 0; y < Term->hgt; y++)
6788         {
6789                 /* Erase the line */
6790                 Term_erase(0, y, 255);
6791         }
6792
6793         /* No info */
6794         if (!k_idx) return;
6795
6796         /* Get local object */
6797         q_ptr = &forge;
6798
6799         /* Prepare the object */
6800         object_prep(q_ptr, k_idx);
6801
6802         /* Describe */
6803         object_desc(o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
6804
6805         /* Mention the object name */
6806         Term_putstr(0, 0, -1, TERM_WHITE, o_name);
6807
6808         /* Access the item's sval */
6809         sval = q_ptr->sval;
6810         use_realm = tval2realm(q_ptr->tval);
6811
6812         /* Warriors are illiterate */
6813         if (p_ptr->realm1 || p_ptr->realm2)
6814         {
6815                 if ((use_realm != p_ptr->realm1) && (use_realm != p_ptr->realm2)) return;
6816         }
6817         else
6818         {
6819                 if ((p_ptr->pclass != CLASS_SORCERER) && (p_ptr->pclass != CLASS_RED_MAGE)) return;
6820                 if (!is_magic(use_realm)) return;
6821                 if ((p_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1)) return;
6822         }
6823
6824         /* Display spells in readible books */
6825         {
6826                 int     spell = -1;
6827                 int     num = 0;
6828                 byte    spells[64];
6829
6830                 /* Extract spells */
6831                 for (spell = 0; spell < 32; spell++)
6832                 {
6833                         /* Check for this spell */
6834                         if (fake_spell_flags[sval] & (1L << spell))
6835                         {
6836                                 /* Collect this spell */
6837                                 spells[num++] = spell;
6838                         }
6839                 }
6840
6841                 /* Print spells */
6842                 print_spells(0, spells, num, 2, 0, use_realm);
6843         }
6844 }
6845
6846 /* Choose one of items that have warning flag */
6847 object_type *choose_warning_item(void)
6848 {
6849         int i;
6850         int choices[INVEN_TOTAL - INVEN_RARM];
6851         int number = 0;
6852
6853         /* Paranoia -- Player has no warning ability */
6854         if (!p_ptr->warning) return NULL;
6855
6856         /* Search Inventory */
6857         for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
6858         {
6859                 u32b flgs[TR_FLAG_SIZE];
6860                 object_type *o_ptr = &inventory[i];
6861
6862                 object_flags(o_ptr, flgs);
6863                 if (have_flag(flgs, TR_WARNING))
6864                 {
6865                         choices[number] = i;
6866                         number++;
6867                 }
6868         }
6869
6870         /* Choice one of them */
6871         return number ? &inventory[choices[randint0(number)]] : NULL;
6872 }
6873
6874 /* Calculate spell damages */
6875 static void spell_damcalc(monster_type *m_ptr, int typ, int dam, int limit, int *max)
6876 {
6877         monster_race *r_ptr = &r_info[m_ptr->r_idx];
6878         int          rlev = r_ptr->level;
6879         bool         ignore_wraith_form = FALSE;
6880
6881         if (limit) dam = (dam > limit) ? limit : dam;
6882
6883         /* Vulnerability, resistance and immunity */
6884         switch (typ)
6885         {
6886         case GF_ELEC:
6887                 if (p_ptr->immune_elec)
6888                 {
6889                         dam = 0;
6890                         ignore_wraith_form = TRUE;
6891                 }
6892                 else
6893                 {
6894                         if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6895                         if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6896                         if (prace_is_(RACE_ANDROID)) dam += dam / 3;
6897                         if (p_ptr->resist_elec) dam = (dam + 2) / 3;
6898                         if (IS_OPPOSE_ELEC())
6899                                 dam = (dam + 2) / 3;
6900                 }
6901                 break;
6902
6903         case GF_POIS:
6904                 if (p_ptr->resist_pois) dam = (dam + 2) / 3;
6905                 if (IS_OPPOSE_POIS()) dam = (dam + 2) / 3;
6906                 break;
6907
6908         case GF_ACID:
6909                 if (p_ptr->immune_acid)
6910                 {
6911                         dam = 0;
6912                         ignore_wraith_form = TRUE;
6913                 }
6914                 else
6915                 {
6916                         if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6917                         if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6918                         if (p_ptr->resist_acid) dam = (dam + 2) / 3;
6919                         if (IS_OPPOSE_ACID()) dam = (dam + 2) / 3;
6920                 }
6921                 break;
6922
6923         case GF_COLD:
6924         case GF_ICE:
6925                 if (p_ptr->immune_cold)
6926                 {
6927                         dam = 0;
6928                         ignore_wraith_form = TRUE;
6929                 }
6930                 else
6931                 {
6932                         if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6933                         if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6934                         if (p_ptr->resist_cold) dam = (dam + 2) / 3;
6935                         if (IS_OPPOSE_COLD()) dam = (dam + 2) / 3;
6936                 }
6937                 break;
6938
6939         case GF_FIRE:
6940                 if (p_ptr->immune_fire)
6941                 {
6942                         dam = 0;
6943                         ignore_wraith_form = TRUE;
6944                 }
6945                 else
6946                 {
6947                         if (p_ptr->muta3 & MUT3_VULN_ELEM) dam *= 2;
6948                         if (prace_is_(RACE_ENT)) dam += dam / 3;
6949                         if (p_ptr->special_defense & KATA_KOUKIJIN) dam += dam / 3;
6950                         if (p_ptr->resist_fire) dam = (dam + 2) / 3;
6951                         if (IS_OPPOSE_FIRE()) dam = (dam + 2) / 3;
6952                 }
6953                 break;
6954
6955         case GF_PSY_SPEAR:
6956                 ignore_wraith_form = TRUE;
6957                 break;
6958
6959         case GF_ARROW:
6960                 if (!p_ptr->blind &&
6961                     ((inventory[INVEN_RARM].k_idx && (inventory[INVEN_RARM].name1 == ART_ZANTETSU)) ||
6962                      (inventory[INVEN_LARM].k_idx && (inventory[INVEN_LARM].name1 == ART_ZANTETSU))))
6963                 {
6964                         dam = 0;
6965                         ignore_wraith_form = TRUE;
6966                 }
6967                 break;
6968
6969         case GF_LITE:
6970                 if (p_ptr->resist_lite) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6971                 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) dam *= 2;
6972                 else if (prace_is_(RACE_S_FAIRY)) dam = dam * 4 / 3;
6973
6974                 /*
6975                  * Cannot use "ignore_wraith_form" strictly (for "random one damage")
6976                  * "dam *= 2;" for later "dam /= 2"
6977                  */
6978                 if (p_ptr->wraith_form) dam *= 2;
6979                 break;
6980
6981         case GF_DARK:
6982                 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE) || p_ptr->wraith_form)
6983                 {
6984                         dam = 0;
6985                         ignore_wraith_form = TRUE;
6986                 }
6987                 else if (p_ptr->resist_dark) dam /= 2; /* Worst case of 4 / (d4 + 7) */
6988                 break;
6989
6990         case GF_SHARDS:
6991                 if (p_ptr->resist_shard) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
6992                 break;
6993
6994         case GF_SOUND:
6995                 if (p_ptr->resist_sound) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
6996                 break;
6997
6998         case GF_CONFUSION:
6999                 if (p_ptr->resist_conf) dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
7000                 break;
7001
7002         case GF_CHAOS:
7003                 if (p_ptr->resist_chaos) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
7004                 break;
7005
7006         case GF_NETHER:
7007                 if (prace_is_(RACE_SPECTRE))
7008                 {
7009                         dam = 0;
7010                         ignore_wraith_form = TRUE;
7011                 }
7012                 else if (p_ptr->resist_neth) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
7013                 break;
7014
7015         case GF_DISENCHANT:
7016                 if (p_ptr->resist_disen) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
7017                 break;
7018
7019         case GF_NEXUS:
7020                 if (p_ptr->resist_nexus) dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
7021                 break;
7022
7023         case GF_TIME:
7024                 if (p_ptr->resist_time) dam /= 2; /* Worst case of 4 / (d4 + 7) */
7025                 break;
7026
7027         case GF_GRAVITY:
7028                 if (p_ptr->levitation) dam = (dam * 2) / 3;
7029                 break;
7030
7031         case GF_ROCKET:
7032                 if (p_ptr->resist_shard) dam /= 2;
7033                 break;
7034
7035         case GF_NUKE:
7036                 if (p_ptr->resist_pois) dam = (2 * dam + 2) / 5;
7037                 if (IS_OPPOSE_POIS()) dam = (2 * dam + 2) / 5;
7038                 break;
7039
7040         case GF_DEATH_RAY:
7041                 if (p_ptr->mimic_form)
7042                 {
7043                         if (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING)
7044                         {
7045                                 dam = 0;
7046                                 ignore_wraith_form = TRUE;
7047                         }
7048                 }
7049                 else
7050                 {
7051                         switch (p_ptr->prace)
7052                         {
7053                         case RACE_GOLEM:
7054                         case RACE_SKELETON:
7055                         case RACE_ZOMBIE:
7056                         case RACE_VAMPIRE:
7057                         case RACE_DEMON:
7058                         case RACE_SPECTRE:
7059                                 dam = 0;
7060                                 ignore_wraith_form = TRUE;
7061                                 break;
7062                         }
7063                 }
7064                 break;
7065
7066         case GF_HOLY_FIRE:
7067                 if (p_ptr->align > 10) dam /= 2;
7068                 else if (p_ptr->align < -10) dam *= 2;
7069                 break;
7070
7071         case GF_HELL_FIRE:
7072                 if (p_ptr->align > 10) dam *= 2;
7073                 break;
7074
7075         case GF_MIND_BLAST:
7076         case GF_BRAIN_SMASH:
7077                 if (100 + rlev / 2 <= MAX(5, p_ptr->skill_sav))
7078                 {
7079                         dam = 0;
7080                         ignore_wraith_form = TRUE;
7081                 }
7082                 break;
7083
7084         case GF_CAUSE_1:
7085         case GF_CAUSE_2:
7086         case GF_CAUSE_3:
7087         case GF_HAND_DOOM:
7088                 if (100 + rlev / 2 <= p_ptr->skill_sav)
7089                 {
7090                         dam = 0;
7091                         ignore_wraith_form = TRUE;
7092                 }
7093                 break;
7094
7095         case GF_CAUSE_4:
7096                 if ((100 + rlev / 2 <= p_ptr->skill_sav) && (m_ptr->r_idx != MON_KENSHIROU))
7097                 {
7098                         dam = 0;
7099                         ignore_wraith_form = TRUE;
7100                 }
7101                 break;
7102         }
7103
7104         if (p_ptr->wraith_form && !ignore_wraith_form)
7105         {
7106                 dam /= 2;
7107                 if (!dam) dam = 1;
7108         }
7109
7110         if (dam > *max) *max = dam;
7111 }
7112
7113 /* Calculate blow damages */
7114 static int blow_damcalc(monster_type *m_ptr, monster_blow *blow_ptr)
7115 {
7116         int  dam = blow_ptr->d_dice * blow_ptr->d_side;
7117         int  dummy_max = 0;
7118         bool check_wraith_form = TRUE;
7119
7120         if (blow_ptr->method != RBM_EXPLODE)
7121         {
7122                 int ac = p_ptr->ac + p_ptr->to_a;
7123
7124                 switch (blow_ptr->effect)
7125                 {
7126                 case RBE_SUPERHURT:
7127                 {
7128                         int tmp_dam = dam - (dam * ((ac < 150) ? ac : 150) / 250);
7129                         dam = MAX(dam, tmp_dam * 2);
7130                         break;
7131                 }
7132
7133                 case RBE_HURT:
7134                 case RBE_SHATTER:
7135                         dam -= (dam * ((ac < 150) ? ac : 150) / 250);
7136                         break;
7137
7138                 case RBE_ACID:
7139                         spell_damcalc(m_ptr, GF_ACID, dam, 0, &dummy_max);
7140                         dam = dummy_max;
7141                         check_wraith_form = FALSE;
7142                         break;
7143
7144                 case RBE_ELEC:
7145                         spell_damcalc(m_ptr, GF_ELEC, dam, 0, &dummy_max);
7146                         dam = dummy_max;
7147                         check_wraith_form = FALSE;
7148                         break;
7149
7150                 case RBE_FIRE:
7151                         spell_damcalc(m_ptr, GF_FIRE, dam, 0, &dummy_max);
7152                         dam = dummy_max;
7153                         check_wraith_form = FALSE;
7154                         break;
7155
7156                 case RBE_COLD:
7157                         spell_damcalc(m_ptr, GF_COLD, dam, 0, &dummy_max);
7158                         dam = dummy_max;
7159                         check_wraith_form = FALSE;
7160                         break;
7161
7162                 case RBE_DR_MANA:
7163                         dam = 0;
7164                         check_wraith_form = FALSE;
7165                         break;
7166                 }
7167
7168                 if (check_wraith_form && p_ptr->wraith_form)
7169                 {
7170                         dam /= 2;
7171                         if (!dam) dam = 1;
7172                 }
7173         }
7174         else
7175         {
7176                 dam = (dam + 1) / 2;
7177                 spell_damcalc(m_ptr, mbe_info[blow_ptr->effect].explode_type, dam, 0, &dummy_max);
7178                 dam = dummy_max;
7179         }
7180
7181         return dam;
7182 }
7183
7184 /* Examine the grid (xx,yy) and warn the player if there are any danger */
7185 bool process_warning(int xx, int yy)
7186 {
7187         int mx, my;
7188         cave_type *c_ptr;
7189         char o_name[MAX_NLEN];
7190
7191 #define WARNING_AWARE_RANGE 12
7192         int dam_max = 0;
7193         static int old_damage = 0;
7194
7195         for (mx = xx - WARNING_AWARE_RANGE; mx < xx + WARNING_AWARE_RANGE + 1; mx++)
7196         {
7197                 for (my = yy - WARNING_AWARE_RANGE; my < yy + WARNING_AWARE_RANGE + 1; my++)
7198                 {
7199                         int dam_max0 = 0;
7200                         monster_type *m_ptr;
7201                         monster_race *r_ptr;
7202
7203                         if (!in_bounds(my, mx) || (distance(my, mx, yy, xx) > WARNING_AWARE_RANGE)) continue;
7204
7205                         c_ptr = &cave[my][mx];
7206
7207                         if (!c_ptr->m_idx) continue;
7208
7209                         m_ptr = &m_list[c_ptr->m_idx];
7210
7211                         if (MON_CSLEEP(m_ptr)) continue;
7212                         if (!is_hostile(m_ptr)) continue;
7213
7214                         r_ptr = &r_info[m_ptr->r_idx];
7215
7216                         /* Monster spells (only powerful ones)*/
7217                         if (projectable(my, mx, yy, xx))
7218                         {
7219                                 int breath_dam_div3 = m_ptr->hp / 3;
7220                                 int breath_dam_div6 = m_ptr->hp / 6;
7221                                 u32b f4 = r_ptr->flags4;
7222                                 u32b f5 = r_ptr->flags5;
7223                                 u32b f6 = r_ptr->flags6;
7224
7225                                 if (!(d_info[dungeon_type].flags1 & DF1_NO_MAGIC))
7226                                 {
7227                                         int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
7228                                         int storm_dam = rlev * 4 + 150;
7229                                         bool powerful = (bool)(r_ptr->flags2 & RF2_POWERFUL);
7230
7231                                         if (f4 & RF4_BA_CHAO) spell_damcalc(m_ptr, GF_CHAOS, rlev * (powerful ? 3 : 2) + 100, 0, &dam_max0);
7232                                         if (f5 & RF5_BA_MANA) spell_damcalc(m_ptr, GF_MANA, storm_dam, 0, &dam_max0);
7233                                         if (f5 & RF5_BA_DARK) spell_damcalc(m_ptr, GF_DARK, storm_dam, 0, &dam_max0);
7234                                         if (f5 & RF5_BA_LITE) spell_damcalc(m_ptr, GF_LITE, storm_dam, 0, &dam_max0);
7235                                         if (f6 & RF6_HAND_DOOM) spell_damcalc(m_ptr, GF_HAND_DOOM, p_ptr->chp * 6 / 10, 0, &dam_max0);
7236                                         if (f6 & RF6_PSY_SPEAR) spell_damcalc(m_ptr, GF_PSY_SPEAR, powerful ? (rlev * 2 + 150) : (rlev * 3 / 2 + 100), 0, &dam_max0);
7237                                 }
7238                                 if (f4 & RF4_ROCKET) spell_damcalc(m_ptr, GF_ROCKET, m_ptr->hp / 4, 800, &dam_max0);
7239                                 if (f4 & RF4_BR_ACID) spell_damcalc(m_ptr, GF_ACID, breath_dam_div3, 1600, &dam_max0);
7240                                 if (f4 & RF4_BR_ELEC) spell_damcalc(m_ptr, GF_ELEC, breath_dam_div3, 1600, &dam_max0);
7241                                 if (f4 & RF4_BR_FIRE) spell_damcalc(m_ptr, GF_FIRE, breath_dam_div3, 1600, &dam_max0);
7242                                 if (f4 & RF4_BR_COLD) spell_damcalc(m_ptr, GF_COLD, breath_dam_div3, 1600, &dam_max0);
7243                                 if (f4 & RF4_BR_POIS) spell_damcalc(m_ptr, GF_POIS, breath_dam_div3, 800, &dam_max0);
7244                                 if (f4 & RF4_BR_NETH) spell_damcalc(m_ptr, GF_NETHER, breath_dam_div6, 550, &dam_max0);
7245                                 if (f4 & RF4_BR_LITE) spell_damcalc(m_ptr, GF_LITE, breath_dam_div6, 400, &dam_max0);
7246                                 if (f4 & RF4_BR_DARK) spell_damcalc(m_ptr, GF_DARK, breath_dam_div6, 400, &dam_max0);
7247                                 if (f4 & RF4_BR_CONF) spell_damcalc(m_ptr, GF_CONFUSION, breath_dam_div6, 450, &dam_max0);
7248                                 if (f4 & RF4_BR_SOUN) spell_damcalc(m_ptr, GF_SOUND, breath_dam_div6, 450, &dam_max0);
7249                                 if (f4 & RF4_BR_CHAO) spell_damcalc(m_ptr, GF_CHAOS, breath_dam_div6, 600, &dam_max0);
7250                                 if (f4 & RF4_BR_DISE) spell_damcalc(m_ptr, GF_DISENCHANT, breath_dam_div6, 500, &dam_max0);
7251                                 if (f4 & RF4_BR_NEXU) spell_damcalc(m_ptr, GF_NEXUS, breath_dam_div3, 250, &dam_max0);
7252                                 if (f4 & RF4_BR_TIME) spell_damcalc(m_ptr, GF_TIME, breath_dam_div3, 150, &dam_max0);
7253                                 if (f4 & RF4_BR_INER) spell_damcalc(m_ptr, GF_INERTIA, breath_dam_div6, 200, &dam_max0);
7254                                 if (f4 & RF4_BR_GRAV) spell_damcalc(m_ptr, GF_GRAVITY, breath_dam_div3, 200, &dam_max0);
7255                                 if (f4 & RF4_BR_SHAR) spell_damcalc(m_ptr, GF_SHARDS, breath_dam_div6, 500, &dam_max0);
7256                                 if (f4 & RF4_BR_PLAS) spell_damcalc(m_ptr, GF_PLASMA, breath_dam_div6, 150, &dam_max0);
7257                                 if (f4 & RF4_BR_WALL) spell_damcalc(m_ptr, GF_FORCE, breath_dam_div6, 200, &dam_max0);
7258                                 if (f4 & RF4_BR_MANA) spell_damcalc(m_ptr, GF_MANA, breath_dam_div3, 250, &dam_max0);
7259                                 if (f4 & RF4_BR_NUKE) spell_damcalc(m_ptr, GF_NUKE, breath_dam_div3, 800, &dam_max0);
7260                                 if (f4 & RF4_BR_DISI) spell_damcalc(m_ptr, GF_DISINTEGRATE, breath_dam_div6, 150, &dam_max0);
7261                         }
7262
7263                         /* Monster melee attacks */
7264                         if (!(r_ptr->flags1 & RF1_NEVER_BLOW) && !(d_info[dungeon_type].flags1 & DF1_NO_MELEE))
7265                         {
7266                                 if (mx <= xx + 1 && mx >= xx - 1 && my <= yy + 1 && my >= yy - 1)
7267                                 {
7268                                         int m;
7269                                         int dam_melee = 0;
7270                                         for (m = 0; m < 4; m++)
7271                                         {
7272                                                 /* Skip non-attacks */
7273                                                 if (!r_ptr->blow[m].method || (r_ptr->blow[m].method == RBM_SHOOT)) continue;
7274
7275                                                 /* Extract the attack info */
7276                                                 dam_melee += blow_damcalc(m_ptr, &r_ptr->blow[m]);
7277                                                 if (r_ptr->blow[m].method == RBM_EXPLODE) break;
7278                                         }
7279                                         if (dam_melee > dam_max0) dam_max0 = dam_melee;
7280                                 }
7281                         }
7282
7283                         /* Contribution from this monster */
7284                         dam_max += dam_max0;
7285                 }
7286         }
7287
7288         /* Prevent excessive warning */
7289         if (dam_max > old_damage)
7290         {
7291                 old_damage = dam_max * 3 / 2;
7292
7293                 if (dam_max > p_ptr->chp / 2)
7294                 {
7295                         object_type *o_ptr = choose_warning_item();
7296
7297                         if (o_ptr) object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7298 #ifdef JP
7299                         else strcpy(o_name, "ÂÎ"); /* Warning ability without item */
7300                         msg_format("%s¤¬±Ô¤¯¿Ì¤¨¤¿¡ª", o_name);
7301 #else
7302                         else strcpy(o_name, "body"); /* Warning ability without item */
7303                         msg_format("Your %s pulsates sharply!", o_name);
7304 #endif
7305                         disturb(0, 1);
7306 #ifdef JP
7307                         return get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©");
7308 #else
7309                         return get_check("Really want to go ahead? ");
7310 #endif
7311                 }
7312         }
7313         else old_damage = old_damage / 2;
7314
7315         c_ptr = &cave[yy][xx];
7316         if (((!easy_disarm && is_trap(c_ptr->feat))
7317             || (c_ptr->mimic && is_trap(c_ptr->feat))) && !one_in_(13))
7318         {
7319                 object_type *o_ptr = choose_warning_item();
7320
7321                 if (o_ptr) object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7322 #ifdef JP
7323                 else strcpy(o_name, "ÂÎ"); /* Warning ability without item */
7324                 msg_format("%s¤¬¿Ì¤¨¤¿¡ª", o_name);
7325 #else
7326                 else strcpy(o_name, "body"); /* Warning ability without item */
7327                 msg_format("Your %s pulsates!", o_name);
7328 #endif
7329                 disturb(0, 1);
7330 #ifdef JP
7331                 return get_check("ËÜÅö¤Ë¤³¤Î¤Þ¤Þ¿Ê¤à¤«¡©");
7332 #else
7333                 return get_check("Really want to go ahead? ");
7334 #endif
7335         }
7336
7337         return TRUE;
7338 }
7339
7340
7341 static bool item_tester_hook_melee_ammo(object_type *o_ptr)
7342 {
7343         switch (o_ptr->tval)
7344         {
7345                 case TV_HAFTED:
7346                 case TV_POLEARM:
7347                 case TV_DIGGING:
7348                 case TV_BOLT:
7349                 case TV_ARROW:
7350                 case TV_SHOT:
7351                 {
7352                         return (TRUE);
7353                 }
7354                 case TV_SWORD:
7355                 {
7356                         if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
7357                 }
7358         }
7359
7360         return (FALSE);
7361 }
7362
7363
7364 /*
7365  *  A structure for smithing
7366  */
7367 typedef struct {
7368         int add;       /* TR flag number or special essence id */
7369         cptr add_name; /* Name of this ability */
7370         int type;      /* Menu number */
7371         int essence;   /* Index for carrying essences */
7372         int value;     /* Needed value to add this ability */
7373 } essence_type;
7374
7375
7376 /*
7377  *  Smithing type data for Weapon smith
7378  */
7379 #ifdef JP
7380 static essence_type essence_info[] = 
7381 {
7382         {TR_STR, "ÏÓÎÏ", 4, TR_STR, 20},
7383         {TR_INT, "ÃÎǽ", 4, TR_INT, 20},
7384         {TR_WIS, "¸­¤µ", 4, TR_WIS, 20},
7385         {TR_DEX, "´ïÍѤµ", 4, TR_DEX, 20},
7386         {TR_CON, "Âѵ×ÎÏ", 4, TR_CON, 20},
7387         {TR_CHR, "Ì¥ÎÏ", 4, TR_CHR, 20},
7388         {TR_MAGIC_MASTERY, "ËâÎÏ»ÙÇÛ", 4, TR_MAGIC_MASTERY, 20},
7389         {TR_STEALTH, "±£Ì©", 4, TR_STEALTH, 40},
7390         {TR_SEARCH, "õº÷", 4, TR_SEARCH, 15},
7391         {TR_INFRA, "ÀÖ³°Àþ»ëÎÏ", 4, TR_INFRA, 15},
7392         {TR_TUNNEL, "ºÎ·¡", 4, TR_TUNNEL, 15},
7393         {TR_SPEED, "¥¹¥Ô¡¼¥É", 4, TR_SPEED, 12},
7394         {TR_BLOWS, "Äɲù¶·â", 1, TR_BLOWS, 20},
7395         {TR_CHAOTIC, "¥«¥ª¥¹¹¶·â", 1, TR_CHAOTIC, 15},
7396         {TR_VAMPIRIC, "µÛ·ì¹¶·â", 1, TR_VAMPIRIC, 60},
7397         {TR_IMPACT, "ÃÏ¿Ìȯư", 7, TR_IMPACT, 15},
7398         {TR_BRAND_POIS, "ÆÇ»¦", 1, TR_BRAND_POIS, 20},
7399         {TR_BRAND_ACID, "Íϲò", 1, TR_BRAND_ACID, 20},
7400         {TR_BRAND_ELEC, "ÅÅ·â", 1, TR_BRAND_ELEC, 20},
7401         {TR_BRAND_FIRE, "¾Æ´þ", 1, TR_BRAND_FIRE, 20},
7402         {TR_BRAND_COLD, "Åà·ë", 1, TR_BRAND_COLD, 20},
7403         {TR_SUST_STR, "ÏÓÎÏ°Ý»ý", 3, TR_SUST_STR, 15},
7404         {TR_SUST_INT, "ÃÎǽ°Ý»ý", 3, TR_SUST_STR, 15},
7405         {TR_SUST_WIS, "¸­¤µ°Ý»ý", 3, TR_SUST_STR, 15},
7406         {TR_SUST_DEX, "´ïÍѤµ°Ý»ý", 3, TR_SUST_STR, 15},
7407         {TR_SUST_CON, "Âѵ×ÎÏ°Ý»ý", 3, TR_SUST_STR, 15},
7408         {TR_SUST_CHR, "Ì¥ÎÏ°Ý»ý", 3, TR_SUST_STR, 15},
7409         {TR_IM_ACID, "»ÀÌȱÖ", 2, TR_IM_ACID, 20},
7410         {TR_IM_ELEC, "ÅÅ·âÌȱÖ", 2, TR_IM_ACID, 20},
7411         {TR_IM_FIRE, "²Ð±êÌȱÖ", 2, TR_IM_ACID, 20},
7412         {TR_IM_COLD, "Î䵤ÌȱÖ", 2, TR_IM_ACID, 20},
7413         {TR_REFLECT, "È¿¼Í", 2, TR_REFLECT, 20},
7414         {TR_FREE_ACT, "ËãáãÃΤ餺", 3, TR_FREE_ACT, 20},
7415         {TR_HOLD_LIFE, "À¸Ì¿ÎÏ°Ý»ý", 3, TR_HOLD_LIFE, 20},
7416         {TR_RES_ACID, "ÂÑ»À", 2, TR_RES_ACID, 15},
7417         {TR_RES_ELEC, "ÂÑÅÅ·â", 2, TR_RES_ELEC, 15},
7418         {TR_RES_FIRE, "ÂѲбê", 2, TR_RES_FIRE, 15},
7419         {TR_RES_COLD, "ÂÑÎ䵤", 2, TR_RES_COLD, 15},
7420         {TR_RES_POIS, "ÂÑÆÇ", 2, TR_RES_POIS, 25},
7421         {TR_RES_FEAR, "ÂѶ²ÉÝ", 2, TR_RES_FEAR, 20},
7422         {TR_RES_LITE, "ÂÑÁ®¸÷", 2, TR_RES_LITE, 20},
7423         {TR_RES_DARK, "ÂѰŹõ", 2, TR_RES_DARK, 20},
7424         {TR_RES_BLIND, "ÂÑÌÕÌÜ", 2, TR_RES_BLIND, 20},
7425         {TR_RES_CONF, "ÂѺ®Íð", 2, TR_RES_CONF, 20},
7426         {TR_RES_SOUND, "Âѹ첻", 2, TR_RES_SOUND, 20},
7427         {TR_RES_SHARDS, "ÂÑÇËÊÒ", 2, TR_RES_SHARDS, 20},
7428         {TR_RES_NETHER, "ÂÑÃϹö", 2, TR_RES_NETHER, 20},
7429         {TR_RES_NEXUS, "ÂÑ°ø²Ìº®Íð", 2, TR_RES_NEXUS, 20},
7430         {TR_RES_CHAOS, "ÂÑ¥«¥ª¥¹", 2, TR_RES_CHAOS, 20},
7431         {TR_RES_DISEN, "ÂÑÎô²½", 2, TR_RES_DISEN, 20},
7432         {TR_SH_FIRE, "", 0, -2, 0},
7433         {TR_SH_ELEC, "", 0, -2, 0},
7434         {TR_SH_COLD, "", 0, -2, 0},
7435         {TR_NO_MAGIC, "È¿ËâË¡", 3, TR_NO_MAGIC, 15},
7436         {TR_WARNING, "·Ù¹ð", 3, TR_WARNING, 20},
7437         {TR_LEVITATION, "ÉâÍ·", 3, TR_LEVITATION, 20},
7438         {TR_LITE_1, "±Êµ×¸÷¸»", 3, TR_LITE_1, 15},
7439         {TR_LITE_2, "", 0, -2, 0},
7440         {TR_LITE_3, "", 0, -2, 0},
7441         {TR_SEE_INVIS, "²Ä»ëÆ©ÌÀ", 3, TR_SEE_INVIS, 20},
7442         {TR_TELEPATHY, "¥Æ¥ì¥Ñ¥·¡¼", 6, TR_TELEPATHY, 15},
7443         {TR_SLOW_DIGEST, "Ãپò½", 3, TR_SLOW_DIGEST, 15},
7444         {TR_REGEN, "µÞ®²óÉü", 3, TR_REGEN, 20},
7445         {TR_TELEPORT, "¥Æ¥ì¥Ý¡¼¥È", 3, TR_TELEPORT, 25},
7446
7447         {TR_SLAY_EVIL, "¼Ù°­ÇÜÂÇ", 5, TR_SLAY_EVIL, 100},
7448         {TR_KILL_EVIL, "¼Ù°­ÇÜÇÜÂÇ", 0, TR_SLAY_EVIL, 60},
7449         {TR_SLAY_ANIMAL, "ưʪÇÜÂÇ", 5, TR_SLAY_ANIMAL, 20},
7450         {TR_KILL_ANIMAL, "ưʪÇÜÇÜÂÇ", 5, TR_SLAY_ANIMAL, 60},
7451         {TR_SLAY_UNDEAD, "ÉÔ»àÇÜÂÇ", 5, TR_SLAY_UNDEAD, 20},
7452         {TR_KILL_UNDEAD, "ÉÔ»àÇÜÇÜÂÇ", 5, TR_SLAY_UNDEAD, 60},
7453         {TR_SLAY_DEMON, "°­ËâÇÜÂÇ", 5, TR_SLAY_DEMON, 20},
7454         {TR_KILL_DEMON, "°­ËâÇÜÇÜÂÇ", 5, TR_SLAY_DEMON, 60},
7455         {TR_SLAY_ORC, "¥ª¡¼¥¯ÇÜÂÇ", 5, TR_SLAY_ORC, 15},
7456         {TR_KILL_ORC, "¥ª¡¼¥¯ÇÜÇÜÂÇ", 5, TR_SLAY_ORC, 60},
7457         {TR_SLAY_TROLL, "¥È¥í¥ëÇÜÂÇ", 5, TR_SLAY_TROLL, 15},
7458         {TR_KILL_TROLL, "¥È¥í¥ëÇÜÇÜÂÇ", 5, TR_SLAY_TROLL, 60},
7459         {TR_SLAY_GIANT, "µð¿ÍÇÜÂÇ", 5, TR_SLAY_GIANT, 20},
7460         {TR_KILL_GIANT, "µð¿ÍÇÜÇÜÂÇ", 5, TR_SLAY_GIANT, 60},       
7461         {TR_SLAY_DRAGON, "εÇÜÂÇ", 5, TR_SLAY_DRAGON, 20},
7462         {TR_KILL_DRAGON, "εÇÜÇÜÂÇ", 5, TR_SLAY_DRAGON, 60},
7463         {TR_SLAY_HUMAN, "¿Í´ÖÇÜÂÇ", 5, TR_SLAY_HUMAN, 20},
7464         {TR_KILL_HUMAN, "¿Í´ÖÇÜÇÜÂÇ", 5, TR_SLAY_HUMAN, 60},
7465
7466         {TR_ESP_ANIMAL, "ưʪESP", 6, TR_SLAY_ANIMAL, 40},
7467         {TR_ESP_UNDEAD, "ÉÔ»àESP", 6, TR_SLAY_UNDEAD, 40}, 
7468         {TR_ESP_DEMON, "°­ËâESP", 6, TR_SLAY_DEMON, 40},       
7469         {TR_ESP_ORC, "¥ª¡¼¥¯ESP", 6, TR_SLAY_ORC, 40},     
7470         {TR_ESP_TROLL, "¥È¥í¥ëESP", 6, TR_SLAY_TROLL, 40},   
7471         {TR_ESP_GIANT, "µð¿ÍESP", 6, TR_SLAY_GIANT, 40},       
7472         {TR_ESP_DRAGON, "εESP", 6, TR_SLAY_DRAGON, 40},
7473         {TR_ESP_HUMAN, "¿Í´ÖESP", 6, TR_SLAY_HUMAN, 40},
7474
7475         {ESSENCE_ATTACK, "¹¶·â", 10, TR_ES_ATTACK, 30},
7476         {ESSENCE_AC, "Ëɸæ", 10, TR_ES_AC, 15},
7477         {ESSENCE_TMP_RES_ACID, "»ÀÂÑÀ­È¯Æ°", 7, TR_RES_ACID, 50},
7478         {ESSENCE_TMP_RES_ELEC, "ÅÅ·âÂÑÀ­È¯Æ°", 7, TR_RES_ELEC, 50},
7479         {ESSENCE_TMP_RES_FIRE, "²Ð±êÂÑÀ­È¯Æ°", 7, TR_RES_FIRE, 50},
7480         {ESSENCE_TMP_RES_COLD, "Î䵤ÂÑÀ­È¯Æ°", 7, TR_RES_COLD, 50},
7481         {ESSENCE_SH_FIRE, "²Ð±ê¥ª¡¼¥é", 7, -1, 50},
7482         {ESSENCE_SH_ELEC, "Åŷ⥪¡¼¥é", 7, -1, 50},
7483         {ESSENCE_SH_COLD, "Î䵤¥ª¡¼¥é", 7, -1, 50},
7484         {ESSENCE_RESISTANCE, "Á´ÂÑÀ­", 2, -1, 150},
7485         {ESSENCE_SUSTAIN, "ÁõÈ÷ÊÝ»ý", 10, -1, 10},
7486         {ESSENCE_SLAY_GLOVE, "»¦Ù¤¤Î¾®¼ê", 1, TR_ES_ATTACK, 200},
7487
7488         {-1, NULL, 0, -1, 0}
7489 };
7490 #else
7491 static essence_type essence_info[] = 
7492 {
7493         {TR_STR, "strength", 4, TR_STR, 20},
7494         {TR_INT, "intelligence", 4, TR_INT, 20},
7495         {TR_WIS, "wisdom", 4, TR_WIS, 20},
7496         {TR_DEX, "dexterity", 4, TR_DEX, 20},
7497         {TR_CON, "constitution", 4, TR_CON, 20},
7498         {TR_CHR, "charisma", 4, TR_CHR, 20},
7499         {TR_MAGIC_MASTERY, "magic mastery", 4, TR_MAGIC_MASTERY, 20},
7500         {TR_STEALTH, "stealth", 4, TR_STEALTH, 40},
7501         {TR_SEARCH, "serching", 4, TR_SEARCH, 15},
7502         {TR_INFRA, "infravision", 4, TR_INFRA, 15},
7503         {TR_TUNNEL, "digging", 4, TR_TUNNEL, 15},
7504         {TR_SPEED, "speed", 4, TR_SPEED, 12},
7505         {TR_BLOWS, "extra attack", 1, TR_BLOWS, 20},
7506         {TR_CHAOTIC, "chaos brand", 1, TR_CHAOTIC, 15},
7507         {TR_VAMPIRIC, "vampiric brand", 1, TR_VAMPIRIC, 60},
7508         {TR_IMPACT, "quake activation", 7, TR_IMPACT, 15},
7509         {TR_BRAND_POIS, "poison brand", 1, TR_BRAND_POIS, 20},
7510         {TR_BRAND_ACID, "acid brand", 1, TR_BRAND_ACID, 20},
7511         {TR_BRAND_ELEC, "electric brand", 1, TR_BRAND_ELEC, 20},
7512         {TR_BRAND_FIRE, "fire brand", 1, TR_BRAND_FIRE, 20},
7513         {TR_BRAND_COLD, "cold brand", 1, TR_BRAND_COLD, 20},
7514         {TR_SUST_STR, "sustain strength", 3, TR_SUST_STR, 15},
7515         {TR_SUST_INT, "sustain intelligence", 3, TR_SUST_STR, 15},
7516         {TR_SUST_WIS, "sustain wisdom", 3, TR_SUST_STR, 15},
7517         {TR_SUST_DEX, "sustain dexterity", 3, TR_SUST_STR, 15},
7518         {TR_SUST_CON, "sustain constitution", 3, TR_SUST_STR, 15},
7519         {TR_SUST_CHR, "sustain charisma", 3, TR_SUST_STR, 15},
7520         {TR_IM_ACID, "acid immunity", 2, TR_IM_ACID, 20},
7521         {TR_IM_ELEC, "electric immunity", 2, TR_IM_ACID, 20},
7522         {TR_IM_FIRE, "fire immunity", 2, TR_IM_ACID, 20},
7523         {TR_IM_COLD, "cold immunity", 2, TR_IM_ACID, 20},
7524         {TR_REFLECT, "reflection", 2, TR_REFLECT, 20},
7525         {TR_FREE_ACT, "free action", 3, TR_FREE_ACT, 20},
7526         {TR_HOLD_LIFE, "hold life", 3, TR_HOLD_LIFE, 20},
7527         {TR_RES_ACID, "resistance to acid", 2, TR_RES_ACID, 15},
7528         {TR_RES_ELEC, "resistance to electric", 2, TR_RES_ELEC, 15},
7529         {TR_RES_FIRE, "resistance to fire", 2, TR_RES_FIRE, 15},
7530         {TR_RES_COLD, "resistance to cold", 2, TR_RES_COLD, 15},
7531         {TR_RES_POIS, "resistance to poison", 2, TR_RES_POIS, 25},
7532         {TR_RES_FEAR, "resistance to fear", 2, TR_RES_FEAR, 20},
7533         {TR_RES_LITE, "resistance to light", 2, TR_RES_LITE, 20},
7534         {TR_RES_DARK, "resistance to dark", 2, TR_RES_DARK, 20},
7535         {TR_RES_BLIND, "resistance to blind", 2, TR_RES_BLIND, 20},
7536         {TR_RES_CONF, "resistance to confusion", 2, TR_RES_CONF, 20},
7537         {TR_RES_SOUND, "resistance to sound", 2, TR_RES_SOUND, 20},
7538         {TR_RES_SHARDS, "resistance to shard", 2, TR_RES_SHARDS, 20},
7539         {TR_RES_NETHER, "resistance to nether", 2, TR_RES_NETHER, 20},
7540         {TR_RES_NEXUS, "resistance to nexus", 2, TR_RES_NEXUS, 20},
7541         {TR_RES_CHAOS, "resistance to chaos", 2, TR_RES_CHAOS, 20},
7542         {TR_RES_DISEN, "resistance to disenchantment", 2, TR_RES_DISEN, 20},
7543         {TR_SH_FIRE, "", 0, -2, 0},
7544         {TR_SH_ELEC, "", 0, -2, 0},
7545         {TR_SH_COLD, "", 0, -2, 0},
7546         {TR_NO_MAGIC, "anti magic", 3, TR_NO_MAGIC, 15},
7547         {TR_WARNING, "warning", 3, TR_WARNING, 20},
7548         {TR_LEVITATION, "levitation", 3, TR_LEVITATION, 20},
7549         {TR_LITE_1, "permanent light", 3, TR_LITE_1, 15},
7550         {TR_LITE_2, "", 0, -2, 0},
7551         {TR_LITE_3, "", 0, -2, 0},
7552         {TR_SEE_INVIS, "see invisible", 3, TR_SEE_INVIS, 20},
7553         {TR_TELEPATHY, "telepathy", 6, TR_TELEPATHY, 15},
7554         {TR_SLOW_DIGEST, "slow digestion", 3, TR_SLOW_DIGEST, 15},
7555         {TR_REGEN, "regeneration", 3, TR_REGEN, 20},
7556         {TR_TELEPORT, "teleport", 3, TR_TELEPORT, 25},
7557
7558         {TR_SLAY_EVIL, "slay evil", 5, TR_SLAY_EVIL, 100},
7559         {TR_SLAY_ANIMAL, "slay animal", 5, TR_SLAY_ANIMAL, 20},
7560         {TR_KILL_ANIMAL, "kill animal", 5, TR_SLAY_ANIMAL, 60},
7561         {TR_KILL_EVIL, "kill evil", 0, TR_SLAY_EVIL, 60},
7562         {TR_SLAY_UNDEAD, "slay undead", 5, TR_SLAY_UNDEAD, 20},
7563         {TR_KILL_UNDEAD, "kill undead", 5, TR_SLAY_UNDEAD, 60},
7564         {TR_SLAY_DEMON, "slay demon", 5, TR_SLAY_DEMON, 20},
7565         {TR_KILL_DEMON, "kill demon", 5, TR_SLAY_DEMON, 60},
7566         {TR_SLAY_ORC, "slay orc", 5, TR_SLAY_ORC, 15},
7567         {TR_KILL_ORC, "kill orc", 5, TR_SLAY_ORC, 60},
7568         {TR_SLAY_TROLL, "slay troll", 5, TR_SLAY_TROLL, 15},
7569         {TR_KILL_TROLL, "kill troll", 5, TR_SLAY_TROLL, 60},
7570         {TR_SLAY_GIANT, "slay giant", 5, TR_SLAY_GIANT, 20},
7571         {TR_KILL_GIANT, "kill giant", 5, TR_SLAY_GIANT, 60},       
7572         {TR_SLAY_DRAGON, "slay dragon", 5, TR_SLAY_DRAGON, 20},
7573         {TR_KILL_DRAGON, "kill dragon", 5, TR_SLAY_DRAGON, 60},
7574         {TR_SLAY_HUMAN, "slay human", 5, TR_SLAY_HUMAN, 20},
7575         {TR_KILL_HUMAN, "kill human", 5, TR_SLAY_HUMAN, 60},
7576
7577         {TR_ESP_ANIMAL, "sense animal", 6, TR_SLAY_ANIMAL, 40},
7578         {TR_ESP_UNDEAD, "sense undead", 6, TR_SLAY_UNDEAD, 40}, 
7579         {TR_ESP_DEMON, "sense demon", 6, TR_SLAY_DEMON, 40},       
7580         {TR_ESP_ORC, "sense orc", 6, TR_SLAY_ORC, 40},     
7581         {TR_ESP_TROLL, "sense troll", 6, TR_SLAY_TROLL, 40},   
7582         {TR_ESP_GIANT, "sense giant", 6, TR_SLAY_GIANT, 40},       
7583         {TR_ESP_DRAGON, "sense dragon", 6, TR_SLAY_DRAGON, 40},
7584         {TR_ESP_HUMAN, "sense human", 6, TR_SLAY_HUMAN, 40},
7585
7586         {ESSENCE_ATTACK, "weapon enchant", 10, TR_ES_ATTACK, 30},
7587         {ESSENCE_AC, "armor enchant", 10, TR_ES_AC, 15},
7588         {ESSENCE_TMP_RES_ACID, "resist acid activation", 7, TR_RES_ACID, 50},
7589         {ESSENCE_TMP_RES_ELEC, "resist electricity activation", 7, TR_RES_ELEC, 50},
7590         {ESSENCE_TMP_RES_FIRE, "resist fire activation", 7, TR_RES_FIRE, 50},
7591         {ESSENCE_TMP_RES_COLD, "resist cold activation", 7, TR_RES_COLD, 50},
7592         {ESSENCE_SH_FIRE, "fiery sheath", 7, -1, 50},
7593         {ESSENCE_SH_ELEC, "electric sheath", 7, -1, 50},
7594         {ESSENCE_SH_COLD, "sheath of coldness", 7, -1, 50},
7595         {ESSENCE_RESISTANCE, "resistance", 2, -1, 150},
7596         {ESSENCE_SUSTAIN, "elements proof", 10, -1, 10},
7597         {ESSENCE_SLAY_GLOVE, "gauntlets of slaying", 1, TR_ES_ATTACK, 200},
7598
7599         {-1, NULL, 0, -1, 0}
7600 };
7601 #endif
7602
7603
7604 /*
7605  *  Essense names for Weapon smith
7606  */
7607 #ifdef JP
7608 cptr essence_name[] = 
7609 {
7610         "ÏÓÎÏ",
7611         "ÃÎǽ",
7612         "¸­¤µ",
7613         "´ïÍѤµ",
7614         "Âѵ×ÎÏ",
7615         "Ì¥ÎÏ",
7616         "ËâÎÏ»ÙÇÛ",
7617         "",
7618         "±£Ì©",
7619         "õº÷",
7620         "ÀÖ³°Àþ»ëÎÏ",
7621         "ºÎ·¡",
7622         "¥¹¥Ô¡¼¥É",
7623         "Äɲù¶·â",
7624         "¥«¥ª¥¹¹¶·â",
7625         "µÛ·ì¹¶·â",
7626         "ưʪÇÜÂÇ",
7627         "¼Ù°­ÇÜÂÇ",
7628         "ÉÔ»àÇÜÂÇ",
7629         "°­ËâÇÜÂÇ",
7630         "¥ª¡¼¥¯ÇÜÂÇ",
7631         "¥È¥í¥ëÇÜÂÇ",
7632         "µð¿ÍÇÜÂÇ",
7633         "εÇÜÂÇ",
7634         "",
7635         "",
7636         "ÃÏ¿Ì",
7637         "ÆÇ»¦",
7638         "Íϲò",
7639         "ÅÅ·â",
7640         "¾Æ´þ",
7641         "Åà·ë",
7642         "ǽÎÏ°Ý»ý",
7643         "",
7644         "",
7645         "",
7646         "",
7647         "",
7648         "",
7649         "",
7650         "ÌȱÖ",
7651         "",
7652         "",
7653         "",
7654         "",
7655         "È¿¼Í",
7656         "ËãáãÃΤ餺",
7657         "À¸Ì¿ÎÏ°Ý»ý",
7658         "ÂÑ»À",
7659         "ÂÑÅÅ·â",
7660         "ÂѲбê",
7661         "ÂÑÎ䵤",
7662         "ÂÑÆÇ",
7663         "ÂѶ²ÉÝ",
7664         "ÂÑÁ®¸÷",
7665         "ÂѰŹõ",
7666         "ÂÑÌÕÌÜ",
7667         "ÂѺ®Íð",
7668         "Âѹ첻",
7669         "ÂÑÇËÊÒ",
7670         "ÂÑÃϹö",
7671         "ÂÑ°ø²Ìº®Íð",
7672         "ÂÑ¥«¥ª¥¹",
7673         "ÂÑÎô²½",
7674         "",
7675         "",
7676         "¿Í´ÖÇÜÂÇ",
7677         "",
7678         "",
7679         "È¿ËâË¡",
7680         "",
7681         "",
7682         "·Ù¹ð",
7683         "",
7684         "",
7685         "",
7686         "ÉâÍ·",
7687         "±Êµ×¸÷¸»",
7688         "²Ä»ëÆ©ÌÀ",
7689         "¥Æ¥ì¥Ñ¥·¡¼",
7690         "Ãپò½",
7691         "µÞ®²óÉü",
7692         "",
7693         "",
7694         "",
7695         "",
7696         "",
7697         "",
7698         "",
7699         "",
7700         "¥Æ¥ì¥Ý¡¼¥È",
7701         "",
7702         "",
7703         "¹¶·â",
7704         "Ëɸæ",
7705
7706         NULL
7707 };
7708
7709 #else
7710
7711 static cptr essence_name[] = 
7712 {
7713         "strength",
7714         "intelligen.",
7715         "wisdom",
7716         "dexterity",
7717         "constitut.",
7718         "charisma",
7719         "magic mast.",
7720         "",
7721         "stealth",
7722         "serching",
7723         "infravision",
7724         "digging",
7725         "speed",
7726         "extra atk",
7727         "chaos brand",
7728         "vampiric",
7729         "slay animal",
7730         "slay evil",
7731         "slay undead",
7732         "slay demon",
7733         "slay orc",
7734         "slay troll",
7735         "slay giant",
7736         "slay dragon",
7737         "",
7738         "",
7739         "quake",
7740         "pois. brand",
7741         "acid brand",
7742         "elec. brand",
7743         "fire brand",
7744         "cold brand",
7745         "sustain",
7746         "",
7747         "",
7748         "",
7749         "",
7750         "",
7751         "",
7752         "",
7753         "immunity",
7754         "",
7755         "",
7756         "",
7757         "",
7758         "reflection",
7759         "free action",
7760         "hold life",
7761         "res. acid",
7762         "res. elec.",
7763         "res. fire",
7764         "res. cold",
7765         "res. poison",
7766         "res. fear",
7767         "res. light",
7768         "res. dark",
7769         "res. blind",
7770         "res.confuse",
7771         "res. sound",
7772         "res. shard",
7773         "res. nether",
7774         "res. nexus",
7775         "res. chaos",
7776         "res. disen.",
7777         "",
7778         "",
7779         "slay human",
7780         "",
7781         "",
7782         "anti magic",
7783         "",
7784         "",
7785         "warning",
7786         "",
7787         "",
7788         "",
7789         "levitation",
7790         "perm. light",
7791         "see invis.",
7792         "telepathy",
7793         "slow dige.",
7794         "regen.",
7795         "",
7796         "",
7797         "",
7798         "",
7799         "",
7800         "",
7801         "",
7802         "",
7803         "teleport",
7804         "",
7805         "",
7806         "weapon enc.",
7807         "armor enc.",
7808
7809         NULL
7810 };
7811 #endif
7812
7813
7814 static void display_essence(void)
7815 {
7816         int i, num = 0;
7817
7818         screen_save();
7819         for (i = 1; i < 22; i++)
7820         {
7821                 prt("",i,0);
7822         }
7823 #ifdef JP
7824         prt("¥¨¥Ã¥»¥ó¥¹   ¸Ä¿ô     ¥¨¥Ã¥»¥ó¥¹   ¸Ä¿ô     ¥¨¥Ã¥»¥ó¥¹   ¸Ä¿ô", 1, 8);
7825 #else
7826         prt("Essence      Num      Essence      Num      Essence      Num ", 1, 8);
7827 #endif
7828         for (i = 0; essence_name[i]; i++)
7829         {
7830                 if (!essence_name[i][0]) continue;
7831                 prt(format("%-11s %5d", essence_name[i], p_ptr->magic_num1[i]), 2+num%21, 8+num/21*22);
7832                 num++;
7833         }
7834 #ifdef JP
7835         prt("¸½ºß½ê»ý¤·¤Æ¤¤¤ë¥¨¥Ã¥»¥ó¥¹", 0, 0);
7836 #else
7837         prt("List of all essences you have.", 0, 0);
7838 #endif
7839         (void)inkey();
7840         screen_load();
7841         return;
7842 }
7843
7844 static void drain_essence(void)
7845 {
7846         int drain_value[sizeof(p_ptr->magic_num1) / sizeof(s32b)];
7847         int i, item;
7848         int dec = 4;
7849         bool observe = FALSE;
7850         int old_ds, old_dd, old_to_h, old_to_d, old_ac, old_to_a, old_pval, old_name2, old_timeout;
7851         u32b old_flgs[TR_FLAG_SIZE], new_flgs[TR_FLAG_SIZE];
7852         object_type *o_ptr;
7853         cptr            q, s;
7854         byte iy, ix, marked, number;
7855         s16b next_o_idx, weight;
7856
7857         for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
7858                 drain_value[i] = 0;
7859
7860         item_tester_hook = object_is_weapon_armour_ammo;
7861         item_tester_no_ryoute = TRUE;
7862
7863         /* Get an item */
7864 #ifdef JP
7865         q = "¤É¤Î¥¢¥¤¥Æ¥à¤«¤éÃê½Ð¤·¤Þ¤¹¤«¡©";
7866         s = "Ãê½Ð¤Ç¤­¤ë¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
7867 #else
7868         q = "Extract from which item? ";
7869         s = "You have nothing you can extract from.";
7870 #endif
7871
7872         if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
7873
7874         /* Get the item (in the pack) */
7875         if (item >= 0)
7876         {
7877                 o_ptr = &inventory[item];
7878         }
7879
7880         /* Get the item (on the floor) */
7881         else
7882         {
7883                 o_ptr = &o_list[0 - item];
7884         }
7885
7886         if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
7887         {
7888                 char o_name[MAX_NLEN];
7889                 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
7890 #ifdef JP
7891                 if (!get_check(format("ËÜÅö¤Ë%s¤«¤éÃê½Ð¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«¡©", o_name))) return;
7892 #else
7893                 if (!get_check(format("Really extract from %s? ", o_name))) return;
7894 #endif
7895         }
7896
7897         energy_use = 100;
7898
7899         object_flags(o_ptr, old_flgs);
7900         if (have_flag(old_flgs, TR_KILL_DRAGON)) add_flag(old_flgs, TR_SLAY_DRAGON);
7901         if (have_flag(old_flgs, TR_KILL_ANIMAL)) add_flag(old_flgs, TR_SLAY_ANIMAL);
7902         if (have_flag(old_flgs, TR_KILL_EVIL)) add_flag(old_flgs, TR_SLAY_EVIL);
7903         if (have_flag(old_flgs, TR_KILL_UNDEAD)) add_flag(old_flgs, TR_SLAY_UNDEAD);
7904         if (have_flag(old_flgs, TR_KILL_DEMON)) add_flag(old_flgs, TR_SLAY_DEMON);
7905         if (have_flag(old_flgs, TR_KILL_ORC)) add_flag(old_flgs, TR_SLAY_ORC);
7906         if (have_flag(old_flgs, TR_KILL_TROLL)) add_flag(old_flgs, TR_SLAY_TROLL);
7907         if (have_flag(old_flgs, TR_KILL_GIANT)) add_flag(old_flgs, TR_SLAY_GIANT);
7908         if (have_flag(old_flgs, TR_KILL_HUMAN)) add_flag(old_flgs, TR_SLAY_HUMAN);
7909
7910         old_to_a = o_ptr->to_a;
7911         old_ac = o_ptr->ac;
7912         old_to_h = o_ptr->to_h;
7913         old_to_d = o_ptr->to_d;
7914         old_ds = o_ptr->ds;
7915         old_dd = o_ptr->dd;
7916         old_pval = o_ptr->pval;
7917         old_name2 = o_ptr->name2;
7918         old_timeout = o_ptr->timeout;
7919         if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
7920         if (have_flag(old_flgs, TR_ADD_L_CURSE)) dec--;
7921         if (have_flag(old_flgs, TR_ADD_H_CURSE)) dec--;
7922         if (have_flag(old_flgs, TR_AGGRAVATE)) dec--;
7923         if (have_flag(old_flgs, TR_NO_TELE)) dec--;
7924         if (have_flag(old_flgs, TR_DRAIN_EXP)) dec--;
7925         if (have_flag(old_flgs, TR_DRAIN_HP)) dec--;
7926         if (have_flag(old_flgs, TR_DRAIN_MANA)) dec--;
7927         if (have_flag(old_flgs, TR_CALL_ANIMAL)) dec--;
7928         if (have_flag(old_flgs, TR_CALL_DEMON)) dec--;
7929         if (have_flag(old_flgs, TR_CALL_DRAGON)) dec--;
7930         if (have_flag(old_flgs, TR_CALL_UNDEAD)) dec--;
7931         if (have_flag(old_flgs, TR_COWARDICE)) dec--;
7932         if (have_flag(old_flgs, TR_LOW_MELEE)) dec--;
7933         if (have_flag(old_flgs, TR_LOW_AC)) dec--;
7934         if (have_flag(old_flgs, TR_LOW_MAGIC)) dec--;
7935         if (have_flag(old_flgs, TR_FAST_DIGEST)) dec--;
7936         if (have_flag(old_flgs, TR_SLOW_REGEN)) dec--;
7937         if (have_flag(old_flgs, TR_TY_CURSE)) dec--;
7938         
7939         iy = o_ptr->iy;
7940         ix = o_ptr->ix;
7941         next_o_idx = o_ptr->next_o_idx;
7942         marked = o_ptr->marked;
7943         weight = o_ptr->weight;
7944         number = o_ptr->number;
7945
7946         object_prep(o_ptr, o_ptr->k_idx);
7947
7948         o_ptr->iy=iy;
7949         o_ptr->ix=ix;
7950         o_ptr->next_o_idx=next_o_idx;
7951         o_ptr->marked=marked;
7952         o_ptr->number = number;
7953         if (o_ptr->tval == TV_DRAG_ARMOR) o_ptr->timeout = old_timeout;
7954         if (item >= 0) p_ptr->total_weight += (o_ptr->weight*o_ptr->number - weight*number);
7955         o_ptr->ident |= (IDENT_MENTAL);
7956         object_aware(o_ptr);
7957         object_known(o_ptr);
7958
7959         object_flags(o_ptr, new_flgs);
7960
7961         for (i = 0; essence_info[i].add_name; i++)
7962         {
7963                 essence_type *es_ptr = &essence_info[i];
7964                 int pval = 0;
7965
7966                 if (es_ptr->add < TR_FLAG_MAX && is_pval_flag(es_ptr->add) && old_pval)
7967                         pval = (have_flag(new_flgs, es_ptr->add)) ? old_pval - o_ptr->pval : old_pval;
7968
7969                 if (es_ptr->add < TR_FLAG_MAX &&
7970                     (!have_flag(new_flgs, es_ptr->add) || pval) &&
7971                     have_flag(old_flgs, es_ptr->add))
7972                 {
7973                         if (pval)
7974                         {
7975                                 drain_value[es_ptr->essence] += 10 * pval;
7976                         }
7977                         else if (es_ptr->essence != -2)
7978                         {
7979                                 drain_value[es_ptr->essence] += 10;
7980                         }
7981                         else if (es_ptr->add == TR_SH_FIRE)
7982                         {
7983                                 drain_value[TR_BRAND_FIRE] += 10;
7984                                 drain_value[TR_RES_FIRE] += 10;
7985                         }
7986                         else if (es_ptr->add == TR_SH_ELEC)
7987                         {
7988                                 drain_value[TR_BRAND_ELEC] += 10;
7989                                 drain_value[TR_RES_ELEC] += 10;
7990                         }
7991                         else if (es_ptr->add == TR_SH_COLD)
7992                         {
7993                                 drain_value[TR_BRAND_COLD] += 10;
7994                                 drain_value[TR_RES_COLD] += 10;
7995                         }
7996                         else if (es_ptr->add == TR_LITE_2)
7997                         {
7998                                 drain_value[TR_LITE_1] += 20;
7999                         }
8000                         else if (es_ptr->add == TR_LITE_3)
8001                         {
8002                                 drain_value[TR_LITE_1] += 30;
8003                         }
8004                 }
8005         }
8006
8007         if ((have_flag(old_flgs, TR_FORCE_WEAPON)) && !(have_flag(new_flgs, TR_FORCE_WEAPON)))
8008         {
8009                 drain_value[TR_INT] += 5;
8010                 drain_value[TR_WIS] += 5;
8011         }
8012         if ((have_flag(old_flgs, TR_VORPAL)) && !(have_flag(new_flgs, TR_VORPAL)))
8013         {
8014                 drain_value[TR_BRAND_POIS] += 5;
8015                 drain_value[TR_BRAND_ACID] += 5;
8016                 drain_value[TR_BRAND_ELEC] += 5;
8017                 drain_value[TR_BRAND_FIRE] += 5;
8018                 drain_value[TR_BRAND_COLD] += 5;
8019         }
8020         if ((have_flag(old_flgs, TR_DEC_MANA)) && !(have_flag(new_flgs, TR_DEC_MANA)))
8021         {
8022                 drain_value[TR_INT] += 10;
8023         }
8024         if ((have_flag(old_flgs, TR_XTRA_MIGHT)) && !(have_flag(new_flgs, TR_XTRA_MIGHT)))
8025         {
8026                 drain_value[TR_STR] += 10;
8027         }
8028         if ((have_flag(old_flgs, TR_XTRA_SHOTS)) && !(have_flag(new_flgs, TR_XTRA_SHOTS)))
8029         {
8030                 drain_value[TR_DEX] += 10;
8031         }
8032         if (old_name2 == EGO_2WEAPON)
8033         {
8034                 drain_value[TR_DEX] += 20;
8035         }
8036         if (object_is_weapon_ammo(o_ptr))
8037         {
8038                 if (old_ds > o_ptr->ds) drain_value[TR_ES_ATTACK] += (old_ds-o_ptr->ds)*10;
8039
8040                 if (old_dd > o_ptr->dd) drain_value[TR_ES_ATTACK] += (old_dd-o_ptr->dd)*10;
8041         }
8042         if (old_to_h > o_ptr->to_h) drain_value[TR_ES_ATTACK] += (old_to_h-o_ptr->to_h)*10;
8043         if (old_to_d > o_ptr->to_d) drain_value[TR_ES_ATTACK] += (old_to_d-o_ptr->to_d)*10;
8044         if (old_ac > o_ptr->ac) drain_value[TR_ES_AC] += (old_ac-o_ptr->ac)*10;
8045         if (old_to_a > o_ptr->to_a) drain_value[TR_ES_AC] += (old_to_a-o_ptr->to_a)*10;
8046
8047         for (i = 0; i < sizeof(drain_value) / sizeof(int); i++)
8048         {
8049                 drain_value[i] *= number;
8050                 drain_value[i] = drain_value[i] * dec / 4;
8051                 drain_value[i] = MAX(drain_value[i], 0);
8052                 if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) drain_value[i] /= 10;
8053                 if (drain_value[i])
8054                 {
8055                         observe = TRUE;
8056                 }
8057         }
8058         if (!observe)
8059         {
8060                 msg_print(_("¥¨¥Ã¥»¥ó¥¹¤ÏÃê½Ð¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", "You were not able to extract any essence."));
8061         }
8062         else
8063         {
8064                 msg_print(_("Ãê½Ð¤·¤¿¥¨¥Ã¥»¥ó¥¹:", "Extracted essences:"));
8065
8066                 for (i = 0; essence_name[i]; i++)
8067                 {
8068                         if (!essence_name[i][0]) continue;
8069                         if (!drain_value[i]) continue;
8070
8071                         p_ptr->magic_num1[i] += drain_value[i];
8072                         p_ptr->magic_num1[i] = MIN(20000, p_ptr->magic_num1[i]);
8073                         msg_print(NULL);
8074                         msg_format("%s...%d%s", essence_name[i], drain_value[i], _("¡£", ". "));
8075                 }
8076         }
8077
8078         /* Apply autodestroy/inscription to the drained item */
8079         autopick_alter_item(item, TRUE);
8080
8081         /* Combine the pack */
8082         p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8083
8084         /* Window stuff */
8085         p_ptr->window |= (PW_INVEN);
8086 }
8087
8088
8089
8090 static int choose_essence(void)
8091 {
8092         int mode = 0;
8093         char choice;
8094         int menu_line = (use_menu ? 1 : 0);
8095
8096 #ifdef JP
8097         cptr menu_name[] = {
8098                 "Éð´ï°À­", 
8099                 "ÂÑÀ­",
8100                 "ǽÎÏ",
8101                 "¿ôÃÍ",
8102                 "¥¹¥ì¥¤",
8103                 "ESP",
8104                 "¤½¤Î¾"
8105         };
8106 #else
8107         cptr menu_name[] = {
8108                 "Brand weapon",
8109                 "Resistance",
8110                 "Ability",
8111                 "Magic number", 
8112                 "Slay",
8113                 "ESP",
8114                 "Others"
8115         };
8116 #endif
8117         const int mode_max = 7;
8118
8119 #ifdef ALLOW_REPEAT
8120         if (repeat_pull(&mode) && 1 <= mode && mode <= mode_max)
8121                 return mode;
8122         mode = 0;
8123 #endif /* ALLOW_REPEAT */
8124
8125         if (use_menu)
8126         {
8127                 screen_save();
8128
8129                 while(!mode)
8130                 {
8131                         int i;
8132                         for (i = 0; i < mode_max; i++)
8133 #ifdef JP
8134                                 prt(format(" %s %s", (menu_line == 1+i) ? "¡Õ" : "  ", menu_name[i]), 2 + i, 14);
8135                         prt("¤É¤Î¼ïÎà¤Î¥¨¥Ã¥»¥ó¥¹Éղäò¹Ô¤¤¤Þ¤¹¤«¡©", 0, 0);
8136 #else
8137                                 prt(format(" %s %s", (menu_line == 1+i) ? "> " : "  ", menu_name[i]), 2 + i, 14);
8138                         prt("Choose from menu.", 0, 0);
8139 #endif
8140
8141                         choice = inkey();
8142                         switch(choice)
8143                         {
8144                         case ESCAPE:
8145                         case 'z':
8146                         case 'Z':
8147                                 screen_load();
8148                                 return 0;
8149                         case '2':
8150                         case 'j':
8151                         case 'J':
8152                                 menu_line++;
8153                                 break;
8154                         case '8':
8155                         case 'k':
8156                         case 'K':
8157                                 menu_line += mode_max - 1;
8158                                 break;
8159                         case '\r':
8160                         case '\n':
8161                         case 'x':
8162                         case 'X':
8163                                 mode = menu_line;
8164                                 break;
8165                         }
8166                         if (menu_line > mode_max) menu_line -= mode_max;
8167                 }
8168                 screen_load();
8169         }
8170         else
8171         {
8172                 screen_save();
8173                 while (!mode)
8174                 {
8175                         int i;
8176
8177                         for (i = 0; i < mode_max; i++)
8178                                 prt(format("  %c) %s", 'a' + i, menu_name[i]), 2 + i, 14);
8179
8180 #ifdef JP
8181                         if (!get_com("²¿¤òÉղä·¤Þ¤¹¤«:", &choice, TRUE))
8182 #else
8183                         if (!get_com("Command :", &choice, TRUE))
8184 #endif
8185                         {
8186                                 screen_load();
8187                                 return 0;
8188                         }
8189
8190                         if (isupper(choice)) choice = tolower(choice);
8191
8192                         if ('a' <= choice && choice <= 'a' + (char)mode_max - 1)
8193                                 mode = (int)choice - 'a' + 1;
8194                 }
8195                 screen_load();
8196         }
8197
8198 #ifdef ALLOW_REPEAT
8199         repeat_push(mode);
8200 #endif /* ALLOW_REPEAT */
8201         return mode;
8202 }
8203
8204 static void add_essence(int mode)
8205 {
8206         int item, max_num = 0;
8207         int i;
8208         bool flag,redraw;
8209         char choice;
8210         cptr            q, s;
8211         object_type *o_ptr;
8212         int ask = TRUE;
8213         char out_val[160];
8214         int num[22];
8215         char o_name[MAX_NLEN];
8216         int use_essence;
8217         essence_type *es_ptr;
8218
8219         int menu_line = (use_menu ? 1 : 0);
8220
8221         for (i = 0; essence_info[i].add_name; i++)
8222         {
8223                 es_ptr = &essence_info[i];
8224
8225                 if (es_ptr->type != mode) continue;
8226                 num[max_num++] = i;
8227         }
8228
8229 #ifdef ALLOW_REPEAT
8230         if (!repeat_pull(&i) || i<0 || i>=max_num)
8231         {
8232 #endif /* ALLOW_REPEAT */
8233
8234
8235         /* Nothing chosen yet */
8236         flag = FALSE;
8237
8238         /* No redraw yet */
8239         redraw = FALSE;
8240
8241         /* Build a prompt */
8242 #ifdef JP
8243         (void) strnfmt(out_val, 78, "('*'¤Ç°ìÍ÷, ESC¤ÇÃæÃÇ) ¤É¤ÎǽÎϤòÉղä·¤Þ¤¹¤«¡©");
8244 #else
8245         (void)strnfmt(out_val, 78, "(*=List, ESC=exit) Add which ability? ");
8246 #endif
8247         if (use_menu) screen_save();
8248
8249         /* Get a spell from the user */
8250
8251         choice = (always_show_list || use_menu) ? ESCAPE:1;
8252         while (!flag)
8253         {
8254                 bool able[22];
8255                 if( choice==ESCAPE ) choice = ' '; 
8256                 else if( !get_com(out_val, &choice, FALSE) )break; 
8257
8258                 if (use_menu && choice != ' ')
8259                 {
8260                         switch(choice)
8261                         {
8262                                 case '0':
8263                                 {
8264                                         screen_load();
8265                                         return;
8266                                 }
8267
8268                                 case '8':
8269                                 case 'k':
8270                                 case 'K':
8271                                 {
8272                                         menu_line += (max_num-1);
8273                                         break;
8274                                 }
8275
8276                                 case '2':
8277                                 case 'j':
8278                                 case 'J':
8279                                 {
8280                                         menu_line++;
8281                                         break;
8282                                 }
8283
8284                                 case '4':
8285                                 case 'h':
8286                                 case 'H':
8287                                 {
8288                                         menu_line = 1;
8289                                         break;
8290                                 }
8291                                 case '6':
8292                                 case 'l':
8293                                 case 'L':
8294                                 {
8295                                         menu_line = max_num;
8296                                         break;
8297                                 }
8298
8299                                 case 'x':
8300                                 case 'X':
8301                                 case '\r':
8302                                 case '\n':
8303                                 {
8304                                         i = menu_line - 1;
8305                                         ask = FALSE;
8306                                         break;
8307                                 }
8308                         }
8309                         if (menu_line > max_num) menu_line -= max_num;
8310                 }
8311                 /* Request redraw */
8312                 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
8313                 {
8314                         /* Show the list */
8315                         if (!redraw || use_menu)
8316                         {
8317                                 byte y, x = 10;
8318                                 int ctr;
8319                                 char dummy[80], dummy2[80];
8320                                 byte col;
8321
8322                                 strcpy(dummy, "");
8323
8324                                 /* Show list */
8325                                 redraw = TRUE;
8326
8327                                 /* Save the screen */
8328                                 if (!use_menu) screen_save();
8329
8330                                 for (y = 1; y < 24; y++)
8331                                         prt("", y, x);
8332
8333                                 /* Print header(s) */
8334 #ifdef JP
8335                                 prt(format("   %-43s %6s/%s", "ǽÎÏ(ɬÍ×¥¨¥Ã¥»¥ó¥¹)", "ɬÍ׿ô", "½ê»ý¿ô"), 1, x);
8336
8337 #else
8338                                 prt(format("   %-43s %6s/%s", "Ability (needed essence)", "Needs", "Possess"), 1, x);
8339 #endif
8340                                 /* Print list */
8341                                 for (ctr = 0; ctr < max_num; ctr++)
8342                                 {
8343                                         es_ptr = &essence_info[num[ctr]];
8344
8345                                         if (use_menu)
8346                                         {
8347                                                 if (ctr == (menu_line-1))
8348 #ifdef JP
8349                                                         strcpy(dummy, "¡Õ ");
8350 #else
8351                                                         strcpy(dummy, ">  ");
8352 #endif
8353                                                 else strcpy(dummy, "   ");
8354                                                 
8355                                         }
8356                                         /* letter/number for power selection */
8357                                         else
8358                                         {
8359                                                 sprintf(dummy, "%c) ",I2A(ctr));
8360                                         }
8361
8362                                         strcat(dummy, es_ptr->add_name);
8363
8364                                         col = TERM_WHITE;
8365                                         able[ctr] = TRUE;
8366
8367                                         if (es_ptr->essence != -1)
8368                                         {
8369                                                 strcat(dummy, format("(%s)", essence_name[es_ptr->essence]));
8370                                                 if (p_ptr->magic_num1[es_ptr->essence] < es_ptr->value) able[ctr] = FALSE;
8371                                         }
8372                                         else
8373                                         {
8374                                                 switch(es_ptr->add)
8375                                                 {
8376                                                 case ESSENCE_SH_FIRE:
8377 #ifdef JP
8378                                                         strcat(dummy, "(¾Æ´þ+ÂѲбê)");
8379 #else
8380                                                         strcat(dummy, "(brand fire + res.fire)");
8381 #endif
8382                                                         if (p_ptr->magic_num1[TR_BRAND_FIRE] < es_ptr->value) able[ctr] = FALSE;
8383                                                         if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8384                                                         break;
8385                                                 case ESSENCE_SH_ELEC:
8386 #ifdef JP
8387                                                         strcat(dummy, "(ÅÅ·â+ÂÑÅÅ·â)");
8388 #else
8389                                                         strcat(dummy, "(brand elec. + res. elec.)");
8390 #endif
8391                                                         if (p_ptr->magic_num1[TR_BRAND_ELEC] < es_ptr->value) able[ctr] = FALSE;
8392                                                         if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8393                                                         break;
8394                                                 case ESSENCE_SH_COLD:
8395 #ifdef JP
8396                                                         strcat(dummy, "(Åà·ë+ÂÑÎ䵤)");
8397 #else
8398                                                         strcat(dummy, "(brand cold + res. cold)");
8399 #endif
8400                                                         if (p_ptr->magic_num1[TR_BRAND_COLD] < es_ptr->value) able[ctr] = FALSE;
8401                                                         if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8402                                                         break;
8403                                                 case ESSENCE_RESISTANCE:
8404 #ifdef JP
8405                                                         strcat(dummy, "(ÂѲбê+ÂÑÎ䵤+ÂÑÅÅ·â+ÂÑ»À)");
8406 #else
8407                                                         strcat(dummy, "(r.fire+r.cold+r.elec+r.acid)");
8408 #endif
8409                                                         if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8410                                                         if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8411                                                         if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8412                                                         if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8413                                                         break;
8414                                                 case ESSENCE_SUSTAIN:
8415 #ifdef JP
8416                                                         strcat(dummy, "(ÂѲбê+ÂÑÎ䵤+ÂÑÅÅ·â+ÂÑ»À)");
8417 #else
8418                                                         strcat(dummy, "(r.fire+r.cold+r.elec+r.acid)");
8419 #endif
8420                                                         if (p_ptr->magic_num1[TR_RES_FIRE] < es_ptr->value) able[ctr] = FALSE;
8421                                                         if (p_ptr->magic_num1[TR_RES_COLD] < es_ptr->value) able[ctr] = FALSE;
8422                                                         if (p_ptr->magic_num1[TR_RES_ELEC] < es_ptr->value) able[ctr] = FALSE;
8423                                                         if (p_ptr->magic_num1[TR_RES_ACID] < es_ptr->value) able[ctr] = FALSE;
8424                                                         break;
8425                                                 }
8426                                         }
8427
8428                                         if (!able[ctr]) col = TERM_RED;
8429
8430                                         if (es_ptr->essence != -1)
8431                                         {
8432                                                 sprintf(dummy2, "%-49s %3d/%d", dummy, es_ptr->value, (int)p_ptr->magic_num1[es_ptr->essence]);
8433                                         }
8434                                         else
8435                                         {
8436                                                 sprintf(dummy2, "%-49s %3d/(\?\?)", dummy, es_ptr->value);
8437                                         }
8438
8439                                         c_prt(col, dummy2, ctr+2, x);
8440                                 }
8441                         }
8442
8443                         /* Hide the list */
8444                         else
8445                         {
8446                                 /* Hide list */
8447                                 redraw = FALSE;
8448
8449                                 /* Restore the screen */
8450                                 screen_load();
8451                         }
8452
8453                         /* Redo asking */
8454                         continue;
8455                 }
8456
8457                 if (!use_menu)
8458                 {
8459                         /* Note verify */
8460                         ask = (isupper(choice));
8461
8462                         /* Lowercase */
8463                         if (ask) choice = tolower(choice);
8464
8465                         /* Extract request */
8466                         i = (islower(choice) ? A2I(choice) : -1);
8467                 }
8468
8469                 /* Totally Illegal */
8470                 if ((i < 0) || (i >= max_num) || !able[i])
8471                 {
8472                         bell();
8473                         continue;
8474                 }
8475
8476                 /* Verify it */
8477                 if (ask)
8478                 {
8479                         char tmp_val[160];
8480
8481                         /* Prompt */
8482 #ifdef JP
8483                         (void) strnfmt(tmp_val, 78, "%s¤òÉղä·¤Þ¤¹¤«¡© ", essence_info[num[i]].add_name);
8484 #else
8485                         (void) strnfmt(tmp_val, 78, "Add the abilitiy of %s? ", essence_info[num[i]].add_name);
8486 #endif
8487
8488                         /* Belay that order */
8489                         if (!get_check(tmp_val)) continue;
8490                 }
8491
8492                 /* Stop the loop */
8493                 flag = TRUE;
8494         }
8495
8496         /* Restore the screen */
8497         if (redraw) screen_load();
8498
8499         if (!flag) return;
8500
8501 #ifdef ALLOW_REPEAT
8502         repeat_push(i);
8503         }
8504 #endif /* ALLOW_REPEAT */
8505
8506         es_ptr = &essence_info[num[i]];
8507
8508         if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8509                 item_tester_tval = TV_GLOVES;
8510         else if (mode == 1 || mode == 5)
8511                 item_tester_hook = item_tester_hook_melee_ammo;
8512         else if (es_ptr->add == ESSENCE_ATTACK)
8513                 item_tester_hook = object_allow_enchant_weapon;
8514         else if (es_ptr->add == ESSENCE_AC)
8515                 item_tester_hook = object_is_armour;
8516         else
8517                 item_tester_hook = object_is_weapon_armour_ammo;
8518         item_tester_no_ryoute = TRUE;
8519
8520         /* Get an item */
8521 #ifdef JP
8522         q = "¤É¤Î¥¢¥¤¥Æ¥à¤ò²þÎɤ·¤Þ¤¹¤«¡©";
8523         s = "²þÎɤǤ­¤ë¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
8524 #else
8525         q = "Improve which item? ";
8526         s = "You have nothing to improve.";
8527 #endif
8528
8529         if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8530
8531         /* Get the item (in the pack) */
8532         if (item >= 0)
8533         {
8534                 o_ptr = &inventory[item];
8535         }
8536
8537         /* Get the item (on the floor) */
8538         else
8539         {
8540                 o_ptr = &o_list[0 - item];
8541         }
8542
8543         if ((mode != 10) && (object_is_artifact(o_ptr) || object_is_smith(o_ptr)))
8544         {
8545 #ifdef JP
8546                 msg_print("¤½¤Î¥¢¥¤¥Æ¥à¤Ï¤³¤ì°Ê¾å²þÎɤǤ­¤Ê¤¤¡£");
8547 #else
8548                 msg_print("This item is no more able to be improved.");
8549 #endif
8550                 return;
8551         }
8552
8553         object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8554
8555         use_essence = es_ptr->value;
8556         if ((o_ptr->tval >= TV_SHOT) && (o_ptr->tval <= TV_BOLT)) use_essence = (use_essence+9)/10;
8557         if (o_ptr->number > 1)
8558         {
8559                 use_essence *= o_ptr->number;
8560 #ifdef JP
8561                 msg_format("%d¸Ä¤¢¤ë¤Î¤Ç¥¨¥Ã¥»¥ó¥¹¤Ï%dɬÍפǤ¹¡£", o_ptr->number, use_essence);
8562 #else
8563                 msg_format("It will take %d essences.",use_essence);
8564 #endif
8565
8566         }
8567
8568         if (es_ptr->essence != -1)
8569         {
8570                 if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8571                 {
8572 #ifdef JP
8573                         msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â­¤ê¤Ê¤¤¡£");
8574 #else
8575                         msg_print("You don't have enough essences.");
8576 #endif
8577                         return;
8578                 }
8579                 if (is_pval_flag(es_ptr->add))
8580                 {
8581                         if (o_ptr->pval < 0)
8582                         {
8583 #ifdef JP
8584                                 msg_print("¤³¤Î¥¢¥¤¥Æ¥à¤ÎǽÎϽ¤Àµ¤ò¶¯²½¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡£");
8585 #else
8586                                 msg_print("You cannot increase magic number of this item.");
8587 #endif
8588                                 return;
8589                         }
8590                         else if (es_ptr->add == TR_BLOWS)
8591                         {
8592                                 if (o_ptr->pval > 1)
8593                                 {
8594 #ifdef JP
8595                                         if (!get_check("½¤ÀµÃͤÏ1¤Ë¤Ê¤ê¤Þ¤¹¡£¤è¤í¤·¤¤¤Ç¤¹¤«¡©")) return;
8596 #else
8597                                         if (!get_check("The magic number of this weapon will become 1. Are you sure? ")) return;
8598 #endif
8599                                 }
8600
8601                                 o_ptr->pval = 1;
8602 #ifdef JP
8603                                 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
8604 #else
8605                                 msg_format("It will take %d essences.", use_essence);
8606 #endif
8607                         }
8608                         else if (o_ptr->pval > 0)
8609                         {
8610                                 use_essence *= o_ptr->pval;
8611 #ifdef JP
8612                                 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
8613 #else
8614                                 msg_format("It will take %d essences.", use_essence);
8615 #endif
8616                         }
8617                         else
8618                         {
8619                                 char tmp[80];
8620                                 char tmp_val[160];
8621                                 int pval;
8622                                 int limit = MIN(5, p_ptr->magic_num1[es_ptr->essence]/es_ptr->value);
8623
8624 #ifdef JP
8625                                 sprintf(tmp, "¤¤¤¯¤ÄÉղä·¤Þ¤¹¤«¡© (1-%d): ", limit);
8626 #else
8627                                 sprintf(tmp, "Enchant how many? (1-%d): ", limit);
8628 #endif
8629                                 strcpy(tmp_val, "1");
8630
8631                                 if (!get_string(tmp, tmp_val, 1)) return;
8632                                 pval = atoi(tmp_val);
8633                                 if (pval > limit) pval = limit;
8634                                 else if (pval < 1) pval = 1;
8635                                 o_ptr->pval += pval;
8636                                 use_essence *= pval;
8637 #ifdef JP
8638                                 msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
8639 #else
8640                                 msg_format("It will take %d essences.", use_essence);
8641 #endif
8642                         }
8643
8644                         if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8645                         {
8646 #ifdef JP
8647                                 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â­¤ê¤Ê¤¤¡£");
8648 #else
8649                                 msg_print("You don't have enough essences.");
8650 #endif
8651                                 return;
8652                         }
8653                 }
8654                 else if (es_ptr->add == ESSENCE_SLAY_GLOVE)
8655                 {
8656                         char tmp_val[160];
8657                         int val;
8658                         int get_to_h, get_to_d;
8659
8660                         strcpy(tmp_val, "1");
8661 #ifdef JP
8662                         if (!get_string(format("¤¤¤¯¤ÄÉղä·¤Þ¤¹¤«¡© (1-%d):", p_ptr->lev/7+3), tmp_val, 2)) return;
8663 #else
8664                         if (!get_string(format("Enchant how many? (1-%d):", p_ptr->lev/7+3), tmp_val, 2)) return;
8665 #endif
8666                         val = atoi(tmp_val);
8667                         if (val > p_ptr->lev/7+3) val = p_ptr->lev/7+3;
8668                         else if (val < 1) val = 1;
8669                         use_essence *= val;
8670 #ifdef JP
8671                         msg_format("¥¨¥Ã¥»¥ó¥¹¤ò%d¸Ä»ÈÍѤ·¤Þ¤¹¡£", use_essence);
8672 #else
8673                         msg_format("It will take %d essences.", use_essence);
8674 #endif
8675                         if (p_ptr->magic_num1[es_ptr->essence] < use_essence)
8676                         {
8677 #ifdef JP
8678                                 msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â­¤ê¤Ê¤¤¡£");
8679 #else
8680                                 msg_print("You don't have enough essences.");
8681 #endif
8682                                 return;
8683                         }
8684                         get_to_h = ((val+1)/2+randint0(val/2+1));
8685                         get_to_d = ((val+1)/2+randint0(val/2+1));
8686                         o_ptr->xtra4 = (get_to_h<<8)+get_to_d;
8687                         o_ptr->to_h += get_to_h;
8688                         o_ptr->to_d += get_to_d;
8689                 }
8690                 p_ptr->magic_num1[es_ptr->essence] -= use_essence;
8691                 if (es_ptr->add == ESSENCE_ATTACK)
8692                 {
8693                         if ((o_ptr->to_h >= p_ptr->lev/5+5) && (o_ptr->to_d >= p_ptr->lev/5+5))
8694                         {
8695 #ifdef JP
8696                                 msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£");
8697 #else
8698                                 msg_print("You failed to enchant.");
8699 #endif
8700                                 energy_use = 100;
8701                                 return;
8702                         }
8703                         else
8704                         {
8705                                 if (o_ptr->to_h < p_ptr->lev/5+5) o_ptr->to_h++;
8706                                 if (o_ptr->to_d < p_ptr->lev/5+5) o_ptr->to_d++;
8707                         }
8708                 }
8709                 else if (es_ptr->add == ESSENCE_AC)
8710                 {
8711                         if (o_ptr->to_a >= p_ptr->lev/5+5)
8712                         {
8713 #ifdef JP
8714                                 msg_print("²þÎɤ˼ºÇÔ¤·¤¿¡£");
8715 #else
8716                                 msg_print("You failed to enchant.");
8717 #endif
8718                                 energy_use = 100;
8719                                 return;
8720                         }
8721                         else
8722                         {
8723                                 if (o_ptr->to_a < p_ptr->lev/5+5) o_ptr->to_a++;
8724                         }
8725                 }
8726                 else
8727                 {
8728                         o_ptr->xtra3 = es_ptr->add + 1;
8729                 }
8730         }
8731         else
8732         {
8733                 bool success = TRUE;
8734
8735                 switch(es_ptr->add)
8736                 {
8737                 case ESSENCE_SH_FIRE:
8738                         if ((p_ptr->magic_num1[TR_BRAND_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence))
8739                         {
8740                                 success = FALSE;
8741                                 break;
8742                         }
8743                         p_ptr->magic_num1[TR_BRAND_FIRE] -= use_essence;
8744                         p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8745                         break;
8746                 case ESSENCE_SH_ELEC:
8747                         if ((p_ptr->magic_num1[TR_BRAND_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence))
8748                         {
8749                                 success = FALSE;
8750                                 break;
8751                         }
8752                         p_ptr->magic_num1[TR_BRAND_ELEC] -= use_essence;
8753                         p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8754                         break;
8755                 case ESSENCE_SH_COLD:
8756                         if ((p_ptr->magic_num1[TR_BRAND_COLD] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8757                         {
8758                                 success = FALSE;
8759                                 break;
8760                         }
8761                         p_ptr->magic_num1[TR_BRAND_COLD] -= use_essence;
8762                         p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8763                         break;
8764                 case ESSENCE_RESISTANCE:
8765                 case ESSENCE_SUSTAIN:
8766                         if ((p_ptr->magic_num1[TR_RES_ACID] < use_essence) || (p_ptr->magic_num1[TR_RES_ELEC] < use_essence) || (p_ptr->magic_num1[TR_RES_FIRE] < use_essence) || (p_ptr->magic_num1[TR_RES_COLD] < use_essence))
8767                         {
8768                                 success = FALSE;
8769                                 break;
8770                         }
8771                         p_ptr->magic_num1[TR_RES_ACID] -= use_essence;
8772                         p_ptr->magic_num1[TR_RES_ELEC] -= use_essence;
8773                         p_ptr->magic_num1[TR_RES_FIRE] -= use_essence;
8774                         p_ptr->magic_num1[TR_RES_COLD] -= use_essence;
8775                         break;
8776                 }
8777                 if (!success)
8778                 {
8779 #ifdef JP
8780                         msg_print("¥¨¥Ã¥»¥ó¥¹¤¬Â­¤ê¤Ê¤¤¡£");
8781 #else
8782                         msg_print("You don't have enough essences.");
8783 #endif
8784                         return;
8785                 }
8786                 if (es_ptr->add == ESSENCE_SUSTAIN)
8787                 {
8788                         add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
8789                         add_flag(o_ptr->art_flags, TR_IGNORE_ELEC);
8790                         add_flag(o_ptr->art_flags, TR_IGNORE_FIRE);
8791                         add_flag(o_ptr->art_flags, TR_IGNORE_COLD);
8792                 }
8793                 else
8794                 {
8795                         o_ptr->xtra3 = es_ptr->add + 1;
8796                 }
8797         }
8798
8799         energy_use = 100;
8800
8801 #ifdef JP
8802         msg_format("%s¤Ë%s¤ÎǽÎϤòÉղä·¤Þ¤·¤¿¡£", o_name, es_ptr->add_name);
8803 #else
8804         msg_format("You have added ability of %s to %s.", es_ptr->add_name, o_name);
8805 #endif
8806
8807         /* Combine the pack */
8808         p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8809
8810         /* Window stuff */
8811         p_ptr->window |= (PW_INVEN);
8812 }
8813
8814
8815 static void erase_essence(void)
8816 {
8817         int item;
8818         cptr q, s;
8819         object_type *o_ptr;
8820         char o_name[MAX_NLEN];
8821         u32b flgs[TR_FLAG_SIZE];
8822
8823         item_tester_hook = object_is_smith;
8824
8825         /* Get an item */
8826 #ifdef JP
8827         q = "¤É¤Î¥¢¥¤¥Æ¥à¤Î¥¨¥Ã¥»¥ó¥¹¤ò¾Ãµî¤·¤Þ¤¹¤«¡©";
8828         s = "¥¨¥Ã¥»¥ó¥¹¤òÉղä·¤¿¥¢¥¤¥Æ¥à¤¬¤¢¤ê¤Þ¤»¤ó¡£";
8829 #else
8830         q = "Remove from which item? ";
8831         s = "You have nothing to remove essence.";
8832 #endif
8833
8834         if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
8835
8836         /* Get the item (in the pack) */
8837         if (item >= 0)
8838         {
8839                 o_ptr = &inventory[item];
8840         }
8841
8842         /* Get the item (on the floor) */
8843         else
8844         {
8845                 o_ptr = &o_list[0 - item];
8846         }
8847
8848         object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
8849 #ifdef JP
8850         if (!get_check(format("¤è¤í¤·¤¤¤Ç¤¹¤«¡© [%s]", o_name))) return;
8851 #else
8852         if (!get_check(format("Are you sure? [%s]", o_name))) return;
8853 #endif
8854
8855         energy_use = 100;
8856
8857         if (o_ptr->xtra3 == 1+ESSENCE_SLAY_GLOVE)
8858         {
8859                 o_ptr->to_h -= (o_ptr->xtra4>>8);
8860                 o_ptr->to_d -= (o_ptr->xtra4 & 0x000f);
8861                 o_ptr->xtra4 = 0;
8862                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
8863                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
8864         }
8865         o_ptr->xtra3 = 0;
8866         object_flags(o_ptr, flgs);
8867         if (!(have_pval_flags(flgs))) o_ptr->pval = 0;
8868 #ifdef JP
8869         msg_print("¥¨¥Ã¥»¥ó¥¹¤ò¼è¤êµî¤Ã¤¿¡£");
8870 #else
8871         msg_print("You removed all essence you have added.");
8872 #endif
8873
8874         /* Combine the pack */
8875         p_ptr->notice |= (PN_COMBINE | PN_REORDER);
8876
8877         /* Window stuff */
8878         p_ptr->window |= (PW_INVEN);
8879 }
8880
8881 void do_cmd_kaji(bool only_browse)
8882 {
8883         int mode = 0;
8884         char choice;
8885
8886         int menu_line = (use_menu ? 1 : 0);
8887
8888         if (!only_browse)
8889         {
8890                 if (p_ptr->confused)
8891                 {
8892 #ifdef JP
8893                         msg_print("º®Í𤷤Ƥ¤¤Æºî¶È¤Ç¤­¤Ê¤¤¡ª");
8894 #else
8895                         msg_print("You are too confused!");
8896 #endif
8897
8898                         return;
8899                 }
8900                 if (p_ptr->blind)
8901                 {
8902 #ifdef JP
8903                         msg_print("Ìܤ¬¸«¤¨¤Ê¤¯¤Æºî¶È¤Ç¤­¤Ê¤¤¡ª");
8904 #else
8905                         msg_print("You are blind!");
8906 #endif
8907
8908                         return;
8909                 }
8910                 if (p_ptr->image)
8911                 {
8912 #ifdef JP
8913                         msg_print("¤¦¤Þ¤¯¸«¤¨¤Ê¤¯¤Æºî¶È¤Ç¤­¤Ê¤¤¡ª");
8914 #else
8915                         msg_print("You are hallucinating!");
8916 #endif
8917
8918                         return;
8919                 }
8920         }
8921
8922 #ifdef ALLOW_REPEAT
8923         if (!(repeat_pull(&mode) && 1 <= mode && mode <= 5))
8924         {
8925 #endif /* ALLOW_REPEAT */
8926
8927         if (only_browse) screen_save();
8928         do {
8929         if (!only_browse) screen_save();
8930         if (use_menu)
8931         {
8932                 while(!mode)
8933                 {
8934 #ifdef JP
8935                         prt(format(" %s ¥¨¥Ã¥»¥ó¥¹°ìÍ÷", (menu_line == 1) ? "¡Õ" : "  "), 2, 14);
8936                         prt(format(" %s ¥¨¥Ã¥»¥ó¥¹Ãê½Ð", (menu_line == 2) ? "¡Õ" : "  "), 3, 14);
8937                         prt(format(" %s ¥¨¥Ã¥»¥ó¥¹¾Ãµî", (menu_line == 3) ? "¡Õ" : "  "), 4, 14);
8938                         prt(format(" %s ¥¨¥Ã¥»¥ó¥¹ÉÕ²Ã", (menu_line == 4) ? "¡Õ" : "  "), 5, 14);
8939                         prt(format(" %s Éð´ï/Ëɶñ¶¯²½", (menu_line == 5) ? "¡Õ" : "  "), 6, 14);
8940                         prt(format("¤É¤Î¼ïÎà¤Îµ»½Ñ¤ò%s¤Þ¤¹¤«¡©", only_browse ? "Ä´¤Ù" : "»È¤¤"), 0, 0);
8941 #else
8942                         prt(format(" %s List essences", (menu_line == 1) ? "> " : "  "), 2, 14);
8943                         prt(format(" %s Extract essence", (menu_line == 2) ? "> " : "  "), 3, 14);
8944                         prt(format(" %s Remove essence", (menu_line == 3) ? "> " : "  "), 4, 14);
8945                         prt(format(" %s Add essence", (menu_line == 4) ? "> " : "  "), 5, 14);
8946                         prt(format(" %s Enchant weapon/armor", (menu_line == 5) ? "> " : "  "), 6, 14);
8947                         prt(format("Choose command from menu."), 0, 0);
8948 #endif
8949                         choice = inkey();
8950                         switch(choice)
8951                         {
8952                         case ESCAPE:
8953                         case 'z':
8954                         case 'Z':
8955                                 screen_load();
8956                                 return;
8957                         case '2':
8958                         case 'j':
8959                         case 'J':
8960                                 menu_line++;
8961                                 break;
8962                         case '8':
8963                         case 'k':
8964                         case 'K':
8965                                 menu_line+= 4;
8966                                 break;
8967                         case '\r':
8968                         case '\n':
8969                         case 'x':
8970                         case 'X':
8971                                 mode = menu_line;
8972                                 break;
8973                         }
8974                         if (menu_line > 5) menu_line -= 5;
8975                 }
8976         }
8977
8978         else
8979         {
8980                 while (!mode)
8981                 {
8982 #ifdef JP
8983                         prt("  a) ¥¨¥Ã¥»¥ó¥¹°ìÍ÷", 2, 14);
8984                         prt("  b) ¥¨¥Ã¥»¥ó¥¹Ãê½Ð", 3, 14);
8985                         prt("  c) ¥¨¥Ã¥»¥ó¥¹¾Ãµî", 4, 14);
8986                         prt("  d) ¥¨¥Ã¥»¥ó¥¹ÉÕ²Ã", 5, 14);
8987                         prt("  e) Éð´ï/Ëɶñ¶¯²½", 6, 14);
8988                         if (!get_com(format("¤É¤ÎǽÎϤò%s¤Þ¤¹¤«:", only_browse ? "Ä´¤Ù" : "»È¤¤"), &choice, TRUE))
8989 #else
8990                         prt("  a) List essences", 2, 14);
8991                         prt("  b) Extract essence", 3, 14);
8992                         prt("  c) Remove essence", 4, 14);
8993                         prt("  d) Add essence", 5, 14);
8994                         prt("  e) Enchant weapon/armor", 6, 14);
8995                         if (!get_com("Command :", &choice, TRUE))
8996 #endif
8997                         {
8998                                 screen_load();
8999                                 return;
9000                         }
9001                         switch (choice)
9002                         {
9003                         case 'A':
9004                         case 'a':
9005                                 mode = 1;
9006                                 break;
9007                         case 'B':
9008                         case 'b':
9009                                 mode = 2;
9010                                 break;
9011                         case 'C':
9012                         case 'c':
9013                                 mode = 3;
9014                                 break;
9015                         case 'D':
9016                         case 'd':
9017                                 mode = 4;
9018                                 break;
9019                         case 'E':
9020                         case 'e':
9021                                 mode = 5;
9022                                 break;
9023                         }
9024                 }
9025         }
9026
9027         if (only_browse)
9028         {
9029                 char temp[62*5];
9030                 int line, j;
9031
9032                 /* Clear lines, position cursor  (really should use strlen here) */
9033                 Term_erase(14, 21, 255);
9034                 Term_erase(14, 20, 255);
9035                 Term_erase(14, 19, 255);
9036                 Term_erase(14, 18, 255);
9037                 Term_erase(14, 17, 255);
9038                 Term_erase(14, 16, 255);
9039
9040                 roff_to_buf(kaji_tips[mode-1], 62, temp, sizeof(temp));
9041                 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
9042                 {
9043                         prt(&temp[j], line, 15);
9044                         line++;
9045                 }
9046                 mode = 0;
9047         }
9048         if (!only_browse) screen_load();
9049         } while (only_browse);
9050 #ifdef ALLOW_REPEAT
9051         repeat_push(mode);
9052         }
9053 #endif /* ALLOW_REPEAT */
9054
9055         switch(mode)
9056         {
9057                 case 1: display_essence();break;
9058                 case 2: drain_essence();break;
9059                 case 3: erase_essence();break;
9060                 case 4:
9061                         mode = choose_essence();
9062                         if (mode == 0)
9063                                 break;
9064                         add_essence(mode);
9065                         break;
9066                 case 5: add_essence(10);break;
9067         }
9068 }
9069
9070
9071 /*
9072  * Torches have special abilities when they are flaming.
9073  */
9074 void torch_flags(object_type *o_ptr, u32b *flgs)
9075 {
9076         if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
9077         {
9078                 if (o_ptr->xtra4 > 0)
9079                 {
9080                         add_flag(flgs, TR_BRAND_FIRE);
9081                         add_flag(flgs, TR_KILL_UNDEAD);
9082                         add_flag(flgs, TR_THROW);
9083                 }
9084         }
9085 }
9086
9087 void torch_dice(object_type *o_ptr, int *dd, int *ds)
9088 {
9089         if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
9090         {
9091                 if (o_ptr->xtra4 > 0)
9092                 {
9093                         (*dd) = 1;
9094                         (*ds) = 6;
9095                 }
9096         }
9097 }
9098
9099 void torch_lost_fuel(object_type *o_ptr)
9100 {
9101         if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
9102         {
9103                 o_ptr->xtra4 -= (FUEL_TORCH / 25);
9104                 if (o_ptr->xtra4 < 0) o_ptr->xtra4 = 0;
9105         }
9106 }