OSDN Git Service

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