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"
21 * @param player_ptr プレイヤーへの参照ポインタ
24 * @param rlev 呪文を唱えるモンスターのレベル
25 * @param m_idx 呪文を唱えるモンスターID
26 * @return 召喚したモンスターの数を返す。
28 MONSTER_NUMBER summon_EAGLE(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
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);
41 * @param player_ptr プレイヤーへの参照ポインタ
44 * @param rlev 呪文を唱えるモンスターのレベル
45 * @param m_idx 呪文を唱えるモンスターID
46 * @return 召喚したモンスターの数を返す。
48 MONSTER_NUMBER summon_EDGE(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
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);
59 * @brief ダンジョンの主召喚の処理。 /
60 * @param player_ptr プレイヤーへの参照ポインタ
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 召喚したモンスターの数を返す。
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)
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);
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!"));
79 simple_monspell_message(player_ptr, m_idx, t_idx, msg, target_type);
82 fire_ball_hide(player_ptr, AttributeType::WATER_FLOW, 0, 3, 8);
84 project(player_ptr, t_idx, 8, y, x, 3, AttributeType::WATER_FLOW, PROJECT_GRID | PROJECT_HIDE);
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));
96 * @brief ロックのクローン召喚の処理。 /
97 * @param player_ptr プレイヤーへの参照ポインタ
100 * @param m_idx 呪文を唱えるモンスターID
101 * @return 召喚したモンスターの数を返す。
103 MONSTER_NUMBER summon_LOCKE_CLONE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
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);
116 * @param player_ptr プレイヤーへの参照ポインタ
119 * @param rlev 呪文を唱えるモンスターのレベル
120 * @param m_idx 呪文を唱えるモンスターID
121 * @return 召喚したモンスターの数を返す。
123 MONSTER_NUMBER summon_LOUSE(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
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);
133 MONSTER_NUMBER summon_MOAI(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
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);
143 MONSTER_NUMBER summon_DEMON_SLAYER(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
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..."));
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);
156 msg_print(_("しかし、隊士は誰も来てくれなかった。", "However, no demon slayer member answered the call..."));
162 * @brief ナズグル戦隊召喚の処理。 /
163 * @param player_ptr プレイヤーへの参照ポインタ
166 * @param m_idx 呪文を唱えるモンスターID
167 * @return 召喚したモンスターの数を返す。
169 MONSTER_NUMBER summon_NAZGUL(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
174 GAME_TEXT m_name[MAX_NLEN];
175 monster_name(player_ptr, m_idx, m_name);
177 if (player_ptr->blind)
178 msg_format(_("%^sが何かをつぶやいた。", "%^s mumbles."), m_name);
180 msg_format(_("%^sが魔法で幽鬼戦隊を召喚した!", "%^s magically summons rangers of Nazgul!"), m_name);
185 for (int k = 0; k < 30; k++) {
186 if (!summon_possible(player_ptr, cy, cx) || !is_cave_empty_bold(player_ptr, cy, cx)) {
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))
198 if (!is_cave_empty_bold(player_ptr, cy, cx))
201 if (!summon_named_creature(player_ptr, m_idx, cy, cx, MON_NAZGUL, mode))
208 msg_format(_("「幽鬼戦隊%d号、ナズグル・ブラック!」", "A Nazgul says 'Nazgul-Rangers Number %d, Nazgul-Black!'"), count);
210 msg_format(_("「同じく%d号、ナズグル・ブラック!」", "Another one says 'Number %d, Nazgul-Black!'"), count);
215 msg_format(_("「%d人そろって、リングレンジャー!」", "They say 'The %d meets! We are the Ring-Ranger!'."), count);
220 MONSTER_NUMBER summon_APOCRYPHA(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
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);
231 MONSTER_NUMBER summon_HIGHEST_DRAGON(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
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);
241 MONSTER_NUMBER summon_PYRAMID(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
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);
251 MONSTER_NUMBER summon_EYE_PHORN(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
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);
261 MONSTER_NUMBER summon_VESPOID(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
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);
271 MONSTER_NUMBER summon_THUNDERS(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
273 auto count = (MONSTER_NUMBER)0;
275 for (auto k = 0; k < num; k++) {
276 count += summon_specific(player_ptr, m_idx, y, x, rlev, SUMMON_ANTI_TIGERS, PM_NONE);
283 * @brief イェンダーの魔法使いの召喚の処理。 /
284 * @param player_ptr プレイヤーへの参照ポインタ
287 * @param m_idx 呪文を唱えるモンスターID
288 * @return 召喚したモンスターの数を返す。
290 MONSTER_NUMBER summon_YENDER_WIZARD(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
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..."));
298 auto count = (MONSTER_NUMBER)summon_named_creature(player_ptr, m_idx, y, x, MON_YENDOR_WIZARD_2, PM_NONE);
300 msg_print(_("どこからか声が聞こえる…「三重苦は負わぬ。。。」", "Heard a voice from somewhere... 'I will deny the triple suffering...'"));
304 msg_print(_("二重苦だ。。。", "THIS is double suffering..."));
308 MONSTER_NUMBER summon_PLASMA(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
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);
316 msg_print(_("プーラーズーマーッ!!", "P--la--s--ma--!!"));