14#include "lcf/ldb/reader.h"
15#include "lcf/lmt/reader.h"
16#include "lcf/lmu/reader.h"
17#include "lcf/lsd/reader.h"
19#include "lcf/rpg/save.h"
28 if (!field_map.empty())
30 for (
int i = 0; fields[i] != NULL; i++)
31 field_map[fields[i]->
id] = fields[i];
38 for (
int i = 0; fields[i] != NULL; i++)
39 tag_map[fields[i]->name] = fields[i];
51 static rpg::Actor
make(
bool is2k3) {
52 auto actor = rpg::Actor();
64 LcfReader::Chunk chunk_info;
66 while (!stream.Eof()) {
67 chunk_info.ID = stream.ReadInt();
68 if (chunk_info.ID == 0)
71 chunk_info.length = stream.ReadInt();
73 auto it = field_map.find(chunk_info.ID);
74 if (it != field_map.end()) {
76 fprintf(stderr,
"0x%02x (size: %" PRIu32
", pos: 0x%" PRIx32
"): %s\n", chunk_info.ID, chunk_info.length, stream.Tell(), it->second->name);
78 const uint32_t off = stream.Tell();
79 it->second->ReadLcf(obj, stream, chunk_info.length);
80 const uint32_t bytes_read = stream.Tell() - off;
81 if (bytes_read != chunk_info.length) {
82 Log::Warning(
"%s: Corrupted Chunk 0x%02" PRIx32
" (size: %" PRIu32
", pos: 0x%" PRIx32
"): %s : Read %" PRIu32
" bytes!",
84 stream.Seek(off + chunk_info.length);
94typename std::enable_if<std::is_same<T, rpg::Save>::value ||
95 std::is_same<T, rpg::Database>::value>::type
101typename std::enable_if<!std::is_same<T, rpg::Save>::value &&
102 !std::is_same<T, rpg::Database>::value>::type
109 const bool db_is2k3 = stream.Is2k3();
113 for (
int i = 0; fields[i] != NULL; i++) {
115 if (!db_is2k3 && field->
is2k3) {
118 if (field->
id < last)
119 std::cerr <<
"field order mismatch: " << field->
id
121 <<
" in struct " << name
126 stream.WriteInt(field->
id);
127 auto len = field->
LcfSize(obj, stream);
128 stream.WriteInt(len);
139 const bool db_is2k3 = stream.Is2k3();
142 for (
int i = 0; fields[i] != NULL; i++) {
144 if (!db_is2k3 && field->
is2k3) {
151 result += LcfReader::IntSize(field->
id);
152 int size = field->
LcfSize(obj, stream);
153 result += LcfReader::IntSize(size);
156 result += LcfReader::IntSize(0);
162 IDReader::WriteXmlTag(obj, name, stream);
163 for (
int i = 0; fields[i] != NULL; i++) {
167 stream.EndElement(name);
177 void StartElement(XmlReader& stream,
const char* name,
const char** ) {
200 void StartElement(XmlReader& stream,
const char* name,
const char** atts) {
219 int count = stream.ReadInt();
221 for (
int i = 0; i < count; i++) {
222 IDReader::ReadID(vec[i], stream);
229 int count = vec.size();
230 stream.WriteInt(count);
231 for (
int i = 0; i < count; i++) {
232 IDReader::WriteID(vec[i], stream);
240 int count = vec.size();
241 result += LcfReader::IntSize(count);
242 for (
int i = 0; i < count; i++) {
243 result += IDReader::IDSize(vec[i]);
251 int count = vec.size();
252 for (
int i = 0; i < count; i++)
261 void StartElement(XmlReader& stream,
const char* name,
const char** atts) {
264 ref.resize(
ref.size() + 1);
void StartElement(XmlReader &stream, const char *name, const char **atts)
StructFieldXmlHandler(S &ref)
static void BeginXml(S &obj, XmlReader &stream)
static int LcfSize(const S &obj, LcfWriter &stream)
static void MakeFieldMap()
static void WriteXml(const S &obj, XmlWriter &stream)
static void WriteLcf(const S &obj, LcfWriter &stream)
static void ReadLcf(S &obj, LcfReader &stream)
static const char *const name
void StartElement(XmlReader &stream, const char *name, const char **atts)
StructVectorXmlHandler(std::vector< S > &ref)
void EndElement(XmlReader &, const char *)
void StartElement(XmlReader &stream, const char *name, const char **)
void CharacterData(XmlReader &, const std::string &data)
void Warning(const char *fmt,...) LIKE_PRINTF
void Error(const char *fmt,...) LIKE_PRINTF
std::enable_if< std::is_same< T, rpg::Save >::value||std::is_same< T, rpg::Database >::value >::type conditional_zero_writer(LcfWriter &)
bool isPresentIfDefault(bool db_is2k3) const
virtual void WriteLcf(const S &obj, LcfWriter &stream) const =0
virtual bool IsDefault(const S &obj, const S &ref, bool is2k3) const =0
virtual void WriteXml(const S &obj, XmlWriter &stream) const =0
virtual int LcfSize(const S &obj, LcfWriter &stream) const =0
static rpg::Actor make(bool is2k3)