OSDN Git Service

[Refactor] #3286 Removed player-redraw-types.h
[hengbandforosx/hengbandosx.git] / src / io / input-key-processor.cpp
index 39adda9..ad61eb7 100644 (file)
@@ -1,8 +1,7 @@
 /*!
  * @brief キー入力に応じてゲーム内コマンドを実行する
- * @date 2020/05/10
+ * @date 2022/02/20
  * @author Hourier
- * @todo Ctrl+C がShift+Q に認識されている。仕様の可能性も高いが要確認
  */
 
 #include "io/input-key-processor.h"
 #include "cmd-visual/cmd-map.h"
 #include "cmd-visual/cmd-visuals.h"
 #include "core/asking-player.h"
-#include "core/player-redraw-types.h"
-#include "core/player-update-types.h"
 #include "core/special-internal-keys.h"
 #include "dungeon/dungeon-flag-types.h"
-#include "dungeon/dungeon.h"
 #include "dungeon/quest.h" //!< @do_cmd_quest() がある。後で移設する.
+#include "effect/spells-effect-util.h"
 #include "floor/wild.h"
 #include "game-option/birth-options.h"
 #include "game-option/disturbance-options.h"
 #include "store/cmd-store.h"
 #include "store/home.h"
 #include "store/store-util.h"
+#include "system/dungeon-info.h"
 #include "system/floor-type-definition.h"
 #include "system/player-type-definition.h"
+#include "system/redrawing-flags-updater.h"
 #include "term/screen-processor.h"
 #include "util/int-char-converter.h"
 #include "view/display-messages.h"
 #include "window/display-sub-windows.h"
 #include "wizard/cmd-wizard.h"
 #include "world/world.h"
+#include <optional>
+#include <string>
+
+/*!
+ * @brief ウィザードモードへの導入処理
+ * / Verify use of "wizard" mode
+ * @param player_ptr プレイヤーへの参照ポインタ
+ * @return 実際にウィザードモードへ移行したらTRUEを返す。
+ */
+bool enter_wizard_mode(PlayerType *player_ptr)
+{
+    if (!w_ptr->noscore) {
+        if (!allow_debug_opts) {
+            msg_print(_("ウィザードモードは許可されていません。 ", "Wizard mode is not permitted."));
+            return false;
+        }
+
+        msg_print(_("ウィザードモードはデバッグと実験のためのモードです。 ", "Wizard mode is for debugging and experimenting."));
+        msg_print(_("一度ウィザードモードに入るとスコアは記録されません。", "The game will not be scored if you enter wizard mode."));
+        msg_print(nullptr);
+        if (!get_check(_("本当にウィザードモードに入りたいのですか? ", "Are you sure you want to enter wizard mode? "))) {
+            return false;
+        }
+
+        exe_write_diary(
+            player_ptr, DIARY_DESCRIPTION, 0, _("ウィザードモードに突入してスコアを残せなくなった。", "gave up recording score to enter wizard mode."));
+        w_ptr->noscore |= 0x0002;
+    }
+
+    return true;
+}
 
 /*!
  * @brief デバッグコマンドへの導入処理
  * @param player_ptr プレイヤーへの参照ポインタ
  * @return 実際にデバッグコマンドへ移行したらTRUEを返す。
  */
