OSDN Git Service

[Refactor] #2127 class_conditionからwild_modeを分離した
authorHourier <66951241+Hourier@users.noreply.github.com>
Wed, 23 Feb 2022 00:05:01 +0000 (09:05 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Wed, 23 Feb 2022 00:05:01 +0000 (09:05 +0900)
src/cmd-io/cmd-menu-content-table.cpp
src/cmd-io/cmd-menu-content-table.h
src/io/input-key-requester.cpp

index b87c6a1..3c72bd8 100644 (file)
@@ -3,33 +3,29 @@
 #include "util/enum-converter.h"
 #include "util/int-char-converter.h"
 
-SpecialMenuContent::SpecialMenuContent(concptr name, byte window, byte number, SpecialMenuType menu_condition, PlayerClassType class_condition)
+SpecialMenuContent::SpecialMenuContent(concptr name, byte window, byte number, SpecialMenuType menu_condition, std::optional<PlayerClassType> class_condition, std::optional<bool> wild_mode)
     : name(name)
     , window(window)
     , number(number)
     , menu_condition(menu_condition)
     , class_condition(class_condition)
+    , wild_mode(wild_mode)
 {
 }
 
-/*
- * @todo 遅くともv2.2.1の頃には職業enumとboolとintが混じっているゴミ配列であった
- * jouken_naiyou (フィールド名もゴミ)が複数目的に利用されているようである
- * 後で何とかする
- */
 const std::vector<SpecialMenuContent> special_menu_info = {
-    SpecialMenuContent(_("超能力/特殊能力", "MindCraft/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::MINDCRAFTER),
-    SpecialMenuContent(_("ものまね/特殊能力", "Imitation/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::IMITATOR),
-    SpecialMenuContent(_("歌/特殊能力", "Song/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::BARD),
-    SpecialMenuContent(_("必殺技/特殊能力", "Technique/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::SAMURAI),
-    SpecialMenuContent(_("練気術/魔法/特殊能力", "Mind/Magic/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::FORCETRAINER),
-    SpecialMenuContent(_("技/特殊能力", "BrutalPower/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::BERSERKER),
-    SpecialMenuContent(_("技術/特殊能力", "Technique/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::SMITH),
-    SpecialMenuContent(_("鏡魔法/特殊能力", "MirrorMagic/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::MIRROR_MASTER),
-    SpecialMenuContent(_("忍術/特殊能力", "Ninjutsu/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::NINJA),
-    SpecialMenuContent(_("広域マップ(<)", "Enter global map(<)"), 2, 6, SpecialMenuType::WILD, i2enum<PlayerClassType>(0)),
-    SpecialMenuContent(_("通常マップ(>)", "Enter local map(>)"), 2, 7, SpecialMenuType::WILD, i2enum<PlayerClassType>(1)),
-    SpecialMenuContent("", 0, 0, SpecialMenuType::NONE, i2enum<PlayerClassType>(0)),
+    SpecialMenuContent(_("超能力/特殊能力", "MindCraft/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::MINDCRAFTER, std::nullopt),
+    SpecialMenuContent(_("ものまね/特殊能力", "Imitation/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::IMITATOR, std::nullopt),
+    SpecialMenuContent(_("歌/特殊能力", "Song/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::BARD, std::nullopt),
+    SpecialMenuContent(_("必殺技/特殊能力", "Technique/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::SAMURAI, std::nullopt),
+    SpecialMenuContent(_("練気術/魔法/特殊能力", "Mind/Magic/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::FORCETRAINER, std::nullopt),
+    SpecialMenuContent(_("技/特殊能力", "BrutalPower/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::BERSERKER, std::nullopt),
+    SpecialMenuContent(_("技術/特殊能力", "Technique/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::SMITH, std::nullopt),
+    SpecialMenuContent(_("鏡魔法/特殊能力", "MirrorMagic/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::MIRROR_MASTER, std::nullopt),
+    SpecialMenuContent(_("忍術/特殊能力", "Ninjutsu/Special"), 0, 0, SpecialMenuType::CLASS, PlayerClassType::NINJA, std::nullopt),
+    SpecialMenuContent(_("広域マップ(<)", "Enter global map(<)"), 2, 6, SpecialMenuType::WILD, std::nullopt, false),
+    SpecialMenuContent(_("通常マップ(>)", "Enter local map(>)"), 2, 7, SpecialMenuType::WILD, std::nullopt, true),
+    SpecialMenuContent("", 0, 0, SpecialMenuType::NONE, std::nullopt, std::nullopt),
 };
 
 menu_content menu_info[MAX_COMMAND_MENU_NUM][MAX_COMMAND_PER_SCREEN] = {
index 9d24d5c..bf87381 100644 (file)
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "system/angband.h"
+#include <optional>
 #include <vector>
 
 struct menu_content {
@@ -18,12 +19,13 @@ enum class SpecialMenuType {
 enum class PlayerClassType : short;
 class SpecialMenuContent {
 public:
-    SpecialMenuContent(concptr name, byte window, byte number, SpecialMenuType menu_condition, PlayerClassType class_condition);
+    SpecialMenuContent(concptr name, byte window, byte number, SpecialMenuType menu_condition, std::optional<PlayerClassType> class_condition, std::optional<bool> in_wilderness);
     concptr name;
     byte window;
     byte number;
     SpecialMenuType menu_condition;
-    PlayerClassType class_condition;
+    std::optional<PlayerClassType> class_condition;
+    std::optional<bool> wild_mode;
 };
 
 #define MAX_COMMAND_PER_SCREEN 10
index e623fe6..fb68cdd 100644 (file)
@@ -367,7 +367,7 @@ std::string InputKeyRequestor::switch_special_menu_condition(SpecialMenuContent
     case SpecialMenuType::NONE:
         return "";
     case SpecialMenuType::CLASS:
-        if (PlayerClass(this->player_ptr).equals(special_menu.class_condition)) {
+        if (PlayerClass(this->player_ptr).equals(special_menu.class_condition.value())) {
             return std::string(special_menu.name);
         }
 
@@ -378,8 +378,7 @@ std::string InputKeyRequestor::switch_special_menu_condition(SpecialMenuContent
             return "";
         }
 
-        auto can_do_in_wilderness = enum2i(special_menu.class_condition) > 0;
-        if (this->player_ptr->wild_mode == can_do_in_wilderness) {
+        if (this->player_ptr->wild_mode == special_menu.wild_mode) {
             return std::string(special_menu.name);
         }