OSDN Git Service

[Refactor] #40236 Separated knowledge-quests.c/h from cmd-dump.c/h
authorHourier <hourier@users.sourceforge.jp>
Thu, 23 Apr 2020 14:56:18 +0000 (23:56 +0900)
committerHourier <hourier@users.sourceforge.jp>
Thu, 23 Apr 2020 14:56:18 +0000 (23:56 +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/knowledge/knowledge-quests.c [new file with mode: 0644]
src/knowledge/knowledge-quests.h [new file with mode: 0644]

index 7d8468f..ffb462c 100644 (file)
     <ClCompile Include="..\..\src\cmd\dump-util.c" />\r
     <ClCompile Include="..\..\src\knowledge\knowledge-artifacts.c" />\r
     <ClCompile Include="..\..\src\knowledge\knowledge-experiences.c" />\r
+    <ClCompile Include="..\..\src\knowledge\knowledge-quests.c" />\r
     <ClCompile Include="..\..\src\knowledge\knowledge-uniques.c" />\r
     <ClCompile Include="..\..\src\main\music-definitions-table.c" />\r
     <ClCompile Include="..\..\src\main\sound-definitions-table.c" />\r
     <ClInclude Include="..\..\src\cmd\dump-util.h" />\r
     <ClInclude Include="..\..\src\knowledge\knowledge-artifacts.h" />\r
     <ClInclude Include="..\..\src\knowledge\knowledge-experiences.h" />\r
+    <ClInclude Include="..\..\src\knowledge\knowledge-quests.h" />\r
     <ClInclude Include="..\..\src\knowledge\knowledge-uniques.h" />\r
     <ClInclude Include="..\..\src\main\music-definitions-table.h" />\r
     <ClInclude Include="..\..\src\main\sound-definitions-table.h" />\r
index 70b2964..c1a4ba5 100644 (file)
     <ClCompile Include="..\..\src\object\object-kind-hook.c">
       <Filter>object</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\knowledge\knowledge-quests.c">
+      <Filter>knowledge</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\src\gamevalue.h" />
     <ClInclude Include="..\..\src\object\object-kind-hook.h">
       <Filter>object</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\knowledge\knowledge-quests.h">
+      <Filter>knowledge</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\src\wall.bmp" />
index cc865cf..f395575 100644 (file)
@@ -152,6 +152,7 @@ hengband_SOURCES = \
        knowledge/knowledge-artifacts.c knowledge/knowledge-artifacts.h \
        knowledge/knowledge-experiences.c knowledge/knowledge-experiences.h \
        knowledge/knowledge-uniques.c knowledge/knowledge-uniques.h \
+       knowledge/knowledge-quests.c knowledge/knowledge-quests.h \
        \
        cmd/dump-util.c cmd/dump-util.h cmd/feeling-table.c cmd/feeling-table.h \
        cmd/monster-group-table.c cmd/monster-group-table.h \
index f5c58d6..2a20ef6 100644 (file)
@@ -45,6 +45,7 @@
 
 #include "knowledge/knowledge-artifacts.h"
 #include "knowledge/knowledge-experiences.h"
+#include "knowledge/knowledge-quests.h"
 #include "knowledge/knowledge-uniques.h"
 
 #include "autopick.h"
@@ -52,9 +53,6 @@
 #include "dungeon.h"
 #include "world.h"
 #include "view/display-player.h" // 暫定。後で消す.
-#include "player/process-name.h"
-#include "player-effects.h"
-#include "player-skill.h"
 #include "player-personality.h"
 #include "sort.h"
 #include "mutation.h"
@@ -63,7 +61,6 @@
 #include "artifact.h"
 #include "avatar.h"
 #include "object-flavor.h"
-#include "object-hook.h"
 #include "monster-status.h"
 #include "dungeon-file.h"
 #include "object/object-kind.h"
@@ -1889,327 +1886,6 @@ static void do_cmd_knowledge_stat(player_type *creature_ptr)
 
 
 /*
- * todo player_typeではなくQUEST_IDXを引数にすべきかもしれない
- * Print all active quests
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @return なし
- */
-static void do_cmd_knowledge_quests_current(player_type *creature_ptr, FILE *fff)
-{
-       char tmp_str[120];
-       char rand_tmp_str[120] = "\0";
-       GAME_TEXT name[MAX_NLEN];
-       monster_race *r_ptr;
-       int rand_level = 100;
-       int total = 0;
-
-       fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n"));
-
-       for (QUEST_IDX i = 1; i < max_q_idx; i++)
-       {
-               bool is_print = quest[i].status == QUEST_STATUS_TAKEN;
-               is_print |= (quest[i].status == QUEST_STATUS_STAGE_COMPLETED) && (quest[i].type == QUEST_TYPE_TOWER);
-               is_print |= quest[i].status == QUEST_STATUS_COMPLETED;
-               if (!is_print)
-                       continue;
-
-               QUEST_IDX old_quest = creature_ptr->current_floor_ptr->inside_quest;
-               for (int j = 0; j < 10; j++)
-                       quest_text[j][0] = '\0';
-
-               quest_text_line = 0;
-               creature_ptr->current_floor_ptr->inside_quest = i;
-               init_flags = INIT_SHOW_TEXT;
-               process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
-               creature_ptr->current_floor_ptr->inside_quest = old_quest;
-               if (quest[i].flags & QUEST_FLAG_SILENT) continue;
-
-               total++;
-               if (quest[i].type != QUEST_TYPE_RANDOM)
-               {
-                       char note[80] = "\0";
-
-                       if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_STAGE_COMPLETED)
-                       {
-                               switch (quest[i].type)
-                               {
-                               case QUEST_TYPE_KILL_LEVEL:
-                               case QUEST_TYPE_KILL_ANY_LEVEL:
-                                       r_ptr = &r_info[quest[i].r_idx];
-                                       strcpy(name, r_name + r_ptr->name);
-                                       if (quest[i].max_num > 1)
-                                       {
-#ifdef JP
-                                               sprintf(note, " - %d 体の%sを倒す。(あと %d 体)",
-                                                       (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
-#else
-                                               plural_aux(name);
-                                               sprintf(note, " - kill %d %s, have killed %d.",
-                                                       (int)quest[i].max_num, name, (int)quest[i].cur_num);
-#endif
-                                       }
-                                       else
-                                               sprintf(note, _(" - %sを倒す。", " - kill %s."), name);
-                                       break;
-
-                               case QUEST_TYPE_FIND_ARTIFACT:
-                                       if (quest[i].k_idx)
-                                       {
-                                               artifact_type *a_ptr = &a_info[quest[i].k_idx];
-                                               object_type forge;
-                                               object_type *q_ptr = &forge;
-                                               KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
-                                               object_prep(q_ptr, k_idx);
-                                               q_ptr->name1 = quest[i].k_idx;
-                                               q_ptr->ident = IDENT_STORE;
-                                               object_desc(creature_ptr, name, q_ptr, OD_NAME_ONLY);
-                                       }
-                                       sprintf(note, _("\n   - %sを見つけ出す。", "\n   - Find %s."), name);
-                                       break;
-                               case QUEST_TYPE_FIND_EXIT:
-                                       sprintf(note, _(" - 出口に到達する。", " - Reach exit."));
-                                       break;
-
-                               case QUEST_TYPE_KILL_NUMBER:
-#ifdef JP
-                                       sprintf(note, " - %d 体のモンスターを倒す。(あと %d 体)",
-                                               (int)quest[i].max_num, (int)(quest[i].max_num - quest[i].cur_num));
-#else
-                                       sprintf(note, " - Kill %d monsters, have killed %d.",
-                                               (int)quest[i].max_num, (int)quest[i].cur_num);
-#endif
-                                       break;
-
-                               case QUEST_TYPE_KILL_ALL:
-                               case QUEST_TYPE_TOWER:
-                                       sprintf(note, _(" - 全てのモンスターを倒す。", " - Kill all monsters."));
-                                       break;
-                               }
-                       }
-
-                       sprintf(tmp_str, _("  %s (危険度:%d階相当)%s\n", "  %s (Danger level: %d)%s\n"),
-                               quest[i].name, (int)quest[i].level, note);
-                       fputs(tmp_str, fff);
-                       if (quest[i].status == QUEST_STATUS_COMPLETED)
-                       {
-                               sprintf(tmp_str, _("    クエスト達成 - まだ報酬を受けとってない。\n", "    Quest Completed - Unrewarded\n"));
-                               fputs(tmp_str, fff);
-                               continue;
-                       }
-
-                       int k = 0;
-                       while (quest_text[k][0] && k < 10)
-                       {
-                               fprintf(fff, "    %s\n", quest_text[k]);
-                               k++;
-                       }
-
-                       continue;
-               }
-
-               if (quest[i].level >= rand_level)
-                       continue;
-
-               rand_level = quest[i].level;
-               if (max_dlv[DUNGEON_ANGBAND] < rand_level) continue;
-
-               r_ptr = &r_info[quest[i].r_idx];
-               strcpy(name, r_name + r_ptr->name);
-               if (quest[i].max_num <= 1)
-               {
-                       sprintf(rand_tmp_str, _("  %s (%d 階) - %sを倒す。\n", "  %s (Dungeon level: %d)\n  Kill %s.\n"),
-                               quest[i].name, (int)quest[i].level, name);
-                       continue;
-               }
-
-#ifdef JP
-               sprintf(rand_tmp_str, "  %s (%d 階) - %d 体の%sを倒す。(あと %d 体)\n",
-                       quest[i].name, (int)quest[i].level,
-                       (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
-#else
-               plural_aux(name);
-
-               sprintf(rand_tmp_str, "  %s (Dungeon level: %d)\n  Kill %d %s, have killed %d.\n",
-                       quest[i].name, (int)quest[i].level,
-                       (int)quest[i].max_num, name, (int)quest[i].cur_num);
-#endif
-       }
-
-       if (rand_tmp_str[0]) fputs(rand_tmp_str, fff);
-
-       if (!total) fprintf(fff, _("  なし\n", "  Nothing.\n"));
-}
-
-
-static bool do_cmd_knowledge_quests_aux(player_type *player_ptr, FILE *fff, IDX q_idx)
-{
-       char tmp_str[120];
-       char playtime_str[16];
-       quest_type* const q_ptr = &quest[q_idx];
-
-       floor_type *floor_ptr = player_ptr->current_floor_ptr;
-       if (is_fixed_quest_idx(q_idx))
-       {
-               IDX old_quest = floor_ptr->inside_quest;
-               floor_ptr->inside_quest = q_idx;
-               init_flags = INIT_NAME_ONLY;
-               process_dungeon_file(player_ptr, "q_info.txt", 0, 0, 0, 0);
-               floor_ptr->inside_quest = old_quest;
-               if (q_ptr->flags & QUEST_FLAG_SILENT) return FALSE;
-       }
-
-       strnfmt(playtime_str, sizeof(playtime_str), "%02d:%02d:%02d",
-               q_ptr->comptime / (60 * 60), (q_ptr->comptime / 60) % 60, q_ptr->comptime % 60);
-
-       if (is_fixed_quest_idx(q_idx) || (q_ptr->r_idx == 0))
-       {
-               sprintf(tmp_str,
-                       _("  %-35s (危険度:%3d階相当) - レベル%2d - %s\n",
-                               "  %-35s (Danger  level: %3d) - level %2d - %s\n"),
-                       q_ptr->name, (int)q_ptr->level, q_ptr->complev, playtime_str);
-               fputs(tmp_str, fff);
-               return TRUE;
-       }
-
-       if (q_ptr->complev == 0)
-       {
-               sprintf(tmp_str,
-                       _("  %-35s (%3d階)            -   不戦勝 - %s\n",
-                               "  %-35s (Dungeon level: %3d) - Unearned - %s\n"),
-                       r_name + r_info[q_ptr->r_idx].name,
-                       (int)q_ptr->level, playtime_str);
-               fputs(tmp_str, fff);
-               return TRUE;
-       }
-
-       sprintf(tmp_str,
-               _("  %-35s (%3d階)            - レベル%2d - %s\n",
-                       "  %-35s (Dungeon level: %3d) - level %2d - %s\n"),
-               r_name + r_info[q_ptr->r_idx].name,
-               (int)q_ptr->level,
-               q_ptr->complev,
-               playtime_str);
-       fputs(tmp_str, fff);
-       return TRUE;
-}
-
-
-/*
- * Print all finished quests
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param fff セーブファイル (展開済?)
- * @param quest_num[] 受注したことのあるクエスト群
- * @return なし
- */
-void do_cmd_knowledge_quests_completed(player_type *creature_ptr, FILE *fff, QUEST_IDX quest_num[])
-{
-       fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n"));
-       QUEST_IDX total = 0;
-       for (QUEST_IDX i = 1; i < max_q_idx; i++)
-       {
-               QUEST_IDX q_idx = quest_num[i];
-               quest_type* const q_ptr = &quest[q_idx];
-
-               if (q_ptr->status == QUEST_STATUS_FINISHED && do_cmd_knowledge_quests_aux(creature_ptr, fff, q_idx))
-               {
-                       ++total;
-               }
-       }
-
-       if (!total) fprintf(fff, _("  なし\n", "  Nothing.\n"));
-}
-
-
-/*
- * Print all failed quests
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @param fff セーブファイル (展開済?)
- * @param quest_num[] 受注したことのあるクエスト群
- * @return なし
-*/
-void do_cmd_knowledge_quests_failed(player_type *creature_ptr, FILE *fff, QUEST_IDX quest_num[])
-{
-       fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n"));
-       QUEST_IDX total = 0;
-       for (QUEST_IDX i = 1; i < max_q_idx; i++)
-       {
-               QUEST_IDX q_idx = quest_num[i];
-               quest_type* const q_ptr = &quest[q_idx];
-
-               if (((q_ptr->status == QUEST_STATUS_FAILED_DONE) || (q_ptr->status == QUEST_STATUS_FAILED)) &&
-                       do_cmd_knowledge_quests_aux(creature_ptr, fff, q_idx))
-               {
-                       ++total;
-               }
-       }
-
-       if (!total) fprintf(fff, _("  なし\n", "  Nothing.\n"));
-}
-
-
-/*
- * Print all random quests
- */
-static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
-{
-       fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n"));
-       GAME_TEXT tmp_str[120];
-       QUEST_IDX total = 0;
-       for (QUEST_IDX i = 1; i < max_q_idx; i++)
-       {
-               if (quest[i].flags & QUEST_FLAG_SILENT) continue;
-
-               if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
-               {
-                       total++;
-                       sprintf(tmp_str, _("  %s (%d階, %s)\n", "  %s (%d, %s)\n"),
-                               quest[i].name, (int)quest[i].level, r_name + r_info[quest[i].r_idx].name);
-                       fputs(tmp_str, fff);
-               }
-       }
-
-       if (!total) fprintf(fff, _("  なし\n", "  Nothing.\n"));
-}
-
-/*
- * Print quest status of all active quests
- * @param creature_ptr プレーヤーへの参照ポインタ
- * @return なし
- */
-static void do_cmd_knowledge_quests(player_type *creature_ptr)
-{
-       FILE *fff = NULL;
-       GAME_TEXT file_name[FILE_NAME_SIZE];
-       if (!open_temporary_file(&fff, file_name)) return;
-
-       IDX *quest_num;
-       C_MAKE(quest_num, max_q_idx, QUEST_IDX);
-
-       for (IDX i = 1; i < max_q_idx; i++)
-               quest_num[i] = i;
-
-       int dummy;
-       ang_sort(quest_num, &dummy, max_q_idx, ang_sort_comp_quest_num, ang_sort_swap_quest_num);
-
-       do_cmd_knowledge_quests_current(creature_ptr, fff);
-       fputc('\n', fff);
-       do_cmd_knowledge_quests_completed(creature_ptr, fff, quest_num);
-       fputc('\n', fff);
-       do_cmd_knowledge_quests_failed(creature_ptr, fff, quest_num);
-       if (current_world_ptr->wizard)
-       {
-               fputc('\n', fff);
-               do_cmd_knowledge_quests_wiz_random(fff);
-       }
-
-       my_fclose(fff);
-       (void)show_file(creature_ptr, TRUE, file_name, _("クエスト達成状況", "Quest status"), 0, 0);
-       fd_kill(file_name);
-       C_KILL(quest_num, max_q_idx, QUEST_IDX);
-}
-
-
-/*
  * List my home
  * @param player_ptr プレーヤーへの参照ポインタ
  * @return なし
index 9853182..f5b3db9 100644 (file)
@@ -6,8 +6,6 @@ extern void do_cmd_colors(player_type *creature_ptr);
 extern void do_cmd_note(void);
 extern void do_cmd_version(void);
 extern void do_cmd_feeling(player_type *creature_ptr);
-extern void do_cmd_knowledge_quests_completed(player_type *creature_ptr, FILE *fff, QUEST_IDX quest_num[]);
-extern void do_cmd_knowledge_quests_failed(player_type *creature_ptr, FILE *fff, QUEST_IDX quest_num[]);
 extern void do_cmd_knowledge(player_type *creature_ptr);
 extern void do_cmd_checkquest(player_type *creature_ptr);
 extern void do_cmd_time(player_type *creature_ptr);
diff --git a/src/knowledge/knowledge-quests.c b/src/knowledge/knowledge-quests.c
new file mode 100644 (file)
index 0000000..fa599c3
--- /dev/null
@@ -0,0 +1,332 @@
+#include "angband.h"
+#include "knowledge-quests.h"
+#include "cmd/dump-util.h"
+#include "quest.h"
+#include "core.h" // init_flagsのため。後で消すかも.
+#include "artifact.h"
+#include "object-flavor.h"
+#include "dungeon.h"
+#include "dungeon-file.h"
+#include "sort.h"
+#include "world.h"
+#include "core/show-file.h"
+
+/*
+ * todo player_typeではなくQUEST_IDXを引数にすべきかもしれない
+ * Print all active quests
+ * @param creature_ptr プレーヤーへの参照ポインタ
+ * @return なし
+ */
+static void do_cmd_knowledge_quests_current(player_type *creature_ptr, FILE *fff)
+{
+       char tmp_str[120];
+       char rand_tmp_str[120] = "\0";
+       GAME_TEXT name[MAX_NLEN];
+       monster_race *r_ptr;
+       int rand_level = 100;
+       int total = 0;
+
+       fprintf(fff, _("《遂行中のクエスト》\n", "< Current Quest >\n"));
+
+       for (QUEST_IDX i = 1; i < max_q_idx; i++)
+       {
+               bool is_print = quest[i].status == QUEST_STATUS_TAKEN;
+               is_print |= (quest[i].status == QUEST_STATUS_STAGE_COMPLETED) && (quest[i].type == QUEST_TYPE_TOWER);
+               is_print |= quest[i].status == QUEST_STATUS_COMPLETED;
+               if (!is_print)
+                       continue;
+
+               QUEST_IDX old_quest = creature_ptr->current_floor_ptr->inside_quest;
+               for (int j = 0; j < 10; j++)
+                       quest_text[j][0] = '\0';
+
+               quest_text_line = 0;
+               creature_ptr->current_floor_ptr->inside_quest = i;
+               init_flags = INIT_SHOW_TEXT;
+               process_dungeon_file(creature_ptr, "q_info.txt", 0, 0, 0, 0);
+               creature_ptr->current_floor_ptr->inside_quest = old_quest;
+               if (quest[i].flags & QUEST_FLAG_SILENT) continue;
+
+               total++;
+               if (quest[i].type != QUEST_TYPE_RANDOM)
+               {
+                       char note[80] = "\0";
+
+                       if (quest[i].status == QUEST_STATUS_TAKEN || quest[i].status == QUEST_STATUS_STAGE_COMPLETED)
+                       {
+                               switch (quest[i].type)
+                               {
+                               case QUEST_TYPE_KILL_LEVEL:
+                               case QUEST_TYPE_KILL_ANY_LEVEL:
+                                       r_ptr = &r_info[quest[i].r_idx];
+                                       strcpy(name, r_name + r_ptr->name);
+                                       if (quest[i].max_num > 1)
+                                       {
+#ifdef JP
+                                               sprintf(note, " - %d 体の%sを倒す。(あと %d 体)",
+                                                       (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
+#else
+                                               plural_aux(name);
+                                               sprintf(note, " - kill %d %s, have killed %d.",
+                                                       (int)quest[i].max_num, name, (int)quest[i].cur_num);
+#endif
+                                       }
+                                       else
+                                               sprintf(note, _(" - %sを倒す。", " - kill %s."), name);
+                                       break;
+
+                               case QUEST_TYPE_FIND_ARTIFACT:
+                                       if (quest[i].k_idx)
+                                       {
+                                               artifact_type *a_ptr = &a_info[quest[i].k_idx];
+                                               object_type forge;
+                                               object_type *q_ptr = &forge;
+                                               KIND_OBJECT_IDX k_idx = lookup_kind(a_ptr->tval, a_ptr->sval);
+                                               object_prep(q_ptr, k_idx);
+                                               q_ptr->name1 = quest[i].k_idx;
+                                               q_ptr->ident = IDENT_STORE;
+                                               object_desc(creature_ptr, name, q_ptr, OD_NAME_ONLY);
+                                       }
+                                       sprintf(note, _("\n   - %sを見つけ出す。", "\n   - Find %s."), name);
+                                       break;
+                               case QUEST_TYPE_FIND_EXIT:
+                                       sprintf(note, _(" - 出口に到達する。", " - Reach exit."));
+                                       break;
+
+                               case QUEST_TYPE_KILL_NUMBER:
+#ifdef JP
+                                       sprintf(note, " - %d 体のモンスターを倒す。(あと %d 体)",
+                                               (int)quest[i].max_num, (int)(quest[i].max_num - quest[i].cur_num));
+#else
+                                       sprintf(note, " - Kill %d monsters, have killed %d.",
+                                               (int)quest[i].max_num, (int)quest[i].cur_num);
+#endif
+                                       break;
+
+                               case QUEST_TYPE_KILL_ALL:
+                               case QUEST_TYPE_TOWER:
+                                       sprintf(note, _(" - 全てのモンスターを倒す。", " - Kill all monsters."));
+                                       break;
+                               }
+                       }
+
+                       sprintf(tmp_str, _("  %s (危険度:%d階相当)%s\n", "  %s (Danger level: %d)%s\n"),
+                               quest[i].name, (int)quest[i].level, note);
+                       fputs(tmp_str, fff);
+                       if (quest[i].status == QUEST_STATUS_COMPLETED)
+                       {
+                               sprintf(tmp_str, _("    クエスト達成 - まだ報酬を受けとってない。\n", "    Quest Completed - Unrewarded\n"));
+                               fputs(tmp_str, fff);
+                               continue;
+                       }
+
+                       int k = 0;
+                       while (quest_text[k][0] && k < 10)
+                       {
+                               fprintf(fff, "    %s\n", quest_text[k]);
+                               k++;
+                       }
+
+                       continue;
+               }
+
+               if (quest[i].level >= rand_level)
+                       continue;
+
+               rand_level = quest[i].level;
+               if (max_dlv[DUNGEON_ANGBAND] < rand_level) continue;
+
+               r_ptr = &r_info[quest[i].r_idx];
+               strcpy(name, r_name + r_ptr->name);
+               if (quest[i].max_num <= 1)
+               {
+                       sprintf(rand_tmp_str, _("  %s (%d 階) - %sを倒す。\n", "  %s (Dungeon level: %d)\n  Kill %s.\n"),
+                               quest[i].name, (int)quest[i].level, name);
+                       continue;
+               }
+
+#ifdef JP
+               sprintf(rand_tmp_str, "  %s (%d 階) - %d 体の%sを倒す。(あと %d 体)\n",
+                       quest[i].name, (int)quest[i].level,
+                       (int)quest[i].max_num, name, (int)(quest[i].max_num - quest[i].cur_num));
+#else
+               plural_aux(name);
+
+               sprintf(rand_tmp_str, "  %s (Dungeon level: %d)\n  Kill %d %s, have killed %d.\n",
+                       quest[i].name, (int)quest[i].level,
+                       (int)quest[i].max_num, name, (int)quest[i].cur_num);
+#endif
+       }
+
+       if (rand_tmp_str[0]) fputs(rand_tmp_str, fff);
+
+       if (!total) fprintf(fff, _("  なし\n", "  Nothing.\n"));
+}
+
+
+static bool do_cmd_knowledge_quests_aux(player_type *player_ptr, FILE *fff, IDX q_idx)
+{
+       char tmp_str[120];
+       char playtime_str[16];
+       quest_type* const q_ptr = &quest[q_idx];
+
+       floor_type *floor_ptr = player_ptr->current_floor_ptr;
+       if (is_fixed_quest_idx(q_idx))
+       {
+               IDX old_quest = floor_ptr->inside_quest;
+               floor_ptr->inside_quest = q_idx;
+               init_flags = INIT_NAME_ONLY;
+               process_dungeon_file(player_ptr, "q_info.txt", 0, 0, 0, 0);
+               floor_ptr->inside_quest = old_quest;
+               if (q_ptr->flags & QUEST_FLAG_SILENT) return FALSE;
+       }
+
+       strnfmt(playtime_str, sizeof(playtime_str), "%02d:%02d:%02d",
+               q_ptr->comptime / (60 * 60), (q_ptr->comptime / 60) % 60, q_ptr->comptime % 60);
+
+       if (is_fixed_quest_idx(q_idx) || (q_ptr->r_idx == 0))
+       {
+               sprintf(tmp_str,
+                       _("  %-35s (危険度:%3d階相当) - レベル%2d - %s\n",
+                               "  %-35s (Danger  level: %3d) - level %2d - %s\n"),
+                       q_ptr->name, (int)q_ptr->level, q_ptr->complev, playtime_str);
+               fputs(tmp_str, fff);
+               return TRUE;
+       }
+
+       if (q_ptr->complev == 0)
+       {
+               sprintf(tmp_str,
+                       _("  %-35s (%3d階)            -   不戦勝 - %s\n",
+                               "  %-35s (Dungeon level: %3d) - Unearned - %s\n"),
+                       r_name + r_info[q_ptr->r_idx].name,
+                       (int)q_ptr->level, playtime_str);
+               fputs(tmp_str, fff);
+               return TRUE;
+       }
+
+       sprintf(tmp_str,
+               _("  %-35s (%3d階)            - レベル%2d - %s\n",
+                       "  %-35s (Dungeon level: %3d) - level %2d - %s\n"),
+               r_name + r_info[q_ptr->r_idx].name,
+               (int)q_ptr->level,
+               q_ptr->complev,
+               playtime_str);
+       fputs(tmp_str, fff);
+       return TRUE;
+}
+
+
+/*
+ * Print all finished quests
+ * @param creature_ptr プレーヤーへの参照ポインタ
+ * @param fff セーブファイル (展開済?)
+ * @param quest_num[] 受注したことのあるクエスト群
+ * @return なし
+ */
+void do_cmd_knowledge_quests_completed(player_type *creature_ptr, FILE *fff, QUEST_IDX quest_num[])
+{
+       fprintf(fff, _("《達成したクエスト》\n", "< Completed Quest >\n"));
+       QUEST_IDX total = 0;
+       for (QUEST_IDX i = 1; i < max_q_idx; i++)
+       {
+               QUEST_IDX q_idx = quest_num[i];
+               quest_type* const q_ptr = &quest[q_idx];
+
+               if (q_ptr->status == QUEST_STATUS_FINISHED && do_cmd_knowledge_quests_aux(creature_ptr, fff, q_idx))
+               {
+                       ++total;
+               }
+       }
+
+       if (!total) fprintf(fff, _("  なし\n", "  Nothing.\n"));
+}
+
+
+/*
+ * Print all failed quests
+ * @param creature_ptr プレーヤーへの参照ポインタ
+ * @param fff セーブファイル (展開済?)
+ * @param quest_num[] 受注したことのあるクエスト群
+ * @return なし
+*/
+void do_cmd_knowledge_quests_failed(player_type *creature_ptr, FILE *fff, QUEST_IDX quest_num[])
+{
+       fprintf(fff, _("《失敗したクエスト》\n", "< Failed Quest >\n"));
+       QUEST_IDX total = 0;
+       for (QUEST_IDX i = 1; i < max_q_idx; i++)
+       {
+               QUEST_IDX q_idx = quest_num[i];
+               quest_type* const q_ptr = &quest[q_idx];
+
+               if (((q_ptr->status == QUEST_STATUS_FAILED_DONE) || (q_ptr->status == QUEST_STATUS_FAILED)) &&
+                       do_cmd_knowledge_quests_aux(creature_ptr, fff, q_idx))
+               {
+                       ++total;
+               }
+       }
+
+       if (!total) fprintf(fff, _("  なし\n", "  Nothing.\n"));
+}
+
+
+/*
+ * Print all random quests
+ */
+static void do_cmd_knowledge_quests_wiz_random(FILE *fff)
+{
+       fprintf(fff, _("《残りのランダムクエスト》\n", "< Remaining Random Quest >\n"));
+       GAME_TEXT tmp_str[120];
+       QUEST_IDX total = 0;
+       for (QUEST_IDX i = 1; i < max_q_idx; i++)
+       {
+               if (quest[i].flags & QUEST_FLAG_SILENT) continue;
+
+               if ((quest[i].type == QUEST_TYPE_RANDOM) && (quest[i].status == QUEST_STATUS_TAKEN))
+               {
+                       total++;
+                       sprintf(tmp_str, _("  %s (%d階, %s)\n", "  %s (%d, %s)\n"),
+                               quest[i].name, (int)quest[i].level, r_name + r_info[quest[i].r_idx].name);
+                       fputs(tmp_str, fff);
+               }
+       }
+
+       if (!total) fprintf(fff, _("  なし\n", "  Nothing.\n"));
+}
+
+/*
+ * Print quest status of all active quests
+ * @param creature_ptr プレーヤーへの参照ポインタ
+ * @return なし
+ */
+void do_cmd_knowledge_quests(player_type *creature_ptr)
+{
+       FILE *fff = NULL;
+       GAME_TEXT file_name[FILE_NAME_SIZE];
+       if (!open_temporary_file(&fff, file_name)) return;
+
+       IDX *quest_num;
+       C_MAKE(quest_num, max_q_idx, QUEST_IDX);
+
+       for (IDX i = 1; i < max_q_idx; i++)
+               quest_num[i] = i;
+
+       int dummy;
+       ang_sort(quest_num, &dummy, max_q_idx, ang_sort_comp_quest_num, ang_sort_swap_quest_num);
+
+       do_cmd_knowledge_quests_current(creature_ptr, fff);
+       fputc('\n', fff);
+       do_cmd_knowledge_quests_completed(creature_ptr, fff, quest_num);
+       fputc('\n', fff);
+       do_cmd_knowledge_quests_failed(creature_ptr, fff, quest_num);
+       if (current_world_ptr->wizard)
+       {
+               fputc('\n', fff);
+               do_cmd_knowledge_quests_wiz_random(fff);
+       }
+
+       my_fclose(fff);
+       (void)show_file(creature_ptr, TRUE, file_name, _("クエスト達成状況", "Quest status"), 0, 0);
+       fd_kill(file_name);
+       C_KILL(quest_num, max_q_idx, QUEST_IDX);
+}
diff --git a/src/knowledge/knowledge-quests.h b/src/knowledge/knowledge-quests.h
new file mode 100644 (file)
index 0000000..6734d7a
--- /dev/null
@@ -0,0 +1,5 @@
+#pragma once
+
+void do_cmd_knowledge_quests_completed(player_type *creature_ptr, FILE *fff, QUEST_IDX quest_num[]);
+void do_cmd_knowledge_quests_failed(player_type *creature_ptr, FILE *fff, QUEST_IDX quest_num[]);
+void do_cmd_knowledge_quests(player_type *creature_ptr);