rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <string.h>
|
nuclear@0
|
3 #include "level.h"
|
nuclear@2
|
4 #include "datapath.h"
|
nuclear@2
|
5
|
nuclear@2
|
6 using namespace tinyxml2;
|
nuclear@0
|
7
|
nuclear@0
|
8 Level::Level()
|
nuclear@0
|
9 {
|
nuclear@0
|
10 }
|
nuclear@0
|
11
|
nuclear@0
|
12 Level::~Level()
|
nuclear@0
|
13 {
|
nuclear@0
|
14 }
|
nuclear@0
|
15
|
nuclear@0
|
16 bool Level::load(const char *fname)
|
nuclear@0
|
17 {
|
nuclear@2
|
18 push_data_path();
|
nuclear@2
|
19 add_data_path(fname);
|
nuclear@2
|
20
|
nuclear@2
|
21 if(xml.LoadFile(fname) != 0) {
|
nuclear@0
|
22 fprintf(stderr, "failed to load level: %s\n", fname);
|
nuclear@2
|
23 pop_data_path();
|
nuclear@0
|
24 return false;
|
nuclear@0
|
25 }
|
nuclear@0
|
26
|
nuclear@1
|
27 if(strcmp(xml.RootElement()->Name(), "level") != 0) {
|
nuclear@0
|
28 fprintf(stderr, "invalid level file: %s\n", fname);
|
nuclear@2
|
29 pop_data_path();
|
nuclear@0
|
30 return false;
|
nuclear@0
|
31 }
|
nuclear@2
|
32
|
nuclear@2
|
33 XMLNode *node = xml.RootElement()->FirstChild();
|
nuclear@2
|
34 do {
|
nuclear@2
|
35 XMLElement *elem = node->ToElement();
|
nuclear@2
|
36 if(elem) {
|
nuclear@2
|
37 if(strcmp(elem->Name(), "map") == 0) {
|
nuclear@2
|
38 LevelMap map;
|
nuclear@2
|
39
|
nuclear@2
|
40 if(!map.load(elem)) {
|
nuclear@2
|
41 pop_data_path();
|
nuclear@2
|
42 return false;
|
nuclear@2
|
43 }
|
nuclear@2
|
44 levelmaps[map.get_name()] = std::move(map);
|
nuclear@2
|
45
|
nuclear@2
|
46 } else {
|
nuclear@2
|
47 fprintf(stderr, "ignoring unrecognized element: %s\n", elem->Name());
|
nuclear@2
|
48 }
|
nuclear@2
|
49 }
|
nuclear@2
|
50 } while((node = node->NextSibling()));
|
nuclear@2
|
51
|
nuclear@2
|
52 pop_data_path();
|
nuclear@2
|
53 return true;
|
nuclear@2
|
54 }
|
nuclear@2
|
55
|
nuclear@2
|
56
|
nuclear@2
|
57 LevelMap::LevelMap()
|
nuclear@2
|
58 {
|
nuclear@2
|
59 init();
|
nuclear@2
|
60 }
|
nuclear@2
|
61
|
nuclear@2
|
62 void LevelMap::init()
|
nuclear@2
|
63 {
|
nuclear@2
|
64 scale = 1.0f;
|
nuclear@2
|
65 img_init(&img);
|
nuclear@2
|
66 name = 0;
|
nuclear@2
|
67 }
|
nuclear@2
|
68
|
nuclear@2
|
69 LevelMap::~LevelMap()
|
nuclear@2
|
70 {
|
nuclear@2
|
71 destroy();
|
nuclear@2
|
72 }
|
nuclear@2
|
73
|
nuclear@2
|
74 void LevelMap::destroy()
|
nuclear@2
|
75 {
|
nuclear@2
|
76 if(img.pixels) {
|
nuclear@2
|
77 img_destroy(&img);
|
nuclear@2
|
78 }
|
nuclear@2
|
79 delete [] name;
|
nuclear@2
|
80 }
|
nuclear@2
|
81
|
nuclear@2
|
82 // copy
|
nuclear@2
|
83 LevelMap::LevelMap(const LevelMap &map)
|
nuclear@2
|
84 {
|
nuclear@2
|
85 init();
|
nuclear@2
|
86 *this = map;
|
nuclear@2
|
87 }
|
nuclear@2
|
88
|
nuclear@2
|
89 LevelMap &LevelMap::operator =(const LevelMap &map)
|
nuclear@2
|
90 {
|
nuclear@2
|
91 if(this != &map) {
|
nuclear@2
|
92 destroy();
|
nuclear@2
|
93
|
nuclear@2
|
94 scale = map.scale;
|
nuclear@2
|
95 img_init(&img);
|
nuclear@2
|
96 img_copy(&img, (img_pixmap*)&map.img);
|
nuclear@2
|
97
|
nuclear@2
|
98 name = new char[strlen(map.name) + 1];
|
nuclear@2
|
99 strcpy(name, map.name);
|
nuclear@2
|
100 }
|
nuclear@2
|
101 return *this;
|
nuclear@2
|
102 }
|
nuclear@2
|
103
|
nuclear@2
|
104 // move semantics
|
nuclear@2
|
105 LevelMap::LevelMap(LevelMap &&map)
|
nuclear@2
|
106 {
|
nuclear@2
|
107 init();
|
nuclear@2
|
108 *this = std::move(map);
|
nuclear@2
|
109 }
|
nuclear@2
|
110
|
nuclear@2
|
111 LevelMap &LevelMap::operator =(LevelMap &&map)
|
nuclear@2
|
112 {
|
nuclear@2
|
113 if(this != &map) {
|
nuclear@2
|
114 destroy();
|
nuclear@2
|
115
|
nuclear@2
|
116 scale = map.scale;
|
nuclear@2
|
117
|
nuclear@2
|
118 img = map.img;
|
nuclear@2
|
119 map.img.pixels = 0;
|
nuclear@2
|
120 map.img.name = 0;
|
nuclear@2
|
121
|
nuclear@2
|
122 name = map.name;
|
nuclear@2
|
123 map.name = 0;
|
nuclear@2
|
124 }
|
nuclear@2
|
125
|
nuclear@2
|
126 return *this;
|
nuclear@2
|
127 }
|
nuclear@2
|
128
|
nuclear@2
|
129 bool LevelMap::load(XMLElement *xelem)
|
nuclear@2
|
130 {
|
nuclear@2
|
131 char fname[PATH_MAX];
|
nuclear@2
|
132
|
nuclear@2
|
133 const char *attr = xelem->Attribute("type");
|
nuclear@2
|
134 if(!attr) {
|
nuclear@2
|
135 fprintf(stderr, "map element without a type attribute\n");
|
nuclear@2
|
136 return false;
|
nuclear@2
|
137 }
|
nuclear@2
|
138 name = new char[strlen(attr) + 1];
|
nuclear@2
|
139 strcpy(name, attr);
|
nuclear@2
|
140
|
nuclear@2
|
141 attr = xelem->Attribute("file");
|
nuclear@2
|
142 if(!attr) {
|
nuclear@2
|
143 fprintf(stderr, "map element without a file attribute\n");
|
nuclear@2
|
144 return false;
|
nuclear@2
|
145 }
|
nuclear@2
|
146 if(!find_file(attr, fname)) {
|
nuclear@2
|
147 fprintf(stderr, "failed to locate image: %s\n", attr);
|
nuclear@2
|
148 return false;
|
nuclear@2
|
149 }
|
nuclear@2
|
150
|
nuclear@2
|
151 if(img_load(&img, fname) == -1) {
|
nuclear@2
|
152 fprintf(stderr, "failed to load image: %s\n", fname);
|
nuclear@2
|
153 return false;
|
nuclear@2
|
154 }
|
nuclear@2
|
155
|
nuclear@2
|
156 float val;
|
nuclear@2
|
157 if(xelem->QueryFloatAttribute("scale", &val) == 0) {
|
nuclear@2
|
158 scale = val;
|
nuclear@2
|
159 }
|
nuclear@1
|
160 return true;
|
nuclear@0
|
161 }
|
nuclear@2
|
162
|
nuclear@2
|
163 float LevelMap::get_scale() const
|
nuclear@2
|
164 {
|
nuclear@2
|
165 return scale;
|
nuclear@2
|
166 }
|
nuclear@2
|
167
|
nuclear@2
|
168 const img_pixmap *LevelMap::get_pixmap() const
|
nuclear@2
|
169 {
|
nuclear@2
|
170 return &img;
|
nuclear@2
|
171 }
|
nuclear@2
|
172
|
nuclear@2
|
173 const char *LevelMap::get_name() const
|
nuclear@2
|
174 {
|
nuclear@2
|
175 return name;
|
nuclear@2
|
176 }
|