OSDN Git Service

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