OSDN Git Service

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