-static bool enter_debug_mode(player_type *player_ptr)
+static bool enter_debug_mode(PlayerType *player_ptr)
 {
     if (!w_ptr->noscore) {
-        if (!allow_debug_options) {
+        if (!allow_debug_opts) {
             msg_print(_("デバッグコマンドは許可されていません。 ", "Use of debug command is not permitted."));
             return false;
         }
@@ -130,7 +160,7 @@ static bool enter_debug_mode(player_type *player_ptr)
  * / Parse and execute the current command Give "Warning" on illegal commands.
  * @todo Make some "blocks"
  */
-void process_command(player_type *player_ptr)
+void process_command(PlayerType *player_ptr)
 {
     COMMAND_CODE old_now_message = now_message;
     repeat_check();
@@ -140,7 +170,7 @@ void process_command(player_type *player_ptr)
         sniper_data->reset_concent = true;
     }
 
-    floor_type *floor_ptr = player_ptr->current_floor_ptr;
+    auto *floor_ptr = player_ptr->current_floor_ptr;
     switch (command_cmd) {
     case ESCAPE:
     case ' ':
@@ -149,6 +179,20 @@ void process_command(player_type *player_ptr)
         /* Ignore */
         break;
     }
+    case KTRL('W'): {
+        if (w_ptr->wizard) {
+            w_ptr->wizard = false;
+            msg_print(_("ウィザードモード解除。", "Wizard mode off."));
+        } else if (enter_wizard_mode(player_ptr)) {
+            w_ptr->wizard = true;
+            msg_print(_("ウィザードモード突入。", "Wizard mode on."));
+        }
+
+        auto &rfu = RedrawingFlagsUpdater::get_instance();
+        rfu.set_flag(StatusRedrawingFlag::MONSTER_STATUSES);
+        rfu.set_flag(MainWindowRedrawingFlag::TITLE);
+        break;
+    }
     case KTRL('A'): {
         if (enter_debug_mode(player_ptr)) {
             do_cmd_debug(player_ptr);
@@ -157,20 +201,23 @@ void process_command(player_type *player_ptr)
         break;
     }
     case 'w': {
-        if (!player_ptr->wild_mode)
+        if (!player_ptr->wild_mode) {
             do_cmd_wield(player_ptr);
+        }
 
         break;
     }
     case 't': {
-        if (!player_ptr->wild_mode)
+        if (!player_ptr->wild_mode) {
             do_cmd_takeoff(player_ptr);
+        }
 
         break;
     }
     case 'd': {
-        if (!player_ptr->wild_mode)
+        if (!player_ptr->wild_mode) {
             do_cmd_drop(player_ptr);
+        }
 
         break;
     }
@@ -196,14 +243,16 @@ void process_command(player_type *player_ptr)
         break;
     }
     case '+': {
-        if (!player_ptr->wild_mode)
+        if (!player_ptr->wild_mode) {
             do_cmd_alter(player_ptr);
+        }
 
         break;
     }
     case 'T': {
-        if (!player_ptr->wild_mode)
+        if (!player_ptr->wild_mode) {
             do_cmd_tunnel(player_ptr);
+        }
 
         break;
     }
@@ -216,8 +265,9 @@ void process_command(player_type *player_ptr)
         break;
     }
     case '.': {
-        if (!player_ptr->wild_mode)
+        if (!player_ptr->wild_mode) {
             do_cmd_run(player_ptr);
+        }
 
         break;
     }
@@ -238,10 +288,11 @@ void process_command(player_type *player_ptr)
         break;
     }
     case 'S': {
-        if (player_ptr->action == ACTION_SEARCH)
+        if (player_ptr->action == ACTION_SEARCH) {
             set_action(player_ptr, ACTION_NONE);
-        else
+        } else {
             set_action(player_ptr, ACTION_SEARCH);
+        }
 
         break;
     }
@@ -258,9 +309,10 @@ void process_command(player_type *player_ptr)
         break;
     }
     case '<': {
-        if (!player_ptr->wild_mode && !floor_ptr->dun_level && !floor_ptr->inside_arena && !floor_ptr->inside_quest) {
-            if (vanilla_town)
+        if (!player_ptr->wild_mode && !floor_ptr->dun_level && !floor_ptr->inside_arena && !inside_quest(floor_ptr->quest_number)) {
+            if (vanilla_town) {
                 break;
+            }
 
             if (player_ptr->ambush_flag) {
                 msg_print(_("襲撃から逃げるにはマップの端まで移動しなければならない。", "To flee the ambush you have to reach the edge of the map."));
@@ -273,16 +325,18 @@ void process_command(player_type *player_ptr)
             }
 
             change_wild_mode(player_ptr, false);
-        } else
+        } else {
             do_cmd_go_up(player_ptr);
+        }
 
         break;
     }
     case '>': {
-        if (player_ptr->wild_mode)
+        if (player_ptr->wild_mode) {
             change_wild_mode(player_ptr, false);
-        else
+        } else {
             do_cmd_go_down(player_ptr);
+        }
 
         break;
     }
