OSDN Git Service

Reworded English message for a monk's successful MA_SLOW attack.
[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     case SUMMON_SPIDER:
32         is_match = r_ptr->d_char == 'S';
33         break;
34     case SUMMON_HOUND:
35         is_match = (r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z');
36         break;
37     case SUMMON_HYDRA:
38         is_match = r_ptr->d_char == 'M';
39         break;
40     case SUMMON_ANGEL:
41         is_match = (r_ptr->d_char == 'A') && (((r_ptr->flags3 & RF3_EVIL) != 0) || ((r_ptr->flags3 & RF3_GOOD) != 0));
42         break;
43     case SUMMON_DEMON:
44         is_match = (r_ptr->flags3 & RF3_DEMON) != 0;
45         break;
46     case SUMMON_UNDEAD:
47         is_match = (r_ptr->flags3 & RF3_UNDEAD) != 0;
48         break;
49     case SUMMON_DRAGON:
50         is_match = (r_ptr->flags3 & RF3_DRAGON) != 0;
51         break;
52     case SUMMON_HI_UNDEAD:
53         is_match = (r_ptr->d_char == 'L') || (r_ptr->d_char == 'V') || (r_ptr->d_char == 'W');
54         break;
55     case SUMMON_HI_DRAGON:
56         is_match = (r_ptr->d_char == 'D');
57         break;
58     case SUMMON_HI_DEMON:
59         is_match = ((r_ptr->d_char == 'U') || (r_ptr->d_char == 'H') || (r_ptr->d_char == 'B')) && ((r_ptr->flags3 & RF3_DEMON) != 0);
60         break;
61     case SUMMON_AMBERITES:
62         is_match = (r_ptr->flags3 & RF3_AMBERITE) != 0;
63         break;
64     case SUMMON_UNIQUE:
65         is_match = (r_ptr->flags1 & RF1_UNIQUE) != 0;
66         break;
67     case SUMMON_MOLD:
68         is_match = r_ptr->d_char == 'm';
69         break;
70     case SUMMON_BAT:
71         is_match = r_ptr->d_char == 'b';
72         break;
73     case SUMMON_QUYLTHULG:
74         is_match = r_ptr->d_char == 'Q';
75         break;
76     case SUMMON_COIN_MIMIC:
77         is_match = r_ptr->d_char == '$';
78         break;
79     case SUMMON_MIMIC:
80         is_match = ((r_ptr->d_char == '!') || (r_ptr->d_char == '?') || (r_ptr->d_char == '=') || (r_ptr->d_char == '$') || (r_ptr->d_char == '|'));
81         break;
82     case SUMMON_GOLEM:
83         is_match = (r_ptr->d_char == 'g');
84         break;
85     case SUMMON_CYBER:
86         is_match = (r_ptr->d_char == 'U') && ((r_ptr->flags4 & RF4_ROCKET) != 0);
87         break;
88     case SUMMON_KIN: {
89         SYMBOL_CODE summon_kin_type = summoner_idx > 0 ? r_info[summoner_idx].d_char : get_summon_symbol_from_player(player_ptr);
90         is_match = (r_ptr->d_char == summon_kin_type) && (r_idx != MON_HAGURE);
91         break;
92     }
93     case SUMMON_DAWN:
94         is_match = r_idx == MON_DAWN;
95         break;
96     case SUMMON_ANIMAL:
97         is_match = (r_ptr->flags3 & RF3_ANIMAL) != 0;
98         break;
99     case SUMMON_ANIMAL_RANGER:
100         is_match = ((r_ptr->flags3 & (RF3_ANIMAL)) && (angband_strchr("abcflqrwBCHIJKMRS", r_ptr->d_char)) && !(r_ptr->flags3 & (RF3_DRAGON))
101             && !(r_ptr->flags3 & (RF3_EVIL)) && !(r_ptr->flags3 & (RF3_UNDEAD)) && !(r_ptr->flags3 & (RF3_DEMON)) && !(r_ptr->flags2 & (RF2_MULTIPLY))
102             && !(r_ptr->flags4 || r_ptr->a_ability_flags1 || r_ptr->a_ability_flags2));
103         break;
104     case SUMMON_SMALL_MOAI:
105         is_match = r_idx == MON_SMALL_MOAI;
106         break;
107     case SUMMON_PYRAMID:
108         is_match = one_in_(16) ? r_ptr->d_char == 'z' : r_idx == MON_SCARAB;
109         break;
110     case SUMMON_PHANTOM:
111         is_match = (r_idx == MON_PHANTOM_B) || (r_idx == MON_PHANTOM_W);
112         break;
113     case SUMMON_BLUE_HORROR:
114         is_match = r_idx == MON_BLUE_HORROR;
115         break;
116     case SUMMON_TOTEM_MOAI:
117         is_match = r_idx == MON_TOTEM_MOAI;
118         break;
119     case SUMMON_LIVING:
120         is_match = monster_living(r_idx);
121         break;
122     case SUMMON_HI_DRAGON_LIVING:
123         is_match = ((r_ptr->d_char == 'D') && monster_living(r_idx));
124         break;
125     case SUMMON_ELEMENTAL:
126         is_match = r_ptr->d_char == 'E';
127         break;
128     case SUMMON_VORTEX:
129         is_match = r_ptr->d_char == 'v';
130         break;
131     case SUMMON_HYBRID:
132         is_match = r_ptr->d_char == 'H';
133         break;
134     case SUMMON_BIRD:
135         is_match = r_ptr->d_char == 'B';
136         break;
137     case SUMMON_KAMIKAZE:
138         for (int i = 0; i < 4; i++)
139             if (r_ptr->blow[i].method == RBM_EXPLODE)
140                 is_match = TRUE;
141
142         break;
143     case SUMMON_KAMIKAZE_LIVING:
144         for (int i = 0; i < 4; i++)
145             if (r_ptr->blow[i].method == RBM_EXPLODE)
146                 is_match = TRUE;
147
148         is_match &= monster_living(r_idx);
149         break;
150     case SUMMON_MANES:
151         is_match = r_idx == MON_MANES;
152         break;
153     case SUMMON_LOUSE:
154         is_match = r_idx == MON_LOUSE;
155         break;
156     case SUMMON_GUARDIANS:
157         is_match = (r_ptr->flags7 & RF7_GUARDIAN) != 0;
158         break;
159     case SUMMON_KNIGHTS:
160         is_match = ((r_idx == MON_NOV_PALADIN) || (r_idx == MON_NOV_PALADIN_G) || (r_idx == MON_PALADIN) || (r_idx == MON_W_KNIGHT)
161             || (r_idx == MON_ULTRA_PALADIN) || (r_idx == MON_KNI_TEMPLAR));
162         break;
163     case SUMMON_EAGLES:
164         is_match = (r_ptr->d_char == 'B') && ((r_ptr->flags8 & RF8_WILD_MOUNTAIN) != 0) && ((r_ptr->flags8 & RF8_WILD_ONLY) != 0);
165         break;
166     case SUMMON_PIRANHAS:
167         is_match = r_idx == MON_PIRANHA;
168         break;
169     case SUMMON_ARMAGE_GOOD:
170         is_match = (r_ptr->d_char == 'A') && ((r_ptr->flags3 & RF3_GOOD) != 0);
171         break;
172     case SUMMON_ARMAGE_EVIL:
173         is_match = ((r_ptr->flags3 & RF3_DEMON) != 0) || ((r_ptr->d_char == 'A') && ((r_ptr->flags3 & RF3_EVIL) != 0));
174         break;
175     case SUMMON_APOCRYPHA_FOLLOWERS:
176         is_match = (r_idx == MON_FOLLOWER_WARRIOR) || (r_idx == MON_FOLLOWER_MAGE);
177         break;
178     case SUMMON_APOCRYPHA_DRAGONS:
179         is_match = (r_ptr->d_char == 'D') && (r_ptr->level >= 60) && (r_idx != MON_WYRM_COLOURS) && (r_idx != MON_ALDUIN);
180         break;
181     case SUMMON_VESPOID:
182         is_match = r_idx == MON_VESPOID;
183     default:
184         break;
185     }
186
187     return is_match;
188 }