@@ -33,10 +33,11 @@ double LSD_Reader::GenerateTimestamp(std::time_t t) {
3333 return ToTDateTime (t);
3434}
3535
36- void LSD_Reader::PrepareSave (rpg::Save& save, int32_t version) {
36+ void LSD_Reader::PrepareSave (rpg::Save& save, int32_t version, int32_t codepage ) {
3737 ++save.system .save_count ;
3838 save.title .timestamp = LSD_Reader::GenerateTimestamp ();
3939 save.easyrpg_data .version = version;
40+ save.easyrpg_data .codepage = codepage;
4041}
4142
4243std::unique_ptr<rpg::Save> LSD_Reader::Load (StringView filename, StringView encoding) {
@@ -77,6 +78,7 @@ std::unique_ptr<rpg::Save> LSD_Reader::LoadXml(StringView filename) {
7778
7879std::unique_ptr<rpg::Save> LSD_Reader::Load (std::istream& filestream, StringView encoding) {
7980 LcfReader reader (filestream, ToString (encoding));
81+
8082 if (!reader.IsOk ()) {
8183 LcfReader::SetError (" Couldn't parse save file.\n " );
8284 return std::unique_ptr<rpg::Save>();
@@ -90,13 +92,36 @@ std::unique_ptr<rpg::Save> LSD_Reader::Load(std::istream& filestream, StringView
9092 if (header != " LcfSaveData" ) {
9193 fprintf (stderr, " Warning: This header is not LcfSaveData and might not be a valid RPG2000 save.\n " );
9294 }
93- rpg::Save* save = new rpg::Save ();
95+
96+ auto pos = reader.Tell ();
97+
98+ std::unique_ptr<rpg::Save> save (new rpg::Save ());
9499 Struct<rpg::Save>::ReadLcf (*save, reader);
95- return std::unique_ptr<rpg::Save>(save);
100+
101+ if (save->easyrpg_data .codepage > 0 ) {
102+ filestream.clear ();
103+ filestream.seekg (pos, std::ios_base::beg);
104+ LcfReader reader2 (filestream, std::to_string (save->easyrpg_data .codepage ));
105+ if (!reader2.IsOk ()) {
106+ LcfReader::SetError (" Couldn't parse save file.\n " );
107+ return std::unique_ptr<rpg::Save>();
108+ }
109+ Struct<rpg::Save>::ReadLcf (*save, reader2);
110+ }
111+
112+ return save;
96113}
97114
98115bool LSD_Reader::Save (std::ostream& filestream, const rpg::Save& save, EngineVersion engine, StringView encoding) {
99- LcfWriter writer (filestream, engine, ToString (encoding));
116+ std::string enc;
117+
118+ if (save.easyrpg_data .codepage > 0 ) {
119+ enc = std::to_string (save.easyrpg_data .codepage );
120+ } else {
121+ enc = ToString (encoding);
122+ }
123+
124+ LcfWriter writer (filestream, engine, enc);
100125 if (!writer.IsOk ()) {
101126 LcfReader::SetError (" Couldn't parse save file.\n " );
102127 return false ;
0 commit comments