OSDN Git Service

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