1 #include "market/building-monster.h"
2 #include "core/asking-player.h"
3 #include "core/stuff-handler.h"
4 #include "game-option/game-play-options.h"
5 #include "io/input-key-acceptor.h"
6 #include "lore/lore-store.h"
7 #include "lore/lore-util.h"
8 #include "monster-race/monster-race.h"
9 #include "monster-race/race-flags1.h"
10 #include "system/monster-race-definition.h"
11 #include "term/gameterm.h"
12 #include "term/screen-processor.h"
13 #include "term/term-color-types.h"
14 #include "util/int-char-converter.h"
15 #include "util/sort.h"
16 #include "util/string-processor.h"
17 #include "view/display-lore.h"
20 * @brief 施設でモンスターの情報を知るメインルーチン / research_mon -KMW-
21 * @param player_ptr プレイヤーへの参照ポインタ
23 * @todo 返り値が意味不明なので直した方が良いかもしれない。
25 bool research_mon(PlayerType *player_ptr)
35 char temp[MAX_MONSTER_NAME] = "";
41 _("モンスターの文字を入力して下さい(記号 or ^A全,^Uユ,^N非ユ,^M名前):", "Enter character to be identified(^A:All,^U:Uniqs,^N:Non uniqs,^M:Name): "),
50 for (ident_i = 0; ident_info[ident_i]; ++ident_i) {
51 if (sym == ident_info[ident_i][0])
55 /* XTRA HACK WHATSEARCH */
56 if (sym == KTRL('A')) {
58 strcpy(buf, _("全モンスターのリスト", "Full monster list."));
59 } else if (sym == KTRL('U')) {
61 strcpy(buf, _("ユニーク・モンスターのリスト", "Unique monster list."));
62 } else if (sym == KTRL('N')) {
64 strcpy(buf, _("ユニーク外モンスターのリスト", "Non-unique monster list."));
65 } else if (sym == KTRL('M')) {
67 if (!get_string(_("名前(英語の場合小文字で可)", "Enter name:"), temp, 70)) {
74 sprintf(buf, _("名前:%sにマッチ", "Monsters' names with \"%s\""), temp);
75 } else if (ident_info[ident_i]) {
76 sprintf(buf, "%c - %s.", sym, ident_info[ident_i] + 2);
78 sprintf(buf, "%c - %s", sym, _("無効な文字", "Unknown Symbol"));
81 /* Display the result */
84 /* Allocate the "who" array */
85 std::vector<MONRACE_IDX> who;
87 /* Collect matching monsters */
88 for (const auto &r_ref : r_info) {
90 if (r_ref.idx == 0 || r_ref.name.empty())
93 /* XTRA HACK WHATSEARCH */
94 /* Require non-unique monsters if needed */
95 if (norm && r_ref.kind_flags.has(MonsterKindType::UNIQUE))
98 /* Require unique monsters if needed */
99 if (uniq && r_ref.kind_flags.has_not(MonsterKindType::UNIQUE))
104 for (int xx = 0; temp[xx] && xx < 80; xx++) {
106 if (iskanji(temp[xx])) {
111 if (isupper(temp[xx]))
112 temp[xx] = (char)tolower(temp[xx]);
115 char temp2[MAX_MONSTER_NAME];
117 strcpy(temp2, r_ref.E_name.c_str());
119 strcpy(temp2, r_ref.name.c_str());
121 for (int xx = 0; temp2[xx] && xx < 80; xx++) {
122 if (isupper(temp2[xx]))
123 temp2[xx] = (char)tolower(temp2[xx]);
127 if (angband_strstr(temp2, temp) || angband_strstr(r_ref.name.c_str(), temp))
129 if (angband_strstr(temp2, temp))
131 who.push_back(r_ref.idx);
132 } else if (all || (r_ref.d_char == sym)) {
133 who.push_back(r_ref.idx);
147 ang_sort(player_ptr, who.data(), &why, who.size(), ang_sort_comp_hook, ang_sort_swap_hook);
151 static int old_sym = '\0';
152 static uint old_i = 0;
153 if (old_sym == sym && old_i < who.size())
162 term_addstr(-1, TERM_WHITE, _(" ['r'思い出, ' 'で続行, ESC]", " [(r)ecall, ESC, space to continue]"));
165 lore_do_probe(player_ptr, r_idx);
166 monster_race_track(player_ptr, r_idx);
167 handle_stuff(player_ptr);
168 screen_roff(player_ptr, r_idx, MONSTER_LORE_RESEARCH);
185 if (++i == who.size()) {