1 #include "cmd-io/cmd-lore.h"
2 #include "core/asking-player.h"
3 #include "core/stuff-handler.h"
4 #include "game-option/cheat-options.h"
5 #include "game-option/game-play-options.h"
6 #include "io/input-key-acceptor.h"
7 #include "lore/lore-util.h"
8 #include "monster-race/monster-race.h"
9 #include "monster-race/race-flags1.h"
10 #include "monster-race/race-flags7.h"
11 #include "system/monster-race-info.h"
12 #include "system/player-type-definition.h"
13 #include "term/gameterm.h"
14 #include "term/screen-processor.h"
15 #include "term/term-color-types.h"
16 #include "term/z-form.h"
17 #include "util/int-char-converter.h"
18 #include "util/sort.h"
19 #include "util/string-processor.h"
20 #include "view/display-lore.h"
23 * @brief モンスターの思い出を見るコマンドのメインルーチン
24 * Identify a character, allow recall of monsters
25 * @param player_ptr プレイヤーへの参照ポインタ
28 * Several "special" responses recall "multiple" monsters:
30 * ^U (all unique monsters)
31 * ^N (all non-unique monsters)
33 * The responses may be sorted in several ways, see below.
35 * Note that the player ghosts are ignored.
38 void do_cmd_query_symbol(PlayerType *player_ptr)
46 char temp[MAX_MONSTER_NAME] = "";
52 if (!get_com(_("知りたい文字を入力して下さい(記号 or ^A全,^Uユ,^N非ユ,^R乗馬,^M名前): ",
53 "Enter character to be identified(^A:All,^U:Uniqs,^N:Non uniqs,^M:Name): "),
59 for (ident_i = 0; ident_info[ident_i]; ++ident_i) {
60 if (sym == ident_info[ident_i][0]) {
66 if (sym == KTRL('A')) {
68 buf = _("全モンスターのリスト", "Full monster list.");
69 } else if (sym == KTRL('U')) {
71 buf = _("ユニーク・モンスターのリスト", "Unique monster list.");
72 } else if (sym == KTRL('N')) {
74 buf = _("ユニーク外モンスターのリスト", "Non-unique monster list.");
75 } else if (sym == KTRL('R')) {
77 buf = _("乗馬可能モンスターのリスト", "Ridable monster list.");
78 } else if (sym == KTRL('M')) {
80 if (!get_string(_("名前(英語の場合小文字で可)", "Enter name:"), temp, 70)) {
84 buf = format(_("名前:%sにマッチ", "Monsters' names with \"%s\""), temp);
85 } else if (ident_info[ident_i]) {
86 buf = format("%c - %s.", sym, ident_info[ident_i] + 2);
88 buf = format("%c - %s", sym, _("無効な文字", "Unknown Symbol"));
92 std::vector<MonsterRaceId> who;
93 for (const auto &[r_idx, r_ref] : monraces_info) {
94 if (!cheat_know && !r_ref.r_sights) {
98 if (norm && r_ref.kind_flags.has(MonsterKindType::UNIQUE)) {
102 if (uniq && r_ref.kind_flags.has_not(MonsterKindType::UNIQUE)) {
106 if (ride && !(r_ref.flags7 & (RF7_RIDING))) {
112 char temp2[MAX_MONSTER_NAME];
114 for (xx = 0; temp[xx] && xx < MAX_MONSTER_NAME; xx++) {
116 if (iskanji(temp[xx])) {
121 if (isupper(temp[xx])) {
122 temp[xx] = (char)tolower(temp[xx]);
127 strcpy(temp2, r_ref.E_name.data());
129 strcpy(temp2, r_ref.name.data());
131 for (xx = 0; temp2[xx] && xx < MAX_MONSTER_NAME; xx++) {
132 if (isupper(temp2[xx])) {
133 temp2[xx] = (char)tolower(temp2[xx]);
138 if (angband_strstr(temp2, temp) || angband_strstr(r_ref.name.data(), temp))
140 if (angband_strstr(temp2, temp))
142 who.push_back(r_ref.idx);
145 else if (all || (r_ref.d_char == sym)) {
146 who.push_back(r_ref.idx);
154 put_str(_("思い出を見ますか? (k:殺害順/y/n): ", "Recall details? (k/y/n): "), 0, _(36, 40));
158 ang_sort(player_ptr, who.data(), &why, who.size(), ang_sort_comp_hook, ang_sort_swap_hook);
169 ang_sort(player_ptr, who.data(), &why, who.size(), ang_sort_comp_hook, ang_sort_swap_hook);
172 auto i = who.size() - 1;
175 monster_race_track(player_ptr, r_idx);
176 handle_stuff(player_ptr);
180 screen_roff(player_ptr, who[i], MONSTER_LORE_NORMAL);
184 term_addstr(-1, TERM_WHITE, _(" ['r'思い出, ESC]", " [(r)ecall, ESC]"));
196 if (query == ESCAPE) {
201 if (++i == who.size()) {