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, MonsterRaceId::EDGE, PM_NONE);
60 * @brief ダンジョンの主召喚の処理。 /
61 * @param player_ptr プレイヤーへの参照ポインタ
64 * @param rlev 呪文を唱えるモンスターのレベル
65 * @param m_idx 呪文を唱えるモンスターID
66 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
67 * @param target_type プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
68 * @return 召喚したモンスターの数を返す。
70 MONSTER_NUMBER summon_guardian(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int target_type)
72 int num = 2 + randint1(3);
73 bool mon_to_mon = (target_type == MONSTER_TO_MONSTER);
74 bool mon_to_player = (target_type == MONSTER_TO_PLAYER);
76 if (r_info[MonsterRaceId::JORMUNGAND].cur_num < r_info[MonsterRaceId::JORMUNGAND].max_num && one_in_(6)) {
77 mspell_cast_msg_simple msg(_("地面から水が吹き出した!", "Water blew off from the ground!"),
78 _("地面から水が吹き出した!", "Water blew off from the ground!"));
80 simple_monspell_message(player_ptr, m_idx, t_idx, msg, target_type);
83 fire_ball_hide(player_ptr, AttributeType::WATER_FLOW, 0, 3, 8);
84 } else if (mon_to_mon) {
85 project(player_ptr, t_idx, 8, y, x, 3, AttributeType::WATER_FLOW, PROJECT_GRID | PROJECT_HIDE);
90 for (int k = 0; k < num; k++) {
91 count += summon_specific(player_ptr, m_idx, y, x, rlev, SUMMON_GUARDIANS, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
98 * @brief ロックのクローン召喚の処理。 /
99 * @param player_ptr プレイヤーへの参照ポインタ
102 * @param m_idx 呪文を唱えるモンスターID
103 * @return 召喚したモンスターの数を返す。
105 MONSTER_NUMBER summon_LOCKE_CLONE(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
108 int num = randint1(3);
109 for (int k = 0; k < num; k++) {
110 count += summon_named_creature(player_ptr, m_idx, y, x, MonsterRaceId::LOCKE_CLONE, PM_NONE);
118 * @param player_ptr プレイヤーへの参照ポインタ
121 * @param rlev 呪文を唱えるモンスターのレベル
122 * @param m_idx 呪文を唱えるモンスターID
123 * @return 召喚したモンスターの数を返す。
125 MONSTER_NUMBER summon_LOUSE(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
128 int num = 2 + randint1(3);
129 for (int k = 0; k < num; k++) {
130 count += summon_specific(player_ptr, m_idx, y, x, rlev, SUMMON_LOUSE, PM_ALLOW_GROUP);
136 MONSTER_NUMBER summon_MOAI(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
139 int num = 3 + randint1(3);
140 for (int k = 0; k < num; k++) {
141 count += summon_specific(player_ptr, m_idx, y, x, rlev, SUMMON_SMALL_MOAI, PM_NONE);
147 MONSTER_NUMBER summon_DEMON_SLAYER(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
149 auto *r_ptr = &r_info[MonsterRaceId::DEMON_SLAYER_MEMBER];
150 if (r_ptr->max_num == 0) {
151 msg_print(_("しかし、隊士は全滅していた…。", "However, all demon slayer members were murdered..."));
156 for (auto k = 0; k < MAX_NAZGUL_NUM; k++) {
157 count += summon_named_creature(player_ptr, m_idx, y, x, MonsterRaceId::DEMON_SLAYER_MEMBER, PM_NONE);
161 msg_print(_("しかし、隊士は誰も来てくれなかった。", "However, no demon slayer member answered the call..."));
168 * @brief ナズグル戦隊召喚の処理。 /
169 * @param player_ptr プレイヤーへの参照ポインタ
172 * @param m_idx 呪文を唱えるモンスターID
173 * @return 召喚したモンスターの数を返す。
175 MONSTER_NUMBER summon_NAZGUL(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
180 GAME_TEXT m_name[MAX_NLEN];
181 monster_name(player_ptr, m_idx, m_name);
183 if (player_ptr->blind) {
184 msg_format(_("%^sが何かをつぶやいた。", "%^s mumbles."), m_name);
186 msg_format(_("%^sが魔法で幽鬼戦隊を召喚した!", "%^s magically summons rangers of Nazgul!"), m_name);
192 for (int k = 0; k < 30; k++) {
193 if (!summon_possible(player_ptr, cy, cx) || !is_cave_empty_bold(player_ptr, cy, cx)) {
195 for (j = 100; j > 0; j--) {
196 scatter(player_ptr, &cy, &cx, y, x, 2, PROJECT_NONE);
197 if (is_cave_empty_bold(player_ptr, cy, cx)) {
207 if (!is_cave_empty_bold(player_ptr, cy, cx)) {
211 if (!summon_named_creature(player_ptr, m_idx, cy, cx, MonsterRaceId::NAZGUL, mode)) {
219 msg_format(_("「幽鬼戦隊%d号、ナズグル・ブラック!」", "A Nazgul says 'Nazgul-Rangers Number %d, Nazgul-Black!'"), count);
221 msg_format(_("「同じく%d号、ナズグル・ブラック!」", "Another one says 'Number %d, Nazgul-Black!'"), count);
227 msg_format(_("「%d人そろって、リングレンジャー!」", "They say 'The %d meets! We are the Ring-Ranger!'."), count);
232 MONSTER_NUMBER summon_APOCRYPHA(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
235 int num = 4 + randint1(4);
236 summon_type followers = one_in_(2) ? SUMMON_APOCRYPHA_FOLLOWERS : SUMMON_APOCRYPHA_DRAGONS;
237 for (int k = 0; k < num; k++) {
238 count += summon_specific(player_ptr, m_idx, y, x, 200, followers, PM_ALLOW_UNIQUE);
244 MONSTER_NUMBER summon_HIGHEST_DRAGON(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
247 int num = 4 + randint1(4);
248 for (int k = 0; k < num; k++) {
249 count += summon_specific(player_ptr, m_idx, y, x, 100, SUMMON_APOCRYPHA_DRAGONS, PM_ALLOW_UNIQUE);
255 MONSTER_NUMBER summon_PYRAMID(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
258 int num = 2 + randint1(3);
259 for (int k = 0; k < num; k++) {
260 count += summon_specific(player_ptr, m_idx, y, x, rlev, SUMMON_PYRAMID, PM_NONE);
266 MONSTER_NUMBER summon_EYE_PHORN(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
269 int num = 2 + randint1(1 + rlev / 20);
270 for (int k = 0; k < num; k++) {
271 count += summon_named_creature(player_ptr, m_idx, y, x, MonsterRaceId::EYE_PHORN, PM_NONE);
277 MONSTER_NUMBER summon_VESPOID(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
280 int num = 2 + randint1(3);
281 for (int k = 0; k < num; k++) {
282 count += summon_specific(player_ptr, m_idx, y, x, rlev, SUMMON_VESPOID, PM_NONE);
288 MONSTER_NUMBER summon_THUNDERS(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
290 auto count = (MONSTER_NUMBER)0;
292 for (auto k = 0; k < num; k++) {
293 count += summon_specific(player_ptr, m_idx, y, x, rlev, SUMMON_ANTI_TIGERS, PM_NONE);
300 * @brief イェンダーの魔法使いの召喚の処理。 /
301 * @param player_ptr プレイヤーへの参照ポインタ
304 * @param m_idx 呪文を唱えるモンスターID
305 * @return 召喚したモンスターの数を返す。
307 MONSTER_NUMBER summon_YENDER_WIZARD(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
309 auto *r_ptr = &r_info[MonsterRaceId::YENDOR_WIZARD_2];
310 if (r_ptr->max_num == 0) {
311 msg_print(_("しかし、誰も来なかった…。", "However, no kin was appeared..."));
315 auto count = (MONSTER_NUMBER)summon_named_creature(player_ptr, m_idx, y, x, MonsterRaceId::YENDOR_WIZARD_2, PM_NONE);
317 msg_print(_("どこからか声が聞こえる…「三重苦は負わぬ。。。」", "Heard a voice from somewhere... 'I will deny the triple suffering...'"));
321 msg_print(_("二重苦だ。。。", "THIS is double suffering..."));
325 MONSTER_NUMBER summon_PLASMA(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
328 auto num = 2 + randint1(1 + rlev / 20);
329 for (auto k = 0; k < num; k++) {
330 count += summon_named_creature(player_ptr, m_idx, y, x, MonsterRaceId::PLASMA_VORTEX, PM_NONE);
333 msg_print(_("プーラーズーマーッ!!", "P--la--s--ma--!!"));