OSDN Git Service

Merge branch 'For2.2.2-Refactoring' into For3.0.0-Monster-Adjustment
[hengbandforosx/hengbandosx.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
28     switch (summon_specific_type) {
29     case SUMMON_ANT: {
30         is_match = (r_ptr->d_char == 'a');
31         break;
32     }
33     case SUMMON_SPIDER: {
34         is_match = (r_ptr->d_char == 'S');
35         break;
36     }
37     case SUMMON_HOUND: {
38         is_match = ((r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z'));
39         break;
40     }
41     case SUMMON_HYDRA: {
42         is_match = (r_ptr->d_char == 'M');
43         break;
44     }
45     case SUMMON_ANGEL: {
46         is_match = (r_ptr->d_char == 'A' && ((r_ptr->flags3 & RF3_EVIL) || (r_ptr->flags3 & RF3_GOOD)));
47         break;
48     }
49     case SUMMON_DEMON: {
50         is_match = (r_ptr->flags3 & RF3_DEMON);
51         break;
52     }
53     case SUMMON_UNDEAD: {
54         is_match = (r_ptr->flags3 & RF3_UNDEAD);
55         break;
56     }
57     case SUMMON_DRAGON: {
58         is_match = (r_ptr->flags3 & RF3_DRAGON);
59         break;
60     }
61     case SUMMON_HI_UNDEAD: {
62         is_match = ((r_ptr->d_char == 'L') || (r_ptr->d_char == 'V') || (r_ptr->d_char == 'W'));
63         break;
64     }
65     case SUMMON_HI_DRAGON: {
66         is_match = (r_ptr->d_char == 'D');
67         break;
68     }
69     case SUMMON_HI_DEMON: {
70         is_match = (((r_ptr->d_char == 'U') || (r_ptr->d_char == 'H') || (r_ptr->d_char == 'B')) && (r_ptr->flags3 & RF3_DEMON)) ? TRUE : FALSE;
71         break;
72     }
73     case SUMMON_AMBERITES: {
74         is_match = (r_ptr->flags3 & (RF3_AMBERITE)) ? TRUE : FALSE;
75         break;
76     }
77     case SUMMON_UNIQUE: {
78         is_match = (r_ptr->flags1 & (RF1_UNIQUE)) ? TRUE : FALSE;
79         break;
80     }
81     case SUMMON_MOLD: {
82         is_match = (r_ptr->d_char == 'm');
83         break;
84     }
85     case SUMMON_BAT: {
86         is_match = (r_ptr->d_char == 'b');
87         break;
88     }
89     case SUMMON_QUYLTHULG: {
90         is_match = (r_ptr->d_char == 'Q');
91         break;
92     }
93     case SUMMON_COIN_MIMIC: {
94         is_match = (r_ptr->d_char == '$');
95         break;
96     }
97     case SUMMON_MIMIC: {
98         is_match = ((r_ptr->d_char == '!') || (r_ptr->d_char == '?') || (r_ptr->d_char == '=') || (r_ptr->d_char == '$') || (r_ptr->d_char == '|'));
99         break;
100     }
101     case SUMMON_GOLEM: {
102         is_match = (r_ptr->d_char == 'g');
103         break;
104     }
105     case SUMMON_CYBER: {
106         is_match = ((r_ptr->d_char == 'U') && (r_ptr->flags4 & RF4_ROCKET));
107         break;
108     }
109     case SUMMON_KIN: {
110         SYMBOL_CODE summon_kin_type;
111         if (summoner_idx) {
112             summon_kin_type = r_info[summoner_idx].d_char;
113         } else {
114             summon_kin_type = get_summon_symbol_from_player(player_ptr);
115         }
116
117         is_match = ((r_ptr->d_char == summon_kin_type) && (r_idx != MON_HAGURE));
118         break;
119     }
120     case SUMMON_DAWN: {
121         is_match = (r_idx == MON_DAWN);
122         break;
123     }
124     case SUMMON_ANIMAL: {
125         is_match = (r_ptr->flags3 & (RF3_ANIMAL));
126         break;
127     }
128     case SUMMON_ANIMAL_RANGER: {
129         is_match = ((r_ptr->flags3 & (RF3_ANIMAL)) && (angband_strchr("abcflqrwBCHIJKMRS", r_ptr->d_char)) && !(r_ptr->flags3 & (RF3_DRAGON))
130             && !(r_ptr->flags3 & (RF3_EVIL)) && !(r_ptr->flags3 & (RF3_UNDEAD)) && !(r_ptr->flags3 & (RF3_DEMON)) && !(r_ptr->flags2 & (RF2_MULTIPLY))
131             && !(r_ptr->flags4 || r_ptr->a_ability_flags1 || r_ptr->a_ability_flags2));
132         break;
133     }
134     case SUMMON_HI_DRAGON_LIVING: {
135         is_match = ((r_ptr->d_char == 'D') && monster_living(r_idx));
136         break;
137     }
138     case SUMMON_LIVING: {
139         is_match = monster_living(r_idx);
140         break;
141     }
142     case SUMMON_PHANTOM: {
143         is_match = (r_idx == MON_PHANTOM_B || r_idx == MON_PHANTOM_W);
144         break;
145     }
146     case SUMMON_BLUE_HORROR: {
147         is_match = (r_idx == MON_BLUE_HORROR);
148         break;
149     }
150     case SUMMON_TOTEM_MOAI: {
151         is_match = r_idx == MON_TOTEM_MOAI;
152         break;
153     }
154     case SUMMON_ELEMENTAL: {
155         is_match = (r_ptr->d_char == 'E');
156         break;
157     }
158     case SUMMON_VORTEX: {
159         is_match = (r_ptr->d_char == 'v');
160         break;
161     }
162     case SUMMON_HYBRID: {
163         is_match = (r_ptr->d_char == 'H');
164         break;
165     }
166     case SUMMON_BIRD: {
167         is_match = (r_ptr->d_char == 'B');
168         break;
169     }
170     case SUMMON_KAMIKAZE: {
171         int i;
172         for (i = 0; i < 4; i++)
173             if (r_ptr->blow[i].method == RBM_EXPLODE)
174                 is_match = TRUE;
175         break;
176     }
177     case SUMMON_KAMIKAZE_LIVING: {
178         int i;
179
180         for (i = 0; i < 4; i++)
181             if (r_ptr->blow[i].method == RBM_EXPLODE)
182                 is_match = TRUE;
183         is_match = (is_match && monster_living(r_idx));
184         break;
185     }
186     case SUMMON_MANES: {
187         is_match = (r_idx == MON_MANES);
188         break;
189     }
190     case SUMMON_LOUSE: {
191         is_match = (r_idx == MON_LOUSE);
192         break;
193     }
194     case SUMMON_GUARDIANS: {
195         is_match = (r_ptr->flags7 & RF7_GUARDIAN);
196         break;
197     }
198     case SUMMON_KNIGHTS: {
199         is_match = ((r_idx == MON_NOV_PALADIN) || (r_idx == MON_NOV_PALADIN_G) || (r_idx == MON_PALADIN) || (r_idx == MON_W_KNIGHT)
200             || (r_idx == MON_ULTRA_PALADIN) || (r_idx == MON_KNI_TEMPLAR));
201         break;
202     }
203     case SUMMON_EAGLES: {
204         is_match = (r_ptr->d_char == 'B' && (r_ptr->flags8 & RF8_WILD_MOUNTAIN) && (r_ptr->flags8 & RF8_WILD_ONLY));
205         break;
206     }
207     case SUMMON_PIRANHAS: {
208         is_match = (r_idx == MON_PIRANHA);
209         break;
210     }
211     case SUMMON_ARMAGE_GOOD: {
212         is_match = (r_ptr->d_char == 'A' && (r_ptr->flags3 & RF3_GOOD));
213         break;
214     }
215     case SUMMON_ARMAGE_EVIL: {
216         is_match = ((r_ptr->flags3 & RF3_DEMON) || (r_ptr->d_char == 'A' && (r_ptr->flags3 & RF3_EVIL)));
217         break;
218     }
219     }
220
221     return is_match;
222 }