OSDN Git Service

8fec73fefc8aeac3ab0eef6b92b74b5d72784dce
[hengbandforosx/hengbandosx.git] / src / mspell / mspell-particularity.cpp
1 /*!
2  * @brief ボルトでもボールでもブレスでもなく、ダメージを与える特殊なスペルの実行 /
3  * Performing special spells that take damage, not bolts, balls or breaths
4  * @date 2020/05/16
5  * @author Hourier
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.
9  */
10
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"
22
23 /*!
24  * @brief RF4_ROCKETの処理。ロケット。 /
25  * @param player_ptr プレイヤーへの参照ポインタ
26  * @param y 対象の地点のy座標
27  * @param x 対象の地点のx座標
28  * @param m_idx 呪文を唱えるモンスターID
29  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
30  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
31  *
32  * プレイヤーに当たったらラーニング可。
33  */
34 MonsterSpellResult spell_RF4_ROCKET(player_type *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
35 {
36     mspell_cast_msg_blind msg(_("%^sが何かを射った。", "%^s shoots something."), _("%^sがロケットを発射した。", "%^s fires a rocket."),
37         _("%^sが%sにロケットを発射した。", "%^s fires a rocket at %s."));
38
39     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
40
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);
45
46     auto res = MonsterSpellResult::make_valid(dam);
47     res.learnable = proj_res.affected_player;
48
49     return res;
50 }
51
52 /*!
53  * @brief RF6_HAND_DOOMの処理。破滅の手。 /
54  * @param player_ptr プレイヤーへの参照ポインタ
55  * @param y 対象の地点のy座標
56  * @param x 対象の地点のx座標
57  * @param m_idx 呪文を唱えるモンスターID
58  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
59  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
60  *
61  * プレイヤーに当たったらラーニング可。
62  */
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)
64 {
65     mspell_cast_msg_simple msg(_("%^sが<破滅の手>を放った!", "%^s invokes the Hand of Doom!"),
66         _("%^sが%sに<破滅の手>を放った!", "%^s invokes the Hand of Doom upon %s!"));
67
68     simple_monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
69
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);
77     }
78
79     auto res = MonsterSpellResult::make_valid();
80     res.learnable = proj_res.affected_player;
81
82     return res;
83 }
84
85 /*!
86  * @brief RF6_PSY_SPEARの処理。光の剣。 /
87  * @param y 対象の地点のy座標
88  * @param x 対象の地点のx座標
89  * @param m_idx 呪文を唱えるモンスターID
90  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
91  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
92  *
93  * プレイヤーに当たったらラーニング可。
94  */
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)
96 {
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."));
99
100     monspell_message(player_ptr, m_idx, t_idx, msg, TARGET_TYPE);
101
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);
104
105     auto res = MonsterSpellResult::make_valid(dam);
106     res.learnable = proj_res.affected_player;
107
108     return res;
109 }