]> jfr.im git - irc/gameservirc.git/blame - gameserv/loadsave.cpp
Refactored playerGO a bit
[irc/gameservirc.git] / gameserv / loadsave.cpp
CommitLineData
32ae1ba9 1 /* This file includes functions that deal with loading and
2 saving to and from files. It also includes some miscellaneous related
3 functions */
4
5 #include "extern.h"
6 #include "level.h"
7 #include "player.h"
8 #include "aClient.h"
9 #include "item.h"
10 #include "pouch.h"
11 #include "toplist.h"
12 #include "flags.h"
857510e8 13 #include "options.h"
32ae1ba9 14
cb154cf1 15 #include <stdio.h>
32ae1ba9 16 #include <fstream>
17
18 using namespace std;
19
20 bool load_masters()
21{
22 ifstream infile(masterdata);
23 char *buf;
24 int l = 0;
25 buf = new char[1024];
26
27 if (infile.fail())
28 {
29 log("Error opening %s", masterdata);
30 return false;
31 }
32
33#ifdef DEBUGMODE
34 log("Loading masters from %s", masterdata);
35#endif
36
37 for (l = 0; l < LEVELS - 1; l++)
38 {
39 infile.getline(buf, 1024, '\n');
40
41 log("%s", buf);
42 if (buf[0] == '#' || buf[0] == '\n' || buf[0] == '\r')
43 {
44 l--;
45 continue;
46 }
47 else if (buf[0] == '^')
48 break;
49
50 Monster *master = &levels[l].master;
51
52 char *name, *weapon, *strength, *gold, *exp, *maxhp, *death;
53
54
55 name = strtok(buf, "~");
56 weapon = strtok(NULL, "~");
57 strength = strtok(NULL, "~");
58 gold = strtok(NULL, "~");
59 exp = strtok(NULL, "~");
60 maxhp = strtok(NULL, "~");
61 death = strtok(NULL, "~");
62
63 master->name = name;
64 master->weapon = weapon;
65 master->strength = stringtoint(strength);
66 master->gold = stringtoint(gold);
67 master->exp = stringtoint(exp);
68 master->maxhp = stringtoint(maxhp);
69 master->hp = master->maxhp;
70 master->death = death;
71 }
72
73 delete []buf;
74
75 if (l < LEVELS - 1) // We didn't load a master for every level - check data/masters.dat
76 return false;
77 else
78 return true;
79}
80
81void delete_monsters()
82{
83 for (int x = 0; x < LEVELS; x++)
84 levels[x].monsters.clear();
85}
86
87int save_gs_dbase()
88{
89 list<Player*>::iterator iter;
90 Player *it;
91 ofstream outfile;
92
93 outfile.open(playerdata);
94
95 if (!outfile)
96 {
97 log("Error opening %s", playerdata);
98 return 0;
99 }
100
101 for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
102 {
103 for(iter = players[x].begin(); iter != players[x].end(); iter++)
104 {
105 it = (*iter);
106 clearYourTurn(it);
107 item *w, *a;
108 w = it->getWeapon();
109 a = it->getArmor();
110
111 outfile << it->getName().c_str() << ' ' << it->getLevel() << ' ' << it->getExp() << ' ' << it->getGold() << ' ' << it->getBank() << ' '<< it->getHP() << ' ' << it->getMaxHP() << ' ' << it->getStrength() << ' ' << it->getDefense() << ' ' << it->getForestFights() << ' ' << it->getPlayerFights() << ' ' << it->getFlags() << ' ' << it->getPassword().c_str() << ' ' << it->lastlogin << ' ' << (w ? w->getID() : 0) << ' ' << (a ? a->getID() : 0);
112
113 // Traverse the list and write out each item ID and how many uses are left
114 if (!it->inventory->isEmpty())
115 {
116 list<itemContainer> *myitems;
117 list<itemContainer>::iterator item_iter;
118 myitems = it->inventory->getItems();
119
120 for(item_iter = myitems->begin();item_iter != myitems->end();item_iter++)
121 {
122 outfile << ' ' << (*item_iter).getItem()->getID() << ' ' << (*item_iter).getUses();
123 }
124 }
125 outfile << endl;
126 }
127 }
128 outfile.close();
129 return 1;
130}
131
132int load_dragon()
133{
134 ifstream infile;
135 char *buf;
136
137 infile.open(dragondata);
138
139 if (infile.fail())
140 {
141 infile.clear();
142 log ("Error opening %s. Trying initialdragon.dat", dragondata);
143 infile.open("data/initialdragon.dat");
144 if (infile.fail())
145 {
146 log ("Error opening data/initialdragon.dat");
147 return 0;
148 }
149 }
150
151 buf = new char[1024];
152
153 infile.getline(buf, 1024, '\n');
154 infile.close(); // Done with the file... we have what we want
155
156 dragon.name = strtok(buf, "~");
157 dragon.weapon = strtok(NULL, "~");
158 dragon.gold = 0;
159 dragon.exp = 0;
160 dragon.strength = stringtoint(strtok(NULL, "~"));
161 dragon.hp = stringtoint(strtok(NULL, "~"));
162 dragon.defense = stringtoint(strtok(NULL, "~"));
163 dragon.death = strtok(NULL, "");
164
165 log ("loaded dragon: %s", dragon.name.c_str());
166
167 delete []buf;
168
169return save_dragon(); // Save the dragon file and return the status code :)
170}
171
172int save_dragon()
173{
174 ofstream outfile;
175
176 outfile.open(dragondata);
177
178 if (outfile.fail())
179 {
180 log ("Error opening %s. Exiting.", dragondata);
181 return 0;
182 }
183
184 outfile << dragon.name.c_str() << '~' << dragon.weapon.c_str() << '~'
185 << dragon.strength << '~' << dragon.hp << '~'
186 << dragon.defense << '~' << dragon.death.c_str() << "\n^"
187 << endl;
188
189outfile.close();
190
191return 1;
192}
193
194int load_store()
195{
196 ifstream infile;
197 char *buf;
198 item *tempItem;
199 buf = new char[1024];
200 long id;
201
202 infile.open(storeitemdata);
203
204 if (infile.fail())
205 {
206 log("Error opening %s", storeitemdata);
207 return 0;
208 }
209
210 while (infile.getline(buf, 1024, '\n'))
211 {
212 try
213 {
214 if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0')
215 {
216 item *tempItem2;
217 id = stringtoint(strtok(buf, ""));
218 tempItem2 = findItemByID(id);
219 if (tempItem2 == NULL)
220 {
221 log("Invalid ID in %s", storeitemdata);
26c5e283 222 infile.close();
32ae1ba9 223 return 0;
224 }
225
226 tempItem = tempItem2;
227 store.push_back(tempItem);
228 }
229 }
230 catch (char *str)
231 {
232 log("Exception loading store: %s", str);
26c5e283 233 infile.close();
32ae1ba9 234 delete []buf;
235 return 0;
236 }
237 }
238 delete []buf;
26c5e283 239 infile.close();
32ae1ba9 240 return 1;
241}
242int load_tavern()
243{
244 ifstream infile;
245 char *buf;
246 tavernItem tempItem;
247 buf = new char[1024];
248 long id, level;
249
250 infile.open(tavernitemdata);
251 if (infile.fail())
252 {
253 log("Error opening %s", tavernitemdata);
254 return 0;
255 }
256
257 while (infile.getline(buf, 1024, '\n'))
258 {
259 try
260 {
261 if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0')
262 {
263 item *tempItem2;
264 id = stringtoint(strtok(buf, "~"));
265 level = stringtoint(strtok(NULL, ""));
266 tempItem2 = findItemByID(id);
267 if (tempItem2 == NULL)
268 {
269 log("Invalid ID in %s", tavernitemdata);
26c5e283 270 infile.close();
32ae1ba9 271 return 0;
272 }
273 tempItem.setItem(tempItem2);
274 tempItem.setLevel(level);
275 tavern.push_back(tempItem);
276 }
277 }
278 catch (char *str)
279 {
280 log("Exception loading tavern: %s", str);
281 delete []buf;
26c5e283 282 infile.close();
32ae1ba9 283 return 0;
284 }
285 }
286 delete []buf;
26c5e283 287 infile.close();
32ae1ba9 288 return 1;
289}
290int load_items()
291{
292 ifstream infile;
293 char *buf;
294 item *tempItem;
295
296 buf = new char[1024];
297
298 infile.open(itemdata);
299
300 if (infile.fail())
301 {
302 log("Error opening %s", itemdata);
303 return 0;
304 }
305
306 while (infile.getline(buf, 1024, '\n'))
307 {
308 if (buf[0] == '^')
309 break;
310 try
311 {
62b9853d 312 /* Need to check to see if this is a memory leak. It should
313 clear out on exit since STL list::clear() deletes its nodes */
32ae1ba9 314 if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0')
315 {
316 switch(buf[0])
317 {
318 case '1':
319 tempItem = new weapon();
320 break;
321 case '2':
322 tempItem = new armor();
323 break;
324 case '3':
325 tempItem = new potion();
326 break;
327 default:
328 log("Invalid Item Type %c in %s", buf[0], itemdata);
329 delete []buf;
26c5e283 330 infile.close();
32ae1ba9 331 return 0;
332 break;
333 }
334 if(tempItem->setData(buf))
335 {
336 Items.push_back(tempItem);
337 }
338 }
339 }
340 catch (char *str)
341 {
342 log("Exception loading items: %s", str);
343 delete []buf;
26c5e283 344 infile.close();
32ae1ba9 345 return 0;
346 }
347 }
26c5e283 348 infile.close();
32ae1ba9 349 delete []buf;
350 return 1;
351}
352
353int load_gs_dbase()
354{
355 ifstream infile;
356 Player *p;
357 char *tempname, *buf, *password;
358 int tempnum;
359 buf = new char[100000];
360
361 infile.open(playerdata);
362
363 if (infile.fail())
364 {
365 log("Error opening %s", playerdata);
62b9853d 366 delete []buf;
32ae1ba9 367 return 0;
368 }
369
370
371 for (int x = 0; x < U_TABLE_SIZE; x++)
372 {
373 list<Player*>::iterator iter;
374
375 for (iter = players[x].begin(); iter != players[x].end(); iter++)
376 {
377 logout((*iter)->getClient());
378 delete (*iter);
379 }
380 players[x].clear();
381 }
382
383 while (infile.getline(buf, 100000, '\n'))
384 {
385 tempname = strtok(buf, " ");
386 p = new Player(tempname);
387
388 p->setLevel(stringtoint(strtok(NULL, " ")));
389 p->setExp(stringtoint(strtok(NULL, " ")));
390 p->setGold(stringtoint(strtok(NULL, " ")));
391 p->setBank(stringtoint(strtok(NULL, " ")));
392 tempnum = stringtoint(strtok(NULL, " "));
393 p->setMaxHP(stringtoint(strtok(NULL, " ")));
394 p->setHP(tempnum);
395 p->setStrength(stringtoint(strtok(NULL, " ")));
396 p->setDefense(stringtoint(strtok(NULL, " ")));
397 p->setForestFights(stringtoint(strtok(NULL, " ")));
398 p->setPlayerFights(stringtoint(strtok(NULL, " ")));
399 p->setFlags(stringtoint(strtok(NULL, " ")));
400
401
402
403 password = strtok(NULL, " ");
404 p->setRawPassword(password);
405 tempname = strtok(NULL, " ");
406
407 if (tempname)
408 p->lastlogin = stringtoint(tempname);
409 else
410 p->lastlogin = time(NULL);
411
412 tempname = strtok(NULL, " ");
413 tempnum = stringtoint(tempname);
414 item *tempitem;
415 if (tempnum != 0)
416 {
417 tempitem = findItemByID(tempnum);
418 p->setWeapon(*tempitem);
419 }
420
421 tempname = strtok(NULL, " ");
422 tempnum = stringtoint(tempname);
423
424 if (tempnum != 0)
425 {
426 tempitem = findItemByID(tempnum);
427 p->setArmor(*tempitem);
428 }
429
430
431 unsigned long hv = iHASH((unsigned char *) p->getName().c_str());
432
433 p->setClient(NULL);
434
435 for (tempname = strtok(NULL, " "); tempname != NULL; tempname = strtok(NULL, " "))
436 {
437 long int id, uses;
438 list<item*>::iterator item_iter;
439 id = stringtoint(tempname);
440 tempname = strtok(NULL, " ");
441 uses = stringtoint(tempname);
442
443 item_iter = Items.begin();
444 while (item_iter != Items.end())
445 {
446 if ((*item_iter)->getID() == id)
447 {
448 // Don't sort every time you add an item or it eats CPU
449 p->inventory->addItemNoChecks((*item_iter))->setUses(uses);
450 }
451 item_iter++;
452 }
453 }
454 p->inventory->sort();
455 myToplist.insertPlayer(p);
456 players[hv].push_back(p);
457 }
458
459 delete [] buf;
460 infile.close();
461 return 1;
462}
463
464bool load_levels()
465{
466 char *filename;
467 filename = new char[256];
468
469 for (int x = 1; x <= LEVELS; x++)
470 {
471 sprintf(filename, "data/levels/level%d.dat", x);
472 if (levels[x - 1].loadLevel(filename) == false)
473 {
474 delete []filename;
475 return false;
476 }
477 }
478
479 delete []filename;
480 return true;
481}
482
483bool load_monsters()
484{
485 char *filename;
486 ifstream infile;
487 char *buf;
488 buf = new char[2048];
62b9853d 489 filename = new char[256];
32ae1ba9 490
491 for (int level = 1; level <= LEVELS; level++)
492 {
62b9853d 493 snprintf(filename, 256, "data/monsters/level%d.dat", level);
32ae1ba9 494 infile.open(filename);
495
1bacb01a 496 if (infile.fail())
32ae1ba9 497 {
498 log("Error opening %s", filename);
499 delete []filename;
500 delete []buf;
501 return false;
502 }
503
504#ifdef DEBUGMODE
505 log("Loading monsters from %s", filename);
506#endif
507
508 while (infile.getline(buf, 2048))
509 {
510 if (buf[0] == '^')
511 break;
512 if (buf[0] == '\n' || buf[0] == '\0' || buf[0] == '#')
513 continue;
514 Monster *temp;
515 temp = new Monster;
516
517 temp->name = strtok(buf, "~");
518 temp->weapon = strtok(NULL, "~");
519 temp->death = strtok(NULL, "~");
520
521 levels[level - 1].monsters.push_back(temp);
522
523 }
32ae1ba9 524 infile.close();
525 }
526 delete [] buf;
62b9853d 527 delete [] filename;
32ae1ba9 528 return true;
529}