OSDN Git Service

[Refactor] #40477 Separated game-play-options.c/h
[hengbandforosx/hengbandosx.git] / src / io-dump / character-dump.c
1 #include "io-dump/character-dump.h"
2 #include "art-definition/art-bow-types.h"
3 #include "core/sort.h"
4 #include "dungeon/dungeon.h"
5 #include "dungeon/quest.h"
6 #include "floor/floor-town.h"
7 #include "floor/floor.h"
8 #include "game-option/game-play-options.h"
9 #include "io-dump/player-status-dump.h"
10 #include "io-dump/special-class-dump.h"
11 #include "io/mutations-dump.h"
12 #include "io/write-diary.h"
13 #include "knowledge/knowledge-quests.h"
14 #include "main/init.h"
15 #include "market/arena-info-table.h"
16 #include "monster-race/race-flags1.h"
17 #include "monster/monster-describer.h"
18 #include "monster/monster-description-types.h"
19 #include "monster/monster-info.h"
20 #include "monster/monster-status.h"
21 #include "monster/smart-learn-types.h"
22 #include "object/object-flavor.h"
23 #include "object/object-info.h"
24 #include "pet/pet-util.h"
25 #include "player/avatar.h"
26 #include "player/race-info-table.h"
27 #include "store/store-util.h"
28 #include "store/store.h"
29 #include "system/angband-version.h"
30 #include "world/world.h"
31
32 /*!
33  * @brief プレイヤーのペット情報をファイルにダンプする
34  * @param creature_ptr プレーヤーへの参照ポインタ
35  * @param fff ファイルポインタ
36  * @return なし
37  */
38 static void dump_aux_pet(player_type *master_ptr, FILE *fff)
39 {
40         bool pet = FALSE;
41         bool pet_settings = FALSE;
42         for (int i = master_ptr->current_floor_ptr->m_max - 1; i >= 1; i--)
43         {
44                 monster_type *m_ptr = &master_ptr->current_floor_ptr->m_list[i];
45
46                 if (!monster_is_valid(m_ptr)) continue;
47                 if (!is_pet(m_ptr)) continue;
48                 pet_settings = TRUE;
49                 if (!m_ptr->nickname && (master_ptr->riding != i)) continue;
50                 if (!pet)
51                 {
52                         fprintf(fff, _("\n\n  [主なペット]\n\n", "\n\n  [Leading Pets]\n\n"));
53                         pet = TRUE;
54                 }
55
56                 GAME_TEXT pet_name[MAX_NLEN];
57                 monster_desc(master_ptr, pet_name, m_ptr, MD_ASSUME_VISIBLE | MD_INDEF_VISIBLE);
58                 fprintf(fff, "%s\n", pet_name);
59         }
60
61         if (!pet_settings) return;
62
63         fprintf(fff, _("\n\n  [ペットへの命令]\n", "\n\n  [Command for Pets]\n"));
64
65         fprintf(fff, _("\n ドアを開ける:                       %s", "\n Pets open doors:                    %s"),
66                 (master_ptr->pet_extra_flags & PF_OPEN_DOORS) ? "ON" : "OFF");
67
68         fprintf(fff, _("\n アイテムを拾う:                     %s", "\n Pets pick up items:                 %s"),
69                 (master_ptr->pet_extra_flags & PF_PICKUP_ITEMS) ? "ON" : "OFF");
70
71         fprintf(fff, _("\n テレポート系魔法を使う:             %s", "\n Allow teleport:                     %s"),
72                 (master_ptr->pet_extra_flags & PF_TELEPORT) ? "ON" : "OFF");
73
74         fprintf(fff, _("\n 攻撃魔法を使う:                     %s", "\n Allow cast attack spell:            %s"),
75                 (master_ptr->pet_extra_flags & PF_ATTACK_SPELL) ? "ON" : "OFF");
76
77         fprintf(fff, _("\n 召喚魔法を使う:                     %s", "\n Allow cast summon spell:            %s"),
78                 (master_ptr->pet_extra_flags & PF_SUMMON_SPELL) ? "ON" : "OFF");
79
80         fprintf(fff, _("\n プレイヤーを巻き込む範囲魔法を使う: %s", "\n Allow involve player in area spell: %s"),
81                 (master_ptr->pet_extra_flags & PF_BALL_SPELL) ? "ON" : "OFF");
82
83         fputc('\n', fff);
84 }
85
86
87 /*!
88  * @brief クエスト情報をファイルにダンプする
89  * @param creature_ptr プレーヤーへの参照ポインタ
90  * @param fff ファイルポインタ
91  * @return なし
92  */
93 static void dump_aux_quest(player_type *creature_ptr, FILE *fff)
94 {
95         fprintf(fff, _("\n\n  [クエスト情報]\n", "\n\n  [Quest Information]\n"));
96         QUEST_IDX *quest_num;
97         C_MAKE(quest_num, max_q_idx, QUEST_IDX);
98
99         for (QUEST_IDX i = 1; i < max_q_idx; i++)
100                 quest_num[i] = i;
101         int dummy;
102         ang_sort(quest_num, &dummy, max_q_idx, ang_sort_comp_quest_num, ang_sort_swap_quest_num);
103
104         fputc('\n', fff);
105         do_cmd_knowledge_quests_completed(creature_ptr, fff, quest_num);
106         fputc('\n', fff);
107         do_cmd_knowledge_quests_failed(creature_ptr, fff, quest_num);
108         fputc('\n', fff);
109
110         C_KILL(quest_num, max_q_idx, QUEST_IDX);
111 }
112
113
114 /*!
115  * @brief 死の直前メッセージ並びに遺言をファイルにダンプする
116  * @param creature_ptr プレーヤーへの参照ポインタ
117  * @param fff ファイルポインタ
118  * @return なし
119  */
120 static void dump_aux_last_message(player_type *creature_ptr, FILE *fff)
121 {
122         if (!creature_ptr->is_dead) return;
123
124         if (!current_world_ptr->total_winner)
125         {
126                 fprintf(fff, _("\n  [死ぬ直前のメッセージ]\n\n", "\n  [Last Messages]\n\n"));
127                 for (int i = MIN(message_num(), 30); i >= 0; i--)
128                 {
129                         fprintf(fff, "> %s\n", message_str((s16b)i));
130                 }
131
132                 fputc('\n', fff);
133                 return;
134         }
135
136         if (creature_ptr->last_message)
137         {
138                 fprintf(fff, _("\n  [*勝利*メッセージ]\n\n", "\n  [*Winning* Message]\n\n"));
139                 fprintf(fff, "  %s\n", creature_ptr->last_message);
140                 fputc('\n', fff);
141         }
142 }
143
144
145 /*!
146  * @brief 帰還場所情報をファイルにダンプする
147  * @param fff ファイルポインタ
148  * @return なし
149  */
150 static void dump_aux_recall(FILE *fff)
151 {
152         fprintf(fff, _("\n  [帰還場所]\n\n", "\n  [Recall Depth]\n\n"));
153         for (int y = 1; y < current_world_ptr->max_d_idx; y++)
154         {
155                 bool seiha = FALSE;
156
157                 if (!d_info[y].maxdepth) continue;
158                 if (!max_dlv[y]) continue;
159                 if (d_info[y].final_guardian)
160                 {
161                         if (!r_info[d_info[y].final_guardian].max_num) seiha = TRUE;
162                 }
163                 else if (max_dlv[y] == d_info[y].maxdepth) seiha = TRUE;
164
165                 fprintf(fff, _("   %c%-12s: %3d 階\n", "   %c%-16s: level %3d\n"),
166                         seiha ? '!' : ' ', d_name + d_info[y].name, (int)max_dlv[y]);
167         }
168 }
169
170
171 /*!
172  * @brief オプション情報をファイルにダンプする
173  * @param fff ファイルポインタ
174  * @return なし
175  */
176 static void dump_aux_options(FILE *fff)
177 {
178         fprintf(fff, _("\n  [オプション設定]\n", "\n  [Option Settings]\n"));
179         if (preserve_mode)
180                 fprintf(fff, _("\n 保存モード:         ON", "\n Preserve Mode:      ON"));
181         else
182                 fprintf(fff, _("\n 保存モード:         OFF", "\n Preserve Mode:      OFF"));
183
184         if (ironman_small_levels)
185                 fprintf(fff, _("\n 小さいダンジョン:   ALWAYS", "\n Small Levels:       ALWAYS"));
186         else if (always_small_levels)
187                 fprintf(fff, _("\n 小さいダンジョン:   ON", "\n Small Levels:       ON"));
188         else if (small_levels)
189                 fprintf(fff, _("\n 小さいダンジョン:   ENABLED", "\n Small Levels:       ENABLED"));
190         else
191                 fprintf(fff, _("\n 小さいダンジョン:   OFF", "\n Small Levels:       OFF"));
192
193         if (vanilla_town)
194                 fprintf(fff, _("\n 元祖の町のみ:       ON", "\n Vanilla Town:       ON"));
195         else if (lite_town)
196                 fprintf(fff, _("\n 小規模な町:         ON", "\n Lite Town:          ON"));
197
198         if (ironman_shops)
199                 fprintf(fff, _("\n 店なし:             ON", "\n No Shops:           ON"));
200
201         if (ironman_downward)
202                 fprintf(fff, _("\n 階段を上がれない:   ON", "\n Diving Only:        ON"));
203
204         if (ironman_rooms)
205                 fprintf(fff, _("\n 普通でない部屋:     ON", "\n Unusual Rooms:      ON"));
206
207         if (ironman_nightmare)
208                 fprintf(fff, _("\n 悪夢モード:         ON", "\n Nightmare Mode:     ON"));
209
210         if (ironman_empty_levels)
211                 fprintf(fff, _("\n アリーナ:           ALWAYS", "\n Arena Levels:       ALWAYS"));
212         else if (empty_levels)
213                 fprintf(fff, _("\n アリーナ:           ENABLED", "\n Arena Levels:       ENABLED"));
214         else
215                 fprintf(fff, _("\n アリーナ:           OFF", "\n Arena Levels:       OFF"));
216
217         fputc('\n', fff);
218
219         if (current_world_ptr->noscore)
220                 fprintf(fff, _("\n 何か不正なことをしてしまっています。\n", "\n You have done something illegal.\n"));
221
222         fputc('\n', fff);
223 }
224
225
226 /*!
227  * @brief 闘技場の情報をファイルにダンプする
228  * @param creature_ptr プレーヤーへの参照ポインタ
229  * @param fff ファイルポインタ
230  * @return なし
231  */
232 static void dump_aux_arena(player_type *creature_ptr, FILE *fff)
233 {
234         if (lite_town || vanilla_town) return;
235
236         if (creature_ptr->arena_number < 0)
237         {
238                 if (creature_ptr->arena_number <= ARENA_DEFEATED_OLD_VER)
239                 {
240                         fprintf(fff, _("\n 闘技場: 敗北\n", "\n Arena: Defeated\n"));
241                 }
242                 else
243                 {
244 #ifdef JP
245                         fprintf(fff, "\n 闘技場: %d回戦で%sの前に敗北\n", -creature_ptr->arena_number,
246                                 r_name + r_info[arena_info[-1 - creature_ptr->arena_number].r_idx].name);
247 #else
248                         fprintf(fff, "\n Arena: Defeated by %s in the %d%s fight\n",
249                                 r_name + r_info[arena_info[-1 - creature_ptr->arena_number].r_idx].name,
250                                 -creature_ptr->arena_number, get_ordinal_number_suffix(-creature_ptr->arena_number));
251 #endif
252                 }
253
254                 fprintf(fff, "\n");
255                 return;
256         }
257
258         if (creature_ptr->arena_number > MAX_ARENA_MONS + 2)
259         {
260                 fprintf(fff, _("\n 闘技場: 真のチャンピオン\n", "\n Arena: True Champion\n"));
261                 fprintf(fff, "\n");
262                 return;
263         }
264
265         if (creature_ptr->arena_number > MAX_ARENA_MONS - 1)
266         {
267                 fprintf(fff, _("\n 闘技場: チャンピオン\n", "\n Arena: Champion\n"));
268                 fprintf(fff, "\n");
269                 return;
270         }
271
272 #ifdef JP
273         fprintf(fff, "\n 闘技場: %2d勝\n", (creature_ptr->arena_number > MAX_ARENA_MONS ? MAX_ARENA_MONS : creature_ptr->arena_number));
274 #else
275         fprintf(fff, "\n Arena: %2d Victor%s\n", (creature_ptr->arena_number > MAX_ARENA_MONS ? MAX_ARENA_MONS : creature_ptr->arena_number), (creature_ptr->arena_number > 1) ? "ies" : "y");
276 #endif
277         fprintf(fff, "\n");
278 }
279
280
281 /*!
282  * @brief 撃破モンスターの情報をファイルにダンプする
283  * @param fff ファイルポインタ
284  * @return なし
285  */
286 static void dump_aux_monsters(FILE *fff)
287 {
288         fprintf(fff, _("\n  [倒したモンスター]\n\n", "\n  [Defeated Monsters]\n\n"));
289
290         /* Allocate the "who" array */
291         MONRACE_IDX *who;
292         u16b why = 2;
293         C_MAKE(who, max_r_idx, MONRACE_IDX);
294
295         /* Count monster kills */
296         long uniq_total = 0;
297         long norm_total = 0;
298         for (IDX k = 1; k < max_r_idx; k++)
299         {
300                 /* Ignore unused index */
301                 monster_race *r_ptr = &r_info[k];
302                 if (!r_ptr->name) continue;
303
304                 if (r_ptr->flags1 & RF1_UNIQUE)
305                 {
306                         bool dead = (r_ptr->max_num == 0);
307                         if (dead)
308                         {
309                                 norm_total++;
310
311                                 /* Add a unique monster to the list */
312                                 who[uniq_total++] = k;
313                         }
314
315                         continue;
316                 }
317
318                 if (r_ptr->r_pkills > 0)
319                 {
320                         norm_total += r_ptr->r_pkills;
321                 }
322         }
323
324         /* No monsters is defeated */
325         if (norm_total < 1)
326         {
327                 fprintf(fff, _("まだ敵を倒していません。\n", "You have defeated no enemies yet.\n"));
328                 C_KILL(who, max_r_idx, s16b);
329                 return;
330         }
331
332         /* Defeated more than one normal monsters */
333         if (uniq_total == 0)
334         {
335 #ifdef JP
336                 fprintf(fff, "%ld体の敵を倒しています。\n", norm_total);
337 #else
338                 fprintf(fff, "You have defeated %ld %s.\n", norm_total, norm_total == 1 ? "enemy" : "enemies");
339 #endif
340                 C_KILL(who, max_r_idx, s16b);
341                 return;
342         }
343
344         /* Defeated more than one unique monsters */
345 #ifdef JP
346         fprintf(fff, "%ld体のユニーク・モンスターを含む、合計%ld体の敵を倒しています。\n", uniq_total, norm_total);
347 #else
348         fprintf(fff, "You have defeated %ld %s including %ld unique monster%s in total.\n", norm_total, norm_total == 1 ? "enemy" : "enemies", uniq_total, (uniq_total == 1 ? "" : "s"));
349 #endif
350
351         /* Sort the array by dungeon depth of monsters */
352         ang_sort(who, &why, uniq_total, ang_sort_comp_hook, ang_sort_swap_hook);
353         fprintf(fff, _("\n《上位%ld体のユニーク・モンスター》\n", "\n< Unique monsters top %ld >\n"), MIN(uniq_total, 10));
354
355         for (IDX k = uniq_total - 1; k >= 0 && k >= uniq_total - 10; k--)
356         {
357                 monster_race *r_ptr = &r_info[who[k]];
358                 fprintf(fff, _("  %-40s (レベル%3d)\n", "  %-40s (level %3d)\n"), (r_name + r_ptr->name), (int)r_ptr->level);
359         }
360
361         C_KILL(who, max_r_idx, s16b);
362 }
363
364
365 /*!
366  * @brief 元種族情報をファイルにダンプする
367  * @param creature_ptr プレーヤーへの参照ポインタ
368  * @param fff ファイルポインタ
369  * @return なし
370  */
371 static void dump_aux_race_history(player_type *creature_ptr, FILE *fff)
372 {
373         if (!creature_ptr->old_race1 && !creature_ptr->old_race2) return;
374
375         fprintf(fff, _("\n\n あなたは%sとして生まれた。", "\n\n You were born as %s."), race_info[creature_ptr->start_race].title);
376         for (int i = 0; i < MAX_RACES; i++)
377         {
378                 if (creature_ptr->start_race == i) continue;
379                 if (i < 32)
380                 {
381                         if (!(creature_ptr->old_race1 & 1L << i)) continue;
382                 }
383                 else
384                 {
385                         if (!(creature_ptr->old_race2 & 1L << (i - 32))) continue;
386                 }
387
388                 fprintf(fff, _("\n あなたはかつて%sだった。", "\n You were a %s before."), race_info[i].title);
389         }
390
391         fputc('\n', fff);
392 }
393
394
395 /*!
396  * @brief 元魔法領域情報をファイルにダンプする
397  * @param creature_ptr プレーヤーへの参照ポインタ
398  * @param fff ファイルポインタ
399  * @return なし
400  */
401 static void dump_aux_realm_history(player_type *creature_ptr, FILE *fff)
402 {
403         if (creature_ptr->old_realm) return;
404
405         fputc('\n', fff);
406         for (int i = 0; i < MAX_MAGIC; i++)
407         {
408                 if (!(creature_ptr->old_realm & 1L << i)) continue;
409                 fprintf(fff, _("\n あなたはかつて%s魔法を使えた。", "\n You were able to use %s magic before."), realm_names[i + 1]);
410         }
411
412         fputc('\n', fff);
413 }
414
415
416 /*!
417  * @brief 徳の情報をファイルにダンプする
418  * @param creature_ptr プレーヤーへの参照ポインタ
419  * @param fff ファイルポインタ
420  * @return なし
421  */
422 static void dump_aux_virtues(player_type *creature_ptr, FILE *fff)
423 {
424         fprintf(fff, _("\n\n  [自分に関する情報]\n\n", "\n\n  [HP-rate & Max stat & Virtues]\n\n"));
425
426         int percent = (int)(((long)creature_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) /
427                 (2 * creature_ptr->hitdie +
428                 ((PY_MAX_LEVEL - 1 + 3) * (creature_ptr->hitdie + 1))));
429
430 #ifdef JP
431         if (creature_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "現在の体力ランク : %d/100\n\n", percent);
432         else fprintf(fff, "現在の体力ランク : ???\n\n");
433         fprintf(fff, "能力の最大値\n");
434 #else
435         if (creature_ptr->knowledge & KNOW_HPRATE) fprintf(fff, "Your current Life Rating is %d/100.\n\n", percent);
436         else fprintf(fff, "Your current Life Rating is ???.\n\n");
437         fprintf(fff, "Limits of maximum stats\n");
438 #endif
439         for (int v_nr = 0; v_nr < A_MAX; v_nr++)
440         {
441                 if ((creature_ptr->knowledge & KNOW_STAT) || creature_ptr->stat_max[v_nr] == creature_ptr->stat_max_max[v_nr]) fprintf(fff, "%s 18/%d\n", stat_names[v_nr], creature_ptr->stat_max_max[v_nr] - 18);
442                 else fprintf(fff, "%s ???\n", stat_names[v_nr]);
443         }
444
445         fprintf(fff, _("\n属性 : %s\n", "\nYour alignment : %s\n"), your_alignment(creature_ptr));
446         fprintf(fff, "\n");
447         dump_virtues(creature_ptr, fff);
448 }
449
450
451 /*!
452  * @brief 突然変異の情報をファイルにダンプする
453  * @param creature_ptr プレーヤーへの参照ポインタ
454  * @param fff ファイルポインタ
455  * @return なし
456  */
457 static void dump_aux_mutations(player_type *creature_ptr, FILE *fff)
458 {
459         if (creature_ptr->muta1 || creature_ptr->muta2 || creature_ptr->muta3)
460         {
461                 fprintf(fff, _("\n\n  [突然変異]\n\n", "\n\n  [Mutations]\n\n"));
462                 dump_mutations(creature_ptr, fff);
463         }
464 }
465
466
467 /*!
468  * @brief 所持品の情報をファイルにダンプする
469  * @param creature_ptr プレーヤーへの参照ポインタ
470  * @param fff ファイルポインタ
471  * @return なし
472  */
473 static void dump_aux_equipment_inventory(player_type *creature_ptr, FILE *fff)
474 {
475         GAME_TEXT o_name[MAX_NLEN];
476         if (creature_ptr->equip_cnt)
477         {
478                 fprintf(fff, _("  [キャラクタの装備]\n\n", "  [Character Equipment]\n\n"));
479                 for (int i = INVEN_RARM; i < INVEN_TOTAL; i++)
480                 {
481                         object_desc(creature_ptr, o_name, &creature_ptr->inventory_list[i], 0);
482                         if ((((i == INVEN_RARM) && creature_ptr->hidarite) || ((i == INVEN_LARM) && creature_ptr->migite)) && creature_ptr->ryoute)
483                                 strcpy(o_name, _("(武器を両手持ち)", "(wielding with two-hands)"));
484
485                         fprintf(fff, "%c) %s\n",
486                                 index_to_label(i), o_name);
487                 }
488
489                 fprintf(fff, "\n\n");
490         }
491
492         fprintf(fff, _("  [キャラクタの持ち物]\n\n", "  [Character Inventory]\n\n"));
493
494         for (int i = 0; i < INVEN_PACK; i++)
495         {
496                 if (!creature_ptr->inventory_list[i].k_idx) break;
497                 object_desc(creature_ptr, o_name, &creature_ptr->inventory_list[i], 0);
498                 fprintf(fff, "%c) %s\n", index_to_label(i), o_name);
499         }
500
501         fprintf(fff, "\n\n");
502 }
503
504
505 /*!
506  * @brief 我が家と博物館のオブジェクト情報をファイルにダンプする
507  * @param fff ファイルポインタ
508  * @return なし
509  */
510 static void dump_aux_home_museum(player_type *creature_ptr, FILE *fff)
511 {
512         store_type  *store_ptr;
513         store_ptr = &town_info[1].store[STORE_HOME];
514
515         GAME_TEXT o_name[MAX_NLEN];
516         if (store_ptr->stock_num)
517         {
518                 fprintf(fff, _("  [我が家のアイテム]\n", "  [Home Inventory]\n"));
519
520                 TERM_LEN x = 1;
521                 for (int i = 0; i < store_ptr->stock_num; i++)
522                 {
523                         if ((i % 12) == 0)
524                                 fprintf(fff, _("\n ( %d ページ )\n", "\n ( page %d )\n"), x++);
525                         object_desc(creature_ptr, o_name, &store_ptr->stock[i], 0);
526                         fprintf(fff, "%c) %s\n", I2A(i % 12), o_name);
527                 }
528
529                 fprintf(fff, "\n\n");
530         }
531
532         store_ptr = &town_info[1].store[STORE_MUSEUM];
533
534         if (store_ptr->stock_num == 0) return;
535
536         fprintf(fff, _("  [博物館のアイテム]\n", "  [Museum]\n"));
537
538         TERM_LEN x = 1;
539         for (int i = 0; i < store_ptr->stock_num; i++)
540         {
541 #ifdef JP
542                 if ((i % 12) == 0) fprintf(fff, "\n ( %d ページ )\n", x++);
543                 object_desc(creature_ptr, o_name, &store_ptr->stock[i], 0);
544                 fprintf(fff, "%c) %s\n", I2A(i % 12), o_name);
545 #else
546                 if ((i % 12) == 0) fprintf(fff, "\n ( page %d )\n", x++);
547                 object_desc(creature_ptr, o_name, &st_ptr->stock[i], 0);
548                 fprintf(fff, "%c) %s\n", I2A(i % 12), o_name);
549 #endif
550         }
551
552         fprintf(fff, "\n\n");
553 }
554
555
556 /*!
557  * @brief ダンプ出力のメインルーチン
558  * Output the character dump to a file
559  * @param creature_ptr プレーヤーへの参照ポインタ
560  * @param fff ファイルポインタ
561  * @return エラーコード
562  */
563 void make_character_dump(player_type *creature_ptr, FILE *fff, void(*update_playtime)(void), display_player_pf display_player, map_name_pf map_name)
564 {
565         fprintf(fff, _("  [変愚蛮怒 %d.%d.%d キャラクタ情報]\n\n", "  [Hengband %d.%d.%d Character Dump]\n\n"),
566                 FAKE_VER_MAJOR - 10, FAKE_VER_MINOR, FAKE_VER_PATCH);
567         (*update_playtime)();
568
569         dump_aux_player_status(creature_ptr, fff, display_player, map_name);
570         dump_aux_last_message(creature_ptr, fff);
571         dump_aux_options(fff);
572         dump_aux_recall(fff);
573         dump_aux_quest(creature_ptr, fff);
574         dump_aux_arena(creature_ptr, fff);
575         dump_aux_monsters(fff);
576         dump_aux_virtues(creature_ptr, fff);
577         dump_aux_race_history(creature_ptr, fff);
578         dump_aux_realm_history(creature_ptr, fff);
579         dump_aux_class_special(creature_ptr, fff);
580         dump_aux_mutations(creature_ptr, fff);
581         dump_aux_pet(creature_ptr, fff);
582         fputs("\n\n", fff);
583         dump_aux_equipment_inventory(creature_ptr, fff);
584         dump_aux_home_museum(creature_ptr, fff);
585
586         fprintf(fff, _("  [チェックサム: \"%s\"]\n\n", "  [Check Sum: \"%s\"]\n\n"), get_check_sum());
587 }