OSDN Git Service

Merge branch 'Release-3.0.0Alpha' into release/3.0.0Alpha
[hengband/hengband.git] / src / mspell / summon-checker.c
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"
16
17 /*!
18  * @brief 指定されたモンスター種族がsummon_specific_typeで指定された召喚条件に合うかどうかを返す
19  * @param player_ptr プレーヤーへの参照ポインタ
20  * @return 召喚条件が一致するならtrue
21  * @details
22  */
23 bool check_summon_specific(player_type *player_ptr, MONRACE_IDX summoner_idx, MONRACE_IDX r_idx)
24 {
25     monster_race *r_ptr = &r_info[r_idx];
26     bool is_match = FALSE;
27     switch (summon_specific_type) {
28     case SUMMON_ANT: {
29         is_match = r_ptr->d_char == 'a';
30         break;
31     }
32     case SUMMON_SPIDER: {
33         is_match = r_ptr->d_char == 'S';
34         break;
35     }
36     case SUMMON_HOUND: {
37         is_match = ((r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z'));
38         break;
39     }
40     case SUMMON_HYDRA: {
41         is_match = r_ptr->d_char == 'M';
42         break;
43     }
44     case SUMMON_ANGEL: {
45         is_match = (r_ptr->d_char == 'A') && (((r_ptr->flags3 & RF3_EVIL) != 0) || ((r_ptr->flags3 & RF3_GOOD) != 0));
46         break;
47     }
48     case SUMMON_DEMON: {
49         is_match = (r_ptr->flags3 & RF3_DEMON) != 0;
50         break;
51     }
52     case SUMMON_UNDEAD: {
53         is_match = (r_ptr->flags3 & RF3_UNDEAD) != 0;
54         break;
55     }
56     case SUMMON_DRAGON: {
57         is_match = (r_ptr->flags3 & RF3_DRAGON) != 0;
58         break;
59     }
60     case SUMMON_HI_UNDEAD: {
61         is_match = (r_ptr->d_char == 'L') || (r_ptr->d_char == 'V') || (r_ptr->d_char == 'W');
62         break;
63     }
64     case SUMMON_HI_DRAGON: {
65         is_match = (r_ptr->d_char == 'D');
66         break;
67     }
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);
70         break;
71     }
72     case SUMMON_AMBERITES: {
73         is_match = (r_ptr->flags3 & RF3_AMBERITE) != 0;
74         break;
75     }
76     case SUMMON_UNIQUE: {
77         is_match = (r_ptr->flags1 & RF1_UNIQUE) != 0;
78         break;
79     }
80     case SUMMON_MOLD: {
81         is_match = r_ptr->d_char == 'm';
82         break;
83     }
84     case SUMMON_BAT: {
85         is_match = r_ptr->d_char == 'b';
86         break;
87     }
88     case SUMMON_QUYLTHULG: {
89         is_match = r_ptr->d_char == 'Q';
90         break;
91     }
92     case SUMMON_COIN_MIMIC: {
93         is_match = r_ptr->d_char == '$';
94         break;
95     }
96     case SUMMON_MIMIC: {
97         is_match = ((r_ptr->d_char == '!') || (r_ptr->d_char == '?') || (r_ptr->d_char == '=') || (r_ptr->d_char == '$') || (r_ptr->d_char == '|'));
98         break;
99     }
100     case SUMMON_GOLEM: {
101         is_match = (r_ptr->d_char == 'g');
102         break;
103     }
104     case SUMMON_CYBER: {
105         is_match = (r_ptr->d_char == 'U') && ((r_ptr->flags4 & RF4_ROCKET) != 0);
106         break;
107     }
108     case SUMMON_KIN: {
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);
111         break;
112     }
113     case SUMMON_DAWN: {
114         is_match = r_idx == MON_DAWN;
115         break;
116     }
117     case SUMMON_ANIMAL: {
118         is_match = (r_ptr->flags3 & RF3_ANIMAL) != 0;
119         break;
120     }
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));
125         break;
126     }
127     case SUMMON_SMALL_MOAI: {
128         is_match = r_idx == MON_SMALL_MOAI;
129         break;
130     }
131     case SUMMON_HI_DRAGON_LIVING: {
132         is_match = ((r_ptr->d_char == 'D') && monster_living(r_idx));
133         break;
134     }
135     case SUMMON_LIVING: {
136         is_match = monster_living(r_idx);
137         break;
138     }
139     case SUMMON_PHANTOM: {
140         is_match = (r_idx == MON_PHANTOM_B) || (r_idx == MON_PHANTOM_W);
141         break;
142     }
143     case SUMMON_BLUE_HORROR: {
144         is_match = r_idx == MON_BLUE_HORROR;
145         break;
146     }
147     case SUMMON_TOTEM_MOAI: {
148         is_match = r_idx == MON_TOTEM_MOAI;
149         break;
150     }
151     case SUMMON_ELEMENTAL: {
152         is_match = r_ptr->d_char == 'E';
153         break;
154     }
155     case SUMMON_VORTEX: {
156         is_match = r_ptr->d_char == 'v';
157         break;
158     }
159     case SUMMON_HYBRID: {
160         is_match = r_ptr->d_char == 'H';
161         break;
162     }
163     case SUMMON_BIRD: {
164         is_match = r_ptr->d_char == 'B';
165         break;
166     }
167     case SUMMON_KAMIKAZE: {
168         for (int i = 0; i < 4; i++)
169             if (r_ptr->blow[i].method == RBM_EXPLODE)
170                 is_match = TRUE;
171
172         break;
173     }
174     case SUMMON_KAMIKAZE_LIVING: {
175         for (int i = 0; i < 4; i++)
176             if (r_ptr->blow[i].method == RBM_EXPLODE)
177                 is_match = TRUE;
178
179         is_match &= monster_living(r_idx);
180         break;
181     }
182     case SUMMON_MANES: {
183         is_match = r_idx == MON_MANES;
184         break;
185     }
186     case SUMMON_LOUSE: {
187         is_match = r_idx == MON_LOUSE;
188         break;
189     }
190     case SUMMON_GUARDIANS: {
191         is_match = (r_ptr->flags7 & RF7_GUARDIAN) != 0;
192         break;
193     }
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));
197         break;
198     }
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);
201         break;
202     }
203     case SUMMON_PIRANHAS: {
204         is_match = r_idx == MON_PIRANHA;
205         break;
206     }
207     case SUMMON_ARMAGE_GOOD: {
208         is_match = (r_ptr->d_char == 'A') && ((r_ptr->flags3 & RF3_GOOD) != 0);
209         break;
210     }
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));
213         break;
214     }
215     }
216
217     return is_match;
218 }