OSDN Git Service

[Refactor] #40236 Separated do_cmd_knowledge_features() and related static functions...
authorHourier <hourier@users.sourceforge.jp>
Fri, 24 Apr 2020 08:28:55 +0000 (17:28 +0900)
committerHourier <hourier@users.sourceforge.jp>
Fri, 24 Apr 2020 08:28:55 +0000 (17:28 +0900)
Hengband_vcs2017/Hengband/Hengband.vcxproj
Hengband_vcs2017/Hengband/Hengband.vcxproj.filters
src/Makefile.am
src/cmd/cmd-dump.c
src/cmd/cmd-dump.h
src/cmd/cmd-visuals.c
src/knowledge/knowledge-features.c [new file with mode: 0644]
src/knowledge/knowledge-features.h [new file with mode: 0644]
src/knowledge/knowledge-items.c

index e5b909b..6e006a7 100644 (file)
     <ClCompile Include="..\..\src\birth.c" />\r
     <ClCompile Include="..\..\src\cmd\cmd-process-screen.c" />\r
     <ClCompile Include="..\..\src\cmd\dump-util.c" />\r
+    <ClCompile Include="..\..\src\knowledge\knowledge-features.c" />\r
     <ClCompile Include="..\..\src\knowledge\knowledge-items.c" />\r
     <ClCompile Include="..\..\src\knowledge\knowledge-experiences.c" />\r
     <ClCompile Include="..\..\src\knowledge\knowledge-monsters.c" />\r
     <ClInclude Include="..\..\src\birth.h" />\r
     <ClInclude Include="..\..\src\cmd\cmd-process-screen.h" />\r
     <ClInclude Include="..\..\src\cmd\dump-util.h" />\r
+    <ClInclude Include="..\..\src\knowledge\knowledge-features.h" />\r
     <ClInclude Include="..\..\src\knowledge\knowledge-items.h" />\r
     <ClInclude Include="..\..\src\knowledge\knowledge-experiences.h" />\r
     <ClInclude Include="..\..\src\knowledge\knowledge-monsters.h" />\r
index d67acff..f7f594f 100644 (file)
     <ClCompile Include="..\..\src\knowledge\knowledge-items.c">
       <Filter>knowledge</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\knowledge\knowledge-features.c">
+      <Filter>knowledge</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\src\gamevalue.h" />
     <ClInclude Include="..\..\src\knowledge\knowledge-items.h">
       <Filter>knowledge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\knowledge\knowledge-features.h">
+      <Filter>knowledge</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\src\wall.bmp" />
index f7809dc..6da7749 100644 (file)
@@ -151,6 +151,7 @@ hengband_SOURCES = \
        \
        knowledge/knowledge-items.c knowledge/knowledge-items.h \
        knowledge/knowledge-experiences.c knowledge/knowledge-experiences.h \
+       knowledge/knowledge-features.c knowledge/knowledge-features.h \
        knowledge/knowledge-monsters.c knowledge/knowledge-monsters.h \
        knowledge/knowledge-uniques.c knowledge/knowledge-uniques.h \
        knowledge/knowledge-self.c knowledge/knowledge-self.h \
index 71e0c41..435d206 100644 (file)
@@ -45,6 +45,7 @@
 
 #include "knowledge/knowledge-items.h"
 #include "knowledge/knowledge-experiences.h"
+#include "knowledge/knowledge-features.h"
 #include "knowledge/knowledge-monsters.h"
 #include "knowledge/knowledge-quests.h"
 #include "knowledge/knowledge-self.h"
