OSDN Git Service

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