OSDN Git Service

a53f005894a1af10ca6d435ea0c907c202c81f23
[hengbandforosx/hengbandosx.git] / src / save / player-writer.cpp
1 #include "save/player-writer.h"
2 #include "cmd-building/cmd-building.h"
3 #include "dungeon/dungeon.h"
4 #include "game-option/birth-options.h"
5 #include "save/info-writer.h"
6 #include "save/player-class-specific-data-writer.h"
7 #include "save/save-util.h"
8 #include "system/building-type-definition.h"
9 #include "system/floor-type-definition.h"
10 #include "system/player-type-definition.h"
11 #include "timed-effect/player-cut.h"
12 #include "timed-effect/player-stun.h"
13 #include "timed-effect/timed-effects.h"
14 #include "world/world.h"
15
16 #include <variant>
17
18 /*!
19  * @brief セーブデータに領域情報を書き込む / Write player realms
20  * @param player_ptr プレイヤーへの参照ポインタ
21  */
22 static void wr_relams(player_type *player_ptr)
23 {
24     if (player_ptr->pclass == PlayerClassType::ELEMENTALIST)
25         wr_byte((byte)player_ptr->element);
26     else
27         wr_byte((byte)player_ptr->realm1);
28     wr_byte((byte)player_ptr->realm2);
29 }
30
31 /*!
32  * @brief セーブデータにプレイヤー情報を書き込む / Write some "player" info
33  * @param player_ptr プレイヤーへの参照ポインタ
34  */
35 void wr_player(player_type *player_ptr)
36 {
37     wr_string(player_ptr->name);
38     wr_string(player_ptr->died_from);
39     wr_string(player_ptr->last_message ? player_ptr->last_message : "");
40
41     save_quick_start();
42     for (int i = 0; i < 4; i++)
43         wr_string(player_ptr->history[i]);
44
45     wr_byte((byte)player_ptr->prace);
46     wr_byte((byte)player_ptr->pclass);
47     wr_byte((byte)player_ptr->ppersonality);
48     wr_byte((byte)player_ptr->psex);
49     wr_relams(player_ptr);
50     wr_byte(0);
51
52     wr_byte((byte)player_ptr->hitdie);
53     wr_u16b(player_ptr->expfact);
54
55     wr_s16b(player_ptr->age);
56     wr_s16b(player_ptr->ht);
57     wr_s16b(player_ptr->wt);
58
59     for (int i = 0; i < A_MAX; ++i)
60         wr_s16b(player_ptr->stat_max[i]);
61
62     for (int i = 0; i < A_MAX; ++i)
63         wr_s16b(player_ptr->stat_max_max[i]);
64
65     for (int i = 0; i < A_MAX; ++i)
66         wr_s16b(player_ptr->stat_cur[i]);
67
68     for (int i = 0; i < 12; ++i)
69         wr_s16b(0);
70
71     wr_u32b(player_ptr->au);
72     wr_u32b(player_ptr->max_exp);
73     wr_u32b(player_ptr->max_max_exp);
74     wr_u32b(player_ptr->exp);
75     wr_u32b(player_ptr->exp_frac);
76     wr_s16b(player_ptr->lev);
77
78     for (int i = 0; i < 64; i++)
79         wr_s16b(player_ptr->spell_exp[i]);
80
81     for (auto tval : TV_WEAPON_RANGE)
82         for (int j = 0; j < 64; j++)
83             wr_s16b(player_ptr->weapon_exp[tval][j]);
84
85     for (auto i : PLAYER_SKILL_KIND_TYPE_RANGE) {
86         wr_s16b(player_ptr->skill_exp[i]);
87     }
88     for (auto i = 0U; i < MAX_SKILLS - PLAYER_SKILL_KIND_TYPE_RANGE.size(); ++i) {
89         // resreved skills
90         wr_s16b(0);
91     }
92
93     std::visit(PlayerClassSpecificDataWriter(), player_ptr->class_specific_data);
94
95     wr_byte((byte)player_ptr->start_race);
96     wr_s32b(player_ptr->old_race1);
97     wr_s32b(player_ptr->old_race2);
98     wr_s16b(player_ptr->old_realm);
99
100     for (int i = 0; i < MAX_BOUNTY; i++)
101         wr_s16b(w_ptr->bounty_r_idx[i]);
102
103     for (int i = 0; i < 4; i++) {
104         wr_s16b(battle_mon[i]);
105         wr_u32b(mon_odds[i]);
106     }
107
108     wr_s16b(player_ptr->town_num);
109
110     wr_s16b(player_ptr->arena_number);
111     wr_s16b(player_ptr->current_floor_ptr->inside_arena);
112     wr_s16b(player_ptr->current_floor_ptr->inside_quest);
113     wr_s16b(player_ptr->phase_out);
114     wr_byte(player_ptr->exit_bldg);
115     wr_byte(0); /* Unused */
116
117     wr_s16b((int16_t)player_ptr->oldpx);
118     wr_s16b((int16_t)player_ptr->oldpy);
119
120     wr_s16b(0);
121     wr_s32b(player_ptr->mhp);
122     wr_s32b(player_ptr->chp);
123     wr_u32b(player_ptr->chp_frac);
124     wr_s32b(player_ptr->msp);
125     wr_s32b(player_ptr->csp);
126     wr_u32b(player_ptr->csp_frac);
127     wr_s16b(player_ptr->max_plv);
128
129     byte tmp8u = (byte)d_info.size();
130     wr_byte(tmp8u);
131     for (int i = 0; i < tmp8u; i++)
132         wr_s16b((int16_t)max_dlv[i]);
133
134     wr_s16b(0);
135     wr_s16b(0);
136     wr_s16b(0);
137     wr_s16b(0);
138     wr_s16b(player_ptr->sc);
139
140     auto effects = player_ptr->effects();
141     wr_s16b(0); /* old "rest" */
142     wr_s16b(player_ptr->blind);
143     wr_s16b(player_ptr->paralyzed);
144     wr_s16b(player_ptr->confused);
145     wr_s16b(player_ptr->food);
146     wr_s16b(0); /* old "food_digested" */
147     wr_s16b(0); /* old "protection" */
148     wr_s16b(player_ptr->energy_need);
149     wr_s16b(player_ptr->enchant_energy_need);
150     wr_s16b(player_ptr->fast);
151     wr_s16b(player_ptr->slow);
152     wr_s16b(player_ptr->afraid);
153     wr_s16b(effects->cut()->current());
154     wr_s16b(effects->stun()->current());
155     wr_s16b(player_ptr->poisoned);
156     wr_s16b(player_ptr->hallucinated);
157     wr_s16b(player_ptr->protevil);
158     wr_s16b(player_ptr->invuln);
159     wr_s16b(player_ptr->ult_res);
160     wr_s16b(player_ptr->hero);
161     wr_s16b(player_ptr->shero);
162     wr_s16b(player_ptr->shield);
163     wr_s16b(player_ptr->blessed);
164     wr_s16b(player_ptr->tim_invis);
165     wr_s16b(player_ptr->word_recall);
166     wr_s16b(player_ptr->recall_dungeon);
167     wr_s16b(player_ptr->alter_reality);
168     wr_s16b(player_ptr->see_infra);
169     wr_s16b(player_ptr->tim_infra);
170     wr_s16b(player_ptr->oppose_fire);
171     wr_s16b(player_ptr->oppose_cold);
172     wr_s16b(player_ptr->oppose_acid);
173     wr_s16b(player_ptr->oppose_elec);
174     wr_s16b(player_ptr->oppose_pois);
175     wr_s16b(player_ptr->tsuyoshi);
176     wr_s16b(player_ptr->tim_esp);
177     wr_s16b(player_ptr->wraith_form);
178     wr_s16b(player_ptr->resist_magic);
179     wr_s16b(player_ptr->tim_regen);
180     wr_s16b(player_ptr->tim_pass_wall);
181     wr_s16b(player_ptr->tim_stealth);
182     wr_s16b(player_ptr->tim_levitation);
183     wr_s16b(player_ptr->tim_sh_touki);
184     wr_s16b(player_ptr->lightspeed);
185     wr_s16b(player_ptr->tsubureru);
186     wr_s16b(player_ptr->magicdef);
187     wr_s16b(player_ptr->tim_res_nether);
188     wr_s16b(player_ptr->tim_res_time);
189     wr_byte((byte)player_ptr->mimic_form);
190     wr_s16b(player_ptr->tim_mimic);
191     wr_s16b(player_ptr->tim_sh_fire);
192     wr_s16b(player_ptr->tim_sh_holy);
193     wr_s16b(player_ptr->tim_eyeeye);
194
195     wr_s16b(player_ptr->tim_reflect);
196     wr_s16b(player_ptr->multishadow);
197     wr_s16b(player_ptr->dustrobe);
198
199     wr_s16b(player_ptr->chaos_patron);
200     wr_FlagGroup(player_ptr->muta, wr_byte);
201
202     for (int i = 0; i < 8; i++)
203         wr_s16b(player_ptr->virtues[i]);
204
205     for (int i = 0; i < 8; i++)
206         wr_s16b(player_ptr->vir_types[i]);
207
208     wr_s16b(player_ptr->ele_attack);
209     wr_u32b(player_ptr->special_attack);
210     wr_s16b(player_ptr->ele_immune);
211     wr_u32b(player_ptr->special_defense);
212     wr_byte(player_ptr->knowledge);
213     wr_byte(player_ptr->autopick_autoregister);
214     wr_byte(0);
215     wr_byte((byte)player_ptr->action);
216     wr_byte(0);
217     wr_byte(preserve_mode);
218     wr_byte(player_ptr->wait_report_score);
219
220     for (int i = 0; i < 12; i++)
221         wr_u32b(0L);
222
223     /* Ignore some flags */
224     wr_u32b(0L);
225     wr_u32b(0L);
226     wr_u32b(0L);
227
228     wr_u32b(w_ptr->seed_flavor);
229     wr_u32b(w_ptr->seed_town);
230     wr_u16b(player_ptr->panic_save);
231     wr_u16b(w_ptr->total_winner);
232     wr_u16b(w_ptr->noscore);
233     wr_byte(player_ptr->is_dead);
234     wr_byte(player_ptr->feeling);
235     wr_s32b(player_ptr->current_floor_ptr->generated_turn);
236     wr_s32b(player_ptr->feeling_turn);
237     wr_s32b(w_ptr->game_turn);
238     wr_s32b(w_ptr->dungeon_turn);
239     wr_s32b(w_ptr->arena_start_turn);
240     wr_s16b(w_ptr->today_mon);
241     wr_s16b(player_ptr->today_mon);
242     wr_s16b(player_ptr->riding);
243     wr_s16b(player_ptr->floor_id);
244
245     /* Save temporary preserved pets (obsolated) */
246     wr_s16b(0);
247     wr_u32b(w_ptr->play_time);
248     wr_s32b(player_ptr->visit);
249     wr_u32b(player_ptr->count);
250 }