2 * @brief ダイス目により様々な効果を及ぼす魔法の処理
7 #include "spell-kind/spells-random.h"
8 #include "avatar/avatar.h"
9 #include "effect/effect-characteristics.h"
10 #include "effect/effect-processor.h"
11 #include "hpmp/hp-mp-processor.h"
12 #include "monster-floor/monster-summon.h"
13 #include "monster-floor/place-monster-types.h"
14 #include "mutation/mutation-investor-remover.h"
15 #include "player/player-damage.h"
16 #include "spell-kind/earthquake.h"
17 #include "spell-kind/spells-equipment.h"
18 #include "spell-kind/spells-floor.h"
19 #include "spell-kind/spells-genocide.h"
20 #include "spell-kind/spells-launcher.h"
21 #include "spell-kind/spells-lite.h"
22 #include "spell-kind/spells-neighbor.h"
23 #include "spell-kind/spells-sight.h"
24 #include "spell-kind/spells-specific-bolt.h"
25 #include "spell-kind/spells-teleport.h"
26 #include "effect/attribute-types.h"
27 #include "spell/spells-diceroll.h"
28 #include "spell/spells-status.h"
29 #include "spell/spells-summon.h"
30 #include "spell/summon-types.h"
31 #include "status/bad-status-setter.h"
32 #include "status/base-status.h"
33 #include "status/experience.h"
34 #include "system/floor-type-definition.h"
35 #include "system/player-type-definition.h"
36 #include "target/target-getter.h"
37 #include "view/display-messages.h"
41 * @return 作用が実際にあった場合TRUEを返す
43 void call_chaos(player_type *player_ptr)
45 AttributeType hurt_types[31] = { AttributeType::ELEC, AttributeType::POIS, AttributeType::ACID, AttributeType::COLD, AttributeType::FIRE,
46 AttributeType::MISSILE, AttributeType::ARROW, AttributeType::PLASMA, AttributeType::HOLY_FIRE, AttributeType::WATER, AttributeType::LITE,
47 AttributeType::DARK, AttributeType::FORCE, AttributeType::INERTIAL, AttributeType::MANA, AttributeType::METEOR, AttributeType::ICE,
48 AttributeType::CHAOS, AttributeType::NETHER, AttributeType::DISENCHANT, AttributeType::SHARDS, AttributeType::SOUND, AttributeType::NEXUS,
49 AttributeType::CONFUSION, AttributeType::TIME, AttributeType::GRAVITY, AttributeType::ROCKET, AttributeType::NUKE, AttributeType::HELL_FIRE,
50 AttributeType::DISINTEGRATE, AttributeType::PSY_SPEAR };
52 AttributeType chaos_type = hurt_types[randint0(31)];
53 bool line_chaos = false;
59 for (int dummy = 1; dummy < 10; dummy++) {
62 fire_beam(player_ptr, chaos_type, dummy, 150);
64 fire_ball(player_ptr, chaos_type, dummy, 150, 2);
72 fire_ball(player_ptr, chaos_type, 0, 500, 8);
76 if (!get_aim_dir(player_ptr, &dir))
79 fire_beam(player_ptr, chaos_type, dir, 250);
81 fire_ball(player_ptr, chaos_type, dir, 250, 3 + (player_ptr->lev / 35));
85 * @brief TY_CURSE処理発動 / Activate the evil Topi Ylinen curse
86 * @param player_ptr プレイヤーへの参照ポインタ
87 * @param stop_ty 再帰処理停止フラグ
89 * @return 作用が実際にあった場合TRUEを返す
92 * rr9: Stop the nasty things when a Cyberdemon is summoned
93 * or the player gets paralyzed.
96 bool activate_ty_curse(player_type *player_ptr, bool stop_ty, int *count)
98 BIT_FLAGS flg = (PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_JUMP);
99 bool is_first_curse = true;
100 floor_type *floor_ptr = player_ptr->current_floor_ptr;
101 while (is_first_curse || (one_in_(3) && !stop_ty)) {
102 is_first_curse = false;
103 switch (randint1(34)) {
107 msg_print(_("地面が揺れた...", "The ground trembles..."));
108 earthquake(player_ptr, player_ptr->y, player_ptr->x, 5 + randint0(10), 0);
116 HIT_POINT dam = damroll(10, 10);
117 msg_print(_("純粋な魔力の次元への扉が開いた!", "A portal opens to a plane of raw mana!"));
118 project(player_ptr, 0, 8, player_ptr->y, player_ptr->x, dam, AttributeType::MANA, flg);
119 take_hit(player_ptr, DAMAGE_NOESCAPE, dam, _("純粋な魔力の解放", "released pure mana"));
127 msg_print(_("周囲の空間が歪んだ!", "Space warps about you!"));
128 teleport_player(player_ptr, damroll(10, 10), TELEPORT_PASSIVE);
130 (*count) += activate_hi_summon(player_ptr, player_ptr->y, player_ptr->x, false);
136 msg_print(_("エネルギーのうねりを感じた!", "You feel a surge of energy!"));
137 wall_breaker(player_ptr);
139 project(player_ptr, 0, 7, player_ptr->y, player_ptr->x, 50, AttributeType::KILL_WALL, flg);
140 take_hit(player_ptr, DAMAGE_NOESCAPE, 50, _("エネルギーのうねり", "surge of energy"));
151 aggravate_monsters(player_ptr, 0);
158 (*count) += activate_hi_summon(player_ptr, player_ptr->y, player_ptr->x, false);
166 (*count) += summon_specific(
167 player_ptr, 0, player_ptr->y, player_ptr->x, floor_ptr->dun_level, SUMMON_NONE, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
174 msg_print(_("経験値が体から吸い取られた気がする!", "You feel your experience draining away..."));
175 lose_exp(player_ptr, player_ptr->exp / 16);
184 auto is_statue = stop_ty;
185 is_statue |= player_ptr->free_act && (randint1(125) < player_ptr->skill_sav);
186 is_statue |= player_ptr->pclass == PlayerClassType::BERSERKER;
188 msg_print(_("彫像になった気分だ!", "You feel like a statue!"));
189 TIME_EFFECT turns = player_ptr->free_act ? randint1(3) : randint1(13);
190 (void)BadStatusSetter(player_ptr).mod_paralysis(turns);
202 (void)do_dec_stat(player_ptr, randint0(6));
207 msg_print(_("ほえ?私は誰?ここで何してる?", "Huh? Who am I? What am I doing here?"));
208 lose_all_info(player_ptr);
213 if ((floor_ptr->dun_level > 65) && !stop_ty) {
214 (*count) += summon_cyber(player_ptr, -1, player_ptr->y, player_ptr->x);
223 for (int i = 0; i < A_MAX; i++) {
225 (void)do_dec_stat(player_ptr, i);
235 * @brief 運命の輪、並びにカオス的な効果の発動
236 * @param player_ptr プレイヤーへの参照ポインタ
237 * @param spell ランダムな効果を選択するための基準ID
239 void wild_magic(player_type *player_ptr, int spell)
241 int type = SUMMON_MOLD + randint0(6);
242 if (type < SUMMON_MOLD)
244 else if (type > SUMMON_MIMIC)
247 floor_type *floor_ptr = player_ptr->current_floor_ptr;
248 switch (randint1(spell) + randint1(8) + 1) {
252 teleport_player(player_ptr, 10, TELEPORT_PASSIVE);
257 teleport_player(player_ptr, 100, TELEPORT_PASSIVE);
261 teleport_player(player_ptr, 200, TELEPORT_PASSIVE);
266 unlite_area(player_ptr, 10, 3);
271 lite_area(player_ptr, damroll(2, 3), 2);
274 destroy_doors_touch(player_ptr);
278 wall_breaker(player_ptr);
281 sleep_monsters_touch(player_ptr);
285 trap_creation(player_ptr, player_ptr->y, player_ptr->x);
289 door_creation(player_ptr, player_ptr->y, player_ptr->x);
294 aggravate_monsters(player_ptr, 0);
297 earthquake(player_ptr, player_ptr->y, player_ptr->x, 5, 0);
301 (void)gain_mutation(player_ptr, 0);
305 apply_disenchant(player_ptr, 1);
308 lose_all_info(player_ptr);
311 fire_ball(player_ptr, AttributeType::CHAOS, 0, spell + 5, 1 + (spell / 10));
314 wall_stone(player_ptr);
318 for (int counter = 0; counter < 8; counter++) {
319 (void)summon_specific(
320 player_ptr, 0, player_ptr->y, player_ptr->x, (floor_ptr->dun_level * 3) / 2, i2enum<summon_type>(type), (PM_ALLOW_GROUP | PM_NO_PET));
326 activate_hi_summon(player_ptr, player_ptr->y, player_ptr->x, false);
329 (void)summon_cyber(player_ptr, -1, player_ptr->y, player_ptr->x);
333 (void)activate_ty_curse(player_ptr, false, &count);
340 * @brief 「ワンダー」のランダムな効果を決定して処理する。
341 * @param player_ptr プレイヤーへの参照ポインタ
344 * This spell should become more useful (more controlled) as the\n
345 * player gains experience levels. Thus, add 1/5 of the player's\n
346 * level to the die roll. This eliminates the worst effects later on,\n
347 * while keeping the results quite random. It also allows some potent\n
348 * effects only at high level.
350 void cast_wonder(player_type *player_ptr, DIRECTION dir)
352 PLAYER_LEVEL plev = player_ptr->lev;
353 int die = randint1(100) + plev / 5;
354 int vir = virtue_number(player_ptr, V_CHANCE);
356 if (player_ptr->virtues[vir - 1] > 0) {
357 while (randint1(400) < player_ptr->virtues[vir - 1])
360 while (randint1(400) < (0 - player_ptr->virtues[vir - 1]))
366 chg_virtue(player_ptr, V_CHANCE, 1);
370 msg_print(_("あなたは力がみなぎるのを感じた!", "You feel a surge of power!"));
374 clone_monster(player_ptr, dir);
379 speed_monster(player_ptr, dir, plev);
384 heal_monster(player_ptr, dir, damroll(4, 6));
389 poly_monster(player_ptr, dir, plev);
394 fire_bolt_or_beam(player_ptr, beam_chance(player_ptr) - 10, AttributeType::MISSILE, dir, damroll(3 + ((plev - 1) / 5), 4));
399 confuse_monster(player_ptr, dir, plev);
404 fire_ball(player_ptr, AttributeType::POIS, dir, 20 + (plev / 2), 3);
409 (void)lite_line(player_ptr, dir, damroll(6, 8));
414 fire_bolt_or_beam(player_ptr, beam_chance(player_ptr) - 10, AttributeType::ELEC, dir, damroll(3 + ((plev - 5) / 4), 8));
419 fire_bolt_or_beam(player_ptr, beam_chance(player_ptr) - 10, AttributeType::COLD, dir, damroll(5 + ((plev - 5) / 4), 8));
424 fire_bolt_or_beam(player_ptr, beam_chance(player_ptr), AttributeType::ACID, dir, damroll(6 + ((plev - 5) / 4), 8));
429 fire_bolt_or_beam(player_ptr, beam_chance(player_ptr), AttributeType::FIRE, dir, damroll(8 + ((plev - 5) / 4), 8));
434 hypodynamic_bolt(player_ptr, dir, 75);
439 fire_ball(player_ptr, AttributeType::ELEC, dir, 30 + plev / 2, 2);
444 fire_ball(player_ptr, AttributeType::ACID, dir, 40 + plev, 2);
449 fire_ball(player_ptr, AttributeType::ICE, dir, 70 + plev, 3);
454 fire_ball(player_ptr, AttributeType::FIRE, dir, 80 + plev, 3);
459 hypodynamic_bolt(player_ptr, dir, 100 + plev);
464 earthquake(player_ptr, player_ptr->y, player_ptr->x, 12, 0);
469 (void)destroy_area(player_ptr, player_ptr->y, player_ptr->x, 13 + randint0(5), false);
474 symbol_genocide(player_ptr, plev + 50, true);
479 dispel_monsters(player_ptr, 120);
483 dispel_monsters(player_ptr, 150);
484 slow_monsters(player_ptr, plev);
485 sleep_monsters(player_ptr, plev);
486 hp_player(player_ptr, 300);