1 #include "load/player-info-loader.h"
2 #include "cmd-building/cmd-building.h"
3 #include "dungeon/dungeon.h"
4 #include "load/angband-version-comparer.h"
5 #include "load/birth-loader.h"
6 #include "load/dummy-loader.h"
7 #include "load/load-util.h"
8 #include "load/load-v1-3-0.h"
9 #include "load/load-v1-7-0.h"
10 #include "load/load-zangband.h"
11 #include "load/player-attack-loader.h"
12 #include "load/world-loader.h"
13 #include "market/arena.h"
14 #include "mutation/mutation-calculator.h"
15 #include "monster-race/race-ability-flags.h"
16 #include "player/attack-defense-types.h"
17 #include "player/player-skill.h"
18 #include "spell-realm/spells-song.h"
19 #include "system/floor-type-definition.h"
20 #include "system/player-type-definition.h"
21 #include "timed-effect/player-stun.h"
22 #include "timed-effect/timed-effects.h"
23 #include "world/world.h"
26 * @brief セーブデータから領域情報を読み込む / Read player realms
27 * @param player_ptr プレイヤーへの参照ポインタ
29 static void rd_realms(player_type *player_ptr)
34 if (player_ptr->pclass == CLASS_ELEMENTALIST)
35 player_ptr->element = (int16_t)tmp8u;
37 player_ptr->realm1 = (int16_t)tmp8u;
40 player_ptr->realm2 = (int16_t)tmp8u;
41 if (player_ptr->realm2 == 255)
42 player_ptr->realm2 = 0;
46 * @brief セーブデータからプレイヤー基本情報を読み込む / Read player's basic info
47 * @param player_ptr プレイヤーへの参照ポインタ
49 void rd_base_info(player_type *player_ptr)
51 rd_string(player_ptr->name, sizeof(player_ptr->name));
52 rd_string(player_ptr->died_from, sizeof(player_ptr->died_from));
53 if (!h_older_than(1, 7, 0, 1)) {
55 rd_string(buf, sizeof buf);
57 player_ptr->last_message = string_make(buf);
61 const int max_history_lines = 4;
62 for (int i = 0; i < max_history_lines; i++)
63 rd_string(player_ptr->history[i], sizeof(player_ptr->history[i]));
67 player_ptr->prace = (player_race_type)tmp8u;
70 player_ptr->pclass = (player_class_type)tmp8u;
73 player_ptr->pseikaku = (player_personality_type)tmp8u;
76 player_ptr->psex = i2enum<player_sex>(tmp8u);
78 rd_realms(player_ptr);
81 if (h_older_than(0, 4, 4))
82 set_zangband_realm(player_ptr);
85 player_ptr->hitdie = (DICE_SID)tmp8u;
86 rd_u16b(&player_ptr->expfact);
88 rd_s16b(&player_ptr->age);
89 rd_s16b(&player_ptr->ht);
90 rd_s16b(&player_ptr->wt);
93 void rd_experience(player_type *player_ptr)
95 rd_s32b(&player_ptr->max_exp);
96 if (h_older_than(1, 5, 4, 1))
97 player_ptr->max_max_exp = player_ptr->max_exp;
99 rd_s32b(&player_ptr->max_max_exp);
101 rd_s32b(&player_ptr->exp);
102 if (h_older_than(1, 7, 0, 3))
103 set_exp_frac_old(player_ptr);
105 rd_u32b(&player_ptr->exp_frac);
107 rd_s16b(&player_ptr->lev);
108 for (int i = 0; i < 64; i++)
109 rd_s16b(&player_ptr->spell_exp[i]);
111 if ((player_ptr->pclass == CLASS_SORCERER) && h_older_than(0, 4, 2))
112 for (int i = 0; i < 64; i++)
113 player_ptr->spell_exp[i] = SPELL_EXP_MASTER;
115 const int max_weapon_exp_size = h_older_than(0, 3, 6) ? 60 : 64;
116 for (int i = 0; i < 5; i++)
117 for (int j = 0; j < max_weapon_exp_size; j++)
118 rd_s16b(&player_ptr->weapon_exp[i][j]);
120 for (int i = 0; i < MAX_SKILLS; i++)
121 rd_s16b(&player_ptr->skill_exp[i]);
124 static void set_spells(player_type *player_ptr)
126 for (int i = 0; i < MAX_SPELLS; i++)
127 rd_s32b(&player_ptr->magic_num1[i]);
129 for (int i = 0; i < MAX_SPELLS; i++)
130 rd_byte(&player_ptr->magic_num2[i]);
132 if (h_older_than(1, 3, 0, 1))
133 set_spells_old(player_ptr);
136 void rd_skills(player_type *player_ptr)
138 if (h_older_than(0, 4, 1))
139 set_zangband_skill(player_ptr);
141 if (h_older_than(0, 3, 14))
142 set_zangband_spells(player_ptr);
144 set_spells(player_ptr);
146 if (music_singing_any(player_ptr))
147 player_ptr->action = ACTION_SING;
150 static void set_race(player_type *player_ptr)
154 player_ptr->start_race = (player_race_type)tmp8u;
157 player_ptr->old_race1 = (BIT_FLAGS)tmp32s;
159 player_ptr->old_race2 = (BIT_FLAGS)tmp32s;
160 rd_s16b(&player_ptr->old_realm);
163 void rd_race(player_type *player_ptr)
165 if (h_older_than(1, 0, 7)) {
166 set_zangband_race(player_ptr);
170 set_race(player_ptr);
173 void rd_bounty_uniques(player_type *player_ptr)
175 if (h_older_than(0, 0, 3)) {
176 set_zangband_bounty_uniques(player_ptr);
180 for (int i = 0; i < MAX_BOUNTY; i++)
181 rd_s16b(&w_ptr->bounty_r_idx[i]);
185 * @brief 腕力などの基本ステータス情報を読み込む
186 * @param player_ptr プレイヤーへの参照ポインタ
188 static void rd_base_status(player_type *player_ptr)
190 for (int i = 0; i < A_MAX; i++)
191 rd_s16b(&player_ptr->stat_max[i]);
193 for (int i = 0; i < A_MAX; i++)
194 rd_s16b(&player_ptr->stat_max_max[i]);
196 for (int i = 0; i < A_MAX; i++)
197 rd_s16b(&player_ptr->stat_cur[i]);
200 static void set_imitation(player_type *player_ptr)
202 if (h_older_than(0, 0, 1)) {
203 for (int i = 0; i < MAX_MANE; i++) {
204 player_ptr->mane_spell[i] = RF_ABILITY::MAX;
205 player_ptr->mane_dam[i] = 0;
208 player_ptr->mane_num = 0;
212 if (h_older_than(0, 2, 3)) {
214 const int OLD_MAX_MANE = 22;
215 for (int i = 0; i < OLD_MAX_MANE; i++) {
220 for (int i = 0; i < MAX_MANE; i++) {
221 player_ptr->mane_spell[i] = RF_ABILITY::MAX;
222 player_ptr->mane_dam[i] = 0;
226 player_ptr->mane_num = 0;
230 for (int i = 0; i < MAX_MANE; i++) {
233 player_ptr->mane_spell[i] = i2enum<RF_ABILITY>(tmp16s);
235 player_ptr->mane_dam[i] = (SPELL_IDX)tmp16s;
238 rd_s16b(&player_ptr->mane_num);
241 static void rd_phase_out(player_type *player_ptr)
245 player_ptr->current_floor_ptr->inside_arena = (bool)tmp16s;
246 rd_s16b(&player_ptr->current_floor_ptr->inside_quest);
247 if (h_older_than(0, 3, 5))
248 player_ptr->phase_out = false;
251 player_ptr->phase_out = (bool)tmp16s;
255 static void rd_arena(player_type *player_ptr)
257 if (h_older_than(0, 0, 3))
258 update_gambling_monsters(player_ptr);
260 set_gambling_monsters();
262 rd_s16b(&player_ptr->town_num);
263 rd_s16b(&player_ptr->arena_number);
264 if (h_older_than(1, 5, 0, 1))
265 if (player_ptr->arena_number >= 99)
266 player_ptr->arena_number = ARENA_DEFEATED_OLD_VER;
268 rd_phase_out(player_ptr);
270 rd_byte(&player_ptr->exit_bldg);
275 player_ptr->oldpx = (POSITION)tmp16s;
277 player_ptr->oldpy = (POSITION)tmp16s;
278 if (h_older_than(0, 3, 13) && !is_in_dungeon(player_ptr) && !player_ptr->current_floor_ptr->inside_arena) {
279 player_ptr->oldpy = 33;
280 player_ptr->oldpx = 131;
285 * @brief プレイヤーの最大HP/現在HPを読み込む
286 * @param player_ptr プレイヤーへの参照ポインタ
288 static void rd_hp(player_type *player_ptr)
290 if (h_older_than(1, 7, 0, 3)) {
291 set_hp_old(player_ptr);
295 rd_s32b(&player_ptr->mhp);
296 rd_s32b(&player_ptr->chp);
297 rd_u32b(&player_ptr->chp_frac);
301 * @brief プレイヤーの最大MP/現在MPを読み込む
302 * @param player_ptr プレイヤーへの参照ポインタ
304 static void rd_mana(player_type *player_ptr)
306 if (h_older_than(1, 7, 0, 3)) {
307 set_mana_old(player_ptr);
311 rd_s32b(&player_ptr->msp);
312 rd_s32b(&player_ptr->csp);
313 rd_u32b(&player_ptr->csp_frac);
317 * @brief プレイヤーのバッドステータス (と空腹)を読み込む
318 * @param player_ptr プレイヤーへの参照ポインタ
320 static void rd_bad_status(player_type *player_ptr)
322 strip_bytes(2); /* Old "rest" */
323 rd_s16b(&player_ptr->blind);
324 rd_s16b(&player_ptr->paralyzed);
325 rd_s16b(&player_ptr->confused);
326 rd_s16b(&player_ptr->food);
327 strip_bytes(4); /* Old "food_digested" / "protection" */
330 static void rd_energy(player_type *player_ptr)
332 rd_s16b(&player_ptr->energy_need);
333 if (h_older_than(1, 0, 13))
334 player_ptr->energy_need = 100 - player_ptr->energy_need;
336 if (h_older_than(2, 1, 2, 0))
337 player_ptr->enchant_energy_need = 0;
339 rd_s16b(&player_ptr->enchant_energy_need);
343 * @brief プレイヤーのグッド/バッドステータスを読み込む
344 * @param player_ptr プレイヤーへの参照ポインタ
345 * @todo 明らかに関数名がビッグワードだが他に思いつかなかった
347 static void rd_status(player_type *player_ptr)
349 rd_s16b(&player_ptr->fast);
350 rd_s16b(&player_ptr->slow);
351 rd_s16b(&player_ptr->afraid);
352 rd_s16b(&player_ptr->cut);
353 int16_t tmp16s = player_ptr->effects()->stun()->current();
355 rd_s16b(&player_ptr->poisoned);
356 rd_s16b(&player_ptr->hallucinated);
357 rd_s16b(&player_ptr->protevil);
358 rd_s16b(&player_ptr->invuln);
359 if (h_older_than(0, 0, 0))
360 player_ptr->ult_res = 0;
362 rd_s16b(&player_ptr->ult_res);
365 static void rd_tsuyoshi(player_type *player_ptr)
367 if (h_older_than(0, 0, 2))
368 player_ptr->tsuyoshi = 0;
370 rd_s16b(&player_ptr->tsuyoshi);
373 static void set_timed_effects(player_type *player_ptr)
375 rd_s16b(&player_ptr->tim_esp);
376 rd_s16b(&player_ptr->wraith_form);
377 rd_s16b(&player_ptr->resist_magic);
378 rd_s16b(&player_ptr->tim_regen);
379 rd_s16b(&player_ptr->tim_pass_wall);
380 rd_s16b(&player_ptr->tim_stealth);
381 rd_s16b(&player_ptr->tim_levitation);
382 rd_s16b(&player_ptr->tim_sh_touki);
383 rd_s16b(&player_ptr->lightspeed);
384 rd_s16b(&player_ptr->tsubureru);
385 if (h_older_than(0, 4, 7))
386 player_ptr->magicdef = 0;
388 rd_s16b(&player_ptr->magicdef);
390 rd_s16b(&player_ptr->tim_res_nether);
391 if (h_older_than(0, 4, 11))
392 set_zangband_mimic(player_ptr);
394 rd_s16b(&player_ptr->tim_res_time);
398 player_ptr->mimic_form = (IDX)tmp8u;
399 rd_s16b(&player_ptr->tim_mimic);
400 rd_s16b(&player_ptr->tim_sh_fire);
403 if (h_older_than(1, 0, 99))
404 set_zangband_holy_aura(player_ptr);
406 rd_s16b(&player_ptr->tim_sh_holy);
407 rd_s16b(&player_ptr->tim_eyeeye);
410 if (h_older_than(1, 0, 3))
411 set_zangband_reflection(player_ptr);
413 rd_s16b(&player_ptr->tim_reflect);
414 rd_s16b(&player_ptr->multishadow);
415 rd_s16b(&player_ptr->dustrobe);
419 static void set_mutations(player_type *player_ptr)
421 if (loading_savefile_version_is_older_than(2)) {
422 for (int i = 0; i < 3; i++) {
425 migrate_bitflag_to_flaggroup(player_ptr->muta, tmp32u, i * 32);
428 rd_FlagGroup(player_ptr->muta, rd_byte);
432 static void set_virtues(player_type *player_ptr)
434 for (int i = 0; i < 8; i++)
435 rd_s16b(&player_ptr->virtues[i]);
437 for (int i = 0; i < 8; i++)
438 rd_s16b(&player_ptr->vir_types[i]);
443 * @param player_ptr プレイヤーへの参照ポインタ
445 static void rd_timed_effects(player_type *player_ptr)
447 set_timed_effects(player_ptr);
448 rd_s16b(&player_ptr->chaos_patron);
449 set_mutations(player_ptr);
450 set_virtues(player_ptr);
453 static void rd_player_status(player_type *player_ptr)
455 rd_base_status(player_ptr);
457 rd_s32b(&player_ptr->au);
458 rd_experience(player_ptr);
459 rd_skills(player_ptr);
461 set_imitation(player_ptr);
462 rd_bounty_uniques(player_ptr);
463 rd_arena(player_ptr);
467 rd_s16b(&player_ptr->max_plv);
468 rd_dungeons(player_ptr);
470 rd_s16b(&player_ptr->sc);
471 rd_s16b(&player_ptr->concent);
472 rd_bad_status(player_ptr);
473 rd_energy(player_ptr);
474 rd_status(player_ptr);
475 rd_s16b(&player_ptr->hero);
476 rd_s16b(&player_ptr->shero);
477 rd_s16b(&player_ptr->shield);
478 rd_s16b(&player_ptr->blessed);
479 rd_s16b(&player_ptr->tim_invis);
480 rd_s16b(&player_ptr->word_recall);
481 rd_alter_reality(player_ptr);
482 rd_s16b(&player_ptr->see_infra);
483 rd_s16b(&player_ptr->tim_infra);
484 rd_s16b(&player_ptr->oppose_fire);
485 rd_s16b(&player_ptr->oppose_cold);
486 rd_s16b(&player_ptr->oppose_acid);
487 rd_s16b(&player_ptr->oppose_elec);
488 rd_s16b(&player_ptr->oppose_pois);
489 rd_tsuyoshi(player_ptr);
490 rd_timed_effects(player_ptr);
491 player_ptr->mutant_regenerate_mod = calc_mutant_regenerate_mod(player_ptr);
494 void rd_player_info(player_type *player_ptr)
496 rd_player_status(player_ptr);
497 rd_special_attack(player_ptr);
498 rd_special_action(player_ptr);
499 rd_special_defense(player_ptr);
500 rd_byte(&player_ptr->knowledge);
501 rd_autopick(player_ptr);
502 rd_action(player_ptr);