2 * @brief オブジェクトの実装 / Object code, part 2
5 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
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.
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"
57 * Determine if an item can "absorb" a second item
59 * See "object_absorb()" for the actual "absorption" code.
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-
67 * If permitted, we allow weapons/armor to stack, if fully "known".
69 * Missiles will combine if both stacks have the same "known" status.
70 * This is done to make unidentified stacks of missiles useful.
72 * Food, potions, scrolls, and "easy know" items always stack.
74 * Chests, and activatable items, never stack (for various reasons).
78 * A "stack" of items is limited to less than or equal to 99 items (hard-coded).
80 #define MAX_STACK_SIZE 99
83 * todo この関数ポインタは何とかならんのか?
84 * Hack -- function hook to restrict "get_obj_num_prep()" function
86 bool(*get_obj_num_hook)(KIND_OBJECT_IDX k_idx);
88 OBJECT_SUBTYPE_VALUE coin_type; /* Hack -- force coin type */
91 * @brief 床上、モンスター所持でスタックされたアイテムを削除しスタックを補完する / Excise a dungeon object from any stacks
92 * @param floo_ptr 現在フロアへの参照ポインタ
93 * @param o_idx 削除対象のオブジェクト構造体ポインタ
96 void excise_object_idx(floor_type *floor_ptr, OBJECT_IDX o_idx)
98 OBJECT_IDX this_o_idx, next_o_idx = 0;
99 OBJECT_IDX prev_o_idx = 0;
101 j_ptr = &floor_ptr->o_list[o_idx];
103 if (OBJECT_IS_HELD_MONSTER(j_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)
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)
114 prev_o_idx = this_o_idx;
120 m_ptr->hold_o_idx = next_o_idx;
125 k_ptr = &floor_ptr->o_list[prev_o_idx];
126 k_ptr->next_o_idx = next_o_idx;
129 o_ptr->next_o_idx = 0;
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)
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)
147 prev_o_idx = this_o_idx;
153 g_ptr->o_idx = next_o_idx;
158 k_ptr = &floor_ptr->o_list[prev_o_idx];
159 k_ptr->next_o_idx = next_o_idx;
162 o_ptr->next_o_idx = 0;
169 * @brief オブジェクトを削除する /
170 * Delete a dungeon object
171 * @param player_ptr プレーヤーへの参照ポインタ
172 * @param o_idx 削除対象のオブジェクト構造体ポインタ
175 * Handle "stacks" of objects correctly.
177 void delete_object_idx(player_type *player_ptr, OBJECT_IDX o_idx)
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))
188 lite_spot(player_ptr, y, x);
197 * @brief グローバルオブジェクト配列から空きを取得する /
198 * Acquires and returns the index of a "free" object.
199 * @param floo_ptr 現在フロアへの参照ポインタ
200 * @return 開いているオブジェクト要素のID
202 * This routine should almost never fail, but in case it does,
203 * we must be sure to handle "failure" of this routine.
205 OBJECT_IDX o_pop(floor_type *floor_ptr)
207 if (floor_ptr->o_max < current_world_ptr->max_o_idx)
209 OBJECT_IDX i = floor_ptr->o_max;
215 for (OBJECT_IDX i = 1; i < floor_ptr->o_max; i++)
218 o_ptr = &floor_ptr->o_list[i];
219 if (o_ptr->k_idx) continue;
225 if (current_world_ptr->character_dungeon)
226 msg_print(_("アイテムが多すぎる!", "Too many objects!"));
233 * @brief オブジェクト生成テーブルからアイテムを取得する /
234 * Choose an object kind that seems "appropriate" to the given level
235 * @param owner_ptr プレーヤーへの参照ポインタ
237 * @return 選ばれたオブジェクトベースID
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
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
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
251 OBJECT_IDX get_obj_num(player_type *owner_ptr, DEPTH level, BIT_FLAGS mode)
254 KIND_OBJECT_IDX k_idx;
257 alloc_entry *table = alloc_kind_table;
259 if (level > MAX_DEPTH - 1) level = MAX_DEPTH - 1;
261 if ((level > 0) && !(d_info[owner_ptr->dungeon_idx].flags1 & DF1_BEGINNER))
263 if (one_in_(GREAT_OBJ))
265 level = 1 + (level * MAX_DEPTH / randint1(MAX_DEPTH));
270 for (i = 0; i < alloc_kind_size; i++)
272 if (table[i].level > level) break;
275 k_idx = table[i].index;
276 k_ptr = &k_info[k_idx];
278 if ((mode & AM_FORBID_CHEST) && (k_ptr->tval == TV_CHEST)) continue;
280 table[i].prob3 = table[i].prob2;
281 total += table[i].prob3;
284 if (total <= 0) return 0;
286 value = randint0(total);
287 for (i = 0; i < alloc_kind_size; i++)
289 if (value < table[i].prob3) break;
291 value = value - table[i].prob3;
298 value = randint0(total);
299 for (i = 0; i < alloc_kind_size; i++)
301 if (value < table[i].prob3) break;
303 value = value - table[i].prob3;
306 if (table[i].level < table[j].level) i = j;
309 if (p >= 10) return (table[i].index);
312 value = randint0(total);
313 for (i = 0; i < alloc_kind_size; i++)
315 if (value < table[i].prob3) break;
317 value = value - table[i].prob3;
320 if (table[i].level < table[j].level) i = j;
321 return (table[i].index);
326 * @brief 重度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
327 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
328 * @return 擬似鑑定結果のIDを返す。
330 byte value_check_aux1(object_type *o_ptr)
332 if (object_is_artifact(o_ptr))
334 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_TERRIBLE;
339 if (object_is_ego(o_ptr))
341 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) return FEEL_WORTHLESS;
343 return FEEL_EXCELLENT;
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;
357 * @brief 軽度擬似鑑定の判断処理 / Return a "feeling" (or NULL) about an item. Method 2 (Light).
358 * @param o_ptr 擬似鑑定を行うオブジェクトの参照ポインタ。
359 * @return 擬似鑑定結果のIDを返す。
361 byte value_check_aux2(object_type *o_ptr)
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;
375 * @brief オブジェクトのフラグ類から価格を算出する /
376 * Return the value of the flags the object has...
377 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
378 * @param plusses フラグに与える価格の基本重み
379 * @return オブジェクトのフラグ価格
381 PRICE flag_cost(object_type *o_ptr, int plusses)
384 BIT_FLAGS flgs[TR_FLAG_SIZE];
385 object_kind *k_ptr = &k_info[o_ptr->k_idx];
386 object_flags(o_ptr, flgs);
389 * Exclude fixed flags of the base item.
390 * pval bonuses of base item will be treated later.
392 for (int i = 0; i < TR_FLAG_SIZE; i++)
393 flgs[i] &= ~(k_ptr->flags[i]);
395 if (object_is_fixed_artifact(o_ptr))
397 artifact_type *a_ptr = &a_info[o_ptr->name1];
399 for (int i = 0; i < TR_FLAG_SIZE; i++)
400 flgs[i] &= ~(a_ptr->flags[i]);
402 else if (object_is_ego(o_ptr))
404 ego_item_type *e_ptr = &e_info[o_ptr->name2];
406 for (int i = 0; i < TR_FLAG_SIZE; i++)
407 flgs[i] &= ~(e_ptr->flags[i]);
411 * Calucurate values of remaining flags
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));
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++; }
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);
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;
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);
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))
554 if (object_is_cursed(o_ptr))
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;
568 /* Also, give some extra for activatable powers... */
569 if (o_ptr->art_name && (have_flag(o_ptr->art_flags, TR_ACTIVATE)))
571 const activation_type* const act_ptr = find_activation_info(o_ptr);
573 total += act_ptr->value;
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
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
594 void distribute_charges(object_type *o_ptr, object_type *q_ptr, int amt)
596 if ((o_ptr->tval != TV_WAND) && (o_ptr->tval != TV_ROD)) return;
598 q_ptr->pval = o_ptr->pval * amt / o_ptr->number;
599 if (amt < o_ptr->number) o_ptr->pval -= q_ptr->pval;
601 if ((o_ptr->tval != TV_ROD) || !o_ptr->timeout) return;
603 if (q_ptr->pval > o_ptr->timeout)
604 q_ptr->timeout = o_ptr->timeout;
606 q_ptr->timeout = q_ptr->pval;
608 if (amt < o_ptr->number) o_ptr->timeout -= q_ptr->timeout;
613 * @brief 魔法棒やロッドの使用回数を減らす /
614 * @param o_ptr オブジェクトの構造体参照ポインタ source item
615 * @param amt 減らしたい回数量 number of items that are transfered
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
622 void reduce_charges(object_type *o_ptr, int amt)
624 if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD)) &&
625 (amt < o_ptr->number))
627 o_ptr->pval -= o_ptr->pval * amt / o_ptr->number;
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 重ね合わせ可能なアイテム数
639 int object_similar_part(object_type *o_ptr, object_type *j_ptr)
641 int max_num = MAX_STACK_SIZE;
642 if (o_ptr->k_idx != j_ptr->k_idx) return 0;
654 if ((o_ptr->sval != SV_PHOTO) || (j_ptr->sval != SV_PHOTO)) return 0;
655 if (o_ptr->pval != j_ptr->pval) return 0;
661 if (o_ptr->pval != j_ptr->pval) return 0;
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;
678 if (o_ptr->pval != j_ptr->pval) return 0;
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;
693 max_num = MIN(max_num, MAX_SHORT / k_info[o_ptr->k_idx].pval);
715 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
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;
741 if (!object_is_known(o_ptr) || !object_is_known(j_ptr)) return 0;
747 for (int i = 0; i < TR_FLAG_SIZE; i++)
748 if (o_ptr->art_flags[i] != j_ptr->art_flags[i]) return 0;
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;
753 if (o_ptr->inscription && j_ptr->inscription &&
754 (o_ptr->inscription != j_ptr->inscription))
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;
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を返す。
771 bool object_similar(object_type *o_ptr, object_type *j_ptr)
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;
783 * @brief 両オブジェクトをスロットに重ね合わせる。
784 * Allow one item to "absorb" another, assuming they are similar
785 * @param o_ptr 重ね合わせ先のオブジェクトの構造体参照ポインタ
786 * @param j_ptr 重ね合わせ元のオブジェクトの構造体参照ポインタ
789 void object_absorb(object_type *o_ptr, object_type *j_ptr)
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;
795 o_ptr->number = (total > max_num) ? max_num : total;
796 if (object_is_known(j_ptr)) object_known(o_ptr);
798 if (((o_ptr->ident & IDENT_STORE) || (j_ptr->ident & IDENT_STORE)) &&
799 (!((o_ptr->ident & IDENT_STORE) && (j_ptr->ident & IDENT_STORE))))
801 if (j_ptr->ident & IDENT_STORE) j_ptr->ident &= 0xEF;
802 if (o_ptr->ident & IDENT_STORE) o_ptr->ident &= 0xEF;
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)
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;
815 if (o_ptr->tval == TV_WAND)
817 o_ptr->pval += j_ptr->pval * (j_ptr->number - diff) / j_ptr->number;
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
829 KIND_OBJECT_IDX lookup_kind(tval_type tval, OBJECT_SUBTYPE_VALUE sval)
832 KIND_OBJECT_IDX bk = 0;
834 for (KIND_OBJECT_IDX k = 1; k < max_k_idx; k++)
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;
855 * @brief オブジェクトを初期化する
856 * Wipe an object clean.
857 * @param o_ptr 初期化したいオブジェクトの構造体参照ポインタ
860 void object_wipe(object_type *o_ptr)
862 (void)WIPE(o_ptr, object_type);
868 * Wipe an object clean.
869 * @param o_ptr 複製元のオブジェクトの構造体参照ポインタ
870 * @param j_ptr 複製先のオブジェクトの構造体参照ポインタ
873 void object_copy(object_type *o_ptr, object_type *j_ptr)
875 (void)COPY(o_ptr, j_ptr, object_type);
880 * @brief オブジェクト構造体にベースアイテムを作成する
881 * Prepare an object based on an object kind.
882 * @param o_ptr 代入したいオブジェクトの構造体参照ポインタ
883 * @param k_idx 新たに作成したいベースアイテム情報のID
886 void object_prep(object_type *o_ptr, KIND_OBJECT_IDX k_idx)
888 object_kind *k_ptr = &k_info[k_idx];
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;
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;
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);
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);
917 * @brief アイテムのエゴをレア度の重みに合わせてランダムに選択する
918 * Choose random ego type
919 * @param slot 取得したいエゴの装備部位
920 * @param good TRUEならば通常のエゴ、FALSEならば呪いのエゴが選択対象となる。
921 * @return 選択されたエゴ情報のID、万一選択できなかった場合はmax_e_idxが返る。
923 static byte get_random_ego(byte slot, bool good)
926 for (int i = 1; i < max_e_idx; i++)
928 ego_item_type *e_ptr;
930 if (e_ptr->slot == slot
931 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)))
934 total += (255 / e_ptr->rarity);
938 int value = randint1(total);
940 for (j = 1; j < max_e_idx; j++)
942 ego_item_type *e_ptr;
944 if (e_ptr->slot == slot
945 && ((good && e_ptr->rating) || (!good && !e_ptr->rating)))
948 value -= (255 / e_ptr->rarity);
949 if (value <= 0L) break;
958 * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
959 * Apply magic to an item known to be a "weapon"
960 * @param owner_ptr プレーヤーへの参照ポインタ
961 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
966 * Hack -- note special base damage dice boosting\n
967 * Hack -- note special processing for weapon/digger\n
969 void apply_magic_weapon(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
971 HIT_PROB tohit1 = randint1(5) + (HIT_PROB)m_bonus(5, level);
972 HIT_POINT todam1 = randint1(5) + (HIT_POINT)m_bonus(5, level);
974 HIT_PROB tohit2 = (HIT_PROB)m_bonus(10, level);
975 HIT_POINT todam2 = (HIT_POINT)m_bonus(10, level);
977 if ((o_ptr->tval == TV_BOLT) || (o_ptr->tval == TV_ARROW) || (o_ptr->tval == TV_SHOT))
979 tohit2 = (tohit2 + 1) / 2;
980 todam2 = (todam2 + 1) / 2;
985 o_ptr->to_h += tohit1;
986 o_ptr->to_d += todam1;
989 o_ptr->to_h += tohit2;
990 o_ptr->to_d += todam2;
995 o_ptr->to_h -= tohit1;
996 o_ptr->to_d -= todam1;
999 o_ptr->to_h -= tohit2;
1000 o_ptr->to_d -= todam2;
1003 if (o_ptr->to_h + o_ptr->to_d < 0)
1004 o_ptr->curse_flags |= TRC_CURSED;
1007 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
1009 switch (o_ptr->tval)
1015 /* power > 2 is debug only */
1016 if (one_in_(30) || (power > 2))
1017 become_random_artifact(owner_ptr, o_ptr, FALSE);
1019 o_ptr->name2 = EGO_DIGGING;
1021 else if (power < -1)
1023 o_ptr->pval = 0 - (5 + randint1(5));
1027 o_ptr->pval = 0 - (o_ptr->pval);
1038 /* power > 2 is debug only */
1039 if (one_in_(40) || (power > 2))
1041 become_random_artifact(owner_ptr, o_ptr, FALSE);
1046 o_ptr->name2 = get_random_ego(INVEN_RARM, TRUE);
1047 if (o_ptr->name2 == EGO_SHARPNESS && o_ptr->tval != TV_SWORD)
1049 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
1051 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
1056 switch (o_ptr->name2)
1059 if (one_in_(4) && (level > 40))
1060 add_flag(o_ptr->art_flags, TR_BLOWS);
1064 add_flag(o_ptr->art_flags, TR_RES_POIS);
1066 add_flag(o_ptr->art_flags, TR_WARNING);
1068 case EGO_KILL_DRAGON:
1070 add_flag(o_ptr->art_flags, TR_RES_POIS);
1074 add_flag(o_ptr->art_flags, TR_RES_FEAR);
1076 case EGO_SLAYING_WEAPON:
1084 } while (one_in_(o_ptr->dd));
1089 } while (one_in_(o_ptr->ds));
1094 add_flag(o_ptr->art_flags, TR_BRAND_POIS);
1096 if (o_ptr->tval == TV_SWORD && one_in_(3))
1098 add_flag(o_ptr->art_flags, TR_VORPAL);
1103 add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
1109 add_flag(o_ptr->art_flags, TR_HOLD_EXP);
1111 add_flag(o_ptr->art_flags, TR_DEX);
1113 add_flag(o_ptr->art_flags, TR_RES_FEAR);
1116 o_ptr->pval = (PARAMETER_VALUE)m_bonus(5, level) + 1;
1118 case EGO_EARTHQUAKES:
1119 if (one_in_(3) && (level > 60))
1120 add_flag(o_ptr->art_flags, TR_BLOWS);
1122 o_ptr->pval = (PARAMETER_VALUE)m_bonus(3, level);
1126 add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
1130 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1132 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
1134 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
1135 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
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);
1145 if (!o_ptr->art_name)
1147 while (one_in_(10L * o_ptr->dd * o_ptr->ds))
1150 if (o_ptr->dd > 9) o_ptr->dd = 9;
1153 else if (power < -1)
1155 if (randint0(MAX_DEPTH) < level)
1159 o_ptr->name2 = get_random_ego(INVEN_RARM, FALSE);
1160 if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
1168 switch (o_ptr->name2)
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);
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);
1192 /* power > 2 is debug only */
1193 if (one_in_(20) || (power > 2))
1195 become_random_artifact(owner_ptr, o_ptr, FALSE);
1199 o_ptr->name2 = get_random_ego(INVEN_BOW, TRUE);
1210 /* power > 2 is debug only */
1213 become_random_artifact(owner_ptr, o_ptr, FALSE);
1217 o_ptr->name2 = get_random_ego(INVEN_AMMO, TRUE);
1218 switch (o_ptr->name2)
1220 case EGO_SLAYING_BOLT:
1225 while (one_in_(10L * o_ptr->dd * o_ptr->ds))
1228 if (o_ptr->dd > 9) o_ptr->dd = 9;
1230 else if (power < -1)
1232 if (randint0(MAX_DEPTH) < level)
1234 o_ptr->name2 = get_random_ego(INVEN_AMMO, FALSE);
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 生成ランク
1253 * Hack -- note special processing for crown/helm\n
1254 * Hack -- note special processing for robe of permanence\n
1256 static void a_m_aux_2(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
1258 ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
1259 ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
1262 o_ptr->to_a += toac1;
1265 o_ptr->to_a += toac2;
1270 o_ptr->to_a -= toac1;
1273 o_ptr->to_a -= toac2;
1276 if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
1279 switch (o_ptr->tval)
1283 /* power > 2 is debug only */
1284 if (one_in_(50) || (power > 2))
1285 become_random_artifact(owner_ptr, o_ptr, FALSE);
1293 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
1294 (o_ptr->sval == SV_ROBE) &&
1295 (randint0(100) < 15))
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;
1307 o_ptr->name2 = EGO_PERMANENCE;
1313 /* power > 2 is debug only */
1314 if (one_in_(20) || (power > 2))
1316 become_random_artifact(owner_ptr, o_ptr, FALSE);
1322 bool okay_flag = TRUE;
1323 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
1324 switch (o_ptr->name2)
1327 if (o_ptr->tval != TV_HARD_ARMOR)
1334 if (o_ptr->tval != TV_SOFT_ARMOR)
1344 if (okay_flag) break;
1347 switch (o_ptr->name2)
1349 case EGO_RESISTANCE:
1351 add_flag(o_ptr->art_flags, TR_RES_POIS);
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;
1359 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1361 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
1363 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
1364 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
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);
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);
1392 if (o_ptr->sval == SV_DRAGON_SHIELD)
1394 dragon_resist(o_ptr);
1395 if (!one_in_(3)) break;
1400 /* power > 2 is debug only */
1401 if (one_in_(20) || (power > 2))
1403 become_random_artifact(owner_ptr, o_ptr, FALSE);
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)
1419 switch (o_ptr->name2)
1422 if (!one_in_(3)) one_high_resistance(o_ptr);
1423 if (one_in_(4)) add_flag(o_ptr->art_flags, TR_RES_POIS);
1425 case EGO_REFLECTION:
1426 if (o_ptr->sval == SV_MIRROR_SHIELD)
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;
1441 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)
1443 dragon_resist(o_ptr);
1444 if (!one_in_(3)) break;
1449 /* power > 2 is debug only */
1450 if (one_in_(20) || (power > 2))
1452 become_random_artifact(owner_ptr, o_ptr, FALSE);
1455 o_ptr->name2 = get_random_ego(INVEN_HANDS, TRUE);
1457 else if (power < -1)
1459 o_ptr->name2 = get_random_ego(INVEN_HANDS, FALSE);
1467 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)
1469 dragon_resist(o_ptr);
1470 if (!one_in_(3)) break;
1475 /* power > 2 is debug only */
1476 if (one_in_(20) || (power > 2))
1478 become_random_artifact(owner_ptr, o_ptr, FALSE);
1482 o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
1483 switch (o_ptr->name2)
1485 case EGO_SLOW_DESCENT:
1488 one_high_resistance(o_ptr);
1494 else if (power < -1)
1496 o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
1505 /* power > 2 is debug only */
1506 if (one_in_(20) || (power > 2))
1508 become_random_artifact(owner_ptr, o_ptr, FALSE);
1514 bool ok_flag = TRUE;
1515 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
1517 switch (o_ptr->name2)
1520 if (add_esp_strong(o_ptr)) add_esp_weak(o_ptr, TRUE);
1521 else add_esp_weak(o_ptr, FALSE);
1525 case EGO_REGENERATION:
1526 case EGO_LORDLINESS:
1532 if (one_in_(2)) add_esp_strong(o_ptr);
1533 else add_esp_weak(o_ptr, FALSE);
1537 /* not existing crown (wisdom,lite, etc...) */
1547 else if (power < -1)
1551 bool ok_flag = TRUE;
1552 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
1554 switch (o_ptr->name2)
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);
1575 if (o_ptr->sval == SV_DRAGON_HELM)
1577 dragon_resist(o_ptr);
1578 if (!one_in_(3)) break;
1583 /* power > 2 is debug only */
1584 if (one_in_(20) || (power > 2))
1586 become_random_artifact(owner_ptr, o_ptr, FALSE);
1592 bool ok_flag = TRUE;
1593 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
1594 switch (o_ptr->name2)
1596 case EGO_BRILLIANCE:
1598 case EGO_INFRAVISION:
1599 case EGO_H_PROTECTION:
1604 if (one_in_(2)) add_esp_strong(o_ptr);
1605 else add_esp_weak(o_ptr, FALSE);
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);
1614 if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
1616 add_flag(o_ptr->art_flags, TR_DRAIN_EXP) :
1618 add_flag(o_ptr->art_flags, TR_DRAIN_HP) :
1619 add_flag(o_ptr->art_flags, TR_DRAIN_MANA);
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);
1631 /* not existing helm (Magi, Might, etc...)*/
1640 else if (power < -1)
1644 bool ok_flag = TRUE;
1645 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
1647 switch (o_ptr->name2)
1649 case EGO_ANCIENT_CURSE:
1664 /* power > 2 is debug only */
1665 if (one_in_(20) || (power > 2))
1667 become_random_artifact(owner_ptr, o_ptr, FALSE);
1670 o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
1672 switch (o_ptr->name2)
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);
1689 else if (power < -1)
1691 o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
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 生成ランク
1709 * Hack -- note special "pval boost" code for ring of speed\n
1710 * Hack -- note that some items must be cursed (or blessed)\n
1712 static void a_m_aux_3(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
1714 switch (o_ptr->tval)
1718 switch (o_ptr->sval)
1720 case SV_RING_ATTACKS:
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;
1728 o_ptr->ident |= (IDENT_BROKEN);
1729 o_ptr->curse_flags |= TRC_CURSED;
1730 o_ptr->pval = 0 - (o_ptr->pval);
1743 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
1746 o_ptr->ident |= (IDENT_BROKEN);
1747 o_ptr->curse_flags |= TRC_CURSED;
1748 o_ptr->pval = 0 - (o_ptr->pval);
1755 o_ptr->pval = randint1(5) + (PARAMETER_VALUE)m_bonus(5, level);
1756 while (randint0(100) < 50) o_ptr->pval++;
1760 o_ptr->ident |= (IDENT_BROKEN);
1761 o_ptr->curse_flags |= TRC_CURSED;
1762 o_ptr->pval = 0 - (o_ptr->pval);
1768 case SV_RING_LORDLY:
1772 one_lordly_high_resistance(o_ptr);
1773 } while (one_in_(4));
1775 o_ptr->to_a = 10 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
1778 case SV_RING_WARNING:
1780 if (one_in_(3)) one_low_esp(o_ptr);
1783 case SV_RING_SEARCHING:
1785 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
1788 o_ptr->ident |= (IDENT_BROKEN);
1789 o_ptr->curse_flags |= TRC_CURSED;
1790 o_ptr->pval = 0 - (o_ptr->pval);
1795 case SV_RING_FLAMES:
1800 o_ptr->to_a = 5 + randint1(5) + (ARMOUR_CLASS)m_bonus(10, level);
1803 case SV_RING_WEAKNESS:
1804 case SV_RING_STUPIDITY:
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;
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;
1823 case SV_RING_DAMAGE:
1825 o_ptr->to_d = 1 + randint1(5) + (HIT_POINT)m_bonus(16, level);
1828 o_ptr->ident |= (IDENT_BROKEN);
1829 o_ptr->curse_flags |= TRC_CURSED;
1830 o_ptr->to_d = 0 - o_ptr->to_d;
1835 case SV_RING_ACCURACY:
1837 o_ptr->to_h = 1 + randint1(5) + (HIT_PROB)m_bonus(16, level);
1840 o_ptr->ident |= (IDENT_BROKEN);
1841 o_ptr->curse_flags |= TRC_CURSED;
1842 o_ptr->to_h = 0 - o_ptr->to_h;
1847 case SV_RING_PROTECTION:
1849 o_ptr->to_a = 5 + randint1(8) + (ARMOUR_CLASS)m_bonus(10, level);
1852 o_ptr->ident |= (IDENT_BROKEN);
1853 o_ptr->curse_flags |= TRC_CURSED;
1854 o_ptr->to_a = 0 - o_ptr->to_a;
1859 case SV_RING_SLAYING:
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);
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;
1874 case SV_RING_MUSCLE:
1876 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(3, level);
1877 if (one_in_(4)) o_ptr->pval++;
1881 o_ptr->ident |= (IDENT_BROKEN);
1882 o_ptr->curse_flags |= TRC_CURSED;
1883 o_ptr->pval = 0 - o_ptr->pval;
1888 case SV_RING_AGGRAVATION:
1890 o_ptr->ident |= (IDENT_BROKEN);
1891 o_ptr->curse_flags |= TRC_CURSED;
1892 if (power > 0) power = 0 - power;
1897 /* power > 2 is debug only */
1898 if ((one_in_(400) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79)) || (power > 2))
1900 o_ptr->pval = MIN(o_ptr->pval, 4);
1901 become_random_artifact(owner_ptr, o_ptr, FALSE);
1903 else if ((power == 2) && one_in_(2))
1905 while (!o_ptr->name2)
1907 int tmp = m_bonus(10, level);
1908 object_kind *k_ptr = &k_info[o_ptr->k_idx];
1909 switch (randint1(28))
1912 o_ptr->name2 = EGO_RING_THROW;
1915 if (have_flag(k_ptr->flags, TR_REGEN)) break;
1916 o_ptr->name2 = EGO_RING_REGEN;
1919 if (have_flag(k_ptr->flags, TR_LITE_1)) break;
1920 o_ptr->name2 = EGO_RING_LITE;
1923 if (have_flag(k_ptr->flags, TR_TELEPORT)) break;
1924 o_ptr->name2 = EGO_RING_TELEPORT;
1927 if (o_ptr->to_h) break;
1928 o_ptr->name2 = EGO_RING_TO_H;
1931 if (o_ptr->to_d) break;
1932 o_ptr->name2 = EGO_RING_TO_D;
1935 if ((o_ptr->to_h) || (o_ptr->to_d)) break;
1936 o_ptr->name2 = EGO_RING_SLAY;
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;
1943 if (have_flag(k_ptr->flags, TR_ACTIVATE)) break;
1944 o_ptr->name2 = EGO_RING_HERO;
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;
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;
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;
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;
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;
1978 case 21: case 22: case 23: case 24: case 25: case 26:
1979 switch (o_ptr->sval)
1982 if (!one_in_(3)) break;
1983 o_ptr->name2 = EGO_RING_D_SPEED;
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;
1992 o_ptr->name2 = EGO_RING_BERSERKER;
1993 o_ptr->to_h -= 2 + randint1(4);
1994 o_ptr->to_d += 2 + randint1(4);
1998 case SV_RING_PROTECTION:
1999 o_ptr->name2 = EGO_RING_SUPER_AC;
2000 o_ptr->to_a += 7 + m_bonus(5, level);
2002 case SV_RING_RES_FEAR:
2003 o_ptr->name2 = EGO_RING_HERO;
2006 if (one_in_(2)) break;
2007 o_ptr->name2 = EGO_RING_HUNTER;
2009 case SV_RING_SEARCHING:
2010 o_ptr->name2 = EGO_RING_STEALTH;
2012 case SV_RING_TELEPORTATION:
2013 o_ptr->name2 = EGO_RING_TELE_AWAY;
2015 case SV_RING_RES_BLINDNESS:
2017 o_ptr->name2 = EGO_RING_RES_LITE;
2019 o_ptr->name2 = EGO_RING_RES_DARK;
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;
2027 case SV_RING_SUSTAIN:
2028 if (!one_in_(4)) break;
2029 o_ptr->name2 = EGO_RING_RES_TIME;
2031 case SV_RING_FLAMES:
2032 if (!one_in_(2)) break;
2033 o_ptr->name2 = EGO_RING_DRAGON_F;
2036 if (!one_in_(2)) break;
2037 o_ptr->name2 = EGO_RING_DRAGON_C;
2039 case SV_RING_WARNING:
2040 if (!one_in_(2)) break;
2041 o_ptr->name2 = EGO_RING_M_DETECT;
2051 o_ptr->curse_flags = 0L;
2053 else if ((power == -2) && one_in_(2))
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)
2063 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2064 switch (randint1(5))
2067 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
2068 o_ptr->name2 = EGO_RING_DRAIN_EXP;
2071 o_ptr->name2 = EGO_RING_NO_MELEE;
2074 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
2075 o_ptr->name2 = EGO_RING_AGGRAVATE;
2078 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
2079 o_ptr->name2 = EGO_RING_TY_CURSE;
2082 o_ptr->name2 = EGO_RING_ALBINO;
2087 o_ptr->ident |= (IDENT_BROKEN);
2088 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
2095 switch (o_ptr->sval)
2097 case SV_AMULET_INTELLIGENCE:
2098 case SV_AMULET_WISDOM:
2099 case SV_AMULET_CHARISMA:
2101 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(5, level);
2104 o_ptr->ident |= (IDENT_BROKEN);
2105 o_ptr->curse_flags |= (TRC_CURSED);
2106 o_ptr->pval = 0 - o_ptr->pval;
2111 case SV_AMULET_BRILLIANCE:
2113 o_ptr->pval = 1 + m_bonus(3, level);
2114 if (one_in_(4)) o_ptr->pval++;
2118 o_ptr->ident |= (IDENT_BROKEN);
2119 o_ptr->curse_flags |= (TRC_CURSED);
2120 o_ptr->pval = 0 - o_ptr->pval;
2125 case SV_AMULET_NO_MAGIC: case SV_AMULET_NO_TELE:
2129 o_ptr->curse_flags |= (TRC_CURSED);
2134 case SV_AMULET_RESISTANCE:
2136 if (one_in_(5)) one_high_resistance(o_ptr);
2137 if (one_in_(5)) add_flag(o_ptr->art_flags, TR_RES_POIS);
2140 case SV_AMULET_SEARCHING:
2142 o_ptr->pval = randint1(2) + (PARAMETER_VALUE)m_bonus(4, level);
2145 o_ptr->ident |= (IDENT_BROKEN);
2146 o_ptr->curse_flags |= (TRC_CURSED);
2147 o_ptr->pval = 0 - (o_ptr->pval);
2152 case SV_AMULET_THE_MAGI:
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);
2159 case SV_AMULET_DOOM:
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;
2169 case SV_AMULET_MAGIC_MASTERY:
2171 o_ptr->pval = 1 + (PARAMETER_VALUE)m_bonus(4, level);
2174 o_ptr->ident |= (IDENT_BROKEN);
2175 o_ptr->curse_flags |= (TRC_CURSED);
2176 o_ptr->pval = 0 - o_ptr->pval;
2183 /* power > 2 is debug only */
2184 if ((one_in_(150) && (power > 0) && !object_is_cursed(o_ptr) && (level > 79)) || (power > 2))
2186 o_ptr->pval = MIN(o_ptr->pval, 4);
2187 become_random_artifact(owner_ptr, o_ptr, FALSE);
2189 else if ((power == 2) && one_in_(2))
2191 while (!o_ptr->name2)
2193 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2194 switch (randint1(21))
2197 if (have_flag(k_ptr->flags, TR_SLOW_DIGEST)) break;
2198 o_ptr->name2 = EGO_AMU_SLOW_D;
2201 if (o_ptr->pval) break;
2202 o_ptr->name2 = EGO_AMU_INFRA;
2205 if (have_flag(k_ptr->flags, TR_SEE_INVIS)) break;
2206 o_ptr->name2 = EGO_AMU_SEE_INVIS;
2209 if (have_flag(k_ptr->flags, TR_HOLD_EXP)) break;
2210 o_ptr->name2 = EGO_AMU_HOLD_EXP;
2213 if (have_flag(k_ptr->flags, TR_LEVITATION)) break;
2214 o_ptr->name2 = EGO_AMU_LEVITATION;
2216 case 10: case 11: case 21:
2217 o_ptr->name2 = EGO_AMU_AC;
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_;
2224 o_ptr->name2 = EGO_AMU_RES_FIRE;
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_;
2231 o_ptr->name2 = EGO_AMU_RES_COLD;
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_;
2238 o_ptr->name2 = EGO_AMU_RES_ELEC;
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_;
2245 o_ptr->name2 = EGO_AMU_RES_ACID;
2247 case 16: case 17: case 18: case 19: case 20:
2248 switch (o_ptr->sval)
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;
2255 case SV_AMULET_RESIST_ACID:
2256 if ((m_bonus(10, level) > 6) && one_in_(2)) o_ptr->name2 = EGO_AMU_RES_ACID_;
2258 case SV_AMULET_SEARCHING:
2259 o_ptr->name2 = EGO_AMU_STEALTH;
2261 case SV_AMULET_BRILLIANCE:
2262 if (!one_in_(3)) break;
2263 o_ptr->name2 = EGO_AMU_IDENT;
2265 case SV_AMULET_CHARISMA:
2266 if (!one_in_(3)) break;
2267 o_ptr->name2 = EGO_AMU_CHARM;
2269 case SV_AMULET_THE_MAGI:
2270 if (one_in_(2)) break;
2271 o_ptr->name2 = EGO_AMU_GREAT;
2273 case SV_AMULET_RESISTANCE:
2274 if (!one_in_(5)) break;
2275 o_ptr->name2 = EGO_AMU_DEFENDER;
2277 case SV_AMULET_TELEPATHY:
2278 if (!one_in_(3)) break;
2279 o_ptr->name2 = EGO_AMU_DETECTION;
2284 o_ptr->curse_flags = 0L;
2286 else if ((power == -2) && one_in_(2))
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)
2296 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2297 switch (randint1(5))
2300 if (have_flag(k_ptr->flags, TR_DRAIN_EXP)) break;
2301 o_ptr->name2 = EGO_AMU_DRAIN_EXP;
2304 o_ptr->name2 = EGO_AMU_FOOL;
2307 if (have_flag(k_ptr->flags, TR_AGGRAVATE)) break;
2308 o_ptr->name2 = EGO_AMU_AGGRAVATE;
2311 if (have_flag(k_ptr->flags, TR_TY_CURSE)) break;
2312 o_ptr->name2 = EGO_AMU_TY_CURSE;
2315 o_ptr->name2 = EGO_AMU_NAIVETY;
2320 o_ptr->ident |= (IDENT_BROKEN);
2321 o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
2331 * @brief その他雑多のオブジェクトに生成ランクごとの強化を与えるサブルーチン
2332 * Apply magic to an item known to be "boring"
2333 * @param owner_ptr プレーヤーへの参照ポインタ
2334 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2335 * @param power 生成ランク
2338 * Hack -- note the special code for various items
2340 static void a_m_aux_4(player_type *owner_ptr, object_type *o_ptr, int power)
2342 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2344 floor_type *floor_ptr = owner_ptr->current_floor_ptr;
2345 switch (o_ptr->tval)
2353 o_ptr->xtra4 = o_ptr->pval;
2359 if (o_ptr->sval == SV_LITE_TORCH)
2361 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
2365 if (o_ptr->sval == SV_LITE_LANTERN)
2367 if (o_ptr->pval > 0) o_ptr->xtra4 = randint1(o_ptr->pval);
2371 /* power > 2 is debug only */
2374 become_random_artifact(owner_ptr, o_ptr, FALSE);
2376 else if ((power == 2) || ((power == 1) && one_in_(3)))
2378 while (!o_ptr->name2)
2382 bool okay_flag = TRUE;
2384 o_ptr->name2 = get_random_ego(INVEN_LITE, TRUE);
2386 switch (o_ptr->name2)
2389 if (o_ptr->sval == SV_LITE_FEANOR)
2398 else if (power == -2)
2400 o_ptr->name2 = get_random_ego(INVEN_LITE, FALSE);
2401 switch (o_ptr->name2)
2403 case EGO_LITE_DARKNESS:
2406 if (o_ptr->sval == SV_LITE_TORCH)
2408 add_flag(o_ptr->art_flags, TR_LITE_M1);
2410 else if (o_ptr->sval == SV_LITE_LANTERN)
2412 add_flag(o_ptr->art_flags, TR_LITE_M2);
2414 else if (o_ptr->sval == SV_LITE_FEANOR)
2416 add_flag(o_ptr->art_flags, TR_LITE_M3);
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-
2430 o_ptr->pval = k_ptr->pval / 2 + randint1((k_ptr->pval + 1) / 2);
2435 o_ptr->pval = k_ptr->pval;
2441 object_aware(owner_ptr, o_ptr);
2442 object_known(o_ptr);
2447 PARAMETER_VALUE i = 1;
2449 monster_race *r_ptr;
2452 i = randint1(max_r_idx - 1);
2454 if (!item_monster_okay(i)) continue;
2455 if (i == MON_TSUCHINOKO) continue;
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;
2467 if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
2473 PARAMETER_VALUE i = 1;
2476 monster_race *r_ptr;
2477 if (o_ptr->sval == SV_SKELETON)
2479 match = RF9_DROP_SKELETON;
2481 else if (o_ptr->sval == SV_CORPSE)
2483 match = RF9_DROP_CORPSE;
2486 get_mon_num_prep(owner_ptr, item_monster_okay, NULL);
2489 i = get_mon_num(owner_ptr, floor_ptr->dun_level, 0);
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;
2500 object_aware(owner_ptr, o_ptr);
2501 object_known(o_ptr);
2506 PARAMETER_VALUE i = 1;
2507 monster_race *r_ptr;
2510 i = randint1(max_r_idx - 1);
2512 if (!r_ptr->rarity) continue;
2520 msg_format(_("%sの像", "Statue of %s"), r_name + r_ptr->name);
2523 object_aware(owner_ptr, o_ptr);
2524 object_known(o_ptr);
2529 DEPTH obj_level = k_info[o_ptr->k_idx].level;
2530 if (obj_level <= 0) break;
2532 o_ptr->pval = randint1(obj_level);
2533 if (o_ptr->sval == SV_CHEST_KANDUME) o_ptr->pval = 6;
2535 o_ptr->xtra3 = floor_ptr->dun_level + 5;
2536 if (o_ptr->pval > 55) o_ptr->pval = 55 + (byte)randint0(5);
2545 * @brief 生成されたベースアイテムに魔法的な強化を与えるメインルーチン
2546 * Complete the "creation" of an object by applying "magic" to the item
2547 * @param owner_ptr プレーヤーへの参照ポインタ
2548 * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
2550 * @param mode 生成オプション
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
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
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
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
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
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
2581 void apply_magic(player_type *owner_ptr, object_type *o_ptr, DEPTH lev, BIT_FLAGS mode)
2583 if (owner_ptr->pseikaku == PERSONALITY_MUNCHKIN) lev += randint0(owner_ptr->lev / 2 + 10);
2584 if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1;
2587 if (f1 > d_info[owner_ptr->dungeon_idx].obj_good) f1 = d_info[owner_ptr->dungeon_idx].obj_good;
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;
2593 if (owner_ptr->muta3 & MUT3_GOOD_LUCK)
2598 else if (owner_ptr->muta3 & MUT3_BAD_LUCK)
2605 if ((mode & AM_GOOD) || magik(f1))
2608 if ((mode & AM_GREAT) || magik(f2))
2611 if (mode & AM_SPECIAL) power = 3;
2617 if (magik(f2)) power = -2;
2619 if (mode & AM_CURSED)
2632 if (power >= 2) rolls = 1;
2634 if (mode & (AM_GREAT | AM_SPECIAL)) rolls = 4;
2635 if ((mode & AM_NO_FIXED_ART) || o_ptr->name1) rolls = 0;
2637 for (int i = 0; i < rolls; i++)
2639 if (make_artifact(owner_ptr, o_ptr)) break;
2640 if ((owner_ptr->muta3 & MUT3_GOOD_LUCK) && one_in_(77))
2642 if (make_artifact(owner_ptr, o_ptr)) break;
2646 if (object_is_fixed_artifact(o_ptr))
2648 artifact_type *a_ptr = &a_info[o_ptr->name1];
2650 if (current_world_ptr->character_dungeon)
2651 a_ptr->floor_id = owner_ptr->floor_id;
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;
2663 if (o_ptr->name1 == ART_MILIM)
2665 if (owner_ptr->pseikaku == PERSONALITY_SEXY)
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);
2682 switch (o_ptr->tval)
2691 if (power) apply_magic_weapon(owner_ptr, o_ptr, lev, power);
2696 if (power && !(o_ptr->sval == SV_DEATH_SCYTHE)) apply_magic_weapon(owner_ptr, o_ptr, lev, power);
2701 if (power && !(o_ptr->sval == SV_POISON_NEEDLE)) apply_magic_weapon(owner_ptr, o_ptr, lev, power);
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);
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);
2730 if (!power && (randint0(100) < 50)) power = -1;
2731 a_m_aux_3(owner_ptr, o_ptr, lev, power);
2736 a_m_aux_4(owner_ptr, o_ptr, power);
2741 if ((o_ptr->tval == TV_SOFT_ARMOR) &&
2742 (o_ptr->sval == SV_ABUNAI_MIZUGI) &&
2743 (owner_ptr->pseikaku == PERSONALITY_SEXY))
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);
2754 if (object_is_ego(o_ptr))
2756 ego_item_type *e_ptr = &e_info[o_ptr->name2];
2757 if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
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);
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))
2778 } while (one_in_(o_ptr->dd));
2780 if (o_ptr->dd > 9) o_ptr->dd = 9;
2783 if (e_ptr->act_idx) o_ptr->xtra2 = (XTRA8)e_ptr->act_idx;
2785 if ((object_is_cursed(o_ptr) || object_is_broken(o_ptr)) && !(e_ptr->gen_flags & (TRG_POWERFUL)))
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);
2794 if (e_ptr->max_to_h)
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);
2801 if (e_ptr->max_to_d)
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);
2808 if (e_ptr->max_to_a)
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);
2815 if (o_ptr->name2 == EGO_ACCURACY)
2817 while (o_ptr->to_h < o_ptr->to_d + 10)
2822 o_ptr->to_h = MAX(o_ptr->to_h, 15);
2825 if (o_ptr->name2 == EGO_VELOCITY)
2827 while (o_ptr->to_d < o_ptr->to_h + 10)
2832 o_ptr->to_d = MAX(o_ptr->to_d, 15);
2835 if ((o_ptr->name2 == EGO_PROTECTION) || (o_ptr->name2 == EGO_S_PROTECTION) || (o_ptr->name2 == EGO_H_PROTECTION))
2837 o_ptr->to_a = MAX(o_ptr->to_a, 15);
2840 if (e_ptr->max_pval)
2842 if ((o_ptr->name2 == EGO_HA) && (have_flag(o_ptr->art_flags, TR_BLOWS)))
2845 if ((lev > 60) && one_in_(3) && ((o_ptr->dd*(o_ptr->ds + 1)) < 15)) o_ptr->pval++;
2847 else if (o_ptr->name2 == EGO_DEMON)
2849 if (have_flag(o_ptr->art_flags, TR_BLOWS))
2851 o_ptr->pval += randint1(2);
2855 o_ptr->pval += randint1(e_ptr->max_pval);
2858 else if (o_ptr->name2 == EGO_ATTACKS)
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);
2865 else if (o_ptr->name2 == EGO_BAT)
2867 o_ptr->pval = randint1(e_ptr->max_pval);
2868 if (o_ptr->sval == SV_ELVEN_CLOAK) o_ptr->pval += randint1(2);
2870 else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG)
2872 o_ptr->pval = randint1(e_ptr->max_pval);
2876 o_ptr->pval += randint1(e_ptr->max_pval);
2880 if ((o_ptr->name2 == EGO_SPEED) && (lev < 50))
2882 o_ptr->pval = randint1(o_ptr->pval);
2885 if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA) && (o_ptr->pval > 2) && (o_ptr->name2 != EGO_ATTACKS))
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);
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);
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を返す。
2917 * The initial location is assumed to be "in_bounds(floor_ptr, )".\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
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
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
2930 OBJECT_IDX drop_near(player_type *owner_ptr, object_type *j_ptr, PERCENTAGE chance, POSITION y, POSITION x)
2934 POSITION ty, tx = 0;
2935 OBJECT_IDX o_idx = 0;
2936 OBJECT_IDX this_o_idx, next_o_idx = 0;
2938 GAME_TEXT o_name[MAX_NLEN];
2943 bool plural = (j_ptr->number != 1);
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))
2949 msg_format("%sは消えた。", o_name);
2951 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
2953 if (current_world_ptr->wizard) msg_print(_("(破損)", "(breakage)"));
2963 floor_type *floor_ptr = owner_ptr->current_floor_ptr;
2964 for (dy = -3; dy <= 3; dy++)
2966 for (dx = -3; dx <= 3; dx++)
2969 d = (dy * dy) + (dx * dx);
2970 if (d > 10) continue;
2974 if (!in_bounds(floor_ptr, ty, tx)) continue;
2975 if (!projectable(owner_ptr, y, x, ty, tx)) continue;
2977 g_ptr = &floor_ptr->grid_array[ty][tx];
2978 if (!cave_drop_bold(floor_ptr, ty, tx)) continue;
2981 for (this_o_idx = g_ptr->o_idx; this_o_idx; this_o_idx = next_o_idx)
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;
2992 if (k > 99) continue;
2994 s = 1000 - (d + k * 5);
2995 if (s < bs) continue;
2999 if ((++bn >= 2) && !one_in_(bn)) continue;
3009 if (!flag && !object_is_artifact(j_ptr))
3012 msg_format("%sは消えた。", o_name);
3014 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
3016 if (current_world_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
3021 for (i = 0; !flag && (i < 1000); i++)
3023 ty = rand_spread(by, 1);
3024 tx = rand_spread(bx, 1);
3026 if (!in_bounds(floor_ptr, ty, tx)) continue;
3031 if (!cave_drop_bold(floor_ptr, by, bx)) continue;
3038 int candidates = 0, pick;
3039 for (ty = 1; ty < floor_ptr->height - 1; ty++)
3041 for (tx = 1; tx < floor_ptr->width - 1; tx++)
3043 if (cave_drop_bold(floor_ptr, ty, tx)) candidates++;
3050 msg_format("%sは消えた。", o_name);
3052 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
3055 if (current_world_ptr->wizard) msg_print(_("(床スペースがない)", "(no floor space)"));
3059 if (object_is_fixed_artifact(j_ptr) && !object_is_known(j_ptr))
3061 a_info[j_ptr->name1].cur_num = 0;
3068 pick = randint1(candidates);
3069 for (ty = 1; ty < floor_ptr->height - 1; ty++)
3071 for (tx = 1; tx < floor_ptr->width - 1; tx++)
3073 if (cave_drop_bold(floor_ptr, ty, tx))
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)
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))
3096 object_absorb(o_ptr, j_ptr);
3102 if (!done) o_idx = o_pop(floor_ptr);
3104 if (!done && !o_idx)
3107 msg_format("%sは消えた。", o_name);
3109 msg_format("The %s disappear%s.", o_name, (plural ? "" : "s"));
3111 if (current_world_ptr->wizard) msg_print(_("(アイテムが多過ぎる)", "(too many objects)"));
3113 if (object_is_fixed_artifact(j_ptr))
3115 a_info[j_ptr->name1].cur_num = 0;
3123 object_copy(&floor_ptr->o_list[o_idx], j_ptr);
3124 j_ptr = &floor_ptr->o_list[o_idx];
3127 j_ptr->held_m_idx = 0;
3128 j_ptr->next_o_idx = g_ptr->o_idx;
3130 g_ptr->o_idx = o_idx;
3134 note_spot(owner_ptr, by, bx);
3135 lite_spot(owner_ptr, by, bx);
3138 if (chance && player_bold(owner_ptr, by, bx))
3140 msg_print(_("何かが足下に転がってきた。", "You feel something roll beneath your feet."));
3148 * @brief 床上の魔道具の残り残量メッセージを表示する /
3149 * Describe the charges on an item on the floor.
3150 * @param floo_ptr 現在フロアへの参照ポインタ
3151 * @param item メッセージの対象にしたいアイテム所持スロット
3154 void floor_item_charges(floor_type *floor_ptr, INVENTORY_IDX item)
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;
3161 if (o_ptr->pval <= 0)
3163 msg_print("この床上のアイテムは、もう魔力が残っていない。");
3167 msg_format("この床上のアイテムは、あと %d 回分の魔力が残っている。", o_ptr->pval);
3170 if (o_ptr->pval != 1)
3172 msg_format("There are %d charges remaining.", o_ptr->pval);
3176 msg_format("There is %d charge remaining.", o_ptr->pval);
3183 * @brief 床上のアイテムの残り数メッセージを表示する /
3184 * Describe the charges on an item on the floor.
3185 * @param floo_ptr 現在フロアへの参照ポインタ
3186 * @param item メッセージの対象にしたいアイテム所持スロット
3189 void floor_item_describe(player_type *owner_ptr, INVENTORY_IDX item)
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);
3195 if (o_ptr->number <= 0)
3197 msg_format("床上には、もう%sはない。", o_name);
3201 msg_format("床上には、まだ %sがある。", o_name);
3204 msg_format("You see %s.", o_name);
3210 * @brief 床上のアイテムの数を増やす /
3211 * Increase the "number" of an item on the floor
3212 * @param floo_ptr 現在フロアへの参照ポインタ
3213 * @param item 増やしたいアイテムの所持スロット
3214 * @param num 増やしたいアイテムの数
3217 void floor_item_increase(floor_type *floor_ptr, INVENTORY_IDX item, ITEM_NUMBER num)
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;
3224 num -= o_ptr->number;
3225 o_ptr->number += num;
3230 * @brief 床上の数の無くなったアイテムスロットを消去する /
3231 * Optimize an item on the floor (destroy "empty" items)
3232 * @param player_ptr プレーヤーへの参照ポインタ
3233 * @param item 消去したいアイテムの所持スロット
3236 void floor_item_optimize(player_type *owner_ptr, INVENTORY_IDX item)
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;
3242 delete_object_idx(owner_ptr, item);
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を返す
3254 bool inven_carry_okay(object_type *o_ptr)
3256 if (p_ptr->inven_cnt < INVEN_PACK) return TRUE;
3258 for (int j = 0; j < INVEN_PACK; j++)
3260 object_type *j_ptr = &p_ptr->inventory_list[j];
3261 if (!j_ptr->k_idx) continue;
3263 if (object_similar(j_ptr, o_ptr)) return TRUE;
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を返す。
3278 bool object_sort_comp(object_type *o_ptr, s32b o_value, object_type *j_ptr)
3281 if (!j_ptr->k_idx) return TRUE;
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;
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;
3293 if (o_ptr->tval > j_ptr->tval) return TRUE;
3294 if (o_ptr->tval < j_ptr->tval) return FALSE;
3296 if (!object_is_aware(o_ptr)) return FALSE;
3297 if (!object_is_aware(j_ptr)) return TRUE;
3299 if (o_ptr->sval < j_ptr->sval) return TRUE;
3300 if (o_ptr->sval > j_ptr->sval) return FALSE;
3302 if (!object_is_known(o_ptr)) return FALSE;
3303 if (!object_is_known(j_ptr)) return TRUE;
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;
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;
3315 if (o_type < j_type) return TRUE;
3316 if (o_type > j_type) return FALSE;
3318 switch (o_ptr->tval)
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;
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;
3336 if (o_ptr->pval < j_ptr->pval) return TRUE;
3337 if (o_ptr->pval > j_ptr->pval) return FALSE;
3341 return o_value > object_value(j_ptr);
3346 * @brief 装備スロットからオブジェクトを外すメインルーチン /
3347 * Take off (some of) a non-cursed equipment item
3348 * @param owner_ptr プレーヤーへの参照ポインタ
3349 * @param item オブジェクトを外したい所持テーブルのID
3351 * @return 収められた所持スロットのID、拾うことができなかった場合-1を返す。
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
3358 INVENTORY_IDX inven_takeoff(player_type *owner_ptr, INVENTORY_IDX item, ITEM_NUMBER amt)
3365 GAME_TEXT o_name[MAX_NLEN];
3366 o_ptr = &owner_ptr->inventory_list[item];
3367 if (amt <= 0) return -1;
3369 if (amt > o_ptr->number) amt = o_ptr->number;
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))
3377 act = _("を装備からはずした", "You were wielding");
3379 else if (item == INVEN_BOW)
3381 act = _("を装備からはずした", "You were holding");
3383 else if (item == INVEN_LITE)
3385 act = _("を光源からはずした", "You were holding");
3389 act = _("を装備からはずした", "You were wearing");
3392 inven_item_increase(owner_ptr, item, -amt);
3393 inven_item_optimize(owner_ptr, item);
3395 slot = store_item_to_inventory(owner_ptr, q_ptr);
3397 msg_format("%s(%c)%s。", o_name, index_to_label(slot), act);
3399 msg_format("%s %s (%c).", act, o_name, index_to_label(slot));
3407 * @brief 射撃武器に対応する矢/弾薬のベースアイテムIDを返す /
3408 * @param o_ptr 判定する射撃武器のアイテム情報参照ポインタ
3409 * @return 対応する矢/弾薬のベースアイテムID
3411 int bow_tval_ammo(object_type *o_ptr)
3413 switch (o_ptr->sval)