OSDN Git Service

[Refactor] #38997 place_solid_perm_bold() を削除し、place_grid() に統合 / Removed place_solid...
[hengband/hengband.git] / src / object-curse.c
1 #include "angband.h"
2 #include "util.h"
3
4 #include "object-flavor.h"
5 #include "object-hook.h"
6
7 /*!
8  * @brief アイテムに付加される可能性のある呪いを指定する。
9  * @param power 呪いの段階
10  * @param o_ptr 呪いをかけられる装備オブジェクトの構造体参照ポインタ
11  * @return 与える呪いのID
12  */
13 BIT_FLAGS get_curse(int power, object_type *o_ptr)
14 {
15         BIT_FLAGS new_curse;
16
17         while (TRUE)
18         {
19                 new_curse = (1 << (randint0(MAX_CURSE)+4));
20                 if (power == 2)
21                 {
22                         if (!(new_curse & TRC_HEAVY_MASK)) continue;
23                 }
24                 else if (power == 1)
25                 {
26                         if (new_curse & TRC_SPECIAL_MASK) continue;
27                 }
28                 else if (power == 0)
29                 {
30                         if (new_curse & TRC_HEAVY_MASK) continue;
31                 }
32
33                 if (new_curse == TRC_LOW_MELEE && !object_is_weapon(o_ptr)) continue;
34                 if (new_curse == TRC_LOW_AC && !object_is_armour(o_ptr)) continue;
35                 break;
36         }
37
38         return new_curse;
39 }
40
41
42 /*!
43  * @brief 装備への呪い付加判定と付加処理
44  * @param owner_ptr プレーヤーへの参照ポインタ
45  * @param chance 呪いの基本確率
46  * @param heavy_chance さらに重い呪いとなる確率
47  * @return なし
48  */
49 void curse_equipment(player_type *owner_ptr, PERCENTAGE chance, PERCENTAGE heavy_chance)
50 {
51         if (randint1(100) > chance) return;
52
53         object_type *o_ptr = &owner_ptr->inventory_list[INVEN_RARM + randint0(12)];
54         if (!o_ptr->k_idx) return;
55         BIT_FLAGS oflgs[TR_FLAG_SIZE];
56         object_flags(o_ptr, oflgs);
57         GAME_TEXT o_name[MAX_NLEN];
58         object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
59
60         /* Extra, biased saving throw for blessed items */
61         if (have_flag(oflgs, TR_BLESSED))
62         {
63 #ifdef JP
64                 msg_format("祝福された%sは呪いを跳ね返した!", o_name);
65 #else
66                 msg_format("Your blessed %s resist%s cursing!", o_name, ((o_ptr->number > 1) ? "" : "s"));
67 #endif
68                 /* Hmmm -- can we wear multiple items? If not, this is unnecessary */
69                 return;
70         }
71
72         bool changed = FALSE;
73         int curse_power = 0;
74         if ((randint1(100) <= heavy_chance) &&
75             (object_is_artifact(o_ptr) || object_is_ego(o_ptr)))
76         {
77                 if (!(o_ptr->curse_flags & TRC_HEAVY_CURSE))
78                         changed = TRUE;
79                 o_ptr->curse_flags |= TRC_HEAVY_CURSE;
80                 o_ptr->curse_flags |= TRC_CURSED;
81                 curse_power++;
82         }
83         else
84         {
85                 if (!object_is_cursed(o_ptr))
86                         changed = TRUE;
87                 o_ptr->curse_flags |= TRC_CURSED;
88         }
89
90         if (heavy_chance >= 50) curse_power++;
91
92         BIT_FLAGS new_curse = get_curse(curse_power, o_ptr);
93         if (!(o_ptr->curse_flags & new_curse))
94         {
95                 changed = TRUE;
96                 o_ptr->curse_flags |= new_curse;
97         }
98
99         if (changed)
100         {
101                 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding %s..."), o_name);
102                 o_ptr->feeling = FEEL_NONE;
103         }
104
105         owner_ptr->update |= PU_BONUS;
106 }