OSDN Git Service

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