@@ -416,390 +417,6 @@ void do_cmd_feeling(player_type *creature_ptr)
 
 
 /*
- * Build a list of feature indexes in the given group. Return the number
- * of features in the group.
- *
- * mode & 0x01 : check for non-empty group
- */
-static FEAT_IDX collect_features(FEAT_IDX *feat_idx, BIT_FLAGS8 mode)
-{
-       FEAT_IDX feat_cnt = 0;
-       for (FEAT_IDX i = 0; i < max_f_idx; i++)
-       {
-               feature_type *f_ptr = &f_info[i];
-               if (!f_ptr->name) continue;
-               if (f_ptr->mimic != i) continue;
-
-               feat_idx[feat_cnt++] = i;
-               if (mode & 0x01) break;
-       }
-
-       feat_idx[feat_cnt] = -1;
-       return feat_cnt;
-}
-
-
-/*
- * Display the features in a group.
- */
-static void display_feature_list(int col, int row, int per_page, FEAT_IDX *feat_idx,
-       FEAT_IDX feat_cur, FEAT_IDX feat_top, bool visual_only, int lighting_level)
-{
-       int lit_col[F_LIT_MAX], i;
-       int f_idx_col = use_bigtile ? 62 : 64;
-
-       lit_col[F_LIT_STANDARD] = use_bigtile ? (71 - F_LIT_MAX) : 71;
-       for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
-               lit_col[i] = lit_col[F_LIT_STANDARD] + 2 + (i - F_LIT_NS_BEGIN) * 2 + (use_bigtile ? i : 0);
-
-       for (i = 0; i < per_page && (feat_idx[feat_top + i] >= 0); i++)
-       {
-               TERM_COLOR attr;
-               FEAT_IDX f_idx = feat_idx[feat_top + i];
-               feature_type *f_ptr = &f_info[f_idx];
-               int row_i = row + i;
-               attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
-               c_prt(attr, f_name + f_ptr->name, row_i, col);
-               if (per_page == 1)
-               {
-                       c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + strlen(f_name + f_ptr->name));
-                       c_prt(attr, format("%02x/%02x", f_ptr->x_attr[lighting_level], f_ptr->x_char[lighting_level]), row_i, f_idx_col - ((current_world_ptr->wizard || visual_only) ? 6 : 2));
-               }
-               if (current_world_ptr->wizard || visual_only)
-               {
-                       c_prt(attr, format("%d", f_idx), row_i, f_idx_col);
-               }
-
-               Term_queue_bigchar(lit_col[F_LIT_STANDARD], row_i, f_ptr->x_attr[F_LIT_STANDARD], f_ptr->x_char[F_LIT_STANDARD], 0, 0);
-               Term_putch(lit_col[F_LIT_NS_BEGIN], row_i, TERM_SLATE, '(');
-               for (int j = F_LIT_NS_BEGIN + 1; j < F_LIT_MAX; j++)
-               {
-                       Term_putch(lit_col[j], row_i, TERM_SLATE, '/');
-               }
-
-               Term_putch(lit_col[F_LIT_MAX - 1] + (use_bigtile ? 3 : 2), row_i, TERM_SLATE, ')');
-               for (int j = F_LIT_NS_BEGIN; j < F_LIT_MAX; j++)
-               {
-                       Term_queue_bigchar(lit_col[j] + 1, row_i, f_ptr->x_attr[j], f_ptr->x_char[j], 0, 0);
-               }
-       }
-
-       for (; i < per_page; i++)
-       {
-               Term_erase(col, row + i, 255);
-       }
-}
-
-
-/*
- * Interact with feature visuals.
- */
-void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f_idx, IDX *lighting_level)
-{
-       TERM_COLOR attr_old[F_LIT_MAX];
-       (void)C_WIPE(attr_old, F_LIT_MAX, TERM_COLOR);
-       SYMBOL_CODE char_old[F_LIT_MAX];
-       (void)C_WIPE(char_old, F_LIT_MAX, SYMBOL_CODE);
-
-       TERM_LEN wid, hgt;
-       Term_get_size(&wid, &hgt);
-
-       FEAT_IDX *feat_idx;
-       C_MAKE(feat_idx, max_f_idx, FEAT_IDX);
-
-       concptr feature_group_text[] = { "terrains", NULL };
-       int len;
-       int max = 0;
-       int grp_cnt = 0;
-       int feat_cnt;
-       FEAT_IDX grp_idx[100];
-       TERM_COLOR attr_top = 0;
-       bool visual_list = FALSE;
-       byte char_left = 0;
-       TERM_LEN browser_rows = hgt - 8;
-       if (direct_f_idx < 0)
-       {
-               for (FEAT_IDX i = 0; feature_group_text[i] != NULL; i++)
-               {
-                       len = strlen(feature_group_text[i]);
-                       if (len > max) max = len;
-
-                       if (collect_features(feat_idx, 0x01))
-                       {
-                               grp_idx[grp_cnt++] = i;
-                       }
-               }
-
-               feat_cnt = 0;
-       }
-       else
-       {
-               feature_type *f_ptr = &f_info[direct_f_idx];
-
-               feat_idx[0] = direct_f_idx;
-               feat_cnt = 1;
-               feat_idx[1] = -1;
-
-               (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
-                       &attr_top, &char_left, &f_ptr->x_attr[*lighting_level], &f_ptr->x_char[*lighting_level], need_redraw);
-
-               for (FEAT_IDX i = 0; i < F_LIT_MAX; i++)
-               {
-                       attr_old[i] = f_ptr->x_attr[i];
-                       char_old[i] = f_ptr->x_char[i];
-               }
-       }
-
-       grp_idx[grp_cnt] = -1;
-
-       FEAT_IDX old_grp_cur = -1;
-       FEAT_IDX grp_cur = 0;
-       FEAT_IDX grp_top = 0;
-       FEAT_IDX feat_cur = 0;
-       FEAT_IDX feat_top = 0;
-       TERM_LEN column = 0;
-       bool flag = FALSE;
-       bool redraw = TRUE;
-       TERM_COLOR *cur_attr_ptr;
-       SYMBOL_CODE *cur_char_ptr;
-       while (!flag)
-       {
-               char ch;
-               feature_type *f_ptr;
-
-               if (redraw)
-               {
-                       clear_from(0);
-
-                       prt(_("表示 - 地形", "Visuals - features"), 2, 0);
-                       if (direct_f_idx < 0) prt(_("グループ", "Group"), 4, 0);
-                       prt(_("名前", "Name"), 4, max + 3);
-                       if (use_bigtile)
-                       {
-                               if (current_world_ptr->wizard || visual_only) prt("Idx", 4, 62);
-                               prt(_("文字 ( l/ d)", "Sym ( l/ d)"), 4, 66);
-                       }
-                       else
-                       {
-                               if (current_world_ptr->wizard || visual_only) prt("Idx", 4, 64);
-                               prt(_("文字 (l/d)", "Sym (l/d)"), 4, 68);
-                       }
-
-                       for (FEAT_IDX i = 0; i < 78; i++)
-                       {
-                               Term_putch(i, 5, TERM_WHITE, '=');
-                       }
-
-                       if (direct_f_idx < 0)
-                       {
-                               for (FEAT_IDX i = 0; i < browser_rows; i++)
-                               {
-                                       Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
-                               }
-                       }
-
-                       redraw = FALSE;
-               }
-
-               if (direct_f_idx < 0)
-               {
-                       if (grp_cur < grp_top) grp_top = grp_cur;
-                       if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
-
-                       display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
-                       if (old_grp_cur != grp_cur)
-                       {
-                               old_grp_cur = grp_cur;
-                               feat_cnt = collect_features(feat_idx, 0x00);
-                       }
-
-                       while (feat_cur < feat_top)
-                               feat_top = MAX(0, feat_top - browser_rows / 2);
-                       while (feat_cur >= feat_top + browser_rows)
-                               feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows / 2);
-               }
-
-               if (!visual_list)
-               {
-                       display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, visual_only, F_LIT_STANDARD);
-               }
-               else
-               {
-                       feat_top = feat_cur;
-                       display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, visual_only, *lighting_level);
-                       display_visual_list(max + 3, 7, browser_rows - 1, wid - (max + 3), attr_top, char_left);
-               }
-
-               prt(format(_("<方向>%s, 'd'で標準光源効果%s, ESC", "<dir>%s, 'd' for default lighting%s, ESC"),
-                       visual_list ? _(", ENTERで決定, 'a'で対象明度変更", ", ENTER to accept, 'a' for lighting level") : _(", 'v'でシンボル変更", ", 'v' for visuals"),
-                       (attr_idx || char_idx) ? _(", 'c', 'p'でペースト", ", 'c', 'p' to paste") : _(", 'c'でコピー", ", 'c' to copy")),
-                       hgt - 1, 0);
-
-               f_ptr = &f_info[feat_idx[feat_cur]];
-               cur_attr_ptr = &f_ptr->x_attr[*lighting_level];
-               cur_char_ptr = &f_ptr->x_char[*lighting_level];
-
-               if (visual_list)
-               {
-                       place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
-               }
-               else if (!column)
-               {
-                       Term_gotoxy(0, 6 + (grp_cur - grp_top));
-               }
-               else
-               {
-                       Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
-               }
-
-               ch = inkey();
-               if (visual_list && ((ch == 'A') || (ch == 'a')))
-               {
-                       int prev_lighting_level = *lighting_level;
-
-                       if (ch == 'A')
-                       {
-                               if (*lighting_level <= 0) *lighting_level = F_LIT_MAX - 1;
-                               else (*lighting_level)--;
-                       }
-                       else
-                       {
-                               if (*lighting_level >= F_LIT_MAX - 1) *lighting_level = 0;
-                               else (*lighting_level)++;
-                       }
-
-                       if (f_ptr->x_attr[prev_lighting_level] != f_ptr->x_attr[*lighting_level])
-                               attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
-
-                       if (f_ptr->x_char[prev_lighting_level] != f_ptr->x_char[*lighting_level])
-                               char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
-
-                       continue;
-               }
-               else if ((ch == 'D') || (ch == 'd'))
-               {
-                       TERM_COLOR prev_x_attr = f_ptr->x_attr[*lighting_level];
-                       byte prev_x_char = f_ptr->x_char[*lighting_level];
-
-                       apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
-
-                       if (visual_list)
-                       {
-                               if (prev_x_attr != f_ptr->x_attr[*lighting_level])
-                                       attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
-
-                               if (prev_x_char != f_ptr->x_char[*lighting_level])
-                                       char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
-                       }
-                       else *need_redraw = TRUE;
-
-                       continue;
-               }
-               else if (visual_mode_command(ch, &visual_list, browser_rows - 1, wid - (max + 3), &attr_top, &char_left, cur_attr_ptr, cur_char_ptr, need_redraw))
-               {
-                       switch (ch)
-                       {
-                       case ESCAPE:
-                               for (FEAT_IDX i = 0; i < F_LIT_MAX; i++)
-                               {
-                                       f_ptr->x_attr[i] = attr_old[i];
-                                       f_ptr->x_char[i] = char_old[i];
-                               }
-
-                               /* Fall through */
-                       case '\n':
-                       case '\r':
-                               if (direct_f_idx >= 0) flag = TRUE;
-                               else *lighting_level = F_LIT_STANDARD;
-                               break;
-                       case 'V':
-                       case 'v':
-                               for (FEAT_IDX i = 0; i < F_LIT_MAX; i++)
-                               {
-                                       attr_old[i] = f_ptr->x_attr[i];
-                                       char_old[i] = f_ptr->x_char[i];
-                               }
-                               *lighting_level = F_LIT_STANDARD;
-                               break;
-
-                       case 'C':
-                       case 'c':
-                               if (!visual_list)
-                               {
-                                       for (FEAT_IDX i = 0; i < F_LIT_MAX; i++)
-                                       {
-                                               attr_idx_feat[i] = f_ptr->x_attr[i];
-                                               char_idx_feat[i] = f_ptr->x_char[i];
-                                       }
-                               }
-                               break;
-
-                       case 'P':
-                       case 'p':
-                               if (!visual_list)
-                               {
-                                       for (FEAT_IDX i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
-                                       {
-                                               if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
-                                               if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
-                                       }
-                               }
-                               break;
-                       }
-                       continue;
-               }
-
-               switch (ch)
-               {
-               case ESCAPE:
-               {
-                       flag = TRUE;
-                       break;
-               }
-
-               default:
-               {
-                       browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
-                       break;
-               }
-               }
-       }
-
-       C_KILL(feat_idx, max_f_idx, FEAT_IDX);
-}
-
-
-/*
- * Dungeon
- */
-static void do_cmd_knowledge_dungeon(player_type *creature_ptr)
-{
-       FILE *fff = NULL;
-       GAME_TEXT file_name[FILE_NAME_SIZE];
-       if (!open_temporary_file(&fff, file_name)) return;
-
-       for (int i = 1; i < current_world_ptr->max_d_idx; i++)
-       {
-               bool seiha = FALSE;
-
-               if (!d_info[i].maxdepth) continue;
-               if (!max_dlv[i]) continue;
-               if (d_info[i].final_guardian)
-               {
-                       if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
-               }
-               else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
-
-               fprintf(fff, _("%c%-12s :  %3d 階\n", "%c%-16s :  level %3d\n"), seiha ? '!' : ' ', d_name + d_info[i].name, (int)max_dlv[i]);
-       }
-
-       my_fclose(fff);
-       (void)show_file(creature_ptr, TRUE, file_name, _("今までに入ったダンジョン", "Dungeon"), 0, 0);
-       fd_kill(file_name);
-}
-
-
-/*
  * Check the status of "autopick"
  */
 static void do_cmd_knowledge_autopick(player_type *creature_ptr)
