1 #include "mspell/mspell-summon.h"
2 #include "core/disturbance.h"
3 #include "effect/effect-characteristics.h"
4 #include "effect/effect-processor.h"
5 #include "floor/cave.h"
6 #include "game-option/birth-options.h"
7 #include "monster-floor/monster-summon.h"
8 #include "monster-floor/place-monster-types.h"
9 #include "monster-race/monster-race.h"
10 #include "monster-race/race-flags1.h"
11 #include "monster-race/race-indice-types.h"
12 #include "monster/monster-describer.h"
13 #include "monster/monster-description-types.h"
14 #include "monster/monster-info.h"
15 #include "monster/monster-status.h"
16 #include "mspell/mspell-util.h"
17 #include "mspell/specified-summon.h"
18 #include "spell-kind/spells-launcher.h"
19 #include "spell/spell-types.h"
20 #include "spell/spells-summon.h"
21 #include "spell/summon-types.h"
22 #include "system/floor-type-definition.h"
23 #include "view/display-messages.h"
25 /* summoning number */
26 #define S_NUM_6 (easy_band ? 2 : 6)
27 #define S_NUM_4 (easy_band ? 1 : 4)
30 * @brief 特定条件のモンスター召喚のみPM_ALLOW_UNIQUEを許可する /
31 * @param floor_ptr 現在フロアへの参照ポインタ
32 * @param m_idx モンスターID
33 * @return 召喚可能であればPM_ALLOW_UNIQUEを返す。
35 static BIT_FLAGS monster_u_mode(floor_type *floor_ptr, MONSTER_IDX m_idx)
37 BIT_FLAGS u_mode = 0L;
38 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
39 bool pet = is_pet(m_ptr);
41 u_mode |= PM_ALLOW_UNIQUE;
46 * @brief 救援召喚の通常処理。同シンボルのモンスターを召喚する。 /
47 * @param target_ptr プレーヤーへの参照ポインタ
50 * @param rlev 呪文を唱えるモンスターのレベル
51 * @param m_idx 呪文を唱えるモンスターID
52 * @return 召喚したモンスターの数を返す。
54 MONSTER_NUMBER summon_Kin(player_type *target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
57 for (int k = 0; k < 4; k++) {
58 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_KIN, PM_ALLOW_GROUP);
65 * @brief RF6_S_KINの処理。救援召喚。使用するモンスターの種類により、実処理に分岐させる。 /
66 * @param target_ptr プレーヤーへの参照ポインタ
69 * @param m_idx 呪文を唱えるモンスターID
70 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
71 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
72 * @return 召喚したモンスターの数を返す。
74 void spell_RF6_S_KIN(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
76 floor_type *floor_ptr = target_ptr->current_floor_ptr;
77 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
78 monster_race *r_ptr = &r_info[m_ptr->r_idx];
79 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
81 GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN], m_poss[80];
82 monster_name(target_ptr, m_idx, m_name);
83 monster_name(target_ptr, t_idx, t_name);
84 monster_desc(target_ptr, m_poss, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE);
86 disturb(target_ptr, TRUE, TRUE);
87 bool known = monster_near_player(floor_ptr, m_idx, t_idx);
88 bool see_either = see_monster(target_ptr, m_idx) || see_monster(target_ptr, t_idx);
89 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
90 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
91 if (m_ptr->r_idx == MON_SERPENT || m_ptr->r_idx == MON_ZOMBI_SERPENT) {
92 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
93 _("%^sがダンジョンの主を召喚した。", "%^s magically summons guardians of dungeons."),
94 _("%^sがダンジョンの主を召喚した。", "%^s magically summons guardians of dungeons."), TARGET_TYPE);
96 if (mon_to_player || (mon_to_mon && known && see_either))
97 disturb(target_ptr, TRUE, TRUE);
99 if (target_ptr->blind) {
101 msg_format(_("%^sが何かをつぶやいた。", "%^s mumbles."), m_name);
103 if (mon_to_player || (mon_to_mon && known && see_either)) {
104 _(msg_format("%sが魔法で%sを召喚した。", m_name, ((r_ptr->flags1 & RF1_UNIQUE) ? "手下" : "仲間")),
105 msg_format("%^s magically summons %s %s.", m_name, m_poss, ((r_ptr->flags1 & RF1_UNIQUE) ? "minions" : "kin")));
109 if (mon_to_mon && known && !see_either)
110 floor_ptr->monster_noise = TRUE;
113 switch (m_ptr->r_idx) {
117 count += summon_EAGLE(target_ptr, y, x, rlev, m_idx);
120 count += summon_IE(target_ptr, y, x, rlev, m_idx);
123 case MON_ZOMBI_SERPENT:
124 count += summon_guardian(target_ptr, y, x, rlev, m_idx, t_idx, TARGET_TYPE);
127 count += summon_LOCKE_CLONE(target_ptr, y, x, m_idx);
130 count += summon_LOUSE(target_ptr, y, x, rlev, m_idx);
133 count += summon_MOAI(target_ptr, y, x, m_idx);
135 case MON_DEMON_SLAYER_SENIOR:
136 count += summon_DEMON_SLAYER(target_ptr, y, x, m_idx);
139 count += summon_Kin(target_ptr, y, x, rlev, m_idx);
143 if (target_ptr->blind && count && mon_to_player)
144 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
146 if (known && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
147 floor_ptr->monster_noise = TRUE;
151 * @brief RF6_S_CYBERの処理。サイバー・デーモン召喚。 /
152 * @param target_ptr プレーヤーへの参照ポインタ
155 * @param m_idx 呪文を唱えるモンスターID
156 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
157 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
158 * @return 召喚したモンスターの数を返す。
160 void spell_RF6_S_CYBER(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
163 floor_type *floor_ptr = target_ptr->current_floor_ptr;
164 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
165 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
166 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
167 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
169 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
170 _("%^sがサイバーデーモンを召喚した!", "%^s magically summons Cyberdemons!"),
171 _("%^sがサイバーデーモンを召喚した!", "%^s magically summons Cyberdemons!"), TARGET_TYPE);
173 if (is_friendly(m_ptr) && mon_to_mon) {
174 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_CYBER, (PM_ALLOW_GROUP));
176 count += summon_cyber(target_ptr, m_idx, y, x);
179 if (target_ptr->blind && count && mon_to_player)
180 msg_print(_("重厚な足音が近くで聞こえる。", "You hear heavy steps nearby."));
182 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
183 floor_ptr->monster_noise = TRUE;
187 * @brief RF6_S_MONSTERの処理。モンスター一体召喚。 /
188 * @param target_ptr プレーヤーへの参照ポインタ
191 * @param m_idx 呪文を唱えるモンスターID
192 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
193 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
194 * @return 召喚したモンスターの数を返す。
196 void spell_RF6_S_MONSTER(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
198 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが魔法で仲間を召喚した!", "%^s magically summons help!"),
199 _("%^sが魔法で仲間を召喚した!", "%^s magically summons help!"), TARGET_TYPE);
201 floor_type *floor_ptr = target_ptr->current_floor_ptr;
203 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
204 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
205 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
206 for (int k = 0; k < 1; k++) {
208 count += summon_specific(target_ptr, m_idx, y, x, rlev, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
211 count += summon_specific(target_ptr, m_idx, y, x, rlev, 0, (monster_u_mode(floor_ptr, m_idx)));
214 if (target_ptr->blind && count && mon_to_player)
215 msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
217 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
218 floor_ptr->monster_noise = TRUE;
222 * @brief RF6_S_MONSTERSの処理。モンスター複数召喚。 /
223 * @param target_ptr プレーヤーへの参照ポインタ
226 * @param m_idx 呪文を唱えるモンスターID
227 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
228 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
229 * @return 召喚したモンスターの数を返す。
231 void spell_RF6_S_MONSTERS(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
233 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
234 _("%^sが魔法でモンスターを召喚した!", "%^s magically summons monsters!"), _("%^sが魔法でモンスターを召喚した!", "%^s magically summons monsters!"),
237 floor_type *floor_ptr = target_ptr->current_floor_ptr;
239 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
240 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
241 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
242 for (int k = 0; k < S_NUM_6; k++) {
244 count += summon_specific(target_ptr, m_idx, y, x, rlev, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
247 count += summon_specific(target_ptr, m_idx, y, x, rlev, 0, (PM_ALLOW_GROUP | monster_u_mode(floor_ptr, m_idx)));
250 if (target_ptr->blind && count && mon_to_player)
251 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
253 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
254 floor_ptr->monster_noise = TRUE;
258 * @brief RF6_S_ANTの処理。アリ召喚。 /
259 * @param target_ptr プレーヤーへの参照ポインタ
262 * @param m_idx 呪文を唱えるモンスターID
263 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
264 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
265 * @return 召喚したモンスターの数を返す。
267 void spell_RF6_S_ANT(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
269 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが魔法でアリを召喚した。", "%^s magically summons ants."),
270 _("%^sが魔法でアリを召喚した。", "%^s magically summons ants."), TARGET_TYPE);
273 floor_type *floor_ptr = target_ptr->current_floor_ptr;
274 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
275 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
276 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
277 for (int k = 0; k < S_NUM_6; k++) {
278 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_ANT, PM_ALLOW_GROUP);
281 if (target_ptr->blind && count && mon_to_player)
282 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
284 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
285 floor_ptr->monster_noise = TRUE;
289 * @brief RF6_S_SPIDERの処理。クモ召喚。 /
290 * @param target_ptr プレーヤーへの参照ポインタ
293 * @param m_idx 呪文を唱えるモンスターID
294 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
295 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
296 * @return 召喚したモンスターの数を返す。
298 void spell_RF6_S_SPIDER(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
300 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが魔法でクモを召喚した。", "%^s magically summons spiders."),
301 _("%^sが魔法でクモを召喚した。", "%^s magically summons spiders."), TARGET_TYPE);
304 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
305 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
306 floor_type *floor_ptr = target_ptr->current_floor_ptr;
307 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
308 for (int k = 0; k < S_NUM_6; k++) {
309 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_SPIDER, PM_ALLOW_GROUP);
312 if (target_ptr->blind && count && mon_to_player)
313 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
315 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
316 floor_ptr->monster_noise = TRUE;
320 * @brief RF6_S_HOUNDの処理。ハウンド召喚。 /
321 * @param target_ptr プレーヤーへの参照ポインタ
324 * @param m_idx 呪文を唱えるモンスターID
325 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
326 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
327 * @return 召喚したモンスターの数を返す。
329 void spell_RF6_S_HOUND(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
331 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
332 _("%^sが魔法でハウンドを召喚した。", "%^s magically summons hounds."), _("%^sが魔法でハウンドを召喚した。", "%^s magically summons hounds."),
336 floor_type *floor_ptr = target_ptr->current_floor_ptr;
337 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
338 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
339 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
340 for (int k = 0; k < S_NUM_4; k++) {
341 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_HOUND, PM_ALLOW_GROUP);
344 if (target_ptr->blind && count && mon_to_player)
345 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
347 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
348 floor_ptr->monster_noise = TRUE;
352 * @brief RF6_S_HYDRAの処理。ヒドラ召喚。 /
353 * @param target_ptr プレーヤーへの参照ポインタ
356 * @param m_idx 呪文を唱えるモンスターID
357 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
358 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
359 * @return 召喚したモンスターの数を返す。
361 void spell_RF6_S_HYDRA(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
363 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
364 _("%^sが魔法でヒドラを召喚した。", "%^s magically summons hydras."), _("%^sが魔法でヒドラを召喚した。", "%^s magically summons hydras."), TARGET_TYPE);
367 floor_type *floor_ptr = target_ptr->current_floor_ptr;
368 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
369 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
370 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
371 for (int k = 0; k < S_NUM_4; k++) {
372 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_HYDRA, PM_ALLOW_GROUP);
375 if (target_ptr->blind && count && mon_to_player)
376 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
378 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
379 floor_ptr->monster_noise = TRUE;
383 * @brief RF6_S_ANGELの処理。天使一体召喚。 /
384 * @param target_ptr プレーヤーへの参照ポインタ
387 * @param m_idx 呪文を唱えるモンスターID
388 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
389 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
390 * @return 召喚したモンスターの数を返す。
392 void spell_RF6_S_ANGEL(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
394 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
395 _("%^sが魔法で天使を召喚した!", "%^s magically summons an angel!"), _("%^sが魔法で天使を召喚した!", "%^s magically summons an angel!"), TARGET_TYPE);
397 floor_type *floor_ptr = target_ptr->current_floor_ptr;
398 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
399 monster_race *r_ptr = &r_info[m_ptr->r_idx];
401 if ((r_ptr->flags1 & RF1_UNIQUE) && !easy_band) {
402 num += r_ptr->level / 40;
405 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
407 for (int k = 0; k < num; k++) {
408 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_ANGEL, PM_ALLOW_GROUP);
412 if (target_ptr->blind && count)
413 msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
415 if (target_ptr->blind)
416 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
419 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
420 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
421 floor_ptr->monster_noise = TRUE;
425 * @brief RF6_S_DEMONの処理。デーモン一体召喚。 /
426 * @param target_ptr プレーヤーへの参照ポインタ
429 * @param m_idx 呪文を唱えるモンスターID
430 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
431 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
432 * @return 召喚したモンスターの数を返す。
434 void spell_RF6_S_DEMON(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
436 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
437 _("%^sは魔法で混沌の宮廷から悪魔を召喚した!", "%^s magically summons a demon from the Courts of Chaos!"),
438 _("%^sは魔法で混沌の宮廷から悪魔を召喚した!", "%^s magically summons a demon from the Courts of Chaos!"), TARGET_TYPE);
440 floor_type *floor_ptr = target_ptr->current_floor_ptr;
441 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
443 for (int k = 0; k < 1; k++) {
444 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_DEMON, PM_ALLOW_GROUP);
447 if (target_ptr->blind && count)
448 msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
450 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
451 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
452 floor_ptr->monster_noise = TRUE;
456 * @brief RF6_S_UNDEADの処理。アンデッド一体召喚。 /
457 * @param target_ptr プレーヤーへの参照ポインタ
460 * @param m_idx 呪文を唱えるモンスターID
461 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
462 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
463 * @return 召喚したモンスターの数を返す。
465 void spell_RF6_S_UNDEAD(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
467 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
468 _("%^sが魔法でアンデッドの強敵を召喚した!", "%^s magically summons an undead adversary!"),
469 _("%sが魔法でアンデッドを召喚した。", "%^s magically summons undead."), TARGET_TYPE);
471 floor_type *floor_ptr = target_ptr->current_floor_ptr;
472 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
474 for (int k = 0; k < 1; k++) {
475 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_UNDEAD, PM_ALLOW_GROUP);
478 if (target_ptr->blind && count)
479 msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
481 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
482 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
483 floor_ptr->monster_noise = TRUE;
487 * @brief RF6_S_DRAGONの処理。ドラゴン一体召喚。 /
488 * @param target_ptr プレーヤーへの参照ポインタ
491 * @param m_idx 呪文を唱えるモンスターID
492 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
493 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
494 * @return 召喚したモンスターの数を返す。
496 void spell_RF6_S_DRAGON(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
498 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
499 _("%^sが魔法でドラゴンを召喚した!", "%^s magically summons a dragon!"), _("%^sが魔法でドラゴンを召喚した!", "%^s magically summons a dragon!"),
502 floor_type *floor_ptr = target_ptr->current_floor_ptr;
503 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
505 for (int k = 0; k < 1; k++) {
506 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_DRAGON, PM_ALLOW_GROUP);
509 if (target_ptr->blind && count)
510 msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
512 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
513 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
514 floor_ptr->monster_noise = TRUE;
518 * @brief RF6_S_HI_UNDEADの処理。強力なアンデッド召喚。 /
519 * @param target_ptr プレーヤーへの参照ポインタ
522 * @param m_idx 呪文を唱えるモンスターID
523 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
524 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
525 * @return 召喚したモンスターの数を返す。
527 void spell_RF6_S_HI_UNDEAD(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
529 GAME_TEXT m_name[MAX_NLEN];
530 monster_name(target_ptr, m_idx, m_name);
532 disturb(target_ptr, TRUE, TRUE);
534 floor_type *floor_ptr = target_ptr->current_floor_ptr;
535 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
536 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
537 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
539 if (((m_ptr->r_idx == MON_MORGOTH) || (m_ptr->r_idx == MON_SAURON) || (m_ptr->r_idx == MON_ANGMAR))
540 && ((r_info[MON_NAZGUL].cur_num + 2) < r_info[MON_NAZGUL].max_num) && mon_to_player) {
541 count += summon_NAZGUL(target_ptr, y, x, m_idx);
543 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
544 _("%^sが魔法で強力なアンデッドを召喚した!", "%^s magically summons greater undead!"),
545 _("%sが魔法でアンデッドを召喚した。", "%^s magically summons undead."), TARGET_TYPE);
547 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
548 for (int k = 0; k < S_NUM_6; k++) {
550 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_HI_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
553 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_HI_UNDEAD, (PM_ALLOW_GROUP | monster_u_mode(floor_ptr, m_idx)));
557 if (target_ptr->blind && count && mon_to_player) {
558 msg_print(_("間近で何か多くのものが這い回る音が聞こえる。", "You hear many creepy things appear nearby."));
561 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
562 floor_ptr->monster_noise = TRUE;
566 * @brief RF6_S_HI_DRAGONの処理。古代ドラゴン召喚。 /
567 * @param target_ptr プレーヤーへの参照ポインタ
570 * @param m_idx 呪文を唱えるモンスターID
571 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
572 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
573 * @return 召喚したモンスターの数を返す。
575 void spell_RF6_S_HI_DRAGON(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
577 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
578 _("%^sが魔法で古代ドラゴンを召喚した!", "%^s magically summons ancient dragons!"),
579 _("%^sが魔法で古代ドラゴンを召喚した!", "%^s magically summons ancient dragons!"), TARGET_TYPE);
581 floor_type *floor_ptr = target_ptr->current_floor_ptr;
582 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
583 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
584 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
586 for (int k = 0; k < S_NUM_4; k++) {
588 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_HI_DRAGON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
591 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_HI_DRAGON, (PM_ALLOW_GROUP | monster_u_mode(floor_ptr, m_idx)));
594 if (target_ptr->blind && count && mon_to_player) {
595 msg_print(_("多くの力強いものが間近に現れた音が聞こえる。", "You hear many powerful things appear nearby."));
598 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
599 floor_ptr->monster_noise = TRUE;
603 * @brief RF6_S_AMBERITESの処理。アンバーの王族召喚。 /
604 * @param target_ptr プレーヤーへの参照ポインタ
607 * @param m_idx 呪文を唱えるモンスターID
608 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
609 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
610 * @return 召喚したモンスターの数を返す。
612 void spell_RF6_S_AMBERITES(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
614 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
615 _("%^sがアンバーの王族を召喚した!", "%^s magically summons Lords of Amber!"),
616 _("%^sがアンバーの王族を召喚した!", "%^s magically summons Lords of Amber!"), TARGET_TYPE);
619 floor_type *floor_ptr = target_ptr->current_floor_ptr;
620 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
621 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
622 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
623 for (int k = 0; k < S_NUM_4; k++) {
624 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_AMBERITES, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
627 if (target_ptr->blind && count && mon_to_player) {
628 msg_print(_("不死の者が近くに現れるのが聞こえた。", "You hear immortal beings appear nearby."));
631 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
632 floor_ptr->monster_noise = TRUE;
636 * @brief RF6_S_UNIQUEの処理。ユニーク・モンスター召喚。 /
637 * @param target_ptr プレーヤーへの参照ポインタ
640 * @param m_idx 呪文を唱えるモンスターID
641 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
642 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
643 * @return 召喚したモンスターの数を返す。
645 void spell_RF6_S_UNIQUE(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
647 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
648 _("%^sが魔法で特別な強敵を召喚した!", "%^s magically summons special opponents!"),
649 _("%^sが魔法で特別な強敵を召喚した!", "%^s magically summons special opponents!"), TARGET_TYPE);
651 floor_type *floor_ptr = target_ptr->current_floor_ptr;
652 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
653 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
654 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
655 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
656 bool uniques_are_summoned = FALSE;
658 for (int k = 0; k < S_NUM_4; k++) {
659 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_UNIQUE, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
663 uniques_are_summoned = TRUE;
665 int non_unique_type = SUMMON_HI_UNDEAD;
666 if ((m_ptr->sub_align & (SUB_ALIGN_GOOD | SUB_ALIGN_EVIL)) == (SUB_ALIGN_GOOD | SUB_ALIGN_EVIL))
668 else if (m_ptr->sub_align & SUB_ALIGN_GOOD)
669 non_unique_type = SUMMON_ANGEL;
671 for (int k = count; k < S_NUM_4; k++) {
672 count += summon_specific(target_ptr, m_idx, y, x, rlev, non_unique_type, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
675 if (target_ptr->blind && count && mon_to_player) {
676 msg_format(_("多くの%sが間近に現れた音が聞こえる。", "You hear many %s appear nearby."),
677 uniques_are_summoned ? _("力強いもの", "powerful things") : _("もの", "things"));
680 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
681 floor_ptr->monster_noise = TRUE;