2 * @brief プレイヤーのインターフェイスに関するコマンドの実装 / Interface commands
5 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
6 * This software may be copied and distributed for educational, research,
7 * and not for profit purposes provided that this copyright and statement
8 * are included in all such copies. Other copyrights may also apply.
9 * 2020 Hourier Rearranged
12 #include "cmd-io/cmd-dump.h"
13 #include "cmd-io/feeling-table.h"
14 #include "core/asking-player.h"
15 #include "dungeon/quest.h"
16 #include "floor/floor-town.h"
17 #include "io-dump/dump-remover.h"
18 #include "io-dump/dump-util.h"
19 #include "io/files-util.h"
20 #include "io/input-key-acceptor.h"
21 #include "io/interpret-pref-file.h"
22 #include "io/read-pref-file.h"
23 #include "locale/english.h"
24 #include "main/sound-of-music.h"
25 #include "mutation/mutation-flag-types.h"
26 #include "player/player-personality-types.h"
27 #include "player/player-status-flags.h"
28 #include "player/player-status.h"
29 #include "system/angband-version.h"
30 #include "system/dungeon-info.h"
31 #include "system/floor-type-definition.h"
32 #include "system/player-type-definition.h"
33 #include "term/gameterm.h"
34 #include "term/screen-processor.h"
35 #include "term/term-color-types.h"
36 #include "timed-effect/player-hallucination.h"
37 #include "timed-effect/timed-effects.h"
38 #include "util/angband-files.h"
39 #include "util/int-char-converter.h"
40 #include "view/display-messages.h"
41 #include "view/display-player.h" // 暫定。後で消す.
42 #include "world/world.h"
45 * @brief 画面を再描画するコマンドのメインルーチン
46 * Hack -- redraw the screen
47 * @param player_ptr プレイヤーへの参照ポインタ
49 * Allow absolute file names?
51 void do_cmd_pref(PlayerType *player_ptr)
53 const auto input_str = input_string(_("設定変更コマンド: ", "Pref: "), 80);
54 if (!input_str.has_value()) {
58 auto buf(input_str.value());
59 (void)interpret_pref_file(player_ptr, buf.data());
63 * Interact with "colors"
65 void do_cmd_colors(PlayerType *player_ptr)
67 FILE *auto_dump_stream;
69 const auto initial_filename = format("%s.prf", player_ptr->base_name);
72 prt(_("[ カラーの設定 ]", "Interact with Colors"), 2, 0);
73 prt(_("(1) ユーザー設定ファイルのロード", "(1) Load a user pref file"), 4, 5);
74 prt(_("(2) カラーの設定をファイルに書き出す", "(2) Dump colors"), 5, 5);
75 prt(_("(3) カラーの設定を変更する", "(3) Modify colors"), 6, 5);
76 prt(_("コマンド: ", "Command: "), 8, 0);
77 const auto key = inkey();
84 prt(_("コマンド: ユーザー設定ファイルをロードします", "Command: Load a user pref file"), 8, 0);
85 prt(_("ファイル: ", "File: "), 10, 0);
86 const auto ask_result = askfor(70, initial_filename);
91 (void)process_pref_file(player_ptr, *ask_result, true);
92 term_xtra(TERM_XTRA_REACT, 0);
97 constexpr auto mark = "Colors";
98 prt(_("コマンド: カラーの設定をファイルに書き出します", "Command: Dump colors"), 8, 0);
99 prt(_("ファイル: ", "File: "), 10, 0);
100 const auto ask_result = askfor(70, initial_filename);
105 const auto &path = path_build(ANGBAND_DIR_USER, *ask_result);
106 if (!open_auto_dump(&auto_dump_stream, path, mark)) {
110 auto_dump_printf(auto_dump_stream, _("\n# カラーの設定\n\n", "\n# Color redefinitions\n\n"));
111 for (auto i = 0; i < 256; i++) {
112 int kv = angband_color_table[i][0];
113 int rv = angband_color_table[i][1];
114 int gv = angband_color_table[i][2];
115 int bv = angband_color_table[i][3];
117 auto name = _("未知", "unknown");
118 if (!kv && !rv && !gv && !bv) {
123 name = color_names[i];
126 auto_dump_printf(auto_dump_stream, _("# カラー '%s'\n", "# Color '%s'\n"), name);
127 auto_dump_printf(auto_dump_stream, "V:%d:0x%02X:0x%02X:0x%02X:0x%02X\n\n", i, kv, rv, gv, bv);
130 close_auto_dump(&auto_dump_stream, mark);
131 msg_print(_("カラーの設定をファイルに書き出しました。", "Dumped color redefinitions."));
136 prt(_("コマンド: カラーの設定を変更します", "Command: Modify colors"), 8, 0);
140 for (byte i = 0; i < 16; i++) {
141 term_putstr(i * 4, 20, -1, a, "###");
142 term_putstr(i * 4, 22, -1, i, format("%3d", i));
145 name = ((a < 16) ? color_names[a] : _("未定義", "undefined"));
146 term_putstr(5, 10, -1, TERM_WHITE, format(_("カラー = %d, 名前 = %s", "Color = %d, Name = %s"), a, name));
147 term_putstr(5, 12, -1, TERM_WHITE,
148 format("K = 0x%02x / R,G,B = 0x%02x,0x%02x,0x%02x", angband_color_table[a][0], angband_color_table[a][1], angband_color_table[a][2],
149 angband_color_table[a][3]));
150 term_putstr(0, 14, -1, TERM_WHITE, _("コマンド (n/N/k/K/r/R/g/G/b/B): ", "Command (n/N/k/K/r/R/g/G/b/B): "));
158 angband_color_table[a][3] = (byte)(angband_color_table[a][3] + 1);
161 angband_color_table[a][3] = (byte)(angband_color_table[a][3] - 1);
164 angband_color_table[a][2] = (byte)(angband_color_table[a][2] + 1);
167 angband_color_table[a][2] = (byte)(angband_color_table[a][2] - 1);
170 angband_color_table[a][0] = (byte)(angband_color_table[a][0] + 1);
173 angband_color_table[a][0] = (byte)(angband_color_table[a][0] - 1);
182 angband_color_table[a][1] = (byte)(angband_color_table[a][1] + 1);
185 angband_color_table[a][1] = (byte)(angband_color_table[a][1] - 1);
191 term_xtra(TERM_XTRA_REACT, 0);
209 * Note something in the message recall
211 void do_cmd_note(void)
213 const auto note_opt = input_string(_("メモ: ", "Note: "), 60);
214 if (!note_opt.has_value() || note_opt->empty()) {
218 const auto note(note_opt.value());
219 msg_format(_("メモ: %s", "Note: %s"), note.data());
223 * Mention the current version
225 void do_cmd_version(void)
227 msg_print(get_version());
231 * Note that "feeling" is set to zero unless some time has passed.
232 * Note that this is done when the level is GENERATED, not entered.
234 void do_cmd_feeling(PlayerType *player_ptr)
236 if (player_ptr->wild_mode) {
240 const auto &floor = *player_ptr->current_floor_ptr;
241 if (floor.is_in_quest() && !inside_quest(floor.get_random_quest_id())) {
242 msg_print(_("典型的なクエストのダンジョンのようだ。", "Looks like a typical quest level."));
246 if (player_ptr->town_num && !floor.is_in_dungeon()) {
247 if (towns_info[player_ptr->town_num].name == _("荒野", "wilderness")) {
248 msg_print(_("何かありそうな荒野のようだ。", "Looks like a strange wilderness."));
252 msg_print(_("典型的な町のようだ。", "Looks like a typical town."));
256 if (!floor.is_in_dungeon()) {
257 msg_print(_("典型的な荒野のようだ。", "Looks like a typical wilderness."));
261 if (has_good_luck(player_ptr)) {
262 msg_print(do_cmd_feeling_text_lucky[player_ptr->feeling]);
263 } else if (is_echizen(player_ptr)) {
264 msg_print(do_cmd_feeling_text_combat[player_ptr->feeling]);
266 msg_print(do_cmd_feeling_text[player_ptr->feeling]);
271 * Display the time and date
272 * @param player_ptr プレイヤーへの参照ポインタ
274 void do_cmd_time(PlayerType *player_ptr)
277 extract_day_hour_min(player_ptr, &day, &hour, &min);
278 std::string desc = _("変な時刻だ。", "It is a strange time.");
279 std::string day_buf = (day < MAX_DAYS) ? std::to_string(day) : "*****";
280 constexpr auto mes = _("%s日目, 時刻は%d:%02d %sです。", "This is day %s. The time is %d:%02d %s.");
281 msg_format(mes, day_buf.data(), (hour % 12 == 0) ? 12 : (hour % 12), min, (hour < 12) ? "AM" : "PM");
282 std::filesystem::path path;
283 if (!randint0(10) || player_ptr->effects()->hallucination()->is_hallucinated()) {
284 path = path_build(ANGBAND_DIR_FILE, _("timefun_j.txt", "timefun.txt"));
286 path = path_build(ANGBAND_DIR_FILE, _("timenorm_j.txt", "timenorm.txt"));
289 auto *fff = angband_fopen(path, FileOpenMode::READ);
294 auto full = hour * 100 + min;
299 while (!angband_fgets(fff, buf, sizeof(buf))) {
300 if (!buf[0] || (buf[0] == '#')) {
308 start = atoi(buf + 2);
318 if ((start > full) || (full > end)) {
324 if (!randint0(num)) {