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);
64 static void decide_summon_kin_caster(player_type *target_ptr, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int target_type, concptr m_name, const bool known)
66 floor_type *floor_ptr = target_ptr->current_floor_ptr;
67 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
68 bool see_either = see_monster(target_ptr, m_idx) || see_monster(target_ptr, t_idx);
69 bool mon_to_mon = target_type == MONSTER_TO_MONSTER;
70 bool mon_to_player = target_type == MONSTER_TO_PLAYER;
71 if (m_ptr->r_idx == MON_SERPENT || m_ptr->r_idx == MON_ZOMBI_SERPENT) {
72 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
73 _("%^sがダンジョンの主を召喚した。", "%^s magically summons guardians of dungeons."),
74 _("%^sがダンジョンの主を召喚した。", "%^s magically summons guardians of dungeons."), target_type);
78 if (mon_to_player || (mon_to_mon && known && see_either))
79 disturb(target_ptr, TRUE, TRUE);
81 if (target_ptr->blind) {
83 msg_format(_("%^sが何かをつぶやいた。", "%^s mumbles."), m_name);
84 } else if (mon_to_player || (mon_to_mon && known && see_either)) {
85 monster_race *r_ptr = &r_info[m_ptr->r_idx];
86 _(msg_format("%sが魔法で%sを召喚した。", m_name, ((r_ptr->flags1 & RF1_UNIQUE) ? "手下" : "仲間")),
87 msg_format("%^s magically summons %s %s.", m_name, m_poss, ((r_ptr->flags1 & RF1_UNIQUE) ? "minions" : "kin")));
90 if (mon_to_mon && known && !see_either)
91 floor_ptr->monster_noise = TRUE;
95 * @brief RF6_S_KINの処理。救援召喚。使用するモンスターの種類により、実処理に分岐させる。 /
96 * @param target_ptr プレーヤーへの参照ポインタ
99 * @param m_idx 呪文を唱えるモンスターID
100 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
101 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
102 * @return 召喚したモンスターの数を返す。
104 void spell_RF6_S_KIN(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int target_type)
106 floor_type *floor_ptr = target_ptr->current_floor_ptr;
107 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
108 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
109 GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN], m_poss[80];
110 monster_name(target_ptr, m_idx, m_name);
111 monster_name(target_ptr, t_idx, t_name);
112 monster_desc(target_ptr, m_poss, m_ptr, MD_PRON_VISIBLE | MD_POSSESSIVE);
114 disturb(target_ptr, TRUE, TRUE);
115 bool known = monster_near_player(floor_ptr, m_idx, t_idx);
116 decide_summon_kin_caster(target_ptr, m_idx, t_idx, target_type, m_name, known);
118 switch (m_ptr->r_idx) {
122 count += summon_EAGLE(target_ptr, y, x, rlev, m_idx);
125 count += summon_IE(target_ptr, y, x, rlev, m_idx);
128 case MON_ZOMBI_SERPENT:
129 count += summon_guardian(target_ptr, y, x, rlev, m_idx, t_idx, target_type);
132 count += summon_LOCKE_CLONE(target_ptr, y, x, m_idx);
135 count += summon_LOUSE(target_ptr, y, x, rlev, m_idx);
138 count += summon_MOAI(target_ptr, y, x, rlev, m_idx);
140 case MON_DEMON_SLAYER_SENIOR:
141 count += summon_DEMON_SLAYER(target_ptr, y, x, m_idx);
144 count += summon_Kin(target_ptr, y, x, rlev, m_idx);
148 if (target_ptr->blind && count && (target_type == MONSTER_TO_PLAYER))
149 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
151 if (known && !see_monster(target_ptr, t_idx) && count && (target_type == MONSTER_TO_MONSTER))
152 floor_ptr->monster_noise = TRUE;
156 * @brief RF6_S_CYBERの処理。サイバー・デーモン召喚。 /
157 * @param target_ptr プレーヤーへの参照ポインタ
160 * @param m_idx 呪文を唱えるモンスターID
161 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
162 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
163 * @return 召喚したモンスターの数を返す。
165 void spell_RF6_S_CYBER(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
168 floor_type *floor_ptr = target_ptr->current_floor_ptr;
169 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
170 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
171 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
172 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
174 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
175 _("%^sがサイバーデーモンを召喚した!", "%^s magically summons Cyberdemons!"),
176 _("%^sがサイバーデーモンを召喚した!", "%^s magically summons Cyberdemons!"), TARGET_TYPE);
178 if (is_friendly(m_ptr) && mon_to_mon) {
179 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_CYBER, (PM_ALLOW_GROUP));
181 count += summon_cyber(target_ptr, m_idx, y, x);
184 if (target_ptr->blind && count && mon_to_player)
185 msg_print(_("重厚な足音が近くで聞こえる。", "You hear heavy steps nearby."));
187 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
188 floor_ptr->monster_noise = TRUE;
192 * @brief RF6_S_MONSTERの処理。モンスター一体召喚。 /
193 * @param target_ptr プレーヤーへの参照ポインタ
196 * @param m_idx 呪文を唱えるモンスターID
197 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
198 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
199 * @return 召喚したモンスターの数を返す。
201 void spell_RF6_S_MONSTER(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
203 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが魔法で仲間を召喚した!", "%^s magically summons help!"),
204 _("%^sが魔法で仲間を召喚した!", "%^s magically summons help!"), TARGET_TYPE);
206 floor_type *floor_ptr = target_ptr->current_floor_ptr;
208 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
209 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
210 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
211 for (int k = 0; k < 1; k++) {
213 count += summon_specific(target_ptr, m_idx, y, x, rlev, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
216 count += summon_specific(target_ptr, m_idx, y, x, rlev, 0, (monster_u_mode(floor_ptr, m_idx)));
219 if (target_ptr->blind && count && mon_to_player)
220 msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
222 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
223 floor_ptr->monster_noise = TRUE;
227 * @brief RF6_S_MONSTERSの処理。モンスター複数召喚。 /
228 * @param target_ptr プレーヤーへの参照ポインタ
231 * @param m_idx 呪文を唱えるモンスターID
232 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
233 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
234 * @return 召喚したモンスターの数を返す。
236 void spell_RF6_S_MONSTERS(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
238 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
239 _("%^sが魔法でモンスターを召喚した!", "%^s magically summons monsters!"), _("%^sが魔法でモンスターを召喚した!", "%^s magically summons monsters!"),
242 floor_type *floor_ptr = target_ptr->current_floor_ptr;
244 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
245 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
246 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
247 for (int k = 0; k < S_NUM_6; k++) {
249 count += summon_specific(target_ptr, m_idx, y, x, rlev, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
252 count += summon_specific(target_ptr, m_idx, y, x, rlev, 0, (PM_ALLOW_GROUP | monster_u_mode(floor_ptr, m_idx)));
255 if (target_ptr->blind && count && mon_to_player)
256 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
258 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
259 floor_ptr->monster_noise = TRUE;
263 * @brief RF6_S_ANTの処理。アリ召喚。 /
264 * @param target_ptr プレーヤーへの参照ポインタ
267 * @param m_idx 呪文を唱えるモンスターID
268 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
269 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
270 * @return 召喚したモンスターの数を返す。
272 void spell_RF6_S_ANT(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
274 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが魔法でアリを召喚した。", "%^s magically summons ants."),
275 _("%^sが魔法でアリを召喚した。", "%^s magically summons ants."), TARGET_TYPE);
278 floor_type *floor_ptr = target_ptr->current_floor_ptr;
279 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
280 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
281 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
282 for (int k = 0; k < S_NUM_6; k++) {
283 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_ANT, PM_ALLOW_GROUP);
286 if (target_ptr->blind && count && mon_to_player)
287 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
289 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
290 floor_ptr->monster_noise = TRUE;
294 * @brief RF6_S_SPIDERの処理。クモ召喚。 /
295 * @param target_ptr プレーヤーへの参照ポインタ
298 * @param m_idx 呪文を唱えるモンスターID
299 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
300 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
301 * @return 召喚したモンスターの数を返す。
303 void spell_RF6_S_SPIDER(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
305 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが魔法でクモを召喚した。", "%^s magically summons spiders."),
306 _("%^sが魔法でクモを召喚した。", "%^s magically summons spiders."), TARGET_TYPE);
309 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
310 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
311 floor_type *floor_ptr = target_ptr->current_floor_ptr;
312 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
313 for (int k = 0; k < S_NUM_6; k++) {
314 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_SPIDER, PM_ALLOW_GROUP);
317 if (target_ptr->blind && count && mon_to_player)
318 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
320 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
321 floor_ptr->monster_noise = TRUE;
325 * @brief RF6_S_HOUNDの処理。ハウンド召喚。 /
326 * @param target_ptr プレーヤーへの参照ポインタ
329 * @param m_idx 呪文を唱えるモンスターID
330 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
331 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
332 * @return 召喚したモンスターの数を返す。
334 void spell_RF6_S_HOUND(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
336 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
337 _("%^sが魔法でハウンドを召喚した。", "%^s magically summons hounds."), _("%^sが魔法でハウンドを召喚した。", "%^s magically summons hounds."),
341 floor_type *floor_ptr = target_ptr->current_floor_ptr;
342 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
343 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
344 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
345 for (int k = 0; k < S_NUM_4; k++) {
346 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_HOUND, PM_ALLOW_GROUP);
349 if (target_ptr->blind && count && mon_to_player)
350 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
352 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
353 floor_ptr->monster_noise = TRUE;
357 * @brief RF6_S_HYDRAの処理。ヒドラ召喚。 /
358 * @param target_ptr プレーヤーへの参照ポインタ
361 * @param m_idx 呪文を唱えるモンスターID
362 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
363 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
364 * @return 召喚したモンスターの数を返す。
366 void spell_RF6_S_HYDRA(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
368 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
369 _("%^sが魔法でヒドラを召喚した。", "%^s magically summons hydras."), _("%^sが魔法でヒドラを召喚した。", "%^s magically summons hydras."), TARGET_TYPE);
372 floor_type *floor_ptr = target_ptr->current_floor_ptr;
373 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
374 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
375 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
376 for (int k = 0; k < S_NUM_4; k++) {
377 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_HYDRA, PM_ALLOW_GROUP);
380 if (target_ptr->blind && count && mon_to_player)
381 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
383 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
384 floor_ptr->monster_noise = TRUE;
388 * @brief RF6_S_ANGELの処理。天使一体召喚。 /
389 * @param target_ptr プレーヤーへの参照ポインタ
392 * @param m_idx 呪文を唱えるモンスターID
393 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
394 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
395 * @return 召喚したモンスターの数を返す。
397 void spell_RF6_S_ANGEL(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
399 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
400 _("%^sが魔法で天使を召喚した!", "%^s magically summons an angel!"), _("%^sが魔法で天使を召喚した!", "%^s magically summons an angel!"), TARGET_TYPE);
402 floor_type *floor_ptr = target_ptr->current_floor_ptr;
403 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
404 monster_race *r_ptr = &r_info[m_ptr->r_idx];
406 if ((r_ptr->flags1 & RF1_UNIQUE) && !easy_band) {
407 num += r_ptr->level / 40;
410 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
412 for (int k = 0; k < num; k++) {
413 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_ANGEL, PM_ALLOW_GROUP);
417 if (target_ptr->blind && count)
418 msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
420 if (target_ptr->blind)
421 msg_print(_("多くのものが間近に現れた音がする。", "You hear many things appear nearby."));
424 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
425 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
426 floor_ptr->monster_noise = TRUE;
430 * @brief RF6_S_DEMONの処理。デーモン一体召喚。 /
431 * @param target_ptr プレーヤーへの参照ポインタ
434 * @param m_idx 呪文を唱えるモンスターID
435 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
436 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
437 * @return 召喚したモンスターの数を返す。
439 void spell_RF6_S_DEMON(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
441 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
442 _("%^sは魔法で混沌の宮廷から悪魔を召喚した!", "%^s magically summons a demon from the Courts of Chaos!"),
443 _("%^sは魔法で混沌の宮廷から悪魔を召喚した!", "%^s magically summons a demon from the Courts of Chaos!"), TARGET_TYPE);
445 floor_type *floor_ptr = target_ptr->current_floor_ptr;
446 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
448 for (int k = 0; k < 1; k++) {
449 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_DEMON, PM_ALLOW_GROUP);
452 if (target_ptr->blind && count)
453 msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
455 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
456 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
457 floor_ptr->monster_noise = TRUE;
461 * @brief RF6_S_UNDEADの処理。アンデッド一体召喚。 /
462 * @param target_ptr プレーヤーへの参照ポインタ
465 * @param m_idx 呪文を唱えるモンスターID
466 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
467 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
468 * @return 召喚したモンスターの数を返す。
470 void spell_RF6_S_UNDEAD(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
472 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
473 _("%^sが魔法でアンデッドの強敵を召喚した!", "%^s magically summons an undead adversary!"),
474 _("%sが魔法でアンデッドを召喚した。", "%^s magically summons undead."), TARGET_TYPE);
476 floor_type *floor_ptr = target_ptr->current_floor_ptr;
477 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
479 for (int k = 0; k < 1; k++) {
480 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_UNDEAD, PM_ALLOW_GROUP);
483 if (target_ptr->blind && count)
484 msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
486 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
487 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
488 floor_ptr->monster_noise = TRUE;
492 * @brief RF6_S_DRAGONの処理。ドラゴン一体召喚。 /
493 * @param target_ptr プレーヤーへの参照ポインタ
496 * @param m_idx 呪文を唱えるモンスターID
497 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
498 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
499 * @return 召喚したモンスターの数を返す。
501 void spell_RF6_S_DRAGON(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
503 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
504 _("%^sが魔法でドラゴンを召喚した!", "%^s magically summons a dragon!"), _("%^sが魔法でドラゴンを召喚した!", "%^s magically summons a dragon!"),
507 floor_type *floor_ptr = target_ptr->current_floor_ptr;
508 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
510 for (int k = 0; k < 1; k++) {
511 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_DRAGON, PM_ALLOW_GROUP);
514 if (target_ptr->blind && count)
515 msg_print(_("何かが間近に現れた音がする。", "You hear something appear nearby."));
517 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
518 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
519 floor_ptr->monster_noise = TRUE;
523 * @brief RF6_S_HI_UNDEADの処理。強力なアンデッド召喚。 /
524 * @param target_ptr プレーヤーへの参照ポインタ
527 * @param m_idx 呪文を唱えるモンスターID
528 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
529 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
530 * @return 召喚したモンスターの数を返す。
532 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)
534 GAME_TEXT m_name[MAX_NLEN];
535 monster_name(target_ptr, m_idx, m_name);
537 disturb(target_ptr, TRUE, TRUE);
539 floor_type *floor_ptr = target_ptr->current_floor_ptr;
540 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
541 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
542 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
544 if (((m_ptr->r_idx == MON_MORGOTH) || (m_ptr->r_idx == MON_SAURON) || (m_ptr->r_idx == MON_ANGMAR))
545 && ((r_info[MON_NAZGUL].cur_num + 2) < r_info[MON_NAZGUL].max_num) && mon_to_player) {
546 count += summon_NAZGUL(target_ptr, y, x, m_idx);
548 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
549 _("%^sが魔法で強力なアンデッドを召喚した!", "%^s magically summons greater undead!"),
550 _("%sが魔法でアンデッドを召喚した。", "%^s magically summons undead."), TARGET_TYPE);
552 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
553 for (int k = 0; k < S_NUM_6; k++) {
555 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_HI_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
558 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_HI_UNDEAD, (PM_ALLOW_GROUP | monster_u_mode(floor_ptr, m_idx)));
562 if (target_ptr->blind && count && mon_to_player) {
563 msg_print(_("間近で何か多くのものが這い回る音が聞こえる。", "You hear many creepy things appear nearby."));
566 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
567 floor_ptr->monster_noise = TRUE;
571 * @brief RF6_S_HI_DRAGONの処理。古代ドラゴン召喚。 /
572 * @param target_ptr プレーヤーへの参照ポインタ
575 * @param m_idx 呪文を唱えるモンスターID
576 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
577 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
578 * @return 召喚したモンスターの数を返す。
580 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)
582 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
583 _("%^sが魔法で古代ドラゴンを召喚した!", "%^s magically summons ancient dragons!"),
584 _("%^sが魔法で古代ドラゴンを召喚した!", "%^s magically summons ancient dragons!"), TARGET_TYPE);
586 floor_type *floor_ptr = target_ptr->current_floor_ptr;
587 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
588 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
589 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
591 for (int k = 0; k < S_NUM_4; k++) {
593 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_HI_DRAGON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
596 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_HI_DRAGON, (PM_ALLOW_GROUP | monster_u_mode(floor_ptr, m_idx)));
599 if (target_ptr->blind && count && mon_to_player) {
600 msg_print(_("多くの力強いものが間近に現れた音が聞こえる。", "You hear many powerful things appear nearby."));
603 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
604 floor_ptr->monster_noise = TRUE;
608 * @brief RF6_S_AMBERITESの処理。アンバーの王族召喚。 /
609 * @param target_ptr プレーヤーへの参照ポインタ
612 * @param m_idx 呪文を唱えるモンスターID
613 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
614 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
615 * @return 召喚したモンスターの数を返す。
617 void spell_RF6_S_AMBERITES(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
619 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
620 _("%^sがアンバーの王族を召喚した!", "%^s magically summons Lords of Amber!"),
621 _("%^sがアンバーの王族を召喚した!", "%^s magically summons Lords of Amber!"), TARGET_TYPE);
624 floor_type *floor_ptr = target_ptr->current_floor_ptr;
625 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
626 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
627 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
628 for (int k = 0; k < S_NUM_4; k++) {
629 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_AMBERITES, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
632 if (target_ptr->blind && count && mon_to_player) {
633 msg_print(_("不死の者が近くに現れるのが聞こえた。", "You hear immortal beings appear nearby."));
636 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
637 floor_ptr->monster_noise = TRUE;
641 * @brief RF6_S_UNIQUEの処理。ユニーク・モンスター召喚。 /
642 * @param target_ptr プレーヤーへの参照ポインタ
645 * @param m_idx 呪文を唱えるモンスターID
646 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
647 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
648 * @return 召喚したモンスターの数を返す。
650 void spell_RF6_S_UNIQUE(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
652 monspell_message(target_ptr, m_idx, t_idx, _("%^sが何かをつぶやいた。", "%^s mumbles."),
653 _("%^sが魔法で特別な強敵を召喚した!", "%^s magically summons special opponents!"),
654 _("%^sが魔法で特別な強敵を召喚した!", "%^s magically summons special opponents!"), TARGET_TYPE);
656 floor_type *floor_ptr = target_ptr->current_floor_ptr;
657 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
658 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
659 bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
660 bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
661 bool uniques_are_summoned = FALSE;
663 for (int k = 0; k < S_NUM_4; k++) {
664 count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_UNIQUE, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
668 uniques_are_summoned = TRUE;
670 int non_unique_type = SUMMON_HI_UNDEAD;
671 if ((m_ptr->sub_align & (SUB_ALIGN_GOOD | SUB_ALIGN_EVIL)) == (SUB_ALIGN_GOOD | SUB_ALIGN_EVIL))
673 else if (m_ptr->sub_align & SUB_ALIGN_GOOD)
674 non_unique_type = SUMMON_ANGEL;
676 for (int k = count; k < S_NUM_4; k++) {
677 count += summon_specific(target_ptr, m_idx, y, x, rlev, non_unique_type, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
680 if (target_ptr->blind && count && mon_to_player) {
681 msg_format(_("多くの%sが間近に現れた音が聞こえる。", "You hear many %s appear nearby."),
682 uniques_are_summoned ? _("力強いもの", "powerful things") : _("もの", "things"));
685 if (monster_near_player(floor_ptr, m_idx, t_idx) && !see_monster(target_ptr, t_idx) && count && mon_to_mon)
686 floor_ptr->monster_noise = TRUE;