15 #include "lcf/lsd/reader.h"
16 #include "lcf/lsd/chunks.h"
17 #include "lcf/rpg/save.h"
18 #include "lcf/reader_util.h"
23 double LSD_Reader::ToTDateTime(std::time_t t) {
25 return(t / 86400.0 + 25569.0);
28 std::time_t LSD_Reader::ToUnixTimestamp(
double ms) {
29 return(std::time_t(ms * 86400.0 - 25569.0 * 86400.0 + 0.5));
32 double LSD_Reader::GenerateTimestamp(std::time_t t) {
33 return ToTDateTime(t);
36 void LSD_Reader::PrepareSave(rpg::Save& save, int32_t version) {
37 ++save.system.save_count;
38 save.title.timestamp = LSD_Reader::GenerateTimestamp();
39 save.easyrpg_data.version = version;
42 std::unique_ptr<rpg::Save> LSD_Reader::Load(StringView filename, StringView encoding) {
43 std::ifstream stream(ToString(filename), std::ios::binary);
44 if (!stream.is_open()) {
45 fprintf(stderr,
"Failed to open LSD file `%s' for reading : %s\n", ToString(filename).c_str(), strerror(errno));
48 return LSD_Reader::Load(stream, encoding);
51 bool LSD_Reader::Save(StringView filename,
const rpg::Save& save, EngineVersion engine, StringView encoding) {
52 std::ofstream stream(ToString(filename), std::ios::binary);
53 if (!stream.is_open()) {
54 fprintf(stderr,
"Failed to open LSD file `%s' for writing : %s\n", ToString(filename).c_str(), strerror(errno));
57 return LSD_Reader::Save(stream, save, engine, encoding);
60 bool LSD_Reader::SaveXml(StringView filename,
const rpg::Save& save, EngineVersion engine) {
61 std::ofstream stream(ToString(filename), std::ios::binary);
62 if (!stream.is_open()) {
63 fprintf(stderr,
"Failed to open LSD XML file `%s' for writing : %s\n", ToString(filename).c_str(), strerror(errno));
66 return LSD_Reader::SaveXml(stream, save, engine);
69 std::unique_ptr<rpg::Save> LSD_Reader::LoadXml(StringView filename) {
70 std::ifstream stream(ToString(filename), std::ios::binary);
71 if (!stream.is_open()) {
72 fprintf(stderr,
"Failed to open LSD XML file `%s' for reading : %s\n", ToString(filename).c_str(), strerror(errno));
75 return LSD_Reader::LoadXml(stream);
78 std::unique_ptr<rpg::Save> LSD_Reader::Load(std::istream& filestream, StringView encoding) {
79 LcfReader reader(filestream, ToString(encoding));
81 LcfReader::SetError(
"Couldn't parse save file.\n");
82 return std::unique_ptr<rpg::Save>();
85 reader.ReadString(header, reader.ReadInt());
86 if (header.length() != 11) {
87 LcfReader::SetError(
"This is not a valid RPG2000 save.\n");
88 return std::unique_ptr<rpg::Save>();
90 if (header !=
"LcfSaveData") {
91 fprintf(stderr,
"Warning: This header is not LcfSaveData and might not be a valid RPG2000 save.\n");
93 rpg::Save* save =
new rpg::Save();
95 return std::unique_ptr<rpg::Save>(save);
98 bool LSD_Reader::Save(std::ostream& filestream,
const rpg::Save& save, EngineVersion engine, StringView encoding) {
99 LcfWriter writer(filestream, engine, ToString(encoding));
100 if (!writer.IsOk()) {
101 LcfReader::SetError(
"Couldn't parse save file.\n");
104 const std::string header(
"LcfSaveData");
105 writer.WriteInt(header.size());
106 writer.Write(header);
112 bool LSD_Reader::SaveXml(std::ostream& filestream,
const rpg::Save& save, EngineVersion engine) {
113 XmlWriter writer(filestream, engine);
114 if (!writer.IsOk()) {
115 LcfReader::SetError(
"Couldn't parse save file.\n");
119 writer.BeginElement(
"LSD");
121 writer.EndElement(
"LSD");
125 std::unique_ptr<rpg::Save> LSD_Reader::LoadXml(std::istream& filestream) {
126 XmlReader reader(filestream);
127 if (!reader.IsOk()) {
128 LcfReader::SetError(
"Couldn't parse save file.\n");
129 return std::unique_ptr<rpg::Save>();
132 rpg::Save* save =
new rpg::Save();
133 reader.SetHandler(
new RootXmlHandler<rpg::Save>(*save,
"LSD"));
135 return std::unique_ptr<rpg::Save>(save);
static void WriteXml(const S &obj, XmlWriter &stream)
static void WriteLcf(const S &obj, LcfWriter &stream)
static void ReadLcf(S &obj, LcfReader &stream)