@@ -307,31 +361,34 @@ void process_command(player_type *player_ptr)
         break;
     }
     case 'G': {
-        if (player_ptr->pclass == PlayerClassType::SORCERER || player_ptr->pclass == PlayerClassType::RED_MAGE || player_ptr->pclass == PlayerClassType::ELEMENTALIST)
+        PlayerClass pc(player_ptr);
+        if (pc.is_every_magic() || pc.equals(PlayerClassType::ELEMENTALIST)) {
             msg_print(_("呪文を学習する必要はない!", "You don't have to learn spells!"));
-        else if (player_ptr->pclass == PlayerClassType::SAMURAI)
+        } else if (pc.equals(PlayerClassType::SAMURAI)) {
             do_cmd_gain_hissatsu(player_ptr);
-        else if (player_ptr->pclass == PlayerClassType::MAGIC_EATER)
+        } else if (pc.equals(PlayerClassType::MAGIC_EATER)) {
             import_magic_device(player_ptr);
-        else
+        } else {
             do_cmd_study(player_ptr);
+        }
 
         break;
     }
     case 'b': {
-        if ((player_ptr->pclass == PlayerClassType::MINDCRAFTER) || (player_ptr->pclass == PlayerClassType::BERSERKER) || (player_ptr->pclass == PlayerClassType::NINJA)
-            || (player_ptr->pclass == PlayerClassType::MIRROR_MASTER))
+        PlayerClass pc(player_ptr);
+        if (pc.can_browse()) {
             do_cmd_mind_browse(player_ptr);
-        else if (player_ptr->pclass == PlayerClassType::ELEMENTALIST)
+        } else if (pc.equals(PlayerClassType::ELEMENTALIST)) {
             do_cmd_element_browse(player_ptr);
-        else if (player_ptr->pclass == PlayerClassType::SMITH)
+        } else if (pc.equals(PlayerClassType::SMITH)) {
             do_cmd_kaji(player_ptr, true);
-        else if (player_ptr->pclass == PlayerClassType::MAGIC_EATER)
+        } else if (pc.equals(PlayerClassType::MAGIC_EATER)) {
             do_cmd_magic_eater(player_ptr, true, false);
-        else if (player_ptr->pclass == PlayerClassType::SNIPER)
+        } else if (pc.equals(PlayerClassType::SNIPER)) {
             do_cmd_snipe_browse(player_ptr);
-        else
+        } else {
             do_cmd_browse(player_ptr);
+        }
 
         break;
     }
@@ -340,19 +397,22 @@ void process_command(player_type *player_ptr)
             break;
         }
 
