2 * todo Ctrl+C がShift+Q に認識されている。仕様の可能性も高いが要確認
3 * @brief キー入力に応じてゲーム内コマンドを実行する
8 #include "io/input-key-processor.h"
9 #include "autopick/autopick-pref-processor.h"
10 #include "cmd-action/cmd-hissatsu.h"
11 #include "cmd-action/cmd-mane.h"
12 #include "cmd-action/cmd-pet.h"
13 #include "cmd-action/cmd-spell.h"
14 #include "cmd-building/cmd-building.h"
15 #include "cmd-io/cmd-autopick.h"
16 #include "cmd-io/cmd-diary.h"
17 #include "cmd-io/cmd-dump.h"
18 #include "cmd-io/cmd-help.h"
19 #include "cmd-io/cmd-knowledge.h"
20 #include "cmd-io/cmd-lore.h"
21 #include "cmd-io/cmd-macro.h"
22 #include "cmd-io/cmd-process-screen.h"
23 #include "cmd-io/cmd-save.h"
24 #include "cmd-item/cmd-activate.h"
25 #include "cmd-item/cmd-eat.h"
26 #include "cmd-item/cmd-item.h"
27 #include "cmd-item/cmd-magiceat.h"
28 #include "cmd-item/cmd-quaff.h"
29 #include "cmd-item/cmd-read.h"
30 #include "cmd-item/cmd-smith.h"
31 #include "cmd-item/cmd-usestaff.h"
32 #include "cmd-item/cmd-zaprod.h"
33 #include "cmd-item/cmd-zapwand.h"
34 #include "cmd/cmd-basic.h"
35 #include "cmd/cmd-draw.h"
36 #include "cmd/cmd-visuals.h"
37 #include "core/special-internal-keys.h"
38 #include "dungeon/dungeon.h"
39 #include "dungeon/quest.h" // do_cmd_quest() がある。後で移設する.
40 #include "floor/wild.h"
41 #include "game-option/input-options.h"
42 #include "inventory/player-inventory.h"
43 #include "io/chuukei.h"
44 #include "io/files-util.h"
45 #include "io/write-diary.h"
46 #include "knowledge/knowledge-autopick.h"
47 #include "knowledge/knowledge-quests.h"
48 #include "main/sound-definitions-table.h"
49 #include "mind/mind-sniper.h"
50 #include "mind/mind.h" // do_cmd_mind_browse() がある。後で移設する.
51 #include "mind/racial.h" // do_cmd_racial_power() がある。ファイル名変更?.
52 #include "mind/snipe-types.h"
53 #include "mspell/monster-spell.h" // do_cmd_cast_learned() がある。後で移設する.
54 #include "player/player-effects.h"
55 #include "player/player-move.h" // do_cmd_travel() がある。後で移設する.
56 #include "spell/spells-object.h"
57 #include "store/store-util.h"
58 #include "store/store.h" // do_cmd_store() がある。後で移設する.
59 #include "view/display-main-window.h"
60 #include "wizard/wizard-special-process.h"
61 #include "wizard/wizard-spoiler.h"
62 #include "world/world.h"
64 // todo command-processor.h と util.h が相互依存している。後で別な場所に移す.
65 COMMAND_CODE now_message;
68 * @brief ウィザードモードへの導入処理
69 * / Verify use of "wizard" mode
70 * @param player_ptr プレーヤーへの参照ポインタ
71 * @return 実際にウィザードモードへ移行したらTRUEを返す。
73 bool enter_wizard_mode(player_type *player_ptr)
75 if (!current_world_ptr->noscore) {
76 if (!allow_debug_opts || arg_wizard) {
77 msg_print(_("ウィザードモードは許可されていません。 ", "Wizard mode is not permitted."));
81 msg_print(_("ウィザードモードはデバッグと実験のためのモードです。 ", "Wizard mode is for debugging and experimenting."));
82 msg_print(_("一度ウィザードモードに入るとスコアは記録されません。", "The game will not be scored if you enter wizard mode."));
84 if (!get_check(_("本当にウィザードモードに入りたいのですか? ", "Are you sure you want to enter wizard mode? "))) {
89 player_ptr, DIARY_DESCRIPTION, 0, _("ウィザードモードに突入してスコアを残せなくなった。", "gave up recording score to enter wizard mode."));
90 current_world_ptr->noscore |= 0x0002;
97 * @brief デバッグコマンドへの導入処理
98 * / Verify use of "debug" commands
99 * @param player_ptr プレーヤーへの参照ポインタ
100 * @return 実際にデバッグコマンドへ移行したらTRUEを返す。
102 static bool enter_debug_mode(player_type *player_ptr)
104 if (!current_world_ptr->noscore) {
105 if (!allow_debug_opts) {
106 msg_print(_("デバッグコマンドは許可されていません。 ", "Use of debug command is not permitted."));
110 msg_print(_("デバッグ・コマンドはデバッグと実験のためのコマンドです。 ", "The debug commands are for debugging and experimenting."));
111 msg_print(_("デバッグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use debug commands."));
113 if (!get_check(_("本当にデバッグ・コマンドを使いますか? ", "Are you sure you want to use debug commands? "))) {
118 player_ptr, DIARY_DESCRIPTION, 0, _("デバッグモードに突入してスコアを残せなくなった。", "gave up sending score to use debug commands."));
119 current_world_ptr->noscore |= 0x0008;
126 * @brief プレイヤーから受けた入力コマンドの分岐処理。
127 * / Parse and execute the current command Give "Warning" on illegal commands.
128 * @todo Make some "blocks"
131 void process_command(player_type *creature_ptr)
133 COMMAND_CODE old_now_message = now_message;
136 if ((creature_ptr->pclass == CLASS_SNIPER) && (creature_ptr->concent))
137 creature_ptr->reset_concent = TRUE;
139 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
140 switch (command_cmd) {
149 if (current_world_ptr->wizard) {
150 current_world_ptr->wizard = FALSE;
151 msg_print(_("ウィザードモード解除。", "Wizard mode off."));
152 } else if (enter_wizard_mode(creature_ptr)) {
153 current_world_ptr->wizard = TRUE;
154 msg_print(_("ウィザードモード突入。", "Wizard mode on."));
157 creature_ptr->update |= (PU_MONSTERS);
158 creature_ptr->redraw |= (PR_TITLE);
162 if (enter_debug_mode(creature_ptr)) {
163 do_cmd_debug(creature_ptr);
169 if (!creature_ptr->wild_mode)
170 do_cmd_wield(creature_ptr);
175 if (!creature_ptr->wild_mode)
176 do_cmd_takeoff(creature_ptr);
181 if (!creature_ptr->wild_mode)
182 do_cmd_drop(creature_ptr);
187 do_cmd_destroy(creature_ptr);
191 do_cmd_equip(creature_ptr);
195 do_cmd_inven(creature_ptr);
199 do_cmd_observe(creature_ptr);
204 toggle_inventory_equipment(creature_ptr);
208 if (!creature_ptr->wild_mode)
209 do_cmd_alter(creature_ptr);
214 if (!creature_ptr->wild_mode)
215 do_cmd_tunnel(creature_ptr);
220 do_cmd_walk(creature_ptr, FALSE);
224 do_cmd_walk(creature_ptr, TRUE);
228 if (!creature_ptr->wild_mode)
229 do_cmd_run(creature_ptr);
234 do_cmd_stay(creature_ptr, always_pickup);
238 do_cmd_stay(creature_ptr, !always_pickup);
242 do_cmd_rest(creature_ptr);
246 do_cmd_search(creature_ptr);
250 if (creature_ptr->action == ACTION_SEARCH)
251 set_action(creature_ptr, ACTION_NONE);
253 set_action(creature_ptr, ACTION_SEARCH);
257 case SPECIAL_KEY_STORE: {
258 do_cmd_store(creature_ptr);
261 case SPECIAL_KEY_BUILDING: {
262 do_cmd_building(creature_ptr);
265 case SPECIAL_KEY_QUEST: {
266 do_cmd_quest(creature_ptr);
270 if (!creature_ptr->wild_mode && !floor_ptr->dun_level && !floor_ptr->inside_arena && !floor_ptr->inside_quest) {
274 if (creature_ptr->ambush_flag) {
275 msg_print(_("襲撃から逃げるにはマップの端まで移動しなければならない。", "To flee the ambush you have to reach the edge of the map."));
279 if (creature_ptr->food < PY_FOOD_WEAK) {
280 msg_print(_("その前に食事をとらないと。", "You must eat something here."));
284 change_wild_mode(creature_ptr, FALSE);
286 do_cmd_go_up(creature_ptr);
291 if (creature_ptr->wild_mode)
292 change_wild_mode(creature_ptr, FALSE);
294 do_cmd_go_down(creature_ptr);
299 do_cmd_open(creature_ptr);
303 do_cmd_close(creature_ptr);
307 do_cmd_spike(creature_ptr);
311 do_cmd_bash(creature_ptr);
315 do_cmd_disarm(creature_ptr);
319 if ((creature_ptr->pclass == CLASS_SORCERER) || (creature_ptr->pclass == CLASS_RED_MAGE))
320 msg_print(_("呪文を学習する必要はない!", "You don't have to learn spells!"));
321 else if (creature_ptr->pclass == CLASS_SAMURAI)
322 do_cmd_gain_hissatsu(creature_ptr);
323 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
324 import_magic_device(creature_ptr);
326 do_cmd_study(creature_ptr);
331 if ((creature_ptr->pclass == CLASS_MINDCRAFTER) || (creature_ptr->pclass == CLASS_BERSERKER) || (creature_ptr->pclass == CLASS_NINJA)
332 || (creature_ptr->pclass == CLASS_MIRROR_MASTER))
333 do_cmd_mind_browse(creature_ptr);
334 else if (creature_ptr->pclass == CLASS_SMITH)
335 do_cmd_kaji(creature_ptr, TRUE);
336 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
337 do_cmd_magic_eater(creature_ptr, TRUE, FALSE);
338 else if (creature_ptr->pclass == CLASS_SNIPER)
339 do_cmd_snipe_browse(creature_ptr);
341 do_cmd_browse(creature_ptr);
346 if (!creature_ptr->wild_mode) {
347 if ((creature_ptr->pclass == CLASS_WARRIOR) || (creature_ptr->pclass == CLASS_ARCHER) || (creature_ptr->pclass == CLASS_CAVALRY)) {
348 msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
349 } else if (floor_ptr->dun_level && (d_info[creature_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC) && (creature_ptr->pclass != CLASS_BERSERKER)
350 && (creature_ptr->pclass != CLASS_SMITH)) {
351 msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
353 } else if (creature_ptr->anti_magic && (creature_ptr->pclass != CLASS_BERSERKER) && (creature_ptr->pclass != CLASS_SMITH)) {
354 concptr which_power = _("魔法", "magic");
355 if (creature_ptr->pclass == CLASS_MINDCRAFTER)
356 which_power = _("超能力", "psionic powers");
357 else if (creature_ptr->pclass == CLASS_IMITATOR)
358 which_power = _("ものまね", "imitation");
359 else if (creature_ptr->pclass == CLASS_SAMURAI)
360 which_power = _("必殺剣", "hissatsu");
361 else if (creature_ptr->pclass == CLASS_MIRROR_MASTER)
362 which_power = _("鏡魔法", "mirror magic");
363 else if (creature_ptr->pclass == CLASS_NINJA)
364 which_power = _("忍術", "ninjutsu");
365 else if (mp_ptr->spell_book == TV_LIFE_BOOK)
366 which_power = _("祈り", "prayer");
368 msg_format(_("反魔法バリアが%sを邪魔した!", "An anti-magic shell disrupts your %s!"), which_power);
369 free_turn(creature_ptr);
370 } else if (creature_ptr->shero && (creature_ptr->pclass != CLASS_BERSERKER)) {
371 msg_format(_("狂戦士化していて頭が回らない!", "You cannot think directly!"));
372 free_turn(creature_ptr);
374 if ((creature_ptr->pclass == CLASS_MINDCRAFTER) || (creature_ptr->pclass == CLASS_BERSERKER) || (creature_ptr->pclass == CLASS_NINJA)
375 || (creature_ptr->pclass == CLASS_MIRROR_MASTER))
376 do_cmd_mind(creature_ptr);
377 else if (creature_ptr->pclass == CLASS_IMITATOR)
378 do_cmd_mane(creature_ptr, FALSE);
379 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
380 do_cmd_magic_eater(creature_ptr, FALSE, FALSE);
381 else if (creature_ptr->pclass == CLASS_SAMURAI)
382 do_cmd_hissatsu(creature_ptr);
383 else if (creature_ptr->pclass == CLASS_BLUE_MAGE)
384 do_cmd_cast_learned(creature_ptr);
385 else if (creature_ptr->pclass == CLASS_SMITH)
386 do_cmd_kaji(creature_ptr, FALSE);
387 else if (creature_ptr->pclass == CLASS_SNIPER)
388 do_cmd_snipe(creature_ptr);
390 do_cmd_cast(creature_ptr);
397 do_cmd_pet(creature_ptr);
401 do_cmd_inscribe(creature_ptr);
405 do_cmd_uninscribe(creature_ptr);
409 do_cmd_activate(creature_ptr);
413 do_cmd_eat_food(creature_ptr);
417 do_cmd_refill(creature_ptr);
421 do_cmd_fire(creature_ptr, SP_NONE);
425 do_cmd_throw(creature_ptr, 1, FALSE, -1);
429 do_cmd_aim_wand(creature_ptr);
433 if (use_command && rogue_like_commands) {
434 do_cmd_use(creature_ptr);
436 do_cmd_zap_rod(creature_ptr);
442 do_cmd_quaff_potion(creature_ptr);
446 do_cmd_read_scroll(creature_ptr);
450 if (use_command && !rogue_like_commands)
451 do_cmd_use(creature_ptr);
453 do_cmd_use_staff(creature_ptr);
458 do_cmd_racial_power(creature_ptr);
462 do_cmd_view_map(creature_ptr);
466 do_cmd_locate(creature_ptr);
470 do_cmd_look(creature_ptr);
474 do_cmd_target(creature_ptr);
478 do_cmd_help(creature_ptr);
482 do_cmd_query_symbol(creature_ptr);
486 do_cmd_player_status(creature_ptr);
494 do_cmd_pref(creature_ptr);
498 do_cmd_reload_autopick(creature_ptr);
502 do_cmd_edit_autopick(creature_ptr);
506 do_cmd_macros(creature_ptr, process_autopick_file_command);
510 do_cmd_visuals(creature_ptr, process_autopick_file_command);
511 do_cmd_redraw(creature_ptr);
515 do_cmd_colors(creature_ptr, process_autopick_file_command);
516 do_cmd_redraw(creature_ptr);
521 (void)combine_and_reorder_home(STORE_HOME);
522 do_cmd_redraw(creature_ptr);
534 do_cmd_feeling(creature_ptr);
538 do_cmd_message_one();
542 do_cmd_messages(old_now_message);
546 do_cmd_checkquest(creature_ptr);
550 now_message = old_now_message;
551 do_cmd_redraw(creature_ptr);
555 do_cmd_save_game(creature_ptr, FALSE);
559 do_cmd_time(creature_ptr);
563 case SPECIAL_KEY_QUIT: {
564 do_cmd_save_and_exit(creature_ptr);
568 do_cmd_suicide(creature_ptr);
572 do_cmd_diary(creature_ptr);
576 do_cmd_knowledge(creature_ptr);
580 do_cmd_load_screen();
584 do_cmd_save_screen(creature_ptr, process_autopick_file_command);
588 prepare_movie_hooks();
592 spoil_random_artifact(creature_ptr, "randifact.txt");
596 if (!creature_ptr->wild_mode)
597 do_cmd_travel(creature_ptr);
598 if (creature_ptr->special_defense & KATA_MUSOU) {
599 set_action(creature_ptr, ACTION_NONE);
609 sound(SOUND_ILLEGAL);
610 if (!get_rnd_line(_("error_j.txt", "error.txt"), 0, error_m))
613 prt(_(" '?' でヘルプが表示されます。", "Type '?' for help."), 0, 0);
620 if (!creature_ptr->energy_use && !now_message)
621 now_message = old_now_message;