index bc510b3..73af6cf 100644 (file)
@@ -17,6 +17,3 @@ extern void do_cmd_spoilers(player_type *creature_ptr);
 
 /* wizard1.c */
 extern void spoil_random_artifact(player_type *creature_ptr, concptr fname);
-
-/* 暫定。後で移す. */
-void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f_idx, IDX *lighting_level);
index 8c21f32..0e067d4 100644 (file)
@@ -1,7 +1,7 @@
 #include "angband.h"
 #include "cmd/cmd-visuals.h"
 #include "cmd/cmd-draw.h"
-#include "cmd/cmd-dump.h" // 暫定。後で消す.
+#include "knowledge/knowledge-features.h"
 #include "knowledge/knowledge-items.h"
 #include "knowledge/knowledge-monsters.h"
 #include "files.h"
diff --git a/src/knowledge/knowledge-features.c b/src/knowledge/knowledge-features.c
new file mode 100644 (file)
index 0000000..e8fca70
--- /dev/null
@@ -0,0 +1,398 @@
+/*!
+ * @brief 地形に関する情報を表示する
+ * @date 2020/04/24
+ * @author Hourier
+ */
+
+#include "angband.h"
+#include "knowledge/knowledge-features.h"
+#include "cmd/dump-util.h"
+#include "core/show-file.h"
+#include "gameterm.h"
+#include "world.h"
+#include "cmd/lighting-level-table.h"
+#include "dungeon.h"
+#include "view-mainwindow.h" // 暫定、後で消す.
+
+ /*
+  * Build a list of feature indexes in the given group. Return the number
+  * of features in the group.
+  *
+  * mode & 0x01 : check for non-empty group
+  */
+static FEAT_IDX collect_features(FEAT_IDX *feat_idx, BIT_FLAGS8 mode)
+{
+       FEAT_IDX feat_cnt = 0;
+       for (FEAT_IDX i = 0; i < max_f_idx; i++)
+       {
+               feature_type *f_ptr = &f_info[i];
+               if (!f_ptr->name) continue;
+               if (f_ptr->mimic != i) continue;
+
+               feat_idx[feat_cnt++] = i;
+               if (mode & 0x01) break;
+       }
+
+       feat_idx[feat_cnt] = -1;
+       return feat_cnt;
+}
+
+
+/*
+ * Display the features in a group.
+ */
+static void display_feature_list(int col, int row, int per_page, FEAT_IDX *feat_idx,
+       FEAT_IDX feat_cur, FEAT_IDX feat_top, bool visual_only, int lighting_level)
+{
+       int lit_col[F_LIT_MAX], i;
+       int f_idx_col = use_bigtile ? 62 : 64;
+
+       lit_col[F_LIT_STANDARD] = use_bigtile ? (71 - F_LIT_MAX) : 71;
+       for (i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
+               lit_col[i] = lit_col[F_LIT_STANDARD] + 2 + (i - F_LIT_NS_BEGIN) * 2 + (use_bigtile ? i : 0);
+
+       for (i = 0; i < per_page && (feat_idx[feat_top + i] >= 0); i++)
+       {
+               TERM_COLOR attr;
+               FEAT_IDX f_idx = feat_idx[feat_top + i];
+               feature_type *f_ptr = &f_info[f_idx];
+               int row_i = row + i;
+               attr = ((i + feat_top == feat_cur) ? TERM_L_BLUE : TERM_WHITE);
+               c_prt(attr, f_name + f_ptr->name, row_i, col);
+               if (per_page == 1)
+               {
+                       c_prt(attr, format("(%s)", lighting_level_str[lighting_level]), row_i, col + 1 + strlen(f_name + f_ptr->name));
+                       c_prt(attr, format("%02x/%02x", f_ptr->x_attr[lighting_level], f_ptr->x_char[lighting_level]), row_i, f_idx_col - ((current_world_ptr->wizard || visual_only) ? 6 : 2));
+               }
+               if (current_world_ptr->wizard || visual_only)
+               {
+                       c_prt(attr, format("%d", f_idx), row_i, f_idx_col);
+               }
+
+               Term_queue_bigchar(lit_col[F_LIT_STANDARD], row_i, f_ptr->x_attr[F_LIT_STANDARD], f_ptr->x_char[F_LIT_STANDARD], 0, 0);
+               Term_putch(lit_col[F_LIT_NS_BEGIN], row_i, TERM_SLATE, '(');
+               for (int j = F_LIT_NS_BEGIN + 1; j < F_LIT_MAX; j++)
+               {
+                       Term_putch(lit_col[j], row_i, TERM_SLATE, '/');
+               }
+
+               Term_putch(lit_col[F_LIT_MAX - 1] + (use_bigtile ? 3 : 2), row_i, TERM_SLATE, ')');
+               for (int j = F_LIT_NS_BEGIN; j < F_LIT_MAX; j++)
+               {
+                       Term_queue_bigchar(lit_col[j] + 1, row_i, f_ptr->x_attr[j], f_ptr->x_char[j], 0, 0);
+               }
+       }
+
+       for (; i < per_page; i++)
+       {
+               Term_erase(col, row + i, 255);
+       }
+}
+
+
+/*
+ * Interact with feature visuals.
+ */
+void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f_idx, IDX *lighting_level)
+{
+       TERM_COLOR attr_old[F_LIT_MAX];
+       (void)C_WIPE(attr_old, F_LIT_MAX, TERM_COLOR);
+       SYMBOL_CODE char_old[F_LIT_MAX];
+       (void)C_WIPE(char_old, F_LIT_MAX, SYMBOL_CODE);
+
+       TERM_LEN wid, hgt;
+       Term_get_size(&wid, &hgt);
+
+       FEAT_IDX *feat_idx;
+       C_MAKE(feat_idx, max_f_idx, FEAT_IDX);
+
+       concptr feature_group_text[] = { "terrains", NULL };
+       int len;
+       int max = 0;
+       int grp_cnt = 0;
+       int feat_cnt;
+       FEAT_IDX grp_idx[100];
+       TERM_COLOR attr_top = 0;
+       bool visual_list = FALSE;
+       byte char_left = 0;
+       TERM_LEN browser_rows = hgt - 8;
+       if (direct_f_idx < 0)
+       {
+               for (FEAT_IDX i = 0; feature_group_text[i] != NULL; i++)
+               {
+                       len = strlen(feature_group_text[i]);
+                       if (len > max) max = len;
+
+                       if (collect_features(feat_idx, 0x01))
+                       {
+                               grp_idx[grp_cnt++] = i;
+                       }
+               }
+
+               feat_cnt = 0;
+       }
+       else
+       {
+               feature_type *f_ptr = &f_info[direct_f_idx];
+
+               feat_idx[0] = direct_f_idx;
+               feat_cnt = 1;
+               feat_idx[1] = -1;
+
+               (void)visual_mode_command('v', &visual_list, browser_rows - 1, wid - (max + 3),
+                       &attr_top, &char_left, &f_ptr->x_attr[*lighting_level], &f_ptr->x_char[*lighting_level], need_redraw);
+
+               for (FEAT_IDX i = 0; i < F_LIT_MAX; i++)
+               {
+                       attr_old[i] = f_ptr->x_attr[i];
+                       char_old[i] = f_ptr->x_char[i];
+               }
+       }
+
+       grp_idx[grp_cnt] = -1;
+
+       FEAT_IDX old_grp_cur = -1;
+       FEAT_IDX grp_cur = 0;
+       FEAT_IDX grp_top = 0;
+       FEAT_IDX feat_cur = 0;
+       FEAT_IDX feat_top = 0;
+       TERM_LEN column = 0;
+       bool flag = FALSE;
+       bool redraw = TRUE;
+       TERM_COLOR *cur_attr_ptr;
+       SYMBOL_CODE *cur_char_ptr;
+       while (!flag)
+       {
+               char ch;
+               feature_type *f_ptr;
+
+               if (redraw)
+               {
+                       clear_from(0);
+
+                       prt(_("表示 - 地形", "Visuals - features"), 2, 0);
+                       if (direct_f_idx < 0) prt(_("グループ", "Group"), 4, 0);
+                       prt(_("名前", "Name"), 4, max + 3);
+                       if (use_bigtile)
+                       {
+                               if (current_world_ptr->wizard || visual_only) prt("Idx", 4, 62);
+                               prt(_("文字 ( l/ d)", "Sym ( l/ d)"), 4, 66);
+                       }
+                       else
+                       {
+                               if (current_world_ptr->wizard || visual_only) prt("Idx", 4, 64);
+                               prt(_("文字 (l/d)", "Sym (l/d)"), 4, 68);
+                       }
+
+                       for (FEAT_IDX i = 0; i < 78; i++)
+                       {
+                               Term_putch(i, 5, TERM_WHITE, '=');
+                       }
+
+                       if (direct_f_idx < 0)
+                       {
+                               for (FEAT_IDX i = 0; i < browser_rows; i++)
+                               {
+                                       Term_putch(max + 1, 6 + i, TERM_WHITE, '|');
+                               }
+                       }
+
+                       redraw = FALSE;
+               }
+
+               if (direct_f_idx < 0)
+               {
+                       if (grp_cur < grp_top) grp_top = grp_cur;
+                       if (grp_cur >= grp_top + browser_rows) grp_top = grp_cur - browser_rows + 1;
+
+                       display_group_list(0, 6, max, browser_rows, grp_idx, feature_group_text, grp_cur, grp_top);
+                       if (old_grp_cur != grp_cur)
+                       {
+                               old_grp_cur = grp_cur;
+                               feat_cnt = collect_features(feat_idx, 0x00);
+                       }
+
+                       while (feat_cur < feat_top)
+                               feat_top = MAX(0, feat_top - browser_rows / 2);
+                       while (feat_cur >= feat_top + browser_rows)
+                               feat_top = MIN(feat_cnt - browser_rows, feat_top + browser_rows / 2);
+               }
+
+               if (!visual_list)
+               {
+                       display_feature_list(max + 3, 6, browser_rows, feat_idx, feat_cur, feat_top, visual_only, F_LIT_STANDARD);
+               }
+               else
+               {
+                       feat_top = feat_cur;
+                       display_feature_list(max + 3, 6, 1, feat_idx, feat_cur, feat_top, visual_only, *lighting_level);
+                       display_visual_list(max + 3, 7, browser_rows - 1, wid - (max + 3), attr_top, char_left);
+               }
+
+               prt(format(_("<方向>%s, 'd'で標準光源効果%s, ESC", "<dir>%s, 'd' for default lighting%s, ESC"),
+                       visual_list ? _(", ENTERで決定, 'a'で対象明度変更", ", ENTER to accept, 'a' for lighting level") : _(", 'v'でシンボル変更", ", 'v' for visuals"),
+                       (attr_idx || char_idx) ? _(", 'c', 'p'でペースト", ", 'c', 'p' to paste") : _(", 'c'でコピー", ", 'c' to copy")),
+                       hgt - 1, 0);
+
+               f_ptr = &f_info[feat_idx[feat_cur]];
+               cur_attr_ptr = &f_ptr->x_attr[*lighting_level];
+               cur_char_ptr = &f_ptr->x_char[*lighting_level];
+
+               if (visual_list)
+               {
+                       place_visual_list_cursor(max + 3, 7, *cur_attr_ptr, *cur_char_ptr, attr_top, char_left);
+               }
+               else if (!column)
+               {
+                       Term_gotoxy(0, 6 + (grp_cur - grp_top));
+               }
+               else
+               {
+                       Term_gotoxy(max + 3, 6 + (feat_cur - feat_top));
+               }
+
+               ch = inkey();
+               if (visual_list && ((ch == 'A') || (ch == 'a')))
+               {
+                       int prev_lighting_level = *lighting_level;
+
+                       if (ch == 'A')
+                       {
+                               if (*lighting_level <= 0) *lighting_level = F_LIT_MAX - 1;
+                               else (*lighting_level)--;
+                       }
+                       else
+                       {
+                               if (*lighting_level >= F_LIT_MAX - 1) *lighting_level = 0;
+                               else (*lighting_level)++;
+                       }
+
+                       if (f_ptr->x_attr[prev_lighting_level] != f_ptr->x_attr[*lighting_level])
+                               attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
+
+                       if (f_ptr->x_char[prev_lighting_level] != f_ptr->x_char[*lighting_level])
+                               char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
+
+                       continue;
+               }
+               else if ((ch == 'D') || (ch == 'd'))
+               {
+                       TERM_COLOR prev_x_attr = f_ptr->x_attr[*lighting_level];
+                       byte prev_x_char = f_ptr->x_char[*lighting_level];
+
+                       apply_default_feat_lighting(f_ptr->x_attr, f_ptr->x_char);
+
+                       if (visual_list)
+                       {
+                               if (prev_x_attr != f_ptr->x_attr[*lighting_level])
+                                       attr_top = MAX(0, (f_ptr->x_attr[*lighting_level] & 0x7f) - 5);
+
+                               if (prev_x_char != f_ptr->x_char[*lighting_level])
+                                       char_left = MAX(0, f_ptr->x_char[*lighting_level] - 10);
+                       }
+                       else *need_redraw = TRUE;
+
+                       continue;
+               }
+               else if (visual_mode_command(ch, &visual_list, browser_rows - 1, wid - (max + 3), &attr_top, &char_left, cur_attr_ptr, cur_char_ptr, need_redraw))
+               {
+                       switch (ch)
+                       {
+                       case ESCAPE:
+                               for (FEAT_IDX i = 0; i < F_LIT_MAX; i++)
+                               {
+                                       f_ptr->x_attr[i] = attr_old[i];
+                                       f_ptr->x_char[i] = char_old[i];
+                               }
+
+                               /* Fall through */
+                       case '\n':
+                       case '\r':
+                               if (direct_f_idx >= 0) flag = TRUE;
+                               else *lighting_level = F_LIT_STANDARD;
+                               break;
+                       case 'V':
+                       case 'v':
+                               for (FEAT_IDX i = 0; i < F_LIT_MAX; i++)
+                               {
+                                       attr_old[i] = f_ptr->x_attr[i];
+                                       char_old[i] = f_ptr->x_char[i];
+                               }
+                               *lighting_level = F_LIT_STANDARD;
+                               break;
+
+                       case 'C':
+                       case 'c':
+                               if (!visual_list)
+                               {
+                                       for (FEAT_IDX i = 0; i < F_LIT_MAX; i++)
+                                       {
+                                               attr_idx_feat[i] = f_ptr->x_attr[i];
+                                               char_idx_feat[i] = f_ptr->x_char[i];
+                                       }
+                               }
+                               break;
+
+                       case 'P':
+                       case 'p':
+                               if (!visual_list)
+                               {
+                                       for (FEAT_IDX i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
+                                       {
+                                               if (attr_idx_feat[i] || (!(char_idx_feat[i] & 0x80) && char_idx_feat[i])) f_ptr->x_attr[i] = attr_idx_feat[i];
+                                               if (char_idx_feat[i]) f_ptr->x_char[i] = char_idx_feat[i];
+                                       }
+                               }
+                               break;
+                       }
+                       continue;
+               }
+
+               switch (ch)
+               {
+               case ESCAPE:
+               {
+                       flag = TRUE;
+                       break;
+               }
+
+               default:
+               {
+                       browser_cursor(ch, &column, &grp_cur, grp_cnt, &feat_cur, feat_cnt);
+                       break;
+               }
+               }
+       }
+
+       C_KILL(feat_idx, max_f_idx, FEAT_IDX);
+}
+
+
+/*
+ * Dungeon
+ */
+void do_cmd_knowledge_dungeon(player_type *creature_ptr)
+{
+       FILE *fff = NULL;
+       GAME_TEXT file_name[FILE_NAME_SIZE];
+       if (!open_temporary_file(&fff, file_name)) return;
+
+       for (int i = 1; i < current_world_ptr->max_d_idx; i++)
+       {
+               bool seiha = FALSE;
+
+               if (!d_info[i].maxdepth) continue;
+               if (!max_dlv[i]) continue;
+               if (d_info[i].final_guardian)
+               {
+                       if (!r_info[d_info[i].final_guardian].max_num) seiha = TRUE;
+               }
+               else if (max_dlv[i] == d_info[i].maxdepth) seiha = TRUE;
+
+               fprintf(fff, _("%c%-12s :  %3d 階\n", "%c%-16s :  level %3d\n"), seiha ? '!' : ' ', d_name + d_info[i].name, (int)max_dlv[i]);
+       }
+
+       my_fclose(fff);
+       (void)show_file(creature_ptr, TRUE, file_name, _("今までに入ったダンジョン", "Dungeon"), 0, 0);
+       fd_kill(file_name);
+}
diff --git a/src/knowledge/knowledge-features.h b/src/knowledge/knowledge-features.h
new file mode 100644 (file)
index 0000000..beccfdb
--- /dev/null
@@ -0,0 +1,4 @@
+#pragma once
+
+void do_cmd_knowledge_features(bool *need_redraw, bool visual_only, IDX direct_f_idx, IDX *lighting_level);
+void do_cmd_knowledge_dungeon(player_type *creature_ptr);
index 5be8a2b..520e4f2 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * @brief 既知のアーティファクトを表示する
+ * @brief æ\97¢ç\9f¥ã\81®ã\82¢ã\82¤ã\83\86ã\83 ã\81¨ã\82¢ã\83¼ã\83\86ã\82£ã\83\95ã\82¡ã\82¯ã\83\88ã\82\92表示ã\81\99ã\82\8b
  * @date 2020/04/23
  * @author Hourier
  */