OSDN Git Service

[Implement] #40465 撃破したユニークモンスターリストを出力するようにした/ Added output the list of having defeat...
authorHourier <hourier@users.sourceforge.jp>
Thu, 4 Jun 2020 14:27:53 +0000 (23:27 +0900)
committerHourier <hourier@users.sourceforge.jp>
Thu, 4 Jun 2020 14:33:58 +0000 (23:33 +0900)
src/cmd-io/cmd-knowledge.c
src/knowledge/knowledge-uniques.c
src/knowledge/knowledge-uniques.h

index fde289d..abeca51 100644 (file)
@@ -6,8 +6,8 @@
 #include "knowledge/knowledge-features.h"
 #include "knowledge/knowledge-inventory.h"
 #include "knowledge/knowledge-items.h"
-#include "knowledge/knowledge-mutations.h"
 #include "knowledge/knowledge-monsters.h"
+#include "knowledge/knowledge-mutations.h"
 #include "knowledge/knowledge-quests.h"
 #include "knowledge/knowledge-self.h"
 #include "knowledge/knowledge-uniques.h"
  */
 void do_cmd_knowledge(player_type *creature_ptr)
 {
-       int i, p = 0;
-       bool need_redraw = FALSE;
-       screen_save();
-       while (TRUE)
-       {
-               Term_clear();
-               prt(format(_("%d/2 ページ", "page %d/2"), (p + 1)), 2, 65);
-               prt(_("現在の知識を確認する", "Display current knowledge"), 3, 0);
-               if (p == 0)
-               {
-                       prt(_("(1) 既知の伝説のアイテム                 の一覧", "(1) Display known artifacts"), 6, 5);
-                       prt(_("(2) 既知のアイテム                       の一覧", "(2) Display known objects"), 7, 5);
-                       prt(_("(3) 既知の生きているユニーク・モンスター の一覧", "(3) Display remaining uniques"), 8, 5);
-                       prt(_("(4) 既知のモンスター                     の一覧", "(4) Display known monster"), 9, 5);
-                       prt(_("(5) 倒した敵の数                         の一覧", "(5) Display kill count"), 10, 5);
-                       if (!vanilla_town) prt(_("(6) 賞金首                               の一覧", "(6) Display wanted monsters"), 11, 5);
-                       prt(_("(7) 現在のペット                         の一覧", "(7) Display current pets"), 12, 5);
-                       prt(_("(8) 我が家のアイテム                     の一覧", "(8) Display home inventory"), 13, 5);
-                       prt(_("(9) *鑑定*済み装備の耐性                 の一覧", "(9) Display *identified* equip."), 14, 5);
-                       prt(_("(0) 地形の表示文字/タイル                の一覧", "(0) Display terrain symbols."), 15, 5);
-               }
-               else
-               {
-                       prt(_("(a) 自分に関する情報                     の一覧", "(a) Display about yourself"), 6, 5);
-                       prt(_("(b) 突然変異                             の一覧", "(b) Display mutations"), 7, 5);
-                       prt(_("(c) 武器の経験値                         の一覧", "(c) Display weapon proficiency"), 8, 5);
-                       prt(_("(d) 魔法の経験値                         の一覧", "(d) Display spell proficiency"), 9, 5);
-                       prt(_("(e) 技能の経験値                         の一覧", "(e) Display misc. proficiency"), 10, 5);
-                       prt(_("(f) プレイヤーの徳                       の一覧", "(f) Display virtues"), 11, 5);
-                       prt(_("(g) 入ったダンジョン                     の一覧", "(g) Display dungeons"), 12, 5);
-                       prt(_("(h) 実行中のクエスト                     の一覧", "(h) Display current quests"), 13, 5);
-                       prt(_("(i) 現在の自動拾い/破壊設定              の一覧", "(i) Display auto pick/destroy"), 14, 5);
-               }
+    int i, p = 0;
+    bool need_redraw = FALSE;
+    screen_save();
+    while (TRUE) {
+        Term_clear();
+        prt(format(_("%d/2 ページ", "page %d/2"), (p + 1)), 2, 65);
+        prt(_("現在の知識を確認する", "Display current knowledge"), 3, 0);
+        if (p == 0) {
+            prt(_("(1) 既知の伝説のアイテム                 の一覧", "(1) Display known artifacts"), 6, 5);
+            prt(_("(2) 既知のアイテム                       の一覧", "(2) Display known objects"), 7, 5);
+            prt(_("(3) 既知の生きているユニーク・モンスター の一覧", "(3) Display remaining uniques"), 8, 5);
+            prt(_("(4) 既知の撃破したユニーク・モンスター   の一覧", "(3) Display having defeated uniques"), 9, 5);
+            prt(_("(5) 既知のモンスター                     の一覧", "(4) Display known monster"), 10, 5);
+            prt(_("(6) 倒した敵の数                         の一覧", "(5) Display kill count"), 11, 5);
+            if (!vanilla_town)
+                prt(_("(7) 賞金首                               の一覧", "(6) Display wanted monsters"), 12, 5);
+            prt(_("(8) 現在のペット                         の一覧", "(7) Display current pets"), 13, 5);
+            prt(_("(9) 我が家のアイテム                     の一覧", "(8) Display home inventory"), 14, 5);
+            prt(_("(0) *鑑定*済み装備の耐性                 の一覧", "(9) Display *identified* equip."), 15, 5);
+        } else {
+            prt(_("(a) 地形の表示文字/タイル                の一覧", "(0) Display terrain symbols."), 6, 5);
+            prt(_("(b) 自分に関する情報                     の一覧", "(a) Display about yourself"), 7, 5);
+            prt(_("(c) 突然変異                             の一覧", "(b) Display mutations"), 8, 5);
+            prt(_("(d) 武器の経験値                         の一覧", "(c) Display weapon proficiency"), 9, 5);
+            prt(_("(e) 魔法の経験値                         の一覧", "(d) Display spell proficiency"), 10, 5);
+            prt(_("(f) 技能の経験値                         の一覧", "(e) Display misc. proficiency"), 11, 5);
+            prt(_("(g) プレイヤーの徳                       の一覧", "(f) Display virtues"), 12, 5);
+            prt(_("(h) 入ったダンジョン                     の一覧", "(g) Display dungeons"), 13, 5);
+            prt(_("(i) 実行中のクエスト                     の一覧", "(h) Display current quests"), 14, 5);
+            prt(_("(k) 現在の自動拾い/破壊設定              の一覧", "(i) Display auto pick/destroy"), 15, 5);
+        }
 
-               prt(_("-続く-", "-more-"), 17, 8);
-               prt(_("ESC) 抜ける", "ESC) Exit menu"), 21, 1);
-               prt(_("SPACE) 次ページ", "SPACE) Next page"), 21, 30);
-               prt(_("コマンド:", "Command: "), 20, 0);
-               i = inkey();
+        prt(_("-続く-", "-more-"), 17, 8);
+        prt(_("ESC) 抜ける", "ESC) Exit menu"), 21, 1);
+        prt(_("SPACE) 次ページ", "SPACE) Next page"), 21, 30);
+        prt(_("コマンド:", "Command: "), 20, 0);
+        i = inkey();
 
-               if (i == ESCAPE) break;
-               switch (i)
-               {
-               case ' ': /* Page change */
-               case '-':
-                       p = 1 - p;
-                       break;
-               case '1': /* Artifacts */
-                       do_cmd_knowledge_artifacts(creature_ptr);
-                       break;
-               case '2': /* Objects */
-                       do_cmd_knowledge_objects(creature_ptr, &need_redraw, FALSE, -1);
-                       break;
-               case '3': /* Uniques */
-                       do_cmd_knowledge_uniques(creature_ptr);
-                       break;
-               case '4': /* Monsters */
-                       do_cmd_knowledge_monsters(creature_ptr, &need_redraw, FALSE, -1);
-                       break;
-               case '5': /* Kill count  */
-                       do_cmd_knowledge_kill_count(creature_ptr);
-                       break;
-               case '6': /* wanted */
-                       if (!vanilla_town) do_cmd_knowledge_bounty(creature_ptr);
-                       break;
-               case '7': /* Pets */
-                       do_cmd_knowledge_pets(creature_ptr);
-                       break;
-               case '8': /* Home */
-                       do_cmd_knowledge_home(creature_ptr);
-                       break;
-               case '9': /* Resist list */
-                       do_cmd_knowledge_inventory(creature_ptr);
-                       break;
-               case '0': /* Feature list */
-               {
-                       IDX lighting_level = F_LIT_STANDARD;
-                       do_cmd_knowledge_features(&need_redraw, FALSE, -1, &lighting_level);
-               }
-               break;
-               /* Next page */
-               case 'a': /* Max stat */
-                       do_cmd_knowledge_stat(creature_ptr);
-                       break;
-               case 'b': /* Mutations */
-                       do_cmd_knowledge_mutations(creature_ptr);
-                       break;
-               case 'c': /* weapon-exp */
-                       do_cmd_knowledge_weapon_exp(creature_ptr);
-                       break;
-               case 'd': /* spell-exp */
-                       do_cmd_knowledge_spell_exp(creature_ptr);
-                       break;
-               case 'e': /* skill-exp */
-                       do_cmd_knowledge_skill_exp(creature_ptr);
-                       break;
-               case 'f': /* Virtues */
-                       do_cmd_knowledge_virtues(creature_ptr);
-                       break;
-               case 'g': /* Dungeon */
-                       do_cmd_knowledge_dungeon(creature_ptr);
-                       break;
-               case 'h': /* Quests */
-                       do_cmd_knowledge_quests(creature_ptr);
-                       break;
-               case 'i': /* Autopick */
-                       do_cmd_knowledge_autopick(creature_ptr);
-                       break;
-               default: /* Unknown option */
-                       bell();
-               }
+        if (i == ESCAPE)
+            break;
+        switch (i) {
+        case ' ': /* Page change */
+        case '-':
+            p = 1 - p;
+            break;
+        case '1': /* Artifacts */
+            do_cmd_knowledge_artifacts(creature_ptr);
+            break;
+        case '2': /* Objects */
+            do_cmd_knowledge_objects(creature_ptr, &need_redraw, FALSE, -1);
+            break;
+        case '3': /* Uniques */
+            do_cmd_knowledge_uniques(creature_ptr, TRUE);
+            break;
+        case '4': /* Uniques */
+            do_cmd_knowledge_uniques(creature_ptr, FALSE);
+            break;
+        case '5': /* Monsters */
+            do_cmd_knowledge_monsters(creature_ptr, &need_redraw, FALSE, -1);
+            break;
+        case '6': /* Kill count  */
+            do_cmd_knowledge_kill_count(creature_ptr);
+            break;
+        case '7': /* wanted */
+            if (!vanilla_town)
+                do_cmd_knowledge_bounty(creature_ptr);
+            break;
+        case '8': /* Pets */
+            do_cmd_knowledge_pets(creature_ptr);
+            break;
+        case '9': /* Home */
+            do_cmd_knowledge_home(creature_ptr);
+            break;
+        case '0': /* Resist list */
+            do_cmd_knowledge_inventory(creature_ptr);
+            break;
+        /* Next page */
+        case 'a': /* Feature list */
+        {
+            IDX lighting_level = F_LIT_STANDARD;
+            do_cmd_knowledge_features(&need_redraw, FALSE, -1, &lighting_level);
+            break;
+        }
+        case 'b': /* Max stat */
+            do_cmd_knowledge_stat(creature_ptr);
+            break;
+        case 'c': /* Mutations */
+            do_cmd_knowledge_mutations(creature_ptr);
+            break;
+        case 'd': /* weapon-exp */
+            do_cmd_knowledge_weapon_exp(creature_ptr);
+            break;
+        case 'e': /* spell-exp */
+            do_cmd_knowledge_spell_exp(creature_ptr);
+            break;
+        case 'f': /* skill-exp */
+            do_cmd_knowledge_skill_exp(creature_ptr);
+            break;
+        case 'g': /* Virtues */
+            do_cmd_knowledge_virtues(creature_ptr);
+            break;
+        case 'h': /* Dungeon */
+            do_cmd_knowledge_dungeon(creature_ptr);
+            break;
+        case 'i': /* Quests */
+            do_cmd_knowledge_quests(creature_ptr);
+            break;
+        case 'k': /* Autopick */
+            do_cmd_knowledge_autopick(creature_ptr);
+            break;
+        default: /* Unknown option */
+            bell();
+        }
 
-               msg_erase();
-       }
+        msg_erase();
+    }
 
-       screen_load();
-       if (need_redraw) do_cmd_redraw(creature_ptr);
+    screen_load();
+    if (need_redraw)
+        do_cmd_redraw(creature_ptr);
 }
