OSDN Git Service

[Refactor] #40542 Separated disturbance.c/h from player-move.c/h
[hengband/hengband.git] / src / mspell / mspell-breath.c
1 #include "mspell/mspell-breath.h"
2 #include "core/disturbance.h"
3 #include "main/sound-definitions-table.h"
4 #include "main/sound-of-music.h"
5 #include "mind/drs-types.h"
6 #include "monster-race/race-indice-types.h"
7 #include "monster/monster-info.h"
8 #include "monster/monster-update.h"
9 #include "mspell/mspell-damage-calculator.h"
10 #include "mspell/mspell-util.h"
11 #include "mspell/mspells1.h"
12 #include "spell/spell-types.h"
13 #include "view/display-messages.h"
14
15 /*!
16  * @brief RF4_BR_*の処理。各種ブレス。 /
17  * @param target_ptr プレーヤーへの参照ポインタ
18  * @param GF_TYPE ブレスの属性
19  * @param y 対象の地点のy座標
20  * @param x 対象の地点のx座標
21  * @param m_idx 呪文を唱えるモンスターID
22  * @param t_idx 呪文を受けるモンスターID。プレイヤーの場合はdummyで0とする。
23  * @param TARGET_TYPE プレイヤーを対象とする場合MONSTER_TO_PLAYER、モンスターを対象とする場合MONSTER_TO_MONSTER
24  * @return ダメージ量を返す。
25  */
26 HIT_POINT spell_RF4_BREATH(player_type *target_ptr, int GF_TYPE, POSITION y, POSITION x, MONSTER_IDX m_idx, MONSTER_IDX t_idx, int TARGET_TYPE)
27 {
28     HIT_POINT dam, ms_type, drs_type = 0;
29     concptr type_s;
30     bool smart_learn_aux = TRUE;
31     floor_type *floor_ptr = target_ptr->current_floor_ptr;
32     monster_type *m_ptr = &floor_ptr->m_list[m_idx];
33     bool known = monster_near_player(floor_ptr, m_idx, t_idx);
34     bool see_either = see_monster(target_ptr, m_idx) || see_monster(target_ptr, t_idx);
35     bool mon_to_mon = (TARGET_TYPE == MONSTER_TO_MONSTER);
36     bool mon_to_player = (TARGET_TYPE == MONSTER_TO_PLAYER);
37     GAME_TEXT m_name[MAX_NLEN], t_name[MAX_NLEN];
38     monster_name(target_ptr, m_idx, m_name);
39     monster_name(target_ptr, t_idx, t_name);
40
41     switch (GF_TYPE) {
42     case GF_ACID:
43         dam = monspell_damage(target_ptr, (MS_BR_ACID), m_idx, DAM_ROLL);
44         type_s = _("酸", "acid");
45         ms_type = MS_BR_ACID;
46         drs_type = DRS_ACID;
47         break;
48     case GF_ELEC:
49         dam = monspell_damage(target_ptr, (MS_BR_ELEC), m_idx, DAM_ROLL);
50         type_s = _("稲妻", "lightning");
51         ms_type = MS_BR_ELEC;
52         drs_type = DRS_ELEC;
53         break;
54     case GF_FIRE:
55         dam = monspell_damage(target_ptr, (MS_BR_FIRE), m_idx, DAM_ROLL);
56         type_s = _("火炎", "fire");
57         ms_type = MS_BR_FIRE;
58         drs_type = DRS_FIRE;
59         break;
60     case GF_COLD:
61         dam = monspell_damage(target_ptr, (MS_BR_COLD), m_idx, DAM_ROLL);
62         type_s = _("冷気", "frost");
63         ms_type = MS_BR_COLD;
64         drs_type = DRS_COLD;
65         break;
66     case GF_POIS:
67         dam = monspell_damage(target_ptr, (MS_BR_POIS), m_idx, DAM_ROLL);
68         type_s = _("ガス", "gas");
69         ms_type = MS_BR_POIS;
70         drs_type = DRS_POIS;
71         break;
72     case GF_NETHER:
73         dam = monspell_damage(target_ptr, (MS_BR_NETHER), m_idx, DAM_ROLL);
74         type_s = _("地獄", "nether");
75         ms_type = MS_BR_NETHER;
76         drs_type = DRS_NETH;
77         break;
78     case GF_LITE:
79         dam = monspell_damage(target_ptr, (MS_BR_LITE), m_idx, DAM_ROLL);
80         type_s = _("閃光", "light");
81         ms_type = MS_BR_LITE;
82         drs_type = DRS_LITE;
83         break;
84     case GF_DARK:
85         dam = monspell_damage(target_ptr, (MS_BR_DARK), m_idx, DAM_ROLL);
86         type_s = _("暗黒", "darkness");
87         ms_type = MS_BR_DARK;
88         drs_type = DRS_DARK;
89         break;
90     case GF_CONFUSION:
91         dam = monspell_damage(target_ptr, (MS_BR_CONF), m_idx, DAM_ROLL);
92         type_s = _("混乱", "confusion");
93         ms_type = MS_BR_CONF;
94         drs_type = DRS_CONF;
95         break;
96     case GF_SOUND:
97         dam = monspell_damage(target_ptr, (MS_BR_SOUND), m_idx, DAM_ROLL);
98         type_s = _("轟音", "sound");
99         ms_type = MS_BR_SOUND;
100         drs_type = DRS_SOUND;
101         break;
102     case GF_CHAOS:
103         dam = monspell_damage(target_ptr, (MS_BR_CHAOS), m_idx, DAM_ROLL);
104         type_s = _("カオス", "chaos");
105         ms_type = MS_BR_CHAOS;
106         drs_type = DRS_CHAOS;
107         break;
108     case GF_DISENCHANT:
109         dam = monspell_damage(target_ptr, (MS_BR_DISEN), m_idx, DAM_ROLL);
110         type_s = _("劣化", "disenchantment");
111         ms_type = MS_BR_DISEN;
112         drs_type = DRS_DISEN;
113         break;
114     case GF_NEXUS:
115         dam = monspell_damage(target_ptr, (MS_BR_NEXUS), m_idx, DAM_ROLL);
116         type_s = _("因果混乱", "nexus");
117         ms_type = MS_BR_NEXUS;
118         drs_type = DRS_NEXUS;
119         break;
120     case GF_TIME:
121         dam = monspell_damage(target_ptr, (MS_BR_TIME), m_idx, DAM_ROLL);
122         type_s = _("時間逆転", "time");
123         ms_type = MS_BR_TIME;
124         smart_learn_aux = FALSE;
125         break;
126     case GF_INERTIAL:
127         dam = monspell_damage(target_ptr, (MS_BR_INERTIA), m_idx, DAM_ROLL);
128         type_s = _("遅鈍", "inertia");
129         ms_type = MS_BR_INERTIA;
130         smart_learn_aux = FALSE;
131         break;
132     case GF_GRAVITY:
133         dam = monspell_damage(target_ptr, (MS_BR_GRAVITY), m_idx, DAM_ROLL);
134         type_s = _("重力", "gravity");
135         ms_type = MS_BR_GRAVITY;
136         smart_learn_aux = FALSE;
137         break;
138     case GF_SHARDS:
139         dam = monspell_damage(target_ptr, (MS_BR_SHARDS), m_idx, DAM_ROLL);
140         type_s = _("破片", "shards");
141         ms_type = MS_BR_SHARDS;
142         drs_type = DRS_SHARD;
143         break;
144     case GF_PLASMA:
145         dam = monspell_damage(target_ptr, (MS_BR_PLASMA), m_idx, DAM_ROLL);
146         type_s = _("プラズマ", "plasma");
147         ms_type = MS_BR_PLASMA;
148         smart_learn_aux = FALSE;
149         break;
150     case GF_FORCE:
151         dam = monspell_damage(target_ptr, (MS_BR_FORCE), m_idx, DAM_ROLL);
152         type_s = _("フォース", "force");
153         ms_type = MS_BR_FORCE;
154         smart_learn_aux = FALSE;
155         break;
156     case GF_MANA:
157         dam = monspell_damage(target_ptr, (MS_BR_MANA), m_idx, DAM_ROLL);
158         type_s = _("魔力", "mana");
159         ms_type = MS_BR_MANA;
160         smart_learn_aux = FALSE;
161         break;
162     case GF_NUKE:
163         dam = monspell_damage(target_ptr, (MS_BR_NUKE), m_idx, DAM_ROLL);
164         type_s = _("放射性廃棄物", "toxic waste");
165         ms_type = MS_BR_NUKE;
166         drs_type = DRS_POIS;
167         break;
168     case GF_DISINTEGRATE:
169         dam = monspell_damage(target_ptr, (MS_BR_DISI), m_idx, DAM_ROLL);
170         type_s = _("分解", "disintegration");
171         ms_type = MS_BR_DISI;
172         smart_learn_aux = FALSE;
173         break;
174     default:
175         /* Do not reach here */
176         dam = 0;
177         type_s = _("不明", "Unknown");
178         ms_type = MS_BR_ACID;
179         smart_learn_aux = FALSE;
180         break;
181     }
182
183     if (mon_to_player || (mon_to_mon && known && see_either))
184         disturb(target_ptr, TRUE, TRUE);
185
186     if (m_ptr->r_idx == MON_JAIAN && GF_TYPE == GF_SOUND) {
187         msg_format(_("「ボォエ~~~~~~」", "'Booooeeeeee'"));
188     } else if (m_ptr->r_idx == MON_BOTEI && GF_TYPE == GF_SHARDS) {
189         msg_format(_("「ボ帝ビルカッター!!!」", "'Boty-Build cutter!!!'"));
190     } else if (target_ptr->blind) {
191         if (mon_to_player || (mon_to_mon && known && see_either))
192             msg_format(_("%^sが何かのブレスを吐いた。", "%^s breathes."), m_name);
193     } else {
194         if (mon_to_player) {
195             msg_format(_("%^sが%^sのブレスを吐いた。", "%^s breathes %^s."), m_name, type_s);
196         } else if (mon_to_mon && known && see_either) {
197             _(msg_format("%^sが%^sに%^sのブレスを吐いた。", m_name, t_name, type_s), msg_format("%^s breathes %^s at %^s.", m_name, type_s, t_name));
198         }
199     }
200
201     if (mon_to_mon && known && !see_either)
202         floor_ptr->monster_noise = TRUE;
203
204     sound(SOUND_BREATH);
205     breath(target_ptr, y, x, m_idx, GF_TYPE, dam, 0, TRUE, ms_type, TARGET_TYPE);
206     if (smart_learn_aux && mon_to_player)
207         update_smart_learn(target_ptr, m_idx, drs_type);
208
209     return dam;
210 }