OSDN Git Service

[Feature/Refactor] ハードコーディングされているエゴ生成フラグをe_info.txtで定義できる
[hengbandforosx/hengbandosx.git] / src / object-enchant / apply-magic-armor.cpp
1 /*!
2  * @brief 防具系のアイテムを強化して(恐らく床に)生成する処理
3  * @date 2020/06/02
4  * @author Hourier
5  * @todo ちょっと長い。要分割
6  */
7
8 #include "object-enchant/apply-magic-armor.h"
9 #include "artifact/random-art-generator.h"
10 #include "inventory/inventory-slot-types.h"
11 #include "object-enchant/object-boost.h"
12 #include "object-enchant/object-ego.h"
13 #include "object/object-kind-hook.h"
14 #include "object/object-kind.h"
15 #include "object-enchant/tr-types.h"
16 #include "object-enchant/trc-types.h"
17 #include "sv-definition/sv-armor-types.h"
18 #include "sv-definition/sv-protector-types.h"
19 #include "util/bit-flags-calculator.h"
20 #include "view/display-messages.h"
21
22 /*!
23  * @brief 防具系オブジェクトに生成ランクごとの強化を与えるサブルーチン
24  * Apply magic to an item known to be "armor"
25  * @param owner_ptr プレーヤーへの参照ポインタ
26  * @param o_ptr 強化を与えたいオブジェクトの構造体参照ポインタ
27  * @param level 生成基準階
28  * @param power 生成ランク
29  * @return なし
30  * @details
31  * Hack -- note special processing for crown/helm\n
32  * Hack -- note special processing for robe of permanence\n
33  */
34 void apply_magic_armor(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power)
35 {
36     ARMOUR_CLASS toac1 = (ARMOUR_CLASS)randint1(5) + m_bonus(5, level);
37     ARMOUR_CLASS toac2 = (ARMOUR_CLASS)m_bonus(10, level);
38     if (power > 0) {
39         o_ptr->to_a += toac1;
40         if (power > 1) {
41             o_ptr->to_a += toac2;
42         }
43     } else if (power < 0) {
44         o_ptr->to_a -= toac1;
45         if (power < -1) {
46             o_ptr->to_a -= toac2;
47         }
48
49         if (o_ptr->to_a < 0)
50             o_ptr->curse_flags |= TRC_CURSED;
51     }
52
53     switch (o_ptr->tval) {
54     case TV_DRAG_ARMOR: {
55         /* power > 2 is debug only */
56         if (one_in_(50) || (power > 2))
57             become_random_artifact(owner_ptr, o_ptr, FALSE);
58         break;
59     }
60     case TV_HARD_ARMOR:
61     case TV_SOFT_ARMOR: {
62         if (power > 1) {
63             if ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ROBE) && (randint0(100) < 15)) {
64                 if (one_in_(5)) {
65                     o_ptr->name2 = EGO_YOIYAMI;
66                     o_ptr->k_idx = lookup_kind(TV_SOFT_ARMOR, SV_YOIYAMI_ROBE);
67                     o_ptr->sval = SV_YOIYAMI_ROBE;
68                     o_ptr->ac = 0;
69                     o_ptr->to_a = 0;
70                 } else {
71                     o_ptr->name2 = EGO_PERMANENCE;
72                 }
73
74                 break;
75             }
76
77             /* power > 2 is debug only */
78             if (one_in_(20) || (power > 2)) {
79                 become_random_artifact(owner_ptr, o_ptr, FALSE);
80                 break;
81             }
82
83             while (TRUE) {
84                 bool okay_flag = TRUE;
85                 o_ptr->name2 = get_random_ego(INVEN_BODY, TRUE);
86                 switch (o_ptr->name2) {
87                 case EGO_DWARVEN:
88                     if (o_ptr->tval != TV_HARD_ARMOR) {
89                         okay_flag = FALSE;
90                     }
91
92                     break;
93                 case EGO_DRUID:
94                     if (o_ptr->tval != TV_SOFT_ARMOR) {
95                         okay_flag = FALSE;
96                     }
97
98                     break;
99                 default:
100                     break;
101                 }
102
103                 if (okay_flag)
104                     break;
105             }
106
107             switch (o_ptr->name2) {
108             case EGO_DWARVEN:
109                 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
110                 o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
111                 break;
112             default:
113                 break;
114             }
115         } else if (power < -1) {
116             while (TRUE) {
117                 bool okay_flag = TRUE;
118                 o_ptr->name2 = get_random_ego(INVEN_BODY, FALSE);
119
120                 switch (o_ptr->name2) {
121                 case EGO_A_DEMON:
122                 case EGO_A_MORGUL:
123                     break;
124                 default:
125                     msg_print(_("エラー:適した呪い鎧エゴがみつかりませんでした.", "Error:Suitable cursed armor ego not found."));
126                     okay_flag = true;
127                     break;
128                 }
129
130                 if (okay_flag)
131                     break;
132             }
133         }
134
135         break;
136     }
137     case TV_SHIELD: {
138         if (o_ptr->sval == SV_DRAGON_SHIELD) {
139             dragon_resist(o_ptr);
140             if (!one_in_(3))
141                 break;
142         }
143
144         if (power > 1) {
145             /* power > 2 is debug only */
146             if (one_in_(20) || (power > 2)) {
147                 become_random_artifact(owner_ptr, o_ptr, FALSE);
148                 break;
149             }
150
151             while (TRUE) {
152                 o_ptr->name2 = get_random_ego(INVEN_SUB_HAND, TRUE);
153                 if (o_ptr->sval != SV_SMALL_METAL_SHIELD && o_ptr->sval != SV_LARGE_METAL_SHIELD && o_ptr->name2 == EGO_S_DWARVEN) {
154                     continue;
155                 }
156
157                 break;
158             }
159
160             switch (o_ptr->name2) {
161             case EGO_REFLECTION:
162                 if (o_ptr->sval == SV_MIRROR_SHIELD)
163                     o_ptr->name2 = 0;
164                 break;
165             case EGO_S_DWARVEN:
166                 o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
167                 o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
168                 break;
169             default:
170                 break;
171             }
172         }
173
174         break;
175     }
176     case TV_GLOVES: {
177         if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) {
178             dragon_resist(o_ptr);
179             if (!one_in_(3))
180                 break;
181         }
182
183         if (power > 1) {
184             /* power > 2 is debug only */
185             if (one_in_(20) || (power > 2)) {
186                 become_random_artifact(owner_ptr, o_ptr, FALSE);
187                 break;
188             }
189             o_ptr->name2 = get_random_ego(INVEN_ARMS, TRUE);
190         } else if (power < -1) {
191             o_ptr->name2 = get_random_ego(INVEN_ARMS, FALSE);
192         }
193
194         break;
195     }
196
197     case TV_BOOTS: {
198         if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) {
199             dragon_resist(o_ptr);
200             if (!one_in_(3))
201                 break;
202         }
203
204         if (power > 1) {
205             /* power > 2 is debug only */
206             if (one_in_(20) || (power > 2)) {
207                 become_random_artifact(owner_ptr, o_ptr, FALSE);
208                 break;
209             }
210
211             o_ptr->name2 = get_random_ego(INVEN_FEET, TRUE);
212         } else if (power < -1) {
213             o_ptr->name2 = get_random_ego(INVEN_FEET, FALSE);
214         }
215
216         break;
217     }
218     case TV_CROWN: {
219         if (power > 1) {
220             /* power > 2 is debug only */
221             if (one_in_(20) || (power > 2)) {
222                 become_random_artifact(owner_ptr, o_ptr, FALSE);
223                 break;
224             }
225
226             while (TRUE) {
227                 bool ok_flag = TRUE;
228                 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
229
230                 switch (o_ptr->name2) {
231                 case EGO_TELEPATHY:
232                     if (add_esp_strong(o_ptr))
233                         add_esp_weak(o_ptr, TRUE);
234                     else
235                         add_esp_weak(o_ptr, FALSE);
236                     break;
237                 case EGO_MAGI:
238                 case EGO_MIGHT:
239                 case EGO_REGENERATION:
240                 case EGO_LORDLINESS:
241                 case EGO_BASILISK:
242                     break;
243                 case EGO_SEEING:
244                     if (one_in_(3)) {
245                         if (one_in_(2))
246                             add_esp_strong(o_ptr);
247                         else
248                             add_esp_weak(o_ptr, FALSE);
249                     }
250                     break;
251                 default:
252                     /* not existing crown (wisdom,lite, etc...) */
253                     ok_flag = FALSE;
254                 }
255
256                 if (ok_flag)
257                     break;
258             }
259
260             break;
261         } else if (power < -1) {
262             while (TRUE) {
263                 bool ok_flag = TRUE;
264                 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
265
266                 switch (o_ptr->name2) {
267                 case EGO_H_DEMON:
268                     ok_flag = false;
269                     break;
270                 default:
271                     break;
272                 }
273
274                 if (ok_flag)
275                     break;
276             }
277         }
278
279         break;
280     }
281     case TV_HELM: {
282         if (o_ptr->sval == SV_DRAGON_HELM) {
283             dragon_resist(o_ptr);
284             if (!one_in_(3))
285                 break;
286         }
287
288         if (power > 1) {
289             /* power > 2 is debug only */
290             if (one_in_(20) || (power > 2)) {
291                 become_random_artifact(owner_ptr, o_ptr, FALSE);
292                 break;
293             }
294
295             while (TRUE) {
296                 bool ok_flag = TRUE;
297                 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
298                 switch (o_ptr->name2) {
299                 case EGO_BRILLIANCE:
300                 case EGO_DARK:
301                 case EGO_INFRAVISION:
302                 case EGO_H_PROTECTION:
303                 case EGO_LITE:
304                     break;
305                 case EGO_SEEING:
306                     if (one_in_(7)) {
307                         if (one_in_(2))
308                             add_esp_strong(o_ptr);
309                         else
310                             add_esp_weak(o_ptr, FALSE);
311                     }
312                     break;
313                 default:
314                     /* not existing helm (Magi, Might, etc...)*/
315                     ok_flag = FALSE;
316                 }
317
318                 if (ok_flag)
319                     break;
320             }
321
322             break;
323         } else if (power < -1) {
324             while (TRUE) {
325                 bool ok_flag = TRUE;
326                 o_ptr->name2 = get_random_ego(INVEN_HEAD, FALSE);
327
328                 switch (o_ptr->name2) {
329                 case EGO_ANCIENT_CURSE:
330                     ok_flag = FALSE;
331                     break;
332                 default:
333                     break;
334                 }
335
336                 if (ok_flag)
337                     break;
338             }
339         }
340
341         break;
342     }
343     case TV_CLOAK: {
344         if (power > 1) {
345             /* power > 2 is debug only */
346             if (one_in_(20) || (power > 2)) {
347                 become_random_artifact(owner_ptr, o_ptr, FALSE);
348                 break;
349             }
350             o_ptr->name2 = get_random_ego(INVEN_OUTER, TRUE);
351
352             switch (o_ptr->name2) {
353             case EGO_BAT:
354                 o_ptr->to_d -= 6;
355                 o_ptr->to_h -= 6;
356                 break;
357             case EGO_NAZGUL:
358                 o_ptr->to_d -= 3;
359                 o_ptr->to_h -= 3;
360                 break;
361             }
362
363         } else if (power < -1) {
364             o_ptr->name2 = get_random_ego(INVEN_OUTER, FALSE);
365         }
366
367         break;
368     }
369
370     default:
371         break;
372     }
373 }