OSDN Git Service

Merge pull request #3532 from sikabane-works/release/3.0.0.87-alpha
[hengbandforosx/hengbandosx.git] / src / birth / quick-start.cpp
1 #include "birth/quick-start.h"
2 #include "birth/birth-stat.h"
3 #include "birth/birth-util.h"
4 #include "birth/game-play-initializer.h"
5 #include "io/input-key-acceptor.h"
6 #include "player-base/player-class.h"
7 #include "player-info/class-info.h"
8 #include "player-info/race-info.h"
9 #include "player/player-personality.h"
10 #include "player/player-sex.h"
11 #include "player/player-status.h"
12 #include "player/process-name.h"
13 #include "player/race-info-table.h"
14 #include "system/player-type-definition.h"
15 #include "system/redrawing-flags-updater.h"
16 #include "term/screen-processor.h"
17 #include "util/enum-converter.h"
18
19 /*
20  * The last character rolled,
21  * holded for quick start
22  */
23 birther previous_char;
24
25 /*!
26  * @brief クイックスタート処理の問い合わせと実行を行う。/Ask whether the player use Quick Start or not.
27  */
28 bool ask_quick_start(PlayerType *player_ptr)
29 {
30     if (!previous_char.quick_ok) {
31         return false;
32     }
33
34     term_clear();
35     put_str(_("クイック・スタートを使うと以前と全く同じキャラクターで始められます。",
36                 "Do you want to use the quick start function (same character as your last one)."),
37         11, 2);
38     while (true) {
39         char c;
40         put_str(_("クイック・スタートを使いますか?[y/N]", "Use quick start? [y/N]"), 14, 10);
41         c = inkey();
42         if (c == 'Q') {
43             quit(nullptr);
44         } else if (c == 'S') {
45             return false;
46         } else if (c == '?') {
47             show_help(player_ptr, _("jbirth.txt#QuickStart", "birth.txt#QuickStart"));
48         } else if ((c == 'y') || (c == 'Y')) {
49             break;
50         } else {
51             return false;
52         }
53     }
54
55     load_prev_data(player_ptr, false);
56     init_turn(player_ptr);
57     init_dungeon_quests(player_ptr);
58
59     sp_ptr = &sex_info[player_ptr->psex];
60     rp_ptr = &race_info[enum2i(player_ptr->prace)];
61     auto short_pclass = enum2i(player_ptr->pclass);
62     cp_ptr = &class_info[short_pclass];
63     mp_ptr = &class_magics_info[short_pclass];
64     ap_ptr = &personality_info[player_ptr->ppersonality];
65
66     get_extra(player_ptr, false);
67     static constexpr auto flags = {
68         StatusRecalculatingFlag::BONUS,
69         StatusRecalculatingFlag::HP,
70     };
71     RedrawingFlagsUpdater::get_instance().set_flags(flags);
72     update_creature(player_ptr);
73     player_ptr->chp = player_ptr->mhp;
74     player_ptr->csp = player_ptr->msp;
75     process_player_name(player_ptr);
76     return true;
77 }
78 /*!
79  * @brief プレイヤーのクイックスタート情報をプレイヤー構造体から保存する / Save the current data for later
80  * @param birther_ptr クイックスタート構造体の参照ポインタ
81  * @return なし。
82  */
83 void save_prev_data(PlayerType *player_ptr, birther *birther_ptr)
84 {
85     birther_ptr->psex = player_ptr->psex;
86     birther_ptr->prace = player_ptr->prace;
87     birther_ptr->pclass = player_ptr->pclass;
88     birther_ptr->ppersonality = player_ptr->ppersonality;
89
90     if (PlayerClass(player_ptr).equals(PlayerClassType::ELEMENTALIST)) {
91         birther_ptr->realm1 = player_ptr->element;
92     } else {
93         birther_ptr->realm1 = player_ptr->realm1;
94     }
95
96     birther_ptr->realm2 = player_ptr->realm2;
97     birther_ptr->age = player_ptr->age;
98     birther_ptr->ht = player_ptr->ht;
99     birther_ptr->wt = player_ptr->wt;
100     birther_ptr->sc = player_ptr->sc;
101     birther_ptr->au = player_ptr->au;
102
103     for (int i = 0; i < A_MAX; i++) {
104         birther_ptr->stat_max[i] = player_ptr->stat_max[i];
105         birther_ptr->stat_max_max[i] = player_ptr->stat_max_max[i];
106     }
107
108     for (int i = 0; i < PY_MAX_LEVEL; i++) {
109         birther_ptr->player_hp[i] = player_ptr->player_hp[i];
110     }
111
112     birther_ptr->chaos_patron = player_ptr->chaos_patron;
113     for (int i = 0; i < 8; i++) {
114         birther_ptr->vir_types[i] = player_ptr->vir_types[i];
115     }
116
117     for (int i = 0; i < 4; i++) {
118         strcpy(birther_ptr->history[i], player_ptr->history[i]);
119     }
120 }
121
122 /*!
123  * @brief プレイヤーのクイックスタート情報をプレイヤー構造体へ読み込む / Load the previous data
124  * @param swap TRUEならば現在のプレイヤー構造体上との内容をスワップする形で読み込む。
125  * @return なし。
126  */
127 void load_prev_data(PlayerType *player_ptr, bool swap)
128 {
129     birther temp;
130     if (swap) {
131         save_prev_data(player_ptr, &temp);
132     }
133
134     player_ptr->psex = previous_char.psex;
135     player_ptr->prace = previous_char.prace;
136     player_ptr->pclass = previous_char.pclass;
137     player_ptr->ppersonality = previous_char.ppersonality;
138
139     if (PlayerClass(player_ptr).equals(PlayerClassType::ELEMENTALIST)) {
140         player_ptr->element = previous_char.realm1;
141     } else {
142         player_ptr->realm1 = previous_char.realm1;
143     }
144
145     player_ptr->realm2 = previous_char.realm2;
146     player_ptr->age = previous_char.age;
147     player_ptr->ht = previous_char.ht;
148     player_ptr->wt = previous_char.wt;
149     player_ptr->sc = previous_char.sc;
150     player_ptr->au = previous_char.au;
151
152     for (int i = 0; i < A_MAX; i++) {
153         player_ptr->stat_cur[i] = player_ptr->stat_max[i] = previous_char.stat_max[i];
154         player_ptr->stat_max_max[i] = previous_char.stat_max_max[i];
155     }
156
157     for (int i = 0; i < PY_MAX_LEVEL; i++) {
158         player_ptr->player_hp[i] = previous_char.player_hp[i];
159     }
160
161     player_ptr->mhp = player_ptr->player_hp[0];
162     player_ptr->chp = player_ptr->player_hp[0];
163     player_ptr->chaos_patron = previous_char.chaos_patron;
164     for (int i = 0; i < 8; i++) {
165         player_ptr->vir_types[i] = previous_char.vir_types[i];
166     }
167
168     PlayerClass(player_ptr).init_specific_data();
169
170     for (int i = 0; i < 4; i++) {
171         strcpy(player_ptr->history[i], previous_char.history[i]);
172     }
173
174     if (swap) {
175         previous_char = temp;
176     }
177 }