liblcf
lmt_treemap.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of liblcf. Copyright (c) 2021 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 "lcf/lmt/reader.h"
11 #include "lcf/lmt/chunks.h"
12 #include "reader_struct.h"
13 
14 namespace lcf {
15 
16 template <>
17 struct RawStruct<rpg::TreeMap> {
18  static void ReadLcf(rpg::TreeMap& ref, LcfReader& stream, uint32_t length);
19  static void WriteLcf(const rpg::TreeMap& ref, LcfWriter& stream);
20  static int LcfSize(const rpg::TreeMap& ref, LcfWriter& stream);
21  static void WriteXml(const rpg::TreeMap& ref, XmlWriter& stream);
22  static void BeginXml(rpg::TreeMap& ref, XmlReader& stream);
23 };
24 
28 void RawStruct<rpg::TreeMap>::ReadLcf(rpg::TreeMap& ref, LcfReader& stream, uint32_t /* length */) {
29  Struct<rpg::MapInfo>::ReadLcf(ref.maps, stream);
30  for (int i = stream.ReadInt(); i > 0; i--)
31  ref.tree_order.push_back(stream.ReadInt());
32  ref.active_node = stream.ReadInt();
33  Struct<rpg::Start>::ReadLcf(ref.start, stream);
34 }
35 
36 void RawStruct<rpg::TreeMap>::WriteLcf(const rpg::TreeMap& ref, LcfWriter& stream) {
37  Struct<rpg::MapInfo>::WriteLcf(ref.maps, stream);
38  int count = ref.tree_order.size();
39  stream.WriteInt(count);
40  for (int i = 0; i < count; i++)
41  stream.WriteInt(ref.tree_order[i]);
42  stream.WriteInt(ref.active_node);
43  Struct<rpg::Start>::WriteLcf(ref.start, stream);
44 }
45 
46 int RawStruct<rpg::TreeMap>::LcfSize(const rpg::TreeMap& /* ref */, LcfWriter& /* stream */) {
47  /* doesn't matter; this structure never occurs within a chunk */
48  return 0;
49 }
50 
51 void RawStruct<rpg::TreeMap>::WriteXml(const rpg::TreeMap& ref, XmlWriter& stream) {
52  stream.BeginElement("TreeMap");
53 
54  stream.BeginElement("maps");
55  Struct<rpg::MapInfo>::WriteXml(ref.maps, stream);
56  stream.EndElement("maps");
57 
58  stream.BeginElement("tree_order");
59  stream.Write<std::vector<int32_t>>(ref.tree_order);
60  stream.EndElement("tree_order");
61 
62  stream.WriteNode<int32_t>("active_node", ref.active_node);
63 
64  stream.BeginElement("start");
65  Struct<rpg::Start>::WriteXml(ref.start, stream);
66  stream.EndElement("start");
67 
68  stream.EndElement("TreeMap");
69 }
70 
71 class TreeMapXmlHandler : public XmlHandler {
72 private:
73  rpg::TreeMap& ref;
75  bool tree_order;
76 public:
77  TreeMapXmlHandler(rpg::TreeMap& ref) :
78  ref(ref), active_node(false), tree_order(false) {}
79 
80  void StartElement(XmlReader& stream, const char* name, const char** /* atts */) {
81  active_node = false;
82  tree_order = false;
83  if (strcmp(name, "maps") == 0)
84  Struct<rpg::MapInfo>::BeginXml(ref.maps, stream);
85  else if (strcmp(name, "tree_order") == 0)
86  tree_order = true;
87  else if (strcmp(name, "active_node") == 0)
88  active_node = true;
89  else if (strcmp(name, "start") == 0)
90  Struct<rpg::Start>::BeginXml(ref.start, stream);
91  else {
92  stream.Error("Unrecognized field '%s'", name);
93  }
94  }
95  void EndElement(XmlReader& /* stream */, const char* /* name */) {
96  active_node = false;
97  tree_order = false;
98  }
99  void CharacterData(XmlReader& /* stream */, const std::string& data) {
100  if (active_node)
101  XmlReader::Read<int32_t>(ref.active_node, data);
102  if (tree_order)
103  XmlReader::Read<std::vector<int32_t>>(ref.tree_order, data);
104  }
105 };
106 
107 void RawStruct<rpg::TreeMap>::BeginXml(rpg::TreeMap& ref, XmlReader& stream) {
108  stream.SetHandler(new WrapperXmlHandler("TreeMap", new TreeMapXmlHandler(ref)));
109 }
110 
111 } //namespace lcf
static void BeginXml(S &obj, XmlReader &stream)
static void WriteXml(const S &obj, XmlWriter &stream)
static void WriteLcf(const S &obj, LcfWriter &stream)
static void ReadLcf(S &obj, LcfReader &stream)
void EndElement(XmlReader &, const char *)
Definition: lmt_treemap.cpp:95
void CharacterData(XmlReader &, const std::string &data)
Definition: lmt_treemap.cpp:99
TreeMapXmlHandler(rpg::TreeMap &ref)
Definition: lmt_treemap.cpp:77
rpg::TreeMap & ref
Definition: lmt_treemap.cpp:73
void StartElement(XmlReader &stream, const char *name, const char **)
Definition: lmt_treemap.cpp:80
Definition: dbarray.cpp:13
static void WriteXml(const T &ref, XmlWriter &stream)
static void BeginXml(T &ref, XmlReader &stream)
static void ReadLcf(T &ref, LcfReader &stream, uint32_t length)
static void WriteLcf(const T &ref, LcfWriter &stream)
static int LcfSize(const T &ref, LcfWriter &stream)