OSDN Git Service

[Fix] #241 吸血の対象判定が逆になっていたのを修正した / Resolved the issue that the target of races for...
[hengbandforosx/hengbandosx.git] / src / monster-race / monster-race-hook.c
1 #include "monster-race/monster-race-hook.h"
2 #include "dungeon/dungeon.h"
3 #include "monster-attack/monster-attack-effect.h"
4 #include "monster-attack/monster-attack-types.h"
5 #include "monster-race/monster-race.h"
6 #include "monster-race/race-flags-ability1.h"
7 #include "monster-race/race-flags-ability2.h"
8 #include "monster-race/race-flags-resistance.h"
9 #include "monster-race/race-flags1.h"
10 #include "monster-race/race-flags2.h"
11 #include "monster-race/race-flags3.h"
12 #include "monster-race/race-flags4.h"
13 #include "monster-race/race-flags7.h"
14 #include "monster-race/race-flags8.h"
15 #include "monster-race/race-indice-types.h"
16 #include "monster/monster-list.h"
17 #include "monster/monster-util.h"
18 #include "mspell/mspell-mask-definitions.h"
19 #include "system/floor-type-definition.h"
20 #include "util/bit-flags-calculator.h"
21 #include "util/string-processor.h"
22
23 /*! 通常pit生成時のモンスターの構成条件ID / Race index for "monster pit (clone)" */
24 int vault_aux_race;
25
26 /*! 単一シンボルpit生成時の指定シンボル / Race index for "monster pit (symbol clone)" */
27 char vault_aux_char;
28
29 /*! ブレス属性に基づくドラゴンpit生成時条件マスク / Breath mask for "monster pit (dragon)" */
30 BIT_FLAGS vault_aux_dragon_mask4;
31
32 /*!
33  * @brief pit/nestの基準となる単種モンスターを決める /
34  * @param player_ptr プレーヤーへの参照ポインタ
35  * @return なし
36  */
37 void vault_prep_clone(player_type *player_ptr)
38 {
39     get_mon_num_prep(player_ptr, vault_aux_simple, NULL);
40     vault_aux_race = get_mon_num(player_ptr, 0, player_ptr->current_floor_ptr->dun_level + 10, 0);
41     get_mon_num_prep(player_ptr, NULL, NULL);
42 }
43
44 /*!
45  * @brief pit/nestの基準となるモンスターシンボルを決める /
46  * @param player_ptr プレーヤーへの参照ポインタ
47  * @return なし
48  */
49 void vault_prep_symbol(player_type *player_ptr)
50 {
51     get_mon_num_prep(player_ptr, vault_aux_simple, NULL);
52     MONRACE_IDX r_idx = get_mon_num(player_ptr, 0, player_ptr->current_floor_ptr->dun_level + 10, 0);
53     get_mon_num_prep(player_ptr, NULL, NULL);
54     vault_aux_char = r_info[r_idx].d_char;
55 }
56
57 /*!
58  * @brief pit/nestの基準となるドラゴンの種類を決める /
59  * @param player_ptr プレーヤーへの参照ポインタ
60  * @return なし
61  */
62 void vault_prep_dragon(player_type *player_ptr)
63 {
64     /* Unused */
65     (void)player_ptr;
66
67     switch (randint0(6)) {
68     case 0: /* Black */
69         vault_aux_dragon_mask4 = RF4_BR_ACID;
70         break;
71     case 1: /* Blue */
72         vault_aux_dragon_mask4 = RF4_BR_ELEC;
73         break;
74     case 2: /* Red */
75         vault_aux_dragon_mask4 = RF4_BR_FIRE;
76         break;
77     case 3: /* White */
78         vault_aux_dragon_mask4 = RF4_BR_COLD;
79         break;
80     case 4: /* Green */
81         vault_aux_dragon_mask4 = RF4_BR_POIS;
82         break;
83     default: /* Multi-hued */
84         vault_aux_dragon_mask4 = (RF4_BR_ACID | RF4_BR_ELEC | RF4_BR_FIRE | RF4_BR_COLD | RF4_BR_POIS);
85         break;
86     }
87 }
88
89 /*!
90  * @brief モンスターがクエストの討伐対象に成り得るかを返す / Hook function for quest monsters
91  * @param r_idx モンスターID
92  * @return 討伐対象にできるならTRUEを返す。
93  */
94 bool mon_hook_quest(player_type *player_ptr, MONRACE_IDX r_idx)
95 {
96     /* Unused */
97     (void)player_ptr;
98
99     monster_race *r_ptr = &r_info[r_idx];
100     if (test_bit(r_ptr->flags8, RF8_WILD_ONLY))
101         return FALSE;
102
103     if (test_bit(r_ptr->flags7, RF7_AQUATIC))
104         return FALSE;
105
106     if (test_bit(r_ptr->flags2, RF2_MULTIPLY))
107         return FALSE;
108
109     if (test_bit(r_ptr->flags7, RF7_FRIENDLY))
110         return FALSE;
111
112     return TRUE;
113 }
114
115 /*!
116  * @brief モンスターがダンジョンに出現するかどうかを返す
117  * @param r_idx 判定するモンスターの種族ID
118  * @return ダンジョンに出現するならばTRUEを返す
119  */
120 bool mon_hook_dungeon(player_type *player_ptr, MONRACE_IDX r_idx)
121 {
122     monster_race *r_ptr = &r_info[r_idx];
123     if ((r_ptr->flags8 & RF8_WILD_ONLY) == 0)
124         return TRUE;
125
126     dungeon_type *d_ptr = &d_info[player_ptr->dungeon_idx];
127     return (test_bit(d_ptr->mflags8, RF8_WILD_MOUNTAIN) && test_bit(r_ptr->flags8, RF8_WILD_MOUNTAIN));
128 }
129
130 /*!
131  * @brief モンスターが海洋に出現するかどうかを返す
132  * @param r_idx 判定するモンスターの種族ID
133  * @return 海洋に出現するならばTRUEを返す
134  */
135 bool mon_hook_ocean(player_type *player_ptr, MONRACE_IDX r_idx)
136 {
137     /* Unused */
138     (void)player_ptr;
139
140     monster_race *r_ptr = &r_info[r_idx];
141     return test_bit(r_ptr->flags8, RF8_WILD_OCEAN);
142 }
143
144 /*!
145  * @brief モンスターが海岸に出現するかどうかを返す
146  * @param r_idx 判定するモンスターの種族ID
147  * @return 海岸に出現するならばTRUEを返す
148  */
149 bool mon_hook_shore(player_type *player_ptr, MONRACE_IDX r_idx)
150 {
151     /* Unused */
152     (void)player_ptr;
153
154     monster_race *r_ptr = &r_info[r_idx];
155     return test_bit(r_ptr->flags8, RF8_WILD_SHORE);
156 }
157
158 /*!
159  * @brief モンスターが荒地に出現するかどうかを返す
160  * @param r_idx 判定するモンスターの種族ID
161  * @return 荒地に出現するならばTRUEを返す
162  */
163 bool mon_hook_waste(player_type *player_ptr, MONRACE_IDX r_idx)
164 {
165     /* Unused */
166     (void)player_ptr;
167
168     monster_race *r_ptr = &r_info[r_idx];
169     return test_bit(r_ptr->flags8, (RF8_WILD_WASTE | RF8_WILD_ALL));
170 }
171
172 /*!
173  * @brief モンスターが町に出現するかどうかを返す
174  * @param r_idx 判定するモンスターの種族ID
175  * @return 荒地に出現するならばTRUEを返す
176  */
177 bool mon_hook_town(player_type *player_ptr, MONRACE_IDX r_idx)
178 {
179     /* Unused */
180     (void)player_ptr;
181
182     monster_race *r_ptr = &r_info[r_idx];
183     return test_bit(r_ptr->flags8, (RF8_WILD_TOWN | RF8_WILD_ALL));
184 }
185
186 /*!
187  * @brief モンスターが森林に出現するかどうかを返す
188  * @param r_idx 判定するモンスターの種族ID
189  * @return 森林に出現するならばTRUEを返す
190  */
191 bool mon_hook_wood(player_type *player_ptr, MONRACE_IDX r_idx)
192 {
193     /* Unused */
194     (void)player_ptr;
195
196     monster_race *r_ptr = &r_info[r_idx];
197     return test_bit(r_ptr->flags8, (RF8_WILD_WOOD | RF8_WILD_ALL));
198 }
199
200 /*!
201  * @brief モンスターが火山に出現するかどうかを返す
202  * @param r_idx 判定するモンスターの種族ID
203  * @return 火山に出現するならばTRUEを返す
204  */
205 bool mon_hook_volcano(player_type *player_ptr, MONRACE_IDX r_idx)
206 {
207     /* Unused */
208     (void)player_ptr;
209
210     monster_race *r_ptr = &r_info[r_idx];
211     return test_bit(r_ptr->flags8, RF8_WILD_VOLCANO);
212 }
213
214 /*!
215  * @brief モンスターが山地に出現するかどうかを返す
216  * @param r_idx 判定するモンスターの種族ID
217  * @return 山地に出現するならばTRUEを返す
218  */
219 bool mon_hook_mountain(player_type *player_ptr, MONRACE_IDX r_idx)
220 {
221     /* Unused */
222     (void)player_ptr;
223
224     monster_race *r_ptr = &r_info[r_idx];
225     return test_bit(r_ptr->flags8, RF8_WILD_MOUNTAIN);
226 }
227
228 /*!
229  * @brief モンスターが草原に出現するかどうかを返す
230  * @param r_idx 判定するモンスターの種族ID
231  * @return 森林に出現するならばTRUEを返す
232  */
233 bool mon_hook_grass(player_type *player_ptr, MONRACE_IDX r_idx)
234 {
235     /* Unused */
236     (void)player_ptr;
237
238     monster_race *r_ptr = &r_info[r_idx];
239     return test_bit(r_ptr->flags8, (RF8_WILD_GRASS | RF8_WILD_ALL));
240 }
241
242 /*!
243  * @brief モンスターが深い水地形に出現するかどうかを返す
244  * @param r_idx 判定するモンスターの種族ID
245  * @return 深い水地形に出現するならばTRUEを返す
246  */
247 bool mon_hook_deep_water(player_type *player_ptr, MONRACE_IDX r_idx)
248 {
249     monster_race *r_ptr = &r_info[r_idx];
250     if (!mon_hook_dungeon(player_ptr, r_idx))
251         return FALSE;
252
253     return test_bit(r_ptr->flags7, RF7_AQUATIC);
254 }
255
256 /*!
257  * @brief モンスターが浅い水地形に出現するかどうかを返す
258  * @param r_idx 判定するモンスターの種族ID
259  * @return 浅い水地形に出現するならばTRUEを返す
260  */
261 bool mon_hook_shallow_water(player_type *player_ptr, MONRACE_IDX r_idx)
262 {
263     monster_race *r_ptr = &r_info[r_idx];
264     if (!mon_hook_dungeon(player_ptr, r_idx))
265         return FALSE;
266
267     return !test_bit(r_ptr->flags2, RF2_AURA_FIRE);
268 }
269
270 /*!
271  * @brief モンスターが溶岩地形に出現するかどうかを返す
272  * @param r_idx 判定するモンスターの種族ID
273  * @return 溶岩地形に出現するならばTRUEを返す
274  */
275 bool mon_hook_lava(player_type *player_ptr, MONRACE_IDX r_idx)
276 {
277     monster_race *r_ptr = &r_info[r_idx];
278     if (!mon_hook_dungeon(player_ptr, r_idx))
279         return FALSE;
280
281     return (test_bit(r_ptr->flagsr, RFR_EFF_IM_FIRE_MASK) || test_bit(r_ptr->flags7, RF7_CAN_FLY)) && !test_bit(r_ptr->flags3, RF3_AURA_COLD);
282 }
283
284 /*!
285  * @brief モンスターが通常の床地形に出現するかどうかを返す
286  * @param r_idx 判定するモンスターの種族ID
287  * @return 通常の床地形に出現するならばTRUEを返す
288  */
289 bool mon_hook_floor(player_type *player_ptr, MONRACE_IDX r_idx)
290 {
291     /* Unused */
292     (void)player_ptr;
293
294     monster_race *r_ptr = &r_info[r_idx];
295     if (!test_bit(r_ptr->flags7, RF7_AQUATIC) || test_bit(r_ptr->flags7, RF7_CAN_FLY))
296         return TRUE;
297     else
298         return FALSE;
299 }
300
301 /*
302  * Helper function for "glass room"
303  */
304 bool vault_aux_lite(player_type *player_ptr, MONRACE_IDX r_idx)
305 {
306     /* Unused */
307     (void)player_ptr;
308
309     monster_race *r_ptr = &r_info[r_idx];
310     if (!vault_monster_okay(player_ptr, r_idx))
311         return FALSE;
312
313     if (!test_bit(r_ptr->flags4, RF4_BR_LITE) && !test_bit(r_ptr->a_ability_flags1, RF5_BA_LITE))
314         return FALSE;
315
316     if (test_bit(r_ptr->flags2, (RF2_PASS_WALL | RF2_KILL_WALL)))
317         return FALSE;
318
319     if (test_bit(r_ptr->flags4, RF4_BR_DISI))
320         return FALSE;
321
322     return TRUE;
323 }
324
325 /*
326  * Helper function for "glass room"
327  */
328 bool vault_aux_shards(player_type *player_ptr, MONRACE_IDX r_idx)
329 {
330     monster_race *r_ptr = &r_info[r_idx];
331     if (!vault_monster_okay(player_ptr, r_idx))
332         return FALSE;
333
334     if (!test_bit(r_ptr->flags4, RF4_BR_SHAR))
335         return FALSE;
336
337     return TRUE;
338 }
339
340 /*!
341  * @brief モンスターがVault生成の最低必要条件を満たしているかを返す /
342  * Helper monster selection function
343  * @param r_idx 確認したいモンスター種族ID
344  * @return Vault生成の最低必要条件を満たしているならTRUEを返す。
345  */
346 bool vault_aux_simple(player_type *player_ptr, MONRACE_IDX r_idx)
347 {
348     /* Unused */
349     (void)player_ptr;
350
351     return (vault_monster_okay(player_ptr, r_idx));
352 }
353
354 /*!
355  * @brief モンスターがゼリーnestの生成必要条件を満たしているかを返す /
356  * Helper function for "monster nest (jelly)"
357  * @param r_idx 確認したいモンスター種族ID
358  * @return 生成必要条件を満たしているならTRUEを返す。
359  */
360 bool vault_aux_jelly(player_type *player_ptr, MONRACE_IDX r_idx)
361 {
362     monster_race *r_ptr = &r_info[r_idx];
363     if (!vault_monster_okay(player_ptr, r_idx))
364         return FALSE;
365
366     if (test_bit(r_ptr->flags2, RF2_KILL_BODY) && !test_bit(r_ptr->flags1, RF1_NEVER_BLOW))
367         return FALSE;
368
369     if (test_bit(r_ptr->flags3, RF3_EVIL))
370         return FALSE;
371
372     if (!angband_strchr("ijm,", r_ptr->d_char))
373         return FALSE;
374
375     return TRUE;
376 }
377
378 /*!
379  * @brief モンスターが動物nestの生成必要条件を満たしているかを返す /
380  * Helper function for "monster nest (animal)"
381  * @param r_idx 確認したいモンスター種族ID
382  * @return 生成必要条件を満たしているならTRUEを返す。
383  */
384 bool vault_aux_animal(player_type *player_ptr, MONRACE_IDX r_idx)
385 {
386     monster_race *r_ptr = &r_info[r_idx];
387     if (!vault_monster_okay(player_ptr, r_idx))
388         return FALSE;
389
390     if (!test_bit(r_ptr->flags3, RF3_ANIMAL))
391         return FALSE;
392
393     return TRUE;
394 }
395
396 /*!
397  * @brief モンスターがアンデッドnestの生成必要条件を満たしているかを返す /
398  * Helper function for "monster nest (undead)"
399  * @param r_idx 確認したいモンスター種族ID
400  * @return 生成必要条件を満たしているならTRUEを返す。
401  */
402 bool vault_aux_undead(player_type *player_ptr, MONRACE_IDX r_idx)
403 {
404     monster_race *r_ptr = &r_info[r_idx];
405     if (!vault_monster_okay(player_ptr, r_idx))
406         return FALSE;
407
408     if (!test_bit(r_ptr->flags3, RF3_UNDEAD))
409         return FALSE;
410
411     return TRUE;
412 }
413
414 /*!
415  * @brief モンスターが聖堂nestの生成必要条件を満たしているかを返す /
416  * Helper function for "monster nest (chapel)"
417  * @param r_idx 確認したいモンスター種族ID
418  * @return 生成必要条件を満たしているならTRUEを返す。
419  */
420 bool vault_aux_chapel_g(player_type *player_ptr, MONRACE_IDX r_idx)
421 {
422     static int chapel_list[] = { MON_NOV_PRIEST, MON_NOV_PALADIN, MON_NOV_PRIEST_G, MON_NOV_PALADIN_G, MON_PRIEST, MON_JADE_MONK, MON_IVORY_MONK,
423         MON_ULTRA_PALADIN, MON_EBONY_MONK, MON_W_KNIGHT, MON_KNI_TEMPLAR, MON_PALADIN, MON_TOPAZ_MONK, 0 };
424
425     monster_race *r_ptr = &r_info[r_idx];
426     if (!vault_monster_okay(player_ptr, r_idx))
427         return FALSE;
428
429     if (test_bit(r_ptr->flags3, RF3_EVIL))
430         return FALSE;
431
432     if ((r_idx == MON_A_GOLD) || (r_idx == MON_A_SILVER))
433         return FALSE;
434
435     if (r_ptr->d_char == 'A')
436         return TRUE;
437
438     for (int i = 0; chapel_list[i]; i++)
439         if (r_idx == chapel_list[i])
440             return TRUE;
441
442     return FALSE;
443 }
444
445 /*!
446  * @brief モンスターが犬小屋nestの生成必要条件を満たしているかを返す /
447  * Helper function for "monster nest (kennel)"
448  * @param r_idx 確認したいモンスター種族ID
449  * @return 生成必要条件を満たしているならTRUEを返す。
450  */
451 bool vault_aux_kennel(player_type *player_ptr, MONRACE_IDX r_idx)
452 {
453     monster_race *r_ptr = &r_info[r_idx];
454     if (!vault_monster_okay(player_ptr, r_idx))
455         return FALSE;
456
457     if (!angband_strchr("CZ", r_ptr->d_char))
458         return FALSE;
459
460     return TRUE;
461 }
462
463 /*!
464  * @brief モンスターがミミックnestの生成必要条件を満たしているかを返す /
465  * Helper function for "monster nest (mimic)"
466  * @param r_idx 確認したいモンスター種族ID
467  * @return 生成必要条件を満たしているならTRUEを返す。
468  */
469 bool vault_aux_mimic(player_type *player_ptr, MONRACE_IDX r_idx)
470 {
471     monster_race *r_ptr = &r_info[r_idx];
472     if (!vault_monster_okay(player_ptr, r_idx))
473         return FALSE;
474
475     if (!angband_strchr("!$&(/=?[\\|][`~>+", r_ptr->d_char))
476         return FALSE;
477
478     return TRUE;
479 }
480
481 /*!
482  * @brief モンスターが単一クローンnestの生成必要条件を満たしているかを返す /
483  * Helper function for "monster nest (clone)"
484  * @param r_idx 確認したいモンスター種族ID
485  * @return 生成必要条件を満たしているならTRUEを返す。
486  */
487 bool vault_aux_clone(player_type *player_ptr, MONRACE_IDX r_idx)
488 {
489     if (!vault_monster_okay(player_ptr, r_idx))
490         return FALSE;
491
492     return (r_idx == vault_aux_race);
493 }
494
495 /*!
496  * @brief モンスターが邪悪属性シンボルクローンnestの生成必要条件を満たしているかを返す /
497  * Helper function for "monster nest (symbol clone)"
498  * @param r_idx 確認したいモンスター種族ID
499  * @return 生成必要条件を満たしているならTRUEを返す。
500  */
501 bool vault_aux_symbol_e(player_type *player_ptr, MONRACE_IDX r_idx)
502 {
503     monster_race *r_ptr = &r_info[r_idx];
504     if (!vault_monster_okay(player_ptr, r_idx))
505         return FALSE;
506
507     if (test_bit(r_ptr->flags2, RF2_KILL_BODY) && !test_bit(r_ptr->flags1, RF1_NEVER_BLOW))
508         return FALSE;
509
510     if (test_bit(r_ptr->flags3, RF3_GOOD))
511         return FALSE;
512
513     if (r_ptr->d_char != vault_aux_char)
514         return FALSE;
515
516     return TRUE;
517 }
518
519 /*!
520  * @brief モンスターが善良属性シンボルクローンnestの生成必要条件を満たしているかを返す /
521  * Helper function for "monster nest (symbol clone)"
522  * @param r_idx 確認したいモンスター種族ID
523  * @return 生成必要条件を満たしているならTRUEを返す。
524  */
525 bool vault_aux_symbol_g(player_type *player_ptr, MONRACE_IDX r_idx)
526 {
527     monster_race *r_ptr = &r_info[r_idx];
528     if (!vault_monster_okay(player_ptr, r_idx))
529         return FALSE;
530
531     if (test_bit(r_ptr->flags2, RF2_KILL_BODY) && !test_bit(r_ptr->flags1, RF1_NEVER_BLOW))
532         return FALSE;
533
534     if (test_bit(r_ptr->flags3, RF3_EVIL))
535         return FALSE;
536
537     if (r_ptr->d_char != vault_aux_char)
538         return FALSE;
539
540     return TRUE;
541 }
542
543 /*!
544  * @brief モンスターがオークpitの生成必要条件を満たしているかを返す /
545  * Helper function for "monster pit (orc)"
546  * @param r_idx 確認したいモンスター種族ID
547  * @return 生成必要条件を満たしているならTRUEを返す。
548  */
549 bool vault_aux_orc(player_type *player_ptr, MONRACE_IDX r_idx)
550 {
551     monster_race *r_ptr = &r_info[r_idx];
552     if (!vault_monster_okay(player_ptr, r_idx))
553         return FALSE;
554
555     if (!test_bit(r_ptr->flags3, RF3_ORC))
556         return FALSE;
557
558     if (test_bit(r_ptr->flags3, RF3_UNDEAD))
559         return FALSE;
560
561     return TRUE;
562 }
563
564 /*!
565  * @brief モンスターがトロルpitの生成必要条件を満たしているかを返す /
566  * Helper function for "monster pit (troll)"
567  * @param r_idx 確認したいモンスター種族ID
568  * @return 生成必要条件を満たしているならTRUEを返す。
569  */
570 bool vault_aux_troll(player_type *player_ptr, MONRACE_IDX r_idx)
571 {
572     monster_race *r_ptr = &r_info[r_idx];
573     if (!vault_monster_okay(player_ptr, r_idx))
574         return FALSE;
575
576     if (!test_bit(r_ptr->flags3, RF3_TROLL))
577         return FALSE;
578
579     if (test_bit(r_ptr->flags3, RF3_UNDEAD))
580         return FALSE;
581
582     return TRUE;
583 }
584
585 /*!
586  * @brief モンスターが巨人pitの生成必要条件を満たしているかを返す /
587  * Helper function for "monster pit (giant)"
588  * @param r_idx 確認したいモンスター種族ID
589  * @return 生成必要条件を満たしているならTRUEを返す。
590  */
591 bool vault_aux_giant(player_type *player_ptr, MONRACE_IDX r_idx)
592 {
593     monster_race *r_ptr = &r_info[r_idx];
594     if (!vault_monster_okay(player_ptr, r_idx))
595         return FALSE;
596
597     if (!test_bit(r_ptr->flags3, RF3_GIANT))
598         return FALSE;
599
600     if (test_bit(r_ptr->flags3, RF3_GOOD))
601         return FALSE;
602
603     if (test_bit(r_ptr->flags3, RF3_UNDEAD))
604         return FALSE;
605
606     return TRUE;
607 }
608
609 /*!
610  * @brief モンスターがドラゴンpitの生成必要条件を満たしているかを返す /
611  * Helper function for "monster pit (dragon)"
612  * @param r_idx 確認したいモンスター種族ID
613  * @return 生成必要条件を満たしているならTRUEを返す。
614  */
615 bool vault_aux_dragon(player_type *player_ptr, MONRACE_IDX r_idx)
616 {
617     monster_race *r_ptr = &r_info[r_idx];
618     if (!vault_monster_okay(player_ptr, r_idx))
619         return FALSE;
620
621     if (!test_bit(r_ptr->flags3, RF3_DRAGON))
622         return FALSE;
623
624     if (!test_bit(r_ptr->flags4, vault_aux_dragon_mask4))
625         return FALSE;
626
627     if (test_bit(r_ptr->flags3, RF3_UNDEAD))
628         return FALSE;
629
630     return TRUE;
631 }
632
633 /*!
634  * @brief モンスターが悪魔pitの生成必要条件を満たしているかを返す /
635  * Helper function for "monster pit (demon)"
636  * @param r_idx 確認したいモンスター種族ID
637  * @return 生成必要条件を満たしているならTRUEを返す。
638  */
639 bool vault_aux_demon(player_type *player_ptr, MONRACE_IDX r_idx)
640 {
641     monster_race *r_ptr = &r_info[r_idx];
642     if (!vault_monster_okay(player_ptr, r_idx))
643         return FALSE;
644
645     if (test_bit(r_ptr->flags2, RF2_KILL_BODY) && !test_bit(r_ptr->flags1, RF1_NEVER_BLOW))
646         return FALSE;
647
648     if (!test_bit(r_ptr->flags3, RF3_DEMON))
649         return FALSE;
650
651     return TRUE;
652 }
653
654 /*!
655  * @brief モンスターが狂気pitの生成必要条件を満たしているかを返す /
656  * Helper function for "monster pit (lovecraftian)"
657  * @param r_idx 確認したいモンスター種族ID
658  * @return 生成必要条件を満たしているならTRUEを返す。
659  */
660 bool vault_aux_cthulhu(player_type *player_ptr, MONRACE_IDX r_idx)
661 {
662     monster_race *r_ptr = &r_info[r_idx];
663     if (!vault_monster_okay(player_ptr, r_idx))
664         return FALSE;
665
666     if ((r_ptr->flags2 & RF2_KILL_BODY) && !(r_ptr->flags1 & RF1_NEVER_BLOW))
667         return FALSE;
668
669     if (!(r_ptr->flags2 & (RF2_ELDRITCH_HORROR)))
670         return FALSE;
671
672     return TRUE;
673 }
674
675 /*!
676  * @brief モンスターがダークエルフpitの生成必要条件を満たしているかを返す /
677  * Helper function for "monster pit (dark elf)"
678  * @param r_idx 確認したいモンスター種族ID
679  * @return 生成必要条件を満たしているならTRUEを返す。
680  */
681 bool vault_aux_dark_elf(player_type *player_ptr, MONRACE_IDX r_idx)
682 {
683     static int dark_elf_list[] = {
684         MON_D_ELF,
685         MON_D_ELF_MAGE,
686         MON_D_ELF_WARRIOR,
687         MON_D_ELF_PRIEST,
688         MON_D_ELF_LORD,
689         MON_D_ELF_WARLOCK,
690         MON_D_ELF_DRUID,
691         MON_NIGHTBLADE,
692         MON_D_ELF_SORC,
693         MON_D_ELF_SHADE,
694         0,
695     };
696
697     if (!vault_monster_okay(player_ptr, r_idx))
698         return FALSE;
699
700     for (int i = 0; dark_elf_list[i]; i++)
701         if (r_idx == dark_elf_list[i])
702             return TRUE;
703
704     return FALSE;
705 }
706
707 /*!
708  * @brief モンスターが生命体かどうかを返す
709  * Is the monster "alive"?
710  * @param r_ptr 判定するモンスターの種族情報構造体参照ポインタ
711  * @return 生命体ならばTRUEを返す
712  * @details
713  * Used to determine the message to print for a killed monster.
714  * ("dies", "destroyed")
715  */
716 bool monster_living(MONRACE_IDX r_idx)
717 {
718     monster_race *r_ptr = &r_info[r_idx];
719     return !test_bit(r_ptr->flags3, (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING));
720 }
721
722 /*!
723  * @brief モンスターが特殊能力上、賞金首から排除する必要があるかどうかを返す。
724  * Is the monster "alive"? / Is this monster declined to be questor or bounty?
725  * @param r_idx モンスターの種族ID
726  * @return 賞金首に加えられないならばTRUEを返す
727  * @details
728  * 実質バーノール=ルパート用。
729  */
730 bool no_questor_or_bounty_uniques(MONRACE_IDX r_idx)
731 {
732     switch (r_idx) {
733         /*
734          * Decline them to be questor or bounty because they use
735          * special motion "split and combine"
736          */
737     case MON_BANORLUPART:
738     case MON_BANOR:
739     case MON_LUPART:
740         return TRUE;
741     default:
742         return FALSE;
743     }
744 }
745
746 /*!
747  * @brief バルログが死体を食べられるモンスターかの判定 / Hook function for human corpses
748  * @param r_idx モンスターID
749  * @return 死体を食べられるならTRUEを返す。
750  */
751 bool monster_hook_human(player_type *player_ptr, MONRACE_IDX r_idx)
752 {
753     /* Unused */
754     (void)player_ptr;
755
756     monster_race *r_ptr = &r_info[r_idx];
757     if (test_bit(r_ptr->flags1, RF1_UNIQUE))
758         return FALSE;
759
760     if (angband_strchr("pht", r_ptr->d_char))
761         return TRUE;
762
763     return FALSE;
764 }
765
766 /*!
767  * @brief 悪夢の元凶となるモンスターかどうかを返す。
768  * @param r_idx 判定対象となるモンスターのID
769  * @return 悪夢の元凶となり得るか否か。
770  */
771 bool get_nightmare(player_type *player_ptr, MONRACE_IDX r_idx)
772 {
773     monster_race *r_ptr = &r_info[r_idx];
774     if (!test_bit(r_ptr->flags2, RF2_ELDRITCH_HORROR))
775         return FALSE;
776
777     if (r_ptr->level <= player_ptr->lev)
778         return FALSE;
779
780     return TRUE;
781 }
782
783 /*!
784  * @brief モンスター種族が釣れる種族かどうかを判定する。
785  * @param r_idx 判定したいモンスター種族のID
786  * @return 釣れる対象ならばTRUEを返す
787  */
788 bool monster_is_fishing_target(player_type *player_ptr, MONRACE_IDX r_idx)
789 {
790     /* Unused */
791     (void)player_ptr;
792
793     monster_race *r_ptr = &r_info[r_idx];
794     if (test_bit(r_ptr->flags7, RF7_AQUATIC) && !test_bit(r_ptr->flags1, RF1_UNIQUE) && angband_strchr("Jjlw", r_ptr->d_char))
795         return TRUE;
796     else
797         return FALSE;
798 }
799
800 /*!
801  * @brief モンスター闘技場に参加できるモンスターの判定
802  * @param r_idx モンスターID
803  * @details 基準はNEVER_MOVE MULTIPLY QUANTUM RF7_AQUATIC RF7_CHAMELEONのいずれも持たず、
804  * 自爆以外のなんらかのHP攻撃手段を持っていること。
805  * @return 参加できるか否か
806  */
807 bool monster_can_entry_arena(player_type *player_ptr, MONRACE_IDX r_idx)
808 {
809     /* Unused */
810     (void)player_ptr;
811
812     HIT_POINT dam = 0;
813     monster_race *r_ptr = &r_info[r_idx];
814     bool unselectable = test_bit(r_ptr->flags1, RF1_NEVER_MOVE);
815     unselectable |= test_bit(r_ptr->flags2, RF2_MULTIPLY);
816     unselectable |= test_bit(r_ptr->flags2, RF2_QUANTUM) && !test_bit(r_ptr->flags1, RF1_UNIQUE);
817     unselectable |= test_bit(r_ptr->flags7, RF7_AQUATIC);
818     unselectable |= test_bit(r_ptr->flags7, RF7_CHAMELEON);
819     if (unselectable)
820         return FALSE;
821
822     for (int i = 0; i < 4; i++) {
823         if (r_ptr->blow[i].method == RBM_EXPLODE)
824             return FALSE;
825
826         if (r_ptr->blow[i].effect != RBE_DR_MANA)
827             dam += r_ptr->blow[i].d_dice;
828     }
829
830     if (!dam && !test_bit(r_ptr->flags4, (RF4_BOLT_MASK | RF4_BEAM_MASK | RF4_BALL_MASK | RF4_BREATH_MASK))
831         && !test_bit(r_ptr->a_ability_flags1, (RF5_BOLT_MASK | RF5_BEAM_MASK | RF5_BALL_MASK | RF5_BREATH_MASK))
832         && !test_bit(r_ptr->a_ability_flags2, (RF6_BOLT_MASK | RF6_BEAM_MASK | RF6_BALL_MASK | RF6_BREATH_MASK)))
833         return FALSE;
834
835     return TRUE;
836 }
837
838 /*!
839  * @brief モンスターが人形のベースにできるかを返す
840  * @param r_idx チェックしたいモンスター種族のID
841  * @return 人形にできるならTRUEを返す
842  */
843 bool item_monster_okay(player_type *player_ptr, MONRACE_IDX r_idx)
844 {
845     /* Unused */
846     (void)player_ptr;
847
848     monster_race *r_ptr = &r_info[r_idx];
849     if (test_bit(r_ptr->flags1, RF1_UNIQUE))
850         return FALSE;
851
852     if (test_bit(r_ptr->flags7, RF7_KAGE))
853         return FALSE;
854
855     if (test_bit(r_ptr->flagsr, RFR_RES_ALL))
856         return FALSE;
857
858     if (test_bit(r_ptr->flags7, RF7_NAZGUL))
859         return FALSE;
860
861     if (test_bit(r_ptr->flags1, RF1_FORCE_DEPTH))
862         return FALSE;
863
864     if (test_bit(r_ptr->flags7, RF7_UNIQUE2))
865         return FALSE;
866
867     return TRUE;
868 }
869
870 /*!
871  * vaultに配置可能なモンスターの条件を指定する / Monster validation
872  * @param r_idx モンスター種別ID
873  * @param Vaultに配置可能であればTRUE
874  * @details
875  * Line 1 -- forbid town monsters
876  * Line 2 -- forbid uniques
877  * Line 3 -- forbid aquatic monsters
878  */
879 bool vault_monster_okay(player_type *player_ptr, MONRACE_IDX r_idx)
880 {
881     return (mon_hook_dungeon(player_ptr, r_idx) && !test_bit(r_info[r_idx].flags1, RF1_UNIQUE) && !test_bit(r_info[r_idx].flags7, RF7_UNIQUE2)
882         && !test_bit(r_info[r_idx].flagsr, RFR_RES_ALL) && !test_bit(r_info[r_idx].flags7, RF7_AQUATIC));
883 }