2 * @brief ダイス目により様々な効果を及ぼす魔法の処理
7 #include "spell-kind/spells-random.h"
8 #include "effect/effect-characteristics.h"
9 #include "floor/floor.h"
10 #include "io/targeting.h"
11 #include "main/sound-definitions-table.h"
12 #include "monster-floor/monster-generator.h"
13 #include "monster-floor/place-monster-types.h"
14 #include "mutation/mutation.h"
15 #include "player/avatar.h"
16 #include "player/player-damage.h"
17 #include "player/player-effects.h"
18 #include "spell/spells-type.h"
19 #include "spell-kind/earthquake.h"
20 #include "spell-kind/spells-floor.h"
21 #include "spell-kind/spells-genocide.h"
22 #include "spell-kind/spells-launcher.h"
23 #include "spell-kind/spells-lite.h"
24 #include "spell-kind/spells-neighbor.h"
25 #include "spell-kind/spells-sight.h"
26 #include "spell-kind/spells-specific-bolt.h"
27 #include "spell-kind/spells-teleport.h"
28 #include "spell/process-effect.h"
29 #include "spell/spells-diceroll.h"
30 #include "spell/spells-status.h"
31 #include "spell/spells-summon.h"
32 #include "spell/spells-type.h"
33 #include "spell/spells3.h"
37 * @return 作用が実際にあった場合TRUEを返す
39 void call_chaos(player_type *caster_ptr)
41 int hurt_types[31] = { GF_ELEC, GF_POIS, GF_ACID, GF_COLD, GF_FIRE, GF_MISSILE, GF_ARROW, GF_PLASMA, GF_HOLY_FIRE, GF_WATER, GF_LITE, GF_DARK, GF_FORCE,
42 GF_INERTIAL, GF_MANA, GF_METEOR, GF_ICE, GF_CHAOS, GF_NETHER, GF_DISENCHANT, GF_SHARDS, GF_SOUND, GF_NEXUS, GF_CONFUSION, GF_TIME, GF_GRAVITY,
43 GF_ROCKET, GF_NUKE, GF_HELL_FIRE, GF_DISINTEGRATE, GF_PSY_SPEAR };
45 int chaos_type = hurt_types[randint0(31)];
46 bool line_chaos = FALSE;
52 for (int dummy = 1; dummy < 10; dummy++) {
55 fire_beam(caster_ptr, chaos_type, dummy, 150);
57 fire_ball(caster_ptr, chaos_type, dummy, 150, 2);
65 fire_ball(caster_ptr, chaos_type, 0, 500, 8);
69 if (!get_aim_dir(caster_ptr, &dir))
72 fire_beam(caster_ptr, chaos_type, dir, 250);
74 fire_ball(caster_ptr, chaos_type, dir, 250, 3 + (caster_ptr->lev / 35));
78 * @brief TY_CURSE処理発動 / Activate the evil Topi Ylinen curse
79 * @param target_ptr プレーヤーへの参照ポインタ
80 * @param stop_ty 再帰処理停止フラグ
82 * @return 作用が実際にあった場合TRUEを返す
85 * rr9: Stop the nasty things when a Cyberdemon is summoned
86 * or the player gets paralyzed.
89 bool activate_ty_curse(player_type *target_ptr, bool stop_ty, int *count)
91 BIT_FLAGS flg = (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP);
92 bool is_first_curse = TRUE;
93 floor_type *floor_ptr = target_ptr->current_floor_ptr;
94 while (is_first_curse || (one_in_(3) && !stop_ty)) {
95 is_first_curse = FALSE;
96 switch (randint1(34)) {
100 msg_print(_("地面が揺れた...", "The ground trembles..."));
101 earthquake(target_ptr, target_ptr->y, target_ptr->x, 5 + randint0(10), 0);
109 HIT_POINT dam = damroll(10, 10);
110 msg_print(_("純粋な魔力の次元への扉が開いた!", "A portal opens to a plane of raw mana!"));
111 project(target_ptr, 0, 8, target_ptr->y, target_ptr->x, dam, GF_MANA, flg, -1);
112 take_hit(target_ptr, DAMAGE_NOESCAPE, dam, _("純粋な魔力の解放", "released pure mana"), -1);
120 msg_print(_("周囲の空間が歪んだ!", "Space warps about you!"));
121 teleport_player(target_ptr, damroll(10, 10), TELEPORT_PASSIVE);
123 (*count) += activate_hi_summon(target_ptr, target_ptr->y, target_ptr->x, FALSE);
129 msg_print(_("エネルギーのうねりを感じた!", "You feel a surge of energy!"));
130 wall_breaker(target_ptr);
132 project(target_ptr, 0, 7, target_ptr->y, target_ptr->x, 50, GF_KILL_WALL, flg, -1);
133 take_hit(target_ptr, DAMAGE_NOESCAPE, 50, _("エネルギーのうねり", "surge of energy"), -1);
144 aggravate_monsters(target_ptr, 0);
151 (*count) += activate_hi_summon(target_ptr, target_ptr->y, target_ptr->x, FALSE);
159 (*count) += summon_specific(target_ptr, 0, target_ptr->y, target_ptr->x, floor_ptr->dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
166 msg_print(_("経験値が体から吸い取られた気がする!", "You feel your experience draining away..."));
167 lose_exp(target_ptr, target_ptr->exp / 16);
176 bool is_statue = stop_ty;
177 is_statue |= target_ptr->free_act && (randint1(125) < target_ptr->skill_sav);
178 is_statue |= target_ptr->pclass == CLASS_BERSERKER;
180 msg_print(_("彫像になった気分だ!", "You feel like a statue!"));
181 if (target_ptr->free_act)
182 set_paralyzed(target_ptr, target_ptr->paralyzed + randint1(3));
184 set_paralyzed(target_ptr, target_ptr->paralyzed + randint1(13));
195 (void)do_dec_stat(target_ptr, randint0(6));
200 msg_print(_("ほえ?私は誰?ここで何してる?", "Huh? Who am I? What am I doing here?"));
201 lose_all_info(target_ptr);
206 if ((floor_ptr->dun_level > 65) && !stop_ty) {
207 (*count) += summon_cyber(target_ptr, -1, target_ptr->y, target_ptr->x);
216 for (int i = 0; i < A_MAX; i++) {
217 bool is_first_dec_stat = TRUE;
218 while (is_first_dec_stat || one_in_(2)) {
219 is_first_dec_stat = FALSE;
220 (void)do_dec_stat(target_ptr, i);
230 * @brief 『一つの指輪』の効果処理 /
231 * Hack -- activate the ring of power
232 * @param caster_ptr プレーヤーへの参照ポインタ
236 void ring_of_power(player_type *caster_ptr, DIRECTION dir)
238 switch (randint1(10)) {
241 msg_print(_("あなたは悪性のオーラに包み込まれた。", "You are surrounded by a malignant aura."));
244 /* Decrease all stats (permanently) */
245 (void)dec_stat(caster_ptr, A_STR, 50, TRUE);
246 (void)dec_stat(caster_ptr, A_INT, 50, TRUE);
247 (void)dec_stat(caster_ptr, A_WIS, 50, TRUE);
248 (void)dec_stat(caster_ptr, A_DEX, 50, TRUE);
249 (void)dec_stat(caster_ptr, A_CON, 50, TRUE);
250 (void)dec_stat(caster_ptr, A_CHR, 50, TRUE);
252 /* Lose some experience (permanently) */
253 caster_ptr->exp -= (caster_ptr->exp / 4);
254 caster_ptr->max_exp -= (caster_ptr->exp / 4);
255 check_experience(caster_ptr);
261 msg_print(_("あなたは強力なオーラに包み込まれた。", "You are surrounded by a powerful aura."));
262 dispel_monsters(caster_ptr, 1000);
269 fire_ball(caster_ptr, GF_MANA, dir, 600, 3);
277 fire_bolt(caster_ptr, GF_MANA, dir, 500);
284 * @brief 運命の輪、並びにカオス的な効果の発動
285 * @param caster_ptr プレーヤーへの参照ポインタ
286 * @param spell ランダムな効果を選択するための基準ID
289 void wild_magic(player_type *caster_ptr, int spell)
291 int type = SUMMON_MOLD + randint0(6);
292 if (type < SUMMON_MOLD)
294 else if (type > SUMMON_MIMIC)
297 floor_type *floor_ptr = caster_ptr->current_floor_ptr;
298 switch (randint1(spell) + randint1(8) + 1) {
302 teleport_player(caster_ptr, 10, TELEPORT_PASSIVE);
307 teleport_player(caster_ptr, 100, TELEPORT_PASSIVE);
311 teleport_player(caster_ptr, 200, TELEPORT_PASSIVE);
316 unlite_area(caster_ptr, 10, 3);
321 lite_area(caster_ptr, damroll(2, 3), 2);
324 destroy_doors_touch(caster_ptr);
328 wall_breaker(caster_ptr);
331 sleep_monsters_touch(caster_ptr);
335 trap_creation(caster_ptr, caster_ptr->y, caster_ptr->x);
339 door_creation(caster_ptr, caster_ptr->y, caster_ptr->x);
344 aggravate_monsters(caster_ptr, 0);
347 earthquake(caster_ptr, caster_ptr->y, caster_ptr->x, 5, 0);
351 (void)gain_mutation(caster_ptr, 0);
355 apply_disenchant(caster_ptr, 1);
358 lose_all_info(caster_ptr);
361 fire_ball(caster_ptr, GF_CHAOS, 0, spell + 5, 1 + (spell / 10));
364 wall_stone(caster_ptr);
368 for (int counter = 0; counter < 8; counter++) {
369 (void)summon_specific(caster_ptr, 0, caster_ptr->y, caster_ptr->x, (floor_ptr->dun_level * 3) / 2, type, (PM_ALLOW_GROUP | PM_NO_PET));
375 activate_hi_summon(caster_ptr, caster_ptr->y, caster_ptr->x, FALSE);
378 (void)summon_cyber(caster_ptr, -1, caster_ptr->y, caster_ptr->x);
382 (void)activate_ty_curse(caster_ptr, FALSE, &count);
389 * @brief 「ワンダー」のランダムな効果を決定して処理する。
390 * @param caster_ptr プレーヤーへの参照ポインタ
394 * This spell should become more useful (more controlled) as the\n
395 * player gains experience levels. Thus, add 1/5 of the player's\n
396 * level to the die roll. This eliminates the worst effects later on,\n
397 * while keeping the results quite random. It also allows some potent\n
398 * effects only at high level.
400 void cast_wonder(player_type *caster_ptr, DIRECTION dir)
402 PLAYER_LEVEL plev = caster_ptr->lev;
403 int die = randint1(100) + plev / 5;
404 int vir = virtue_number(caster_ptr, V_CHANCE);
406 if (caster_ptr->virtues[vir - 1] > 0) {
407 while (randint1(400) < caster_ptr->virtues[vir - 1])
410 while (randint1(400) < (0 - caster_ptr->virtues[vir - 1]))
416 chg_virtue(caster_ptr, V_CHANCE, 1);
420 msg_print(_("あなたは力がみなぎるのを感じた!", "You feel a surge of power!"));
424 clone_monster(caster_ptr, dir);
429 speed_monster(caster_ptr, dir, plev);
434 heal_monster(caster_ptr, dir, damroll(4, 6));
439 poly_monster(caster_ptr, dir, plev);
444 fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_MISSILE, dir, damroll(3 + ((plev - 1) / 5), 4));
449 confuse_monster(caster_ptr, dir, plev);
454 fire_ball(caster_ptr, GF_POIS, dir, 20 + (plev / 2), 3);
459 (void)lite_line(caster_ptr, dir, damroll(6, 8));
464 fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_ELEC, dir, damroll(3 + ((plev - 5) / 4), 8));
469 fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr) - 10, GF_COLD, dir, damroll(5 + ((plev - 5) / 4), 8));
474 fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr), GF_ACID, dir, damroll(6 + ((plev - 5) / 4), 8));
479 fire_bolt_or_beam(caster_ptr, beam_chance(caster_ptr), GF_FIRE, dir, damroll(8 + ((plev - 5) / 4), 8));
484 hypodynamic_bolt(caster_ptr, dir, 75);
489 fire_ball(caster_ptr, GF_ELEC, dir, 30 + plev / 2, 2);
494 fire_ball(caster_ptr, GF_ACID, dir, 40 + plev, 2);
499 fire_ball(caster_ptr, GF_ICE, dir, 70 + plev, 3);
504 fire_ball(caster_ptr, GF_FIRE, dir, 80 + plev, 3);
509 hypodynamic_bolt(caster_ptr, dir, 100 + plev);
514 earthquake(caster_ptr, caster_ptr->y, caster_ptr->x, 12, 0);
519 (void)destroy_area(caster_ptr, caster_ptr->y, caster_ptr->x, 13 + randint0(5), FALSE);
524 symbol_genocide(caster_ptr, plev + 50, TRUE);
529 dispel_monsters(caster_ptr, 120);
533 dispel_monsters(caster_ptr, 150);
534 slow_monsters(caster_ptr, plev);
535 sleep_monsters(caster_ptr, plev);
536 hp_player(caster_ptr, 300);