index ea0b816..cacada5 100644 (file)
 #include "knowledge-items.h"
 #include "system/angband.h"
 
-/*
- * Display known uniques
- * With "XTRA HACK UNIQHIST" (Originally from XAngband)
+/*!
+ * @param is_alive 生きているユニークのリストならばTRUE、撃破したユニークのリストならばFALSE
  */
-void do_cmd_knowledge_uniques(player_type *creature_ptr)
+void do_cmd_knowledge_uniques(player_type *creature_ptr, bool is_alive)
 {
     u16b why = 2;
     IDX *who;
-    int n_alive[10];
-    int n_alive_surface = 0;
-    int n_alive_over100 = 0;
-    int n_alive_total = 0;
+    int num_uniques[10];
+    int num_uniques_surface = 0;
+    int num_uniques_over100 = 0;
+    int num_uniques_total = 0;
     int max_lev = -1;
     for (IDX i = 0; i < 10; i++)
-        n_alive[i] = 0;
+        num_uniques[i] = 0;
 
     FILE *fff = NULL;
     GAME_TEXT file_name[FILE_NAME_SIZE];
@@ -43,44 +42,59 @@ void do_cmd_knowledge_uniques(player_type *creature_ptr)
             continue;
         if (!r_ptr->rarity || ((r_ptr->rarity > 100) && !(r_ptr->flags1 & RF1_QUESTOR)))
             continue;
-        if (r_ptr->max_num == 0)
-            continue;
+        if (is_alive) {
+            if (r_ptr->max_num == 0)
+                continue;
+        } else {
+            if (r_ptr->max_num > 0)
+                continue;
+        }
 
         if (r_ptr->level) {
             int lev = (r_ptr->level - 1) / 10;
             if (lev < 10) {
-                n_alive[lev]++;
+                num_uniques[lev]++;
                 if (max_lev < lev)
                     max_lev = lev;
             } else
-                n_alive_over100++;
+                num_uniques_over100++;
         } else
-            n_alive_surface++;
+            num_uniques_surface++;
 
         who[n++] = i;
     }
 
     ang_sort(who, &why, n, ang_sort_comp_hook, ang_sort_swap_hook);
