liblcf
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
lmt_treemap.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 liblcf authors
3  * This file is released under the MIT License
4  * http://opensource.org/licenses/MIT
5  */
6 
7 #include "lmt_reader.h"
8 #include "lmt_chunks.h"
9 #include "reader_struct.h"
10 
11 template <>
12 struct RawStruct<RPG::TreeMap> {
13  static void ReadLcf(RPG::TreeMap& ref, LcfReader& stream, uint32_t length);
14  static void WriteLcf(const RPG::TreeMap& ref, LcfWriter& stream);
15  static int LcfSize(const RPG::TreeMap& ref, LcfWriter& stream);
16  static void WriteXml(const RPG::TreeMap& ref, XmlWriter& stream);
17  static void BeginXml(RPG::TreeMap& ref, XmlReader& stream);
18 };
19 
23 void RawStruct<RPG::TreeMap>::ReadLcf(RPG::TreeMap& ref, LcfReader& stream, uint32_t /* length */) {
25  for (int i = stream.ReadInt(); i > 0; i--)
26  ref.tree_order.push_back(stream.ReadInt());
27  ref.active_node = stream.ReadInt();
29 }
30 
33  int count = ref.tree_order.size();
34  stream.WriteInt(count);
35  for (int i = 0; i < count; i++)
36  stream.WriteInt(ref.tree_order[i]);
37  stream.WriteInt(ref.active_node);
39 }
40 
41 int RawStruct<RPG::TreeMap>::LcfSize(const RPG::TreeMap& /* ref */, LcfWriter& /* stream */) {
42  /* doesn't matter; this structure never occurs within a chunk */
43  return 0;
44 }
45 
47  stream.BeginElement("TreeMap");
48 
49  stream.BeginElement("maps");
51  stream.EndElement("maps");
52 
53  stream.BeginElement("tree_order");
54  stream.Write<std::vector<int> >(ref.tree_order);
55  stream.EndElement("tree_order");
56 
57  stream.WriteNode<int>("active_node", ref.active_node);
58 
59  stream.BeginElement("start");
61  stream.EndElement("start");
62 
63  stream.EndElement("TreeMap");
64 }
65 
66 class TreeMapXmlHandler : public XmlHandler {
67 private:
70  bool tree_order;
71 public:
73  ref(ref), active_node(false), tree_order(false) {}
74 
75  void StartElement(XmlReader& stream, const char* name, const char** /* atts */) {
76  active_node = false;
77  tree_order = false;
78  if (strcmp(name, "maps") == 0)
80  else if (strcmp(name, "tree_order") == 0)
81  tree_order = true;
82  else if (strcmp(name, "active_node") == 0)
83  active_node = true;
84  else if (strcmp(name, "start") == 0)
86  else {
87  stream.Error("Unrecognized field '%s'", name);
88  }
89  }
90  void EndElement(XmlReader& /* stream */, const char* /* name */) {
91  active_node = false;
92  tree_order = false;
93  }
94  void CharacterData(XmlReader& /* stream */, const std::string& data) {
95  if (active_node)
96  XmlReader::Read<int>(ref.active_node, data);
97  if (tree_order)
98  XmlReader::Read<std::vector<int> >(ref.tree_order, data);
99  }
100 };
101 
103  stream.SetHandler(new WrapperXmlHandler("TreeMap", new TreeMapXmlHandler(ref)));
104 }
void CharacterData(XmlReader &, const std::string &data)
Definition: lmt_treemap.cpp:94
static void BeginXml(S &obj, XmlReader &stream)
RPG::Database data
Definition: data.cpp:11
void SetHandler(XmlHandler *handler)
Definition: reader_xml.cpp:92
void BeginElement(const std::string &name)
Definition: writer_xml.cpp:163
void WriteInt(int val)
Definition: writer_lcf.cpp:58
void EndElement(const std::string &name)
Definition: writer_xml.cpp:177
TreeMapXmlHandler(RPG::TreeMap &ref)
Definition: lmt_treemap.cpp:72
static void ReadLcf(T &ref, LcfReader &stream, uint32_t length)
void Error(const char *fmt,...)
Definition: reader_xml.cpp:71
std::vector< MapInfo > maps
Definition: rpg_treemap.h:25
std::vector< int > tree_order
Definition: rpg_treemap.h:26
int ReadInt()
Definition: reader_lcf.cpp:82
void EndElement(XmlReader &, const char *)
Definition: lmt_treemap.cpp:90
static void WriteLcf(const T &ref, LcfWriter &stream)
void StartElement(XmlReader &stream, const char *name, const char **)
Definition: lmt_treemap.cpp:75
static void ReadLcf(S &obj, LcfReader &stream)
static int LcfSize(const T &ref, LcfWriter &stream)
Definition: rpg_actor.h:23
static void BeginXml(T &ref, XmlReader &stream)
void Write(const T &val)
static void WriteLcf(const S &obj, LcfWriter &stream)
static void WriteXml(const T &ref, XmlWriter &stream)
void WriteNode(const std::string &name, const T &val)
Definition: writer_xml.cpp:157
RPG::TreeMap & ref
Definition: lmt_treemap.cpp:68
static void WriteXml(const S &obj, XmlWriter &stream)