14#include "lcf/lmt/reader.h"
15#include "lcf/lmt/chunks.h"
16#include "lcf/reader_util.h"
22std::unique_ptr<lcf::rpg::TreeMap> LMT_Reader::Load(std::string_view filename, std::string_view encoding) {
23 std::ifstream stream(ToString(filename), std::ios::binary);
24 if (!stream.is_open()) {
25 Log::Error(
"Failed to open LMT file '%s' for reading: %s", ToString(filename).c_str(), strerror(errno));
28 return LMT_Reader::Load(stream, encoding);
31bool LMT_Reader::Save(std::string_view filename,
const lcf::rpg::TreeMap& tmap, EngineVersion engine, std::string_view encoding, SaveOpt opt) {
32 std::ofstream stream(ToString(filename), std::ios::binary);
33 if (!stream.is_open()) {
34 Log::Error(
"Failed to open LMT file '%s' for writing: %s", ToString(filename).c_str(), strerror(errno));
37 return LMT_Reader::Save(stream, tmap, engine, encoding, opt);
40bool LMT_Reader::SaveXml(std::string_view filename,
const lcf::rpg::TreeMap& tmap, EngineVersion engine) {
41 std::ofstream stream(ToString(filename), std::ios::binary);
42 if (!stream.is_open()) {
43 Log::Error(
"Failed to open LMT XML file '%s' for writing: %s", ToString(filename).c_str(), strerror(errno));
46 return LMT_Reader::SaveXml(stream, tmap, engine);
49std::unique_ptr<lcf::rpg::TreeMap> LMT_Reader::LoadXml(std::string_view filename) {
50 std::ifstream stream(ToString(filename), std::ios::binary);
51 if (!stream.is_open()) {
52 Log::Error(
"Failed to open LMT XML file '%s' for reading: %s", ToString(filename).c_str(), strerror(errno));
55 return LMT_Reader::LoadXml(stream);
58std::unique_ptr<lcf::rpg::TreeMap> LMT_Reader::Load(std::istream& filestream, std::string_view encoding) {
59 LcfReader reader(filestream, ToString(encoding));
61 LcfReader::SetError(
"Couldn't parse map tree file.");
65 reader.ReadString(header, reader.ReadInt());
66 if (header.length() != 10) {
67 LcfReader::SetError(
"This is not a valid RPG2000 map tree.");
70 if (header !=
"LcfMapTree") {
71 Log::Warning(
"Header %s != LcfMapTree and might not be a valid RPG2000 map tree.", header.c_str());
73 auto tmap = std::make_unique<lcf::rpg::TreeMap>();
74 tmap->lmt_header = std::move(header);
75 TypeReader<rpg::TreeMap>::ReadLcf(*tmap, reader, 0);
79bool LMT_Reader::Save(std::ostream& filestream,
const lcf::rpg::TreeMap& tmap, EngineVersion engine, std::string_view encoding, SaveOpt opt) {
80 LcfWriter writer(filestream, engine, ToString(encoding));
82 LcfReader::SetError(
"Couldn't parse map tree file.");
86 if ( tmap.lmt_header.empty() || !
bool(opt & SaveOpt::ePreserveHeader)) {
87 header =
"LcfMapTree";
89 header= tmap.lmt_header;
91 writer.WriteInt(header.size());
93 TypeReader<rpg::TreeMap>::WriteLcf(tmap, writer);
97bool LMT_Reader::SaveXml(std::ostream& filestream,
const lcf::rpg::TreeMap& tmap, EngineVersion engine) {
98 XmlWriter writer(filestream, engine);
100 LcfReader::SetError(
"Couldn't parse map tree file.");
103 writer.BeginElement(
"LMT");
104 TypeReader<rpg::TreeMap>::WriteXml(tmap, writer);
105 writer.EndElement(
"LMT");
109std::unique_ptr<lcf::rpg::TreeMap> LMT_Reader::LoadXml(std::istream& filestream) {
110 XmlReader reader(filestream);
111 if (!reader.IsOk()) {
112 LcfReader::SetError(
"Couldn't parse map tree file.");
115 auto tmap = std::make_unique<lcf::rpg::TreeMap>();
116 reader.SetHandler(
new RootXmlHandler<rpg::TreeMap>(*tmap,
"LMT"));
void Warning(const char *fmt,...) LIKE_PRINTF
void Error(const char *fmt,...) LIKE_PRINTF