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-flags4.h"
9 #include "monster-race/race-flags7.h"
10 #include "monster-race/race-flags8.h"
11 #include "monster-race/race-indice-types.h"
12 #include "monster/monster-util.h"
13 #include "player/player-race.h"
14 #include "spell/summon-types.h"
15 #include "util/string-processor.h"
18 * @brief 指定されたモンスター種族がsummon_specific_typeで指定された召喚条件に合うかどうかを返す
19 * @param player_ptr プレーヤーへの参照ポインタ
20 * @return 召喚条件が一致するならtrue
23 bool check_summon_specific(player_type *player_ptr, MONRACE_IDX summoner_idx, MONRACE_IDX r_idx)
25 monster_race *r_ptr = &r_info[r_idx];
26 bool is_match = FALSE;
27 switch (summon_specific_type) {
29 is_match = r_ptr->d_char == 'a';
33 is_match = r_ptr->d_char == 'S';
37 is_match = ((r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z'));
41 is_match = r_ptr->d_char == 'M';
45 is_match = (r_ptr->d_char == 'A') && (((r_ptr->flags3 & RF3_EVIL) != 0) || ((r_ptr->flags3 & RF3_GOOD) != 0));
49 is_match = (r_ptr->flags3 & RF3_DEMON) != 0;
53 is_match = (r_ptr->flags3 & RF3_UNDEAD) != 0;
57 is_match = (r_ptr->flags3 & RF3_DRAGON) != 0;
60 case SUMMON_HI_UNDEAD: {
61 is_match = (r_ptr->d_char == 'L') || (r_ptr->d_char == 'V') || (r_ptr->d_char == 'W');
64 case SUMMON_HI_DRAGON: {
65 is_match = (r_ptr->d_char == 'D');
68 case SUMMON_HI_DEMON: {
69 is_match = ((r_ptr->d_char == 'U') || (r_ptr->d_char == 'H') || (r_ptr->d_char == 'B')) && ((r_ptr->flags3 & RF3_DEMON) != 0);
72 case SUMMON_AMBERITES: {
73 is_match = (r_ptr->flags3 & RF3_AMBERITE) != 0;
77 is_match = (r_ptr->flags1 & RF1_UNIQUE) != 0;
81 is_match = r_ptr->d_char == 'm';
85 is_match = r_ptr->d_char == 'b';
88 case SUMMON_QUYLTHULG: {
89 is_match = r_ptr->d_char == 'Q';
92 case SUMMON_COIN_MIMIC: {
93 is_match = r_ptr->d_char == '$';
97 is_match = ((r_ptr->d_char == '!') || (r_ptr->d_char == '?') || (r_ptr->d_char == '=') || (r_ptr->d_char == '$') || (r_ptr->d_char == '|'));
101 is_match = (r_ptr->d_char == 'g');
105 is_match = (r_ptr->d_char == 'U') && ((r_ptr->flags4 & RF4_ROCKET) != 0);
109 SYMBOL_CODE summon_kin_type = summoner_idx > 0 ? r_info[summoner_idx].d_char : get_summon_symbol_from_player(player_ptr);
110 is_match = (r_ptr->d_char == summon_kin_type) && (r_idx != MON_HAGURE);
114 is_match = r_idx == MON_DAWN;
117 case SUMMON_ANIMAL: {
118 is_match = (r_ptr->flags3 & RF3_ANIMAL) != 0;
121 case SUMMON_ANIMAL_RANGER: {
122 is_match = ((r_ptr->flags3 & (RF3_ANIMAL)) && (angband_strchr("abcflqrwBCHIJKMRS", r_ptr->d_char)) && !(r_ptr->flags3 & (RF3_DRAGON))
123 && !(r_ptr->flags3 & (RF3_EVIL)) && !(r_ptr->flags3 & (RF3_UNDEAD)) && !(r_ptr->flags3 & (RF3_DEMON)) && !(r_ptr->flags2 & (RF2_MULTIPLY))
124 && !(r_ptr->flags4 || r_ptr->a_ability_flags1 || r_ptr->a_ability_flags2));
127 case SUMMON_SMALL_MOAI: {
128 is_match = r_idx == MON_SMALL_MOAI;
131 case SUMMON_HI_DRAGON_LIVING: {
132 is_match = ((r_ptr->d_char == 'D') && monster_living(r_idx));
135 case SUMMON_LIVING: {
136 is_match = monster_living(r_idx);
139 case SUMMON_PHANTOM: {
140 is_match = (r_idx == MON_PHANTOM_B) || (r_idx == MON_PHANTOM_W);
143 case SUMMON_BLUE_HORROR: {
144 is_match = r_idx == MON_BLUE_HORROR;
147 case SUMMON_TOTEM_MOAI: {
148 is_match = r_idx == MON_TOTEM_MOAI;
151 case SUMMON_ELEMENTAL: {
152 is_match = r_ptr->d_char == 'E';
155 case SUMMON_VORTEX: {
156 is_match = r_ptr->d_char == 'v';
159 case SUMMON_HYBRID: {
160 is_match = r_ptr->d_char == 'H';
164 is_match = r_ptr->d_char == 'B';
167 case SUMMON_KAMIKAZE: {
168 for (int i = 0; i < 4; i++)
169 if (r_ptr->blow[i].method == RBM_EXPLODE)
174 case SUMMON_KAMIKAZE_LIVING: {
175 for (int i = 0; i < 4; i++)
176 if (r_ptr->blow[i].method == RBM_EXPLODE)
179 is_match &= monster_living(r_idx);
183 is_match = r_idx == MON_MANES;
187 is_match = r_idx == MON_LOUSE;
190 case SUMMON_GUARDIANS: {
191 is_match = (r_ptr->flags7 & RF7_GUARDIAN) != 0;
194 case SUMMON_KNIGHTS: {
195 is_match = ((r_idx == MON_NOV_PALADIN) || (r_idx == MON_NOV_PALADIN_G) || (r_idx == MON_PALADIN) || (r_idx == MON_W_KNIGHT)
196 || (r_idx == MON_ULTRA_PALADIN) || (r_idx == MON_KNI_TEMPLAR));
199 case SUMMON_EAGLES: {
200 is_match = (r_ptr->d_char == 'B') && ((r_ptr->flags8 & RF8_WILD_MOUNTAIN) != 0) && ((r_ptr->flags8 & RF8_WILD_ONLY) != 0);
203 case SUMMON_PIRANHAS: {
204 is_match = r_idx == MON_PIRANHA;
207 case SUMMON_ARMAGE_GOOD: {
208 is_match = (r_ptr->d_char == 'A') && ((r_ptr->flags3 & RF3_GOOD) != 0);
211 case SUMMON_ARMAGE_EVIL: {
212 is_match = ((r_ptr->flags3 & RF3_DEMON) != 0) || ((r_ptr->d_char == 'A') && ((r_ptr->flags3 & RF3_EVIL) != 0));