OSDN Git Service

Merge pull request #3305 from Hourier/Divide-Init-Alloc
[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/gameterm.h"
41 #include "term/z-form.h"
42 #include "util/enum-converter.h"
43 #include "view/display-messages.h"
44 #include "world/world.h"
45
46 /*!
47  * @brief プレイヤーキャラの作成結果を日記に書く
48  * @param player_ptr プレイヤーへの参照ポインタ
49  */
50 static void write_birth_diary(PlayerType *player_ptr)
51 {
52     concptr indent = "                            ";
53
54     message_add(" ");
55     message_add("  ");
56     message_add("====================");
57     message_add(" ");
58     message_add("  ");
59
60     exe_write_diary(player_ptr, DIARY_GAMESTART, 1, _("-------- 新規ゲーム開始 --------", "------- Started New Game -------"));
61     exe_write_diary(player_ptr, DIARY_DIALY, 0, nullptr);
62     char buf[80];
63     strnfmt(buf, sizeof(buf), _("%s性別に%sを選択した。", "%schose %s gender."), indent, sex_info[player_ptr->psex].title);
64     exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, buf);
65     strnfmt(buf, sizeof(buf), _("%s種族に%sを選択した。", "%schose %s race."), indent, race_info[enum2i(player_ptr->prace)].title);
66     exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, buf);
67     strnfmt(buf, sizeof(buf), _("%s職業に%sを選択した。", "%schose %s class."), indent, class_info[enum2i(player_ptr->pclass)].title);
68     exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, buf);
69     if (player_ptr->realm1) {
70         strnfmt(buf, sizeof(buf), _("%s魔法の領域に%s%sを選択した。", "%schose %s%s."), indent, realm_names[player_ptr->realm1],
71             player_ptr->realm2 ? format(_("と%s", " and %s realms"), realm_names[player_ptr->realm2]).data() : _("", " realm"));
72         exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, buf);
73     }
74     if (player_ptr->element) {
75         strnfmt(buf, sizeof(buf), _("%s元素系統に%sを選択した。", "%schose %s system."), indent, get_element_title(player_ptr->element));
76         exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, buf);
77     }
78     strnfmt(buf, sizeof(buf), _("%s性格に%sを選択した。", "%schose %s personality."), indent, personality_info[player_ptr->ppersonality].title);
79     exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, buf);
80     if (PlayerClass(player_ptr).equals(PlayerClassType::CHAOS_WARRIOR)) {
81         strnfmt(buf, sizeof(buf), _("%s守護神%sと契約を交わした。", "%smade a contract with patron %s."), indent, patron_list[player_ptr->chaos_patron].name.data());
82         exe_write_diary(player_ptr, DIARY_DESCRIPTION, 1, buf);
83     }
84 }
85
86 /*!
87  * @brief プレイヤー作成処理のメインルーチン/ Create a new character.
88  * @details
89  * Note that we may be called with "junk" leftover in the various
90  * fields, so we must be sure to clear them first.
91  */
92 void player_birth(PlayerType *player_ptr)
93 {
94     TermCenteredOffsetSetter tcos(MAIN_TERM_MIN_COLS, MAIN_TERM_MIN_ROWS);
95
96     w_ptr->play_time = 0;
97     wipe_monsters_list(player_ptr);
98     player_wipe_without_name(player_ptr);
99     if (!ask_quick_start(player_ptr)) {
100         play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_NEW_GAME);
101         while (true) {
102             if (player_birth_wizard(player_ptr)) {
103                 break;
104             }
105
106             player_wipe_without_name(player_ptr);
107         }
108     }
109
110     write_birth_diary(player_ptr);
111     for (size_t i = 1; i < towns_info.size(); i++) {
112         for (auto sst : STORE_SALE_TYPE_LIST) {
113             store_init(i, sst);
114         }
115     }
116
117     seed_wilderness();
118     if (PlayerRace(player_ptr).equals(PlayerRaceType::BEASTMAN)) {
119         player_ptr->hack_mutation = true;
120     } else {
121         player_ptr->hack_mutation = false;
122     }
123
124     if (!window_flag[1]) {
125         window_flag[1] |= PW_MESSAGE;
126     }
127
128     if (!window_flag[2]) {
129         window_flag[2] |= PW_INVENTORY;
130     }
131 }