OSDN Git Service

Merge remote-tracking branch 'remotes/hengbandosx/english-mind-edits' into feature...
[hengband/hengband.git] / src / artifact / random-art-resistance.c
1 #include "artifact/random-art-resistance.h"
2 #include "artifact/random-art-bias-types.h"
3 #include "object-enchant/tr-types.h"
4 #include "system/object-type-definition.h"
5 #include "util/bit-flags-calculator.h"
6
7 static bool random_art_resistance_acid(object_type *o_ptr)
8 {
9     if (has_flag(o_ptr->art_flags, TR_RES_ACID))
10         return FALSE;
11
12     add_flag(o_ptr->art_flags, TR_RES_ACID);
13     return one_in_(2);
14 }
15
16 static bool random_art_immunity_acid(object_type *o_ptr)
17 {
18     if (!one_in_(BIAS_LUCK) || has_flag(o_ptr->art_flags, TR_IM_ACID))
19         return FALSE;
20
21     add_flag(o_ptr->art_flags, TR_IM_ACID);
22     if (one_in_(IM_LUCK))
23         return one_in_(2);
24
25     remove_flag(o_ptr->art_flags, TR_IM_ELEC);
26     remove_flag(o_ptr->art_flags, TR_IM_COLD);
27     remove_flag(o_ptr->art_flags, TR_IM_FIRE);
28     return one_in_(2);
29 }
30
31 static bool random_art_resistance_elec(object_type *o_ptr)
32 {
33     if (has_flag(o_ptr->art_flags, TR_RES_ELEC))
34         return FALSE;
35
36     add_flag(o_ptr->art_flags, TR_RES_ELEC);
37     return one_in_(2);
38 }
39
40 static bool random_art_aura_elec(object_type *o_ptr)
41 {
42     if ((o_ptr->tval < TV_CLOAK) || (o_ptr->tval > TV_HARD_ARMOR) || has_flag(o_ptr->art_flags, TR_SH_ELEC))
43         return FALSE;
44
45     add_flag(o_ptr->art_flags, TR_SH_ELEC);
46     return one_in_(2);
47 }
48
49 static bool random_art_immunity_elec(object_type *o_ptr)
50 {
51     if (!one_in_(BIAS_LUCK) || has_flag(o_ptr->art_flags, TR_IM_ELEC))
52         return FALSE;
53
54     add_flag(o_ptr->art_flags, TR_IM_ELEC);
55     if (one_in_(IM_LUCK))
56         return one_in_(2);
57
58     remove_flag(o_ptr->art_flags, TR_IM_ACID);
59     remove_flag(o_ptr->art_flags, TR_IM_COLD);
60     remove_flag(o_ptr->art_flags, TR_IM_FIRE);
61     return one_in_(2);
62 }
63
64 static bool random_art_resistance_fire(object_type *o_ptr)
65 {
66     if (has_flag(o_ptr->art_flags, TR_RES_FIRE))
67         return FALSE;
68
69     add_flag(o_ptr->art_flags, TR_RES_FIRE);
70     return one_in_(2);
71 }
72
73 static bool random_art_aura_fire(object_type *o_ptr)
74 {
75     if ((o_ptr->tval < TV_CLOAK) || (o_ptr->tval > TV_HARD_ARMOR) || has_flag(o_ptr->art_flags, TR_SH_FIRE))
76         return FALSE;
77
78     add_flag(o_ptr->art_flags, TR_SH_FIRE);
79     return one_in_(2);
80 }
81
82 static bool random_art_immunity_fire(object_type *o_ptr)
83 {
84     if (!one_in_(BIAS_LUCK) || has_flag(o_ptr->art_flags, TR_IM_FIRE))
85         return FALSE;
86
87     add_flag(o_ptr->art_flags, TR_IM_FIRE);
88     if (one_in_(IM_LUCK))
89         return one_in_(2);
90
91     remove_flag(o_ptr->art_flags, TR_IM_ELEC);
92     remove_flag(o_ptr->art_flags, TR_IM_COLD);
93     remove_flag(o_ptr->art_flags, TR_IM_ACID);
94     return one_in_(2);
95 }
96
97 static bool random_art_resistance_cold(object_type *o_ptr)
98 {
99     if (has_flag(o_ptr->art_flags, TR_RES_COLD))
100         return FALSE;
101
102     add_flag(o_ptr->art_flags, TR_RES_COLD);
103     return one_in_(2);
104 }
105
106 static bool random_art_aura_cold(object_type *o_ptr)
107 {
108     if ((o_ptr->tval < TV_CLOAK) || (o_ptr->tval > TV_HARD_ARMOR) || has_flag(o_ptr->art_flags, TR_SH_COLD))
109         return FALSE;
110
111     add_flag(o_ptr->art_flags, TR_SH_COLD);
112     return one_in_(2);
113 }
114
115 static bool random_art_immunity_cold(object_type *o_ptr)
116 {
117     if (!one_in_(BIAS_LUCK) || has_flag(o_ptr->art_flags, TR_IM_COLD))
118         return FALSE;
119
120     add_flag(o_ptr->art_flags, TR_IM_COLD);
121     if (one_in_(IM_LUCK))
122         return one_in_(2);
123
124     remove_flag(o_ptr->art_flags, TR_IM_ELEC);
125     remove_flag(o_ptr->art_flags, TR_IM_COLD);
126     remove_flag(o_ptr->art_flags, TR_IM_ACID);
127     return one_in_(2);
128 }
129
130 static bool random_art_resistance_pois(object_type *o_ptr)
131 {
132     if (has_flag(o_ptr->art_flags, TR_RES_POIS))
133         return FALSE;
134
135     add_flag(o_ptr->art_flags, TR_RES_POIS);
136     return one_in_(2);
137 }
138
139 static bool random_art_resistance_fear(object_type *o_ptr)
140 {
141     if (one_in_(3) || has_flag(o_ptr->art_flags, TR_RES_FEAR))
142         return FALSE;
143
144     add_flag(o_ptr->art_flags, TR_RES_FEAR);
145     return one_in_(2);
146 }
147
148 static bool random_art_resistance_no_magic(object_type *o_ptr)
149 {
150     if (!one_in_(3) || has_flag(o_ptr->art_flags, TR_NO_MAGIC))
151         return FALSE;
152
153     add_flag(o_ptr->art_flags, TR_NO_MAGIC);
154     return one_in_(2);
155 }
156
157 static bool random_art_resistance_nether(object_type *o_ptr)
158 {
159     if (has_flag(o_ptr->art_flags, TR_RES_NETHER))
160         return FALSE;
161
162     add_flag(o_ptr->art_flags, TR_RES_NETHER);
163     return one_in_(2);
164 }
165
166 static bool random_art_resistance_dark(object_type *o_ptr)
167 {
168     if (has_flag(o_ptr->art_flags, TR_RES_DARK))
169         return FALSE;
170
171     add_flag(o_ptr->art_flags, TR_RES_DARK);
172     return one_in_(2);
173 }
174
175 static bool random_art_resistance_chaos(object_type *o_ptr)
176 {
177     if (has_flag(o_ptr->art_flags, TR_RES_CHAOS))
178         return FALSE;
179
180     add_flag(o_ptr->art_flags, TR_RES_CHAOS);
181     return one_in_(2);
182 }
183
184 static bool random_art_resistance_confusion(object_type *o_ptr)
185 {
186     if (has_flag(o_ptr->art_flags, TR_RES_CONF))
187         return FALSE;
188
189     add_flag(o_ptr->art_flags, TR_RES_CONF);
190     return one_in_(2);
191 }
192
193 static bool random_art_resistance_disenchant(object_type *o_ptr)
194 {
195     if (has_flag(o_ptr->art_flags, TR_RES_DISEN))
196         return FALSE;
197
198     add_flag(o_ptr->art_flags, TR_RES_DISEN);
199     return one_in_(2);
200 }
201
202 static bool switch_random_art_resistance(object_type *o_ptr)
203 {
204     switch (o_ptr->artifact_bias) {
205     case BIAS_ACID:
206         return random_art_resistance_acid(o_ptr) || random_art_immunity_acid(o_ptr);
207     case BIAS_ELEC:
208         return random_art_resistance_elec(o_ptr) || random_art_aura_elec(o_ptr) || random_art_immunity_elec(o_ptr);
209     case BIAS_FIRE:
210         return random_art_resistance_fire(o_ptr) || random_art_aura_fire(o_ptr) || random_art_immunity_fire(o_ptr);
211     case BIAS_COLD:
212         return random_art_resistance_cold(o_ptr) || random_art_aura_cold(o_ptr) || random_art_immunity_cold(o_ptr);
213     case BIAS_POIS:
214         return random_art_resistance_pois(o_ptr);
215     case BIAS_WARRIOR:
216         return random_art_resistance_fear(o_ptr) || random_art_resistance_no_magic(o_ptr);
217     case BIAS_NECROMANTIC:
218         return random_art_resistance_nether(o_ptr) || random_art_resistance_pois(o_ptr) || random_art_resistance_dark(o_ptr);
219     case BIAS_CHAOS:
220         return random_art_resistance_chaos(o_ptr) || random_art_resistance_confusion(o_ptr) || random_art_resistance_disenchant(o_ptr);
221     default:
222         return FALSE;
223     }
224 }
225
226 /* 一定確率で再試行する */
227 static void set_weird_bias_acid(object_type *o_ptr)
228 {
229     if (!one_in_(WEIRD_LUCK)) {
230         random_resistance(o_ptr);
231         return;
232     }
233
234     add_flag(o_ptr->art_flags, TR_IM_ACID);
235     if (!o_ptr->artifact_bias)
236         o_ptr->artifact_bias = BIAS_ACID;
237 }
238
239 /* 一定確率で再試行する */
240 static void set_weird_bias_elec(object_type *o_ptr)
241 {
242     if (!one_in_(WEIRD_LUCK)) {
243         random_resistance(o_ptr);
244         return;
245     }
246
247     add_flag(o_ptr->art_flags, TR_IM_ELEC);
248     if (!o_ptr->artifact_bias)
249         o_ptr->artifact_bias = BIAS_ELEC;
250 }
251
252 /* 一定確率で再試行する */
253 static void set_weird_bias_cold(object_type *o_ptr)
254 {
255     if (!one_in_(WEIRD_LUCK)) {
256         random_resistance(o_ptr);
257         return;
258     }
259
260     add_flag(o_ptr->art_flags, TR_IM_COLD);
261     if (!o_ptr->artifact_bias)
262         o_ptr->artifact_bias = BIAS_COLD;
263 }
264
265 /* 一定確率で再試行する */
266 static void set_weird_bias_fire(object_type *o_ptr)
267 {
268     if (!one_in_(WEIRD_LUCK)) {
269         random_resistance(o_ptr);
270         return;
271     }
272
273     add_flag(o_ptr->art_flags, TR_IM_FIRE);
274     if (!o_ptr->artifact_bias)
275         o_ptr->artifact_bias = BIAS_FIRE;
276 }
277
278 static void set_bias_pois(object_type *o_ptr)
279 {
280     add_flag(o_ptr->art_flags, TR_RES_POIS);
281     if (!o_ptr->artifact_bias && !one_in_(4)) {
282         o_ptr->artifact_bias = BIAS_POIS;
283         return;
284     }
285
286     if (!o_ptr->artifact_bias && one_in_(2)) {
287         o_ptr->artifact_bias = BIAS_NECROMANTIC;
288         return;
289     }
290
291     if (!o_ptr->artifact_bias && one_in_(2))
292         o_ptr->artifact_bias = BIAS_ROGUE;
293 }
294
295 /* 一定確率で再試行する */
296 static void set_weird_bias_aura_elec(object_type *o_ptr)
297 {
298     if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
299         add_flag(o_ptr->art_flags, TR_SH_ELEC);
300     else
301         random_resistance(o_ptr);
302
303     if (!o_ptr->artifact_bias)
304         o_ptr->artifact_bias = BIAS_ELEC;
305 }
306
307 /* 一定確率で再試行する */
308 static void set_weird_bias_aura_fire(object_type *o_ptr)
309 {
310     if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
311         add_flag(o_ptr->art_flags, TR_SH_FIRE);
312     else
313         random_resistance(o_ptr);
314
315     if (!o_ptr->artifact_bias)
316         o_ptr->artifact_bias = BIAS_FIRE;
317 }
318
319 /* 一定確率で再試行する */
320 static void set_weird_bias_reflection(object_type *o_ptr)
321 {
322     if (o_ptr->tval == TV_SHIELD || o_ptr->tval == TV_CLOAK || o_ptr->tval == TV_HELM || o_ptr->tval == TV_HARD_ARMOR) {
323         add_flag(o_ptr->art_flags, TR_REFLECT);
324         return;
325     }
326
327     random_resistance(o_ptr);
328 }
329
330 /* 一定確率で再試行する */
331 static void set_weird_bias_aura_cold(object_type *o_ptr)
332 {
333     if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR)
334         add_flag(o_ptr->art_flags, TR_SH_COLD);
335     else
336         random_resistance(o_ptr);
337
338     if (!o_ptr->artifact_bias)
339         o_ptr->artifact_bias = BIAS_COLD;
340 }
341
342 /*!
343  * @brief ランダムアーティファクト生成中、対象のオブジェクトに耐性を付加する。/ Add one resistance on generation of randam artifact.
344  * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
345  * 原則的候補は火炎、冷気、電撃、酸(以上免疫の可能性もあり)、
346  * 毒、閃光、暗黒、破片、轟音、盲目、混乱、地獄、カオス、劣化、恐怖、火オーラ、冷気オーラ、電撃オーラ、反射。
347  * 戦士系バイアスのみ反魔もつく。
348  * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
349  * @param o_ptr 対象のオブジェクト構造体ポインタ
350  * @return なし
351  */
352 void random_resistance(object_type *o_ptr)
353 {
354     if (switch_random_art_resistance(o_ptr))
355         return;
356
357     switch (randint1(42)) {
358     case 1:
359         set_weird_bias_acid(o_ptr);
360         break;
361     case 2:
362         set_weird_bias_elec(o_ptr);
363         break;
364     case 3:
365         set_weird_bias_cold(o_ptr);
366         break;
367     case 4:
368         set_weird_bias_fire(o_ptr);
369         break;
370     case 5:
371     case 6:
372     case 13:
373         add_flag(o_ptr->art_flags, TR_RES_ACID);
374         if (!o_ptr->artifact_bias)
375             o_ptr->artifact_bias = BIAS_ACID;
376
377         break;
378     case 7:
379     case 8:
380     case 14:
381         add_flag(o_ptr->art_flags, TR_RES_ELEC);
382         if (!o_ptr->artifact_bias)
383             o_ptr->artifact_bias = BIAS_ELEC;
384
385         break;
386     case 9:
387     case 10:
388     case 15:
389         add_flag(o_ptr->art_flags, TR_RES_FIRE);
390         if (!o_ptr->artifact_bias)
391             o_ptr->artifact_bias = BIAS_FIRE;
392
393         break;
394     case 11:
395     case 12:
396     case 16:
397         add_flag(o_ptr->art_flags, TR_RES_COLD);
398         if (!o_ptr->artifact_bias)
399             o_ptr->artifact_bias = BIAS_COLD;
400
401         break;
402     case 17:
403     case 18:
404         set_bias_pois(o_ptr);
405         break;
406     case 19:
407     case 20:
408         add_flag(o_ptr->art_flags, TR_RES_FEAR);
409         if (!o_ptr->artifact_bias && one_in_(3))
410             o_ptr->artifact_bias = BIAS_WARRIOR;
411
412         break;
413     case 21:
414         add_flag(o_ptr->art_flags, TR_RES_LITE);
415         break;
416     case 22:
417         add_flag(o_ptr->art_flags, TR_RES_DARK);
418         break;
419     case 23:
420     case 24:
421         add_flag(o_ptr->art_flags, TR_RES_BLIND);
422         break;
423     case 25:
424     case 26:
425         add_flag(o_ptr->art_flags, TR_RES_CONF);
426         if (!o_ptr->artifact_bias && one_in_(6))
427             o_ptr->artifact_bias = BIAS_CHAOS;
428
429         break;
430     case 27:
431     case 28:
432         add_flag(o_ptr->art_flags, TR_RES_SOUND);
433         break;
434     case 29:
435     case 30:
436         add_flag(o_ptr->art_flags, TR_RES_SHARDS);
437         break;
438     case 31:
439     case 32:
440         add_flag(o_ptr->art_flags, TR_RES_NETHER);
441         if (!o_ptr->artifact_bias && one_in_(3))
442             o_ptr->artifact_bias = BIAS_NECROMANTIC;
443
444         break;
445     case 33:
446     case 34:
447         add_flag(o_ptr->art_flags, TR_RES_NEXUS);
448         break;
449     case 35:
450     case 36:
451         add_flag(o_ptr->art_flags, TR_RES_CHAOS);
452         if (!o_ptr->artifact_bias && one_in_(2))
453             o_ptr->artifact_bias = BIAS_CHAOS;
454
455         break;
456     case 37:
457     case 38:
458         add_flag(o_ptr->art_flags, TR_RES_DISEN);
459         break;
460     case 39:
461         set_weird_bias_aura_elec(o_ptr);
462         break;
463     case 40:
464         set_weird_bias_aura_fire(o_ptr);
465         break;
466     case 41:
467         set_weird_bias_reflection(o_ptr);
468         break;
469     case 42:
470         set_weird_bias_aura_cold(o_ptr);
471         break;
472     }
473 }