OSDN Git Service

Merge pull request #2962 from habu1010/feature/refactor-format-retval-to-string
[hengbandforosx/hengbandosx.git] / src / birth / character-builder.cpp
1 /*!
2  * @file birth.c
3  * @brief プレイヤーの作成を行う / Create a player character
4  * @date 2013/12/28
5  * @author
6  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
7  *\n
8  * This software may be copied and distributed for educational, research,\n
9  * and not for profit purposes provided that this copyright and statement\n
10  * are included in all such copies.  Other copyrights may also apply.\n
11  * 2013 Deskull Doxygen向けのコメント整理\n
12  */
13
14 #include "birth/character-builder.h"
15 #include "birth/birth-explanations-table.h"
16 #include "birth/birth-wizard.h"
17 #include "birth/game-play-initializer.h"
18 #include "birth/quick-start.h"
19 #include "core/window-redrawer.h"
20 #include "floor/floor-town.h"
21 #include "floor/wild.h"
22 #include "game-option/option-flags.h"
23 #include "io/write-diary.h"
24 #include "main/music-definitions-table.h"
25 #include "main/sound-of-music.h"
26 #include "mind/mind-elementalist.h"
27 #include "monster-floor/monster-remover.h"
28 #include "player-base/player-class.h"
29 #include "player-base/player-race.h"
30 #include "player-info/class-info.h"
31 #include "player-info/race-types.h"
32 #include "player/patron.h"
33 #include "player/player-personality.h"
34 #include "player/player-sex.h"
35 #include "player/race-info-table.h"
36 #include "realm/realm-names-table.h"
37 #include "store/store-owners.h"
38 #include "store/store.h"
39 #include "system/player-type-definition.h"
40 #include "term/z-form.h"
41 #include "util/enum-converter.h"
42 #include "view/display-messages.h"
43 #include "world/world.h"
44
45 /*!
46  * @brief プレイヤーキャラの作成結果を日記に書く
47  * @param player_ptr プレイヤーへの参照ポインタ
48  */
49 static void write_birth_diary(PlayerType *player_ptr)
50 {
51     concptr indent = "                            ";
52
53     message_add(" ");
54     message_add("  ");
55     message_add("====================");
56     message_add(" ");
57     message_add("  ");
58
59     exe_write_diary(player_ptr, DIARY_GAMESTART, 1, _("-------- 新規ゲーム開始 --------", "------- Started New Game -------"));
60     exe_write_diary(player_ptr, DIARY_DIALY, 0, nullptr);
61     char buf[80];
62     strnfmt(buf, sizeof(buf), _("%s性別に%sを選択した。", "%schose %s gender."), indent, sex_info[player_ptr->psex].title);
63     exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, buf);
64     strnfmt(buf, sizeof(buf), _("%s種族に%sを選択した。", "%schose %s race."), indent, race_info[enum2i(player_ptr->prace)].title);
65     exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, buf);
66     strnfmt(buf, sizeof(buf), _("%s職業に%sを選択した。", "%schose %s class."), indent, class_info[enum2i(player_ptr->pclass)].title);
67     exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, buf);
68     if (player_ptr->realm1) {
69         strnfmt(buf, sizeof(buf), _("%s魔法の領域に%s%sを選択した。", "%schose %s%s."), indent, realm_names[player_ptr->realm1],
70             player_ptr->realm2 ? format(_("と%s", " and %s realms"), realm_names[player_ptr->realm2]).data() : _("", " realm"));
71         exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, buf);
72     }
73     if (player_ptr->element) {
74         strnfmt(buf, sizeof(buf), _("%s元素系統に%sを選択した。", "%schose %s system."), indent, get_element_title(player_ptr->element));
75         exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, buf);
76     }
77     strnfmt(buf, sizeof(buf), _("%s性格に%sを選択した。", "%schose %s personality."), indent, personality_info[player_ptr->ppersonality].title);
78     exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, buf);
79     if (PlayerClass(player_ptr).equals(PlayerClassType::CHAOS_WARRIOR)) {
80         strnfmt(buf, sizeof(buf), _("%s守護神%sと契約を交わした。", "%smade a contract with patron %s."), indent, patron_list[player_ptr->chaos_patron].name.data());
81         exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, buf);
82     }
83 }
84
85 /*!
86  * @brief プレイヤー作成処理のメインルーチン/ Create a new character.
87  * @details
88  * Note that we may be called with "junk" leftover in the various
89  * fields, so we must be sure to clear them first.
90  */
91 void player_birth(PlayerType *player_ptr)
92 {
93     w_ptr->play_time = 0;
94     wipe_monsters_list(player_ptr);
95     player_wipe_without_name(player_ptr);
96     if (!ask_quick_start(player_ptr)) {
97         play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_NEW_GAME);
98         while (true) {
99             if (player_birth_wizard(player_ptr)) {
100                 break;
101             }
102
103             player_wipe_without_name(player_ptr);
104         }
105     }
106
107     write_birth_diary(player_ptr);
108     for (int i = 1; i < max_towns; i++) {
109         for (auto sst : STORE_SALE_TYPE_LIST) {
110             store_init(i, sst);
111         }
112     }
113
114     seed_wilderness();
115     if (PlayerRace(player_ptr).equals(PlayerRaceType::BEASTMAN)) {
116         player_ptr->hack_mutation = true;
117     } else {
118         player_ptr->hack_mutation = false;
119     }
120
121     if (!window_flag[1]) {
122         window_flag[1] |= PW_MESSAGE;
123     }
124
125     if (!window_flag[2]) {
126         window_flag[2] |= PW_INVEN;
127     }
128 }