liblcf
lmt_treemap.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 "lmt_reader.h"
11 #include "lmt_chunks.h"
12 #include "reader_struct.h"
13 
14 template <>
15 struct RawStruct<RPG::TreeMap> {
16  static void ReadLcf(RPG::TreeMap& ref, LcfReader& stream, uint32_t length);
17  static void WriteLcf(const RPG::TreeMap& ref, LcfWriter& stream);
18  static int LcfSize(const RPG::TreeMap& ref, LcfWriter& stream);
19  static void WriteXml(const RPG::TreeMap& ref, XmlWriter& stream);
20  static void BeginXml(RPG::TreeMap& ref, XmlReader& stream);
21 };
22 
26 void RawStruct<RPG::TreeMap>::ReadLcf(RPG::TreeMap& ref, LcfReader& stream, uint32_t /* length */) {
28  for (int i = stream.ReadInt(); i > 0; i--)
29  ref.tree_order.push_back(stream.ReadInt());
30  ref.active_node = stream.ReadInt();
32 }
33 
36  int count = ref.tree_order.size();
37  stream.WriteInt(count);
38  for (int i = 0; i < count; i++)
39  stream.WriteInt(ref.tree_order[i]);
40  stream.WriteInt(ref.active_node);
42 }
43 
44 int RawStruct<RPG::TreeMap>::LcfSize(const RPG::TreeMap& /* ref */, LcfWriter& /* stream */) {
45  /* doesn't matter; this structure never occurs within a chunk */
46  return 0;
47 }
48 
50  stream.BeginElement("TreeMap");
51 
52  stream.BeginElement("maps");
54  stream.EndElement("maps");
55 
56  stream.BeginElement("tree_order");
57  stream.Write<std::vector<int32_t>>(ref.tree_order);
58  stream.EndElement("tree_order");
59 
60  stream.WriteNode<int32_t>("active_node", ref.active_node);
61 
62  stream.BeginElement("start");
64  stream.EndElement("start");
65 
66  stream.EndElement("TreeMap");
67 }
68 
69 class TreeMapXmlHandler : public XmlHandler {
70 private:
73  bool tree_order;
74 public:
76  ref(ref), active_node(false), tree_order(false) {}
77 
78  void StartElement(XmlReader& stream, const char* name, const char** /* atts */) {
79  active_node = false;
80  tree_order = false;
81  if (strcmp(name, "maps") == 0)
83  else if (strcmp(name, "tree_order") == 0)
84  tree_order = true;
85  else if (strcmp(name, "active_node") == 0)
86  active_node = true;
87  else if (strcmp(name, "start") == 0)
89  else {
90  stream.Error("Unrecognized field '%s'", name);
91  }
92  }
93  void EndElement(XmlReader& /* stream */, const char* /* name */) {
94  active_node = false;
95  tree_order = false;
96  }
97  void CharacterData(XmlReader& /* stream */, const std::string& data) {
98  if (active_node)
99  XmlReader::Read<int32_t>(ref.active_node, data);
100  if (tree_order)
101  XmlReader::Read<std::vector<int32_t>>(ref.tree_order, data);
102  }
103 };
104 
106  stream.SetHandler(new WrapperXmlHandler("TreeMap", new TreeMapXmlHandler(ref)));
107 }
int ReadInt()
Definition: reader_lcf.cpp:84
void WriteInt(int val)
Definition: writer_lcf.cpp:51
std::vector< int32_t > tree_order
Definition: rpg_treemap.h:40
int32_t active_node
Definition: rpg_treemap.h:41
std::vector< MapInfo > maps
Definition: rpg_treemap.h:39
static void WriteLcf(const S &obj, LcfWriter &stream)
static void WriteXml(const S &obj, XmlWriter &stream)
static void ReadLcf(S &obj, LcfReader &stream)
static void BeginXml(S &obj, XmlReader &stream)
RPG::TreeMap & ref
Definition: lmt_treemap.cpp:71
void EndElement(XmlReader &, const char *)
Definition: lmt_treemap.cpp:93
TreeMapXmlHandler(RPG::TreeMap &ref)
Definition: lmt_treemap.cpp:75
void CharacterData(XmlReader &, const std::string &data)
Definition: lmt_treemap.cpp:97
void StartElement(XmlReader &stream, const char *name, const char **)
Definition: lmt_treemap.cpp:78
void SetHandler(XmlHandler *handler)
Definition: reader_xml.cpp:80
void Error(const char *fmt,...)
Definition: reader_xml.cpp:59
void BeginElement(const std::string &name)
Definition: writer_xml.cpp:161
void EndElement(const std::string &name)
Definition: writer_xml.cpp:177
void Write(const T &val)
void WriteNode(const std::string &name, const T &val)
Definition: writer_xml.cpp:155
RPG::Database data
Definition: data.cpp:14
Definition: rpg_actor.h:26
static int LcfSize(const T &ref, LcfWriter &stream)
static void WriteXml(const T &ref, XmlWriter &stream)
static void ReadLcf(T &ref, LcfReader &stream, uint32_t length)
static void WriteLcf(const T &ref, LcfWriter &stream)
static void BeginXml(T &ref, XmlReader &stream)