15#include "lcf/lmu/reader.h"
16#include "lcf/lmu/chunks.h"
17#include "lcf/reader_lcf.h"
18#include "lcf/reader_util.h"
23void LMU_Reader::PrepareSave(rpg::Map& map) {
27std::unique_ptr<rpg::Map> LMU_Reader::Load(StringView filename, StringView encoding) {
28 std::ifstream stream(ToString(filename), std::ios::binary);
29 if (!stream.is_open()) {
30 fprintf(stderr,
"Failed to open LMU file `%s' for reading : %s\n", ToString(filename).c_str(), strerror(errno));
33 return LMU_Reader::Load(stream, encoding);
36bool LMU_Reader::Save(StringView filename,
const rpg::Map& save, EngineVersion engine, StringView encoding, SaveOpt opt) {
37 std::ofstream stream(ToString(filename), std::ios::binary);
38 if (!stream.is_open()) {
39 fprintf(stderr,
"Failed to open LMU file `%s' for writing : %s\n", ToString(filename).c_str(), strerror(errno));
42 return LMU_Reader::Save(stream, save, engine, encoding, opt);
45bool LMU_Reader::SaveXml(StringView filename,
const rpg::Map& save, EngineVersion engine) {
46 std::ofstream stream(ToString(filename), std::ios::binary);
47 if (!stream.is_open()) {
48 fprintf(stderr,
"Failed to open LMU XML file `%s' for writing : %s\n", ToString(filename).c_str(), strerror(errno));
51 return LMU_Reader::SaveXml(stream, save, engine);
54std::unique_ptr<rpg::Map> LMU_Reader::LoadXml(StringView filename) {
55 std::ifstream stream(ToString(filename), std::ios::binary);
56 if (!stream.is_open()) {
57 fprintf(stderr,
"Failed to open LMU XML file `%s' for reading : %s\n", ToString(filename).c_str(), strerror(errno));
60 return LMU_Reader::LoadXml(stream);
63std::unique_ptr<rpg::Map> LMU_Reader::Load(std::istream& filestream, StringView encoding) {
64 LcfReader reader(filestream, ToString(encoding));
66 LcfReader::SetError(
"Couldn't parse map file.\n");
67 return std::unique_ptr<rpg::Map>();
70 reader.ReadString(header, reader.ReadInt());
71 if (header.length() != 10) {
72 LcfReader::SetError(
"This is not a valid RPG2000 map.\n");
73 return std::unique_ptr<rpg::Map>();
75 if (header !=
"LcfMapUnit") {
76 fprintf(stderr,
"Warning: This header is not LcfMapUnit and might not be a valid RPG2000 map.\n");
79 auto map = std::make_unique<rpg::Map>();
80 map->lmu_header = std::move(header);
85bool LMU_Reader::Save(std::ostream& filestream,
const rpg::Map& map, EngineVersion engine, StringView encoding, SaveOpt opt) {
86 LcfWriter writer(filestream, engine, ToString(encoding));
88 LcfReader::SetError(
"Couldn't parse map file.\n");
92 if ( map.lmu_header.empty() || !
bool(opt & SaveOpt::ePreserveHeader)) {
93 header =
"LcfMapUnit";
95 header= map.lmu_header;
97 writer.WriteInt(header.size());
104bool LMU_Reader::SaveXml(std::ostream& filestream,
const rpg::Map& map, EngineVersion engine) {
105 XmlWriter writer(filestream, engine);
106 if (!writer.IsOk()) {
107 LcfReader::SetError(
"Couldn't parse map file.\n");
110 writer.BeginElement(
"LMU");
112 writer.EndElement(
"LMU");
116std::unique_ptr<rpg::Map> LMU_Reader::LoadXml(std::istream& filestream) {
117 XmlReader reader(filestream);
118 if (!reader.IsOk()) {
119 LcfReader::SetError(
"Couldn't parse map file.\n");
120 return std::unique_ptr<rpg::Map>();
123 auto map = std::make_unique<rpg::Map>();
124 reader.SetHandler(
new RootXmlHandler<rpg::Map>(*map,
"LMU"));
static void WriteXml(const S &obj, XmlWriter &stream)
static void WriteLcf(const S &obj, LcfWriter &stream)
static void ReadLcf(S &obj, LcfReader &stream)