OSDN Git Service

84ec00ee4cc81369bd361924c65d7cc31fca90a8
[hengband/hengband.git] / src / blue-magic / blue-magic-caster.c
1 #include "blue-magic/blue-magic-caster.h"
2 #include "blue-magic/blue-magic-ball-bolt.h"
3 #include "blue-magic/blue-magic-breath.h"
4 #include "blue-magic/blue-magic-spirit-curse.h"
5 #include "blue-magic/blue-magic-status.h"
6 #include "blue-magic/blue-magic-summon.h"
7 #include "blue-magic/blue-magic-util.h"
8 #include "blue-magic/learnt-info.h"
9 #include "core/hp-mp-processor.h"
10 #include "floor/cave.h"
11 #include "floor/floor.h"
12 #include "grid/grid.h"
13 #include "io/targeting.h"
14 #include "monster-race/monster-race.h"
15 #include "monster-race/race-flags-resistance.h"
16 #include "monster-race/race-flags1.h"
17 #include "monster/monster-describer.h"
18 #include "monster/monster-info.h"
19 #include "monster/monster-status.h"
20 #include "mspell/mspell-damage-calculator.h"
21 #include "spell-kind/spells-launcher.h"
22 #include "spell-kind/spells-lite.h"
23 #include "spell-kind/spells-neighbor.h"
24 #include "spell-kind/spells-sight.h"
25 #include "spell-kind/spells-teleport.h"
26 #include "spell-kind/spells-world.h"
27 #include "spell/spell-types.h"
28 #include "spell/spells-status.h"
29 #include "status/bad-status-setter.h"
30 #include "status/body-improvement.h"
31 #include "status/buff-setter.h"
32 #include "system/floor-type-definition.h"
33 #include "view/display-messages.h"
34
35 static bool cast_blue_dispel(player_type *caster_ptr)
36 {
37     if (!target_set(caster_ptr, TARGET_KILL))
38         return FALSE;
39
40     MONSTER_IDX m_idx = caster_ptr->current_floor_ptr->grid_array[target_row][target_col].m_idx;
41     if ((m_idx == 0) || !player_has_los_bold(caster_ptr, target_row, target_col)
42         || !projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col))
43         return TRUE;
44
45     dispel_monster_status(caster_ptr, m_idx);
46     return TRUE;
47 }
48
49 static bool cast_blue_rocket(player_type *caster_ptr, bmc_type *bmc_ptr)
50 {
51     if (!get_aim_dir(caster_ptr, &bmc_ptr->dir))
52         return FALSE;
53
54     msg_print(_("ロケットを発射した。", "You fire a rocket."));
55     bmc_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_ROCKET), bmc_ptr->plev, DAM_ROLL);
56     fire_rocket(caster_ptr, GF_ROCKET, bmc_ptr->dir, bmc_ptr->damage, 2);
57     return TRUE;
58 }
59
60 static bool cast_blue_shoot(player_type *caster_ptr, bmc_type *bmc_ptr)
61 {
62     if (!get_aim_dir(caster_ptr, &bmc_ptr->dir))
63         return FALSE;
64
65     msg_print(_("矢を放った。", "You fire an arrow."));
66     bmc_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_SHOOT), bmc_ptr->plev, DAM_ROLL);
67     fire_bolt(caster_ptr, GF_ARROW, bmc_ptr->dir, bmc_ptr->damage);
68     return TRUE;
69 }
70
71 static bool cast_blue_hand_doom(player_type *caster_ptr, bmc_type *bmc_ptr)
72 {
73     if (!get_aim_dir(caster_ptr, &bmc_ptr->dir))
74         return FALSE;
75
76     msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));
77     fire_ball_hide(caster_ptr, GF_HAND_DOOM, bmc_ptr->dir, bmc_ptr->plev * 3, 0);
78     return TRUE;
79 }
80
81 static bool exe_blue_teleport_back(player_type *caster_ptr, GAME_TEXT *m_name)
82 {
83     monster_type *m_ptr;
84     monster_race *r_ptr;
85     floor_type *floor_ptr = caster_ptr->current_floor_ptr;
86     if ((floor_ptr->grid_array[target_row][target_col].m_idx == 0) || !player_has_los_bold(caster_ptr, target_row, target_col)
87         || !projectable(caster_ptr, caster_ptr->y, caster_ptr->x, target_row, target_col))
88         return TRUE;
89
90     m_ptr = &floor_ptr->m_list[floor_ptr->grid_array[target_row][target_col].m_idx];
91     r_ptr = &r_info[m_ptr->r_idx];
92     monster_desc(caster_ptr, m_name, m_ptr, 0);
93     if ((r_ptr->flagsr & RFR_RES_TELE) == 0)
94         return FALSE;
95
96     if ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flagsr & RFR_RES_ALL)) {
97         if (is_original_ap_and_seen(caster_ptr, m_ptr))
98             r_ptr->r_flagsr |= RFR_RES_TELE;
99
100         msg_format(_("%sには効果がなかった!", "%s is unaffected!"), m_name);
101         return TRUE;
102     }
103     
104     if (r_ptr->level <= randint1(100))
105         return FALSE;
106
107     if (is_original_ap_and_seen(caster_ptr, m_ptr))
108         r_ptr->r_flagsr |= RFR_RES_TELE;
109
110     msg_format(_("%sには耐性がある!", "%s resists!"), m_name);
111     return TRUE;
112 }
113
114 static bool cast_blue_teleport_back(player_type *caster_ptr)
115 {
116     if (!target_set(caster_ptr, TARGET_KILL))
117         return FALSE;
118
119     GAME_TEXT m_name[MAX_NLEN];
120     if (exe_blue_teleport_back(caster_ptr, m_name))
121         return TRUE;
122
123     msg_format(_("%sを引き戻した。", "You command %s to return."), m_name);
124     teleport_monster_to(
125         caster_ptr, caster_ptr->current_floor_ptr->grid_array[target_row][target_col].m_idx, caster_ptr->y, caster_ptr->x, 100, TELEPORT_PASSIVE);
126     return TRUE;
127 }
128
129 static bool cast_blue_teleport_away(player_type *caster_ptr, bmc_type *bmc_ptr)
130 {
131     if (!get_aim_dir(caster_ptr, &bmc_ptr->dir))
132         return FALSE;
133
134     (void)fire_beam(caster_ptr, GF_AWAY_ALL, bmc_ptr->dir, 100);
135     return TRUE;
136 }
137
138 static bool cast_blue_psy_spear(player_type *caster_ptr, bmc_type *bmc_ptr)
139 {
140     if (!get_aim_dir(caster_ptr, &bmc_ptr->dir))
141         return FALSE;
142
143     msg_print(_("光の剣を放った。", "You throw a psycho-spear."));
144     bmc_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_PSY_SPEAR), bmc_ptr->plev, DAM_ROLL);
145     (void)fire_beam(caster_ptr, GF_PSY_SPEAR, bmc_ptr->dir, bmc_ptr->damage);
146     return TRUE;
147 }
148
149 static bool cast_blue_make_trap(player_type *caster_ptr)
150 {
151     if (!target_set(caster_ptr, TARGET_KILL))
152         return FALSE;
153
154     msg_print(_("呪文を唱えて邪悪に微笑んだ。", "You cast a spell and cackle evilly."));
155     trap_creation(caster_ptr, target_row, target_col);
156     return TRUE;
157 }
158
159 bool switch_cast_blue_magic(player_type *caster_ptr, bmc_type *bmc_ptr, SPELL_IDX spell)
160 {
161     switch (spell) {
162     case MS_SHRIEK:
163         msg_print(_("かん高い金切り声をあげた。", "You make a high pitched shriek."));
164         aggravate_monsters(caster_ptr, 0);
165         return TRUE;
166     case MS_XXX1:
167     case MS_XXX2:
168     case MS_XXX3:
169     case MS_XXX4:
170         return TRUE;
171     case MS_DISPEL:
172         return cast_blue_dispel(caster_ptr);
173     case MS_ROCKET:
174         return cast_blue_rocket(caster_ptr, bmc_ptr);
175     case MS_SHOOT:
176         return cast_blue_shoot(caster_ptr, bmc_ptr);
177     case MS_BR_ACID:
178         return cast_blue_breath_acid(caster_ptr, bmc_ptr);
179     case MS_BR_ELEC:
180         return cast_blue_breath_elec(caster_ptr, bmc_ptr);
181     case MS_BR_FIRE:
182         return cast_blue_breath_fire(caster_ptr, bmc_ptr);
183     case MS_BR_COLD:
184         return cast_blue_breath_cold(caster_ptr, bmc_ptr);
185     case MS_BR_POIS:
186         return cast_blue_breath_pois(caster_ptr, bmc_ptr);
187     case MS_BR_NETHER:
188         return cast_blue_breath_nether(caster_ptr, bmc_ptr);
189     case MS_BR_LITE:
190         return cast_blue_breath_lite(caster_ptr, bmc_ptr);
191     case MS_BR_DARK:
192         return cast_blue_breath_dark(caster_ptr, bmc_ptr);
193     case MS_BR_CONF:
194         return cast_blue_breath_conf(caster_ptr, bmc_ptr);
195     case MS_BR_SOUND:
196         return cast_blue_breath_sound(caster_ptr, bmc_ptr);
197     case MS_BR_CHAOS:
198         return cast_blue_breath_chaos(caster_ptr, bmc_ptr);
199     case MS_BR_DISEN:
200         return cast_blue_breath_disenchant(caster_ptr, bmc_ptr);
201     case MS_BR_NEXUS:
202         return cast_blue_breath_nexus(caster_ptr, bmc_ptr);
203     case MS_BR_TIME:
204         return cast_blue_breath_time(caster_ptr, bmc_ptr);
205     case MS_BR_INERTIA:
206         return cast_blue_breath_inertia(caster_ptr, bmc_ptr);
207     case MS_BR_GRAVITY:
208         return cast_blue_breath_gravity(caster_ptr, bmc_ptr);
209     case MS_BR_SHARDS:
210         return cast_blue_breath_shards(caster_ptr, bmc_ptr);
211     case MS_BR_PLASMA:
212         return cast_blue_breath_plasma(caster_ptr, bmc_ptr);
213     case MS_BR_FORCE:
214         return cast_blue_breath_force(caster_ptr, bmc_ptr);
215     case MS_BR_MANA:
216         return cast_blue_breath_mana(caster_ptr, bmc_ptr);
217     case MS_BR_NUKE:
218         return cast_blue_breath_nuke(caster_ptr, bmc_ptr);
219     case MS_BR_DISI:
220         return cast_blue_breath_disintegration(caster_ptr, bmc_ptr);
221     case MS_BALL_ACID:
222         return cast_blue_ball_acid(caster_ptr, bmc_ptr);
223     case MS_BALL_ELEC:
224         return cast_blue_ball_elec(caster_ptr, bmc_ptr);
225     case MS_BALL_FIRE:
226         return cast_blue_ball_fire(caster_ptr, bmc_ptr);
227     case MS_BALL_COLD:
228         return cast_blue_ball_cold(caster_ptr, bmc_ptr);
229     case MS_BALL_POIS:
230         return cast_blue_ball_pois(caster_ptr, bmc_ptr);
231     case MS_BALL_NUKE:
232         return cast_blue_ball_nuke(caster_ptr, bmc_ptr);
233     case MS_BALL_NETHER:
234         return cast_blue_ball_nether(caster_ptr, bmc_ptr);
235     case MS_BALL_CHAOS:
236         return cast_blue_ball_chaos(caster_ptr, bmc_ptr);
237     case MS_BALL_WATER:
238         return cast_blue_ball_water(caster_ptr, bmc_ptr);
239     case MS_STARBURST:
240         return cast_blue_ball_star_burst(caster_ptr, bmc_ptr);
241     case MS_BALL_DARK:
242         return cast_blue_ball_dark_storm(caster_ptr, bmc_ptr);
243     case MS_BALL_MANA:
244         return cast_blue_ball_mana_storm(caster_ptr, bmc_ptr);
245     case MS_DRAIN_MANA:
246         return cast_blue_drain_mana(caster_ptr, bmc_ptr);
247     case MS_MIND_BLAST:
248         return cast_blue_mind_blast(caster_ptr, bmc_ptr);
249     case MS_BRAIN_SMASH:
250         return cast_blue_brain_smash(caster_ptr, bmc_ptr);
251     case MS_CAUSE_1:
252         return cast_blue_curse_1(caster_ptr, bmc_ptr);
253     case MS_CAUSE_2:
254         return cast_blue_curse_2(caster_ptr, bmc_ptr);
255     case MS_CAUSE_3:
256         return cast_blue_curse_3(caster_ptr, bmc_ptr);
257     case MS_CAUSE_4:
258         return cast_blue_curse_4(caster_ptr, bmc_ptr);
259     case MS_BOLT_ACID:
260         return cast_blue_bolt_acid(caster_ptr, bmc_ptr);
261     case MS_BOLT_ELEC:
262         return cast_blue_bolt_elec(caster_ptr, bmc_ptr);
263     case MS_BOLT_FIRE:
264         return !cast_blue_bolt_fire(caster_ptr, bmc_ptr);
265     case MS_BOLT_COLD:
266         return cast_blue_bolt_cold(caster_ptr, bmc_ptr);
267     case MS_BOLT_NETHER:
268         return cast_blue_bolt_nether(caster_ptr, bmc_ptr);
269     case MS_BOLT_WATER:
270         return cast_blue_bolt_water(caster_ptr, bmc_ptr);
271     case MS_BOLT_MANA:
272         return cast_blue_bolt_mana(caster_ptr, bmc_ptr);
273     case MS_BOLT_PLASMA:
274         return cast_blue_bolt_plasma(caster_ptr, bmc_ptr);
275     case MS_BOLT_ICE:
276         return cast_blue_bolt_icee(caster_ptr, bmc_ptr);
277     case MS_MAGIC_MISSILE:
278         return cast_blue_bolt_missile(caster_ptr, bmc_ptr);
279     case MS_SCARE:
280         return cast_blue_scare(caster_ptr, bmc_ptr);
281     case MS_BLIND:
282         return cast_blue_blind(caster_ptr, bmc_ptr);
283     case MS_CONF:
284         return cast_blue_confusion(caster_ptr, bmc_ptr);
285     case MS_SLOW:
286         return cast_blue_slow(caster_ptr, bmc_ptr);
287     case MS_SLEEP:
288         return cast_blue_sleep(caster_ptr, bmc_ptr);
289     case MS_SPEED:
290         (void)set_fast(caster_ptr, randint1(20 + bmc_ptr->plev) + bmc_ptr->plev, FALSE);
291         return TRUE;
292     case MS_HAND_DOOM:
293         return cast_blue_hand_doom(caster_ptr, bmc_ptr);
294     case MS_HEAL:
295         msg_print(_("自分の傷に念を集中した。", "You concentrate on your wounds!"));
296         (void)hp_player(caster_ptr, bmc_ptr->plev * 4);
297         (void)set_stun(caster_ptr, 0);
298         (void)set_cut(caster_ptr, 0);
299         return TRUE;
300     case MS_INVULNER:
301         msg_print(_("無傷の球の呪文を唱えた。", "You cast a Globe of Invulnerability."));
302         (void)set_invuln(caster_ptr, randint1(4) + 4, FALSE);
303         return TRUE;
304     case MS_BLINK:
305         teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
306         return TRUE;
307     case MS_TELEPORT:
308         teleport_player(caster_ptr, bmc_ptr->plev * 5, TELEPORT_SPONTANEOUS);
309         return TRUE;
310     case MS_WORLD:
311         (void)time_walk(caster_ptr);
312         return TRUE;
313     case MS_SPECIAL:
314         return TRUE;
315     case MS_TELE_TO:
316         return cast_blue_teleport_back(caster_ptr);
317     case MS_TELE_AWAY:
318         return cast_blue_teleport_away(caster_ptr, bmc_ptr);
319     case MS_TELE_LEVEL:
320         return teleport_level_other(caster_ptr);
321     case MS_PSY_SPEAR:
322         return cast_blue_psy_spear(caster_ptr, bmc_ptr);
323     case MS_DARKNESS:
324         msg_print(_("暗闇の中で手を振った。", "You gesture in shadow."));
325         (void)unlite_area(caster_ptr, 10, 3);
326         return TRUE;
327     case MS_MAKE_TRAP:
328         return cast_blue_make_trap(caster_ptr);
329     case MS_FORGET:
330         msg_print(_("しかし何も起きなかった。", "Nothing happen."));
331         return TRUE;
332     case MS_RAISE_DEAD:
333         msg_print(_("死者復活の呪文を唱えた。", "You animate the dead."));
334         (void)animate_dead(caster_ptr, 0, caster_ptr->y, caster_ptr->x);
335         return TRUE;
336     case MS_S_KIN:
337         return cast_blue_summon_kin(caster_ptr, bmc_ptr);
338     case MS_S_CYBER:
339         return cast_blue_summon_cyber(caster_ptr, bmc_ptr);
340     case MS_S_MONSTER:
341         return cast_blue_summon_monster(caster_ptr, bmc_ptr);
342     case MS_S_MONSTERS:
343         return cast_blue_summon_monsters(caster_ptr, bmc_ptr);
344     case MS_S_ANT:
345         return cast_blue_summon_ant(caster_ptr, bmc_ptr);
346     case MS_S_SPIDER:
347         return cast_blue_summon_spider(caster_ptr, bmc_ptr);
348     case MS_S_HOUND:
349         return cast_blue_summon_hound(caster_ptr, bmc_ptr);
350     case MS_S_HYDRA:
351         return cast_blue_summon_hydra(caster_ptr, bmc_ptr);
352     case MS_S_ANGEL:
353         return cast_blue_summon_angel(caster_ptr, bmc_ptr);
354     case MS_S_DEMON:
355         return cast_blue_summon_demon(caster_ptr, bmc_ptr);
356     case MS_S_UNDEAD:
357         return cast_blue_summon_undead(caster_ptr, bmc_ptr);
358     case MS_S_DRAGON:
359         return cast_blue_summon_dragon(caster_ptr, bmc_ptr);
360     case MS_S_HI_UNDEAD:
361         return cast_blue_summon_high_undead(caster_ptr, bmc_ptr);
362     case MS_S_HI_DRAGON:
363         return cast_blue_summon_high_dragon(caster_ptr, bmc_ptr);
364     case MS_S_AMBERITE:
365         return cast_blue_summon_amberite(caster_ptr, bmc_ptr);
366     case MS_S_UNIQUE:
367         return cast_blue_summon_unique(caster_ptr, bmc_ptr);
368     default:
369         msg_print("hoge?");
370         return TRUE;
371     }
372 }
373
374 /*!
375  * @brief 青魔法の発動 /
376  * do_cmd_cast calls this function if the player's class is 'blue-mage'.
377  * @param spell 発動するモンスター攻撃のID
378  * @param success TRUEは成功時、FALSEは失敗時の処理を行う
379  * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
380  */
381 bool cast_learned_spell(player_type *caster_ptr, SPELL_IDX spell, const bool success)
382 {
383     bmc_type tmp_bm;
384     bmc_type *bmc_ptr = initialize_blue_magic_type(caster_ptr, &tmp_bm, success, get_pseudo_monstetr_level);
385     if (switch_cast_blue_magic(caster_ptr, bmc_ptr, spell))
386         return FALSE;
387
388     if (bmc_ptr->no_trump)
389         msg_print(_("何も現れなかった。", "No one appeared."));
390
391     return TRUE;
392 }