OSDN Git Service

[Refactor] #40399 Renamed inven_carry() to store_item_to_inventory()
[hengband/hengband.git] / src / object / object2.c
1 /*!
2  * @brief オブジェクトの実装 / Object code, part 2
3  * @date 2014/01/11
4  * @author
5  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
6  * 
7  * This software may be copied and distributed for educational, research,
8  * and not for profit purposes provided that this copyright and statement
9  * are included in all such copies.  Other copyrights may also apply.
10  * 2014 Deskull rearranged comment for Doxygen.
11  */
12
13 #include "object/object2.h"
14 #include "cmd-io/cmd-dump.h"
15 #include "dungeon/dungeon.h"
16 #include "floor/floor.h"
17 #include "grid/feature.h"
18 #include "grid/grid.h"
19 #include "inventory/inventory-object.h" // 暫定、相互参照している.
20 #include "io/write-diary.h"
21 #include "main/sound-definitions-table.h"
22 #include "monster/monster-race-hook.h"
23 #include "monster/monster.h"
24 #include "object/artifact.h"
25 #include "object/item-apply-magic.h"
26 #include "object/item-feeling.h"
27 #include "object/object-appraiser.h" // 暫定、相互参照している.
28 #include "object/object-boost.h"
29 #include "object/object-curse.h"
30 #include "object/object-ego.h"
31 #include "object/object-flavor.h"
32 #include "object/object-hook.h"
33 #include "object/object-kind.h"
34 #include "object/object-mark-types.h"
35 #include "object/object-value.h" // 暫定、相互参照している.
36 #include "object/special-object-flags.h"
37 #include "object/sv-amulet-types.h"
38 #include "object/sv-armor-types.h"
39 #include "object/sv-bow-types.h"
40 #include "object/sv-lite-types.h"
41 #include "object/sv-other-types.h"
42 #include "object/sv-protector-types.h"
43 #include "object/sv-ring-types.h"
44 #include "object/sv-weapon-types.h"
45 #include "object/trc-types.h"
46 #include "player/player-class.h"
47 #include "player/player-effects.h"
48 #include "player/player-move.h"
49 #include "player/player-personalities-table.h"
50 #include "player/player-status.h"
51 #include "util/util.h"
52 #include "view/display-main-window.h"
53 #include "world/world.h"
54
55 /*
56   * todo この説明長すぎ。何とかしたい
57   * Determine if an item can "absorb" a second item
58   *
59   * See "object_absorb()" for the actual "absorption" code.
60   *
61   * If permitted, we allow staffs (if they are known to have equal charges
62   * and both are either known or confirmed empty) and wands (if both are
63   * either known or confirmed empty) and rods (in all cases) to combine.
64   * Staffs will unstack (if necessary) when they are used, but wands and
65   * rods will only unstack if one is dropped. -LM-
66   *
67   * If permitted, we allow weapons/armor to stack, if fully "known".
68   *
69   * Missiles will combine if both stacks have the same "known" status.
70   * This is done to make unidentified stacks of missiles useful.
71   *
72   * Food, potions, scrolls, and "easy know" items always stack.
73   *
74   * Chests, and activatable items, never stack (for various reasons).
75   */
76
77  /*
78   * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
79   */
80 #define MAX_STACK_SIZE 99
81
82 /*!
83  * todo この関数ポインタは何とかならんのか?
84  * Hack -- function hook to restrict "get_obj_num_prep()" function
85  */
86 bool(*get_obj_num_hook)(KIND_OBJECT_IDX k_idx);
87
88 OBJECT_SUBTYPE_VALUE coin_type; /* Hack -- force coin type */
89
90 /*!
91  * @brief 床上、モンスター所持でスタックされたアイテムを削除しスタックを補完する / Excise a dungeon object from any stacks
92  * @param floo_ptr 現在フロアへの参照ポインタ
93  * @param o_idx 削除対象のオブジェクト構造体ポインタ
94  * @return なし
95  */
96 void excise_object_idx(floor_type *floor_ptr, OBJECT_IDX o_idx)
97 {
98         OBJECT_IDX this_o_idx, next_o_idx = 0;
99         OBJECT_IDX prev_o_idx = 0;
100         object_type *j_ptr;
101         j_ptr = &floor_ptr->o_list[o_idx];
102
103         if (OBJECT_IS_HELD_MONSTER(j_ptr))
104         {
105                 monster_type *m_ptr;
106                 m_ptr = &floor_ptr->m_list[j_ptr->held_m_idx];
107                 for (this_o_idx = m_ptr->hold_o_idx; this_o_idx; this_o_idx = next_o_idx)
108                 {
109                         object_type *o_ptr;
110                         o_ptr = &floor_ptr->o_list[this_o_idx];
111                         next_o_idx = o_ptr->next_o_idx;
112                         if (this_o_idx != o_idx)
113                         {
114                                 prev_o_idx = this_o_idx;
115                                 continue;
116                         }
117
118                         if (prev_o_idx == 0)
119                         {
120                                 m_ptr->hold_o_idx = next_o_idx;
121                         }
122                         else
123                         {
124                                 object_type *k_ptr;
125                                 k_ptr = &floor_ptr->o_list[prev_o_idx];
126                                 k_ptr->next_o_idx = next_o_idx;
127                         }
128
129                         o_ptr->next_o_idx = 0;
130                         break;
131                 }
132
133                 return;
134         }
135
136         grid_type *g_ptr;
137         POSITION y = j_ptr->iy;
138         POSITION x = j_ptr->ix;
139         g_ptr = &floor_ptr->grid_array[y][x];
140         for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
141         {
142                 object_type *o_ptr;
143                 o_ptr = &floor_ptr->o_list[this_o_idx];
144                 next_o_idx = o_ptr->next_o_idx;
145                 if (this_o_idx != o_idx)
146                 {
147                         prev_o_idx = this_o_idx;
148                         continue;
149                 }
150
151                 if (prev_o_idx == 0)
152                 {
153                         g_ptr->o_idx = next_o_idx;
154                 }
155                 else
156                 {
157                         object_type *k_ptr;
158                         k_ptr = &floor_ptr->o_list[prev_o_idx];
159                         k_ptr->next_o_idx = next_o_idx;
160                 }
161
162                 o_ptr->next_o_idx = 0;
163                 break;
164         }
165 }
166
167
168 /*!
169  * @brief オブジェクトを削除する /
170  * Delete a dungeon object
171  * @param player_ptr プレーヤーへの参照ポインタ
172  * @param o_idx 削除対象のオブジェクト構造体ポインタ
173  * @return なし
174  * @details
175  * Handle "stacks" of objects correctly.
176  */
177 void delete_object_idx(player_type *player_ptr, OBJECT_IDX o_idx)
178 {
179         object_type *j_ptr;
180         floor_type *floor_ptr = player_ptr->current_floor_ptr;
181         excise_object_idx(floor_ptr, o_idx);
182         j_ptr = &floor_ptr->o_list[o_idx];
183         if (!OBJECT_IS_HELD_MONSTER(j_ptr))
184         {
185                 POSITION y, x;
186                 y = j_ptr->iy;
187                 x = j_ptr->ix;
188                 lite_spot(player_ptr, y, x);
189         }
190
191         object_wipe(j_ptr);
192         floor_ptr->o_cnt--;
193 }
194
195
196 /*!
197  * @brief グローバルオブジェクト配列から空きを取得する /
198  * Acquires and returns the index of a "free" object.
199  * @param floo_ptr 現在フロアへの参照ポインタ
200  * @return 開いているオブジェクト要素のID
201  * @details
202  * This routine should almost never fail, but in case it does,
203  * we must be sure to handle "failure" of this routine.
204  */
205 OBJECT_IDX o_pop(floor_type *floor_ptr)
206 {
207         if (floor_ptr->o_max < current_world_ptr->max_o_idx)
208         {
209                 OBJECT_IDX i = floor_ptr->o_max;
210                 floor_ptr->o_max++;
211                 floor_ptr->o_cnt++;
212                 return i;
213         }
214
215         for (OBJECT_IDX i = 1; i < floor_ptr->o_max; i++)
216         {
217                 object_type *o_ptr;
218                 o_ptr = &floor_ptr->o_list[i];
219                 if (o_ptr->k_idx) continue;
220                 floor_ptr->o_cnt++;
221
222                 return i;
223         }
224
225         if (current_world_ptr->character_dungeon)
226                 msg_print(_("アイテムが多すぎる!", "Too many objects!"));
227
228         return 0;
229 }
230
231
232 /*!
233  * @brief オブジェクト生成テーブルからアイテムを取得する /
234  * Choose an object kind that seems "appropriate" to the given level
235  * @param owner_ptr プレーヤーへの参照ポインタ
236  * @param level 生成階
237  * @return 選ばれたオブジェクトベースID
238  * @details
239  * This function uses the "prob2" field of the "object allocation table",\n
240  * and various local information, to calculate the "prob3" field of the\n
241  * same table, which is then used to choose an "appropriate" object, in\n
242  * a relatively efficient manner.\n
243  *\n
244  * It is (slightly) more likely to acquire an object of the given level\n
245  * than one of a lower level.  This is done by choosing several objects\n
246  * appropriate to the given level and keeping the "hardest" one.\n
247  *\n
248  * Note that if no objects are "appropriate", then this function will\n
249  * fail, and return zero, but this should *almost* never happen.\n
250  */
251 OBJECT_IDX get_obj_num(player_type *owner_ptr, DEPTH level, BIT_FLAGS mode)
252 {
253         int i, j, p;
254         KIND_OBJECT_IDX k_idx;
255         long value, total;
256         object_kind     *k_ptr;
257         alloc_entry     *table = alloc_kind_table;
258
259         if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
260
261         if ((level > 0) && !(d_info[owner_ptr->dungeon_idx].flags1 & DF1_BEGINNER))
262         {
263                 if (one_in_(GREAT_OBJ))
264                 {
265                         level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
266                 }
267         }
268
269         total = 0L;
270         for (i = 0; i < alloc_kind_size; i++)
271         {
272                 if (table[i].level > level) break;
273
274                 table[i].prob3 = 0;
275                 k_idx = table[i].index;
276                 k_ptr = &k_info[k_idx];
277
278                 if ((mode & AM_FORBID_CHEST) && (k_ptr->tval == TV_CHEST)) continue;
279
280                 table[i].prob3 = table[i].prob2;
281                 total += table[i].prob3;
282         }
283
284         if (total <= 0) return 0;
285
286         value = randint0(total);
287         for (i = 0; i < alloc_kind_size; i++)
288         {
289                 if (value < table[i].prob3) break;
290
291                 value = value - table[i].prob3;
292         }
293
294         p = randint0(100);
295         if (p < 60)
296         {
297                 j = i;
298                 value = randint0(total);
299                 for (i = 0; i < alloc_kind_size; i++)
300                 {
301                         if (value < table[i].prob3) break;
302
303                         value = value - table[i].prob3;
304                 }
305
306                 if (table[i].level < table[j].level) i = j;
307         }
308
309         if (p >= 10) return (table[i].index);
310
311         j = i;
312         value = randint0(total);
313         for (i = 0; i < alloc_kind_size; i++)
314         {
315                 if (value < table[i].prob3) break;
316
317                 value = value - table[i].prob3;
318         }
319
320         if (table[i].level < table[j].level) i = j;
321         return (table[i].index);
322 }
323
324
325 /*!
326 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item.  Method 1 (Heavy).
327 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
328 * @return 擬似鑑定結果のIDを返す。
329 */
330 byte value_check_aux1(object_type *o_ptr)
331 {
332         if (object_is_artifact(o_ptr))
333         {
334                 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
335
336                 return FEEL_SPECIAL;
337         }
338
339         if (object_is_ego(o_ptr))
340         {
341                 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
342
343                 return FEEL_EXCELLENT;
344         }
345
346         if (object_is_cursed(o_ptr)) return FEEL_CURSED;
347         if (object_is_broken(o_ptr)) return FEEL_BROKEN;
348         if ((o_ptr->tval == TV_RING) || (o_ptr->tval == TV_AMULET)) return FEEL_AVERAGE;
349         if (o_ptr->to_a > 0) return FEEL_GOOD;
350         if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_GOOD;
351
352         return FEEL_AVERAGE;
353 }
354
355
356 /*!
357 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item.  Method 2 (Light).
358 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
359 * @return 擬似鑑定結果のIDを返す。
360 */
361 byte value_check_aux2(object_type *o_ptr)
362 {
363         if (object_is_cursed(o_ptr)) return FEEL_CURSED;
364         if (object_is_broken(o_ptr)) return FEEL_BROKEN;
365         if (object_is_artifact(o_ptr)) return FEEL_UNCURSED;
366         if (object_is_ego(o_ptr)) return FEEL_UNCURSED;
367         if (o_ptr->to_a > 0) return FEEL_UNCURSED;
368         if (o_ptr->to_h + o_ptr->to_d > 0) return FEEL_UNCURSED;
369
370         return FEEL_NONE;
371 }
372
373
374 /*!
375  * @brief オブジェクトのフラグ類から価格を算出する /
376  * Return the value of the flags the object has...
377  * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
378  * @param plusses フラグに与える価格の基本重み
379  * @return オブジェクトのフラグ価格
380  */
381 PRICE flag_cost(object_type *o_ptr, int plusses)
382 {
383         PRICE total = 0;
384         BIT_FLAGS flgs[TR_FLAG_SIZE];
385         object_kind *k_ptr = &k_info[o_ptr->k_idx];
386         object_flags(o_ptr, flgs);
387
388         /*
389          * Exclude fixed flags of the base item.
390          * pval bonuses of base item will be treated later.
391          */
392         for (int i = 0; i < TR_FLAG_SIZE; i++)
393                 flgs[i] &= ~(k_ptr->flags[i]);
394
395         if (object_is_fixed_artifact(o_ptr))
396         {
397                 artifact_type *a_ptr = &a_info[o_ptr->name1];
398
399                 for (int i = 0; i < TR_FLAG_SIZE; i++)
400                         flgs[i] &= ~(a_ptr->flags[i]);
401         }
402         else if (object_is_ego(o_ptr))
403         {
404                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
405
406                 for (int i = 0; i < TR_FLAG_SIZE; i++)
407                         flgs[i] &= ~(e_ptr->flags[i]);
408         }
409
410         /*
411          * Calucurate values of remaining flags
412          */
413         if (have_flag(flgs, TR_STR)) total += (1500 * plusses);
414         if (have_flag(flgs, TR_INT)) total += (1500 * plusses);
415         if (have_flag(flgs, TR_WIS)) total += (1500 * plusses);
416         if (have_flag(flgs, TR_DEX)) total += (1500 * plusses);
417         if (have_flag(flgs, TR_CON)) total += (1500 * plusses);
418         if (have_flag(flgs, TR_CHR)) total += (750 * plusses);
419         if (have_flag(flgs, TR_MAGIC_MASTERY)) total += (600 * plusses);
420         if (have_flag(flgs, TR_STEALTH)) total += (250 * plusses);
421         if (have_flag(flgs, TR_SEARCH)) total += (100 * plusses);
422         if (have_flag(flgs, TR_INFRA)) total += (150 * plusses);
423         if (have_flag(flgs, TR_TUNNEL)) total += (175 * plusses);
424         if ((have_flag(flgs, TR_SPEED)) && (plusses > 0))
425                 total += (10000 + (2500 * plusses));
426         if ((have_flag(flgs, TR_BLOWS)) && (plusses > 0))
427                 total += (10000 + (2500 * plusses));
428
429         PRICE tmp_cost = 0;
430         int count = 0;
431         if (have_flag(flgs, TR_CHAOTIC)) { total += 5000; count++; }
432         if (have_flag(flgs, TR_VAMPIRIC)) { total += 6500; count++; }
433         if (have_flag(flgs, TR_FORCE_WEAPON)) { tmp_cost += 2500; count++; }
434         if (have_flag(flgs, TR_KILL_ANIMAL)) { tmp_cost += 2800; count++; }
435         else if (have_flag(flgs, TR_SLAY_ANIMAL)) { tmp_cost += 1800; count++; }
436         if (have_flag(flgs, TR_KILL_EVIL)) { tmp_cost += 3300; count++; }
437         else if (have_flag(flgs, TR_SLAY_EVIL)) { tmp_cost += 2300; count++; }
438         if (have_flag(flgs, TR_KILL_HUMAN)) { tmp_cost += 2800; count++; }
439         else if (have_flag(flgs, TR_SLAY_HUMAN)) { tmp_cost += 1800; count++; }
440         if (have_flag(flgs, TR_KILL_UNDEAD)) { tmp_cost += 2800; count++; }
441         else if (have_flag(flgs, TR_SLAY_UNDEAD)) { tmp_cost += 1800; count++; }
442         if (have_flag(flgs, TR_KILL_DEMON)) { tmp_cost += 2800; count++; }
443         else if (have_flag(flgs, TR_SLAY_DEMON)) { tmp_cost += 1800; count++; }
444         if (have_flag(flgs, TR_KILL_ORC)) { tmp_cost += 2500; count++; }
445         else if (have_flag(flgs, TR_SLAY_ORC)) { tmp_cost += 1500; count++; }
446         if (have_flag(flgs, TR_KILL_TROLL)) { tmp_cost += 2800; count++; }
447         else if (have_flag(flgs, TR_SLAY_TROLL)) { tmp_cost += 1800; count++; }
448         if (have_flag(flgs, TR_KILL_GIANT)) { tmp_cost += 2800; count++; }
449         else if (have_flag(flgs, TR_SLAY_GIANT)) { tmp_cost += 1800; count++; }
450         if (have_flag(flgs, TR_KILL_DRAGON)) { tmp_cost += 2800; count++; }
451         else if (have_flag(flgs, TR_SLAY_DRAGON)) { tmp_cost += 1800; count++; }
452
453         if (have_flag(flgs, TR_VORPAL)) { tmp_cost += 2500; count++; }
454         if (have_flag(flgs, TR_IMPACT)) { tmp_cost += 2500; count++; }
455         if (have_flag(flgs, TR_BRAND_POIS)) { tmp_cost += 3800; count++; }
456         if (have_flag(flgs, TR_BRAND_ACID)) { tmp_cost += 3800; count++; }
457         if (have_flag(flgs, TR_BRAND_ELEC)) { tmp_cost += 3800; count++; }
458         if (have_flag(flgs, TR_BRAND_FIRE)) { tmp_cost += 2500; count++; }
459         if (have_flag(flgs, TR_BRAND_COLD)) { tmp_cost += 2500; count++; }
460         total += (tmp_cost * count);
461
462         if (have_flag(flgs, TR_SUST_STR)) total += 850;
463         if (have_flag(flgs, TR_SUST_INT)) total += 850;
464         if (have_flag(flgs, TR_SUST_WIS)) total += 850;
465         if (have_flag(flgs, TR_SUST_DEX)) total += 850;
466         if (have_flag(flgs, TR_SUST_CON)) total += 850;
467         if (have_flag(flgs, TR_SUST_CHR)) total += 250;
468         if (have_flag(flgs, TR_RIDING)) total += 0;
469         if (have_flag(flgs, TR_EASY_SPELL)) total += 1500;
470         if (have_flag(flgs, TR_THROW)) total += 5000;
471         if (have_flag(flgs, TR_FREE_ACT)) total += 4500;
472         if (have_flag(flgs, TR_HOLD_EXP)) total += 8500;
473
474         tmp_cost = 0;
475         count = 0;
476         if (have_flag(flgs, TR_IM_ACID)) { tmp_cost += 15000; count += 2; }
477         if (have_flag(flgs, TR_IM_ELEC)) { tmp_cost += 15000; count += 2; }
478         if (have_flag(flgs, TR_IM_FIRE)) { tmp_cost += 15000; count += 2; }
479         if (have_flag(flgs, TR_IM_COLD)) { tmp_cost += 15000; count += 2; }
480         if (have_flag(flgs, TR_REFLECT)) { tmp_cost += 5000; count += 2; }
481         if (have_flag(flgs, TR_RES_ACID)) { tmp_cost += 500; count++; }
482         if (have_flag(flgs, TR_RES_ELEC)) { tmp_cost += 500; count++; }
483         if (have_flag(flgs, TR_RES_FIRE)) { tmp_cost += 500; count++; }
484         if (have_flag(flgs, TR_RES_COLD)) { tmp_cost += 500; count++; }
485         if (have_flag(flgs, TR_RES_POIS)) { tmp_cost += 1000; count += 2; }
486         if (have_flag(flgs, TR_RES_FEAR)) { tmp_cost += 1000; count += 2; }
487         if (have_flag(flgs, TR_RES_LITE)) { tmp_cost += 800; count += 2; }
488         if (have_flag(flgs, TR_RES_DARK)) { tmp_cost += 800; count += 2; }
489         if (have_flag(flgs, TR_RES_BLIND)) { tmp_cost += 900; count += 2; }
490         if (have_flag(flgs, TR_RES_CONF)) { tmp_cost += 900; count += 2; }
491         if (have_flag(flgs, TR_RES_SOUND)) { tmp_cost += 900; count += 2; }
492         if (have_flag(flgs, TR_RES_SHARDS)) { tmp_cost += 900; count += 2; }
493         if (have_flag(flgs, TR_RES_NETHER)) { tmp_cost += 900; count += 2; }
494         if (have_flag(flgs, TR_RES_NEXUS)) { tmp_cost += 900; count += 2; }
495         if (have_flag(flgs, TR_RES_CHAOS)) { tmp_cost += 1000; count += 2; }
496         if (have_flag(flgs, TR_RES_DISEN)) { tmp_cost += 2000; count += 2; }
497         total += (tmp_cost * count);
498
499         if (have_flag(flgs, TR_SH_FIRE)) total += 5000;
500         if (have_flag(flgs, TR_SH_ELEC)) total += 5000;
501         if (have_flag(flgs, TR_SH_COLD)) total += 5000;
502         if (have_flag(flgs, TR_NO_TELE)) total -= 10000;
503         if (have_flag(flgs, TR_NO_MAGIC)) total += 2500;
504         if (have_flag(flgs, TR_TY_CURSE)) total -= 15000;
505         if (have_flag(flgs, TR_HIDE_TYPE)) total += 0;
506         if (have_flag(flgs, TR_SHOW_MODS)) total += 0;
507         if (have_flag(flgs, TR_LEVITATION)) total += 1250;
508         if (have_flag(flgs, TR_LITE_1)) total += 1500;
509         if (have_flag(flgs, TR_LITE_2)) total += 2500;
510         if (have_flag(flgs, TR_LITE_3)) total += 4000;
511         if (have_flag(flgs, TR_LITE_M1)) total -= 1500;
512         if (have_flag(flgs, TR_LITE_M2)) total -= 2500;
513         if (have_flag(flgs, TR_LITE_M3)) total -= 4000;
514         if (have_flag(flgs, TR_SEE_INVIS)) total += 2000;
515         if (have_flag(flgs, TR_TELEPATHY)) total += 20000;
516         if (have_flag(flgs, TR_ESP_ANIMAL)) total += 1000;
517         if (have_flag(flgs, TR_ESP_UNDEAD)) total += 1000;
518         if (have_flag(flgs, TR_ESP_DEMON)) total += 1000;
519         if (have_flag(flgs, TR_ESP_ORC)) total += 1000;
520         if (have_flag(flgs, TR_ESP_TROLL)) total += 1000;
521         if (have_flag(flgs, TR_ESP_GIANT)) total += 1000;
522         if (have_flag(flgs, TR_ESP_DRAGON)) total += 1000;
523         if (have_flag(flgs, TR_ESP_HUMAN)) total += 1000;
524         if (have_flag(flgs, TR_ESP_EVIL)) total += 15000;
525         if (have_flag(flgs, TR_ESP_GOOD)) total += 2000;
526         if (have_flag(flgs, TR_ESP_NONLIVING)) total += 2000;
527         if (have_flag(flgs, TR_ESP_UNIQUE)) total += 10000;
528         if (have_flag(flgs, TR_SLOW_DIGEST)) total += 750;
529         if (have_flag(flgs, TR_REGEN)) total += 2500;
530         if (have_flag(flgs, TR_WARNING)) total += 2000;
531         if (have_flag(flgs, TR_DEC_MANA)) total += 10000;
532         if (have_flag(flgs, TR_XTRA_MIGHT)) total += 2250;
533         if (have_flag(flgs, TR_XTRA_SHOTS)) total += 10000;
534         if (have_flag(flgs, TR_IGNORE_ACID)) total += 100;
535         if (have_flag(flgs, TR_IGNORE_ELEC)) total += 100;
536         if (have_flag(flgs, TR_IGNORE_FIRE)) total += 100;
537         if (have_flag(flgs, TR_IGNORE_COLD)) total += 100;
538         if (have_flag(flgs, TR_ACTIVATE)) total += 100;
539         if (have_flag(flgs, TR_DRAIN_EXP)) total -= 12500;
540         if (have_flag(flgs, TR_DRAIN_HP)) total -= 12500;
541         if (have_flag(flgs, TR_DRAIN_MANA)) total -= 12500;
542         if (have_flag(flgs, TR_CALL_ANIMAL)) total -= 12500;
543         if (have_flag(flgs, TR_CALL_DEMON)) total -= 10000;
544         if (have_flag(flgs, TR_CALL_DRAGON)) total -= 10000;
545         if (have_flag(flgs, TR_CALL_UNDEAD)) total -= 10000;
546         if (have_flag(flgs, TR_COWARDICE)) total -= 5000;
547         if (have_flag(flgs, TR_LOW_MELEE)) total -= 5000;
548         if (have_flag(flgs, TR_LOW_AC)) total -= 5000;
549         if (have_flag(flgs, TR_LOW_MAGIC)) total -= 15000;
550         if (have_flag(flgs, TR_FAST_DIGEST)) total -= 10000;
551         if (have_flag(flgs, TR_SLOW_REGEN)) total -= 10000;
552         if (have_flag(flgs, TR_TELEPORT))
553         {
554                 if (object_is_cursed(o_ptr))
555                         total -= 7500;
556                 else
557                         total += 250;
558         }
559
560         if (have_flag(flgs, TR_AGGRAVATE)) total -= 10000;
561         if (have_flag(flgs, TR_BLESSED)) total += 750;
562         if (o_ptr->curse_flags & TR_ADD_L_CURSE) total -= 5000;
563         if (o_ptr->curse_flags & TR_ADD_H_CURSE) total -= 12500;
564         if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
565         if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
566         if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
567
568         /* Also, give some extra for activatable powers... */
569         if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
570         {
571                 const activation_type* const act_ptr = find_activation_info(o_ptr);
572                 if (act_ptr) {
573                         total += act_ptr->value;
574                 }
575         }
576
577         return total;
578 }
579
580
581 /*!
582  * @brief 魔法棒やロッドのスロット分割時に使用回数を分配する /
583  * Distribute charges of rods or wands.
584  * @param o_ptr 分割元オブジェクトの構造体参照ポインタ source item
585  * @param q_ptr 分割先オブジェクトの構造体参照ポインタ target item, must be of the same type as o_ptr
586  * @param amt 分割したい回数量 number of items that are transfered
587  * @return なし
588  * @details
589  * Hack -- If rods or wands are dropped, the total maximum timeout or\n
590  * charges need to be allocated between the two stacks.  If all the items\n
591  * are being dropped, it makes for a neater message to leave the original\n
592  * stack's pval alone. -LM-\n
593  */
594 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
595 {
596         if ((o_ptr->tval != TV_WAND) && (o_ptr->tval != TV_ROD)) return;
597
598         q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
599         if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
600
601         if ((o_ptr->tval != TV_ROD) || !o_ptr->timeout) return;
602
603         if (q_ptr->pval > o_ptr->timeout)
604                 q_ptr->timeout = o_ptr->timeout;
605         else
606                 q_ptr->timeout = q_ptr->pval;
607
608         if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
609 }
610
611
612 /*!
613  * @brief 魔法棒やロッドの使用回数を減らす /
614  * @param o_ptr オブジェクトの構造体参照ポインタ source item
615  * @param amt 減らしたい回数量 number of items that are transfered
616  * @return なし
617  * @details
618  * Hack -- If rods or wand are destroyed, the total maximum timeout or\n
619  * charges of the stack needs to be reduced, unless all the items are\n
620  * being destroyed. -LM-\n
621  */
622 void reduce_charges(object_type *o_ptr, int amt)
623 {
624         if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
625                 (amt < o_ptr->number))
626         {
627                 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
628         }
629 }
630
631
632 /*!
633  * @brief 両オブジェクトをスロットに重ね合わせ可能な最大数を返す。
634  * Determine if an item can partly absorb a second item. Return maximum number of stack.
635  * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
636  * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
637  * @return 重ね合わせ可能なアイテム数
638  */
639 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
640 {
641         int max_num = MAX_STACK_SIZE;
642         if (o_ptr->k_idx != j_ptr->k_idx) return 0;
643
644         switch (o_ptr->tval)
645         {
646         case TV_CHEST:
647         case TV_CARD:
648         case TV_CAPTURE:
649         {
650                 return 0;
651         }
652         case TV_STATUE:
653         {
654                 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
655                 if (o_ptr->pval != j_ptr->pval) return 0;
656                 break;
657         }
658         case TV_FIGURINE:
659         case TV_CORPSE:
660         {
661                 if (o_ptr->pval != j_ptr->pval) return 0;
662
663                 break;
664         }
665         case TV_FOOD:
666         case TV_POTION:
667         case TV_SCROLL:
668         {
669                 break;
670         }
671         case TV_STAFF:
672         {
673                 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
674                         !object_is_known(o_ptr)) ||
675                         (!(j_ptr->ident & (IDENT_EMPTY)) &&
676                                 !object_is_known(j_ptr))) return 0;
677
678                 if (o_ptr->pval != j_ptr->pval) return 0;
679
680                 break;
681         }
682         case TV_WAND:
683         {
684                 if ((!(o_ptr->ident & (IDENT_EMPTY)) &&
685                         !object_is_known(o_ptr)) ||
686                         (!(j_ptr->ident & (IDENT_EMPTY)) &&
687                                 !object_is_known(j_ptr))) return 0;
688
689                 break;
690         }
691         case TV_ROD:
692         {
693                 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
694                 break;
695         }
696         case TV_BOW:
697         case TV_DIGGING:
698         case TV_HAFTED:
699         case TV_POLEARM:
700         case TV_SWORD:
701         case TV_BOOTS:
702         case TV_GLOVES:
703         case TV_HELM:
704         case TV_CROWN:
705         case TV_SHIELD:
706         case TV_CLOAK:
707         case TV_SOFT_ARMOR:
708         case TV_HARD_ARMOR:
709         case TV_DRAG_ARMOR:
710         case TV_RING:
711         case TV_AMULET:
712         case TV_LITE:
713         case TV_WHISTLE:
714         {
715                 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
716         }
717                 /* Fall through */
718         case TV_BOLT:
719         case TV_ARROW:
720         case TV_SHOT:
721         {
722                 if (object_is_known(o_ptr) != object_is_known(j_ptr)) return 0;
723                 if (o_ptr->feeling != j_ptr->feeling) return 0;
724                 if (o_ptr->to_h != j_ptr->to_h) return 0;
725                 if (o_ptr->to_d != j_ptr->to_d) return 0;
726                 if (o_ptr->to_a != j_ptr->to_a) return 0;
727                 if (o_ptr->pval != j_ptr->pval) return 0;
728                 if (object_is_artifact(o_ptr) || object_is_artifact(j_ptr)) return 0;
729                 if (o_ptr->name2 != j_ptr->name2) return 0;
730                 if (o_ptr->xtra3 != j_ptr->xtra3) return 0;
731                 if (o_ptr->xtra4 != j_ptr->xtra4) return 0;
732                 if (o_ptr->xtra1 || j_ptr->xtra1) return 0;
733                 if (o_ptr->timeout || j_ptr->timeout) return 0;
734                 if (o_ptr->ac != j_ptr->ac) return 0;
735                 if (o_ptr->dd != j_ptr->dd) return 0;
736                 if (o_ptr->ds != j_ptr->ds) return 0;
737                 break;
738         }
739         default:
740         {
741                 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
742
743                 break;
744         }
745         }
746
747         for (int i = 0; i < TR_FLAG_SIZE; i++)
748                 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
749
750         if (o_ptr->curse_flags != j_ptr->curse_flags) return 0;
751         if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return 0;
752
753         if (o_ptr->inscription && j_ptr->inscription &&
754                 (o_ptr->inscription != j_ptr->inscription))
755                 return 0;
756
757         if (!stack_force_notes && (o_ptr->inscription != j_ptr->inscription)) return 0;
758         if (!stack_force_costs && (o_ptr->discount != j_ptr->discount)) return 0;
759
760         return max_num;
761 }
762
763
764 /*!
765  * @brief 両オブジェクトをスロットに重ねることができるかどうかを返す。
766  * Determine if an item can absorb a second item.
767  * @param o_ptr 検証したいオブジェクトの構造体参照ポインタ1
768  * @param j_ptr 検証したいオブジェクトの構造体参照ポインタ2
769  * @return 重ね合わせ可能ならばTRUEを返す。
770  */
771 bool object_similar(object_type *o_ptr, object_type *j_ptr)
772 {
773         int total = o_ptr->number + j_ptr->number;
774         int max_num = object_similar_part(o_ptr, j_ptr);
775         if (!max_num) return FALSE;
776         if (total > max_num) return 0;
777
778         return TRUE;
779 }
780
781
782 /*!
783  * @brief 両オブジェクトをスロットに重ね合わせる。
784  * Allow one item to "absorb" another, assuming they are similar
785  * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
786  * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
787  * @return なし
788  */
789 void object_absorb(object_type *o_ptr, object_type *j_ptr)
790 {
791         int max_num = object_similar_part(o_ptr, j_ptr);
792         int total = o_ptr->number + j_ptr->number;
793         int diff = (total > max_num) ? total - max_num : 0;
794
795         o_ptr->number = (total > max_num) ? max_num : total;
796         if (object_is_known(j_ptr)) object_known(o_ptr);
797
798         if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
799                 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
800         {
801                 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
802                 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
803         }
804
805         if (object_is_fully_known(j_ptr)) o_ptr->ident |= (IDENT_FULL_KNOWN);
806         if (j_ptr->inscription) o_ptr->inscription = j_ptr->inscription;
807         if (j_ptr->feeling) o_ptr->feeling = j_ptr->feeling;
808         if (o_ptr->discount < j_ptr->discount) o_ptr->discount = j_ptr->discount;
809         if (o_ptr->tval == TV_ROD)
810         {
811                 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
812                 o_ptr->timeout += j_ptr->timeout * (j_ptr->number - diff) / j_ptr->number;
813         }
814
815         if (o_ptr->tval == TV_WAND)
816         {
817                 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
818         }
819 }
820
821
822 /*!
823  * @brief tvalとsvalに対応するベースアイテムのIDを返す。
824  * Find the index of the object_kind with the given tval and sval
825  * @param tval 検索したいベースアイテムのtval
826  * @param sval 検索したいベースアイテムのsval
827  * @return なし
828  */
829 KIND_OBJECT_IDX lookup_kind(tval_type tval, OBJECT_SUBTYPE_VALUE sval)
830 {
831         int num = 0;
832         KIND_OBJECT_IDX bk = 0;
833
834         for (KIND_OBJECT_IDX k = 1; k < max_k_idx; k++)
835         {
836                 object_kind *k_ptr = &k_info[k];
837                 if (k_ptr->tval != tval) continue;
838                 if (k_ptr->sval == sval) return (k);
839                 if (sval != SV_ANY) continue;
840                 if (!one_in_(++num)) continue;
841
842                 bk = k;
843         }
844
845         if (sval == SV_ANY)
846         {
847                 return bk;
848         }
849
850         return 0;
851 }
852
853
854 /*!
855  * @brief オブジェクトを初期化する
856  * Wipe an object clean.
857  * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
858  * @return なし
859  */
860 void object_wipe(object_type *o_ptr)
861 {
862         (void)WIPE(o_ptr, object_type);
863 }
864
865
866 /*!
867  * @brief オブジェクトを複製する
868  * Wipe an object clean.
869  * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
870  * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
871  * @return なし
872  */
873 void object_copy(object_type *o_ptr, object_type *j_ptr)
874 {
875         (void)COPY(o_ptr, j_ptr, object_type);
876 }
877
878
879 /*!
880  * @brief オブジェクト構造体にベースアイテムを作成する
881  * Prepare an object based on an object kind.
882  * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
883  * @param k_idx 新たに作成したいベースアイテム情報のID
884  * @return なし
885  */
886 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
887 {
888         object_kind *k_ptr = &k_info[k_idx];
889         object_wipe(o_ptr);
890         o_ptr->k_idx = k_idx;
891         o_ptr->tval = k_ptr->tval;
892         o_ptr->sval = k_ptr->sval;
893         o_ptr->pval = k_ptr->pval;
894         o_ptr->number = 1;
895         o_ptr->weight = k_ptr->weight;
896         o_ptr->to_h = k_ptr->to_h;
897         o_ptr->to_d = k_ptr->to_d;
898         o_ptr->to_a = k_ptr->to_a;
899         o_ptr->ac = k_ptr->ac;
900         o_ptr->dd = k_ptr->dd;
901         o_ptr->ds = k_ptr->ds;
902
903         if (k_ptr->act_idx > 0) o_ptr->xtra2 = (XTRA8)k_ptr->act_idx;
904         if (k_info[o_ptr->k_idx].cost <= 0) o_ptr->ident |= (IDENT_BROKEN);
905
906         if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
907         if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
908         if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
909         if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
910         if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
911         if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
912 }
913
914
915 /*!
916  *
917  * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
918  * Choose random ego type
919  * @param slot 取得したいエゴの装備部位
920  * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
921  * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
922  */
923 static byte get_random_ego(byte slot, bool good)
924 {
925         long total = 0L;
926         for (int i = 1; i < max_e_idx; i++)
927         {
928                 ego_item_type *e_ptr;
929                 e_ptr = &e_info[i];
930                 if (e_ptr->slot == slot
931                         && ((good && e_ptr->rating) || (!good && !e_ptr->rating)))
932                 {
933                         if (e_ptr->rarity)
934                                 total += (255 / e_ptr->rarity);
935                 }
936         }
937
938         int value = randint1(total);
939         int j;
940         for (j = 1; j < max_e_idx; j++)
941         {
942                 ego_item_type *e_ptr;
943                 e_ptr = &e_info[j];
944                 if (e_ptr->slot == slot
945                         && ((good && e_ptr->rating) || (!good && !e_ptr->rating)))
946                 {
947                         if (e_ptr->rarity)
948                                 value -= (255 / e_ptr->rarity);
949                         if (value <= 0L) break;
950                 }
951         }
952
953         return (byte)j;
954 }
955
956
957 /*!
958  * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
959  * Apply magic to an item known to be a "weapon"
960  * @param owner_ptr プレーヤーへの参照ポインタ
961  * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
962  * @param level 生成基準階
963  * @param power 生成ランク
964  * @return なし
965  * @details
966  * Hack -- note special base damage dice boosting\n
967  * Hack -- note special processing for weapon/digger\n
968  */
969 void apply_magic_weapon(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
970 {
971         HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
972         HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
973
974         HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
975         HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
976
977         if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
978         {
979                 tohit2 = (tohit2 + 1) / 2;
980                 todam2 = (todam2 + 1) / 2;
981         }
982
983         if (power > 0)
984         {
985                 o_ptr->to_h += tohit1;
986                 o_ptr->to_d += todam1;
987                 if (power > 1)
988                 {
989                         o_ptr->to_h += tohit2;
990                         o_ptr->to_d += todam2;
991                 }
992         }
993         else if (power < 0)
994         {
995                 o_ptr->to_h -= tohit1;
996                 o_ptr->to_d -= todam1;
997                 if (power < -1)
998                 {
999                         o_ptr->to_h -= tohit2;
1000                         o_ptr->to_d -= todam2;
1001                 }
1002
1003                 if (o_ptr->to_h + o_ptr->to_d < 0)
1004                         o_ptr->curse_flags |= TRC_CURSED;
1005         }
1006
1007         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
1008
1009         switch (o_ptr->tval)
1010         {
1011         case TV_DIGGING:
1012         {
1013                 if (power > 1)
1014                 {
1015                         /* power > 2 is debug only */
1016                         if (one_in_(30) || (power > 2))
1017                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1018                         else
1019                                 o_ptr->name2 = EGO_DIGGING;
1020                 }
1021                 else if (power < -1)
1022                 {
1023                         o_ptr->pval = 0 - (5 + randint1(5));
1024                 }
1025                 else if (power < 0)
1026                 {
1027                         o_ptr->pval = 0 - (o_ptr->pval);
1028                 }
1029
1030                 break;
1031         }
1032         case TV_HAFTED:
1033         case TV_POLEARM:
1034         case TV_SWORD:
1035         {
1036                 if (power > 1)
1037                 {
1038                         /* power > 2 is debug only */
1039                         if (one_in_(40) || (power > 2))
1040                         {
1041                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1042                                 break;
1043                         }
1044                         while (TRUE)
1045                         {
1046                                 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
1047                                 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
1048                                         continue;
1049                                 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
1050                                         continue;
1051                                 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
1052                                         continue;
1053                                 break;
1054                         }
1055
1056                         switch (o_ptr->name2)
1057                         {
1058                         case EGO_HA:
1059                                 if (one_in_(4) && (level > 40))
1060                                         add_flag(o_ptr->art_flags, TR_BLOWS);
1061                                 break;
1062                         case EGO_DF:
1063                                 if (one_in_(3))
1064                                         add_flag(o_ptr->art_flags, TR_RES_POIS);
1065                                 if (one_in_(3))
1066                                         add_flag(o_ptr->art_flags, TR_WARNING);
1067                                 break;
1068                         case EGO_KILL_DRAGON:
1069                                 if (one_in_(3))
1070                                         add_flag(o_ptr->art_flags, TR_RES_POIS);
1071                                 break;
1072                         case EGO_WEST:
1073                                 if (one_in_(3))
1074                                         add_flag(o_ptr->art_flags, TR_RES_FEAR);
1075                                 break;
1076                         case EGO_SLAYING_WEAPON:
1077                                 if (one_in_(3))
1078                                         o_ptr->dd *= 2;
1079                                 else
1080                                 {
1081                                         do
1082                                         {
1083                                                 o_ptr->dd++;
1084                                         } while (one_in_(o_ptr->dd));
1085
1086                                         do
1087                                         {
1088                                                 o_ptr->ds++;
1089                                         } while (one_in_(o_ptr->ds));
1090                                 }
1091
1092                                 if (one_in_(5))
1093                                 {
1094                                         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1095                                 }
1096                                 if (o_ptr->tval == TV_SWORD && one_in_(3))
1097                                 {
1098                                         add_flag(o_ptr->art_flags, TR_VORPAL);
1099                                 }
1100                                 break;
1101                         case EGO_TRUMP:
1102                                 if (one_in_(5))
1103                                         add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1104                                 if (one_in_(7))
1105                                         one_ability(o_ptr);
1106                                 break;
1107                         case EGO_PATTERN:
1108                                 if (one_in_(3))
1109                                         add_flag(o_ptr->art_flags, TR_HOLD_EXP);
1110                                 if (one_in_(3))
1111                                         add_flag(o_ptr->art_flags, TR_DEX);
1112                                 if (one_in_(5))
1113                                         add_flag(o_ptr->art_flags, TR_RES_FEAR);
1114                                 break;
1115                         case EGO_SHARPNESS:
1116                                 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
1117                                 break;
1118                         case EGO_EARTHQUAKES:
1119                                 if (one_in_(3) && (level > 60))
1120                                         add_flag(o_ptr->art_flags, TR_BLOWS);
1121                                 else
1122                                         o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
1123                                 break;
1124                         case EGO_VAMPIRIC:
1125                                 if (one_in_(5))
1126                                         add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
1127                                 break;
1128                         case EGO_DEMON:
1129
1130                                 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1131                                 one_in_(3) ?
1132                                         add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
1133                                         one_in_(2) ?
1134                                         add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
1135                                         add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
1136
1137
1138                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CHAOTIC);
1139                                 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BLOWS);
1140                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
1141                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
1142                                 break;
1143                         }
1144
1145                         if (!o_ptr->art_name)
1146                         {
1147                                 while (one_in_(10L * o_ptr->dd * o_ptr->ds))
1148                                         o_ptr->dd++;
1149
1150                                 if (o_ptr->dd > 9) o_ptr->dd = 9;
1151                         }
1152                 }
1153                 else if (power < -1)
1154                 {
1155                         if (randint0(MAX_DEPTH) < level)
1156                         {
1157                                 while (TRUE)
1158                                 {
1159                                         o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
1160                                         if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
1161                                         {
1162                                                 continue;
1163                                         }
1164
1165                                         break;
1166                                 }
1167
1168                                 switch (o_ptr->name2)
1169                                 {
1170                                 case EGO_MORGUL:
1171                                         if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
1172                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1173                                         break;
1174                                 case EGO_WEIRD:
1175                                         if (one_in_(4)) add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1176                                         if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_NETHER);
1177                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
1178                                         if (one_in_(6)) add_flag(o_ptr->art_flags, TR_NO_TELE);
1179                                         if (one_in_(6)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
1180                                         if (one_in_(6)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
1181                                         break;
1182                                 }
1183                         }
1184                 }
1185
1186                 break;
1187         }
1188         case TV_BOW:
1189         {
1190                 if (power > 1)
1191                 {
1192                         /* power > 2 is debug only */
1193                         if (one_in_(20) || (power > 2))
1194                         {
1195                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1196                                 break;
1197                         }
1198
1199                         o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
1200                 }
1201
1202                 break;
1203         }
1204         case TV_BOLT:
1205         case TV_ARROW:
1206         case TV_SHOT:
1207         {
1208                 if (power > 1)
1209                 {
1210                         /* power > 2 is debug only */
1211                         if (power > 2)
1212                         {
1213                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1214                                 break;
1215                         }
1216
1217                         o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
1218                         switch (o_ptr->name2)
1219                         {
1220                         case EGO_SLAYING_BOLT:
1221                                 o_ptr->dd++;
1222                                 break;
1223                         }
1224
1225                         while (one_in_(10L * o_ptr->dd * o_ptr->ds))
1226                                 o_ptr->dd++;
1227
1228                         if (o_ptr->dd > 9) o_ptr->dd = 9;
1229                 }
1230                 else if (power < -1)
1231                 {
1232                         if (randint0(MAX_DEPTH) < level)
1233                         {
1234                                 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
1235                         }
1236                 }
1237
1238                 break;
1239         }
1240         }
1241 }
1242
1243
1244 /*!
1245  * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
1246  * Apply magic to an item known to be "armor"
1247  * @param owner_ptr プレーヤーへの参照ポインタ
1248  * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
1249  * @param level 生成基準階
1250  * @param power 生成ランク
1251  * @return なし
1252  * @details
1253  * Hack -- note special processing for crown/helm\n
1254  * Hack -- note special processing for robe of permanence\n
1255  */
1256 static void a_m_aux_2(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
1257 {
1258         ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
1259         ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
1260         if (power > 0)
1261         {
1262                 o_ptr->to_a += toac1;
1263                 if (power > 1)
1264                 {
1265                         o_ptr->to_a += toac2;
1266                 }
1267         }
1268         else if (power < 0)
1269         {
1270                 o_ptr->to_a -= toac1;
1271                 if (power < -1)
1272                 {
1273                         o_ptr->to_a -= toac2;
1274                 }
1275
1276                 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
1277         }
1278
1279         switch (o_ptr->tval)
1280         {
1281         case TV_DRAG_ARMOR:
1282         {
1283                 /* power > 2 is debug only */
1284                 if (one_in_(50) || (power > 2))
1285                         become_random_artifact(owner_ptr, o_ptr, FALSE);
1286                 break;
1287         }
1288         case TV_HARD_ARMOR:
1289         case TV_SOFT_ARMOR:
1290         {
1291                 if (power > 1)
1292                 {
1293                         if ((o_ptr->tval == TV_SOFT_ARMOR) &&
1294                                 (o_ptr->sval == SV_ROBE) &&
1295                                 (randint0(100) < 15))
1296                         {
1297                                 if (one_in_(5))
1298                                 {
1299                                         o_ptr->name2 = EGO_YOIYAMI;
1300                                         o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
1301                                         o_ptr->sval = SV_YOIYAMI_ROBE;
1302                                         o_ptr->ac = 0;
1303                                         o_ptr->to_a = 0;
1304                                 }
1305                                 else
1306                                 {
1307                                         o_ptr->name2 = EGO_PERMANENCE;
1308                                 }
1309
1310                                 break;
1311                         }
1312
1313                         /* power > 2 is debug only */
1314                         if (one_in_(20) || (power > 2))
1315                         {
1316                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1317                                 break;
1318                         }
1319
1320                         while (TRUE)
1321                         {
1322                                 bool okay_flag = TRUE;
1323                                 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
1324                                 switch (o_ptr->name2)
1325                                 {
1326                                 case EGO_DWARVEN:
1327                                         if (o_ptr->tval != TV_HARD_ARMOR)
1328                                         {
1329                                                 okay_flag = FALSE;
1330                                         }
1331
1332                                         break;
1333                                 case EGO_DRUID:
1334                                         if (o_ptr->tval != TV_SOFT_ARMOR)
1335                                         {
1336                                                 okay_flag = FALSE;
1337                                         }
1338
1339                                         break;
1340                                 default:
1341                                         break;
1342                                 }
1343
1344                                 if (okay_flag) break;
1345                         }
1346
1347                         switch (o_ptr->name2)
1348                         {
1349                         case EGO_RESISTANCE:
1350                                 if (one_in_(4))
1351                                         add_flag(o_ptr->art_flags, TR_RES_POIS);
1352                                 break;
1353                         case EGO_DWARVEN:
1354                                 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
1355                                 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
1356                                 break;
1357
1358                         case EGO_A_DEMON:
1359                                 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1360                                 one_in_(3) ?
1361                                         add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
1362                                         one_in_(2) ?
1363                                         add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
1364                                         add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
1365
1366                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
1367                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
1368                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
1369                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
1370                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
1371                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
1372                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
1373                                 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
1374                                 break;
1375                         case EGO_A_MORGUL:
1376                                 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1377                                 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
1378                                 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
1379                                 if (one_in_(6)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
1380                                 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
1381                                 if (one_in_(9)) add_flag(o_ptr->art_flags, TR_NO_TELE);
1382                                 break;
1383                         default:
1384                                 break;
1385                         }
1386                 }
1387
1388                 break;
1389         }
1390         case TV_SHIELD:
1391         {
1392                 if (o_ptr->sval == SV_DRAGON_SHIELD)
1393                 {
1394                         dragon_resist(o_ptr);
1395                         if (!one_in_(3)) break;
1396                 }
1397
1398                 if (power > 1)
1399                 {
1400                         /* power > 2 is debug only */
1401                         if (one_in_(20) || (power > 2))
1402                         {
1403                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1404                                 break;
1405                         }
1406
1407                         while (TRUE)
1408                         {
1409                                 o_ptr->name2 = get_random_ego(INVEN_LARM, TRUE);
1410                                 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD
1411                                         && o_ptr->name2 == EGO_S_DWARVEN)
1412                                 {
1413                                         continue;
1414                                 }
1415
1416                                 break;
1417                         }
1418
1419                         switch (o_ptr->name2)
1420                         {
1421                         case EGO_ENDURANCE:
1422                                 if (!one_in_(3)) one_high_resistance(o_ptr);
1423                                 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
1424                                 break;
1425                         case EGO_REFLECTION:
1426                                 if (o_ptr->sval == SV_MIRROR_SHIELD)
1427                                         o_ptr->name2 = 0;
1428                                 break;
1429
1430                         case EGO_S_DWARVEN:
1431                                 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
1432                                 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
1433                                 break;
1434                         }
1435                 }
1436
1437                 break;
1438         }
1439         case TV_GLOVES:
1440         {
1441                 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
1442                 {
1443                         dragon_resist(o_ptr);
1444                         if (!one_in_(3)) break;
1445                 }
1446
1447                 if (power > 1)
1448                 {
1449                         /* power > 2 is debug only */
1450                         if (one_in_(20) || (power > 2))
1451                         {
1452                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1453                                 break;
1454                         }
1455                         o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
1456                 }
1457                 else if (power < -1)
1458                 {
1459                         o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
1460                 }
1461
1462                 break;
1463         }
1464
1465         case TV_BOOTS:
1466         {
1467                 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
1468                 {
1469                         dragon_resist(o_ptr);
1470                         if (!one_in_(3)) break;
1471                 }
1472
1473                 if (power > 1)
1474                 {
1475                         /* power > 2 is debug only */
1476                         if (one_in_(20) || (power > 2))
1477                         {
1478                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1479                                 break;
1480                         }
1481
1482                         o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
1483                         switch (o_ptr->name2)
1484                         {
1485                         case EGO_SLOW_DESCENT:
1486                                 if (one_in_(2))
1487                                 {
1488                                         one_high_resistance(o_ptr);
1489                                 }
1490
1491                                 break;
1492                         }
1493                 }
1494                 else if (power < -1)
1495                 {
1496                         o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
1497                 }
1498
1499                 break;
1500         }
1501         case TV_CROWN:
1502         {
1503                 if (power > 1)
1504                 {
1505                         /* power > 2 is debug only */
1506                         if (one_in_(20) || (power > 2))
1507                         {
1508                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1509                                 break;
1510                         }
1511
1512                         while (TRUE)
1513                         {
1514                                 bool ok_flag = TRUE;
1515                                 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
1516
1517                                 switch (o_ptr->name2)
1518                                 {
1519                                 case EGO_TELEPATHY:
1520                                         if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
1521                                         else add_esp_weak(o_ptr, FALSE);
1522                                         break;
1523                                 case EGO_MAGI:
1524                                 case EGO_MIGHT:
1525                                 case EGO_REGENERATION:
1526                                 case EGO_LORDLINESS:
1527                                 case EGO_BASILISK:
1528                                         break;
1529                                 case EGO_SEEING:
1530                                         if (one_in_(3))
1531                                         {
1532                                                 if (one_in_(2)) add_esp_strong(o_ptr);
1533                                                 else add_esp_weak(o_ptr, FALSE);
1534                                         }
1535                                         break;
1536                                 default:
1537                                         /* not existing crown (wisdom,lite, etc...) */
1538                                         ok_flag = FALSE;
1539                                 }
1540
1541                                 if (ok_flag)
1542                                         break;
1543                         }
1544
1545                         break;
1546                 }
1547                 else if (power < -1)
1548                 {
1549                         while (TRUE)
1550                         {
1551                                 bool ok_flag = TRUE;
1552                                 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
1553
1554                                 switch (o_ptr->name2)
1555                                 {
1556                                 case EGO_ANCIENT_CURSE:
1557                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_MAGIC);
1558                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_NO_TELE);
1559                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
1560                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
1561                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
1562                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
1563                                         break;
1564                                 }
1565
1566                                 if (ok_flag)
1567                                         break;
1568                         }
1569                 }
1570
1571                 break;
1572         }
1573         case TV_HELM:
1574         {
1575                 if (o_ptr->sval == SV_DRAGON_HELM)
1576                 {
1577                         dragon_resist(o_ptr);
1578                         if (!one_in_(3)) break;
1579                 }
1580
1581                 if (power > 1)
1582                 {
1583                         /* power > 2 is debug only */
1584                         if (one_in_(20) || (power > 2))
1585                         {
1586                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1587                                 break;
1588                         }
1589
1590                         while (TRUE)
1591                         {
1592                                 bool ok_flag = TRUE;
1593                                 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
1594                                 switch (o_ptr->name2)
1595                                 {
1596                                 case EGO_BRILLIANCE:
1597                                 case EGO_DARK:
1598                                 case EGO_INFRAVISION:
1599                                 case EGO_H_PROTECTION:
1600                                         break;
1601                                 case EGO_SEEING:
1602                                         if (one_in_(7))
1603                                         {
1604                                                 if (one_in_(2)) add_esp_strong(o_ptr);
1605                                                 else add_esp_weak(o_ptr, FALSE);
1606                                         }
1607
1608                                         break;
1609                                 case EGO_LITE:
1610                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_1);
1611                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_LITE_2);
1612                                         break;
1613                                 case EGO_H_DEMON:
1614                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1615                                         one_in_(3) ?
1616                                                 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
1617                                                 one_in_(2) ?
1618                                                 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
1619                                                 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
1620
1621                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_AGGRAVATE);
1622                                         if (one_in_(3)) add_flag(o_ptr->art_flags, TR_ADD_L_CURSE);
1623                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_ADD_H_CURSE);
1624                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_HP);
1625                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
1626                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
1627                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_TY_CURSE);
1628                                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_CALL_DEMON);
1629                                         break;
1630                                 default:
1631                                         /* not existing helm (Magi, Might, etc...)*/
1632                                         ok_flag = FALSE;
1633                                 }
1634                                 if (ok_flag)
1635                                         break;
1636                         }
1637
1638                         break;
1639                 }
1640                 else if (power < -1)
1641                 {
1642                         while (TRUE)
1643                         {
1644                                 bool ok_flag = TRUE;
1645                                 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
1646
1647                                 switch (o_ptr->name2)
1648                                 {
1649                                 case EGO_ANCIENT_CURSE:
1650                                         ok_flag = FALSE;
1651                                 }
1652
1653                                 if (ok_flag)
1654                                         break;
1655                         }
1656                 }
1657
1658                 break;
1659         }
1660         case TV_CLOAK:
1661         {
1662                 if (power > 1)
1663                 {
1664                         /* power > 2 is debug only */
1665                         if (one_in_(20) || (power > 2))
1666                         {
1667                                 become_random_artifact(owner_ptr, o_ptr, FALSE);
1668                                 break;
1669                         }
1670                         o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
1671
1672                         switch (o_ptr->name2)
1673                         {
1674                         case EGO_BAT:
1675                                 o_ptr->to_d -= 6;
1676                                 o_ptr->to_h -= 6;
1677                                 break;
1678                         case EGO_NAZGUL:
1679                                 o_ptr->to_d -= 3;
1680                                 o_ptr->to_h -= 3;
1681                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_COWARDICE);
1682                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_CALL_UNDEAD);
1683                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_SLOW_REGEN);
1684                                 if (one_in_(3)) add_flag(o_ptr->art_flags, TR_DRAIN_EXP);
1685                                 break;
1686                         }
1687
1688                 }
1689                 else if (power < -1)
1690                 {
1691                         o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
1692                 }
1693
1694                 break;
1695         }
1696         }
1697 }
1698
1699
1700 /*!
1701  * @brief 装飾品系オブジェクトに生成ランクごとの強化を与えるサブルーチン
1702  * Apply magic to an item known to be a "ring" or "amulet"
1703  * @param owner_ptr プレーヤーへの参照ポインタ
1704  * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
1705  * @param level 生成基準階
1706  * @param power 生成ランク
1707  * @return なし
1708  * @details
1709  * Hack -- note special "pval boost" code for ring of speed\n
1710  * Hack -- note that some items must be cursed (or blessed)\n
1711  */
1712 static void a_m_aux_3(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
1713 {
1714         switch (o_ptr->tval)
1715         {
1716         case TV_RING:
1717         {
1718                 switch (o_ptr->sval)
1719                 {
1720                 case SV_RING_ATTACKS:
1721                 {
1722                         o_ptr->pval = (PARAMETER_VALUE)m_bonus(2, level);
1723                         if (one_in_(15)) o_ptr->pval++;
1724                         if (o_ptr->pval < 1) o_ptr->pval = 1;
1725
1726                         if (power < 0)
1727                         {
1728                                 o_ptr->ident |= (IDENT_BROKEN);
1729                                 o_ptr->curse_flags |= TRC_CURSED;
1730                                 o_ptr->pval = 0 - (o_ptr->pval);
1731                         }
1732
1733                         break;
1734                 }
1735                 case SV_RING_SHOTS:
1736                 {
1737                         break;
1738                 }
1739                 case SV_RING_STR:
1740                 case SV_RING_CON:
1741                 case SV_RING_DEX:
1742                 {
1743                         o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
1744                         if (power < 0)
1745                         {
1746                                 o_ptr->ident |= (IDENT_BROKEN);
1747                                 o_ptr->curse_flags |= TRC_CURSED;
1748                                 o_ptr->pval = 0 - (o_ptr->pval);
1749                         }
1750
1751                         break;
1752                 }
1753                 case SV_RING_SPEED:
1754                 {
1755                         o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
1756                         while (randint0(100) < 50) o_ptr->pval++;
1757
1758                         if (power < 0)
1759                         {
1760                                 o_ptr->ident |= (IDENT_BROKEN);
1761                                 o_ptr->curse_flags |= TRC_CURSED;
1762                                 o_ptr->pval = 0 - (o_ptr->pval);
1763                                 break;
1764                         }
1765
1766                         break;
1767                 }
1768                 case SV_RING_LORDLY:
1769                 {
1770                         do
1771                         {
1772                                 one_lordly_high_resistance(o_ptr);
1773                         } while (one_in_(4));
1774
1775                         o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
1776                         break;
1777                 }
1778                 case SV_RING_WARNING:
1779                 {
1780                         if (one_in_(3)) one_low_esp(o_ptr);
1781                         break;
1782                 }
1783                 case SV_RING_SEARCHING:
1784                 {
1785                         o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
1786                         if (power < 0)
1787                         {
1788                                 o_ptr->ident |= (IDENT_BROKEN);
1789                                 o_ptr->curse_flags |= TRC_CURSED;
1790                                 o_ptr->pval = 0 - (o_ptr->pval);
1791                         }
1792
1793                         break;
1794                 }
1795                 case SV_RING_FLAMES:
1796                 case SV_RING_ACID:
1797                 case SV_RING_ICE:
1798                 case SV_RING_ELEC:
1799                 {
1800                         o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
1801                         break;
1802                 }
1803                 case SV_RING_WEAKNESS:
1804                 case SV_RING_STUPIDITY:
1805                 {
1806                         o_ptr->ident |= (IDENT_BROKEN);
1807                         o_ptr->curse_flags |= TRC_CURSED;
1808                         o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
1809                         if (power > 0) power = 0 - power;
1810
1811                         break;
1812                 }
1813                 case SV_RING_WOE:
1814                 {
1815                         o_ptr->ident |= (IDENT_BROKEN);
1816                         o_ptr->curse_flags |= TRC_CURSED;
1817                         o_ptr->to_a = 0 - (5 + (ARMOUR_CLASS)m_bonus(10, level));
1818                         o_ptr->pval = 0 - (1 + (PARAMETER_VALUE)m_bonus(5, level));
1819                         if (power > 0) power = 0 - power;
1820
1821                         break;
1822                 }
1823                 case SV_RING_DAMAGE:
1824                 {
1825                         o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
1826                         if (power < 0)
1827                         {
1828                                 o_ptr->ident |= (IDENT_BROKEN);
1829                                 o_ptr->curse_flags |= TRC_CURSED;
1830                                 o_ptr->to_d = 0 - o_ptr->to_d;
1831                         }
1832
1833                         break;
1834                 }
1835                 case SV_RING_ACCURACY:
1836                 {
1837                         o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
1838                         if (power < 0)
1839                         {
1840                                 o_ptr->ident |= (IDENT_BROKEN);
1841                                 o_ptr->curse_flags |= TRC_CURSED;
1842                                 o_ptr->to_h = 0 - o_ptr->to_h;
1843                         }
1844
1845                         break;
1846                 }
1847                 case SV_RING_PROTECTION:
1848                 {
1849                         o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
1850                         if (power < 0)
1851                         {
1852                                 o_ptr->ident |= (IDENT_BROKEN);
1853                                 o_ptr->curse_flags |= TRC_CURSED;
1854                                 o_ptr->to_a = 0 - o_ptr->to_a;
1855                         }
1856
1857                         break;
1858                 }
1859                 case SV_RING_SLAYING:
1860                 {
1861                         o_ptr->to_d = randint1(5) + (HIT_POINT)m_bonus(12, level);
1862                         o_ptr->to_h = randint1(5) + (HIT_PROB)m_bonus(12, level);
1863
1864                         if (power < 0)
1865                         {
1866                                 o_ptr->ident |= (IDENT_BROKEN);
1867                                 o_ptr->curse_flags |= TRC_CURSED;
1868                                 o_ptr->to_h = 0 - o_ptr->to_h;
1869                                 o_ptr->to_d = 0 - o_ptr->to_d;
1870                         }
1871
1872                         break;
1873                 }
1874                 case SV_RING_MUSCLE:
1875                 {
1876                         o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
1877                         if (one_in_(4)) o_ptr->pval++;
1878
1879                         if (power < 0)
1880                         {
1881                                 o_ptr->ident |= (IDENT_BROKEN);
1882                                 o_ptr->curse_flags |= TRC_CURSED;
1883                                 o_ptr->pval = 0 - o_ptr->pval;
1884                         }
1885
1886                         break;
1887                 }
1888                 case SV_RING_AGGRAVATION:
1889                 {
1890                         o_ptr->ident |= (IDENT_BROKEN);
1891                         o_ptr->curse_flags |= TRC_CURSED;
1892                         if (power > 0) power = 0 - power;
1893                         break;
1894                 }
1895                 }
1896
1897                 /* power > 2 is debug only */
1898                 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79)) || (power > 2))
1899                 {
1900                         o_ptr->pval = MIN(o_ptr->pval, 4);
1901                         become_random_artifact(owner_ptr, o_ptr, FALSE);
1902                 }
1903                 else if ((power == 2) && one_in_(2))
1904                 {
1905                         while (!o_ptr->name2)
1906                         {
1907                                 int tmp = m_bonus(10, level);
1908                                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1909                                 switch (randint1(28))
1910                                 {
1911                                 case 1: case 2:
1912                                         o_ptr->name2 = EGO_RING_THROW;
1913                                         break;
1914                                 case 3: case 4:
1915                                         if (have_flag(k_ptr->flags, TR_REGEN)) break;
1916                                         o_ptr->name2 = EGO_RING_REGEN;
1917                                         break;
1918                                 case 5: case 6:
1919                                         if (have_flag(k_ptr->flags, TR_LITE_1)) break;
1920                                         o_ptr->name2 = EGO_RING_LITE;
1921                                         break;
1922                                 case 7: case 8:
1923                                         if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
1924                                         o_ptr->name2 = EGO_RING_TELEPORT;
1925                                         break;
1926                                 case 9: case 10:
1927                                         if (o_ptr->to_h) break;
1928                                         o_ptr->name2 = EGO_RING_TO_H;
1929                                         break;
1930                                 case 11: case 12:
1931                                         if (o_ptr->to_d) break;
1932                                         o_ptr->name2 = EGO_RING_TO_D;
1933                                         break;
1934                                 case 13:
1935                                         if ((o_ptr->to_h) || (o_ptr->to_d)) break;
1936                                         o_ptr->name2 = EGO_RING_SLAY;
1937                                         break;
1938                                 case 14:
1939                                         if ((have_flag(k_ptr->flags, TR_STR)) || o_ptr->to_h || o_ptr->to_d) break;
1940                                         o_ptr->name2 = EGO_RING_WIZARD;
1941                                         break;
1942                                 case 15:
1943                                         if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
1944                                         o_ptr->name2 = EGO_RING_HERO;
1945                                         break;
1946                                 case 16:
1947                                         if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
1948                                         if (tmp > 8) o_ptr->name2 = EGO_RING_MANA_BALL;
1949                                         else if (tmp > 4) o_ptr->name2 = EGO_RING_MANA_BOLT;
1950                                         else o_ptr->name2 = EGO_RING_MAGIC_MIS;
1951                                         break;
1952                                 case 17:
1953                                         if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
1954                                         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;
1955                                         if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_F;
1956                                         else if (tmp > 3) o_ptr->name2 = EGO_RING_FIRE_BALL;
1957                                         else o_ptr->name2 = EGO_RING_FIRE_BOLT;
1958                                         break;
1959                                 case 18:
1960                                         if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
1961                                         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;
1962                                         if (tmp > 7) o_ptr->name2 = EGO_RING_DRAGON_C;
1963                                         else if (tmp > 3) o_ptr->name2 = EGO_RING_COLD_BALL;
1964                                         else o_ptr->name2 = EGO_RING_COLD_BOLT;
1965                                         break;
1966                                 case 19:
1967                                         if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
1968                                         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;
1969                                         if (tmp > 4) o_ptr->name2 = EGO_RING_ELEC_BALL;
1970                                         else o_ptr->name2 = EGO_RING_ELEC_BOLT;
1971                                         break;
1972                                 case 20:
1973                                         if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
1974                                         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;
1975                                         if (tmp > 4) o_ptr->name2 = EGO_RING_ACID_BALL;
1976                                         else o_ptr->name2 = EGO_RING_ACID_BOLT;
1977                                         break;
1978                                 case 21: case 22: case 23: case 24: case 25: case 26:
1979                                         switch (o_ptr->sval)
1980                                         {
1981                                         case SV_RING_SPEED:
1982                                                 if (!one_in_(3)) break;
1983                                                 o_ptr->name2 = EGO_RING_D_SPEED;
1984                                                 break;
1985                                         case SV_RING_DAMAGE:
1986                                         case SV_RING_ACCURACY:
1987                                         case SV_RING_SLAYING:
1988                                                 if (one_in_(2)) break;
1989                                                 if (one_in_(2)) o_ptr->name2 = EGO_RING_HERO;
1990                                                 else
1991                                                 {
1992                                                         o_ptr->name2 = EGO_RING_BERSERKER;
1993                                                         o_ptr->to_h -= 2 + randint1(4);
1994                                                         o_ptr->to_d += 2 + randint1(4);
1995                                                 }
1996
1997                                                 break;
1998                                         case SV_RING_PROTECTION:
1999                                                 o_ptr->name2 = EGO_RING_SUPER_AC;
2000                                                 o_ptr->to_a += 7 + m_bonus(5, level);
2001                                                 break;
2002                                         case SV_RING_RES_FEAR:
2003                                                 o_ptr->name2 = EGO_RING_HERO;
2004                                                 break;
2005                                         case SV_RING_SHOTS:
2006                                                 if (one_in_(2)) break;
2007                                                 o_ptr->name2 = EGO_RING_HUNTER;
2008                                                 break;
2009                                         case SV_RING_SEARCHING:
2010                                                 o_ptr->name2 = EGO_RING_STEALTH;
2011                                                 break;
2012                                         case SV_RING_TELEPORTATION:
2013                                                 o_ptr->name2 = EGO_RING_TELE_AWAY;
2014                                                 break;
2015                                         case SV_RING_RES_BLINDNESS:
2016                                                 if (one_in_(2))
2017                                                         o_ptr->name2 = EGO_RING_RES_LITE;
2018                                                 else
2019                                                         o_ptr->name2 = EGO_RING_RES_DARK;
2020                                                 break;
2021                                         case SV_RING_LORDLY:
2022                                                 if (!one_in_(20)) break;
2023                                                 one_lordly_high_resistance(o_ptr);
2024                                                 one_lordly_high_resistance(o_ptr);
2025                                                 o_ptr->name2 = EGO_RING_TRUE;
2026                                                 break;
2027                                         case SV_RING_SUSTAIN:
2028                                                 if (!one_in_(4)) break;
2029                                                 o_ptr->name2 = EGO_RING_RES_TIME;
2030                                                 break;
2031                                         case SV_RING_FLAMES:
2032                                                 if (!one_in_(2)) break;
2033                                                 o_ptr->name2 = EGO_RING_DRAGON_F;
2034                                                 break;
2035                                         case SV_RING_ICE:
2036                                                 if (!one_in_(2)) break;
2037                                                 o_ptr->name2 = EGO_RING_DRAGON_C;
2038                                                 break;
2039                                         case SV_RING_WARNING:
2040                                                 if (!one_in_(2)) break;
2041                                                 o_ptr->name2 = EGO_RING_M_DETECT;
2042                                                 break;
2043                                         default:
2044                                                 break;
2045                                         }
2046
2047                                         break;
2048                                 }
2049                         }
2050
2051                         o_ptr->curse_flags = 0L;
2052                 }
2053                 else if ((power == -2) && one_in_(2))
2054                 {
2055                         if (o_ptr->to_h > 0) o_ptr->to_h = 0 - o_ptr->to_h;
2056                         if (o_ptr->to_d > 0) o_ptr->to_d = 0 - o_ptr->to_d;
2057                         if (o_ptr->to_a > 0) o_ptr->to_a = 0 - o_ptr->to_a;
2058                         if (o_ptr->pval > 0) o_ptr->pval = 0 - o_ptr->pval;
2059                         o_ptr->art_flags[0] = 0;
2060                         o_ptr->art_flags[1] = 0;
2061                         while (!o_ptr->name2)
2062                         {
2063                                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2064                                 switch (randint1(5))
2065                                 {
2066                                 case 1:
2067                                         if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
2068                                         o_ptr->name2 = EGO_RING_DRAIN_EXP;
2069                                         break;
2070                                 case 2:
2071                                         o_ptr->name2 = EGO_RING_NO_MELEE;
2072                                         break;
2073                                 case 3:
2074                                         if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
2075                                         o_ptr->name2 = EGO_RING_AGGRAVATE;
2076                                         break;
2077                                 case 4:
2078                                         if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
2079                                         o_ptr->name2 = EGO_RING_TY_CURSE;
2080                                         break;
2081                                 case 5:
2082                                         o_ptr->name2 = EGO_RING_ALBINO;
2083                                         break;
2084                                 }
2085                         }
2086
2087                         o_ptr->ident |= (IDENT_BROKEN);
2088                         o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
2089                 }
2090
2091                 break;
2092         }
2093         case TV_AMULET:
2094         {
2095                 switch (o_ptr->sval)
2096                 {
2097                 case SV_AMULET_INTELLIGENCE:
2098                 case SV_AMULET_WISDOM:
2099                 case SV_AMULET_CHARISMA:
2100                 {
2101                         o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
2102                         if (power < 0)
2103                         {
2104                                 o_ptr->ident |= (IDENT_BROKEN);
2105                                 o_ptr->curse_flags |= (TRC_CURSED);
2106                                 o_ptr->pval = 0 - o_ptr->pval;
2107                         }
2108
2109                         break;
2110                 }
2111                 case SV_AMULET_BRILLIANCE:
2112                 {
2113                         o_ptr->pval = 1 + m_bonus(3, level);
2114                         if (one_in_(4)) o_ptr->pval++;
2115
2116                         if (power < 0)
2117                         {
2118                                 o_ptr->ident |= (IDENT_BROKEN);
2119                                 o_ptr->curse_flags |= (TRC_CURSED);
2120                                 o_ptr->pval = 0 - o_ptr->pval;
2121                         }
2122
2123                         break;
2124                 }
2125                 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
2126                 {
2127                         if (power < 0)
2128                         {
2129                                 o_ptr->curse_flags |= (TRC_CURSED);
2130                         }
2131
2132                         break;
2133                 }
2134                 case SV_AMULET_RESISTANCE:
2135                 {
2136                         if (one_in_(5)) one_high_resistance(o_ptr);
2137                         if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2138                         break;
2139                 }
2140                 case SV_AMULET_SEARCHING:
2141                 {
2142                         o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
2143                         if (power < 0)
2144                         {
2145                                 o_ptr->ident |= (IDENT_BROKEN);
2146                                 o_ptr->curse_flags |= (TRC_CURSED);
2147                                 o_ptr->pval = 0 - (o_ptr->pval);
2148                         }
2149
2150                         break;
2151                 }
2152                 case SV_AMULET_THE_MAGI:
2153                 {
2154                         o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
2155                         o_ptr->to_a = randint1(5) + (ARMOUR_CLASS)m_bonus(5, level);
2156                         add_esp_weak(o_ptr, FALSE);
2157                         break;
2158                 }
2159                 case SV_AMULET_DOOM:
2160                 {
2161                         o_ptr->ident |= (IDENT_BROKEN);
2162                         o_ptr->curse_flags |= (TRC_CURSED);
2163                         o_ptr->pval = 0 - (randint1(5) + (PARAMETER_VALUE)m_bonus(5, level));
2164                         o_ptr->to_a = 0 - (randint1(5) + (ARMOUR_CLASS)m_bonus(5, level));
2165                         if (power > 0) power = 0 - power;
2166
2167                         break;
2168                 }
2169                 case SV_AMULET_MAGIC_MASTERY:
2170                 {
2171                         o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
2172                         if (power < 0)
2173                         {
2174                                 o_ptr->ident |= (IDENT_BROKEN);
2175                                 o_ptr->curse_flags |= (TRC_CURSED);
2176                                 o_ptr->pval = 0 - o_ptr->pval;
2177                         }
2178
2179                         break;
2180                 }
2181                 }
2182
2183                 /* power > 2 is debug only */
2184                 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79)) || (power > 2))
2185                 {
2186                         o_ptr->pval = MIN(o_ptr->pval, 4);
2187                         become_random_artifact(owner_ptr, o_ptr, FALSE);
2188                 }
2189                 else if ((power == 2) && one_in_(2))
2190                 {
2191                         while (!o_ptr->name2)
2192                         {
2193                                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2194                                 switch (randint1(21))
2195                                 {
2196                                 case 1: case 2:
2197                                         if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
2198                                         o_ptr->name2 = EGO_AMU_SLOW_D;
2199                                         break;
2200                                 case 3: case 4:
2201                                         if (o_ptr->pval) break;
2202                                         o_ptr->name2 = EGO_AMU_INFRA;
2203                                         break;
2204                                 case 5: case 6:
2205                                         if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
2206                                         o_ptr->name2 = EGO_AMU_SEE_INVIS;
2207                                         break;
2208                                 case 7: case 8:
2209                                         if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
2210                                         o_ptr->name2 = EGO_AMU_HOLD_EXP;
2211                                         break;
2212                                 case 9:
2213                                         if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
2214                                         o_ptr->name2 = EGO_AMU_LEVITATION;
2215                                         break;
2216                                 case 10: case 11: case 21:
2217                                         o_ptr->name2 = EGO_AMU_AC;
2218                                         break;
2219                                 case 12:
2220                                         if (have_flag(k_ptr->flags, TR_RES_FIRE)) break;
2221                                         if (m_bonus(10, level) > 8)
2222                                                 o_ptr->name2 = EGO_AMU_RES_FIRE_;
2223                                         else
2224                                                 o_ptr->name2 = EGO_AMU_RES_FIRE;
2225                                         break;
2226                                 case 13:
2227                                         if (have_flag(k_ptr->flags, TR_RES_COLD)) break;
2228                                         if (m_bonus(10, level) > 8)
2229                                                 o_ptr->name2 = EGO_AMU_RES_COLD_;
2230                                         else
2231                                                 o_ptr->name2 = EGO_AMU_RES_COLD;
2232                                         break;
2233                                 case 14:
2234                                         if (have_flag(k_ptr->flags, TR_RES_ELEC)) break;
2235                                         if (m_bonus(10, level) > 8)
2236                                                 o_ptr->name2 = EGO_AMU_RES_ELEC_;
2237                                         else
2238                                                 o_ptr->name2 = EGO_AMU_RES_ELEC;
2239                                         break;
2240                                 case 15:
2241                                         if (have_flag(k_ptr->flags, TR_RES_ACID)) break;
2242                                         if (m_bonus(10, level) > 8)
2243                                                 o_ptr->name2 = EGO_AMU_RES_ACID_;
2244                                         else
2245                                                 o_ptr->name2 = EGO_AMU_RES_ACID;
2246                                         break;
2247                                 case 16: case 17: case 18: case 19: case 20:
2248                                         switch (o_ptr->sval)
2249                                         {
2250                                         case SV_AMULET_TELEPORT:
2251                                                 if (m_bonus(10, level) > 9) o_ptr->name2 = EGO_AMU_D_DOOR;
2252                                                 else if (one_in_(2)) o_ptr->name2 = EGO_AMU_JUMP;
2253                                                 else o_ptr->name2 = EGO_AMU_TELEPORT;
2254                                                 break;
2255                                         case SV_AMULET_RESIST_ACID:
2256                                                 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
2257                                                 break;
2258                                         case SV_AMULET_SEARCHING:
2259                                                 o_ptr->name2 = EGO_AMU_STEALTH;
2260                                                 break;
2261                                         case SV_AMULET_BRILLIANCE:
2262                                                 if (!one_in_(3)) break;
2263                                                 o_ptr->name2 = EGO_AMU_IDENT;
2264                                                 break;
2265                                         case SV_AMULET_CHARISMA:
2266                                                 if (!one_in_(3)) break;
2267                                                 o_ptr->name2 = EGO_AMU_CHARM;
2268                                                 break;
2269                                         case SV_AMULET_THE_MAGI:
2270                                                 if (one_in_(2)) break;
2271                                                 o_ptr->name2 = EGO_AMU_GREAT;
2272                                                 break;
2273                                         case SV_AMULET_RESISTANCE:
2274                                                 if (!one_in_(5)) break;
2275                                                 o_ptr->name2 = EGO_AMU_DEFENDER;
2276                                                 break;
2277                                         case SV_AMULET_TELEPATHY:
2278                                                 if (!one_in_(3)) break;
2279                                                 o_ptr->name2 = EGO_AMU_DETECTION;
2280                                                 break;
2281                                         }
2282                                 }
2283                         }
2284                         o_ptr->curse_flags = 0L;
2285                 }
2286                 else if ((power == -2) && one_in_(2))
2287                 {
2288                         if (o_ptr->to_h > 0) o_ptr->to_h = 0 - o_ptr->to_h;
2289                         if (o_ptr->to_d > 0) o_ptr->to_d = 0 - o_ptr->to_d;
2290                         if (o_ptr->to_a > 0) o_ptr->to_a = 0 - o_ptr->to_a;
2291                         if (o_ptr->pval > 0) o_ptr->pval = 0 - o_ptr->pval;
2292                         o_ptr->art_flags[0] = 0;
2293                         o_ptr->art_flags[1] = 0;
2294                         while (!o_ptr->name2)
2295                         {
2296                                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2297                                 switch (randint1(5))
2298                                 {
2299                                 case 1:
2300                                         if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
2301                                         o_ptr->name2 = EGO_AMU_DRAIN_EXP;
2302                                         break;
2303                                 case 2:
2304                                         o_ptr->name2 = EGO_AMU_FOOL;
2305                                         break;
2306                                 case 3:
2307                                         if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
2308                                         o_ptr->name2 = EGO_AMU_AGGRAVATE;
2309                                         break;
2310                                 case 4:
2311                                         if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
2312                                         o_ptr->name2 = EGO_AMU_TY_CURSE;
2313                                         break;
2314                                 case 5:
2315                                         o_ptr->name2 = EGO_AMU_NAIVETY;
2316                                         break;
2317                                 }
2318                         }
2319
2320                         o_ptr->ident |= (IDENT_BROKEN);
2321                         o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
2322                 }
2323
2324                 break;
2325         }
2326         }
2327 }
2328
2329
2330 /*!
2331  * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
2332  * Apply magic to an item known to be "boring"
2333  * @param owner_ptr プレーヤーへの参照ポインタ
2334  * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2335  * @param power 生成ランク
2336  * @return なし
2337  * @details
2338  * Hack -- note the special code for various items
2339  */
2340 static void a_m_aux_4(player_type *owner_ptr, object_type *o_ptr, int power)
2341 {
2342         object_kind *k_ptr = &k_info[o_ptr->k_idx];
2343
2344         floor_type *floor_ptr = owner_ptr->current_floor_ptr;
2345         switch (o_ptr->tval)
2346         {
2347         case TV_WHISTLE:
2348         {
2349                 break;
2350         }
2351         case TV_FLASK:
2352         {
2353                 o_ptr->xtra4 = o_ptr->pval;
2354                 o_ptr->pval = 0;
2355                 break;
2356         }
2357         case TV_LITE:
2358         {
2359                 if (o_ptr->sval == SV_LITE_TORCH)
2360                 {
2361                         if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
2362                         o_ptr->pval = 0;
2363                 }
2364
2365                 if (o_ptr->sval == SV_LITE_LANTERN)
2366                 {
2367                         if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
2368                         o_ptr->pval = 0;
2369                 }
2370
2371                 /* power > 2 is debug only */
2372                 if (power > 2)
2373                 {
2374                         become_random_artifact(owner_ptr, o_ptr, FALSE);
2375                 }
2376                 else if ((power == 2) || ((power == 1) && one_in_(3)))
2377                 {
2378                         while (!o_ptr->name2)
2379                         {
2380                                 while (TRUE)
2381                                 {
2382                                         bool okay_flag = TRUE;
2383
2384                                         o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
2385
2386                                         switch (o_ptr->name2)
2387                                         {
2388                                         case EGO_LITE_LONG:
2389                                                 if (o_ptr->sval == SV_LITE_FEANOR)
2390                                                         okay_flag = FALSE;
2391                                         }
2392
2393                                         if (okay_flag)
2394                                                 break;
2395                                 }
2396                         }
2397                 }
2398                 else if (power == -2)
2399                 {
2400                         o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
2401                         switch (o_ptr->name2)
2402                         {
2403                         case EGO_LITE_DARKNESS:
2404                                 o_ptr->xtra4 = 0;
2405
2406                                 if (o_ptr->sval == SV_LITE_TORCH)
2407                                 {
2408                                         add_flag(o_ptr->art_flags, TR_LITE_M1);
2409                                 }
2410                                 else if (o_ptr->sval == SV_LITE_LANTERN)
2411                                 {
2412                                         add_flag(o_ptr->art_flags, TR_LITE_M2);
2413                                 }
2414                                 else if (o_ptr->sval == SV_LITE_FEANOR)
2415                                 {
2416                                         add_flag(o_ptr->art_flags, TR_LITE_M3);
2417                                 }
2418                                 break;
2419                         }
2420                 }
2421
2422                 break;
2423         }
2424         case TV_WAND:
2425         case TV_STAFF:
2426         {
2427                 /* The wand or staff gets a number of initial charges equal
2428                  * to between 1/2 (+1) and the full object kind's pval. -LM-
2429                  */
2430                 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
2431                 break;
2432         }
2433         case TV_ROD:
2434         {
2435                 o_ptr->pval = k_ptr->pval;
2436                 break;
2437         }
2438         case TV_CAPTURE:
2439         {
2440                 o_ptr->pval = 0;
2441                 object_aware(owner_ptr, o_ptr);
2442                 object_known(o_ptr);
2443                 break;
2444         }
2445         case TV_FIGURINE:
2446         {
2447                 PARAMETER_VALUE i = 1;
2448                 int check;
2449                 monster_race *r_ptr;
2450                 while (TRUE)
2451                 {
2452                         i = randint1(max_r_idx - 1);
2453
2454                         if (!item_monster_okay(i)) continue;
2455                         if (i == MON_TSUCHINOKO) continue;
2456
2457                         r_ptr = &r_info[i];
2458                         check = (floor_ptr->dun_level < r_ptr->level) ? (r_ptr->level - floor_ptr->dun_level) : 0;
2459                         if (!r_ptr->rarity) continue;
2460                         if (r_ptr->rarity > 100) continue;
2461                         if (randint0(check)) continue;
2462
2463                         break;
2464                 }
2465
2466                 o_ptr->pval = i;
2467                 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
2468
2469                 break;
2470         }
2471         case TV_CORPSE:
2472         {
2473                 PARAMETER_VALUE i = 1;
2474                 int check;
2475                 u32b match = 0;
2476                 monster_race *r_ptr;
2477                 if (o_ptr->sval == SV_SKELETON)
2478                 {
2479                         match = RF9_DROP_SKELETON;
2480                 }
2481                 else if (o_ptr->sval == SV_CORPSE)
2482                 {
2483                         match = RF9_DROP_CORPSE;
2484                 }
2485
2486                 get_mon_num_prep(owner_ptr, item_monster_okay, NULL);
2487                 while (TRUE)
2488                 {
2489                         i = get_mon_num(owner_ptr, floor_ptr->dun_level, 0);
2490                         r_ptr = &r_info[i];
2491                         check = (floor_ptr->dun_level < r_ptr->level) ? (r_ptr->level - floor_ptr->dun_level) : 0;
2492                         if (!r_ptr->rarity) continue;
2493                         if (!(r_ptr->flags9 & match)) continue;
2494                         if (randint0(check)) continue;
2495
2496                         break;
2497                 }
2498
2499                 o_ptr->pval = i;
2500                 object_aware(owner_ptr, o_ptr);
2501                 object_known(o_ptr);
2502                 break;
2503         }
2504         case TV_STATUE:
2505         {
2506                 PARAMETER_VALUE i = 1;
2507                 monster_race *r_ptr;
2508                 while (TRUE)
2509                 {
2510                         i = randint1(max_r_idx - 1);
2511                         r_ptr = &r_info[i];
2512                         if (!r_ptr->rarity) continue;
2513
2514                         break;
2515                 }
2516
2517                 o_ptr->pval = i;
2518                 if (cheat_peek)
2519                 {
2520                         msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
2521                 }
2522
2523                 object_aware(owner_ptr, o_ptr);
2524                 object_known(o_ptr);
2525                 break;
2526         }
2527         case TV_CHEST:
2528         {
2529                 DEPTH obj_level = k_info[o_ptr->k_idx].level;
2530                 if (obj_level <= 0) break;
2531
2532                 o_ptr->pval = randint1(obj_level);
2533                 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
2534
2535                 o_ptr->xtra3 = floor_ptr->dun_level + 5;
2536                 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
2537
2538                 break;
2539         }
2540         }
2541 }
2542
2543
2544 /*!
2545  * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
2546  * Complete the "creation" of an object by applying "magic" to the item
2547  * @param owner_ptr プレーヤーへの参照ポインタ
2548  * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2549  * @param lev 生成基準階
2550  * @param mode 生成オプション
2551  * @return なし
2552  * @details
2553  * This includes not only rolling for random bonuses, but also putting the\n
2554  * finishing touches on ego-items and artifacts, giving charges to wands and\n
2555  * staffs, giving fuel to lites, and placing traps on chests.\n
2556  *\n
2557  * In particular, note that "Instant Artifacts", if "created" by an external\n
2558  * routine, must pass through this function to complete the actual creation.\n
2559  *\n
2560  * The base "chance" of the item being "good" increases with the "level"\n
2561  * parameter, which is usually derived from the dungeon level, being equal\n
2562  * to the level plus 10, up to a maximum of 75.  If "good" is true, then\n
2563  * the object is guaranteed to be "good".  If an object is "good", then\n
2564  * the chance that the object will be "great" (ego-item or artifact), also\n
2565  * increases with the "level", being equal to half the level, plus 5, up to\n
2566  * a maximum of 20.  If "great" is true, then the object is guaranteed to be\n
2567  * "great".  At dungeon level 65 and below, 15/100 objects are "great".\n
2568  *\n
2569  * If the object is not "good", there is a chance it will be "cursed", and\n
2570  * if it is "cursed", there is a chance it will be "broken".  These chances\n
2571  * are related to the "good" / "great" chances above.\n
2572  *\n
2573  * Otherwise "normal" rings and amulets will be "good" half the time and\n
2574  * "cursed" half the time, unless the ring/amulet is always good or cursed.\n
2575  *\n
2576  * If "okay" is true, and the object is going to be "great", then there is\n
2577  * a chance that an artifact will be created.  This is true even if both the\n
2578  * "good" and "great" arguments are false.  As a total hack, if "great" is\n
2579  * true, then the item gets 3 extra "attempts" to become an artifact.\n
2580  */
2581 void apply_magic(player_type *owner_ptr, object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
2582 {
2583         if (owner_ptr->pseikaku == PERSONALITY_MUNCHKIN) lev += randint0(owner_ptr->lev / 2 + 10);
2584         if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
2585
2586         int f1 = lev + 10;
2587         if (f1 > d_info[owner_ptr->dungeon_idx].obj_good) f1 = d_info[owner_ptr->dungeon_idx].obj_good;
2588
2589         int f2 = f1 * 2 / 3;
2590         if ((owner_ptr->pseikaku != PERSONALITY_MUNCHKIN) && (f2 > d_info[owner_ptr->dungeon_idx].obj_great))
2591                 f2 = d_info[owner_ptr->dungeon_idx].obj_great;
2592
2593         if (owner_ptr->muta3 & MUT3_GOOD_LUCK)
2594         {
2595                 f1 += 5;
2596                 f2 += 2;
2597         }
2598         else if (owner_ptr->muta3 & MUT3_BAD_LUCK)
2599         {
2600                 f1 -= 5;
2601                 f2 -= 2;
2602         }
2603
2604         int power = 0;
2605         if ((mode & AM_GOOD) || magik(f1))
2606         {
2607                 power = 1;
2608                 if ((mode & AM_GREAT) || magik(f2))
2609                 {
2610                         power = 2;
2611                         if (mode & AM_SPECIAL) power = 3;
2612                 }
2613         }
2614         else if (magik(f1))
2615         {
2616                 power = -1;
2617                 if (magik(f2)) power = -2;
2618         }
2619         if (mode & AM_CURSED)
2620         {
2621                 if (power > 0)
2622                 {
2623                         power = 0 - power;
2624                 }
2625                 else
2626                 {
2627                         power--;
2628                 }
2629         }
2630
2631         int rolls = 0;
2632         if (power >= 2) rolls = 1;
2633
2634         if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
2635         if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
2636
2637         for (int i = 0; i < rolls; i++)
2638         {
2639                 if (make_artifact(owner_ptr, o_ptr)) break;
2640                 if ((owner_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
2641                 {
2642                         if (make_artifact(owner_ptr, o_ptr)) break;
2643                 }
2644         }
2645
2646         if (object_is_fixed_artifact(o_ptr))
2647         {
2648                 artifact_type *a_ptr = &a_info[o_ptr->name1];
2649                 a_ptr->cur_num = 1;
2650                 if (current_world_ptr->character_dungeon)
2651                         a_ptr->floor_id = owner_ptr->floor_id;
2652
2653                 o_ptr->pval = a_ptr->pval;
2654                 o_ptr->ac = a_ptr->ac;
2655                 o_ptr->dd = a_ptr->dd;
2656                 o_ptr->ds = a_ptr->ds;
2657                 o_ptr->to_a = a_ptr->to_a;
2658                 o_ptr->to_h = a_ptr->to_h;
2659                 o_ptr->to_d = a_ptr->to_d;
2660                 o_ptr->weight = a_ptr->weight;
2661                 o_ptr->xtra2 = a_ptr->act_idx;
2662
2663                 if (o_ptr->name1 == ART_MILIM)
2664                 {
2665                         if (owner_ptr->pseikaku == PERSONALITY_SEXY)
2666                         {
2667                                 o_ptr->pval = 3;
2668                         }
2669                 }
2670
2671                 if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
2672                 if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
2673                 if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2674                 if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
2675                 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2676                 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2677                 if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2678
2679                 return;
2680         }
2681
2682         switch (o_ptr->tval)
2683         {
2684         case TV_DIGGING:
2685         case TV_HAFTED:
2686         case TV_BOW:
2687         case TV_SHOT:
2688         case TV_ARROW:
2689         case TV_BOLT:
2690         {
2691                 if (power) apply_magic_weapon(owner_ptr, o_ptr, lev, power);
2692                 break;
2693         }
2694         case TV_POLEARM:
2695         {
2696                 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) apply_magic_weapon(owner_ptr, o_ptr, lev, power);
2697                 break;
2698         }
2699         case TV_SWORD:
2700         {
2701                 if (power && !(o_ptr->sval == SV_POISON_NEEDLE)) apply_magic_weapon(owner_ptr, o_ptr, lev, power);
2702                 break;
2703         }
2704         case TV_DRAG_ARMOR:
2705         case TV_HARD_ARMOR:
2706         case TV_SOFT_ARMOR:
2707         case TV_SHIELD:
2708         case TV_HELM:
2709         case TV_CROWN:
2710         case TV_CLOAK:
2711         case TV_GLOVES:
2712         case TV_BOOTS:
2713         {
2714                 if (((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)) ||
2715                         ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_KUROSHOUZOKU)))
2716                         o_ptr->pval = randint1(4);
2717
2718                 if (power ||
2719                         ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
2720                         ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
2721                         ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
2722                         ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)))
2723                         a_m_aux_2(owner_ptr, o_ptr, lev, power);
2724
2725                 break;
2726         }
2727         case TV_RING:
2728         case TV_AMULET:
2729         {
2730                 if (!power && (randint0(100) < 50)) power = -1;
2731                 a_m_aux_3(owner_ptr, o_ptr, lev, power);
2732                 break;
2733         }
2734         default:
2735         {
2736                 a_m_aux_4(owner_ptr, o_ptr, power);
2737                 break;
2738         }
2739         }
2740
2741         if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2742                 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
2743                 (owner_ptr->pseikaku == PERSONALITY_SEXY))
2744         {
2745                 o_ptr->pval = 3;
2746                 add_flag(o_ptr->art_flags, TR_STR);
2747                 add_flag(o_ptr->art_flags, TR_INT);
2748                 add_flag(o_ptr->art_flags, TR_WIS);
2749                 add_flag(o_ptr->art_flags, TR_DEX);
2750                 add_flag(o_ptr->art_flags, TR_CON);
2751                 add_flag(o_ptr->art_flags, TR_CHR);
2752         }
2753
2754         if (object_is_ego(o_ptr))
2755         {
2756                 ego_item_type *e_ptr = &e_info[o_ptr->name2];
2757                 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
2758
2759                 if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
2760                 if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
2761                 if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
2762                 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2763                 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2764                 if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2765
2766                 if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
2767                 if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
2768                 if (e_ptr->gen_flags & (TRG_XTRA_H_RES)) one_high_resistance(o_ptr);
2769                 if (e_ptr->gen_flags & (TRG_XTRA_E_RES)) one_ele_resistance(o_ptr);
2770                 if (e_ptr->gen_flags & (TRG_XTRA_D_RES)) one_dragon_ele_resistance(o_ptr);
2771                 if (e_ptr->gen_flags & (TRG_XTRA_L_RES)) one_lordly_high_resistance(o_ptr);
2772                 if (e_ptr->gen_flags & (TRG_XTRA_RES)) one_resistance(o_ptr);
2773                 if (e_ptr->gen_flags & (TRG_XTRA_DICE))
2774                 {
2775                         do
2776                         {
2777                                 o_ptr->dd++;
2778                         } while (one_in_(o_ptr->dd));
2779
2780                         if (o_ptr->dd > 9) o_ptr->dd = 9;
2781                 }
2782
2783                 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
2784
2785                 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
2786                 {
2787                         if (e_ptr->max_to_h) o_ptr->to_h -= randint1(e_ptr->max_to_h);
2788                         if (e_ptr->max_to_d) o_ptr->to_d -= randint1(e_ptr->max_to_d);
2789                         if (e_ptr->max_to_a) o_ptr->to_a -= randint1(e_ptr->max_to_a);
2790                         if (e_ptr->max_pval) o_ptr->pval -= randint1(e_ptr->max_pval);
2791                 }
2792                 else
2793                 {
2794                         if (e_ptr->max_to_h)
2795                         {
2796                                 if (e_ptr->max_to_h > 127)
2797                                         o_ptr->to_h -= randint1(256 - e_ptr->max_to_h);
2798                                 else o_ptr->to_h += randint1(e_ptr->max_to_h);
2799                         }
2800
2801                         if (e_ptr->max_to_d)
2802                         {
2803                                 if (e_ptr->max_to_d > 127)
2804                                         o_ptr->to_d -= randint1(256 - e_ptr->max_to_d);
2805                                 else o_ptr->to_d += randint1(e_ptr->max_to_d);
2806                         }
2807
2808                         if (e_ptr->max_to_a)
2809                         {
2810                                 if (e_ptr->max_to_a > 127)
2811                                         o_ptr->to_a -= randint1(256 - e_ptr->max_to_a);
2812                                 else o_ptr->to_a += randint1(e_ptr->max_to_a);
2813                         }
2814
2815                         if (o_ptr->name2 == EGO_ACCURACY)
2816                         {
2817                                 while (o_ptr->to_h < o_ptr->to_d + 10)
2818                                 {
2819                                         o_ptr->to_h += 5;
2820                                         o_ptr->to_d -= 5;
2821                                 }
2822                                 o_ptr->to_h = MAX(o_ptr->to_h, 15);
2823                         }
2824
2825                         if (o_ptr->name2 == EGO_VELOCITY)
2826                         {
2827                                 while (o_ptr->to_d < o_ptr->to_h + 10)
2828                                 {
2829                                         o_ptr->to_d += 5;
2830                                         o_ptr->to_h -= 5;
2831                                 }
2832                                 o_ptr->to_d = MAX(o_ptr->to_d, 15);
2833                         }
2834
2835                         if ((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
2836                         {
2837                                 o_ptr->to_a = MAX(o_ptr->to_a, 15);
2838                         }
2839
2840                         if (e_ptr->max_pval)
2841                         {
2842                                 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
2843                                 {
2844                                         o_ptr->pval++;
2845                                         if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds + 1)) < 15)) o_ptr->pval++;
2846                                 }
2847                                 else if (o_ptr->name2 == EGO_DEMON)
2848                                 {
2849                                         if (have_flag(o_ptr->art_flags, TR_BLOWS))
2850                                         {
2851                                                 o_ptr->pval += randint1(2);
2852                                         }
2853                                         else
2854                                         {
2855                                                 o_ptr->pval += randint1(e_ptr->max_pval);
2856                                         }
2857                                 }
2858                                 else if (o_ptr->name2 == EGO_ATTACKS)
2859                                 {
2860                                         o_ptr->pval = randint1(e_ptr->max_pval*lev / 100 + 1);
2861                                         if (o_ptr->pval > 3) o_ptr->pval = 3;
2862                                         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
2863                                                 o_ptr->pval += randint1(2);
2864                                 }
2865                                 else if (o_ptr->name2 == EGO_BAT)
2866                                 {
2867                                         o_ptr->pval = randint1(e_ptr->max_pval);
2868                                         if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
2869                                 }
2870                                 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
2871                                 {
2872                                         o_ptr->pval = randint1(e_ptr->max_pval);
2873                                 }
2874                                 else
2875                                 {
2876                                         o_ptr->pval += randint1(e_ptr->max_pval);
2877                                 }
2878                         }
2879
2880                         if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
2881                         {
2882                                 o_ptr->pval = randint1(o_ptr->pval);
2883                         }
2884
2885                         if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
2886                                 o_ptr->pval = 2;
2887                 }
2888
2889                 return;
2890         }
2891
2892         if (o_ptr->k_idx)
2893         {
2894                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2895                 if (!k_info[o_ptr->k_idx].cost) o_ptr->ident |= (IDENT_BROKEN);
2896
2897                 if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
2898                 if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
2899                 if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
2900                 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
2901                 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
2902                 if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
2903         }
2904 }
2905
2906
2907 /*!
2908  * @brief 生成済のオブジェクトをフロアの所定の位置に落とす。
2909  * Let an object fall to the ground at or near a location.
2910  * @param owner_ptr プレーヤーへの参照ポインタ
2911  * @param j_ptr 落としたいオブジェクト構造体の参照ポインタ
2912  * @param chance ドロップの消滅率(%)
2913  * @param y 配置したいフロアのY座標
2914  * @param x 配置したいフロアのX座標
2915  * @return 生成に成功したらオブジェクトのIDを返す。
2916  * @details
2917  * The initial location is assumed to be "in_bounds(floor_ptr, )".\n
2918  *\n
2919  * This function takes a parameter "chance".  This is the percentage\n
2920  * chance that the item will "disappear" instead of drop.  If the object\n
2921  * has been thrown, then this is the chance of disappearance on contact.\n
2922  *\n
2923  * Hack -- this function uses "chance" to determine if it should produce\n
2924  * some form of "description" of the drop event (under the player).\n
2925  *\n
2926  * We check several locations to see if we can find a location at which\n
2927  * the object can combine, stack, or be placed.  Artifacts will try very\n
2928  * hard to be placed, including "teleporting" to a useful grid if needed.\n
2929  */
2930 OBJECT_IDX drop_near(player_type *owner_ptr, object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
2931 {
2932         int i, k, d, s;
2933         POSITION dy, dx;
2934         POSITION ty, tx = 0;
2935         OBJECT_IDX o_idx = 0;
2936         OBJECT_IDX this_o_idx, next_o_idx = 0;
2937         grid_type *g_ptr;
2938         GAME_TEXT o_name[MAX_NLEN];
2939         bool flag = FALSE;
2940         bool done = FALSE;
2941 #ifdef JP
2942 #else
2943         bool plural = (j_ptr->number != 1);
2944 #endif
2945         object_desc(owner_ptr, o_name, j_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2946         if (!object_is_artifact(j_ptr) && (randint0(100) < chance))
2947         {
2948 #ifdef JP
2949                 msg_format("%sは消えた。", o_name);
2950 #else
2951                 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
2952 #endif
2953                 if (current_world_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
2954
2955                 return 0;
2956         }
2957
2958         int bs = -1;
2959         int bn = 0;
2960
2961         POSITION by = y;
2962         POSITION bx = x;
2963         floor_type *floor_ptr = owner_ptr->current_floor_ptr;
2964         for (dy = -3; dy <= 3; dy++)
2965         {
2966                 for (dx = -3; dx <= 3; dx++)
2967                 {
2968                         bool comb = FALSE;
2969                         d = (dy * dy) + (dx * dx);
2970                         if (d > 10) continue;
2971
2972                         ty = y + dy;
2973                         tx = x + dx;
2974                         if (!in_bounds(floor_ptr, ty, tx)) continue;
2975                         if (!projectable(owner_ptr, y, x, ty, tx)) continue;
2976
2977                         g_ptr = &floor_ptr->grid_array[ty][tx];
2978                         if (!cave_drop_bold(floor_ptr, ty, tx)) continue;
2979
2980                         k = 0;
2981                         for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
2982                         {
2983                                 object_type *o_ptr;
2984                                 o_ptr = &floor_ptr->o_list[this_o_idx];
2985                                 next_o_idx = o_ptr->next_o_idx;
2986                                 if (object_similar(o_ptr, j_ptr)) comb = TRUE;
2987
2988                                 k++;
2989                         }
2990
2991                         if (!comb) k++;
2992                         if (k > 99) continue;
2993
2994                         s = 1000 - (d + k * 5);
2995                         if (s < bs) continue;
2996
2997                         if (s > bs) bn = 0;
2998
2999                         if ((++bn >= 2) && !one_in_(bn)) continue;
3000
3001                         bs = s;
3002                         by = ty;
3003                         bx = tx;
3004
3005                         flag = TRUE;
3006                 }
3007         }
3008
3009         if (!flag && !object_is_artifact(j_ptr))
3010         {
3011 #ifdef JP
3012                 msg_format("%sは消えた。", o_name);
3013 #else
3014                 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
3015 #endif
3016                 if (current_world_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
3017
3018                 return 0;
3019         }
3020
3021         for (i = 0; !flag && (i < 1000); i++)
3022         {
3023                 ty = rand_spread(by, 1);
3024                 tx = rand_spread(bx, 1);
3025
3026                 if (!in_bounds(floor_ptr, ty, tx)) continue;
3027
3028                 by = ty;
3029                 bx = tx;
3030
3031                 if (!cave_drop_bold(floor_ptr, by, bx)) continue;
3032
3033                 flag = TRUE;
3034         }
3035
3036         if (!flag)
3037         {
3038                 int candidates = 0, pick;
3039                 for (ty = 1; ty < floor_ptr->height - 1; ty++)
3040                 {
3041                         for (tx = 1; tx < floor_ptr->width - 1; tx++)
3042                         {
3043                                 if (cave_drop_bold(floor_ptr, ty, tx)) candidates++;
3044                         }
3045                 }
3046
3047                 if (!candidates)
3048                 {
3049 #ifdef JP
3050                         msg_format("%sは消えた。", o_name);
3051 #else
3052                         msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
3053 #endif
3054
3055                         if (current_world_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
3056
3057                         if (preserve_mode)
3058                         {
3059                                 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
3060                                 {
3061                                         a_info[j_ptr->name1].cur_num = 0;
3062                                 }
3063                         }
3064
3065                         return 0;
3066                 }
3067
3068                 pick = randint1(candidates);
3069                 for (ty = 1; ty < floor_ptr->height - 1; ty++)
3070                 {
3071                         for (tx = 1; tx < floor_ptr->width - 1; tx++)
3072                         {
3073                                 if (cave_drop_bold(floor_ptr, ty, tx))
3074                                 {
3075                                         pick--;
3076                                         if (!pick) break;
3077                                 }
3078                         }
3079
3080                         if (!pick) break;
3081                 }
3082
3083                 by = ty;
3084                 bx = tx;
3085         }
3086
3087
3088         g_ptr = &floor_ptr->grid_array[by][bx];
3089         for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
3090         {
3091                 object_type *o_ptr;
3092                 o_ptr = &floor_ptr->o_list[this_o_idx];
3093                 next_o_idx = o_ptr->next_o_idx;
3094                 if (object_similar(o_ptr, j_ptr))
3095                 {
3096                         object_absorb(o_ptr, j_ptr);
3097                         done = TRUE;
3098                         break;
3099                 }
3100         }
3101
3102         if (!done) o_idx = o_pop(floor_ptr);
3103
3104         if (!done && !o_idx)
3105         {
3106 #ifdef JP
3107                 msg_format("%sは消えた。", o_name);
3108 #else
3109                 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
3110 #endif
3111                 if (current_world_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
3112
3113                 if (object_is_fixed_artifact(j_ptr))
3114                 {
3115                         a_info[j_ptr->name1].cur_num = 0;
3116                 }
3117
3118                 return 0;
3119         }
3120
3121         if (!done)
3122         {
3123                 object_copy(&floor_ptr->o_list[o_idx], j_ptr);
3124                 j_ptr = &floor_ptr->o_list[o_idx];
3125                 j_ptr->iy = by;
3126                 j_ptr->ix = bx;
3127                 j_ptr->held_m_idx = 0;
3128                 j_ptr->next_o_idx = g_ptr->o_idx;
3129
3130                 g_ptr->o_idx = o_idx;
3131                 done = TRUE;
3132         }
3133
3134         note_spot(owner_ptr, by, bx);
3135         lite_spot(owner_ptr, by, bx);
3136         sound(SOUND_DROP);
3137
3138         if (chance && player_bold(owner_ptr, by, bx))
3139         {
3140                 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
3141         }
3142
3143         return o_idx;
3144 }
3145
3146
3147 /*!
3148  * @brief 床上の魔道具の残り残量メッセージを表示する /
3149  * Describe the charges on an item on the floor.
3150  * @param floo_ptr 現在フロアへの参照ポインタ
3151  * @param item メッセージの対象にしたいアイテム所持スロット
3152  * @return なし
3153  */
3154 void floor_item_charges(floor_type *floor_ptr, INVENTORY_IDX item)
3155 {
3156         object_type *o_ptr = &floor_ptr->o_list[item];
3157         if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND)) return;
3158         if (!object_is_known(o_ptr)) return;
3159
3160 #ifdef JP
3161         if (o_ptr->pval <= 0)
3162         {
3163                 msg_print("この床上のアイテムは、もう魔力が残っていない。");
3164         }
3165         else
3166         {
3167                 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
3168         }
3169 #else
3170         if (o_ptr->pval != 1)
3171         {
3172                 msg_format("There are %d charges remaining.", o_ptr->pval);
3173         }
3174         else
3175         {
3176                 msg_format("There is %d charge remaining.", o_ptr->pval);
3177         }
3178 #endif
3179 }
3180
3181
3182 /*!
3183  * @brief 床上のアイテムの残り数メッセージを表示する /
3184  * Describe the charges on an item on the floor.
3185  * @param floo_ptr 現在フロアへの参照ポインタ
3186  * @param item メッセージの対象にしたいアイテム所持スロット
3187  * @return なし
3188  */
3189 void floor_item_describe(player_type *owner_ptr, INVENTORY_IDX item)
3190 {
3191         object_type *o_ptr = &owner_ptr->current_floor_ptr->o_list[item];
3192         GAME_TEXT o_name[MAX_NLEN];
3193         object_desc(owner_ptr, o_name, o_ptr, 0);
3194 #ifdef JP
3195         if (o_ptr->number <= 0)
3196         {
3197                 msg_format("床上には、もう%sはない。", o_name);
3198         }
3199         else
3200         {
3201                 msg_format("床上には、まだ %sがある。", o_name);
3202         }
3203 #else
3204         msg_format("You see %s.", o_name);
3205 #endif
3206 }
3207
3208
3209 /*!
3210  * @brief 床上のアイテムの数を増やす /
3211  * Increase the "number" of an item on the floor
3212  * @param floo_ptr 現在フロアへの参照ポインタ
3213  * @param item 増やしたいアイテムの所持スロット
3214  * @param num 増やしたいアイテムの数
3215  * @return なし
3216  */
3217 void floor_item_increase(floor_type *floor_ptr, INVENTORY_IDX item, ITEM_NUMBER num)
3218 {
3219         object_type *o_ptr = &floor_ptr->o_list[item];
3220         num += o_ptr->number;
3221         if (num > 255) num = 255;
3222         else if (num < 0) num = 0;
3223
3224         num -= o_ptr->number;
3225         o_ptr->number += num;
3226 }
3227
3228
3229 /*!
3230  * @brief 床上の数の無くなったアイテムスロットを消去する /
3231  * Optimize an item on the floor (destroy "empty" items)
3232  * @param player_ptr プレーヤーへの参照ポインタ
3233  * @param item 消去したいアイテムの所持スロット
3234  * @return なし
3235  */
3236 void floor_item_optimize(player_type *owner_ptr, INVENTORY_IDX item)
3237 {
3238         object_type *o_ptr = &owner_ptr->current_floor_ptr->o_list[item];
3239         if (!o_ptr->k_idx) return;
3240         if (o_ptr->number) return;
3241
3242         delete_object_idx(owner_ptr, item);
3243 }
3244
3245
3246 /*!
3247  * todo ここのp_ptrだけは抜けない……関数ポインタの嵐でにっちもさっちもいかない
3248  * @brief アイテムを拾う際にザックから溢れずに済むかを判定する /
3249  * Check if we have space for an item in the pack without overflow
3250  * @param owner_ptr プレーヤーへの参照ポインタ
3251  * @param o_ptr 拾いたいオブジェクトの構造体参照ポインタ
3252  * @return 溢れずに済むならTRUEを返す
3253  */
3254 bool inven_carry_okay(object_type *o_ptr)
3255 {
3256         if (p_ptr->inven_cnt < INVEN_PACK) return TRUE;
3257
3258         for (int j = 0; j < INVEN_PACK; j++)
3259         {
3260                 object_type *j_ptr = &p_ptr->inventory_list[j];
3261                 if (!j_ptr->k_idx) continue;
3262
3263                 if (object_similar(j_ptr, o_ptr)) return TRUE;
3264         }
3265
3266         return FALSE;
3267 }
3268
3269
3270 /*!
3271  * @brief オブジェクトを定義された基準に従いソートするための関数 /
3272  * Check if we have space for an item in the pack without overflow
3273  * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
3274  * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
3275  * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
3276  * @return o_ptrの方が上位ならばTRUEを返す。
3277  */
3278 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
3279 {
3280         int o_type, j_type;
3281         if (!j_ptr->k_idx) return TRUE;
3282
3283         if ((o_ptr->tval == REALM1_BOOK) &&
3284                 (j_ptr->tval != REALM1_BOOK)) return TRUE;
3285         if ((j_ptr->tval == REALM1_BOOK) &&
3286                 (o_ptr->tval != REALM1_BOOK)) return FALSE;
3287
3288         if ((o_ptr->tval == REALM2_BOOK) &&
3289                 (j_ptr->tval != REALM2_BOOK)) return TRUE;
3290         if ((j_ptr->tval == REALM2_BOOK) &&
3291                 (o_ptr->tval != REALM2_BOOK)) return FALSE;
3292
3293         if (o_ptr->tval > j_ptr->tval) return TRUE;
3294         if (o_ptr->tval < j_ptr->tval) return FALSE;
3295
3296         if (!object_is_aware(o_ptr)) return FALSE;
3297         if (!object_is_aware(j_ptr)) return TRUE;
3298
3299         if (o_ptr->sval < j_ptr->sval) return TRUE;
3300         if (o_ptr->sval > j_ptr->sval) return FALSE;
3301
3302         if (!object_is_known(o_ptr)) return FALSE;
3303         if (!object_is_known(j_ptr)) return TRUE;
3304
3305         if (object_is_fixed_artifact(o_ptr)) o_type = 3;
3306         else if (o_ptr->art_name) o_type = 2;
3307         else if (object_is_ego(o_ptr)) o_type = 1;
3308         else o_type = 0;
3309
3310         if (object_is_fixed_artifact(j_ptr)) j_type = 3;
3311         else if (j_ptr->art_name) j_type = 2;
3312         else if (object_is_ego(j_ptr)) j_type = 1;
3313         else j_type = 0;
3314
3315         if (o_type < j_type) return TRUE;
3316         if (o_type > j_type) return FALSE;
3317
3318         switch (o_ptr->tval)
3319         {
3320         case TV_FIGURINE:
3321         case TV_STATUE:
3322         case TV_CORPSE:
3323         case TV_CAPTURE:
3324                 if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level) return TRUE;
3325                 if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval)) return TRUE;
3326                 return FALSE;
3327
3328         case TV_SHOT:
3329         case TV_ARROW:
3330         case TV_BOLT:
3331                 if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d) return TRUE;
3332                 if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d) return FALSE;
3333                 break;
3334
3335         case TV_ROD:
3336                 if (o_ptr->pval < j_ptr->pval) return TRUE;
3337                 if (o_ptr->pval > j_ptr->pval) return FALSE;
3338                 break;
3339         }
3340
3341         return o_value > object_value(j_ptr);
3342 }
3343
3344
3345 /*!
3346  * @brief 装備スロットからオブジェクトを外すメインルーチン /
3347  * Take off (some of) a non-cursed equipment item
3348  * @param owner_ptr プレーヤーへの参照ポインタ
3349  * @param item オブジェクトを外したい所持テーブルのID
3350  * @param amt 外したい個数
3351  * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
3352  * @details
3353  * Note that only one item at a time can be wielded per slot.\n
3354  * Note that taking off an item when "full" may cause that item\n
3355  * to fall to the ground.\n
3356  * Return the inventory slot into which the item is placed.\n
3357  */
3358 INVENTORY_IDX inven_takeoff(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER amt)
3359 {
3360         INVENTORY_IDX slot;
3361         object_type forge;
3362         object_type *q_ptr;
3363         object_type *o_ptr;
3364         concptr act;
3365         GAME_TEXT o_name[MAX_NLEN];
3366         o_ptr = &owner_ptr->inventory_list[item];
3367         if (amt <= 0) return -1;
3368
3369         if (amt > o_ptr->number) amt = o_ptr->number;
3370         q_ptr = &forge;
3371         object_copy(q_ptr, o_ptr);
3372         q_ptr->number = amt;
3373         object_desc(owner_ptr, o_name, q_ptr, 0);
3374         if (((item == INVEN_RARM) || (item == INVEN_LARM)) &&
3375                 object_is_melee_weapon(o_ptr))
3376         {
3377                 act = _("を装備からはずした", "You were wielding");
3378         }
3379         else if (item == INVEN_BOW)
3380         {
3381                 act = _("を装備からはずした", "You were holding");
3382         }
3383         else if (item == INVEN_LITE)
3384         {
3385                 act = _("を光源からはずした", "You were holding");
3386         }
3387         else
3388         {
3389                 act = _("を装備からはずした", "You were wearing");
3390         }
3391
3392         inven_item_increase(owner_ptr, item, -amt);
3393         inven_item_optimize(owner_ptr, item);
3394
3395         slot = store_item_to_inventory(owner_ptr, q_ptr);
3396 #ifdef JP
3397         msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
3398 #else
3399         msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
3400 #endif
3401
3402         return slot;
3403 }
3404
3405
3406 /*!
3407  * @brief 射撃武器に対応する矢/弾薬のベースアイテムIDを返す /
3408  * @param o_ptr 判定する射撃武器のアイテム情報参照ポインタ
3409  * @return 対応する矢/弾薬のベースアイテムID
3410  */
3411 int bow_tval_ammo(object_type *o_ptr)
3412 {
3413         switch (o_ptr->sval)
3414         {
3415         case SV_SLING:
3416         {
3417                 return TV_SHOT;
3418         }
3419
3420         case SV_SHORT_BOW:
3421         case SV_LONG_BOW:
3422         case SV_NAMAKE_BOW:
3423         {
3424                 return TV_ARROW;
3425         }
3426
3427         case SV_LIGHT_XBOW:
3428         case SV_HEAVY_XBOW:
3429         {
3430                 return TV_BOLT;
3431         }
3432         case SV_CRIMSON:
3433         case SV_HARP:
3434         {
3435                 return TV_NO_AMMO;
3436         }
3437         }
3438
3439         return 0;
3440 }