OSDN Git Service

[Refactor] #2645 strip_name() の戻り値をvoid からstd::string に変更し、引数からchar* を消した
[hengbandforosx/hengbandosx.git] / src / cmd-visual / cmd-visuals.cpp
index 0c12683..e13cad6 100644 (file)
 #include "knowledge/lighting-level-table.h"
 #include "main/sound-of-music.h"
 #include "monster-race/monster-race.h"
-#include "object/object-generator.h"
 #include "object/object-kind.h"
+#include "system/monster-race-definition.h"
+#include "system/object-type-definition.h"
+#include "system/player-type-definition.h"
 #include "term/screen-processor.h"
 #include "term/term-color-types.h"
 #include "util/angband-files.h"
@@ -35,24 +37,26 @@ static bool cmd_visuals_aux(int i, IDX *num, IDX max)
     if (iscntrl(i)) {
         char str[10] = "";
         sprintf(str, "%d", *num);
-        if (!get_string(format("Input new number(0-%d): ", max - 1), str, 4))
-            return FALSE;
+        if (!get_string(format("Input new number(0-%d): ", max - 1), str, 4)) {
+            return false;
+        }
 
-        IDX tmp = (IDX)strtol(str, NULL, 0);
-        if (tmp >= 0 && tmp < max)
+        IDX tmp = (IDX)strtol(str, nullptr, 0);
+        if (tmp >= 0 && tmp < max) {
             *num = tmp;
-    } else if (isupper(i))
+        }
+    } else if (isupper(i)) {
         *num = (*num + max - 1) % max;
-    else
+    } else {
         *num = (*num + 1) % max;
+    }
 
