OSDN Git Service

[Refactor] #3209 作業範囲の調整:改行、型推論、変数宣言と代入の同一化、stringstreamの使用等
[hengbandforosx/hengbandosx.git] / src / cmd-io / cmd-diary.cpp
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/screen-processor.h"
15 #include "term/z-form.h"
16 #include "util/angband-files.h"
17 #include "util/int-char-converter.h"
18 #include "view/display-messages.h"
19 #include "world/world.h"
20 #include <sstream>
21 #include <string>
22
23 /*!
24  * @brief 日記のタイトル表記と内容出力
25  * @param player_ptr プレイヤーへの参照ポインタ
26  */
27 static void display_diary(PlayerType *player_ptr)
28 {
29     std::stringstream ss;
30     ss << _("playrecord-", "playrec-") << savefile_base << ".txt";
31     char buf[1024];
32     path_build(buf, sizeof(buf), ANGBAND_DIR_USER, ss.str());
33
34     PlayerClass pc(player_ptr);
35     const auto max_subtitles = diary_subtitles.size();
36     std::string subtitle;
37     if (pc.is_tough()) {
38         subtitle = diary_subtitles[randint0(max_subtitles - 1)];
39     } else if (pc.is_wizard()) {
40         subtitle = diary_subtitles[randint0(max_subtitles - 1) + 1];
41     } else {
42         subtitle = diary_subtitles[randint0(max_subtitles - 2) + 1];
43     }
44
45     char diary_title[256];
46 #ifdef JP
47     strnfmt(diary_title, sizeof(diary_title), "「%s%s%sの伝説 -%s-」", ap_ptr->title, ap_ptr->no ? "の" : "", player_ptr->name, subtitle.data());
48 #else
49     strnfmt(diary_title, sizeof(diary_title), "Legend of %s %s '%s'", ap_ptr->title, player_ptr->name, subtitle.data());
50 #endif
51
52     (void)show_file(player_ptr, false, buf, diary_title, -1, 0);
53 }
54
55 /*!
56  * @brief 日記に任意の内容を表記するコマンドのメインルーチン /
57  */
58 static void add_diary_note(PlayerType *player_ptr)
59 {
60     char tmp[80] = "\0";
61     char bunshou[80] = "\0";
62     if (get_string(_("内容: ", "diary note: "), tmp, 79)) {
63         strcpy(bunshou, tmp);
64         exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, bunshou);
65     }
66 }
67
68 /*!
69  * @brief 最後に取得したアイテムの情報を日記に追加するメインルーチン /
70  */
71 static void do_cmd_last_get(PlayerType *player_ptr)
72 {
73     if (record_o_name[0] == '\0') {
74         return;
75     }
76
77     char buf[256];
78     strnfmt(buf, sizeof(buf), _("%sの入手を記録します。", "Do you really want to record getting %s? "), record_o_name);
79     if (!get_check(buf)) {
80         return;
81     }
82
83     GAME_TURN turn_tmp = w_ptr->game_turn;
84     w_ptr->game_turn = record_turn;
85     strnfmt(buf, sizeof(buf), _("%sを手に入れた。", "discover %s."), record_o_name);
86     exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, buf);
87     w_ptr->game_turn = turn_tmp;
88 }
89
90 /*!
91  * @brief ファイル中の全日記記録を消去する /
92  */
93 static void do_cmd_erase_diary()
94 {
95     if (!get_check(_("本当に記録を消去しますか?", "Do you really want to delete all your records? "))) {
96         return;
97     }
98
99     std::stringstream ss;
100     ss << _("playrecord-", "playrec-") << savefile_base << ".txt";
101     char buf[256];
102     path_build(buf, sizeof(buf), ANGBAND_DIR_USER, ss.str());
103     fd_kill(buf);
104
105     auto *fff = angband_fopen(buf, FileOpenMode::WRITE);
106     if (fff) {
107         angband_fclose(fff);
108         msg_format(_("記録を消去しました。", "deleted record."));
109     } else {
110         msg_format(_("%s の消去に失敗しました。", "failed to delete %s."), buf);
111     }
112
113     msg_print(nullptr);
114 }
115
116 /*!
117  * @brief 日記コマンド
118  * @param crerature_ptr プレイヤーへの参照ポインタ
119  */
120 void do_cmd_diary(PlayerType *player_ptr)
121 {
122     screen_save();
123     while (true) {
124         term_clear();
125         prt(_("[ 記録の設定 ]", "[ Play Record ]"), 2, 0);
126         prt(_("(1) 記録を見る", "(1) Display your record"), 4, 5);
127         prt(_("(2) 文章を記録する", "(2) Add record"), 5, 5);
128         prt(_("(3) 直前に入手又は鑑定したものを記録する", "(3) Record the last item you got or identified"), 6, 5);
129         prt(_("(4) 記録を消去する", "(4) Delete your record"), 7, 5);
130         prt(_("(R) プレイ動画を記録する/中止する", "(R) Record playing movie / or stop it"), 9, 5);
131         prt(_("コマンド:", "Command: "), 18, 0);
132         int i = inkey();
133         if (i == ESCAPE) {
134             break;
135         }
136
137         switch (i) {
138         case '1':
139             display_diary(player_ptr);
140             break;
141         case '2':
142             add_diary_note(player_ptr);
143             break;
144         case '3':
145             do_cmd_last_get(player_ptr);
146             break;
147         case '4':
148             do_cmd_erase_diary();
149             break;
150         case 'r':
151         case 'R':
152             screen_load();
153             prepare_movie_hooks(player_ptr);
154             return;
155         default:
156             bell();
157         }
158
159         msg_erase();
160     }
161
162     screen_load();
163 }