1 #include "mspell/summon-checker.h"
2 #include "monster-race/monster-race-hook.h"
3 #include "monster-race/race-flags1.h"
4 #include "monster-race/race-flags2.h"
5 #include "monster-race/race-flags3.h"
6 #include "monster-race/race-flags4.h"
7 #include "monster-race/race-flags7.h"
8 #include "monster-race/race-flags8.h"
9 #include "monster-race/race-indice-types.h"
10 #include "monster/monster-util.h"
11 #include "spell/spells-summon.h"
14 * @brief 指定されたモンスター種族がsummon_specific_typeで指定された召喚条件に合うかどうかを返す
15 * @param player_ptr プレーヤーへの参照ポインタ
16 * @return 召喚条件が一致するならtrue
19 bool check_summon_specific(player_type *player_ptr, MONRACE_IDX summoner_idx, MONRACE_IDX r_idx)
21 monster_race *r_ptr = &r_info[r_idx];
22 bool is_match = FALSE;
24 switch (summon_specific_type) {
26 is_match = (r_ptr->d_char == 'a');
30 is_match = (r_ptr->d_char == 'S');
34 is_match = ((r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z'));
38 is_match = (r_ptr->d_char == 'M');
42 is_match = (r_ptr->d_char == 'A' && ((r_ptr->flags3 & RF3_EVIL) || (r_ptr->flags3 & RF3_GOOD)));
46 is_match = (r_ptr->flags3 & RF3_DEMON);
50 is_match = (r_ptr->flags3 & RF3_UNDEAD);
54 is_match = (r_ptr->flags3 & RF3_DRAGON);
57 case SUMMON_HI_UNDEAD: {
58 is_match = ((r_ptr->d_char == 'L') || (r_ptr->d_char == 'V') || (r_ptr->d_char == 'W'));
61 case SUMMON_HI_DRAGON: {
62 is_match = (r_ptr->d_char == 'D');
65 case SUMMON_HI_DEMON: {
66 is_match = (((r_ptr->d_char == 'U') || (r_ptr->d_char == 'H') || (r_ptr->d_char == 'B')) && (r_ptr->flags3 & RF3_DEMON)) ? TRUE : FALSE;
69 case SUMMON_AMBERITES: {
70 is_match = (r_ptr->flags3 & (RF3_AMBERITE)) ? TRUE : FALSE;
74 is_match = (r_ptr->flags1 & (RF1_UNIQUE)) ? TRUE : FALSE;
78 is_match = (r_ptr->d_char == 'm');
82 is_match = (r_ptr->d_char == 'b');
85 case SUMMON_QUYLTHULG: {
86 is_match = (r_ptr->d_char == 'Q');
89 case SUMMON_COIN_MIMIC: {
90 is_match = (r_ptr->d_char == '$');
94 is_match = ((r_ptr->d_char == '!') || (r_ptr->d_char == '?') || (r_ptr->d_char == '=') || (r_ptr->d_char == '$') || (r_ptr->d_char == '|'));
98 is_match = (r_ptr->d_char == 'g');
102 is_match = ((r_ptr->d_char == 'U') && (r_ptr->flags4 & RF4_ROCKET));
106 SYMBOL_CODE summon_kin_type;
108 summon_kin_type = r_info[summoner_idx].d_char;
110 summon_kin_type = get_summon_symbol_from_player(player_ptr);
113 is_match = ((r_ptr->d_char == summon_kin_type) && (r_idx != MON_HAGURE));
117 is_match = (r_idx == MON_DAWN);
120 case SUMMON_ANIMAL: {
121 is_match = (r_ptr->flags3 & (RF3_ANIMAL));
124 case SUMMON_ANIMAL_RANGER: {
125 is_match = ((r_ptr->flags3 & (RF3_ANIMAL)) && (angband_strchr("abcflqrwBCHIJKMRS", r_ptr->d_char)) && !(r_ptr->flags3 & (RF3_DRAGON))
126 && !(r_ptr->flags3 & (RF3_EVIL)) && !(r_ptr->flags3 & (RF3_UNDEAD)) && !(r_ptr->flags3 & (RF3_DEMON)) && !(r_ptr->flags2 & (RF2_MULTIPLY))
127 && !(r_ptr->flags4 || r_ptr->a_ability_flags1 || r_ptr->a_ability_flags2));
130 case SUMMON_HI_DRAGON_LIVING: {
131 is_match = ((r_ptr->d_char == 'D') && monster_living(r_idx));
134 case SUMMON_LIVING: {
135 is_match = monster_living(r_idx);
138 case SUMMON_PHANTOM: {
139 is_match = (r_idx == MON_PHANTOM_B || r_idx == MON_PHANTOM_W);
142 case SUMMON_BLUE_HORROR: {
143 is_match = (r_idx == MON_BLUE_HORROR);
146 case SUMMON_ELEMENTAL: {
147 is_match = (r_ptr->d_char == 'E');
150 case SUMMON_VORTEX: {
151 is_match = (r_ptr->d_char == 'v');
154 case SUMMON_HYBRID: {
155 is_match = (r_ptr->d_char == 'H');
159 is_match = (r_ptr->d_char == 'B');
162 case SUMMON_KAMIKAZE: {
164 for (i = 0; i < 4; i++)
165 if (r_ptr->blow[i].method == RBM_EXPLODE)
169 case SUMMON_KAMIKAZE_LIVING: {
172 for (i = 0; i < 4; i++)
173 if (r_ptr->blow[i].method == RBM_EXPLODE)
175 is_match = (is_match && monster_living(r_idx));
179 is_match = (r_idx == MON_MANES);
183 is_match = (r_idx == MON_LOUSE);
186 case SUMMON_GUARDIANS: {
187 is_match = (r_ptr->flags7 & RF7_GUARDIAN);
190 case SUMMON_KNIGHTS: {
191 is_match = ((r_idx == MON_NOV_PALADIN) || (r_idx == MON_NOV_PALADIN_G) || (r_idx == MON_PALADIN) || (r_idx == MON_W_KNIGHT)
192 || (r_idx == MON_ULTRA_PALADIN) || (r_idx == MON_KNI_TEMPLAR));
195 case SUMMON_EAGLES: {
196 is_match = (r_ptr->d_char == 'B' && (r_ptr->flags8 & RF8_WILD_MOUNTAIN) && (r_ptr->flags8 & RF8_WILD_ONLY));
199 case SUMMON_PIRANHAS: {
200 is_match = (r_idx == MON_PIRANHA);
203 case SUMMON_ARMAGE_GOOD: {
204 is_match = (r_ptr->d_char == 'A' && (r_ptr->flags3 & RF3_GOOD));
207 case SUMMON_ARMAGE_EVIL: {
208 is_match = ((r_ptr->flags3 & RF3_DEMON) || (r_ptr->d_char == 'A' && (r_ptr->flags3 & RF3_EVIL)));