OSDN Git Service

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