OSDN Git Service

[Feature] mon-info.txtの出力情報を現在のプレイヤー情報に依存させない
[hengbandforosx/hengbandosx.git] / src / wizard / monster-info-spoiler.c
1 #include "wizard/monster-info-spoiler.h"
2 #include "io/files-util.h"
3 #include "monster-race/monster-race.h"
4 #include "monster-race/race-flags1.h"
5 #include "monster-race/race-flags7.h"
6 #include "system/angband-version.h"
7 #include "term/term-color-types.h"
8 #include "util/angband-files.h"
9 #include "util/sort.h"
10 #include "view/display-lore.h"
11 #include "view/display-messages.h"
12 #include "wizard/spoiler-util.h"
13
14 /*!
15  * @brief シンボル職の記述名を返す /
16  * Extract a textual representation of an attribute
17  * @param r_ptr モンスター種族の構造体ポインタ
18  * @return シンボル職の記述名
19  */
20 static concptr attr_to_text(monster_race *r_ptr)
21 {
22     if (r_ptr->flags1 & RF1_ATTR_CLEAR)
23         return _("透明な", "Clear");
24
25     if (r_ptr->flags1 & RF1_ATTR_MULTI)
26         return _("万色の", "Multi");
27
28     if (r_ptr->flags1 & RF1_ATTR_SEMIRAND)
29         return _("準ランダムな", "S.Rand");
30
31     switch (r_ptr->d_attr) {
32     case TERM_DARK:
33         return _("黒い", "Dark");
34     case TERM_WHITE:
35         return _("白い", "White");
36     case TERM_SLATE:
37         return _("青灰色の", "Slate");
38     case TERM_ORANGE:
39         return _("オレンジの", "Orange");
40     case TERM_RED:
41         return _("赤い", "Red");
42     case TERM_GREEN:
43         return _("緑の", "Green");
44     case TERM_BLUE:
45         return _("青い", "Blue");
46     case TERM_UMBER:
47         return _("琥珀色の", "Umber");
48     case TERM_L_DARK:
49         return _("灰色の", "L.Dark");
50     case TERM_L_WHITE:
51         return _("明るい青灰色の", "L.Slate");
52     case TERM_VIOLET:
53         return _("紫の", "Violet");
54     case TERM_YELLOW:
55         return _("黄色の", "Yellow");
56     case TERM_L_RED:
57         return _("明るい赤の", "L.Red");
58     case TERM_L_GREEN:
59         return _("明るい緑の", "L.Green");
60     case TERM_L_BLUE:
61         return _("明るい青の", "L.Blue");
62     case TERM_L_UMBER:
63         return _("明るい琥珀色の", "L.Umber");
64     }
65
66     return _("変な色の", "Icky");
67 }
68
69 /*!
70  * @brief モンスター簡易情報のスポイラー出力を行うメインルーチン /
71  * Create a spoiler file for monsters   -BEN-
72  * @param fname 生成ファイル名
73  * @return なし
74  */
75 void spoil_mon_desc(player_type *player_ptr, concptr fname)
76 {
77     u16b why = 2;
78     MONRACE_IDX *who;
79     char buf[1024];
80     char nam[MAX_MONSTER_NAME + 10]; // ユニークには[U] が付くので少し伸ばす
81     char lev[80];
82     char rar[80];
83     char spd[80];
84     char ac[80];
85     char hp[80];
86     char symbol[80];
87     path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
88     spoiler_file = angband_fopen(buf, "w");
89     if (!spoiler_file) {
90         msg_print("Cannot create spoiler file.");
91         return;
92     }
93
94     char title[200];
95     put_version(title);
96
97     C_MAKE(who, max_r_idx, MONRACE_IDX);
98     fprintf(spoiler_file, "Monster Spoilers for %s\n", title);
99     fprintf(spoiler_file, "------------------------------------------\n\n");
100     fprintf(spoiler_file, "%-162.162s    %4s %4s %4s %7s %7s  %19.19s\n", "Name", "Lev", "Rar", "Spd", "Hp", "Ac", "Visual Info");
101     fprintf(spoiler_file, "%-166.166s%4s %4s %4s %7s %7s  %4.19s\n",
102         "------------------------------------------------------------------------------------------------------------------------------------------------------"
103         "----"
104         "----------",
105         "---", "---", "---", "-----", "-----", "-------------------");
106
107     int n = 0;
108     for (int i = 1; i < max_r_idx; i++) {
109         monster_race *r_ptr = &r_info[i];
110         if (r_ptr->name)
111             who[n++] = (s16b)i;
112     }
113
114     ang_sort(player_ptr, who, &why, n, ang_sort_comp_hook, ang_sort_swap_hook);
115     for (int i = 0; i < n; i++) {
116         monster_race *r_ptr = &r_info[who[i]];
117         concptr name = (r_name + r_ptr->name);
118         if (r_ptr->flags7 & RF7_KAGE)
119             continue;
120         else if (r_ptr->flags1 & (RF1_UNIQUE))
121             sprintf(nam, "[U] %s", name);
122         else
123             sprintf(nam, _("    %s", "The %s"), name);
124
125         sprintf(lev, "%d", (int)r_ptr->level);
126         sprintf(rar, "%d", (int)r_ptr->rarity);
127         if (r_ptr->speed >= 110)
128             sprintf(spd, "+%d", (r_ptr->speed - 110));
129         else
130             sprintf(spd, "-%d", (110 - r_ptr->speed));
131
132         sprintf(ac, "%d", r_ptr->ac);
133         if ((r_ptr->flags1 & (RF1_FORCE_MAXHP)) || (r_ptr->hside == 1))
134             sprintf(hp, "%d", r_ptr->hdice * r_ptr->hside);
135         else
136             sprintf(hp, "%dd%d", r_ptr->hdice, r_ptr->hside);
137
138         sprintf(symbol, "%ld", (long)(r_ptr->mexp));
139         sprintf(symbol, "%s '%c'", attr_to_text(r_ptr), r_ptr->d_char);
140         fprintf(spoiler_file, "%-166.166s%4s %4s %4s %7s %7s  %19.19s\n", nam, lev, rar, spd, hp, ac, symbol);
141     }
142
143     fprintf(spoiler_file, "\n");
144     C_KILL(who, max_r_idx, s16b);
145     if (ferror(spoiler_file) || angband_fclose(spoiler_file)) {
146         msg_print("Cannot close spoiler file.");
147         return;
148     }
149
150     msg_print("Successfully created a spoiler file.");
151 }
152
153 /*!
154  * @brief 関数ポインタ用の出力関数 /
155  * Hook function used in spoil_mon_info()
156  * @param attr 未使用
157  * @param str 文字列参照ポインタ
158  * @return なし
159  */
160 static void roff_func(TERM_COLOR attr, concptr str)
161 {
162     (void)attr;
163     spoil_out(str);
164 }
165
166 /*!
167  * @brief モンスター詳細情報をスポイラー出力するメインルーチン /
168  * Create a spoiler file for monsters (-SHAWN-)
169  * @param fname ファイル名
170  * @return なし
171  */
172 void spoil_mon_info(player_type *player_ptr, concptr fname)
173 {
174     char buf[1024];
175     path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
176     spoiler_file = angband_fopen(buf, "w");
177     if (!spoiler_file) {
178         msg_print("Cannot create spoiler file.");
179         return;
180     }
181
182     char title[200];
183     put_version(title);
184     sprintf(buf, "Monster Spoilers for %s\n", title);
185     spoil_out(buf);
186     spoil_out("------------------------------------------\n\n");
187
188     MONRACE_IDX *who;
189     C_MAKE(who, max_r_idx, MONRACE_IDX);
190     int n = 0;
191     for (int i = 1; i < max_r_idx; i++) {
192         monster_race *r_ptr = &r_info[i];
193         if (r_ptr->name)
194             who[n++] = (s16b)i;
195     }
196
197     u16b why = 2;
198     ang_sort(player_ptr, who, &why, n, ang_sort_comp_hook, ang_sort_swap_hook);
199     for (int i = 0; i < n; i++) {
200         monster_race *r_ptr = &r_info[who[i]];
201         BIT_FLAGS flags1 = r_ptr->flags1;
202         if (flags1 & (RF1_UNIQUE)) {
203             spoil_out("[U] ");
204         } else {
205 #ifdef JP
206 #else
207             spoil_out("The ");
208 #endif
209         }
210
211         sprintf(buf, _("%s/%s  (", "%s%s ("), (r_name + r_ptr->name), _(r_name + r_ptr->E_name, "")); /* ---)--- */
212         spoil_out(buf);
213         spoil_out(attr_to_text(r_ptr));
214         sprintf(buf, " '%c')\n", r_ptr->d_char);
215         spoil_out(buf);
216         sprintf(buf, "=== ");
217         spoil_out(buf);
218         sprintf(buf, "Num:%d  ", who[i]);
219         spoil_out(buf);
220         sprintf(buf, "Lev:%d  ", (int)r_ptr->level);
221         spoil_out(buf);
222         sprintf(buf, "Rar:%d  ", r_ptr->rarity);
223         spoil_out(buf);
224         if (r_ptr->speed >= 110)
225             sprintf(buf, "Spd:+%d  ", (r_ptr->speed - 110));
226         else
227             sprintf(buf, "Spd:-%d  ", (110 - r_ptr->speed));
228
229         spoil_out(buf);
230         if ((flags1 & (RF1_FORCE_MAXHP)) || (r_ptr->hside == 1))
231             sprintf(buf, "Hp:%d  ", r_ptr->hdice * r_ptr->hside);
232         else
233             sprintf(buf, "Hp:%dd%d  ", r_ptr->hdice, r_ptr->hside);
234
235         spoil_out(buf);
236         sprintf(buf, "Ac:%d  ", r_ptr->ac);
237         spoil_out(buf);
238         sprintf(buf, "Exp:%ld\n", (long)(r_ptr->mexp));
239         spoil_out(buf);
240         output_monster_spoiler(who[i], roff_func);
241         spoil_out(NULL);
242     }
243
244     C_KILL(who, max_r_idx, s16b);
245     if (ferror(spoiler_file) || angband_fclose(spoiler_file)) {
246         msg_print("Cannot close spoiler file.");
247         return;
248     }
249
250     msg_print("Successfully created a spoiler file.");
251 }