-    return TRUE;
+    return true;
 }
 
 /*!
  * @brief キャラクタの変更メニュー表示
  * @param choice_msg 選択メッセージ
- * @return なし
  */
 static void print_visuals_menu(concptr choice_msg)
 {
@@ -74,56 +78,61 @@ static void print_visuals_menu(concptr choice_msg)
 /*
  * Interact with "visuals"
  */
-void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_command)(char *))
+void do_cmd_visuals(PlayerType *player_ptr)
 {
     FILE *auto_dump_stream;
     char tmp[160];
     char buf[1024];
-    bool need_redraw = FALSE;
+    bool need_redraw = false;
     concptr empty_symbol = "<< ? >>";
-    if (use_bigtile)
+    if (use_bigtile) {
         empty_symbol = "<< ?? >>";
+    }
 
     screen_save();
-    while (TRUE) {
+    while (true) {
         term_clear();
-        print_visuals_menu(NULL);
+        print_visuals_menu(nullptr);
         int i = inkey();
-        if (i == ESCAPE)
+        if (i == ESCAPE) {
             break;
+        }
 
         switch (i) {
         case '0': {
             prt(_("コマンド: ユーザー設定ファイルのロード", "Command: Load a user pref file"), 15, 0);
             prt(_("ファイル: ", "File: "), 17, 0);
-            sprintf(tmp, "%s.prf", creature_ptr->base_name);
-            if (!askfor(tmp, 70))
+            sprintf(tmp, "%s.prf", player_ptr->base_name);
+            if (!askfor(tmp, 70)) {
                 continue;
+            }
 
-            (void)process_pref_file(creature_ptr, tmp, process_autopick_file_command);
-            need_redraw = TRUE;
+            (void)process_pref_file(player_ptr, tmp, true);
+            need_redraw = true;
             break;
         }
         case '1': {
             static concptr mark = "Monster attr/chars";
             prt(_("コマンド: モンスターの[色/文字]をファイルに書き出します", "Command: Dump monster attr/chars"), 15, 0);
             prt(_("ファイル: ", "File: "), 17, 0);
-            sprintf(tmp, "%s.prf", creature_ptr->base_name);
-            if (!askfor(tmp, 70))
+            sprintf(tmp, "%s.prf", player_ptr->base_name);
+            if (!askfor(tmp, 70)) {
                 continue;
+            }
 
             path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
-            if (!open_auto_dump(&auto_dump_stream, buf, mark))
+            if (!open_auto_dump(&auto_dump_stream, buf, mark)) {
                 continue;
+            }
 
             auto_dump_printf(auto_dump_stream, _("\n# モンスターの[色/文字]の設定\n\n", "\n# Monster attr/char definitions\n\n"));
-            for (i = 0; i < max_r_idx; i++) {
-                monster_race *r_ptr = &r_info[i];
-                if (r_ptr->name.empty())
+            for (const auto &[r_idx, r_ref] : r_info) {
+                if (r_ref.name.empty()) {
                     continue;
+                }
 
-                auto_dump_printf(auto_dump_stream, "# %s\n", r_ptr->name.c_str());
-                auto_dump_printf(auto_dump_stream, "R:%d:0x%02X/0x%02X\n\n", i, (byte)(r_ptr->x_attr), (byte)(r_ptr->x_char));
+                auto_dump_printf(auto_dump_stream, "# %s\n", r_ref.name.c_str());
+                auto_dump_printf(auto_dump_stream, "R:%d:0x%02X/0x%02X\n\n", r_ref.idx, (byte)(r_ref.x_attr), (byte)(r_ref.x_char));
             }
 
             close_auto_dump(&auto_dump_stream, mark);
@@ -134,31 +143,38 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
             static concptr mark = "Object attr/chars";
             prt(_("コマンド: アイテムの[色/文字]をファイルに書き出します", "Command: Dump object attr/chars"), 15, 0);
             prt(_("ファイル: ", "File: "), 17, 0);
-            sprintf(tmp, "%s.prf", creature_ptr->base_name);
-            if (!askfor(tmp, 70))
+            sprintf(tmp, "%s.prf", player_ptr->base_name);
+            if (!askfor(tmp, 70)) {
                 continue;
+            }
 
             path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
-            if (!open_auto_dump(&auto_dump_stream, buf, mark))
+            if (!open_auto_dump(&auto_dump_stream, buf, mark)) {
                 continue;
+            }
 
             auto_dump_printf(auto_dump_stream, _("\n# アイテムの[色/文字]の設定\n\n", "\n# Object attr/char definitions\n\n"));
-            for (KIND_OBJECT_IDX k_idx = 0; k_idx < max_k_idx; k_idx++) {
-                GAME_TEXT o_name[MAX_NLEN];
-                object_kind *k_ptr = &k_info[k_idx];
-                if (k_ptr->name.empty())
+            for (const auto &k_ref : k_info) {
+                if (k_ref.name.empty()) {
                     continue;
+                }
 
-                if (!k_ptr->flavor) {
-                    strip_name(o_name, k_idx);
+                std::string o_name("");
+                GAME_TEXT char_o_name[MAX_NLEN]{};
+                if (!k_ref.flavor) {
+                    o_name = strip_name(k_ref.idx);
                 } else {
-                    object_type forge;
-                    object_prep(creature_ptr, &forge, k_idx);
-                    describe_flavor(creature_ptr, o_name, &forge, OD_FORCE_FLAVOR);
+                    ObjectType dummy;
+                    dummy.prep(k_ref.idx);
+                    describe_flavor(player_ptr, char_o_name, &dummy, OD_FORCE_FLAVOR);
+                }
+
+                if (o_name == "") {
+                    o_name = char_o_name;
                 }
 
-                auto_dump_printf(auto_dump_stream, "# %s\n", o_name);
-                auto_dump_printf(auto_dump_stream, "K:%d:0x%02X/0x%02X\n\n", (int)k_idx, (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char));
+                auto_dump_printf(auto_dump_stream, "# %s\n", o_name.data());
+                auto_dump_printf(auto_dump_stream, "K:%d:0x%02X/0x%02X\n\n", (int)k_ref.idx, (byte)(k_ref.x_attr), (byte)(k_ref.x_char));
             }
 
             close_auto_dump(&auto_dump_stream, mark);
@@ -169,26 +185,29 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
             static concptr mark = "Feature attr/chars";
             prt(_("コマンド: 地形の[色/文字]をファイルに書き出します", "Command: Dump feature attr/chars"), 15, 0);
             prt(_("ファイル: ", "File: "), 17, 0);
-            sprintf(tmp, "%s.prf", creature_ptr->base_name);
-            if (!askfor(tmp, 70))
+            sprintf(tmp, "%s.prf", player_ptr->base_name);
+            if (!askfor(tmp, 70)) {
                 continue;
+            }
 
             path_build(buf, sizeof(buf), ANGBAND_DIR_USER, tmp);
-            if (!open_auto_dump(&auto_dump_stream, buf, mark))
+            if (!open_auto_dump(&auto_dump_stream, buf, mark)) {
                 continue;
+            }
 
             auto_dump_printf(auto_dump_stream, _("\n# 地形の[色/文字]の設定\n\n", "\n# Feature attr/char definitions\n\n"));
-            for (i = 0; i < max_f_idx; i++) {
-                feature_type *f_ptr = &f_info[i];
-                if (f_ptr->name.empty())
+            for (const auto &f_ref : f_info) {
+                if (f_ref.name.empty()) {
                     continue;
-                if (f_ptr->mimic != i)
+                }
+                if (f_ref.mimic != f_ref.idx) {
                     continue;
+                }
 
-                auto_dump_printf(auto_dump_stream, "# %s\n", (f_ptr->name.c_str()));
-                auto_dump_printf(auto_dump_stream, "F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", i, (byte)(f_ptr->x_attr[F_LIT_STANDARD]),
-                    (byte)(f_ptr->x_char[F_LIT_STANDARD]), (byte)(f_ptr->x_attr[F_LIT_LITE]), (byte)(f_ptr->x_char[F_LIT_LITE]),
-                    (byte)(f_ptr->x_attr[F_LIT_DARK]), (byte)(f_ptr->x_char[F_LIT_DARK]));
+                auto_dump_printf(auto_dump_stream, "# %s\n", (f_ref.name.c_str()));
+                auto_dump_printf(auto_dump_stream, "F:%d:0x%02X/0x%02X:0x%02X/0x%02X:0x%02X/0x%02X\n\n", f_ref.idx, (byte)(f_ref.x_attr[F_LIT_STANDARD]),
+                    (byte)(f_ref.x_char[F_LIT_STANDARD]), (byte)(f_ref.x_attr[F_LIT_LITE]), (byte)(f_ref.x_char[F_LIT_LITE]),
+                    (byte)(f_ref.x_attr[F_LIT_DARK]), (byte)(f_ref.x_char[F_LIT_DARK]));
             }
 
             close_auto_dump(&auto_dump_stream, mark);
@@ -196,11 +215,12 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
             break;
         }
         case '4': {
+            IDX num = 0;
             static concptr choice_msg = _("モンスターの[色/文字]を変更します", "Change monster attr/chars");
-            static MONRACE_IDX r = 0;
+            static MonsterRaceId r = r_info.begin()->second.idx;
             prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
-            while (TRUE) {
-                monster_race *r_ptr = &r_info[r];
+            while (true) {
+                auto *r_ptr = &r_info[r];
                 int c;
                 IDX t;
 
@@ -218,24 +238,27 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
                 term_queue_bigchar(43, 20, ca, cc, 0, 0);
                 term_putstr(0, 22, -1, TERM_WHITE, _("コマンド (n/N/^N/a/A/^A/c/C/^C/v/V/^V): ", "Command (n/N/^N/a/A/^A/c/C/^C/v/V/^V): "));
                 i = inkey();
-                if (i == ESCAPE)
+                if (i == ESCAPE) {
                     break;
+                }
 
-                if (iscntrl(i))
+                if (iscntrl(i)) {
                     c = 'a' + i - KTRL('A');
-                else if (isupper(i))
+                } else if (isupper(i)) {
                     c = 'a' + i - 'A';
-                else
+                } else {
                     c = i;
+                }
 
                 switch (c) {
                 case 'n': {
-                    IDX prev_r = r;
+                    auto prev_r = r;
                     do {
-                        if (!cmd_visuals_aux(i, &r, max_r_idx)) {
+                        if (!cmd_visuals_aux(i, &num, static_cast<IDX>(r_info.size()))) {
                             r = prev_r;
                             break;
                         }
+                        r = i2enum<MonsterRaceId>(num);
                     } while (r_info[r].name.empty());
                 }
 
@@ -244,16 +267,16 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
                     t = (int)r_ptr->x_attr;
                     (void)cmd_visuals_aux(i, &t, 256);
                     r_ptr->x_attr = (byte)t;
-                    need_redraw = TRUE;
+                    need_redraw = true;
                     break;
                 case 'c':
                     t = (int)r_ptr->x_char;
                     (void)cmd_visuals_aux(i, &t, 256);
                     r_ptr->x_char = (byte)t;
-                    need_redraw = TRUE;
+                    need_redraw = true;
                     break;
                 case 'v':
-                    do_cmd_knowledge_monsters(creature_ptr, &need_redraw, TRUE, r);
+                    do_cmd_knowledge_monsters(player_ptr, &need_redraw, true, r);
                     term_clear();
                     print_visuals_menu(choice_msg);
                     break;
@@ -266,15 +289,15 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
             static concptr choice_msg = _("アイテムの[色/文字]を変更します", "Change object attr/chars");
             static IDX k = 0;
             prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
-            while (TRUE) {
-                object_kind *k_ptr = &k_info[k];
+            while (true) {
+                auto *k_ptr = &k_info[k];
                 int c;
                 IDX t;
 
                 TERM_COLOR da = k_ptr->d_attr;
-                SYMBOL_CODE dc = k_ptr->d_char;
+                auto dc = k_ptr->d_char;
                 TERM_COLOR ca = k_ptr->x_attr;
-                SYMBOL_CODE cc = k_ptr->x_char;
+                auto cc = k_ptr->x_char;
 
                 term_putstr(5, 17, -1, TERM_WHITE,
                     format(
@@ -288,21 +311,23 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
                 term_putstr(0, 22, -1, TERM_WHITE, _("コマンド (n/N/^N/a/A/^A/c/C/^C/v/V/^V): ", "Command (n/N/^N/a/A/^A/c/C/^C/v/V/^V): "));
 
                 i = inkey();
-                if (i == ESCAPE)
+                if (i == ESCAPE) {
                     break;
+                }
 
-                if (iscntrl(i))
+                if (iscntrl(i)) {
                     c = 'a' + i - KTRL('A');
-                else if (isupper(i))
+                } else if (isupper(i)) {
                     c = 'a' + i - 'A';
-                else
+                } else {
                     c = i;
+                }
 
                 switch (c) {
                 case 'n': {
                     IDX prev_k = k;
                     do {
-                        if (!cmd_visuals_aux(i, &k, max_k_idx)) {
+                        if (!cmd_visuals_aux(i, &k, static_cast<IDX>(k_info.size()))) {
                             k = prev_k;
                             break;
                         }
@@ -314,16 +339,16 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
                     t = (int)k_ptr->x_attr;
                     (void)cmd_visuals_aux(i, &t, 256);
                     k_ptr->x_attr = (byte)t;
-                    need_redraw = TRUE;
+                    need_redraw = true;
                     break;
                 case 'c':
                     t = (int)k_ptr->x_char;
                     (void)cmd_visuals_aux(i, &t, 256);
                     k_ptr->x_char = (byte)t;
-                    need_redraw = TRUE;
+                    need_redraw = true;
                     break;
                 case 'v':
-                    do_cmd_knowledge_objects(creature_ptr, &need_redraw, TRUE, k);
+                    do_cmd_knowledge_objects(player_ptr, &need_redraw, true, k);
                     term_clear();
                     print_visuals_menu(choice_msg);
                     break;
@@ -337,8 +362,8 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
             static IDX f = 0;
             static IDX lighting_level = F_LIT_STANDARD;
             prt(format(_("コマンド: %s", "Command: %s"), choice_msg), 15, 0);
-            while (TRUE) {
-                feature_type *f_ptr = &f_info[f];
+            while (true) {
+                auto *f_ptr = &f_info[f];
                 int c;
                 IDX t;
 
@@ -361,21 +386,23 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
                     _("コマンド (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): ", "Command (n/N/^N/a/A/^A/c/C/^C/l/L/^L/d/D/^D/v/V/^V): "));
 
                 i = inkey();
-                if (i == ESCAPE)
+                if (i == ESCAPE) {
                     break;
+                }
 
-                if (iscntrl(i))
+                if (iscntrl(i)) {
                     c = 'a' + i - KTRL('A');
-                else if (isupper(i))
+                } else if (isupper(i)) {
                     c = 'a' + i - 'A';
-                else
+                } else {
                     c = i;
+                }
 
                 switch (c) {
                 case 'n': {
                     IDX prev_f = f;
                     do {
-                        if (!cmd_visuals_aux(i, &f, max_f_idx)) {
+                        if (!cmd_visuals_aux(i, &f, static_cast<IDX>(f_info.size()))) {
                             f = prev_f;
                             break;
                         }
@@ -387,23 +414,23 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
                     t = (int)f_ptr->x_attr[lighting_level];
                     (void)cmd_visuals_aux(i, &t, 256);
                     f_ptr->x_attr[lighting_level] = (byte)t;
-                    need_redraw = TRUE;
+                    need_redraw = true;
                     break;
                 case 'c':
                     t = (int)f_ptr->x_char[lighting_level];
                     (void)cmd_visuals_aux(i, &t, 256);
                     f_ptr->x_char[lighting_level] = (byte)t;
-                    need_redraw = TRUE;
+                    need_redraw = true;
                     break;
                 case 'l':
                     (void)cmd_visuals_aux(i, &lighting_level, F_LIT_MAX);
                     break;
                 case 'd':
                     apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
-                    need_redraw = TRUE;
+                    need_redraw = true;
                     break;
                 case 'v':
-                    do_cmd_knowledge_features(&need_redraw, TRUE, f, &lighting_level);
+                    do_cmd_knowledge_features(&need_redraw, true, f, &lighting_level);
                     term_clear();
                     print_visuals_menu(choice_msg);
                     break;
@@ -413,21 +440,21 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
             break;
         }
         case '7':
-            do_cmd_knowledge_monsters(creature_ptr, &need_redraw, TRUE, -1);
+            do_cmd_knowledge_monsters(player_ptr, &need_redraw, true);
             break;
         case '8':
-            do_cmd_knowledge_objects(creature_ptr, &need_redraw, TRUE, -1);
+            do_cmd_knowledge_objects(player_ptr, &need_redraw, true, -1);
             break;
         case '9': {
             IDX lighting_level = F_LIT_STANDARD;
-            do_cmd_knowledge_features(&need_redraw, TRUE, -1, &lighting_level);
+            do_cmd_knowledge_features(&need_redraw, true, -1, &lighting_level);
             break;
         }
         case 'R':
         case 'r':
-            reset_visuals(creature_ptr, process_autopick_file_command);
+            reset_visuals(player_ptr);
             msg_print(_("画面上の[色/文字]を初期値にリセットしました。", "Visual attr/char tables reset."));
-            need_redraw = TRUE;
+            need_redraw = true;
             break;
         default:
             bell();
@@ -438,6 +465,7 @@ void do_cmd_visuals(player_type *creature_ptr, void (*process_autopick_file_comm
     }
 
     screen_load();
-    if (need_redraw)
-        do_cmd_redraw(creature_ptr);
+    if (need_redraw) {
+        do_cmd_redraw(player_ptr);
+    }
 }