OSDN Git Service

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