15#include "lcf/lmu/reader.h"
16#include "lcf/lmu/chunks.h"
17#include "lcf/reader_lcf.h"
18#include "lcf/reader_util.h"
24void LMU_Reader::PrepareSave(rpg::Map& map) {
28std::unique_ptr<rpg::Map> LMU_Reader::Load(std::string_view filename, std::string_view encoding) {
29 std::ifstream stream(ToString(filename), std::ios::binary);
30 if (!stream.is_open()) {
31 Log::Error(
"Failed to open LMU file '%s' for reading: %s", ToString(filename).c_str(), strerror(errno));
34 return LMU_Reader::Load(stream, encoding);
37bool LMU_Reader::Save(std::string_view filename,
const rpg::Map& save, EngineVersion engine, std::string_view encoding, SaveOpt opt) {
38 std::ofstream stream(ToString(filename), std::ios::binary);
39 if (!stream.is_open()) {
40 Log::Error(
"Failed to open LMU file '%s' for writing: %s", ToString(filename).c_str(), strerror(errno));
43 return LMU_Reader::Save(stream, save, engine, encoding, opt);
46bool LMU_Reader::SaveXml(std::string_view filename,
const rpg::Map& save, EngineVersion engine) {
47 std::ofstream stream(ToString(filename), std::ios::binary);
48 if (!stream.is_open()) {
49 Log::Error(
"Failed to open LMU XML file '%s' for writing: %s", ToString(filename).c_str(), strerror(errno));
52 return LMU_Reader::SaveXml(stream, save, engine);
55std::unique_ptr<rpg::Map> LMU_Reader::LoadXml(std::string_view filename) {
56 std::ifstream stream(ToString(filename), std::ios::binary);
57 if (!stream.is_open()) {
58 Log::Error(
"Failed to open LMU XML file '%s' for reading: %s", ToString(filename).c_str(), strerror(errno));
61 return LMU_Reader::LoadXml(stream);
64std::unique_ptr<rpg::Map> LMU_Reader::Load(std::istream& filestream, std::string_view encoding) {
65 LcfReader reader(filestream, ToString(encoding));
67 LcfReader::SetError(
"Couldn't parse map file.");
71 reader.ReadString(header, reader.ReadInt());
72 if (header.length() != 10) {
73 LcfReader::SetError(
"This is not a valid RPG2000 map.");
76 if (header !=
"LcfMapUnit") {
77 Log::Warning(
"Header %s != LcfMapUnit and might not be a valid RPG2000 map.", header.c_str());
80 auto map = std::make_unique<rpg::Map>();
81 map->lmu_header = std::move(header);
86bool LMU_Reader::Save(std::ostream& filestream,
const rpg::Map& map, EngineVersion engine, std::string_view encoding, SaveOpt opt) {
87 LcfWriter writer(filestream, engine, ToString(encoding));
89 LcfReader::SetError(
"Couldn't parse map file.");
93 if ( map.lmu_header.empty() || !
bool(opt & SaveOpt::ePreserveHeader)) {
94 header =
"LcfMapUnit";
96 header= map.lmu_header;
98 writer.WriteInt(header.size());
105bool LMU_Reader::SaveXml(std::ostream& filestream,
const rpg::Map& map, EngineVersion engine) {
106 XmlWriter writer(filestream, engine);
107 if (!writer.IsOk()) {
108 LcfReader::SetError(
"Couldn't parse map file.");
111 writer.BeginElement(
"LMU");
113 writer.EndElement(
"LMU");
117std::unique_ptr<rpg::Map> LMU_Reader::LoadXml(std::istream& filestream) {
118 XmlReader reader(filestream);
119 if (!reader.IsOk()) {
120 LcfReader::SetError(
"Couldn't parse map file.");
124 auto map = std::make_unique<rpg::Map>();
static void WriteXml(const S &obj, XmlWriter &stream)
static void WriteLcf(const S &obj, LcfWriter &stream)
static void ReadLcf(S &obj, LcfReader &stream)
void Warning(const char *fmt,...) LIKE_PRINTF
void Error(const char *fmt,...) LIKE_PRINTF