OSDN Git Service

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