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"
10 #include "view/display-lore.h"
11 #include "view/display-messages.h"
12 #include "wizard/spoiler-util.h"
15 * @brief シンボル職の記述名を返す /
16 * Extract a textual representation of an attribute
17 * @param r_ptr モンスター種族の構造体ポインタ
20 static concptr attr_to_text(monster_race *r_ptr)
22 if (r_ptr->flags1 & RF1_ATTR_CLEAR)
23 return _("透明な", "Clear");
25 if (r_ptr->flags1 & RF1_ATTR_MULTI)
26 return _("万色の", "Multi");
28 if (r_ptr->flags1 & RF1_ATTR_SEMIRAND)
29 return _("準ランダムな", "S.Rand");
31 switch (r_ptr->d_attr) {
33 return _("黒い", "Dark");
35 return _("白い", "White");
37 return _("青灰色の", "Slate");
39 return _("オレンジの", "Orange");
41 return _("赤い", "Red");
43 return _("緑の", "Green");
45 return _("青い", "Blue");
47 return _("琥珀色の", "Umber");
49 return _("灰色の", "L.Dark");
51 return _("明るい青灰色の", "L.Slate");
53 return _("紫の", "Violet");
55 return _("黄色の", "Yellow");
57 return _("明るい赤の", "L.Red");
59 return _("明るい緑の", "L.Green");
61 return _("明るい青の", "L.Blue");
63 return _("明るい琥珀色の", "L.Umber");
66 return _("変な色の", "Icky");
70 * @brief モンスター簡易情報のスポイラー出力を行うメインルーチン /
71 * Create a spoiler file for monsters -BEN-
72 * @param fname 生成ファイル名
75 void spoil_mon_desc(player_type *player_ptr, concptr fname)
87 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
88 spoiler_file = angband_fopen(buf, "w");
90 msg_print("Cannot create spoiler file.");
94 C_MAKE(who, max_r_idx, MONRACE_IDX);
95 fprintf(spoiler_file, "Monster Spoilers for Bakabakaband Version %d.%d.%d\n", FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
96 fprintf(spoiler_file, "------------------------------------------\n\n");
97 fprintf(spoiler_file, " %-38.38s%4s%4s%4s%7s%5s %11.11s\n", "Name", "Lev", "Rar", "Spd", "Hp", "Ac", "Visual Info");
98 fprintf(spoiler_file, "%-42.42s%4s%4s%4s%7s%5s %11.11s\n", "--------", "---", "---", "---", "--", "--", "-----------");
101 for (int i = 1; i < max_r_idx; i++) {
102 monster_race *r_ptr = &r_info[i];
107 ang_sort(player_ptr, who, &why, n, ang_sort_comp_hook, ang_sort_swap_hook);
108 for (int i = 0; i < n; i++) {
109 monster_race *r_ptr = &r_info[who[i]];
110 concptr name = (r_name + r_ptr->name);
111 if (r_ptr->flags7 & RF7_KAGE)
113 else if (r_ptr->flags1 & (RF1_UNIQUE))
114 sprintf(nam, "[U] %s", name);
116 sprintf(nam, _(" %s", "The %s"), name);
118 sprintf(lev, "%d", (int)r_ptr->level);
119 sprintf(rar, "%d", (int)r_ptr->rarity);
120 if (r_ptr->speed >= 110)
121 sprintf(spd, "+%d", (r_ptr->speed - 110));
123 sprintf(spd, "-%d", (110 - r_ptr->speed));
125 sprintf(ac, "%d", r_ptr->ac);
126 if ((r_ptr->flags1 & (RF1_FORCE_MAXHP)) || (r_ptr->hside == 1))
127 sprintf(hp, "%d", r_ptr->hdice * r_ptr->hside);
129 sprintf(hp, "%dd%d", r_ptr->hdice, r_ptr->hside);
131 sprintf(exp, "%ld", (long)(r_ptr->mexp));
132 sprintf(exp, "%s '%c'", attr_to_text(r_ptr), r_ptr->d_char);
133 fprintf(spoiler_file, "%-42.42s%4s%4s%4s%7s%5s %11.11s\n", nam, lev, rar, spd, hp, ac, exp);
136 fprintf(spoiler_file, "\n");
137 C_KILL(who, max_r_idx, s16b);
138 if (ferror(spoiler_file) || angband_fclose(spoiler_file)) {
139 msg_print("Cannot close spoiler file.");
143 msg_print("Successfully created a spoiler file.");
147 * @brief 関数ポインタ用の出力関数 /
148 * Hook function used in spoil_mon_info()
150 * @param str 文字列参照ポインタ
153 static void roff_func(TERM_COLOR attr, concptr str)
160 * @brief モンスター詳細情報をスポイラー出力するメインルーチン /
161 * Create a spoiler file for monsters (-SHAWN-)
165 void spoil_mon_info(player_type *player_ptr, concptr fname)
168 path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname);
169 spoiler_file = angband_fopen(buf, "w");
171 msg_print("Cannot create spoiler file.");
175 sprintf(buf, "Monster Spoilers for Bakabakaband Version %d.%d.%d\n", FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
177 spoil_out("------------------------------------------\n\n");
180 C_MAKE(who, max_r_idx, MONRACE_IDX);
182 for (int i = 1; i < max_r_idx; i++) {
183 monster_race *r_ptr = &r_info[i];
189 ang_sort(player_ptr, who, &why, n, ang_sort_comp_hook, ang_sort_swap_hook);
190 for (int i = 0; i < n; i++) {
191 monster_race *r_ptr = &r_info[who[i]];
192 BIT_FLAGS flags1 = r_ptr->flags1;
193 if (flags1 & (RF1_UNIQUE)) {
202 sprintf(buf, _("%s/%s (", "%s%s ("), (r_name + r_ptr->name), _(r_name + r_ptr->E_name, "")); /* ---)--- */
204 spoil_out(attr_to_text(r_ptr));
205 sprintf(buf, " '%c')\n", r_ptr->d_char);
207 sprintf(buf, "=== ");
209 sprintf(buf, "Num:%d ", who[i]);
211 sprintf(buf, "Lev:%d ", (int)r_ptr->level);
213 sprintf(buf, "Rar:%d ", r_ptr->rarity);
215 if (r_ptr->speed >= 110)
216 sprintf(buf, "Spd:+%d ", (r_ptr->speed - 110));
218 sprintf(buf, "Spd:-%d ", (110 - r_ptr->speed));
221 if ((flags1 & (RF1_FORCE_MAXHP)) || (r_ptr->hside == 1))
222 sprintf(buf, "Hp:%d ", r_ptr->hdice * r_ptr->hside);
224 sprintf(buf, "Hp:%dd%d ", r_ptr->hdice, r_ptr->hside);
227 sprintf(buf, "Ac:%d ", r_ptr->ac);
229 sprintf(buf, "Exp:%ld\n", (long)(r_ptr->mexp));
231 output_monster_spoiler(player_ptr, who[i], roff_func);
235 C_KILL(who, max_r_idx, s16b);
236 if (ferror(spoiler_file) || angband_fclose(spoiler_file)) {
237 msg_print("Cannot close spoiler file.");
241 msg_print("Successfully created a spoiler file.");