2 * @brief ボルトでもボールでもブレスでもなく、ダメージを与える特殊なスペルの実行 /
3 * Performing special spells that take damage, not bolts, balls or breaths
6 * @details 肥大化しやすいファイル名なので、関数の追加時は共通部分を別ファイルに抜き出せるか検討すること /
7 * This is a filename that tends to be bloated.
8 * So when adding a function, please consider whether you can extract the common part to another file.
11 #include "mspell/mspell-particularity.h"
12 #include "effect/effect-processor.h"
13 #include "mind/drs-types.h"
14 #include "monster-race/race-ability-flags.h"
15 #include "monster/monster-update.h"
16 #include "mspell/mspell-checker.h"
17 #include "mspell/mspell-damage-calculator.h"
18 #include "mspell/mspell-util.h"
19 #include "mspell/mspell.h"
20 #include "spell/spell-types.h"
21 #include "system/player-type-definition.h"
24 * @brief RF4_ROCKETの処理。ロケット。 /
25 * @param player_ptr プレイヤーへの参照ポインタ
28 * @param m_idx 呪文を唱えるモンスターID
29 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
30 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
34 MonsterSpellResult spell_RF4_ROCKET(player_type *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
36 mspell_cast_msg_blind msg(_("%^sが何かを射った。", "%^s shoots something."), _("%^sがロケットを発射した。", "%^s fires a rocket."),
37 _("%^sが%sにロケットを発射した。", "%^s fires a rocket at %s."));
39 monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
41 const auto dam = monspell_damage(player_ptr, RF_ABILITY::ROCKET, m_idx, DAM_ROLL);
42 const auto proj_res = breath(player_ptr, y, x, m_idx, GF_ROCKET, dam, 2, false, TARGET_TYPE);
43 if (TARGET_TYPE == MONSTER_TO_PLAYER)
44 update_smart_learn(player_ptr, m_idx, DRS_SHARD);
46 auto res = MonsterSpellResult::make_valid(dam);
47 res.learnable = proj_res.affected_player;
53 * @brief RF6_HAND_DOOMの処理。破滅の手。 /
54 * @param player_ptr プレイヤーへの参照ポインタ
57 * @param m_idx 呪文を唱えるモンスターID
58 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
59 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
63 MonsterSpellResult spell_RF6_HAND_DOOM(player_type *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
65 mspell_cast_msg_simple msg(_("%^sが<破滅の手>を放った!", "%^s invokes the Hand of Doom!"),
66 _("%^sが%sに<破滅の手>を放った!", "%^s invokes the Hand of Doom upon %s!"));
68 simple_monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
70 ProjectResult proj_res;
71 if (TARGET_TYPE == MONSTER_TO_PLAYER) {
72 const auto dam = monspell_damage(player_ptr, RF_ABILITY::HAND_DOOM, m_idx, DAM_ROLL);
73 proj_res = breath(player_ptr, y, x, m_idx, GF_HAND_DOOM, dam, 0, false, MONSTER_TO_PLAYER);
74 } else if (TARGET_TYPE == MONSTER_TO_MONSTER) {
75 const auto dam = 20; /* Dummy power */
76 proj_res = breath(player_ptr, y, x, m_idx, GF_HAND_DOOM, dam, 0, false, MONSTER_TO_MONSTER);
79 auto res = MonsterSpellResult::make_valid();
80 res.learnable = proj_res.affected_player;
86 * @brief RF6_PSY_SPEARの処理。光の剣。 /
89 * @param m_idx 呪文を唱えるモンスターID
90 * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
91 * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
95 MonsterSpellResult spell_RF6_PSY_SPEAR(player_type *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
97 mspell_cast_msg_blind msg(_("%^sが何かをつぶやいた。", "%^s mumbles."), _("%^sが光の剣を放った。", "%^s throw a Psycho-Spear."),
98 _("%^sが%sに向かって光の剣を放った。", "%^s throw a Psycho-spear at %s."));
100 monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
102 const auto dam = monspell_damage(player_ptr, RF_ABILITY::PSY_SPEAR, m_idx, DAM_ROLL);
103 const auto proj_res = beam(player_ptr, m_idx, y, x, GF_PSY_SPEAR, dam, MONSTER_TO_PLAYER);
105 auto res = MonsterSpellResult::make_valid(dam);
106 res.learnable = proj_res.affected_player;