OSDN Git Service

Since struct dirent only holds the last element in the path, build the full path...
[hengband/hengband.git] / src / artifact / random-art-slay.c
1 #include "artifact/random-art-slay.h"
2 #include "artifact/random-art-bias-types.h"
3 #include "object-enchant/tr-types.h"
4 #include "sv-definition/sv-weapon-types.h"
5 #include "system/object-type-definition.h"
6 #include "util/bit-flags-calculator.h"
7
8 static bool random_art_slay_bow(object_type *o_ptr)
9 {
10     if (o_ptr->tval != TV_BOW)
11         return FALSE;
12
13     switch (randint1(6)) {
14     case 1:
15     case 2:
16     case 3:
17         add_flag(o_ptr->art_flags, TR_XTRA_MIGHT);
18         if (!one_in_(7))
19             remove_flag(o_ptr->art_flags, TR_XTRA_SHOTS);
20
21         if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(9))
22             o_ptr->artifact_bias = BIAS_RANGER;
23
24         return TRUE;
25     default:
26         add_flag(o_ptr->art_flags, TR_XTRA_SHOTS);
27         if (!one_in_(7))
28             remove_flag(o_ptr->art_flags, TR_XTRA_MIGHT);
29
30         if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(9))
31             o_ptr->artifact_bias = BIAS_RANGER;
32
33         return TRUE;
34     }
35 }
36
37 static bool random_art_slay_chaos(object_type *o_ptr)
38 {
39     if (has_flag(o_ptr->art_flags, TR_CHAOTIC))
40         return FALSE;
41
42     add_flag(o_ptr->art_flags, TR_CHAOTIC);
43     return one_in_(2);
44 }
45
46 static bool random_art_slay_vampiric(object_type *o_ptr)
47 {
48     if (has_flag(o_ptr->art_flags, TR_VAMPIRIC))
49         return FALSE;
50
51     add_flag(o_ptr->art_flags, TR_VAMPIRIC);
52     return one_in_(2);
53 }
54
55 static bool random_art_slay_brand_acid(object_type *o_ptr)
56 {
57     if (has_flag(o_ptr->art_flags, TR_BRAND_ACID))
58         return FALSE;
59
60     add_flag(o_ptr->art_flags, TR_BRAND_ACID);
61     return one_in_(2);
62 }
63
64 static bool random_art_slay_brand_elec(object_type *o_ptr)
65 {
66     if (has_flag(o_ptr->art_flags, TR_BRAND_ELEC))
67         return FALSE;
68
69     add_flag(o_ptr->art_flags, TR_BRAND_ELEC);
70     return one_in_(2);
71 }
72
73 static bool random_art_slay_brand_fire(object_type *o_ptr)
74 {
75     if (has_flag(o_ptr->art_flags, TR_BRAND_FIRE))
76         return FALSE;
77
78     add_flag(o_ptr->art_flags, TR_BRAND_FIRE);
79     return one_in_(2);
80 }
81
82 static bool random_art_slay_brand_cold(object_type *o_ptr)
83 {
84     if (has_flag(o_ptr->art_flags, TR_BRAND_COLD))
85         return FALSE;
86
87     add_flag(o_ptr->art_flags, TR_BRAND_COLD);
88     return one_in_(2);
89 }
90
91 static bool random_art_slay_brand_pois(object_type *o_ptr)
92 {
93     if (has_flag(o_ptr->art_flags, TR_BRAND_POIS) || one_in_(2))
94         return FALSE;
95
96     add_flag(o_ptr->art_flags, TR_BRAND_POIS);
97     return one_in_(2);
98 }
99
100 static bool random_art_slay_animal(object_type *o_ptr)
101 {
102     if (has_flag(o_ptr->art_flags, TR_SLAY_ANIMAL))
103         return FALSE;
104
105     add_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
106     return one_in_(2);
107 }
108
109 static bool random_art_slay_evil(object_type *o_ptr)
110 {
111     if (has_flag(o_ptr->art_flags, TR_SLAY_EVIL))
112         return FALSE;
113     
114     add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
115     return one_in_(2);
116 }
117
118 static bool random_art_slay_undead(object_type *o_ptr)
119 {
120     if (has_flag(o_ptr->art_flags, TR_SLAY_UNDEAD))
121         return FALSE;
122
123     add_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
124     return one_in_(2);
125 }
126
127 static bool random_art_slay_demon(object_type *o_ptr)
128 {
129     if (has_flag(o_ptr->art_flags, TR_SLAY_DEMON))
130         return FALSE;
131
132     add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
133     return one_in_(2);
134 }
135
136 static bool switch_random_art_slay(object_type *o_ptr)
137 {
138     switch (o_ptr->artifact_bias) {
139     case BIAS_CHAOS:
140         return random_art_slay_chaos(o_ptr);
141     case BIAS_PRIESTLY:
142         if (((o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM)) && !has_flag(o_ptr->art_flags, TR_BLESSED))
143             add_flag(o_ptr->art_flags, TR_BLESSED);
144
145         return FALSE;
146     case BIAS_NECROMANTIC:
147         return random_art_slay_vampiric(o_ptr) || random_art_slay_brand_pois(o_ptr);
148     case BIAS_RANGER:
149         return random_art_slay_animal(o_ptr);
150     case BIAS_ROGUE:
151         if ((((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DAGGER)) || ((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_SPEAR)))
152             && !(has_flag(o_ptr->art_flags, TR_THROW))) {
153             add_flag(o_ptr->art_flags, TR_THROW);
154         }
155
156         return random_art_slay_brand_pois(o_ptr);
157     case BIAS_POIS:
158         return random_art_slay_brand_pois(o_ptr);
159     case BIAS_ACID:
160         return random_art_slay_brand_acid(o_ptr);
161     case BIAS_ELEC:
162         return random_art_slay_brand_elec(o_ptr);
163     case BIAS_FIRE:
164         return random_art_slay_brand_fire(o_ptr);
165     case BIAS_COLD:
166         return random_art_slay_brand_cold(o_ptr);
167     case BIAS_LAW:
168         return random_art_slay_evil(o_ptr) || random_art_slay_undead(o_ptr) || random_art_slay_demon(o_ptr);
169     default:
170         return FALSE;
171     }
172 }
173
174 /*!
175  * @brief ランダムアーティファクト生成中、対象のオブジェクトにスレイ効果を付加する。/ Add one slaying on generation of randam artifact.
176  * @details 優先的に付加される耐性がランダムアーティファクトバイアスに依存して存在する。
177  * 原則的候補は強力射、高速射、混沌効果、吸血効果、祝福、投擲しやすい、焼棄、凍結、電撃、溶解、毒殺、
178  * 動物スレイ、邪悪スレイ、悪魔スレイ、不死スレイ、オークスレイ、トロルスレイ、巨人スレイ、ドラゴンスレイ、
179  * *ドラゴンスレイ*、人間スレイ、切れ味、地震、理力。
180  * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
181  * @param o_ptr 対象のオブジェクト構造体ポインタ
182  * @return なし
183  */
184 void random_slay(object_type *o_ptr)
185 {
186     if (random_art_slay_bow(o_ptr) || switch_random_art_slay(o_ptr))
187         return;
188
189     switch (randint1(36)) {
190     case 1:
191     case 2:
192         if (one_in_(4))
193             add_flag(o_ptr->art_flags, TR_KILL_ANIMAL);
194         else
195             add_flag(o_ptr->art_flags, TR_SLAY_ANIMAL);
196         
197         break;
198     case 3:
199     case 4:
200         if (one_in_(8))
201             add_flag(o_ptr->art_flags, TR_KILL_EVIL);
202         else
203             add_flag(o_ptr->art_flags, TR_SLAY_EVIL);
204         
205         if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(2)) {
206             o_ptr->artifact_bias = BIAS_LAW;
207             break;
208         }
209         
210         if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(9))
211             o_ptr->artifact_bias = BIAS_PRIESTLY;
212
213         break;
214     case 5:
215     case 6:
216         if (one_in_(4))
217             add_flag(o_ptr->art_flags, TR_KILL_UNDEAD);
218         else
219             add_flag(o_ptr->art_flags, TR_SLAY_UNDEAD);
220         
221         if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(9))
222             o_ptr->artifact_bias = BIAS_PRIESTLY;
223
224         break;
225     case 7:
226     case 8:
227         if (one_in_(4))
228             add_flag(o_ptr->art_flags, TR_KILL_DEMON);
229         else
230             add_flag(o_ptr->art_flags, TR_SLAY_DEMON);
231         
232         if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(9))
233             o_ptr->artifact_bias = BIAS_PRIESTLY;
234
235         break;
236     case 9:
237     case 10:
238         if (one_in_(4))
239             add_flag(o_ptr->art_flags, TR_KILL_ORC);
240         else
241             add_flag(o_ptr->art_flags, TR_SLAY_ORC);
242         
243         break;
244     case 11:
245     case 12:
246         if (one_in_(4))
247             add_flag(o_ptr->art_flags, TR_KILL_TROLL);
248         else
249             add_flag(o_ptr->art_flags, TR_SLAY_TROLL);
250         
251         break;
252     case 13:
253     case 14:
254         if (one_in_(4))
255             add_flag(o_ptr->art_flags, TR_KILL_GIANT);
256         else
257             add_flag(o_ptr->art_flags, TR_SLAY_GIANT);
258         
259         break;
260     case 15:
261     case 16:
262         add_flag(o_ptr->art_flags, TR_SLAY_DRAGON);
263         break;
264     case 17:
265         add_flag(o_ptr->art_flags, TR_KILL_DRAGON);
266         break;
267     case 18:
268     case 19:
269         if (o_ptr->tval != TV_SWORD) {
270             random_slay(o_ptr);
271             break;
272         }
273
274         add_flag(o_ptr->art_flags, TR_VORPAL);
275         if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(9))
276             o_ptr->artifact_bias = BIAS_WARRIOR;
277
278         break;
279     case 20:
280         add_flag(o_ptr->art_flags, TR_IMPACT);
281         break;
282     case 21:
283     case 22:
284         add_flag(o_ptr->art_flags, TR_BRAND_FIRE);
285         if (o_ptr->artifact_bias == BIAS_NONE)
286             o_ptr->artifact_bias = BIAS_FIRE;
287
288         break;
289     case 23:
290     case 24:
291         add_flag(o_ptr->art_flags, TR_BRAND_COLD);
292         if (o_ptr->artifact_bias == BIAS_NONE)
293             o_ptr->artifact_bias = BIAS_COLD;
294
295         break;
296     case 25:
297     case 26:
298         add_flag(o_ptr->art_flags, TR_BRAND_ELEC);
299         if (o_ptr->artifact_bias == BIAS_NONE)
300             o_ptr->artifact_bias = BIAS_ELEC;
301
302         break;
303     case 27:
304     case 28:
305         add_flag(o_ptr->art_flags, TR_BRAND_ACID);
306         if (!o_ptr->artifact_bias)
307             o_ptr->artifact_bias = BIAS_ACID;
308
309         break;
310     case 29:
311     case 30:
312         add_flag(o_ptr->art_flags, TR_BRAND_POIS);
313         if ((o_ptr->artifact_bias == BIAS_NONE) && !one_in_(3)) {
314             o_ptr->artifact_bias = BIAS_POIS;
315             break;
316         }
317         
318         if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(6)) {
319             o_ptr->artifact_bias = BIAS_NECROMANTIC;
320             break;
321         }
322         
323         if (o_ptr->artifact_bias == BIAS_NONE)
324             o_ptr->artifact_bias = BIAS_ROGUE;
325
326         break;
327     case 31:
328         add_flag(o_ptr->art_flags, TR_VAMPIRIC);
329         if (o_ptr->artifact_bias == BIAS_NONE)
330             o_ptr->artifact_bias = BIAS_NECROMANTIC;
331
332         break;
333     case 32:
334         add_flag(o_ptr->art_flags, TR_FORCE_WEAPON);
335         if (o_ptr->artifact_bias == BIAS_NONE)
336             o_ptr->artifact_bias = (one_in_(2) ? BIAS_MAGE : BIAS_PRIESTLY);
337
338         break;
339     case 33:
340     case 34:
341         if (one_in_(4))
342             add_flag(o_ptr->art_flags, TR_KILL_HUMAN);
343         else
344             add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
345         
346         break;
347     default:
348         add_flag(o_ptr->art_flags, TR_CHAOTIC);
349         if (o_ptr->artifact_bias == BIAS_NONE)
350             o_ptr->artifact_bias = BIAS_CHAOS;
351
352         break;
353     }
354 }