Skip to content

Commit ceddd4a

Browse files
author
fdelapena
authored
Merge pull request #452 from Ghabry/encoding
Add "codepage" field to easyrpg_data
2 parents 76bd2f6 + b12256c commit ceddd4a

8 files changed

Lines changed: 54 additions & 9 deletions

File tree

generator/csv/fields_easyrpg.csv

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
Structure,Field,Size Field?,Type,Index,Default Value,PersistIfDefault,Is2k3,Comment
22
Save,easyrpg_data,f,SaveEasyRpgData,0xC8,,0,0,Additional save data written by EasyRPG Player
33
SaveEasyRpgData,version,,Int32,0x01,0,0,0,Savegame version
4-
SaveEasyRpgData,windows,,Array<SaveEasyRpgWindow>,0x02,,0,0,User generated windows e.g. through ShowStringPicture
4+
SaveEasyRpgData,codepage,,Int32,0x02,0,0,0,Codepage used to store text in the savegame data
5+
SaveEasyRpgData,windows,,Array<SaveEasyRpgWindow>,0x64,,0,0,User generated windows e.g. through ShowStringPicture
56
SaveEventExecFrame,maniac_event_info,f,Ref<ManiacEventInfo>,0x0E,0,0,0,Event info bitfield
67
SaveEventExecFrame,maniac_event_id,f,Int32,0x0F,0,0,0,Event ID
78
SaveEventExecFrame,maniac_event_page_id,f,Int32,0x10,0,0,0,Page ID when it is a map event

src/encoder.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ static std::string filterUtf8Compatible(std::string enc) {
4141
return "";
4242
}
4343
#endif
44+
45+
if (enc == "utf-8" || enc == "UTF-8" || enc == "65001") {
46+
return "";
47+
}
48+
4449
return enc;
4550
}
4651

@@ -76,6 +81,7 @@ void Encoder::Init() {
7681
if (_encoding.empty()) {
7782
return;
7883
}
84+
7985
#if LCF_SUPPORT_ICU
8086
auto code_page = atoi(_encoding.c_str());
8187
const auto& storage_encoding = code_page > 0

src/generated/lcf/lsd/chunks.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -988,8 +988,10 @@ namespace LSD_Reader {
988988
enum Index {
989989
/** Savegame version */
990990
version = 0x01,
991+
/** Codepage used to store text in the savegame data */
992+
codepage = 0x02,
991993
/** User generated windows e.g. through ShowStringPicture */
992-
windows = 0x02
994+
windows = 0x64
993995
};
994996
};
995997
struct ChunkSaveEasyRpgWindow {

src/generated/lcf/rpg/saveeasyrpgdata.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@ namespace rpg {
2828
class SaveEasyRpgData {
2929
public:
3030
int32_t version = 0;
31+
int32_t codepage = 0;
3132
std::vector<SaveEasyRpgWindow> windows;
3233
};
3334

3435
inline bool operator==(const SaveEasyRpgData& l, const SaveEasyRpgData& r) {
3536
return l.version == r.version
37+
&& l.codepage == r.codepage
3638
&& l.windows == r.windows;
3739
}
3840

@@ -45,8 +47,8 @@ namespace rpg {
4547
template <typename F, typename ParentCtx = Context<void,void>>
4648
void ForEachString(SaveEasyRpgData& obj, const F& f, const ParentCtx* parent_ctx = nullptr) {
4749
for (int i = 0; i < static_cast<int>(obj.windows.size()); ++i) {
48-
const auto ctx2 = Context<SaveEasyRpgData, ParentCtx>{ "windows", i, &obj, parent_ctx };
49-
ForEachString(obj.windows[i], f, &ctx2);
50+
const auto ctx3 = Context<SaveEasyRpgData, ParentCtx>{ "windows", i, &obj, parent_ctx };
51+
ForEachString(obj.windows[i], f, &ctx3);
5052
}
5153
(void)obj;
5254
(void)f;

src/generated/lsd_saveeasyrpgdata.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ static TypedField<rpg::SaveEasyRpgData, int32_t> static_version(
2727
0,
2828
0
2929
);
30+
static TypedField<rpg::SaveEasyRpgData, int32_t> static_codepage(
31+
&rpg::SaveEasyRpgData::codepage,
32+
LSD_Reader::ChunkSaveEasyRpgData::codepage,
33+
"codepage",
34+
0,
35+
0
36+
);
3037
static TypedField<rpg::SaveEasyRpgData, std::vector<rpg::SaveEasyRpgWindow>> static_windows(
3138
&rpg::SaveEasyRpgData::windows,
3239
LSD_Reader::ChunkSaveEasyRpgData::windows,
@@ -39,6 +46,7 @@ static TypedField<rpg::SaveEasyRpgData, std::vector<rpg::SaveEasyRpgWindow>> sta
3946
template <>
4047
Field<rpg::SaveEasyRpgData> const* Struct<rpg::SaveEasyRpgData>::fields[] = {
4148
&static_version,
49+
&static_codepage,
4250
&static_windows,
4351
NULL
4452
};

src/generated/rpg_saveeasyrpgdata.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ namespace rpg {
1818
std::ostream& operator<<(std::ostream& os, const SaveEasyRpgData& obj) {
1919
os << "SaveEasyRpgData{";
2020
os << "version="<< obj.version;
21+
os << ", codepage="<< obj.codepage;
2122
os << ", windows=";
2223
for (size_t i = 0; i < obj.windows.size(); ++i) {
2324
os << (i == 0 ? "[" : ", ") << obj.windows[i];

src/lcf/lsd/reader.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ namespace LSD_Reader {
4242
/**
4343
* Increment the save save_count and update the timestamp.
4444
*/
45-
void PrepareSave(rpg::Save& save, int32_t version = 0);
45+
void PrepareSave(rpg::Save& save, int32_t version = 0, int32_t codepage = 0);
4646

4747
/**
4848
* Loads Savegame.

src/lsd_reader.cpp

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4243
std::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

7879
std::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

98115
bool 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

Comments
 (0)