stratgame

annotate 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
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 }