-    if (n_alive_surface) {
-        fprintf(fff, _("     地上  生存: %3d体\n", "      Surface  alive: %3d\n"), n_alive_surface);
-        n_alive_total += n_alive_surface;
+    if (num_uniques_surface) {
+        concptr surface_desc
+            = is_alive ? _("     地上  生存: %3d体\n", "      Surface  alive: %3d\n") : _("     地上  死亡: %3d体\n", "      Surface  dead: %3d\n");
+        fprintf(fff, surface_desc, num_uniques_surface);
+        num_uniques_total += num_uniques_surface;
     }
 
     for (IDX i = 0; i <= max_lev; i++) {
-        fprintf(fff, _("%3d-%3d階  生存: %3d体\n", "Level %3d-%3d  alive: %3d\n"), 1 + i * 10, 10 + i * 10, n_alive[i]);
-        n_alive_total += n_alive[i];
+        concptr dungeon_desc
+            = is_alive ? _("%3d-%3d階  生存: %3d体\n", "Level %3d-%3d  alive: %3d\n") : _("%3d-%3d階  死亡: %3d体\n", "Level %3d-%3d  dead: %3d\n");
+        fprintf(fff, dungeon_desc, 1 + i * 10, 10 + i * 10, num_uniques[i]);
+        num_uniques_total += num_uniques[i];
     }
 
-    if (n_alive_over100) {
-        fprintf(fff, _("101-   階  生存: %3d体\n", "Level 101-     alive: %3d\n"), n_alive_over100);
-        n_alive_total += n_alive_over100;
+    if (num_uniques_over100) {
+        concptr deep_desc
+            = is_alive ? _("101-   階  生存: %3d体\n", "Level 101-     alive: %3d\n") : _("101-   階  死亡: %3d体\n", "Level 101-     dead: %3d\n");
+        fprintf(fff, deep_desc, num_uniques_over100);
+        num_uniques_total += num_uniques_over100;
     }
 
-    if (n_alive_total) {
+    if (num_uniques_total) {
         fputs(_("---------  -----------\n", "-------------  ----------\n"), fff);
-        fprintf(fff, _("     合計  生存: %3d体\n\n", "        Total  alive: %3d\n\n"), n_alive_total);
+        concptr total_desc
+            = is_alive ? _("     合計  生存: %3d体\n\n", "        Total  alive: %3d\n\n") : _("     合計  死亡: %3d体\n\n", "        Total  dead: %3d\n\n");
+        fprintf(fff, total_desc, num_uniques_total);
     } else {
-        fputs(_("現在は既知の生存ユニークはいません。\n", "No known uniques alive.\n"), fff);
+        concptr no_unique_desc = is_alive ? _("現在は既知の生存ユニークはいません。\n", "No known uniques alive.\n")
+                                          : _("現在は既知の撃破ユニークはいません。\n", "No known uniques dead.\n");
+        fputs(no_unique_desc, fff);
     }
 
     for (int k = 0; k < n; k++) {
@@ -90,6 +104,7 @@ void do_cmd_knowledge_uniques(player_type *creature_ptr)
 
     C_KILL(who, max_r_idx, s16b);
     my_fclose(fff);
-    (void)show_file(creature_ptr, TRUE, file_name, _("まだ生きているユニーク・モンスター", "Alive Uniques"), 0, 0);
+    concptr title_desc = is_alive ? _("まだ生きているユニーク・モンスター", "Alive Uniques") : _("もう撃破したユニーク・モンスター", "Dead Uniques");
+    (void)show_file(creature_ptr, TRUE, file_name, title_desc, 0, 0);
     fd_kill(file_name);
 }
index 2cbf5a8..0693657 100644 (file)
@@ -1,3 +1,3 @@
 #pragma once
 
-void do_cmd_knowledge_uniques(player_type *creature_ptr);
+void do_cmd_knowledge_uniques(player_type *creature_ptr, bool is_alive);