OSDN Git Service

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