OSDN Git Service

[Refactor] 関数引数のTARGET_TYPEが命名規則に違反しているので全てtarget_typeに変更した (機械的置換)
[hengbandforosx/hengbandosx.git] / src / mspell / specified-summon.cpp
1 #include "mspell/specified-summon.h"
2 #include "effect/effect-characteristics.h"
3 #include "effect/effect-processor.h"
4 #include "floor/cave.h"
5 #include "floor/floor-util.h"
6 #include "monster-floor/monster-summon.h"
7 #include "monster-floor/place-monster-types.h"
8 #include "monster-race/monster-race.h"
9 #include "monster-race/race-indice-types.h"
10 #include "monster/monster-info.h"
11 #include "mspell/mspell-checker.h"
12 #include "mspell/mspell-util.h"
13 #include "spell-kind/spells-launcher.h"
14 #include "spell/summon-types.h"
15 #include "system/monster-race-definition.h"
16 #include "system/player-type-definition.h"
17 #include "view/display-messages.h"
18
19 /*!
20  * @brief 鷹召喚の処理。 /
21  * @param player_ptr プレイヤーへの参照ポインタ
22  * @param y 対象の地点のy座標
23  * @param x 対象の地点のx座標
24  * @param rlev 呪文を唱えるモンスターのレベル
25  * @param m_idx 呪文を唱えるモンスターID
26  * @return 召喚したモンスターの数を返す。
27  */
28 MONSTER_NUMBER summon_EAGLE(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
29 {
30     int count = 0;
31     int num = 4 + randint1(3);
32     for (int k = 0; k < num; k++) {
33         count += summon_specific(player_ptr, m_idx, y, x, rlev, SUMMON_EAGLES, PM_ALLOW_GROUP | PM_ALLOW_UNIQUE);
34     }
35
36     return count;
37 }
38
39 /*!
40  * @brief エッヂ召喚の処理。 /
41  * @param player_ptr プレイヤーへの参照ポインタ
42  * @param y 対象の地点のy座標
43  * @param x 対象の地点のx座標
44  * @param rlev 呪文を唱えるモンスターのレベル
45  * @param m_idx 呪文を唱えるモンスターID
46  * @return 召喚したモンスターの数を返す。
47  */
48 MONSTER_NUMBER summon_EDGE(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
49 {
50     int count = 0;
51     int num = 2 + randint1(1 + rlev / 20);
52     for (int k = 0; k < num; k++)
53         count += summon_named_creature(player_ptr, m_idx, y, x, MON_EDGE, PM_NONE);
54
55     return count;
56 }
57
58 /*!
59  * @brief ダンジョンの主召喚の処理。 /
60  * @param player_ptr プレイヤーへの参照ポインタ
61  * @param y 対象の地点のy座標
62  * @param x 対象の地点のx座標
63  * @param rlev 呪文を唱えるモンスターのレベル
64  * @param m_idx 呪文を唱えるモンスターID
65  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
66  * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
67  * @return 召喚したモンスターの数を返す。
68  */
69 MONSTER_NUMBER summon_guardian(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int target_type)
70 {
71     int num = 2 + randint1(3);
72     bool mon_to_mon = (target_type == MONSTER_TO_MONSTER);
73     bool mon_to_player = (target_type == MONSTER_TO_PLAYER);
74
75     if (r_info[MON_JORMUNGAND].cur_num < r_info[MON_JORMUNGAND].max_num && one_in_(6)) {
76         mspell_cast_msg_simple msg(_("地面から水が吹き出した!", "Water blew off from the ground!"),
77             _("地面から水が吹き出した!", "Water blew off from the ground!"));
78
79         simple_monspell_message(player_ptr, m_idx, t_idx, msg, target_type);
80
81         if (mon_to_player)
82             fire_ball_hide(player_ptr, AttributeType::WATER_FLOW, 0, 3, 8);
83         else if (mon_to_mon)
84             project(player_ptr, t_idx, 8, y, x, 3, AttributeType::WATER_FLOW, PROJECT_GRID | PROJECT_HIDE);
85     }
86
87     int count = 0;
88     for (int k = 0; k < num; k++) {
89         count += summon_specific(player_ptr, m_idx, y, x, rlev, SUMMON_GUARDIANS, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
90     }
91
92     return count;
93 }
94
95 /*!
96  * @brief ロックのクローン召喚の処理。 /
97  * @param player_ptr プレイヤーへの参照ポインタ
98  * @param y 対象の地点のy座標
99  * @param x 対象の地点のx座標
100  * @param m_idx 呪文を唱えるモンスターID
101  * @return 召喚したモンスターの数を返す。
102  */
103 MONSTER_NUMBER summon_LOCKE_CLONE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
104 {
105     int count = 0;
106     int num = randint1(3);
107     for (int k = 0; k < num; k++) {
108         count += summon_named_creature(player_ptr, m_idx, y, x, MON_LOCKE_CLONE, PM_NONE);
109     }
110
111     return count;
112 }
113
114 /*!
115  * @brief シラミ召喚の処理。 /
116  * @param player_ptr プレイヤーへの参照ポインタ
117  * @param y 対象の地点のy座標
118  * @param x 対象の地点のx座標
119  * @param rlev 呪文を唱えるモンスターのレベル
120  * @param m_idx 呪文を唱えるモンスターID
121  * @return 召喚したモンスターの数を返す。
122  */
123 MONSTER_NUMBER summon_LOUSE(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
124 {
125     int count = 0;
126     int num = 2 + randint1(3);
127     for (int k = 0; k < num; k++)
128         count += summon_specific(player_ptr, m_idx, y, x, rlev, SUMMON_LOUSE, PM_ALLOW_GROUP);
129
130     return count;
131 }
132
133 MONSTER_NUMBER summon_MOAI(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
134 {
135     int count = 0;
136     int num = 3 + randint1(3);
137     for (int k = 0; k < num; k++)
138         count += summon_specific(player_ptr, m_idx, y, x, rlev, SUMMON_SMALL_MOAI, PM_NONE);
139
140     return count;
141 }
142
143 MONSTER_NUMBER summon_DEMON_SLAYER(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
144 {
145     auto *r_ptr = &r_info[MON_DEMON_SLAYER_MEMBER];
146     if (r_ptr->max_num == 0) {
147         msg_print(_("しかし、隊士は全滅していた…。", "However, all demon slayer members were murdered..."));
148         return 0;
149     }
150
151     auto count = 0;
152     for (auto k = 0; k < MAX_NAZGUL_NUM; k++)
153         count += summon_named_creature(player_ptr, m_idx, y, x, MON_DEMON_SLAYER_MEMBER, PM_NONE);
154
155     if (count == 0)
156         msg_print(_("しかし、隊士は誰も来てくれなかった。", "However, no demon slayer member answered the call..."));
157
158     return count;
159 }
160
161 /*!
162  * @brief ナズグル戦隊召喚の処理。 /
163  * @param player_ptr プレイヤーへの参照ポインタ
164  * @param y 対象の地点のy座標
165  * @param x 対象の地点のx座標
166  * @param m_idx 呪文を唱えるモンスターID
167  * @return 召喚したモンスターの数を返す。
168  */
169 MONSTER_NUMBER summon_NAZGUL(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
170 {
171     BIT_FLAGS mode = 0L;
172     POSITION cy = y;
173     POSITION cx = x;
174     GAME_TEXT m_name[MAX_NLEN];
175     monster_name(player_ptr, m_idx, m_name);
176
177     if (player_ptr->blind)
178         msg_format(_("%^sが何かをつぶやいた。", "%^s mumbles."), m_name);
179     else
180         msg_format(_("%^sが魔法で幽鬼戦隊を召喚した!", "%^s magically summons rangers of Nazgul!"), m_name);
181
182     msg_print(nullptr);
183
184     int count = 0;
185     for (int k = 0; k < 30; k++) {
186         if (!summon_possible(player_ptr, cy, cx) || !is_cave_empty_bold(player_ptr, cy, cx)) {
187             int j;
188             for (j = 100; j > 0; j--) {
189                 scatter(player_ptr, &cy, &cx, y, x, 2, PROJECT_NONE);
190                 if (is_cave_empty_bold(player_ptr, cy, cx))
191                     break;
192             }
193
194             if (!j)
195                 break;
196         }
197
198         if (!is_cave_empty_bold(player_ptr, cy, cx))
199             continue;
200
201         if (!summon_named_creature(player_ptr, m_idx, cy, cx, MON_NAZGUL, mode))
202             continue;
203
204         y = cy;
205         x = cx;
206         count++;
207         if (count == 1)
208             msg_format(_("「幽鬼戦隊%d号、ナズグル・ブラック!」", "A Nazgul says 'Nazgul-Rangers Number %d, Nazgul-Black!'"), count);
209         else
210             msg_format(_("「同じく%d号、ナズグル・ブラック!」", "Another one says 'Number %d, Nazgul-Black!'"), count);
211
212         msg_print(nullptr);
213     }
214
215     msg_format(_("「%d人そろって、リングレンジャー!」", "They say 'The %d meets! We are the Ring-Ranger!'."), count);
216     msg_print(nullptr);
217     return count;
218 }
219
220 MONSTER_NUMBER summon_APOCRYPHA(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
221 {
222     int count = 0;
223     int num = 4 + randint1(4);
224     summon_type followers = one_in_(2) ? SUMMON_APOCRYPHA_FOLLOWERS : SUMMON_APOCRYPHA_DRAGONS;
225     for (int k = 0; k < num; k++)
226         count += summon_specific(player_ptr, m_idx, y, x, 200, followers, PM_ALLOW_UNIQUE);
227
228     return count;
229 }
230
231 MONSTER_NUMBER summon_HIGHEST_DRAGON(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
232 {
233     int count = 0;
234     int num = 4 + randint1(4);
235     for (int k = 0; k < num; k++)
236         count += summon_specific(player_ptr, m_idx, y, x, 100, SUMMON_APOCRYPHA_DRAGONS, PM_ALLOW_UNIQUE);
237
238     return count;
239 }
240
241 MONSTER_NUMBER summon_PYRAMID(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
242 {
243     int count = 0;
244     int num = 2 + randint1(3);
245     for (int k = 0; k < num; k++)
246         count += summon_specific(player_ptr, m_idx, y, x, rlev, SUMMON_PYRAMID, PM_NONE);
247
248     return count;
249 }
250
251 MONSTER_NUMBER summon_EYE_PHORN(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
252 {
253     int count = 0;
254     int num = 2 + randint1(1 + rlev / 20);
255     for (int k = 0; k < num; k++)
256         count += summon_named_creature(player_ptr, m_idx, y, x, MON_EYE_PHORN, PM_NONE);
257
258     return count;
259 }
260
261 MONSTER_NUMBER summon_VESPOID(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
262 {
263     int count = 0;
264     int num = 2 + randint1(3);
265     for (int k = 0; k < num; k++)
266         count += summon_specific(player_ptr, m_idx, y, x, rlev, SUMMON_VESPOID, PM_NONE);
267
268     return count;
269 }
270
271 MONSTER_NUMBER summon_THUNDERS(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
272 {
273     auto count = (MONSTER_NUMBER)0;
274     auto num = 11;
275     for (auto k = 0; k < num; k++) {
276         count += summon_specific(player_ptr, m_idx, y, x, rlev, SUMMON_ANTI_TIGERS, PM_NONE);
277     }
278
279     return count;
280 }
281
282 /*!
283  * @brief イェンダーの魔法使いの召喚の処理。 /
284  * @param player_ptr プレイヤーへの参照ポインタ
285  * @param y 対象の地点のy座標
286  * @param x 対象の地点のx座標
287  * @param m_idx 呪文を唱えるモンスターID
288  * @return 召喚したモンスターの数を返す。
289  */
290 MONSTER_NUMBER summon_YENDER_WIZARD(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
291 {
292     auto *r_ptr = &r_info[MON_YENDOR_WIZARD_2];
293     if (r_ptr->max_num == 0) {
294         msg_print(_("しかし、誰も来なかった…。", "However, no kin was appeared..."));
295         return 0;
296     }
297
298     auto count = (MONSTER_NUMBER)summon_named_creature(player_ptr, m_idx, y, x, MON_YENDOR_WIZARD_2, PM_NONE);
299     if (count == 0) {
300         msg_print(_("どこからか声が聞こえる…「三重苦は負わぬ。。。」", "Heard a voice from somewhere... 'I will deny the triple suffering...'"));
301         return 0;
302     }
303
304     msg_print(_("二重苦だ。。。", "THIS is double suffering..."));
305     return count;
306 }
307
308 MONSTER_NUMBER summon_PLASMA(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
309 {
310     auto count = 0;
311     auto num = 2 + randint1(1 + rlev / 20);
312     for (auto k = 0; k < num; k++) {
313         count += summon_named_creature(player_ptr, m_idx, y, x, MON_PLASMA_VORTEX, PM_NONE);
314     }
315
316     msg_print(_("プーラーズーマーッ!!", "P--la--s--ma--!!"));
317     return count;
318 }