OSDN Git Service

[Refactor] #1558 Renamed player_type::image to player_type::hallucinated
[hengbandforosx/hengbandosx.git] / src / load / player-info-loader.cpp
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"
24
25 /*!
26  * @brief セーブデータから領域情報を読み込む / Read player realms
27  * @param player_ptr プレイヤーへの参照ポインタ
28  */
29 static void rd_realms(player_type *player_ptr)
30 {
31     byte tmp8u;
32
33     rd_byte(&tmp8u);
34     if (player_ptr->pclass == CLASS_ELEMENTALIST)
35         player_ptr->element = (int16_t)tmp8u;
36     else
37         player_ptr->realm1 = (int16_t)tmp8u;
38
39     rd_byte(&tmp8u);
40     player_ptr->realm2 = (int16_t)tmp8u;
41     if (player_ptr->realm2 == 255)
42         player_ptr->realm2 = 0;
43 }
44
45 /*!
46  * @brief セーブデータからプレイヤー基本情報を読み込む / Read player's basic info
47  * @param player_ptr プレイヤーへの参照ポインタ
48  */
49 void rd_base_info(player_type *player_ptr)
50 {
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)) {
54         char buf[1024];
55         rd_string(buf, sizeof buf);
56         if (buf[0])
57             player_ptr->last_message = string_make(buf);
58     }
59
60     load_quick_start();
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]));
64
65     byte tmp8u;
66     rd_byte(&tmp8u);
67     player_ptr->prace = (player_race_type)tmp8u;
68
69     rd_byte(&tmp8u);
70     player_ptr->pclass = (player_class_type)tmp8u;
71
72     rd_byte(&tmp8u);
73     player_ptr->pseikaku = (player_personality_type)tmp8u;
74
75     rd_byte(&tmp8u);
76     player_ptr->psex = i2enum<player_sex>(tmp8u);
77
78     rd_realms(player_ptr);
79
80     rd_byte(&tmp8u);
81     if (h_older_than(0, 4, 4))
82         set_zangband_realm(player_ptr);
83
84     rd_byte(&tmp8u);
85     player_ptr->hitdie = (DICE_SID)tmp8u;
86     rd_u16b(&player_ptr->expfact);
87
88     rd_s16b(&player_ptr->age);
89     rd_s16b(&player_ptr->ht);
90     rd_s16b(&player_ptr->wt);
91 }
92
93 void rd_experience(player_type *player_ptr)
94 {
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;
98     else
99         rd_s32b(&player_ptr->max_max_exp);
100
101     rd_s32b(&player_ptr->exp);
102     if (h_older_than(1, 7, 0, 3))
103         set_exp_frac_old(player_ptr);
104     else
105         rd_u32b(&player_ptr->exp_frac);
106
107     rd_s16b(&player_ptr->lev);
108     for (int i = 0; i < 64; i++)
109         rd_s16b(&player_ptr->spell_exp[i]);
110
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;
114
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]);
119
120     for (int i = 0; i < MAX_SKILLS; i++)
121         rd_s16b(&player_ptr->skill_exp[i]);
122 }
123
124 static void set_spells(player_type *player_ptr)
125 {
126     for (int i = 0; i < MAX_SPELLS; i++)
127         rd_s32b(&player_ptr->magic_num1[i]);
128
129     for (int i = 0; i < MAX_SPELLS; i++)
130         rd_byte(&player_ptr->magic_num2[i]);
131
132     if (h_older_than(1, 3, 0, 1))
133         set_spells_old(player_ptr);
134 }
135
136 void rd_skills(player_type *player_ptr)
137 {
138     if (h_older_than(0, 4, 1))
139         set_zangband_skill(player_ptr);
140
141     if (h_older_than(0, 3, 14))
142         set_zangband_spells(player_ptr);
143     else
144         set_spells(player_ptr);
145
146     if (music_singing_any(player_ptr))
147         player_ptr->action = ACTION_SING;
148 }
149
150 static void set_race(player_type *player_ptr)
151 {
152     byte tmp8u;
153     rd_byte(&tmp8u);
154     player_ptr->start_race = (player_race_type)tmp8u;
155     int32_t tmp32s;
156     rd_s32b(&tmp32s);
157     player_ptr->old_race1 = (BIT_FLAGS)tmp32s;
158     rd_s32b(&tmp32s);
159     player_ptr->old_race2 = (BIT_FLAGS)tmp32s;
160     rd_s16b(&player_ptr->old_realm);
161 }
162
163 void rd_race(player_type *player_ptr)
164 {
165     if (h_older_than(1, 0, 7)) {
166         set_zangband_race(player_ptr);
167         return;
168     }
169
170     set_race(player_ptr);
171 }
172
173 void rd_bounty_uniques(player_type *player_ptr)
174 {
175     if (h_older_than(0, 0, 3)) {
176         set_zangband_bounty_uniques(player_ptr);
177         return;
178     }
179
180     for (int i = 0; i < MAX_BOUNTY; i++)
181         rd_s16b(&w_ptr->bounty_r_idx[i]);
182 }
183
184 /*!
185  * @brief 腕力などの基本ステータス情報を読み込む
186  * @param player_ptr プレイヤーへの参照ポインタ
187  */
188 static void rd_base_status(player_type *player_ptr)
189 {
190     for (int i = 0; i < A_MAX; i++)
191         rd_s16b(&player_ptr->stat_max[i]);
192
193     for (int i = 0; i < A_MAX; i++)
194         rd_s16b(&player_ptr->stat_max_max[i]);
195
196     for (int i = 0; i < A_MAX; i++)
197         rd_s16b(&player_ptr->stat_cur[i]);
198 }
199
200 static void set_imitation(player_type *player_ptr)
201 {
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;
206         }
207
208         player_ptr->mane_num = 0;
209         return;
210     }
211
212     if (h_older_than(0, 2, 3)) {
213         int16_t tmp16s;
214         const int OLD_MAX_MANE = 22;
215         for (int i = 0; i < OLD_MAX_MANE; i++) {
216             rd_s16b(&tmp16s);
217             rd_s16b(&tmp16s);
218         }
219
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;
223         }
224
225         rd_s16b(&tmp16s);
226         player_ptr->mane_num = 0;
227         return;
228     }
229
230     for (int i = 0; i < MAX_MANE; i++) {
231         int16_t tmp16s;
232         rd_s16b(&tmp16s);
233         player_ptr->mane_spell[i] = i2enum<RF_ABILITY>(tmp16s);
234         rd_s16b(&tmp16s);
235         player_ptr->mane_dam[i] = (SPELL_IDX)tmp16s;
236     }
237
238     rd_s16b(&player_ptr->mane_num);
239 }
240
241 static void rd_phase_out(player_type *player_ptr)
242 {
243     int16_t tmp16s;
244     rd_s16b(&tmp16s);
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;
249     else {
250         rd_s16b(&tmp16s);
251         player_ptr->phase_out = (bool)tmp16s;
252     }
253 }
254
255 static void rd_arena(player_type *player_ptr)
256 {
257     if (h_older_than(0, 0, 3))
258         update_gambling_monsters(player_ptr);
259     else
260         set_gambling_monsters();
261
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;
267
268     rd_phase_out(player_ptr);
269     byte tmp8u;
270     rd_byte(&player_ptr->exit_bldg);
271     rd_byte(&tmp8u);
272
273     int16_t tmp16s;
274     rd_s16b(&tmp16s);
275     player_ptr->oldpx = (POSITION)tmp16s;
276     rd_s16b(&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;
281     }
282 }
283
284 /*!
285  * @brief プレイヤーの最大HP/現在HPを読み込む
286  * @param player_ptr プレイヤーへの参照ポインタ
287  */
288 static void rd_hp(player_type *player_ptr)
289 {
290     if (h_older_than(1, 7, 0, 3)) {
291         set_hp_old(player_ptr);
292         return;
293     }
294
295     rd_s32b(&player_ptr->mhp);
296     rd_s32b(&player_ptr->chp);
297     rd_u32b(&player_ptr->chp_frac);
298 }
299
300 /*!
301  * @brief プレイヤーの最大MP/現在MPを読み込む
302  * @param player_ptr プレイヤーへの参照ポインタ
303  */
304 static void rd_mana(player_type *player_ptr)
305 {
306     if (h_older_than(1, 7, 0, 3)) {
307         set_mana_old(player_ptr);
308         return;
309     }
310
311     rd_s32b(&player_ptr->msp);
312     rd_s32b(&player_ptr->csp);
313     rd_u32b(&player_ptr->csp_frac);
314 }
315
316 /*!
317  * @brief プレイヤーのバッドステータス (と空腹)を読み込む
318  * @param player_ptr プレイヤーへの参照ポインタ
319  */
320 static void rd_bad_status(player_type *player_ptr)
321 {
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" */
328 }
329
330 static void rd_energy(player_type *player_ptr)
331 {
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;
335
336     if (h_older_than(2, 1, 2, 0))
337         player_ptr->enchant_energy_need = 0;
338     else
339         rd_s16b(&player_ptr->enchant_energy_need);
340 }
341
342 /*!
343  * @brief プレイヤーのグッド/バッドステータスを読み込む
344  * @param player_ptr プレイヤーへの参照ポインタ
345  * @todo 明らかに関数名がビッグワードだが他に思いつかなかった
346  */
347 static void rd_status(player_type *player_ptr)
348 {
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();
354     rd_s16b(&tmp16s);
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;
361     else
362         rd_s16b(&player_ptr->ult_res);
363 }
364
365 static void rd_tsuyoshi(player_type *player_ptr)
366 {
367     if (h_older_than(0, 0, 2))
368         player_ptr->tsuyoshi = 0;
369     else
370         rd_s16b(&player_ptr->tsuyoshi);
371 }
372
373 static void set_timed_effects(player_type *player_ptr)
374 {
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;
387     else
388         rd_s16b(&player_ptr->magicdef);
389
390     rd_s16b(&player_ptr->tim_res_nether);
391     if (h_older_than(0, 4, 11))
392         set_zangband_mimic(player_ptr);
393     else {
394         rd_s16b(&player_ptr->tim_res_time);
395
396         byte tmp8u;
397         rd_byte(&tmp8u);
398         player_ptr->mimic_form = (IDX)tmp8u;
399         rd_s16b(&player_ptr->tim_mimic);
400         rd_s16b(&player_ptr->tim_sh_fire);
401     }
402
403     if (h_older_than(1, 0, 99))
404         set_zangband_holy_aura(player_ptr);
405     else {
406         rd_s16b(&player_ptr->tim_sh_holy);
407         rd_s16b(&player_ptr->tim_eyeeye);
408     }
409
410     if (h_older_than(1, 0, 3))
411         set_zangband_reflection(player_ptr);
412     else {
413         rd_s16b(&player_ptr->tim_reflect);
414         rd_s16b(&player_ptr->multishadow);
415         rd_s16b(&player_ptr->dustrobe);
416     }
417 }
418
419 static void set_mutations(player_type *player_ptr)
420 {
421     if (loading_savefile_version_is_older_than(2)) {
422         for (int i = 0; i < 3; i++) {
423             uint32_t tmp32u;
424             rd_u32b(&tmp32u);
425             migrate_bitflag_to_flaggroup(player_ptr->muta, tmp32u, i * 32);
426         }
427     } else {
428         rd_FlagGroup(player_ptr->muta, rd_byte);
429     }
430 }
431
432 static void set_virtues(player_type *player_ptr)
433 {
434     for (int i = 0; i < 8; i++)
435         rd_s16b(&player_ptr->virtues[i]);
436
437     for (int i = 0; i < 8; i++)
438         rd_s16b(&player_ptr->vir_types[i]);
439 }
440
441 /*!
442  * @brief 各種時限効果を読み込む
443  * @param player_ptr プレイヤーへの参照ポインタ
444  */
445 static void rd_timed_effects(player_type *player_ptr)
446 {
447     set_timed_effects(player_ptr);
448     rd_s16b(&player_ptr->chaos_patron);
449     set_mutations(player_ptr);
450     set_virtues(player_ptr);
451 }
452
453 static void rd_player_status(player_type *player_ptr)
454 {
455     rd_base_status(player_ptr);
456     strip_bytes(24);
457     rd_s32b(&player_ptr->au);
458     rd_experience(player_ptr);
459     rd_skills(player_ptr);
460     rd_race(player_ptr);
461     set_imitation(player_ptr);
462     rd_bounty_uniques(player_ptr);
463     rd_arena(player_ptr);
464     rd_dummy1();
465     rd_hp(player_ptr);
466     rd_mana(player_ptr);
467     rd_s16b(&player_ptr->max_plv);
468     rd_dungeons(player_ptr);
469     strip_bytes(8);
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);
492 }
493
494 void rd_player_info(player_type *player_ptr)
495 {
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);
503 }