2 * @brief レイシャルと突然変異の技能処理 / Racial powers (and mutations)
5 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
6 * This software may be copied and distributed for educational, research,\n
7 * and not for profit purposes provided that this copyright and statement\n
8 * are included in all such copies. Other copyrights may also apply.\n
9 * 2014 Deskull rearranged comment for Doxygen. \n
12 #include "racial/racial-switcher.h"
13 #include "action/action-limited.h"
14 #include "action/mutation-execution.h"
15 #include "cmd-action/cmd-mane.h"
16 #include "cmd-action/cmd-spell.h"
17 #include "cmd-item/cmd-magiceat.h"
18 #include "cmd-item/cmd-zapwand.h"
19 #include "core/player-redraw-types.h"
20 #include "core/player-update-types.h"
21 #include "core/stuff-handler.h"
22 #include "core/window-redrawer.h"
23 #include "effect/spells-effect-util.h"
24 #include "game-option/text-display-options.h"
25 #include "inventory/inventory-slot-types.h"
26 #include "io/command-repeater.h"
27 #include "io/input-key-acceptor.h"
28 #include "io/input-key-requester.h"
29 #include "main/sound-of-music.h"
30 #include "melee/melee-postprocess.h"
31 #include "mind/mind-archer.h"
32 #include "mind/mind-cavalry.h"
33 #include "mind/mind-elementalist.h"
34 #include "mind/mind-force-trainer.h"
35 #include "mind/mind-hobbit.h"
36 #include "mind/mind-mage.h"
37 #include "mind/mind-magic-eater.h"
38 #include "mind/mind-mirror-master.h"
39 #include "mind/mind-monk.h"
40 #include "mind/mind-ninja.h"
41 #include "mind/mind-priest.h"
42 #include "mind/mind-samurai.h"
43 #include "mind/mind-warrior-mage.h"
44 #include "mind/mind-warrior.h"
45 #include "mind/monk-attack.h"
46 #include "mind/stances-table.h"
47 #include "mutation/mutation-flag-types.h"
48 #include "object/item-tester-hooker.h"
49 #include "player-info/class-info.h"
50 #include "player-info/equipment-info.h"
51 #include "player-info/race-info.h"
52 #include "player-info/race-types.h"
53 #include "player-status/player-energy.h"
54 #include "player-status/player-hand-types.h"
55 #include "player/attack-defense-types.h"
56 #include "player/player-damage.h"
57 #include "player/player-status.h"
58 #include "racial/racial-android.h"
59 #include "racial/racial-balrog.h"
60 #include "racial/racial-draconian.h"
61 #include "racial/racial-kutar.h"
62 #include "racial/racial-vampire.h"
63 #include "realm/realm-names-table.h"
64 #include "spell-kind/spells-beam.h"
65 #include "spell-kind/spells-detection.h"
66 #include "spell-kind/spells-grid.h"
67 #include "spell-kind/spells-launcher.h"
68 #include "spell-kind/spells-neighbor.h"
69 #include "spell-kind/spells-perception.h"
70 #include "spell-kind/spells-sight.h"
71 #include "spell-kind/spells-teleport.h"
72 #include "spell-kind/spells-world.h"
73 #include "spell-realm/spells-hex.h"
74 #include "spell-realm/spells-song.h"
75 #include "spell/spells-status.h"
76 #include "status/action-setter.h"
77 #include "status/bad-status-setter.h"
78 #include "status/buff-setter.h"
79 #include "status/experience.h"
80 #include "system/player-type-definition.h"
81 #include "target/target-getter.h"
82 #include "util/bit-flags-calculator.h"
83 #include "util/int-char-converter.h"
84 #include "view/display-messages.h"
86 bool switch_class_racial_execution(PlayerType *player_ptr, const int32_t command)
89 switch (player_ptr->pclass) {
90 case PlayerClassType::WARRIOR:
91 return sword_dancing(player_ptr);
92 case PlayerClassType::HIGH_MAGE:
93 if (player_ptr->realm1 == REALM_HEX) {
94 auto retval = SpellHex(player_ptr).stop_spells_with_selection();
96 PlayerEnergy(player_ptr).set_player_turn_energy(10);
103 case PlayerClassType::MAGE:
104 case PlayerClassType::SORCERER:
105 return eat_magic(player_ptr, player_ptr->lev * 2);
106 case PlayerClassType::PRIEST:
107 if (!is_good_realm(player_ptr->realm1)) {
108 (void)dispel_monsters(player_ptr, player_ptr->lev * 4);
109 turn_monsters(player_ptr, player_ptr->lev * 4);
110 banish_monsters(player_ptr, player_ptr->lev * 4);
114 return bless_weapon(player_ptr);
115 case PlayerClassType::ROGUE:
116 return hit_and_away(player_ptr);
117 case PlayerClassType::RANGER:
118 case PlayerClassType::SNIPER:
119 msg_print(_("敵を調査した...", "You examine your foes..."));
122 case PlayerClassType::PALADIN:
123 if (!get_aim_dir(player_ptr, &dir))
126 fire_beam(player_ptr, is_good_realm(player_ptr->realm1) ? AttributeType::HOLY_FIRE : AttributeType::HELL_FIRE, dir, player_ptr->lev * 3);
128 case PlayerClassType::WARRIOR_MAGE:
130 return comvert_hp_to_mp(player_ptr);
131 else if (command == -4)
132 return comvert_mp_to_hp(player_ptr);
135 case PlayerClassType::CHAOS_WARRIOR:
136 return confusing_light(player_ptr);
137 case PlayerClassType::MONK:
138 if (none_bits(empty_hands(player_ptr, true), EMPTY_HAND_MAIN)) {
139 msg_print(_("素手じゃないとできません。", "You need to be barehanded."));
143 if (player_ptr->riding) {
144 msg_print(_("乗馬中はできません。", "You need to get off a pet."));
149 if (!choose_monk_stance(player_ptr))
152 set_bits(player_ptr->update, PU_BONUS);
157 return double_attack(player_ptr);
160 case PlayerClassType::MINDCRAFTER:
161 case PlayerClassType::FORCETRAINER:
162 return clear_mind(player_ptr);
163 case PlayerClassType::TOURIST:
165 if (!get_aim_dir(player_ptr, &dir))
169 fire_beam(player_ptr, AttributeType::PHOTO, dir, 1);
173 return (command != -4) || identify_fully(player_ptr, false);
174 case PlayerClassType::IMITATOR:
175 handle_stuff(player_ptr);
176 return do_cmd_mane(player_ptr, true);
177 case PlayerClassType::BEASTMASTER:
179 if (!get_aim_dir(player_ptr, &dir))
182 (void)fire_ball_hide(player_ptr, AttributeType::CHARM_LIVING, dir, player_ptr->lev, 0);
187 project_all_los(player_ptr, AttributeType::CHARM_LIVING, player_ptr->lev);
190 case PlayerClassType::ARCHER:
191 return create_ammo(player_ptr);
192 case PlayerClassType::MAGIC_EATER:
194 return import_magic_device(player_ptr);
196 return (command != -4) || (!cmd_limit_cast(player_ptr) && do_cmd_magic_eater(player_ptr, false, true));
197 case PlayerClassType::BARD:
198 if ((get_singing_song_effect(player_ptr) == 0) && (get_interrupting_song_effect(player_ptr) == 0))
201 stop_singing(player_ptr);
202 PlayerEnergy(player_ptr).set_player_turn_energy(10);
204 case PlayerClassType::RED_MAGE:
205 if (cmd_limit_cast(player_ptr))
208 handle_stuff(player_ptr);
209 if (!do_cmd_cast(player_ptr))
212 if (!player_ptr->paralyzed && !cmd_limit_cast(player_ptr)) {
213 handle_stuff(player_ptr);
215 (void)do_cmd_cast(player_ptr);
218 case PlayerClassType::SAMURAI:
220 concentration(player_ptr);
227 if (!has_melee_weapon(player_ptr, INVEN_MAIN_HAND) && !has_melee_weapon(player_ptr, INVEN_SUB_HAND)) {
228 msg_print(_("武器を持たないといけません。", "You need to wield a weapon."));
232 if (!choose_samurai_stance(player_ptr))
235 set_bits(player_ptr->update, PU_BONUS);
237 case PlayerClassType::BLUE_MAGE:
238 set_action(player_ptr, player_ptr->action == ACTION_LEARN ? ACTION_NONE : ACTION_LEARN);
239 PlayerEnergy(player_ptr).reset_player_turn();
241 case PlayerClassType::CAVALRY:
242 return rodeo(player_ptr);
243 case PlayerClassType::BERSERKER:
244 return recall_player(player_ptr, randint0(21) + 15);
245 case PlayerClassType::SMITH:
246 if (player_ptr->lev <= 29)
247 return ident_spell(player_ptr, true);
249 return identify_fully(player_ptr, true);
250 case PlayerClassType::MIRROR_MASTER:
252 remove_all_mirrors(player_ptr, true);
257 return mirror_concentration(player_ptr);
260 case PlayerClassType::NINJA:
261 return hayagake(player_ptr);
262 case PlayerClassType::ELEMENTALIST:
264 return clear_mind(player_ptr);
266 return switch_element_execution(player_ptr);
273 bool switch_mimic_racial_execution(PlayerType *player_ptr)
275 switch (player_ptr->mimic_form) {
276 case MimicKindType::DEMON:
277 case MimicKindType::DEMON_LORD: {
278 return demonic_breath(player_ptr);
280 case MimicKindType::VAMPIRE:
281 vampirism(player_ptr);
288 bool switch_race_racial_execution(PlayerType *player_ptr, const int32_t command)
291 switch (player_ptr->prace) {
292 case PlayerRaceType::DWARF:
293 msg_print(_("周囲を調べた。", "You examine your surroundings."));
294 (void)detect_traps(player_ptr, DETECT_RAD_DEFAULT, true);
295 (void)detect_doors(player_ptr, DETECT_RAD_DEFAULT);
296 (void)detect_stairs(player_ptr, DETECT_RAD_DEFAULT);
298 case PlayerRaceType::HOBBIT:
299 return create_ration(player_ptr);
300 case PlayerRaceType::GNOME:
301 msg_print(_("パッ!", "Blink!"));
302 teleport_player(player_ptr, 10, TELEPORT_SPONTANEOUS);
304 case PlayerRaceType::HALF_ORC:
305 msg_print(_("勇気を出した。", "You play tough."));
306 (void)BadStatusSetter(player_ptr).afraidness(0);
308 case PlayerRaceType::HALF_TROLL:
309 msg_print(_("うがぁぁ!", "RAAAGH!"));
310 (void)berserk(player_ptr, 10 + randint1(player_ptr->lev));
312 case PlayerRaceType::AMBERITE:
314 msg_print(_("あなたは歩き周り始めた。", "You start walking around. "));
315 reserve_alter_reality(player_ptr, randint0(21) + 15);
322 msg_print(_("あなたは「パターン」を心に描いてその上を歩いた...", "You picture the Pattern in your mind and walk it..."));
323 (void)true_healing(player_ptr, 0);
324 (void)restore_all_status(player_ptr);
325 (void)restore_level(player_ptr);
327 case PlayerRaceType::BARBARIAN:
328 msg_print(_("うぉぉおお!", "Raaagh!"));
329 (void)berserk(player_ptr, 10 + randint1(player_ptr->lev));
331 case PlayerRaceType::HALF_OGRE:
332 msg_print(_("爆発のルーンを慎重に仕掛けた...", "You carefully set an explosive rune..."));
333 (void)create_rune_explosion(player_ptr, player_ptr->y, player_ptr->x);
335 case PlayerRaceType::HALF_GIANT:
336 if (!get_aim_dir(player_ptr, &dir))
339 (void)wall_to_mud(player_ptr, dir, 20 + randint1(30));
341 case PlayerRaceType::HALF_TITAN:
342 msg_print(_("敵を調査した...", "You examine your foes..."));
343 (void)probing(player_ptr);
345 case PlayerRaceType::CYCLOPS:
346 if (!get_aim_dir(player_ptr, &dir))
349 msg_print(_("巨大な岩を投げた。", "You throw a huge boulder."));
350 (void)fire_bolt(player_ptr, AttributeType::MISSILE, dir, (3 * player_ptr->lev) / 2);
352 case PlayerRaceType::YEEK:
353 if (!get_aim_dir(player_ptr, &dir))
356 stop_mouth(player_ptr);
357 msg_print(_("身の毛もよだつ叫び声を上げた!", "You make a horrible scream!"));
358 (void)fear_monster(player_ptr, dir, player_ptr->lev);
360 case PlayerRaceType::KLACKON:
361 if (!get_aim_dir(player_ptr, &dir))
364 stop_mouth(player_ptr);
365 msg_print(_("酸を吐いた。", "You spit acid."));
366 if (player_ptr->lev < 25)
367 (void)fire_bolt(player_ptr, AttributeType::ACID, dir, player_ptr->lev);
369 (void)fire_ball(player_ptr, AttributeType::ACID, dir, player_ptr->lev, 2);
372 case PlayerRaceType::KOBOLD:
373 if (!get_aim_dir(player_ptr, &dir))
376 msg_print(_("毒のダーツを投げた。", "You throw a poisoned dart."));
377 (void)fire_bolt(player_ptr, AttributeType::POIS, dir, player_ptr->lev);
379 case PlayerRaceType::NIBELUNG:
380 msg_print(_("周囲を調査した。", "You examine your surroundings."));
381 (void)detect_traps(player_ptr, DETECT_RAD_DEFAULT, true);
382 (void)detect_doors(player_ptr, DETECT_RAD_DEFAULT);
383 (void)detect_stairs(player_ptr, DETECT_RAD_DEFAULT);
385 case PlayerRaceType::DARK_ELF:
386 if (!get_aim_dir(player_ptr, &dir))
389 msg_print(_("マジック・ミサイルを放った。", "You cast a magic missile."));
390 (void)fire_bolt_or_beam(player_ptr, 10, AttributeType::MISSILE, dir, damroll(3 + ((player_ptr->lev - 1) / 5), 4));
392 case PlayerRaceType::DRACONIAN:
393 return draconian_breath(player_ptr);
394 case PlayerRaceType::MIND_FLAYER:
395 if (!get_aim_dir(player_ptr, &dir))
398 msg_print(_("あなたは集中し、目が赤く輝いた...", "You concentrate and your eyes glow red..."));
399 (void)fire_bolt(player_ptr, AttributeType::PSI, dir, player_ptr->lev);
401 case PlayerRaceType::IMP:
402 if (!get_aim_dir(player_ptr, &dir))
405 if (player_ptr->lev >= 30) {
406 msg_print(_("ファイア・ボールを放った。", "You cast a ball of fire."));
407 (void)fire_ball(player_ptr, AttributeType::FIRE, dir, player_ptr->lev, 2);
409 msg_print(_("ファイア・ボルトを放った。", "You cast a bolt of fire."));
410 (void)fire_bolt(player_ptr, AttributeType::FIRE, dir, player_ptr->lev);
414 case PlayerRaceType::GOLEM:
415 (void)set_shield(player_ptr, randint1(20) + 30, false);
417 case PlayerRaceType::SKELETON:
418 case PlayerRaceType::ZOMBIE:
419 msg_print(_("あなたは失ったエネルギーを取り戻そうと試みた。", "You attempt to restore your lost energies."));
420 (void)restore_level(player_ptr);
422 case PlayerRaceType::VAMPIRE:
423 (void)vampirism(player_ptr);
425 case PlayerRaceType::SPECTRE:
426 if (!get_aim_dir(player_ptr, &dir))
429 stop_mouth(player_ptr);
430 msg_print(_("あなたはおどろおどろしい叫び声をあげた!", "You emit an eldritch howl!"));
431 (void)fear_monster(player_ptr, dir, player_ptr->lev);
433 case PlayerRaceType::SPRITE:
434 msg_print(_("あなたは魔法の粉を投げつけた...", "You throw some magic dust..."));
435 if (player_ptr->lev < 25)
436 (void)sleep_monsters_touch(player_ptr);
438 (void)sleep_monsters(player_ptr, player_ptr->lev);
441 case PlayerRaceType::BALROG:
442 return demonic_breath(player_ptr);
443 case PlayerRaceType::KUTAR:
444 (void)set_leveling(player_ptr, randint1(20) + 30, false);
446 case PlayerRaceType::ANDROID:
447 return android_inside_weapon(player_ptr);
449 msg_print(_("この種族は特殊な能力を持っていません。", "This race has no bonus power."));
450 PlayerEnergy(player_ptr).reset_player_turn();