stratgame

view level/src/level.cc @ 2:369b51c9e4a8

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