1 #include "mspell/summon-checker.h"
2 #include "monster-attack/monster-attack-types.h"
3 #include "monster-race/monster-race-hook.h"
4 #include "monster-race/monster-race.h"
5 #include "monster-race/race-flags1.h"
6 #include "monster-race/race-flags2.h"
7 #include "monster-race/race-flags3.h"
8 #include "monster-race/race-flags7.h"
9 #include "monster-race/race-flags8.h"
10 #include "monster-race/race-indice-types.h"
11 #include "monster/monster-util.h"
12 #include "player-info/race-info.h"
13 #include "spell/summon-types.h"
14 #include "system/monster-race-definition.h"
15 #include "system/player-type-definition.h"
16 #include "util/string-processor.h"
19 * @brief 指定されたモンスター種族がsummon_specific_typeで指定された召喚条件に合うかどうかを返す
20 * @param player_ptr プレイヤーへの参照ポインタ
21 * @return 召喚条件が一致するならtrue
24 bool check_summon_specific(PlayerType *player_ptr, MONRACE_IDX summoner_idx, MONRACE_IDX r_idx)
26 monster_race *r_ptr = &r_info[r_idx];
27 bool is_match = false;
28 switch (summon_specific_type) {
30 is_match = r_ptr->d_char == 'a';
33 is_match = r_ptr->d_char == 'S';
36 is_match = (r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z');
39 is_match = r_ptr->d_char == 'M';
42 is_match = (r_ptr->d_char == 'A') && (((r_ptr->flags3 & RF3_EVIL) != 0) || ((r_ptr->flags3 & RF3_GOOD) != 0));
45 is_match = (r_ptr->flags3 & RF3_DEMON) != 0;
48 is_match = (r_ptr->flags3 & RF3_UNDEAD) != 0;
51 is_match = (r_ptr->flags3 & RF3_DRAGON) != 0;
53 case SUMMON_HI_UNDEAD:
54 is_match = (r_ptr->d_char == 'L') || (r_ptr->d_char == 'V') || (r_ptr->d_char == 'W');
56 case SUMMON_HI_DRAGON:
57 is_match = (r_ptr->d_char == 'D');
60 is_match = ((r_ptr->d_char == 'U') || (r_ptr->d_char == 'H') || (r_ptr->d_char == 'B')) && ((r_ptr->flags3 & RF3_DEMON) != 0);
62 case SUMMON_AMBERITES:
63 is_match = (r_ptr->flags3 & RF3_AMBERITE) != 0;
66 is_match = (r_ptr->flags1 & RF1_UNIQUE) != 0;
69 is_match = r_ptr->d_char == 'm';
72 is_match = r_ptr->d_char == 'b';
74 case SUMMON_QUYLTHULG:
75 is_match = r_ptr->d_char == 'Q';
77 case SUMMON_COIN_MIMIC:
78 is_match = r_ptr->d_char == '$';
81 is_match = ((r_ptr->d_char == '!') || (r_ptr->d_char == '?') || (r_ptr->d_char == '=') || (r_ptr->d_char == '$') || (r_ptr->d_char == '|'));
84 is_match = (r_ptr->d_char == 'g');
87 is_match = (r_ptr->d_char == 'U') && r_ptr->ability_flags.has(MonsterAbilityType::ROCKET);
90 SYMBOL_CODE summon_kin_type = summoner_idx > 0 ? r_info[summoner_idx].d_char : get_summon_symbol_from_player(player_ptr);
91 is_match = (r_ptr->d_char == summon_kin_type) && (r_idx != MON_HAGURE);
95 is_match = r_idx == MON_DAWN;
98 is_match = (r_ptr->flags3 & RF3_ANIMAL) != 0;
100 case SUMMON_ANIMAL_RANGER:
101 is_match = ((r_ptr->flags3 & (RF3_ANIMAL)) && (angband_strchr("abcflqrwBCHIJKMRS", r_ptr->d_char)) && !(r_ptr->flags3 & (RF3_DRAGON))
102 && !(r_ptr->flags3 & (RF3_EVIL)) && !(r_ptr->flags3 & (RF3_UNDEAD)) && !(r_ptr->flags3 & (RF3_DEMON)) && !(r_ptr->flags2 & (RF2_MULTIPLY))
103 && r_ptr->ability_flags.none());
105 case SUMMON_SMALL_MOAI:
106 is_match = r_idx == MON_SMALL_MOAI;
109 is_match = one_in_(16) ? r_ptr->d_char == 'z' : r_idx == MON_SCARAB;
112 is_match = (r_idx == MON_PHANTOM_B) || (r_idx == MON_PHANTOM_W);
114 case SUMMON_BLUE_HORROR:
115 is_match = r_idx == MON_BLUE_HORROR;
117 case SUMMON_TOTEM_MOAI:
118 is_match = r_idx == MON_TOTEM_MOAI;
121 is_match = monster_living(r_idx);
123 case SUMMON_HI_DRAGON_LIVING:
124 is_match = ((r_ptr->d_char == 'D') && monster_living(r_idx));
126 case SUMMON_ELEMENTAL:
127 is_match = r_ptr->d_char == 'E';
130 is_match = r_ptr->d_char == 'v';
133 is_match = r_ptr->d_char == 'H';
136 is_match = r_ptr->d_char == 'B';
138 case SUMMON_KAMIKAZE:
139 for (int i = 0; i < 4; i++)
140 if (r_ptr->blow[i].method == RaceBlowMethodType::EXPLODE)
144 case SUMMON_KAMIKAZE_LIVING:
145 for (int i = 0; i < 4; i++)
146 if (r_ptr->blow[i].method == RaceBlowMethodType::EXPLODE)
149 is_match &= monster_living(r_idx);
152 is_match = r_idx == MON_MANES;
155 is_match = r_idx == MON_LOUSE;
157 case SUMMON_GUARDIANS:
158 is_match = (r_ptr->flags7 & RF7_GUARDIAN) != 0;
161 is_match = ((r_idx == MON_NOV_PALADIN) || (r_idx == MON_NOV_PALADIN_G) || (r_idx == MON_PALADIN) || (r_idx == MON_W_KNIGHT)
162 || (r_idx == MON_ULTRA_PALADIN) || (r_idx == MON_KNI_TEMPLAR));
165 is_match = (r_ptr->d_char == 'B') && ((r_ptr->flags8 & RF8_WILD_MOUNTAIN) != 0) && ((r_ptr->flags8 & RF8_WILD_ONLY) != 0);
167 case SUMMON_PIRANHAS:
168 is_match = r_idx == MON_PIRANHA;
170 case SUMMON_ARMAGE_GOOD:
171 is_match = (r_ptr->d_char == 'A') && ((r_ptr->flags3 & RF3_GOOD) != 0);
173 case SUMMON_ARMAGE_EVIL:
174 is_match = ((r_ptr->flags3 & RF3_DEMON) != 0) || ((r_ptr->d_char == 'A') && ((r_ptr->flags3 & RF3_EVIL) != 0));
176 case SUMMON_APOCRYPHA_FOLLOWERS:
177 is_match = (r_idx == MON_FOLLOWER_WARRIOR) || (r_idx == MON_FOLLOWER_MAGE);
179 case SUMMON_APOCRYPHA_DRAGONS:
180 is_match = (r_ptr->d_char == 'D') && (r_ptr->level >= 60) && (r_idx != MON_WYRM_COLOURS) && (r_idx != MON_ALDUIN);
183 is_match = r_idx == MON_VESPOID;
185 case SUMMON_ANTI_TIGERS:
186 is_match = one_in_(32) ? (r_ptr->d_char == 'P') : false;
187 is_match |= one_in_(48) ? (r_ptr->d_char == 'd') : false;
188 is_match |= one_in_(16) ? (r_ptr->d_char == 'l') : false;
189 is_match |= (r_idx == MON_STAR_VAMPIRE) || (r_idx == MON_SWALLOW) || (r_idx == MON_HAWK);
190 is_match |= (r_idx == MON_LION) || (r_idx == MON_BUFFALO) || (r_idx == MON_FIGHTER) || (r_idx == MON_GOLDEN_EAGLE);
191 is_match |= (r_idx == MON_SHALLOW_PUDDLE) || (r_idx == MON_DEEP_PUDDLE) || (r_idx == MON_SKY_WHALE);