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"
19 * @brief セーブデータに領域情報を書き込む / Write player realms
20 * @param player_ptr プレイヤーへの参照ポインタ
22 static void wr_relams(player_type *player_ptr)
24 if (player_ptr->pclass == PlayerClassType::ELEMENTALIST)
25 wr_byte((byte)player_ptr->element);
27 wr_byte((byte)player_ptr->realm1);
28 wr_byte((byte)player_ptr->realm2);
32 * @brief セーブデータにプレイヤー情報を書き込む / Write some "player" info
33 * @param player_ptr プレイヤーへの参照ポインタ
35 void wr_player(player_type *player_ptr)
37 wr_string(player_ptr->name);
38 wr_string(player_ptr->died_from);
39 wr_string(player_ptr->last_message ? player_ptr->last_message : "");
42 for (int i = 0; i < 4; i++)
43 wr_string(player_ptr->history[i]);
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);
52 wr_byte((byte)player_ptr->hitdie);
53 wr_u16b(player_ptr->expfact);
55 wr_s16b(player_ptr->age);
56 wr_s16b(player_ptr->ht);
57 wr_s16b(player_ptr->wt);
59 for (int i = 0; i < A_MAX; ++i)
60 wr_s16b(player_ptr->stat_max[i]);
62 for (int i = 0; i < A_MAX; ++i)
63 wr_s16b(player_ptr->stat_max_max[i]);
65 for (int i = 0; i < A_MAX; ++i)
66 wr_s16b(player_ptr->stat_cur[i]);
68 for (int i = 0; i < 12; ++i)
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);
78 for (int i = 0; i < 64; i++)
79 wr_s16b(player_ptr->spell_exp[i]);
81 for (auto tval : TV_WEAPON_RANGE)
82 for (int j = 0; j < 64; j++)
83 wr_s16b(player_ptr->weapon_exp[tval][j]);
85 for (auto i : PLAYER_SKILL_KIND_TYPE_RANGE) {
86 wr_s16b(player_ptr->skill_exp[i]);
88 for (auto i = 0U; i < MAX_SKILLS - PLAYER_SKILL_KIND_TYPE_RANGE.size(); ++i) {
93 std::visit(PlayerClassSpecificDataWriter(), player_ptr->class_specific_data);
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);
100 for (int i = 0; i < MAX_BOUNTY; i++)
101 wr_s16b(w_ptr->bounty_r_idx[i]);
103 for (int i = 0; i < 4; i++) {
104 wr_s16b(battle_mon[i]);
105 wr_u32b(mon_odds[i]);
108 wr_s16b(player_ptr->town_num);
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 */
117 wr_s16b((int16_t)player_ptr->oldpx);
118 wr_s16b((int16_t)player_ptr->oldpy);
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);
129 byte tmp8u = (byte)d_info.size();
131 for (int i = 0; i < tmp8u; i++)
132 wr_s16b((int16_t)max_dlv[i]);
138 wr_s16b(player_ptr->sc);
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);
195 wr_s16b(player_ptr->tim_reflect);
196 wr_s16b(player_ptr->multishadow);
197 wr_s16b(player_ptr->dustrobe);
199 wr_s16b(player_ptr->chaos_patron);
200 wr_FlagGroup(player_ptr->muta, wr_byte);
202 for (int i = 0; i < 8; i++)
203 wr_s16b(player_ptr->virtues[i]);
205 for (int i = 0; i < 8; i++)
206 wr_s16b(player_ptr->vir_types[i]);
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);
215 wr_byte((byte)player_ptr->action);
217 wr_byte(preserve_mode);
218 wr_byte(player_ptr->wait_report_score);
220 for (int i = 0; i < 12; i++)
223 /* Ignore some flags */
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);
245 /* Save temporary preserved pets (obsolated) */
247 wr_u32b(w_ptr->play_time);
248 wr_s32b(player_ptr->visit);
249 wr_u32b(player_ptr->count);