14 #include "lcf/lmt/reader.h"
15 #include "lcf/lmt/chunks.h"
16 #include "lcf/reader_util.h"
21 std::unique_ptr<lcf::rpg::TreeMap> LMT_Reader::Load(StringView filename, StringView encoding) {
22 std::ifstream stream(ToString(filename), std::ios::binary);
23 if (!stream.is_open()) {
24 fprintf(stderr,
"Failed to open LMT file `%s' for reading : %s\n", ToString(filename).c_str(), strerror(errno));
27 return LMT_Reader::Load(stream, encoding);
30 bool LMT_Reader::Save(StringView filename,
const lcf::rpg::TreeMap& tmap, EngineVersion engine, StringView encoding, SaveOpt opt) {
31 std::ofstream stream(ToString(filename), std::ios::binary);
32 if (!stream.is_open()) {
33 fprintf(stderr,
"Failed to open LMT file `%s' for writing : %s\n", ToString(filename).c_str(), strerror(errno));
36 return LMT_Reader::Save(stream, tmap, engine, encoding, opt);
39 bool LMT_Reader::SaveXml(StringView filename,
const lcf::rpg::TreeMap& tmap, EngineVersion engine) {
40 std::ofstream stream(ToString(filename), std::ios::binary);
41 if (!stream.is_open()) {
42 fprintf(stderr,
"Failed to open LMT XML file `%s' for writing : %s\n", ToString(filename).c_str(), strerror(errno));
45 return LMT_Reader::SaveXml(stream, tmap, engine);
48 std::unique_ptr<lcf::rpg::TreeMap> LMT_Reader::LoadXml(StringView filename) {
49 std::ifstream stream(ToString(filename), std::ios::binary);
50 if (!stream.is_open()) {
51 fprintf(stderr,
"Failed to open LMT XML file `%s' for reading : %s\n", ToString(filename).c_str(), strerror(errno));
54 return LMT_Reader::LoadXml(stream);
57 std::unique_ptr<lcf::rpg::TreeMap> LMT_Reader::Load(std::istream& filestream, StringView encoding) {
58 LcfReader reader(filestream, ToString(encoding));
60 LcfReader::SetError(
"Couldn't parse map tree file.\n");
64 reader.ReadString(header, reader.ReadInt());
65 if (header.length() != 10) {
66 LcfReader::SetError(
"This is not a valid RPG2000 map tree.\n");
69 if (header !=
"LcfMapTree") {
70 fprintf(stderr,
"Warning: This header is not LcfMapTree and might not be a valid RPG2000 map tree.\n");
72 auto tmap = std::make_unique<lcf::rpg::TreeMap>();
73 tmap->lmt_header = std::move(header);
74 TypeReader<rpg::TreeMap>::ReadLcf(*tmap, reader, 0);
78 bool LMT_Reader::Save(std::ostream& filestream,
const lcf::rpg::TreeMap& tmap, EngineVersion engine, StringView encoding, SaveOpt opt) {
79 LcfWriter writer(filestream, engine, ToString(encoding));
81 LcfReader::SetError(
"Couldn't parse map tree file.\n");
85 if ( tmap.lmt_header.empty() || !
bool(opt & SaveOpt::ePreserveHeader)) {
86 header =
"LcfMapTree";
88 header= tmap.lmt_header;
90 writer.WriteInt(header.size());
92 TypeReader<rpg::TreeMap>::WriteLcf(tmap, writer);
96 bool LMT_Reader::SaveXml(std::ostream& filestream,
const lcf::rpg::TreeMap& tmap, EngineVersion engine) {
97 XmlWriter writer(filestream, engine);
99 LcfReader::SetError(
"Couldn't parse map tree file.\n");
102 writer.BeginElement(
"LMT");
103 TypeReader<rpg::TreeMap>::WriteXml(tmap, writer);
104 writer.EndElement(
"LMT");
108 std::unique_ptr<lcf::rpg::TreeMap> LMT_Reader::LoadXml(std::istream& filestream) {
109 XmlReader reader(filestream);
110 if (!reader.IsOk()) {
111 LcfReader::SetError(
"Couldn't parse map tree file.\n");
114 auto tmap = std::make_unique<lcf::rpg::TreeMap>();
115 reader.SetHandler(
new RootXmlHandler<rpg::TreeMap>(*tmap,
"LMT"));