7 #include "knowledge/knowledge-self.h"
8 #include "avatar/avatar.h"
9 #include "birth/birth-explanations-table.h"
10 #include "core/show-file.h"
11 #include "flavor/flavor-describer.h"
12 #include "floor/floor-town.h"
13 #include "info-reader/fixed-map-parser.h"
14 #include "io-dump/dump-util.h"
15 #include "player-info/alignment.h"
16 #include "player-info/class-info.h"
17 #include "player/player-personality.h"
18 #include "player/player-status-table.h"
19 #include "player/race-info-table.h"
20 #include "realm/realm-names-table.h"
21 #include "store/store-util.h"
22 #include "system/item-entity.h"
23 #include "system/player-type-definition.h"
24 #include "util/angband-files.h"
25 #include "util/buffer-shaper.h"
26 #include "util/enum-converter.h"
27 #include "util/int-char-converter.h"
28 #include "util/string-processor.h"
29 #include "world/world.h"
33 * List virtues & status
35 void do_cmd_knowledge_virtues(PlayerType *player_ptr)
38 GAME_TEXT file_name[FILE_NAME_SIZE];
39 if (!open_temporary_file(&fff, file_name)) {
43 std::string alg = PlayerAlignment(player_ptr).get_alignment_description();
44 fprintf(fff, _("現在の属性 : %s\n\n", "Your alignment : %s\n\n"), alg.data());
45 dump_virtues(player_ptr, fff);
47 (void)show_file(player_ptr, true, file_name, _("八つの徳", "Virtues"), 0, 0);
52 * @brief 自分に関する情報を画面に表示する
53 * @param player_ptr プレイヤーへの参照ポインタ
56 static void dump_yourself(PlayerType *player_ptr, FILE *fff)
63 shape_buffer(race_explanations[enum2i(player_ptr->prace)].data(), 78, temp, sizeof(temp));
65 fprintf(fff, _("種族: %s\n", "Race: %s\n"), race_info[enum2i(player_ptr->prace)].title);
68 for (int i = 0; i < 10; i++) {
72 fprintf(fff, "%s\n", t);
76 auto short_pclass = enum2i(player_ptr->pclass);
77 shape_buffer(class_explanations[short_pclass].data(), 78, temp, sizeof(temp));
79 fprintf(fff, _("職業: %s\n", "Class: %s\n"), class_info[short_pclass].title);
82 for (int i = 0; i < 10; i++) {
86 fprintf(fff, "%s\n", t);
90 shape_buffer(personality_explanations[player_ptr->ppersonality].data(), 78, temp, sizeof(temp));
92 fprintf(fff, _("性格: %s\n", "Pesonality: %s\n"), personality_info[player_ptr->ppersonality].title);
95 for (int i = 0; i < A_MAX; i++) {
99 fprintf(fff, "%s\n", t);
104 if (player_ptr->realm1) {
105 shape_buffer(realm_explanations[technic2magic(player_ptr->realm1) - 1].data(), 78, temp, sizeof(temp));
106 fprintf(fff, _("魔法: %s\n", "Realm: %s\n"), realm_names[player_ptr->realm1]);
109 for (int i = 0; i < A_MAX; i++) {
114 fprintf(fff, "%s\n", t);
120 if (player_ptr->realm2) {
121 shape_buffer(realm_explanations[technic2magic(player_ptr->realm2) - 1].data(), 78, temp, sizeof(temp));
122 fprintf(fff, _("魔法: %s\n", "Realm: %s\n"), realm_names[player_ptr->realm2]);
125 for (int i = 0; i < A_MAX; i++) {
130 fprintf(fff, "%s\n", t);
137 * @brief 勝利済みの職業をダンプする
138 * @param fff ファイルストリームのポインタ
140 static void dump_winner_classes(FILE *fff)
142 int n = w_ptr->sf_winner.count();
143 concptr ss = n > 1 ? _("", "s") : "";
144 fprintf(fff, _("*勝利*済みの職業%s : %d\n", "Class of *Winner%s* : %d\n"), ss, n);
152 for (int c = 0; c < PLAYER_CLASS_TYPE_MAX; c++) {
153 if (w_ptr->sf_winner.has_not(i2enum<PlayerClassType>(c))) {
157 auto &cl = class_info[c];
158 auto t = std::string(cl.title);
160 if (w_ptr->sf_retired.has_not(i2enum<PlayerClassType>(c))) {
164 if (l.size() + t.size() + 2 > max_len) {
165 fprintf(fff, " %s\n", str_rtrim(l).data());
175 fprintf(fff, " %s\n", str_rtrim(l).data());
180 * List virtues & status
183 void do_cmd_knowledge_stat(PlayerType *player_ptr)
186 GAME_TEXT file_name[FILE_NAME_SIZE];
187 if (!open_temporary_file(&fff, file_name)) {
192 uint32_t play_time = w_ptr->play_time;
193 uint32_t all_time = w_ptr->sf_play_time + play_time;
194 fprintf(fff, _("現在のプレイ時間 : %d:%02d:%02d\n", "Current Play Time is %d:%02d:%02d\n"), play_time / (60 * 60), (play_time / 60) % 60, play_time % 60);
195 fprintf(fff, _("合計のプレイ時間 : %d:%02d:%02d\n", " Total play Time is %d:%02d:%02d\n"), all_time / (60 * 60), (all_time / 60) % 60, all_time % 60);
198 int percent = (int)(((long)player_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) / (2 * player_ptr->hitdie + ((PY_MAX_LEVEL - 1 + 3) * (player_ptr->hitdie + 1))));
200 if (player_ptr->knowledge & KNOW_HPRATE) {
201 fprintf(fff, _("現在の体力ランク : %d/100\n\n", "Your current Life Rating is %d/100.\n\n"), percent);
203 fprintf(fff, _("現在の体力ランク : ???\n\n", "Your current Life Rating is ???.\n\n"));
206 fprintf(fff, _("能力の最大値\n\n", "Limits of maximum stats\n\n"));
207 for (int v_nr = 0; v_nr < A_MAX; v_nr++) {
208 if ((player_ptr->knowledge & KNOW_STAT) || player_ptr->stat_max[v_nr] == player_ptr->stat_max_max[v_nr]) {
209 fprintf(fff, "%s 18/%d\n", stat_names[v_nr], player_ptr->stat_max_max[v_nr] - 18);
211 fprintf(fff, "%s ???\n", stat_names[v_nr]);
215 dump_yourself(player_ptr, fff);
216 dump_winner_classes(fff);
219 (void)show_file(player_ptr, true, file_name, _("自分に関する情報", "HP-rate & Max stat"), 0, 0);
225 * @param player_ptr プレイヤーへの参照ポインタ
227 void do_cmd_knowledge_home(PlayerType *player_ptr)
229 parse_fixed_map(player_ptr, WILDERNESS_DEFINITION, 0, 0, w_ptr->max_wild_y, w_ptr->max_wild_x);
232 GAME_TEXT file_name[FILE_NAME_SIZE];
233 if (!open_temporary_file(&fff, file_name)) {
237 store_type *store_ptr;
238 store_ptr = &town_info[1].store[enum2i(StoreSaleType::HOME)];
240 if (store_ptr->stock_num) {
244 fprintf(fff, _(" [ 我が家のアイテム ]\n", " [Home Inventory]\n"));
246 GAME_TEXT o_name[MAX_NLEN];
247 for (int i = 0; i < store_ptr->stock_num; i++) {
250 fprintf(fff, "\n ( %d ページ )\n", x++);
252 describe_flavor(player_ptr, o_name, &store_ptr->stock[i], 0);
253 if (strlen(o_name) <= 80 - 3) {
254 fprintf(fff, "%c%s %s\n", I2A(i % 12), paren, o_name);
258 for (n = 0, t = o_name; n < 80 - 3; n++, t++) {
268 fprintf(fff, "%c%s %.*s\n", I2A(i % 12), paren, n, o_name);
269 fprintf(fff, " %.77s\n", o_name + n);
272 describe_flavor(player_ptr, o_name, &store_ptr->stock[i], 0);
273 fprintf(fff, "%c%s %s\n", I2A(i % 12), paren, o_name);
277 fprintf(fff, "\n\n");
281 (void)show_file(player_ptr, true, file_name, _("我が家のアイテム", "Home Inventory"), 0, 0);