-        if ((player_ptr->pclass == PlayerClassType::WARRIOR) || (player_ptr->pclass == PlayerClassType::ARCHER) || (player_ptr->pclass == PlayerClassType::CAVALRY)) {
+        PlayerClass pc(player_ptr);
+        if (pc.equals(PlayerClassType::WARRIOR) || pc.equals(PlayerClassType::ARCHER) || pc.equals(PlayerClassType::CAVALRY)) {
             msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
             break;
         }
 
-        if (floor_ptr->dun_level && d_info[player_ptr->dungeon_idx].flags.has(DungeonFeatureType::NO_MAGIC) && (player_ptr->pclass != PlayerClassType::BERSERKER)
-            && (player_ptr->pclass != PlayerClassType::SMITH)) {
+        const auto &dungeon = dungeons_info[player_ptr->dungeon_idx];
+        auto non_magic_class = pc.equals(PlayerClassType::BERSERKER);
+        non_magic_class |= pc.equals(PlayerClassType::SMITH);
+        if (floor_ptr->dun_level && dungeon.flags.has(DungeonFeatureType::NO_MAGIC) && !non_magic_class) {
             msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
             msg_print(nullptr);
             break;
         }
 
-        if (player_ptr->anti_magic && (player_ptr->pclass != PlayerClassType::BERSERKER) && (player_ptr->pclass != PlayerClassType::SMITH)) {
+        if (player_ptr->anti_magic && !non_magic_class) {
             concptr which_power = _("魔法", "magic");
             switch (player_ptr->pclass) {
             case PlayerClassType::MINDCRAFTER:
@@ -374,8 +434,9 @@ void process_command(player_type *player_ptr)
                 which_power = _("元素魔法", "magic");
                 break;
             default:
-                if (mp_ptr->spell_book == ItemKindType::LIFE_BOOK)
+                if (mp_ptr->spell_book == ItemKindType::LIFE_BOOK) {
                     which_power = _("祈り", "prayer");
+                }
                 break;
             }
 
@@ -384,31 +445,31 @@ void process_command(player_type *player_ptr)
             break;
         }
 
-        if (is_shero(player_ptr) && (player_ptr->pclass != PlayerClassType::BERSERKER)) {
+        if (is_shero(player_ptr) && !pc.equals(PlayerClassType::BERSERKER)) {
             msg_format(_("狂戦士化していて頭が回らない!", "You cannot think directly!"));
             PlayerEnergy(player_ptr).reset_player_turn();
             break;
         }
 
-        if ((player_ptr->pclass == PlayerClassType::MINDCRAFTER) || (player_ptr->pclass == PlayerClassType::BERSERKER) || (player_ptr->pclass == PlayerClassType::NINJA)
-            || (player_ptr->pclass == PlayerClassType::MIRROR_MASTER))
+        if (pc.can_browse()) {
             do_cmd_mind(player_ptr);
-        else if (player_ptr->pclass == PlayerClassType::ELEMENTALIST)
+        } else if (pc.equals(PlayerClassType::ELEMENTALIST)) {
             do_cmd_element(player_ptr);
-        else if (player_ptr->pclass == PlayerClassType::IMITATOR)
+        } else if (pc.equals(PlayerClassType::IMITATOR)) {
             do_cmd_mane(player_ptr, false);
-        else if (player_ptr->pclass == PlayerClassType::MAGIC_EATER)
+        } else if (pc.equals(PlayerClassType::MAGIC_EATER)) {
             do_cmd_magic_eater(player_ptr, false, false);
-        else if (player_ptr->pclass == PlayerClassType::SAMURAI)
+        } else if (pc.equals(PlayerClassType::SAMURAI)) {
             do_cmd_hissatsu(player_ptr);
-        else if (player_ptr->pclass == PlayerClassType::BLUE_MAGE)
+        } else if (pc.equals(PlayerClassType::BLUE_MAGE)) {
             do_cmd_cast_learned(player_ptr);
-        else if (player_ptr->pclass == PlayerClassType::SMITH)
+        } else if (pc.equals(PlayerClassType::SMITH)) {
             do_cmd_kaji(player_ptr, false);
-        else if (player_ptr->pclass == PlayerClassType::SNIPER)
+        } else if (pc.equals(PlayerClassType::SNIPER)) {
             do_cmd_snipe(player_ptr);
-        else
+        } else {
             (void)do_cmd_cast(player_ptr);
+        }
 
         break;
     }
@@ -466,10 +527,11 @@ void process_command(player_type *player_ptr)
         break;
     }
     case 'u': {
-        if (use_command && !rogue_like_commands)
+        if (use_command && !rogue_like_commands) {
             do_cmd_use(player_ptr);
-        else
+        } else {
             do_cmd_use_staff(player_ptr);
+        }
 
         break;
     }
@@ -612,20 +674,23 @@ void process_command(player_type *player_ptr)
         break;
     }
     case '`': {
-        if (!player_ptr->wild_mode)
+        if (!player_ptr->wild_mode) {
             do_cmd_travel(player_ptr);
-        PlayerClass(player_ptr).break_samurai_stance({ SamuraiStance::MUSOU });
+        }
+        PlayerClass(player_ptr).break_samurai_stance({ SamuraiStanceType::MUSOU });
 
         break;
     }
     default: {
-        if (flush_failure)
+        if (flush_failure) {
             flush();
+        }
         if (one_in_(2)) {
-            char error_m[1024];
             sound(SOUND_ILLEGAL);
-            if (!get_rnd_line(_("error_j.txt", "error.txt"), 0, error_m))
-                msg_print(error_m);
+            const auto error_mes = get_random_line(_("error_j.txt", "error.txt"), 0);
+            if (error_mes.has_value()) {
+                msg_print(error_mes.value());
+            }
         } else {
             prt(_(" '?' でヘルプが表示されます。", "Type '?' for help."), 0, 0);
         }
@@ -634,6 +699,7 @@ void process_command(player_type *player_ptr)
     }
     }
 
-    if (!player_ptr->energy_use && !now_message)
+    if (!player_ptr->energy_use && !now_message) {
         now_message = old_now_message;
+    }
 }