OSDN Git Service

Merge pull request #765 from sikabane-works/release/3.0.0Alpha17
[hengbandforosx/hengbandosx.git] / src / mspell / summon-checker.cpp
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/player-race.h"
13 #include "spell/summon-types.h"
14 #include "util/string-processor.h"
15
16 /*!
17  * @brief 指定されたモンスター種族がsummon_specific_typeで指定された召喚条件に合うかどうかを返す
18  * @param player_ptr プレーヤーへの参照ポインタ
19  * @return 召喚条件が一致するならtrue
20  * @details
21  */
22 bool check_summon_specific(player_type *player_ptr, MONRACE_IDX summoner_idx, MONRACE_IDX r_idx)
23 {
24     monster_race *r_ptr = &r_info[r_idx];
25     bool is_match = FALSE;
26     switch (summon_specific_type) {
27     case SUMMON_ANT:
28         is_match = r_ptr->d_char == 'a';
29         break;
30     case SUMMON_SPIDER:
31         is_match = r_ptr->d_char == 'S';
32         break;
33     case SUMMON_HOUND:
34         is_match = (r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z');
35         break;
36     case SUMMON_HYDRA:
37         is_match = r_ptr->d_char == 'M';
38         break;
39     case SUMMON_ANGEL:
40         is_match = (r_ptr->d_char == 'A') && (((r_ptr->flags3 & RF3_EVIL) != 0) || ((r_ptr->flags3 & RF3_GOOD) != 0));
41         break;
42     case SUMMON_DEMON:
43         is_match = (r_ptr->flags3 & RF3_DEMON) != 0;
44         break;
45     case SUMMON_UNDEAD:
46         is_match = (r_ptr->flags3 & RF3_UNDEAD) != 0;
47         break;
48     case SUMMON_DRAGON:
49         is_match = (r_ptr->flags3 & RF3_DRAGON) != 0;
50         break;
51     case SUMMON_HI_UNDEAD:
52         is_match = (r_ptr->d_char == 'L') || (r_ptr->d_char == 'V') || (r_ptr->d_char == 'W');
53         break;
54     case SUMMON_HI_DRAGON:
55         is_match = (r_ptr->d_char == 'D');
56         break;
57     case SUMMON_HI_DEMON:
58         is_match = ((r_ptr->d_char == 'U') || (r_ptr->d_char == 'H') || (r_ptr->d_char == 'B')) && ((r_ptr->flags3 & RF3_DEMON) != 0);
59         break;
60     case SUMMON_AMBERITES:
61         is_match = (r_ptr->flags3 & RF3_AMBERITE) != 0;
62         break;
63     case SUMMON_UNIQUE:
64         is_match = (r_ptr->flags1 & RF1_UNIQUE) != 0;
65         break;
66     case SUMMON_MOLD:
67         is_match = r_ptr->d_char == 'm';
68         break;
69     case SUMMON_BAT:
70         is_match = r_ptr->d_char == 'b';
71         break;
72     case SUMMON_QUYLTHULG:
73         is_match = r_ptr->d_char == 'Q';
74         break;
75     case SUMMON_COIN_MIMIC:
76         is_match = r_ptr->d_char == '$';
77         break;
78     case SUMMON_MIMIC:
79         is_match = ((r_ptr->d_char == '!') || (r_ptr->d_char == '?') || (r_ptr->d_char == '=') || (r_ptr->d_char == '$') || (r_ptr->d_char == '|'));
80         break;
81     case SUMMON_GOLEM:
82         is_match = (r_ptr->d_char == 'g');
83         break;
84     case SUMMON_CYBER:
85         is_match = (r_ptr->d_char == 'U') && r_ptr->ability_flags.has(RF_ABILITY::ROCKET);
86         break;
87     case SUMMON_KIN: {
88         SYMBOL_CODE summon_kin_type = summoner_idx > 0 ? r_info[summoner_idx].d_char : get_summon_symbol_from_player(player_ptr);
89         is_match = (r_ptr->d_char == summon_kin_type) && (r_idx != MON_HAGURE);
90         break;
91     }
92     case SUMMON_DAWN:
93         is_match = r_idx == MON_DAWN;
94         break;
95     case SUMMON_ANIMAL:
96         is_match = (r_ptr->flags3 & RF3_ANIMAL) != 0;
97         break;
98     case SUMMON_ANIMAL_RANGER:
99         is_match = ((r_ptr->flags3 & (RF3_ANIMAL)) && (angband_strchr("abcflqrwBCHIJKMRS", r_ptr->d_char)) && !(r_ptr->flags3 & (RF3_DRAGON))
100             && !(r_ptr->flags3 & (RF3_EVIL)) && !(r_ptr->flags3 & (RF3_UNDEAD)) && !(r_ptr->flags3 & (RF3_DEMON)) && !(r_ptr->flags2 & (RF2_MULTIPLY))
101             && r_ptr->ability_flags.none());
102         break;
103     case SUMMON_SMALL_MOAI:
104         is_match = r_idx == MON_SMALL_MOAI;
105         break;
106     case SUMMON_PYRAMID:
107         is_match = one_in_(16) ? r_ptr->d_char == 'z' : r_idx == MON_SCARAB;
108         break;
109     case SUMMON_PHANTOM:
110         is_match = (r_idx == MON_PHANTOM_B) || (r_idx == MON_PHANTOM_W);
111         break;
112     case SUMMON_BLUE_HORROR:
113         is_match = r_idx == MON_BLUE_HORROR;
114         break;
115     case SUMMON_TOTEM_MOAI:
116         is_match = r_idx == MON_TOTEM_MOAI;
117         break;
118     case SUMMON_LIVING:
119         is_match = monster_living(r_idx);
120         break;
121     case SUMMON_HI_DRAGON_LIVING:
122         is_match = ((r_ptr->d_char == 'D') && monster_living(r_idx));
123         break;
124     case SUMMON_ELEMENTAL:
125         is_match = r_ptr->d_char == 'E';
126         break;
127     case SUMMON_VORTEX:
128         is_match = r_ptr->d_char == 'v';
129         break;
130     case SUMMON_HYBRID:
131         is_match = r_ptr->d_char == 'H';
132         break;
133     case SUMMON_BIRD:
134         is_match = r_ptr->d_char == 'B';
135         break;
136     case SUMMON_KAMIKAZE:
137         for (int i = 0; i < 4; i++)
138             if (r_ptr->blow[i].method == RBM_EXPLODE)
139                 is_match = TRUE;
140
141         break;
142     case SUMMON_KAMIKAZE_LIVING:
143         for (int i = 0; i < 4; i++)
144             if (r_ptr->blow[i].method == RBM_EXPLODE)
145                 is_match = TRUE;
146
147         is_match &= monster_living(r_idx);
148         break;
149     case SUMMON_MANES:
150         is_match = r_idx == MON_MANES;
151         break;
152     case SUMMON_LOUSE:
153         is_match = r_idx == MON_LOUSE;
154         break;
155     case SUMMON_GUARDIANS:
156         is_match = (r_ptr->flags7 & RF7_GUARDIAN) != 0;
157         break;
158     case SUMMON_KNIGHTS:
159         is_match = ((r_idx == MON_NOV_PALADIN) || (r_idx == MON_NOV_PALADIN_G) || (r_idx == MON_PALADIN) || (r_idx == MON_W_KNIGHT)
160             || (r_idx == MON_ULTRA_PALADIN) || (r_idx == MON_KNI_TEMPLAR));
161         break;
162     case SUMMON_EAGLES:
163         is_match = (r_ptr->d_char == 'B') && ((r_ptr->flags8 & RF8_WILD_MOUNTAIN) != 0) && ((r_ptr->flags8 & RF8_WILD_ONLY) != 0);
164         break;
165     case SUMMON_PIRANHAS:
166         is_match = r_idx == MON_PIRANHA;
167         break;
168     case SUMMON_ARMAGE_GOOD:
169         is_match = (r_ptr->d_char == 'A') && ((r_ptr->flags3 & RF3_GOOD) != 0);
170         break;
171     case SUMMON_ARMAGE_EVIL:
172         is_match = ((r_ptr->flags3 & RF3_DEMON) != 0) || ((r_ptr->d_char == 'A') && ((r_ptr->flags3 & RF3_EVIL) != 0));
173         break;
174     case SUMMON_APOCRYPHA_FOLLOWERS:
175         is_match = (r_idx == MON_FOLLOWER_WARRIOR) || (r_idx == MON_FOLLOWER_MAGE);
176         break;
177     case SUMMON_APOCRYPHA_DRAGONS:
178         is_match = (r_ptr->d_char == 'D') && (r_ptr->level >= 60) && (r_idx != MON_WYRM_COLOURS) && (r_idx != MON_ALDUIN);
179         break;
180     case SUMMON_VESPOID:
181         is_match = r_idx == MON_VESPOID;
182     default:
183         break;
184     }
185
186     return is_match;
187 }