source: network-game/common/WorldMap.cpp@ e4c60ba

Last change on this file since e4c60ba was e4c60ba, checked in by dportnoy <dmp1488@…>, 12 years ago

Players can turn in flags they have picked up to their own flag sites

  • Property mode set to 100644
File size: 8.1 KB
Line 
1#include "WorldMap.h"
2
3#include <string>
4#include <iostream>
5#include <fstream>
6#include <sstream>
7#include <cstdlib>
8#include <cstring>
9
10using namespace std;
11
12WorldMap::WorldMap(int width, int height)
13{
14 this->width = width;
15 this->height = height;
16
17 vctMap = new vector<vector<TerrainType>*>(width);
18 vctStructures = new vector<vector<StructureType>*>(width);
19 vctObjects = new vector<Object>();
20
21 for (int x=0; x<width; x++) {
22 vector<TerrainType>* newMapVector = new vector<TerrainType>(height);
23 vector<StructureType>* newStructureVector = new vector<StructureType>(height);
24
25 for (int y=0; y<height; y++) {
26 (*newMapVector)[y] = TERRAIN_NONE;
27 (*newStructureVector)[y] = STRUCTURE_NONE;
28 }
29
30 (*vctMap)[x] = newMapVector;
31 (*vctStructures)[x] = newStructureVector;
32 }
33}
34
35WorldMap::~WorldMap()
36{
37 for (int x=0; x<width; x++) {
38 delete (*vctMap)[x];
39 delete (*vctStructures)[x];
40 }
41
42 delete vctMap;
43 delete vctStructures;
44 delete vctObjects;
45}
46
47WorldMap::TerrainType WorldMap::getElement(int x, int y)
48{
49 return (*(*vctMap)[x])[y];
50}
51
52void WorldMap::setElement(int x, int y, TerrainType t)
53{
54 (*(*vctMap)[x])[y] = t;
55}
56
57WorldMap::StructureType WorldMap::getStructure(int x, int y)
58{
59 return (*(*vctStructures)[x])[y];
60}
61
62void WorldMap::setStructure(int x, int y, StructureType t)
63{
64 (*(*vctStructures)[x])[y] = t;
65}
66
67POSITION WorldMap::getStructureLocation(StructureType t)
68{
69 POSITION pos;
70 pos.x = 0;
71 pos.y = 0;
72
73 for (int x=0; x<vctStructures->size(); x++) {
74 for (int y=0; y<(*vctStructures)[x]->size(); y++) {
75 if ((*(*vctStructures)[x])[y] == t) {
76 pos.x = x;
77 pos.y = y;
78 return pos;
79 }
80 }
81 }
82
83 return pos;
84}
85
86vector<WorldMap::Object>* WorldMap::getObjects() {
87 return vctObjects;
88}
89
90vector<WorldMap::Object> WorldMap::getObjects(int x, int y) {
91 vector<WorldMap::Object> vctObjectsInRegion;
92
93 vector<WorldMap::Object>::iterator it;
94 for (it = vctObjects->begin(); it != vctObjects->end(); it++) {
95 if (it->pos.x/25 == x && it->pos.y/25 == y)
96 vctObjectsInRegion.push_back(*it);
97 }
98
99 return vctObjectsInRegion;
100}
101
102// used by the server to create new objects
103void WorldMap::addObject(WorldMap::ObjectType t, int x, int y) {
104 int id;
105 vector<WorldMap::Object>::iterator it;
106
107 for (id = 0; id < vctObjects->size(); id++) {
108 for (it = vctObjects->begin(); it != vctObjects->end(); it++) {
109 if (id == it->id)
110 break;
111 }
112
113 if (it == vctObjects->end()) // if no objects with this id exists
114 break;
115 }
116
117 WorldMap::Object o(id, t, x, y);
118 vctObjects->push_back(o);
119}
120
121// used by the client to update object positions or create objects it has not seen before
122void WorldMap::updateObject(int id, WorldMap::ObjectType t, int x, int y) {
123 vector<WorldMap::Object>::iterator it;
124 bool foundObject = false;
125
126 cout << "Searching for obbject to update" << endl;
127 switch (t) {
128 case WorldMap::OBJECT_BLUE_FLAG:
129 cout << "BLUE_FLAG" << endl;
130 break;
131 case WorldMap::OBJECT_RED_FLAG:
132 cout << "RED_FLAG" << endl;
133 break;
134 }
135
136 for (it = vctObjects->begin(); it != vctObjects->end(); it++) {
137 if (it->id == id) {
138 foundObject = true;
139 cout << "Found object with id " << id << endl;
140 switch (it->type) {
141 case WorldMap::OBJECT_BLUE_FLAG:
142 cout << "BLUE_FLAG" << endl;
143 break;
144 case WorldMap::OBJECT_RED_FLAG:
145 cout << "RED_FLAG" << endl;
146 break;
147 }
148 it->pos.x = x;
149 it->pos.y = y;
150 }
151 }
152
153 if (!foundObject) {
154 WorldMap::Object o(id, t, x, y);
155 vctObjects->push_back(o);
156 }
157}
158
159bool WorldMap::removeObject(int id) {
160 vector<WorldMap::Object>::iterator it;
161
162 for (it = vctObjects->begin(); it != vctObjects->end(); it++) {
163 if (it->id == id) {
164 vctObjects->erase(it);
165 return true;
166 }
167 }
168
169 return false; // no object with that id was found
170}
171
172WorldMap* WorldMap::createDefaultMap()
173{
174 WorldMap* m = new WorldMap(12l, 12);
175
176 for(int x=0; x<12; x++)
177 {
178 for(int y=0; y<12; y++)
179 {
180 if (x ==0 || y == 0 || x == 11 || y == 11)
181 m->setElement(x, y, TERRAIN_OCEAN);
182 else
183 m->setElement(x, y, TERRAIN_GRASS);
184
185 m->setStructure(x, y, STRUCTURE_NONE);
186 }
187 }
188
189 m->setElement(5, 5, TERRAIN_ROCK);
190
191 return m;
192}
193
194WorldMap* WorldMap::loadMapFromFile(string filename)
195{
196 WorldMap* m = new WorldMap(12l, 12);
197
198 ifstream file(filename.c_str());
199
200 if (file.is_open())
201 {
202 string line;
203 int width, height;
204
205 // read the map dimensions
206 getline(file, line);
207 if (line.size() > 0)
208 {
209 istringstream iss(line);
210 string token;
211 getline(iss, token, 'x');
212 width = atoi(token.c_str());
213 getline(iss, token, 'x');
214 height = atoi(token.c_str());
215 }
216
217 cout << "width: " << width << endl;
218 cout << "height: " << height << endl;
219
220 // read the map contents
221 int row = 0;
222 while ( file.good() )
223 {
224 getline(file, line);
225 if (line.size() > 0)
226 {
227 cout << "line: " << line << endl;
228
229 istringstream iss(line);
230 string token;
231
232 if (row < height) {
233 // load terrain
234
235 int type;
236 TerrainType terrain;
237
238 for(int x=0; x<width; x++)
239 {
240 getline(iss, token, ',');
241 cout << "token: " << token << endl;
242 type = atoi(token.c_str());
243 cout << "type: " << type << endl;
244
245 switch(type) {
246 case 1:
247 terrain = TERRAIN_GRASS;
248 break;
249 case 2:
250 terrain = TERRAIN_OCEAN;
251 break;
252 case 3:
253 terrain = TERRAIN_ROCK;
254 break;
255 }
256
257 cout << "About to set element" << endl;
258 cout << "x: " << x << endl;
259 cout << "row: " << row << endl;
260 m->setElement(x, row, terrain);
261 }
262 }else {
263 // load structure
264
265 int x, y, type;
266 StructureType structure;
267
268 getline(iss, token, ',');
269 cout << "token(x): " << token << endl;
270 x = atoi(token.c_str());
271
272 getline(iss, token, ',');
273 cout << "token(y): " << token << endl;
274 y = atoi(token.c_str());
275
276 getline(iss, token, ',');
277 cout << "token(type): " << token << endl;
278 type = atoi(token.c_str());
279
280 switch(type) {
281 case 0:
282 structure = STRUCTURE_NONE;
283 break;
284 case 1:
285 structure = STRUCTURE_BLUE_FLAG;
286 cout << "Should have added blue flag object" << endl;
287 break;
288 case 2:
289 structure = STRUCTURE_RED_FLAG;
290 cout << "Should have added red flag object" << endl;
291 break;
292 }
293
294 m->setStructure(x, y, structure);
295 }
296 }
297
298 row++;
299 }
300 file.close();
301 }
302 else
303 cout << "Could not open the file" << endl;
304
305 return m;
306}
307
308
309/*** Functions for Object ***/
310
311WorldMap::Object::Object(int id, ObjectType type, int x, int y) {
312 this->type = type;
313 this->id = id;
314 this->pos.x = x;
315 this->pos.y = y;
316}
317
318WorldMap::Object::Object(int id, ObjectType type, POSITION pos) {
319 this->type = type;
320 this->id = id;
321 this->pos = pos;
322}
323
324WorldMap::Object::~Object() {
325}
326
327void WorldMap::Object::serialize(char* buffer) {
328 memcpy(buffer, &this->type, 4);
329 memcpy(buffer+4, &this->id, 4);
330 memcpy(buffer+8, &this->pos.x, 4);
331 memcpy(buffer+12, &this->pos.y, 4);
332}
333
334void WorldMap::Object::deserialize(char* buffer) {
335 memcpy(&this->type, buffer, 4);
336 memcpy(&this->id, buffer+4, 4);
337 memcpy(&this->pos.x, buffer+8, 4);
338 memcpy(&this->pos.y, buffer+12, 4);
339}
Note: See TracBrowser for help on using the repository browser.