1 #include "cmd-io/cmd-diary.h"
2 #include "cmd-io/diary-subtitle-table.h"
3 #include "core/asking-player.h"
4 #include "core/show-file.h"
5 #include "game-option/play-record-options.h"
6 #include "io/files-util.h"
7 #include "io/input-key-acceptor.h"
8 #include "io/record-play-movie.h"
9 #include "io/write-diary.h"
10 #include "main/sound-of-music.h"
11 #include "player-base/player-class.h"
12 #include "player/player-personality.h"
13 #include "system/player-type-definition.h"
14 #include "term/gameterm.h"
15 #include "term/screen-processor.h"
16 #include "term/z-form.h"
17 #include "util/angband-files.h"
18 #include "util/int-char-converter.h"
19 #include "view/display-messages.h"
20 #include "world/world.h"
26 * @brief 日記のタイトル表記と内容出力
27 * @param player_ptr プレイヤーへの参照ポインタ
29 static void display_diary(PlayerType *player_ptr)
31 PlayerClass pc(player_ptr);
32 std::span<const std::string> subtitle_candidates;
34 subtitle_candidates = { diary_subtitles.begin(), diary_subtitles.end() - 1 };
35 } else if (pc.is_wizard()) {
36 subtitle_candidates = { diary_subtitles.begin() + 1, diary_subtitles.end() };
38 subtitle_candidates = { diary_subtitles.begin() + 1, diary_subtitles.end() - 1 };
41 const auto choice = Rand_external(subtitle_candidates.size());
42 const auto &subtitle = subtitle_candidates[choice];
44 const auto diary_title = format("「%s%s%sの伝説 -%s-」", ap_ptr->title, ap_ptr->no ? "の" : "", player_ptr->name, subtitle.data());
46 const auto diary_title = format("Legend of %s %s '%s'", ap_ptr->title, player_ptr->name, subtitle.data());
50 ss << _("playrecord-", "playrec-") << savefile_base << ".txt";
51 const auto &path = path_build(ANGBAND_DIR_USER, ss.str());
52 const auto &filename = path.string();
53 (void)show_file(player_ptr, false, filename.data(), diary_title.data(), -1, 0);
57 * @brief 日記に任意の内容を表記するコマンドのメインルーチン /
59 static void add_diary_note(PlayerType *player_ptr)
62 char bunshou[80] = "\0";
63 if (get_string(_("内容: ", "diary note: "), tmp, 79)) {
65 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, bunshou);
70 * @brief 最後に取得したアイテムの情報を日記に追加するメインルーチン /
72 static void do_cmd_last_get(PlayerType *player_ptr)
74 if (record_o_name[0] == '\0') {
79 strnfmt(buf, sizeof(buf), _("%sの入手を記録します。", "Do you really want to record getting %s? "), record_o_name);
80 if (!get_check(buf)) {
84 GAME_TURN turn_tmp = w_ptr->game_turn;
85 w_ptr->game_turn = record_turn;
86 strnfmt(buf, sizeof(buf), _("%sを手に入れた。", "discover %s."), record_o_name);
87 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, buf);
88 w_ptr->game_turn = turn_tmp;
92 * @brief ファイル中の全日記記録を消去する /
94 static void do_cmd_erase_diary()
96 if (!get_check(_("本当に記録を消去しますか?", "Do you really want to delete all your records? "))) {
100 std::stringstream ss;
101 ss << _("playrecord-", "playrec-") << savefile_base << ".txt";
102 const auto &path = path_build(ANGBAND_DIR_USER, ss.str());
105 auto *fff = angband_fopen(path, FileOpenMode::WRITE);
108 msg_format(_("記録を消去しました。", "deleted record."));
110 const auto &filename = path.string();
111 msg_format(_("%s の消去に失敗しました。", "failed to delete %s."), filename.data());
119 * @param crerature_ptr プレイヤーへの参照ポインタ
121 void do_cmd_diary(PlayerType *player_ptr)
124 TermCenteredOffsetSetter tcos(MAIN_TERM_MIN_COLS, MAIN_TERM_MIN_ROWS);
128 prt(_("[ 記録の設定 ]", "[ Play Record ]"), 2, 0);
129 prt(_("(1) 記録を見る", "(1) Display your record"), 4, 5);
130 prt(_("(2) 文章を記録する", "(2) Add record"), 5, 5);
131 prt(_("(3) 直前に入手又は鑑定したものを記録する", "(3) Record the last item you got or identified"), 6, 5);
132 prt(_("(4) 記録を消去する", "(4) Delete your record"), 7, 5);
133 prt(_("(R) プレイ動画を記録する/中止する", "(R) Record playing movie / or stop it"), 9, 5);
134 prt(_("コマンド:", "Command: "), 18, 0);
142 display_diary(player_ptr);
145 add_diary_note(player_ptr);
148 do_cmd_last_get(player_ptr);
151 do_cmd_erase_diary();
156 prepare_movie_hooks(player_ptr);