OSDN Git Service

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