<ClCompile Include="..\..\src\mind\mind-mage.c" />\r
<ClCompile Include="..\..\src\mind\mind-magic-resistance.c" />\r
<ClCompile Include="..\..\src\mind\mind-weaponsmith.c" />\r
+ <ClCompile Include="..\..\src\mspell\specified-summon.c" />\r
<ClCompile Include="..\..\src\racial\racial-kutar.c" />\r
<ClCompile Include="..\..\src\mind\stances-table.c" />\r
<ClCompile Include="..\..\src\mspell\mspell-dispel.c" />\r
<ClInclude Include="..\..\src\mind\mind-mage.h" />\r
<ClInclude Include="..\..\src\mind\mind-magic-resistance.h" />\r
<ClInclude Include="..\..\src\mind\mind-weaponsmith.h" />\r
+ <ClInclude Include="..\..\src\mspell\specified-summon.h" />\r
<ClInclude Include="..\..\src\racial\racial-kutar.h" />\r
<ClInclude Include="..\..\src\mind\stances-table.h" />\r
<ClInclude Include="..\..\src\mspell\monster-power-table.h" />\r
<ClCompile Include="..\..\src\blue-magic\blue-magic-breath.c">
<Filter>blue-magic</Filter>
</ClCompile>
+ <ClCompile Include="..\..\src\mspell\specified-summon.c">
+ <Filter>mspell</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\combat\shoot.h">
<ClInclude Include="..\..\src\blue-magic\blue-magic-breath.h">
<Filter>blue-magic</Filter>
</ClInclude>
+ <ClInclude Include="..\..\src\mspell\specified-summon.h">
+ <Filter>mspell</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\..\src\wall.bmp" />
# プチモアイのみ召喚
N:1162:モアイの総大将『ヴァイフ』
E:Vaif, the general of Moais
-G:g:d
+G:g:D
I:120:60d50:25:100:20
W:49:1:0:11000:0:0
B:CRUSH:SUPERHURT:12d15
mspell/mspell-special.c mspell/mspell-special.h \
mspell/mspell-status.c mspell/mspell-status.h \
mspell/mspell-particularity.c mspell/mspell-particularity.h \
+ mspell/specified-summon.c mspell/specified-summon.h \
mspell/summon-checker.c mspell/summon-checker.h \
\
mutation/mutation.c mutation/mutation.h \
#include "core/window-redrawer.h"
#include "dungeon/dungeon-processor.h"
#include "flavor/object-flavor.h"
+#include "floor/cave.h"
#include "floor/floor-events.h"
#include "floor/floor-save.h"
#include "floor/floor-util.h"
#include "core/window-redrawer.h"
#include "effect/effect-characteristics.h"
#include "effect/effect-monster-switcher.h"
+#include "floor/cave.h"
#include "floor/floor-object.h"
-#include "floor/floor.h"
#include "game-option/play-record-options.h"
#include "io/write-diary.h"
#include "main/sound-definitions-table.h"
#include "grid/grid.h"
#include "system/floor-type-definition.h"
#include "util/bit-flags-calculator.h"
+#include "world/world.h"
/*
* Determines if a map location is fully inside the outer walls
*/
bool in_bounds2u(floor_type *floor_ptr, POSITION y, POSITION x) { return (y < floor_ptr->height) && (x < floor_ptr->width); }
+/*
+ * Determine if a "legal" grid is an "empty" floor grid
+ * Determine if monsters are allowed to move into a grid
+ *
+ * Line 1 -- forbid non-placement grids
+ * Line 2 -- forbid normal monsters
+ * Line 3 -- forbid the player
+ */
+bool is_cave_empty_bold(player_type *player_ptr, POSITION y, POSITION x)
+{
+ floor_type *floor_ptr = player_ptr->current_floor_ptr;
+ bool is_empty_grid = cave_have_flag_bold(floor_ptr, y, x, FF_PLACE);
+ is_empty_grid &= !(floor_ptr->grid_array[y][x].m_idx);
+ is_empty_grid &= !player_bold(player_ptr, y, x);
+ return is_empty_grid;
+}
+
+/*
+ * Determine if a "legal" grid is an "empty" floor grid
+ * Determine if monster generation is allowed in a grid
+ *
+ * Line 1 -- forbid non-empty grids
+ * Line 2 -- forbid trees while dungeon generation
+ */
+bool is_cave_empty_bold2(player_type *player_ptr, POSITION y, POSITION x)
+{
+ bool is_empty_grid = is_cave_empty_bold(player_ptr, y, x);
+ is_empty_grid &= current_world_ptr->character_dungeon || !cave_have_flag_bold(player_ptr->current_floor_ptr, y, x, FF_TREE);
+ return is_empty_grid;
+}
+
bool cave_have_flag_bold(floor_type *floor_ptr, POSITION y, POSITION x, feature_flag_type f_idx)
{
return have_flag(f_info[floor_ptr->grid_array[y][x].feat].flags, f_idx);
{
return ((player_ptr->current_floor_ptr->grid_array[y][x].info & CAVE_VIEW) != 0) || player_ptr->phase_out;
}
+
+/*
+ * Determine if player is on this grid
+ */
+bool player_bold(player_type *player_ptr, POSITION y, POSITION x) { return (y == player_ptr->y) && (x == player_ptr->x); }
bool in_bounds(floor_type *floor_ptr, POSITION y, POSITION x);
bool in_bounds2(floor_type *floor_ptr, POSITION y, POSITION x);
bool in_bounds2u(floor_type *floor_ptr, POSITION y, POSITION x);
+bool is_cave_empty_bold(player_type *player_ptr, POSITION x, POSITION y);
+bool is_cave_empty_bold2(player_type *player_ptr, POSITION x, POSITION y);
bool cave_have_flag_bold(floor_type *floor_ptr, POSITION y, POSITION x, feature_flag_type f_idx);
bool player_has_los_bold(player_type *player_ptr, POSITION y, POSITION x);
+bool player_bold(player_type *player_ptr, POSITION y, POSITION x);
}
-/*
- * Determine if a "legal" grid is an "empty" floor grid
- * Determine if monsters are allowed to move into a grid
- *
- * Line 1 -- forbid non-placement grids
- * Line 2 -- forbid normal monsters
- * Line 3 -- forbid the player
- */
-bool is_cave_empty_bold(player_type *player_ptr, POSITION y, POSITION x)
-{
- floor_type *floor_ptr = player_ptr->current_floor_ptr;
- bool is_empty_grid = cave_have_flag_bold(floor_ptr, y, x, FF_PLACE);
- is_empty_grid &= !(floor_ptr->grid_array[y][x].m_idx);
- is_empty_grid &= !player_bold(player_ptr, y, x);
- return is_empty_grid;
-}
-
-
-/*
- * Determine if a "legal" grid is an "empty" floor grid
- * Determine if monster generation is allowed in a grid
- *
- * Line 1 -- forbid non-empty grids
- * Line 2 -- forbid trees while dungeon generation
- */
-bool is_cave_empty_bold2(player_type *player_ptr, POSITION y, POSITION x)
-{
- bool is_empty_grid = is_cave_empty_bold(player_ptr, y, x);
- is_empty_grid &= current_world_ptr->character_dungeon || !cave_have_flag_bold(player_ptr->current_floor_ptr, y, x, FF_TREE);
- return is_empty_grid;
-}
-
-
/*!
* @brief 鍵のかかったドアを配置する
* @param player_ptr プレーヤーへの参照ポインタ
extern floor_type floor_info;
/*
- * Determine if player is on this grid
- */
-#define player_bold(C,Y,X) \
- (((Y) == (C)->y) && ((X) == (C)->x))
-
-/*
* Grid based version of "creature_bold()"
*/
#define player_grid(C, G) \
((int)((G) % 256U))
bool pattern_tile(floor_type *floor_ptr, POSITION y, POSITION x);
-bool is_cave_empty_bold(player_type *player_ptr, POSITION x, POSITION y);
-bool is_cave_empty_bold2(player_type *player_ptr, POSITION x, POSITION y);
void update_smell(floor_type *floor_ptr, player_type *subject_ptr);
void add_door(player_type *player_ptr, POSITION x, POSITION y);
void place_secret_door(player_type *player_ptr, POSITION y, POSITION x, int type);
#include "melee/melee-postprocess.h"
#include "core/disturbance.h"
#include "core/player-redraw-types.h"
-#include "floor/floor.h"
+#include "floor/cave.h"
#include "grid/grid.h"
#include "main/sound-definitions-table.h"
#include "main/sound-of-music.h"
#include "core/player-update-types.h"
#include "core/stuff-handler.h"
#include "effect/spells-effect-util.h"
-#include "floor/floor.h"
+#include "floor/cave.h"
#include "floor/geometry.h"
#include "game-option/disturbance-options.h"
#include "grid/grid.h"
#include "monster-attack/monster-attack-processor.h"
#include "dungeon/dungeon-flag-types.h"
-#include "floor/floor.h"
+#include "floor/cave.h"
#include "monster/monster-status.h"
#include "dungeon/dungeon.h"
#include "monster-attack/monster-attack-player.h"
*/
#include "monster-floor/monster-direction.h"
+#include "floor/cave.h"
#include "floor/floor.h"
#include "monster-race/monster-race.h"
#include "monster-race/race-flags1.h"
#include "monster/monster-info.h"
#include "dungeon/quest.h"
-#include "floor/floor.h"
+#include "floor/cave.h"
#include "floor/wild.h"
#include "grid/feature.h"
#include "grid/grid.h"
#include "core/disturbance.h"
#include "core/player-update-types.h"
#include "effect/effect-characteristics.h"
-#include "floor/floor.h"
+#include "floor/cave.h"
#include "grid/grid.h"
#include "main/sound-definitions-table.h"
#include "main/sound-of-music.h"
#include "mspell/mspell-summon.h"
#include "core/disturbance.h"
#include "effect/effect-characteristics.h"
-#include "floor/floor.h"
+#include "floor/cave.h"
#include "game-option/birth-options.h"
#include "monster-floor/monster-summon.h"
#include "monster-floor/place-monster-types.h"
#include "monster/monster-status.h"
#include "mspell/mspell-util.h"
#include "mspell/mspells1.h"
+#include "mspell/specified-summon.h"
#include "spell-kind/spells-launcher.h"
#include "spell/process-effect.h"
#include "spell/spells-summon.h"
}
/*!
- * @brief 鷹召喚の処理。 /
- * @param target_ptr プレーヤーへの参照ポインタ
- * @param y 対象の地点のy座標
- * @param x 対象の地点のx座標
- * @param rlev 呪文を唱えるモンスターのレベル
- * @param m_idx 呪文を唱えるモンスターID
- * @return 召喚したモンスターの数を返す。
- */
-MONSTER_NUMBER summon_EAGLE(player_type *target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
-{
- int count = 0;
- int num = 4 + randint1(3);
- for (int k = 0; k < num; k++) {
- count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_EAGLES, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
- }
-
- return count;
-}
-
-/*!
- * @brief インターネット・エクスプローダー召喚の処理。 /
- * @param target_ptr プレーヤーへの参照ポインタ
- * @param y 対象の地点のy座標
- * @param x 対象の地点のx座標
- * @param rlev 呪文を唱えるモンスターのレベル
- * @param m_idx 呪文を唱えるモンスターID
- * @return 召喚したモンスターの数を返す。
- */
-MONSTER_NUMBER summon_IE(player_type *target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
-{
- int count = 0;
- int num = 2 + randint1(1 + rlev / 20);
- for (int k = 0; k < num; k++) {
- count += summon_named_creature(target_ptr, m_idx, y, x, MON_IE, PM_NONE);
- }
-
- return count;
-}
-
-/*!
- * @brief ダンジョンの主召喚の処理。 /
- * @param target_ptr プレーヤーへの参照ポインタ
- * @param y 対象の地点のy座標
- * @param x 対象の地点のx座標
- * @param rlev 呪文を唱えるモンスターのレベル
- * @param m_idx 呪文を唱えるモンスターID
- * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
- * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
- * @return 召喚したモンスターの数を返す。
- */
-MONSTER_NUMBER summon_guardian(player_type *target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
-{
- int num = 2 + randint1(3);
- bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
- bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
-
- if (r_info[MON_JORMUNGAND].cur_num < r_info[MON_JORMUNGAND].max_num && one_in_(6)) {
- simple_monspell_message(target_ptr, m_idx, t_idx, _("地面から水が吹き出した!", "Water blew off from the ground!"),
- _("地面から水が吹き出した!", "Water blew off from the ground!"), TARGET_TYPE);
-
- if (mon_to_player)
- fire_ball_hide(target_ptr, GF_WATER_FLOW, 0, 3, 8);
- else if (mon_to_mon)
- project(target_ptr, t_idx, 8, y, x, 3, GF_WATER_FLOW, PROJECT_GRID | PROJECT_HIDE, -1);
- }
-
- int count = 0;
- for (int k = 0; k < num; k++) {
- count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_GUARDIANS, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
- }
-
- return count;
-}
-
-/*!
- * @brief ロックのクローン召喚の処理。 /
- * @param target_ptr プレーヤーへの参照ポインタ
- * @param y 対象の地点のy座標
- * @param x 対象の地点のx座標
- * @param m_idx 呪文を唱えるモンスターID
- * @return 召喚したモンスターの数を返す。
- */
-MONSTER_NUMBER summon_LOCKE_CLONE(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
-{
- int count = 0;
- int num = randint1(3);
- for (int k = 0; k < num; k++) {
- count += summon_named_creature(target_ptr, m_idx, y, x, MON_LOCKE_CLONE, PM_NONE);
- }
-
- return count;
-}
-
-/*!
- * @brief シラミ召喚の処理。 /
- * @param target_ptr プレーヤーへの参照ポインタ
- * @param y 対象の地点のy座標
- * @param x 対象の地点のx座標
- * @param rlev 呪文を唱えるモンスターのレベル
- * @param m_idx 呪文を唱えるモンスターID
- * @return 召喚したモンスターの数を返す。
- */
-MONSTER_NUMBER summon_LOUSE(player_type *target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
-{
- int count = 0;
- int num = 2 + randint1(3);
- for (int k = 0; k < num; k++) {
- count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_LOUSE, PM_ALLOW_GROUP);
- }
-
- return count;
-}
-
-MONSTER_NUMBER summon_MOAI(player_type* target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
-{
- int count = 0;
- int num = 3 + randint1(3);
- for (int k = 0; k < num; k++)
- count += summon_named_creature(target_ptr, m_idx, y, x, MON_SMALL_MOAI, PM_NONE);
-
- return count;
-}
-
-MONSTER_NUMBER summon_DEMON_SLAYER(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
-{
- int count = 0;
- const int num = 5;
- for (int k = 0; k < num; k++)
- count += summon_named_creature(target_ptr, m_idx, y, x, MON_DEMON_SLAYER_MEMBER, PM_NONE);
-
- return count;
-}
-
-/*!
* @brief 救援召喚の通常処理。同シンボルのモンスターを召喚する。 /
* @param target_ptr プレーヤーへの参照ポインタ
* @param y 対象の地点のy座標
}
/*!
- * @brief ナズグル戦隊召喚の処理。 /
- * @param target_ptr プレーヤーへの参照ポインタ
- * @param y 対象の地点のy座標
- * @param x 対象の地点のx座標
- * @param m_idx 呪文を唱えるモンスターID
- * @return 召喚したモンスターの数を返す。
- */
-MONSTER_NUMBER summon_NAZGUL(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
-{
- BIT_FLAGS mode = 0L;
- POSITION cy = y;
- POSITION cx = x;
- GAME_TEXT m_name[MAX_NLEN];
- monster_name(target_ptr, m_idx, m_name);
-
- if (target_ptr->blind)
- msg_format(_("%^sが何かをつぶやいた。", "%^s mumbles."), m_name);
- else
- msg_format(_("%^sが魔法で幽鬼戦隊を召喚した!", "%^s magically summons rangers of Nazgul!"), m_name);
-
- msg_print(NULL);
-
- int count = 0;
- for (int k = 0; k < 30; k++) {
- if (!summon_possible(target_ptr, cy, cx) || !is_cave_empty_bold(target_ptr, cy, cx)) {
- int j;
- for (j = 100; j > 0; j--) {
- scatter(target_ptr, &cy, &cx, y, x, 2, 0);
- if (is_cave_empty_bold(target_ptr, cy, cx))
- break;
- }
-
- if (!j)
- break;
- }
-
- if (!is_cave_empty_bold(target_ptr, cy, cx))
- continue;
-
- if (!summon_named_creature(target_ptr, m_idx, cy, cx, MON_NAZGUL, mode))
- continue;
-
- y = cy;
- x = cx;
- count++;
- if (count == 1)
- msg_format(_("「幽鬼戦隊%d号、ナズグル・ブラック!」", "A Nazgul says 'Nazgul-Rangers Number %d, Nazgul-Black!'"), count);
- else
- msg_format(_("「同じく%d号、ナズグル・ブラック!」", "Another one says 'Number %d, Nazgul-Black!'"), count);
-
- msg_print(NULL);
- }
-
- msg_format(_("「%d人そろって、リングレンジャー!」", "They say 'The %d meets! We are the Ring-Ranger!'."), count);
- msg_print(NULL);
- return count;
-}
-
-/*!
* @brief RF6_S_HI_UNDEADの処理。強力なアンデッド召喚。 /
* @param target_ptr プレーヤーへの参照ポインタ
* @param y 対象の地点のy座標
#include "system/angband.h"
-MONSTER_NUMBER summon_EAGLE(player_type* target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx);
-MONSTER_NUMBER summon_IE(player_type* target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx);
-MONSTER_NUMBER summon_guardian(player_type* target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE);
-MONSTER_NUMBER summon_LOCKE_CLONE(player_type* target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx);
-MONSTER_NUMBER summon_LOUSE(player_type* target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx);
MONSTER_NUMBER summon_Kin(player_type* target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx);
void spell_RF6_S_KIN(player_type* target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE);
void spell_RF6_S_CYBER(player_type* target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE);
void spell_RF6_S_DEMON(player_type* target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE);
void spell_RF6_S_UNDEAD(player_type* target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE);
void spell_RF6_S_DRAGON(player_type* target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE);
-MONSTER_NUMBER summon_NAZGUL(player_type* target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx);
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);
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);
void spell_RF6_S_AMBERITES(player_type* target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE);
--- /dev/null
+#include "mspell/specified-summon.h"
+#include "effect/effect-characteristics.h"
+#include "floor/cave.h"
+#include "floor/floor.h"
+#include "monster-floor/monster-summon.h"
+#include "monster-floor/place-monster-types.h"
+#include "monster-race/monster-race.h"
+#include "monster-race/race-indice-types.h"
+#include "monster/monster-info.h"
+#include "mspell/mspell-util.h"
+#include "mspell/mspells1.h"
+#include "spell-kind/spells-launcher.h"
+#include "spell/process-effect.h"
+#include "spell/spell-types.h"
+#include "spell/spells-summon.h"
+#include "view/display-messages.h"
+
+/*!
+ * @brief 鷹召喚の処理。 /
+ * @param target_ptr プレーヤーへの参照ポインタ
+ * @param y 対象の地点のy座標
+ * @param x 対象の地点のx座標
+ * @param rlev 呪文を唱えるモンスターのレベル
+ * @param m_idx 呪文を唱えるモンスターID
+ * @return 召喚したモンスターの数を返す。
+ */
+MONSTER_NUMBER summon_EAGLE(player_type *target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
+{
+ int count = 0;
+ int num = 4 + randint1(3);
+ for (int k = 0; k < num; k++) {
+ count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_EAGLES, PM_ALLOW_GROUP | PM_ALLOW_UNIQUE);
+ }
+
+ return count;
+}
+
+/*!
+ * @brief インターネット・エクスプローダー召喚の処理。 /
+ * @param target_ptr プレーヤーへの参照ポインタ
+ * @param y 対象の地点のy座標
+ * @param x 対象の地点のx座標
+ * @param rlev 呪文を唱えるモンスターのレベル
+ * @param m_idx 呪文を唱えるモンスターID
+ * @return 召喚したモンスターの数を返す。
+ */
+MONSTER_NUMBER summon_IE(player_type *target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
+{
+ int count = 0;
+ int num = 2 + randint1(1 + rlev / 20);
+ for (int k = 0; k < num; k++) {
+ count += summon_named_creature(target_ptr, m_idx, y, x, MON_IE, PM_NONE);
+ }
+
+ return count;
+}
+
+/*!
+ * @brief ダンジョンの主召喚の処理。 /
+ * @param target_ptr プレーヤーへの参照ポインタ
+ * @param y 対象の地点のy座標
+ * @param x 対象の地点のx座標
+ * @param rlev 呪文を唱えるモンスターのレベル
+ * @param m_idx 呪文を唱えるモンスターID
+ * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
+ * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
+ * @return 召喚したモンスターの数を返す。
+ */
+MONSTER_NUMBER summon_guardian(player_type *target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
+{
+ int num = 2 + randint1(3);
+ bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
+ bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
+
+ if (r_info[MON_JORMUNGAND].cur_num < r_info[MON_JORMUNGAND].max_num && one_in_(6)) {
+ simple_monspell_message(target_ptr, m_idx, t_idx, _("地面から水が吹き出した!", "Water blew off from the ground!"),
+ _("地面から水が吹き出した!", "Water blew off from the ground!"), TARGET_TYPE);
+
+ if (mon_to_player)
+ fire_ball_hide(target_ptr, GF_WATER_FLOW, 0, 3, 8);
+ else if (mon_to_mon)
+ project(target_ptr, t_idx, 8, y, x, 3, GF_WATER_FLOW, PROJECT_GRID | PROJECT_HIDE, -1);
+ }
+
+ int count = 0;
+ for (int k = 0; k < num; k++) {
+ count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_GUARDIANS, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
+ }
+
+ return count;
+}
+
+/*!
+ * @brief ロックのクローン召喚の処理。 /
+ * @param target_ptr プレーヤーへの参照ポインタ
+ * @param y 対象の地点のy座標
+ * @param x 対象の地点のx座標
+ * @param m_idx 呪文を唱えるモンスターID
+ * @return 召喚したモンスターの数を返す。
+ */
+MONSTER_NUMBER summon_LOCKE_CLONE(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
+{
+ int count = 0;
+ int num = randint1(3);
+ for (int k = 0; k < num; k++) {
+ count += summon_named_creature(target_ptr, m_idx, y, x, MON_LOCKE_CLONE, PM_NONE);
+ }
+
+ return count;
+}
+
+/*!
+ * @brief シラミ召喚の処理。 /
+ * @param target_ptr プレーヤーへの参照ポインタ
+ * @param y 対象の地点のy座標
+ * @param x 対象の地点のx座標
+ * @param rlev 呪文を唱えるモンスターのレベル
+ * @param m_idx 呪文を唱えるモンスターID
+ * @return 召喚したモンスターの数を返す。
+ */
+MONSTER_NUMBER summon_LOUSE(player_type *target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx)
+{
+ int count = 0;
+ int num = 2 + randint1(3);
+ for (int k = 0; k < num; k++) {
+ count += summon_specific(target_ptr, m_idx, y, x, rlev, SUMMON_LOUSE, PM_ALLOW_GROUP);
+ }
+
+ return count;
+}
+
+MONSTER_NUMBER summon_MOAI(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
+{
+ int count = 0;
+ int num = 3 + randint1(3);
+ for (int k = 0; k < num; k++)
+ count += summon_named_creature(target_ptr, m_idx, y, x, MON_SMALL_MOAI, PM_NONE);
+
+ return count;
+}
+
+MONSTER_NUMBER summon_DEMON_SLAYER(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
+{
+ int count = 0;
+ const int num = 5;
+ for (int k = 0; k < num; k++)
+ count += summon_named_creature(target_ptr, m_idx, y, x, MON_DEMON_SLAYER_MEMBER, PM_NONE);
+
+ return count;
+}
+
+/*!
+ * @brief ナズグル戦隊召喚の処理。 /
+ * @param target_ptr プレーヤーへの参照ポインタ
+ * @param y 対象の地点のy座標
+ * @param x 対象の地点のx座標
+ * @param m_idx 呪文を唱えるモンスターID
+ * @return 召喚したモンスターの数を返す。
+ */
+MONSTER_NUMBER summon_NAZGUL(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
+{
+ BIT_FLAGS mode = 0L;
+ POSITION cy = y;
+ POSITION cx = x;
+ GAME_TEXT m_name[MAX_NLEN];
+ monster_name(target_ptr, m_idx, m_name);
+
+ if (target_ptr->blind)
+ msg_format(_("%^sが何かをつぶやいた。", "%^s mumbles."), m_name);
+ else
+ msg_format(_("%^sが魔法で幽鬼戦隊を召喚した!", "%^s magically summons rangers of Nazgul!"), m_name);
+
+ msg_print(NULL);
+
+ int count = 0;
+ for (int k = 0; k < 30; k++) {
+ if (!summon_possible(target_ptr, cy, cx) || !is_cave_empty_bold(target_ptr, cy, cx)) {
+ int j;
+ for (j = 100; j > 0; j--) {
+ scatter(target_ptr, &cy, &cx, y, x, 2, 0);
+ if (is_cave_empty_bold(target_ptr, cy, cx))
+ break;
+ }
+
+ if (!j)
+ break;
+ }
+
+ if (!is_cave_empty_bold(target_ptr, cy, cx))
+ continue;
+
+ if (!summon_named_creature(target_ptr, m_idx, cy, cx, MON_NAZGUL, mode))
+ continue;
+
+ y = cy;
+ x = cx;
+ count++;
+ if (count == 1)
+ msg_format(_("「幽鬼戦隊%d号、ナズグル・ブラック!」", "A Nazgul says 'Nazgul-Rangers Number %d, Nazgul-Black!'"), count);
+ else
+ msg_format(_("「同じく%d号、ナズグル・ブラック!」", "Another one says 'Number %d, Nazgul-Black!'"), count);
+
+ msg_print(NULL);
+ }
+
+ msg_format(_("「%d人そろって、リングレンジャー!」", "They say 'The %d meets! We are the Ring-Ranger!'."), count);
+ msg_print(NULL);
+ return count;
+}
--- /dev/null
+#pragma once
+
+#include "system/angband.h"
+
+MONSTER_NUMBER summon_EAGLE(player_type *target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx);
+MONSTER_NUMBER summon_IE(player_type *target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx);
+MONSTER_NUMBER summon_guardian(player_type *target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE);
+MONSTER_NUMBER summon_LOCKE_CLONE(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx);
+MONSTER_NUMBER summon_LOUSE(player_type *target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx);
+MONSTER_NUMBER summon_MOAI(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx);
+MONSTER_NUMBER summon_DEMON_SLAYER(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx);
+MONSTER_NUMBER summon_NAZGUL(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx);
#include "dungeon/dungeon.h"
#include "dungeon/quest.h"
#include "effect/effect-characteristics.h"
+#include "floor/cave.h"
#include "floor/floor.h"
#include "game-option/disturbance-options.h"
#include "grid/feature.h"
#include "cmd-action/cmd-spell.h"
#include "core/hp-mp-processor.h"
#include "effect/effect-characteristics.h"
+#include "floor/cave.h"
#include "floor/floor.h"
#include "io/targeting.h"
#include "monster-floor/monster-summon.h"
#include "flavor/flavor-describer.h"
#include "flavor/object-flavor-types.h"
#include "floor/floor-object.h"
-#include "floor/floor.h"
+#include "floor/cave.h"
#include "grid/grid.h"
#include "inventory/inventory-slot-types.h"
#include "io/input-key-requester.h"
#include "specific-object/chest.h"
+#include "floor/cave.h"
#include "floor/floor-object.h"
-#include "floor/floor.h"
#include "grid/grid.h"
#include "grid/trap.h"
#include "main/sound-definitions-table.h"
#include "window/main-window-util.h"
#include "flavor/flavor-describer.h"
#include "flavor/object-flavor-types.h"
-#include "floor/floor.h"
+#include "floor/cave.h"
#include "floor/geometry.h"
#include "game-option/map-screen-options.h"
#include "game-option/special-options.h"
#include "wizard/wizard-spells.h"
#include "blue-magic/blue-magic-checker.h"
#include "core/asking-player.h"
+#include "floor/cave.h"
#include "floor/floor.h"
#include "io/targeting.h"
#include "monster-floor/monster-generator.h"