OSDN Git Service

[Refactor] #40413 Separated int-char-converter.h
[hengband/hengband.git] / src / knowledge / knowledge-self.c
1 /*!
2  * @brief 自己に関する情報を表示する
3  * @date 2020/04/24
4  * @author Hourier
5  */
6
7 #include "knowledge-self.h"
8 #include "birth/birth-explanations-table.h"
9 #include "core/show-file.h"
10 #include "floor/floor-town.h"
11 #include "info-reader/fixed-map-parser.h"
12 #include "io-dump/dump-util.h"
13 #include "object/object-flavor.h"
14 #include "player/avatar.h"
15 #include "store/store-util.h"
16 #include "util/angband-files.h"
17 #include "util/int-char-converter.h"
18 #include "world/world.h"
19
20 /*
21  * List virtues & status
22  */
23 void do_cmd_knowledge_virtues(player_type *creature_ptr)
24 {
25     FILE *fff = NULL;
26     GAME_TEXT file_name[FILE_NAME_SIZE];
27     if (!open_temporary_file(&fff, file_name))
28         return;
29
30     fprintf(fff, _("現在の属性 : %s\n\n", "Your alignment : %s\n\n"), your_alignment(creature_ptr));
31     dump_virtues(creature_ptr, fff);
32     angband_fclose(fff);
33     (void)show_file(creature_ptr, TRUE, file_name, _("八つの徳", "Virtues"), 0, 0);
34     fd_kill(file_name);
35 }
36
37 /*!
38  * @brief 自分に関する情報を画面に表示する
39  * @param creature_ptr プレーヤーへの参照ポインタ
40  * @param fff ファイルポインタ
41  * @return なし
42  */
43 static void dump_yourself(player_type *creature_ptr, FILE *fff)
44 {
45     if (!fff)
46         return;
47
48     char temp[80 * 10];
49     roff_to_buf(race_explanations[creature_ptr->prace], 78, temp, sizeof(temp));
50     fprintf(fff, "\n\n");
51     fprintf(fff, _("種族: %s\n", "Race: %s\n"), race_info[creature_ptr->prace].title);
52     concptr t = temp;
53
54     for (int i = 0; i < 10; i++) {
55         if (t[0] == 0)
56             break;
57         fprintf(fff, "%s\n", t);
58         t += strlen(t) + 1;
59     }
60
61     roff_to_buf(class_explanations[creature_ptr->pclass], 78, temp, sizeof(temp));
62     fprintf(fff, "\n");
63     fprintf(fff, _("職業: %s\n", "Class: %s\n"), class_info[creature_ptr->pclass].title);
64
65     t = temp;
66     for (int i = 0; i < 10; i++) {
67         if (t[0] == 0)
68             break;
69         fprintf(fff, "%s\n", t);
70         t += strlen(t) + 1;
71     }
72
73     roff_to_buf(personality_explanations[creature_ptr->pseikaku], 78, temp, sizeof(temp));
74     fprintf(fff, "\n");
75     fprintf(fff, _("性格: %s\n", "Pesonality: %s\n"), personality_info[creature_ptr->pseikaku].title);
76
77     t = temp;
78     for (int i = 0; i < A_MAX; i++) {
79         if (t[0] == 0)
80             break;
81         fprintf(fff, "%s\n", t);
82         t += strlen(t) + 1;
83     }
84
85     fprintf(fff, "\n");
86     if (creature_ptr->realm1) {
87         roff_to_buf(realm_explanations[technic2magic(creature_ptr->realm1) - 1], 78, temp, sizeof(temp));
88         fprintf(fff, _("魔法: %s\n", "Realm: %s\n"), realm_names[creature_ptr->realm1]);
89
90         t = temp;
91         for (int i = 0; i < A_MAX; i++) {
92             if (t[0] == 0)
93                 break;
94
95             fprintf(fff, "%s\n", t);
96             t += strlen(t) + 1;
97         }
98     }
99
100     fprintf(fff, "\n");
101     if (creature_ptr->realm2) {
102         roff_to_buf(realm_explanations[technic2magic(creature_ptr->realm2) - 1], 78, temp, sizeof(temp));
103         fprintf(fff, _("魔法: %s\n", "Realm: %s\n"), realm_names[creature_ptr->realm2]);
104
105         t = temp;
106         for (int i = 0; i < A_MAX; i++) {
107             if (t[0] == 0)
108                 break;
109
110             fprintf(fff, "%s\n", t);
111             t += strlen(t) + 1;
112         }
113     }
114 }
115
116 /*
117  * List virtues & status
118  *
119  */
120 void do_cmd_knowledge_stat(player_type *creature_ptr)
121 {
122     FILE *fff = NULL;
123     GAME_TEXT file_name[FILE_NAME_SIZE];
124     if (!open_temporary_file(&fff, file_name))
125         return;
126
127     int percent
128         = (int)(((long)creature_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) / (2 * creature_ptr->hitdie + ((PY_MAX_LEVEL - 1 + 3) * (creature_ptr->hitdie + 1))));
129
130     if (creature_ptr->knowledge & KNOW_HPRATE)
131         fprintf(fff, _("現在の体力ランク : %d/100\n\n", "Your current Life Rating is %d/100.\n\n"), percent);
132     else
133         fprintf(fff, _("現在の体力ランク : ???\n\n", "Your current Life Rating is ???.\n\n"));
134
135     fprintf(fff, _("能力の最大値\n\n", "Limits of maximum stats\n\n"));
136     for (int v_nr = 0; v_nr < A_MAX; v_nr++) {
137         if ((creature_ptr->knowledge & KNOW_STAT) || creature_ptr->stat_max[v_nr] == creature_ptr->stat_max_max[v_nr])
138             fprintf(fff, "%s 18/%d\n", stat_names[v_nr], creature_ptr->stat_max_max[v_nr] - 18);
139         else
140             fprintf(fff, "%s ???\n", stat_names[v_nr]);
141     }
142
143     dump_yourself(creature_ptr, fff);
144     angband_fclose(fff);
145     (void)show_file(creature_ptr, TRUE, file_name, _("自分に関する情報", "HP-rate & Max stat"), 0, 0);
146     fd_kill(file_name);
147 }
148
149 /*
150  * List my home
151  * @param player_ptr プレーヤーへの参照ポインタ
152  * @return なし
153  */
154 void do_cmd_knowledge_home(player_type *player_ptr)
155 {
156     parse_fixed_map(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
157
158     FILE *fff = NULL;
159     GAME_TEXT file_name[FILE_NAME_SIZE];
160     if (!open_temporary_file(&fff, file_name))
161         return;
162
163     store_type *store_ptr;
164     store_ptr = &town_info[1].store[STORE_HOME];
165
166     if (store_ptr->stock_num) {
167 #ifdef JP
168         TERM_LEN x = 1;
169 #endif
170         fprintf(fff, _("  [ 我が家のアイテム ]\n", "  [Home Inventory]\n"));
171         concptr paren = ")";
172         GAME_TEXT o_name[MAX_NLEN];
173         for (int i = 0; i < store_ptr->stock_num; i++) {
174 #ifdef JP
175             if ((i % 12) == 0)
176                 fprintf(fff, "\n ( %d ページ )\n", x++);
177             object_desc(player_ptr, o_name, &store_ptr->stock[i], 0);
178             if (strlen(o_name) <= 80 - 3) {
179                 fprintf(fff, "%c%s %s\n", I2A(i % 12), paren, o_name);
180             } else {
181                 int n;
182                 char *t;
183                 for (n = 0, t = o_name; n < 80 - 3; n++, t++)
184                     if (iskanji(*t)) {
185                         t++;
186                         n++;
187                     }
188                 if (n == 81 - 3)
189                     n = 79 - 3; /* 最後が漢字半分 */
190
191                 fprintf(fff, "%c%s %.*s\n", I2A(i % 12), paren, n, o_name);
192                 fprintf(fff, "   %.77s\n", o_name + n);
193             }
194 #else
195             object_desc(player_ptr, o_name, &store_ptr->stock[i], 0);
196             fprintf(fff, "%c%s %s\n", I2A(i % 12), paren, o_name);
197 #endif
198         }
199
200         fprintf(fff, "\n\n");
201     }
202
203     angband_fclose(fff);
204     (void)show_file(player_ptr, TRUE, file_name, _("我が家のアイテム", "Home Inventory"), 0, 0);
205     fd_kill(file_name);
206 }