OSDN Git Service

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