OSDN Git Service

Merge branch 'master' of https://github.com/hengband/hengband
[hengbandforosx/hengbandosx.git] / src / save / player-class-specific-data-writer.cpp
1 #include "save/player-class-specific-data-writer.h"
2 #include "player-info/bard-data-type.h"
3 #include "player-info/bluemage-data-type.h"
4 #include "player-info/force-trainer-data-type.h"
5 #include "player-info/magic-eater-data-type.h"
6 #include "player-info/mane-data-type.h"
7 #include "player-info/monk-data-type.h"
8 #include "player-info/ninja-data-type.h"
9 #include "player-info/samurai-data-type.h"
10 #include "player-info/smith-data-type.h"
11 #include "player-info/sniper-data-type.h"
12 #include "player-info/spell-hex-data-type.h"
13 #include "save/save-util.h"
14 #include "util/enum-converter.h"
15
16 void PlayerClassSpecificDataWriter::operator()(const std::shared_ptr<smith_data_type> &smith_data) const
17 {
18     for (auto [essence, amount] : smith_data->essences) {
19         if (amount > 0) {
20             wr_s16b(enum2i(essence));
21             wr_s16b(amount);
22         }
23     }
24     wr_s16b(-1);
25     wr_s16b(-1);
26 }
27
28 void PlayerClassSpecificDataWriter::operator()(const std::shared_ptr<force_trainer_data_type> &force_trainer_data) const
29 {
30     wr_s32b(force_trainer_data->ki);
31 }
32
33 void PlayerClassSpecificDataWriter::operator()(const std::shared_ptr<bluemage_data_type> &bluemage_data) const
34 {
35     wr_FlagGroup(bluemage_data->learnt_blue_magics, wr_byte);
36 }
37
38 void PlayerClassSpecificDataWriter::operator()(const std::shared_ptr<magic_eater_data_type> &magic_eater_data) const
39 {
40     auto write_item_group = [](const auto &item_group) {
41         wr_u16b(static_cast<uint16_t>(item_group.size()));
42         for (const auto &item : item_group) {
43             wr_s32b(item.charge);
44             wr_byte(item.count);
45         }
46     };
47     write_item_group(magic_eater_data->staves);
48     write_item_group(magic_eater_data->wands);
49     write_item_group(magic_eater_data->rods);
50 }
51
52 void PlayerClassSpecificDataWriter::operator()(const std::shared_ptr<bard_data_type> &bird_data) const
53 {
54     wr_s32b(enum2i(bird_data->singing_song));
55     wr_s32b(enum2i(bird_data->interrputing_song));
56     wr_s32b(bird_data->singing_duration);
57     wr_byte(bird_data->singing_song_spell_idx);
58 }
59
60 void PlayerClassSpecificDataWriter::operator()(const std::shared_ptr<mane_data_type> &mane_data) const
61 {
62     wr_s16b(static_cast<int16_t>(mane_data->mane_list.size()));
63
64     for (const auto &mane : mane_data->mane_list) {
65         wr_s16b(static_cast<int16_t>(mane.spell));
66         wr_s16b(static_cast<int16_t>(mane.damage));
67     }
68 }
69
70 void PlayerClassSpecificDataWriter::operator()(const std::shared_ptr<sniper_data_type> &sniper_data) const
71 {
72     wr_s16b(sniper_data->concent);
73 }
74
75 void PlayerClassSpecificDataWriter::operator()(const std::shared_ptr<samurai_data_type> &samurai_data) const
76 {
77     wr_byte(enum2i(samurai_data->stance));
78 }
79
80 void PlayerClassSpecificDataWriter::operator()(const std::shared_ptr<monk_data_type> &monk_data) const
81 {
82     wr_byte(enum2i(monk_data->stance));
83 }
84
85 void PlayerClassSpecificDataWriter::operator()(const std::shared_ptr<ninja_data_type> &ninja_data) const
86 {
87     wr_byte(ninja_data->kawarimi ? 1 : 0);
88     wr_byte(ninja_data->s_stealth ? 1 : 0);
89 }
90
91 void PlayerClassSpecificDataWriter::operator()(const std::shared_ptr<spell_hex_data_type> &spell_hex_data) const
92 {
93     wr_FlagGroup(spell_hex_data->casting_spells, wr_byte);
94     wr_s32b(spell_hex_data->revenge_power);
95     wr_byte(enum2i(spell_hex_data->revenge_type));
96     wr_byte(spell_hex_data->revenge_turn);
97 }