OSDN Git Service

Merge pull request #36 from taotao54321/fix-wrong-evasion-message
[hengbandforosx/hengbandosx.git] / src / racial / racial-switcher.c
1 /*!
2  * @brief レイシャルと突然変異の技能処理 / Racial powers (and mutations)
3  * @date 2014/01/08
4  * @author
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
10  */
11
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-force-trainer.h"
34 #include "mind/mind-hobbit.h"
35 #include "mind/mind-mage.h"
36 #include "mind/mind-magic-eater.h"
37 #include "mind/mind-mirror-master.h"
38 #include "mind/mind-monk.h"
39 #include "mind/mind-ninja.h"
40 #include "mind/mind-priest.h"
41 #include "mind/mind-samurai.h"
42 #include "mind/mind-warrior-mage.h"
43 #include "mind/mind-warrior.h"
44 #include "mind/monk-attack.h"
45 #include "mind/stances-table.h"
46 #include "mutation/mutation-flag-types.h"
47 #include "object/item-tester-hooker.h"
48 #include "player/attack-defense-types.h"
49 #include "player/player-class.h"
50 #include "player/player-damage.h"
51 #include "player/player-race-types.h"
52 #include "player/player-race.h"
53 #include "player/player-status.h"
54 #include "racial/racial-android.h"
55 #include "racial/racial-balrog.h"
56 #include "racial/racial-draconian.h"
57 #include "racial/racial-kutar.h"
58 #include "racial/racial-vampire.h"
59 #include "realm/realm-names-table.h"
60 #include "spell-kind/spells-beam.h"
61 #include "spell-kind/spells-detection.h"
62 #include "spell-kind/spells-grid.h"
63 #include "spell-kind/spells-launcher.h"
64 #include "spell-kind/spells-neighbor.h"
65 #include "spell-kind/spells-perception.h"
66 #include "spell-kind/spells-sight.h"
67 #include "spell-kind/spells-teleport.h"
68 #include "spell-kind/spells-world.h"
69 #include "spell-realm/spells-hex.h"
70 #include "spell/spell-types.h"
71 #include "spell/spells-status.h"
72 #include "status/action-setter.h"
73 #include "status/bad-status-setter.h"
74 #include "status/buff-setter.h"
75 #include "status/experience.h"
76 #include "target/target-getter.h"
77 #include "util/int-char-converter.h"
78 #include "view/display-messages.h"
79
80 bool switch_class_racial_execution(player_type *creature_ptr, const s32b command)
81 {
82     DIRECTION dir = 0;
83     switch (creature_ptr->pclass) {
84     case CLASS_WARRIOR:
85         return sword_dancing(creature_ptr);
86     case CLASS_HIGH_MAGE:
87         if (creature_ptr->realm1 == REALM_HEX) {
88             bool retval = stop_hex_spell(creature_ptr);
89             if (retval)
90                 creature_ptr->energy_use = 10;
91
92             return retval;
93         }
94
95         /* Fall through */
96     case CLASS_MAGE:
97     case CLASS_SORCERER:
98         return eat_magic(creature_ptr, creature_ptr->lev * 2);
99     case CLASS_PRIEST:
100         if (!is_good_realm(creature_ptr->realm1)) {
101             (void)dispel_monsters(creature_ptr, creature_ptr->lev * 4);
102             turn_monsters(creature_ptr, creature_ptr->lev * 4);
103             banish_monsters(creature_ptr, creature_ptr->lev * 4);
104             return TRUE;
105         }
106
107         return bless_weapon(creature_ptr);
108     case CLASS_ROGUE:
109         return hit_and_away(creature_ptr);
110     case CLASS_RANGER:
111     case CLASS_SNIPER:
112         msg_print(_("敵を調査した...", "You examine your foes..."));
113         probing(creature_ptr);
114         return TRUE;
115     case CLASS_PALADIN:
116         if (!get_aim_dir(creature_ptr, &dir))
117             return FALSE;
118
119         fire_beam(creature_ptr, is_good_realm(creature_ptr->realm1) ? GF_HOLY_FIRE : GF_HELL_FIRE, dir, creature_ptr->lev * 3);
120         return TRUE;
121     case CLASS_WARRIOR_MAGE:
122         if (command == -3)
123             return comvert_hp_to_mp(creature_ptr);
124         else if (command == -4)
125             return comvert_mp_to_hp(creature_ptr);
126
127         return TRUE;
128     case CLASS_CHAOS_WARRIOR:
129         return confusing_light(creature_ptr);
130     case CLASS_MONK:
131         if (!(empty_hands(creature_ptr, TRUE) & EMPTY_HAND_MAIN)) {
132             msg_print(_("素手じゃないとできません。", "You need to be barehanded."));
133             return FALSE;
134         }
135
136         if (creature_ptr->riding) {
137             msg_print(_("乗馬中はできません。", "You need to get off a pet."));
138             return FALSE;
139         }
140
141         if (command == -3) {
142             if (!choose_monk_stance(creature_ptr))
143                 return FALSE;
144
145             creature_ptr->update |= PU_BONUS;
146             return TRUE;
147         }
148
149         if (command == -4)
150             return double_attack(creature_ptr);
151
152         return TRUE;
153     case CLASS_MINDCRAFTER:
154     case CLASS_FORCETRAINER:
155         return clear_mind(creature_ptr);
156     case CLASS_TOURIST:
157         if (command == -3) {
158             if (!get_aim_dir(creature_ptr, &dir))
159                 return FALSE;
160
161             project_length = 1;
162             fire_beam(creature_ptr, GF_PHOTO, dir, 1);
163             return TRUE;
164         }
165
166         return (command != -4) || identify_fully(creature_ptr, FALSE, 0);
167     case CLASS_IMITATOR:
168         handle_stuff(creature_ptr);
169         return do_cmd_mane(creature_ptr, TRUE);
170     case CLASS_BEASTMASTER:
171         if (command == -3) {
172             if (!get_aim_dir(creature_ptr, &dir))
173                 return FALSE;
174
175             (void)fire_ball_hide(creature_ptr, GF_CHARM_LIVING, dir, creature_ptr->lev, 0);
176             return TRUE;
177         }
178
179         if (command == -4)
180             project_all_los(creature_ptr, GF_CHARM_LIVING, creature_ptr->lev);
181
182         return TRUE;
183     case CLASS_ARCHER:
184         return create_ammo(creature_ptr);
185     case CLASS_MAGIC_EATER:
186         if (command == -3)
187             return import_magic_device(creature_ptr);
188
189         return (command != -4) || (!cmd_limit_cast(creature_ptr) && do_cmd_magic_eater(creature_ptr, FALSE, TRUE));
190     case CLASS_BARD:
191         if (!SINGING_SONG_EFFECT(creature_ptr) && !INTERUPTING_SONG_EFFECT(creature_ptr))
192             return FALSE;
193
194         stop_singing(creature_ptr);
195         creature_ptr->energy_use = 10;
196         return TRUE;
197     case CLASS_RED_MAGE:
198         if (cmd_limit_cast(creature_ptr))
199             return FALSE;
200
201         handle_stuff(creature_ptr);
202         do_cmd_cast(creature_ptr);
203         handle_stuff(creature_ptr);
204         if (!creature_ptr->paralyzed && !cmd_limit_cast(creature_ptr))
205             do_cmd_cast(creature_ptr);
206
207         return TRUE;
208     case CLASS_SAMURAI:
209         if (command == -3) {
210             concentration(creature_ptr);
211             return TRUE;
212         }
213
214         if (command != -4)
215             return TRUE;
216
217         if (!has_melee_weapon(creature_ptr, INVEN_MAIN_HAND) && !has_melee_weapon(creature_ptr, INVEN_SUB_HAND)) {
218             msg_print(_("武器を持たないといけません。", "You need to wield a weapon."));
219             return FALSE;
220         }
221
222         if (!choose_kata(creature_ptr))
223             return FALSE;
224
225         creature_ptr->update |= PU_BONUS;
226         return TRUE;
227     case CLASS_BLUE_MAGE:
228         set_action(creature_ptr, creature_ptr->action == ACTION_LEARN ? ACTION_NONE : ACTION_LEARN);
229         free_turn(creature_ptr);
230         return TRUE;
231     case CLASS_CAVALRY:
232         return rodeo(creature_ptr);
233     case CLASS_BERSERKER:
234         return recall_player(creature_ptr, randint0(21) + 15);
235     case CLASS_SMITH:
236         if (creature_ptr->lev <= 29)
237             return ident_spell(creature_ptr, TRUE, 0);
238
239         return identify_fully(creature_ptr, TRUE, 0);
240     case CLASS_MIRROR_MASTER:
241         if (command == -3) {
242             remove_all_mirrors(creature_ptr, TRUE);
243             return TRUE;
244         }
245
246         if (command == -4)
247             return mirror_concentration(creature_ptr);
248
249         return TRUE;
250     case CLASS_NINJA:
251         return hayagake(creature_ptr);
252     default:
253         return TRUE;
254     }
255 }
256
257 bool switch_mimic_racial_execution(player_type *creature_ptr)
258 {
259     switch (creature_ptr->mimic_form) {
260     case MIMIC_DEMON:
261     case MIMIC_DEMON_LORD: {
262         return demonic_breath(creature_ptr);
263     }
264     case MIMIC_VAMPIRE:
265         vampirism(creature_ptr);
266         return TRUE;
267     default:
268         return TRUE;
269     }
270 }
271
272 bool switch_race_racial_execution(player_type *creature_ptr, const s32b command)
273 {
274     DIRECTION dir = 0;
275     switch (creature_ptr->prace) {
276     case RACE_DWARF:
277         msg_print(_("周囲を調べた。", "You examine your surroundings."));
278         (void)detect_traps(creature_ptr, DETECT_RAD_DEFAULT, TRUE);
279         (void)detect_doors(creature_ptr, DETECT_RAD_DEFAULT);
280         (void)detect_stairs(creature_ptr, DETECT_RAD_DEFAULT);
281         return TRUE;
282     case RACE_HOBBIT:
283         return create_ration(creature_ptr);
284     case RACE_GNOME:
285         msg_print(_("パッ!", "Blink!"));
286         teleport_player(creature_ptr, 10, TELEPORT_SPONTANEOUS);
287         return TRUE;
288     case RACE_HALF_ORC:
289         msg_print(_("勇気を出した。", "You play tough."));
290         (void)set_afraid(creature_ptr, 0);
291         return TRUE;
292     case RACE_HALF_TROLL:
293         msg_print(_("うがぁぁ!", "RAAAGH!"));
294         (void)berserk(creature_ptr, 10 + randint1(creature_ptr->lev));
295         return TRUE;
296     case RACE_AMBERITE:
297         if (command == -1) {
298             msg_print(_("あなたは歩き周り始めた。", "You start walking around. "));
299             reserve_alter_reality(creature_ptr, randint0(21) + 15);
300             return TRUE;
301         }
302         
303         if (command != -2)
304             return TRUE;
305
306         msg_print(_("あなたは「パターン」を心に描いてその上を歩いた...", "You picture the Pattern in your mind and walk it..."));
307         (void)true_healing(creature_ptr, 0);
308         (void)restore_all_status(creature_ptr);
309         (void)restore_level(creature_ptr);
310         return TRUE;
311     case RACE_BARBARIAN:
312         msg_print(_("うぉぉおお!", "Raaagh!"));
313         (void)berserk(creature_ptr, 10 + randint1(creature_ptr->lev));
314         return TRUE;
315     case RACE_HALF_OGRE:
316         msg_print(_("爆発のルーンを慎重に仕掛けた...", "You carefully set an explosive rune..."));
317         (void)explosive_rune(creature_ptr, creature_ptr->y, creature_ptr->x);
318         return TRUE;
319     case RACE_HALF_GIANT:
320         if (!get_aim_dir(creature_ptr, &dir))
321             return FALSE;
322
323         (void)wall_to_mud(creature_ptr, dir, 20 + randint1(30));
324         return TRUE;
325     case RACE_HALF_TITAN:
326         msg_print(_("敵を調査した...", "You examine your foes..."));
327         (void)probing(creature_ptr);
328         return TRUE;
329     case RACE_CYCLOPS:
330         if (!get_aim_dir(creature_ptr, &dir))
331             return FALSE;
332
333         msg_print(_("巨大な岩を投げた。", "You throw a huge boulder."));
334         (void)fire_bolt(creature_ptr, GF_MISSILE, dir, (3 * creature_ptr->lev) / 2);
335         return TRUE;
336     case RACE_YEEK:
337         if (!get_aim_dir(creature_ptr, &dir))
338             return FALSE;
339
340         stop_mouth(creature_ptr);
341         msg_print(_("身の毛もよだつ叫び声を上げた!", "You make a horrible scream!"));
342         (void)fear_monster(creature_ptr, dir, creature_ptr->lev);
343         return TRUE;
344     case RACE_KLACKON:
345         if (!get_aim_dir(creature_ptr, &dir))
346             return FALSE;
347
348         stop_mouth(creature_ptr);
349         msg_print(_("酸を吐いた。", "You spit acid."));
350         if (creature_ptr->lev < 25)
351             (void)fire_bolt(creature_ptr, GF_ACID, dir, creature_ptr->lev);
352         else
353             (void)fire_ball(creature_ptr, GF_ACID, dir, creature_ptr->lev, 2);
354
355         return TRUE;
356     case RACE_KOBOLD:
357         if (!get_aim_dir(creature_ptr, &dir))
358             return FALSE;
359
360         msg_print(_("毒のダーツを投げた。", "You throw a poisoned dart."));
361         (void)fire_bolt(creature_ptr, GF_POIS, dir, creature_ptr->lev);
362         return TRUE;
363     case RACE_NIBELUNG:
364         msg_print(_("周囲を調査した。", "You examine your surroundings."));
365         (void)detect_traps(creature_ptr, DETECT_RAD_DEFAULT, TRUE);
366         (void)detect_doors(creature_ptr, DETECT_RAD_DEFAULT);
367         (void)detect_stairs(creature_ptr, DETECT_RAD_DEFAULT);
368         return TRUE;
369     case RACE_DARK_ELF:
370         if (!get_aim_dir(creature_ptr, &dir))
371             return FALSE;
372
373         msg_print(_("マジック・ミサイルを放った。", "You cast a magic missile."));
374         (void)fire_bolt_or_beam(creature_ptr, 10, GF_MISSILE, dir, damroll(3 + ((creature_ptr->lev - 1) / 5), 4));
375         return TRUE;
376     case RACE_DRACONIAN:
377         return draconian_breath(creature_ptr);
378     case RACE_MIND_FLAYER:
379         if (!get_aim_dir(creature_ptr, &dir))
380             return FALSE;
381
382         msg_print(_("あなたは集中し、目が赤く輝いた...", "You concentrate and your eyes glow red..."));
383         (void)fire_bolt(creature_ptr, GF_PSI, dir, creature_ptr->lev);
384         return TRUE;
385     case RACE_IMP:
386         if (!get_aim_dir(creature_ptr, &dir))
387             return FALSE;
388
389         if (creature_ptr->lev >= 30) {
390             msg_print(_("ファイア・ボールを放った。", "You cast a ball of fire."));
391             (void)fire_ball(creature_ptr, GF_FIRE, dir, creature_ptr->lev, 2);
392         } else {
393             msg_print(_("ファイア・ボルトを放った。", "You cast a bolt of fire."));
394             (void)fire_bolt(creature_ptr, GF_FIRE, dir, creature_ptr->lev);
395         }
396
397         return TRUE;
398     case RACE_GOLEM:
399         (void)set_shield(creature_ptr, randint1(20) + 30, FALSE);
400         return TRUE;
401     case RACE_SKELETON:
402     case RACE_ZOMBIE:
403         msg_print(_("あなたは失ったエネルギーを取り戻そうと試みた。", "You attempt to restore your lost energies."));
404         (void)restore_level(creature_ptr);
405         return TRUE;
406     case RACE_VAMPIRE:
407         (void)vampirism(creature_ptr);
408         return TRUE;
409     case RACE_SPECTRE:
410         if (!get_aim_dir(creature_ptr, &dir))
411             return FALSE;
412
413         stop_mouth(creature_ptr);
414         msg_print(_("あなたはおどろおどろしい叫び声をあげた!", "You emit an eldritch howl!"));
415         (void)fear_monster(creature_ptr, dir, creature_ptr->lev);
416         return TRUE;
417     case RACE_SPRITE:
418         msg_print(_("あなたは魔法の粉を投げつけた...", "You throw some magic dust..."));
419         if (creature_ptr->lev < 25)
420             (void)sleep_monsters_touch(creature_ptr);
421         else
422             (void)sleep_monsters(creature_ptr, creature_ptr->lev);
423
424         return TRUE;
425     case RACE_BALROG:
426         return demonic_breath(creature_ptr);
427     case RACE_KUTAR:
428         (void)set_leveling(creature_ptr, randint1(20) + 30, FALSE);
429         return TRUE;
430     case RACE_ANDROID:
431         return android_inside_weapon(creature_ptr);
432     default:
433         msg_print(_("この種族は特殊な能力を持っていません。", "This race has no bonus power."));
434         free_turn(creature_ptr);
435         return TRUE;
436     }
437 }