liblcf
ldb_parameters.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of liblcf. Copyright (c) 2020 liblcf authors.
3  * https://github.com/EasyRPG/liblcf - https://easyrpg.org
4  *
5  * liblcf is Free/Libre Open Source Software, released under the MIT License.
6  * For the full copyright and license information, please view the COPYING
7  * file that was distributed with this source code.
8  */
9 
10 #include "ldb_reader.h"
11 #include "ldb_chunks.h"
12 #include "reader_struct.h"
13 
14 template <>
15 struct RawStruct<RPG::Parameters> {
16  static void ReadLcf(RPG::Parameters& ref, LcfReader& stream, uint32_t length);
17  static void WriteLcf(const RPG::Parameters& ref, LcfWriter& stream);
18  static int LcfSize(const RPG::Parameters& ref, LcfWriter& stream);
19  static void WriteXml(const RPG::Parameters& ref, XmlWriter& stream);
20  static void BeginXml(RPG::Parameters& ref, XmlReader& stream);
21 };
22 
26 void RawStruct<RPG::Parameters>::ReadLcf(RPG::Parameters& ref, LcfReader& stream, uint32_t length) {
27  int n = length / 6;
28  stream.Read(ref.maxhp, n);
29  stream.Read(ref.maxsp, n);
30  stream.Read(ref.attack, n);
31  stream.Read(ref.defense, n);
32  stream.Read(ref.spirit, n);
33  stream.Read(ref.agility, n);
34 }
35 
37  stream.Write(ref.maxhp);
38  stream.Write(ref.maxsp);
39  stream.Write(ref.attack);
40  stream.Write(ref.defense);
41  stream.Write(ref.spirit);
42  stream.Write(ref.agility);
43 }
44 
46  return ref.maxhp.size() * 2 * 6;
47 }
48 
50  stream.BeginElement("Parameters");
51  stream.WriteNode<std::vector<int16_t> >("maxhp", ref.maxhp);
52  stream.WriteNode<std::vector<int16_t> >("maxsp", ref.maxsp);
53  stream.WriteNode<std::vector<int16_t> >("attack", ref.attack);
54  stream.WriteNode<std::vector<int16_t> >("defense", ref.defense);
55  stream.WriteNode<std::vector<int16_t> >("spirit", ref.spirit);
56  stream.WriteNode<std::vector<int16_t> >("agility", ref.agility);
57  stream.EndElement("Parameters");
58 }
59 
61 private:
63  std::vector<int16_t>* field;
64 public:
66  void StartElement(XmlReader& stream, const char* name, const char** /* atts */) {
67  if (strcmp(name, "maxhp") == 0)
68  field = &ref.maxhp;
69  else if (strcmp(name, "maxsp") == 0)
70  field = &ref.maxsp;
71  else if (strcmp(name, "attack") == 0)
72  field = &ref.attack;
73  else if (strcmp(name, "defense") == 0)
74  field = &ref.defense;
75  else if (strcmp(name, "spirit") == 0)
76  field = &ref.spirit;
77  else if (strcmp(name, "agility") == 0)
78  field = &ref.agility;
79  else {
80  stream.Error("Unrecognized field '%s'", name);
81  field = NULL;
82  }
83  }
84  void EndElement(XmlReader& /* stream */, const char* /* name */) {
85  field = NULL;
86  }
87  void CharacterData(XmlReader& /* stream */, const std::string& data) {
88  if (field != NULL)
89  XmlReader::Read<std::vector<int16_t> >(*field, data);
90  }
91 };
92 
94  stream.SetHandler(new WrapperXmlHandler("Parameters", new ParametersXmlHandler(ref)));
95 }
LcfReader::Read
void Read(void *ptr, size_t size, size_t nmemb)
Definition: reader_lcf.cpp:47
ldb_chunks.h
RawStruct::ReadLcf
static void ReadLcf(T &ref, LcfReader &stream, uint32_t length)
RawStruct::WriteLcf
static void WriteLcf(const T &ref, LcfWriter &stream)
XmlReader::Error
void Error(const char *fmt,...)
Definition: reader_xml.cpp:59
ParametersXmlHandler::EndElement
void EndElement(XmlReader &, const char *)
Definition: ldb_parameters.cpp:84
XmlHandler
Definition: reader_xml.h:116
XmlReader
Definition: reader_xml.h:31
WrapperXmlHandler
Definition: reader_struct.h:705
XmlReader::SetHandler
void SetHandler(XmlHandler *handler)
Definition: reader_xml.cpp:80
ParametersXmlHandler
Definition: ldb_parameters.cpp:60
RawStruct::BeginXml
static void BeginXml(T &ref, XmlReader &stream)
RPG
Definition: rpg_actor.h:26
XmlWriter::EndElement
void EndElement(const std::string &name)
Definition: writer_xml.cpp:177
RPG::Parameters::maxsp
std::vector< int16_t > maxsp
Definition: rpg_parameters.h:27
ParametersXmlHandler::ParametersXmlHandler
ParametersXmlHandler(RPG::Parameters &ref)
Definition: ldb_parameters.cpp:65
ParametersXmlHandler::field
std::vector< int16_t > * field
Definition: ldb_parameters.cpp:63
reader_struct.h
LcfWriter
Definition: writer_lcf.h:27
XmlWriter
Definition: writer_xml.h:22
RPG::Parameters
Definition: rpg_parameters.h:23
LcfWriter::Write
void Write(const void *ptr, size_t size, size_t nmemb)
Definition: writer_lcf.cpp:24
RawStruct::WriteXml
static void WriteXml(const T &ref, XmlWriter &stream)
RPG::Parameters::attack
std::vector< int16_t > attack
Definition: rpg_parameters.h:28
RPG::Parameters::spirit
std::vector< int16_t > spirit
Definition: rpg_parameters.h:30
RPG::Parameters::defense
std::vector< int16_t > defense
Definition: rpg_parameters.h:29
RawStruct
Definition: reader_struct.h:97
Data::data
RPG::Database data
Definition: data.cpp:14
ParametersXmlHandler::ref
RPG::Parameters & ref
Definition: ldb_parameters.cpp:62
RawStruct::LcfSize
static int LcfSize(const T &ref, LcfWriter &stream)
ParametersXmlHandler::CharacterData
void CharacterData(XmlReader &, const std::string &data)
Definition: ldb_parameters.cpp:87
XmlWriter::WriteNode
void WriteNode(const std::string &name, const T &val)
Definition: writer_xml.cpp:155
RPG::Parameters::agility
std::vector< int16_t > agility
Definition: rpg_parameters.h:31
LcfReader
Definition: reader_lcf.h:35
ParametersXmlHandler::StartElement
void StartElement(XmlReader &stream, const char *name, const char **)
Definition: ldb_parameters.cpp:66
RPG::Parameters::maxhp
std::vector< int16_t > maxhp
Definition: rpg_parameters.h:26
XmlWriter::BeginElement
void BeginElement(const std::string &name)
Definition: writer_xml.cpp:161
ldb_reader.h