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