Skip to content

Commit

Permalink
LMT and LMU support SaveOpt::ePreserveHeader
Browse files Browse the repository at this point in the history
  • Loading branch information
fmatthew5876 committed Oct 11, 2018
1 parent e300f8b commit c90f0c1
Show file tree
Hide file tree
Showing 11 changed files with 65 additions and 26 deletions.
1 change: 1 addition & 0 deletions Makefile.am
Expand Up @@ -116,6 +116,7 @@ pkginclude_HEADERS = \
src/ini.h \
src/inireader.h \
src/lcf_options.h \
src/lcf_saveopt.h \
src/ldb_reader.h \
src/lmt_reader.h \
src/lmu_reader.h \
Expand Down
3 changes: 2 additions & 1 deletion builds/vs2015/liblcf.vcxproj
Expand Up @@ -273,6 +273,7 @@
<ClInclude Include="..\..\src\lmt_reader.h" />
<ClInclude Include="..\..\src\lmu_reader.h" />
<ClInclude Include="..\..\src\lsd_reader.h" />
<ClInclude Include="..\..\src\lcf_saveopt.h" />
<ClInclude Include="..\..\src\reader_lcf.h" />
<ClInclude Include="..\..\src\reader_struct.h" />
<ClInclude Include="..\..\src\reader_util.h" />
Expand Down Expand Up @@ -354,4 +355,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>
6 changes: 6 additions & 0 deletions generator/templates/rpg_header.tmpl
Expand Up @@ -19,6 +19,12 @@ namespace RPG {
{%- if struct_name == "Database" %}
std::string ldb_header;
{%- endif %}
{%- if struct_name == "TreeMap" %}
std::string lmt_header;
{%- endif %}
{%- if struct_name == "Map" %}
std::string lmu_header;
{%- endif %}
{%- if struct_name in enums %}
{%- for name, enum in enums[struct_name].items() %}
{%- if name == "Code" %}
Expand Down
1 change: 1 addition & 0 deletions src/generated/rpg_map.h
Expand Up @@ -25,6 +25,7 @@
namespace RPG {
class Map {
public:
std::string lmu_header;
enum ScrollType {
ScrollType_none = 0,
ScrollType_vertical = 1,
Expand Down
1 change: 1 addition & 0 deletions src/generated/rpg_treemap.h
Expand Up @@ -24,6 +24,7 @@
namespace RPG {
class TreeMap {
public:
std::string lmt_header;
enum MapType {
MapType_root = 0,
MapType_map = 1,
Expand Down
27 changes: 27 additions & 0 deletions src/lcf_saveopt.h
@@ -0,0 +1,27 @@
/*
* This file is part of liblcf. Copyright (c) 2017 liblcf authors.
* https://github.com/EasyRPG/liblcf - https://easyrpg.org
*
* liblcf is Free/Libre Open Source Software, released under the MIT License.
* For the full copyright and license information, please view the COPYING
* file that was distributed with this source code.
*/

#ifndef LCF_SAVEOPT_H
#define LCF_SAVEOPT_H

/**
* Options to configure how LDB file is saved
*/
enum class SaveOpt {
eNone = 0,
ePreserveHeader = 1
};

constexpr SaveOpt operator|(SaveOpt l, SaveOpt r) { return SaveOpt(int(l) | int(r)); }
constexpr SaveOpt operator&(SaveOpt l, SaveOpt r) { return SaveOpt(int(l) & int(r)); }
constexpr SaveOpt operator^(SaveOpt l, SaveOpt r) { return SaveOpt(int(l) ^ int(r)); }
constexpr SaveOpt operator~(SaveOpt l) { return SaveOpt(~int(l)); }

#endif

14 changes: 1 addition & 13 deletions src/ldb_reader.h
Expand Up @@ -35,24 +35,12 @@
#include "rpg_parameters.h"
#include "rpg_equipment.h"
#include "rpg_database.h"
#include "lcf_saveopt.h"

/**
* LDB Reader namespace.
*/
namespace LDB_Reader {
/**
* Options to configure how LDB file is saved
*/
enum class SaveOpt {
eNone = 0,
ePreserveHeader = 1
};

constexpr SaveOpt operator|(SaveOpt l, SaveOpt r) { return SaveOpt(int(l) | int(r)); }
constexpr SaveOpt operator&(SaveOpt l, SaveOpt r) { return SaveOpt(int(l) & int(r)); }
constexpr SaveOpt operator^(SaveOpt l, SaveOpt r) { return SaveOpt(int(l) ^ int(r)); }
constexpr SaveOpt operator~(SaveOpt l) { return SaveOpt(~int(l)); }

/**
* Loads Database.
*/
Expand Down
14 changes: 10 additions & 4 deletions src/lmt_reader.cpp
Expand Up @@ -26,13 +26,13 @@ bool LMT_Reader::Load(const std::string& filename, const std::string& encoding)
return LMT_Reader::Load(stream, encoding);
}

bool LMT_Reader::Save(const std::string& filename, const std::string& encoding) {
bool LMT_Reader::Save(const std::string& filename, const std::string& encoding, SaveOpt opt) {
std::ofstream stream(filename.c_str(), std::ios::binary);
if (!stream.is_open()) {
fprintf(stderr, "Failed to open LMT file `%s' for writing : %s", filename.c_str(), strerror(errno));
return false;
}
return LMT_Reader::Save(stream, encoding);
return LMT_Reader::Save(stream, encoding, opt);
}

bool LMT_Reader::SaveXml(const std::string& filename) {
Expand Down Expand Up @@ -68,17 +68,23 @@ bool LMT_Reader::Load(std::istream& filestream, const std::string &encoding) {
if (header != "LcfMapTree") {
fprintf(stderr, "Warning: This header is not LcfMapTree and might not be a valid RPG2000 map tree.\n");
}
Data::treemap.lmt_header = std::move(header);
TypeReader<RPG::TreeMap>::ReadLcf(Data::treemap, reader, 0);
return true;
}

bool LMT_Reader::Save(std::ostream& filestream, const std::string &encoding) {
bool LMT_Reader::Save(std::ostream& filestream, const std::string &encoding, SaveOpt opt) {
LcfWriter writer(filestream, encoding);
if (!writer.IsOk()) {
LcfReader::SetError("Couldn't parse map tree file.\n");
return false;
}
const std::string header("LcfMapTree");
std::string header;
if ( Data::treemap.lmt_header.empty() || !bool(opt & SaveOpt::ePreserveHeader)) {
header = "LcfMapTree";
} else {
header= Data::treemap.lmt_header;
}
writer.WriteInt(header.size());
writer.Write(header);
TypeReader<RPG::TreeMap>::WriteLcf(Data::treemap, writer);
Expand Down
5 changes: 3 additions & 2 deletions src/lmt_reader.h
Expand Up @@ -15,6 +15,7 @@
#include "writer_lcf.h"
#include "writer_xml.h"
#include "rpg_treemap.h"
#include "lcf_saveopt.h"

/**
* LMT Reader namespace.
Expand All @@ -29,7 +30,7 @@ namespace LMT_Reader {
/**
* Saves Map Tree.
*/
bool Save(const std::string& filename, const std::string &encoding);
bool Save(const std::string& filename, const std::string &encoding, SaveOpt opt = SaveOpt::eNone);

/**
* Saves Map Tree as XML.
Expand All @@ -49,7 +50,7 @@ namespace LMT_Reader {
/**
* Saves Map Tree.
*/
bool Save(std::ostream& filestream, const std::string &encoding);
bool Save(std::ostream& filestream, const std::string &encoding, SaveOpt opt = SaveOpt::eNone);

/**
* Saves Map Tree as XML.
Expand Down
14 changes: 10 additions & 4 deletions src/lmu_reader.cpp
Expand Up @@ -26,13 +26,13 @@ std::unique_ptr<RPG::Map> LMU_Reader::Load(const std::string& filename, const st
return LMU_Reader::Load(stream, encoding);
}

bool LMU_Reader::Save(const std::string& filename, const RPG::Map& save, const std::string& encoding) {
bool LMU_Reader::Save(const std::string& filename, const RPG::Map& save, const std::string& encoding, SaveOpt opt) {
std::ofstream stream(filename.c_str(), std::ios::binary);
if (!stream.is_open()) {
fprintf(stderr, "Failed to open LMU file `%s' for writing : %s", filename.c_str(), strerror(errno));
return false;
}
return LMU_Reader::Save(stream, save, encoding);
return LMU_Reader::Save(stream, save, encoding, opt);
}

bool LMU_Reader::SaveXml(const std::string& filename, const RPG::Map& save) {
Expand Down Expand Up @@ -70,17 +70,23 @@ std::unique_ptr<RPG::Map> LMU_Reader::Load(std::istream& filestream, const std::
}

auto map = std::unique_ptr<RPG::Map>(new RPG::Map());
map->lmu_header = std::move(header);
Struct<RPG::Map>::ReadLcf(*map, reader);
return map;
}

bool LMU_Reader::Save(std::ostream& filestream, const RPG::Map& map, const std::string& encoding) {
bool LMU_Reader::Save(std::ostream& filestream, const RPG::Map& map, const std::string& encoding, SaveOpt opt) {
LcfWriter writer(filestream, encoding);
if (!writer.IsOk()) {
LcfReader::SetError("Couldn't parse map file.\n");
return false;
}
const std::string header("LcfMapUnit");
std::string header;
if ( map.lmu_header.empty() || !bool(opt & SaveOpt::ePreserveHeader)) {
header = "LcfMapUnit";
} else {
header= map.lmu_header;
}
writer.WriteInt(header.size());
writer.Write(header);

Expand Down
5 changes: 3 additions & 2 deletions src/lmu_reader.h
Expand Up @@ -13,6 +13,7 @@
#include <string>
#include <memory>
#include "rpg_map.h"
#include "lcf_saveopt.h"

/**
* LMU Reader namespace.
Expand All @@ -27,7 +28,7 @@ namespace LMU_Reader {
/**
* Saves map.
*/
bool Save(const std::string& filename, const RPG::Map& map, const std::string& encoding);
bool Save(const std::string& filename, const RPG::Map& map, const std::string& encoding, SaveOpt opt = SaveOpt::eNone);

/**
* Saves map as XML.
Expand All @@ -47,7 +48,7 @@ namespace LMU_Reader {
/**
* Saves map.
*/
bool Save(std::ostream& filestream, const RPG::Map& map, const std::string& encoding);
bool Save(std::ostream& filestream, const RPG::Map& map, const std::string& encoding, SaveOpt opt = SaveOpt::eNone);

/**
* Saves map as XML.
Expand Down

0 comments on commit c90f0c1

Please sign in to comment.