]>
jfr.im git - irc/gameservirc.git/blob - gameserv/loadsave.cpp
1 /* This file includes functions that deal with loading and
2 saving to and from files. It also includes some miscellaneous related
21 ifstream
infile(masterdata
);
28 log("Error opening %s", masterdata
);
33 log("Loading masters from %s", masterdata
);
36 for (l
= 0; l
< LEVELS
- 1; l
++)
38 infile
.getline(buf
, 1024, '\n');
41 if (buf
[0] == '#' || buf
[0] == '\n' || buf
[0] == '\r')
46 else if (buf
[0] == '^')
49 Monster
*master
= &levels
[l
].master
;
51 char *name
, *weapon
, *strength
, *gold
, *exp
, *maxhp
, *death
;
54 name
= strtok(buf
, "~");
55 weapon
= strtok(NULL
, "~");
56 strength
= strtok(NULL
, "~");
57 gold
= strtok(NULL
, "~");
58 exp
= strtok(NULL
, "~");
59 maxhp
= strtok(NULL
, "~");
60 death
= strtok(NULL
, "~");
63 master
->weapon
= weapon
;
64 master
->strength
= stringtoint(strength
);
65 master
->gold
= stringtoint(gold
);
66 master
->exp
= stringtoint(exp
);
67 master
->maxhp
= stringtoint(maxhp
);
68 master
->hp
= master
->maxhp
;
69 master
->death
= death
;
74 if (l
< LEVELS
- 1) // We didn't load a master for every level - check data/masters.dat
80 void delete_monsters()
82 for (int x
= 0; x
< LEVELS
; x
++)
83 levels
[x
].monsters
.clear();
88 list
<Player
*>::iterator iter
;
92 outfile
.open(playerdata
);
96 log("Error opening %s", playerdata
);
100 for (unsigned long x
= 0; x
< U_TABLE_SIZE
; x
++)
102 for(iter
= players
[x
].begin(); iter
!= players
[x
].end(); iter
++)
110 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 // Traverse the list and write out each item ID and how many uses are left
113 if (!it
->inventory
->isEmpty())
115 list
<itemContainer
> *myitems
;
116 list
<itemContainer
>::iterator item_iter
;
117 myitems
= it
->inventory
->getItems();
119 for(item_iter
= myitems
->begin();item_iter
!= myitems
->end();item_iter
++)
121 outfile
<< ' ' << (*item_iter
).getItem()->getID() << ' ' << (*item_iter
).getUses();
136 infile
.open(dragondata
);
141 log ("Error opening %s. Trying initialdragon.dat", dragondata
);
142 infile
.open("data/initialdragon.dat");
145 log ("Error opening data/initialdragon.dat");
150 buf
= new char[1024];
152 infile
.getline(buf
, 1024, '\n');
153 infile
.close(); // Done with the file... we have what we want
155 dragon
.name
= strtok(buf
, "~");
156 dragon
.weapon
= strtok(NULL
, "~");
159 dragon
.strength
= stringtoint(strtok(NULL
, "~"));
160 dragon
.hp
= stringtoint(strtok(NULL
, "~"));
161 dragon
.defense
= stringtoint(strtok(NULL
, "~"));
162 dragon
.death
= strtok(NULL
, "");
164 log ("loaded dragon: %s", dragon
.name
.c_str());
168 return save_dragon(); // Save the dragon file and return the status code :)
175 outfile
.open(dragondata
);
179 log ("Error opening %s. Exiting.", dragondata
);
183 outfile
<< dragon
.name
.c_str() << '~' << dragon
.weapon
.c_str() << '~'
184 << dragon
.strength
<< '~' << dragon
.hp
<< '~'
185 << dragon
.defense
<< '~' << dragon
.death
.c_str() << "\n^"
198 buf
= new char[1024];
201 infile
.open(storeitemdata
);
205 log("Error opening %s", storeitemdata
);
209 while (infile
.getline(buf
, 1024, '\n'))
213 if (buf
[0] != '#' && buf
[0] != '\n' && buf
[0] != '\0')
216 id
= stringtoint(strtok(buf
, ""));
217 tempItem2
= findItemByID(id
);
218 if (tempItem2
== NULL
)
220 log("Invalid ID in %s", storeitemdata
);
225 tempItem
= tempItem2
;
226 store
.push_back(tempItem
);
231 log("Exception loading store: %s", str
);
246 buf
= new char[1024];
249 infile
.open(tavernitemdata
);
252 log("Error opening %s", tavernitemdata
);
256 while (infile
.getline(buf
, 1024, '\n'))
260 if (buf
[0] != '#' && buf
[0] != '\n' && buf
[0] != '\0')
263 id
= stringtoint(strtok(buf
, "~"));
264 level
= stringtoint(strtok(NULL
, ""));
265 tempItem2
= findItemByID(id
);
266 if (tempItem2
== NULL
)
268 log("Invalid ID in %s", tavernitemdata
);
272 tempItem
.setItem(tempItem2
);
273 tempItem
.setLevel(level
);
274 tavern
.push_back(tempItem
);
279 log("Exception loading tavern: %s", str
);
295 buf
= new char[1024];
297 infile
.open(itemdata
);
301 log("Error opening %s", itemdata
);
305 while (infile
.getline(buf
, 1024, '\n'))
311 if (buf
[0] != '#' && buf
[0] != '\n' && buf
[0] != '\0')
316 tempItem
= new weapon();
319 tempItem
= new armor();
322 tempItem
= new potion();
325 log("Invalid Item Type %c in %s", buf
[0], itemdata
);
331 if(tempItem
->setData(buf
))
333 Items
.push_back(tempItem
);
339 log("Exception loading items: %s", str
);
354 char *tempname
, *buf
, *password
;
356 buf
= new char[100000];
358 infile
.open(playerdata
);
362 log("Error opening %s", playerdata
);
367 for (int x
= 0; x
< U_TABLE_SIZE
; x
++)
369 list
<Player
*>::iterator iter
;
371 for (iter
= players
[x
].begin(); iter
!= players
[x
].end(); iter
++)
373 logout((*iter
)->getClient());
379 while (infile
.getline(buf
, 100000, '\n'))
381 tempname
= strtok(buf
, " ");
382 p
= new Player(tempname
);
384 p
->setLevel(stringtoint(strtok(NULL
, " ")));
385 p
->setExp(stringtoint(strtok(NULL
, " ")));
386 p
->setGold(stringtoint(strtok(NULL
, " ")));
387 p
->setBank(stringtoint(strtok(NULL
, " ")));
388 tempnum
= stringtoint(strtok(NULL
, " "));
389 p
->setMaxHP(stringtoint(strtok(NULL
, " ")));
391 p
->setStrength(stringtoint(strtok(NULL
, " ")));
392 p
->setDefense(stringtoint(strtok(NULL
, " ")));
393 p
->setForestFights(stringtoint(strtok(NULL
, " ")));
394 p
->setPlayerFights(stringtoint(strtok(NULL
, " ")));
395 p
->setFlags(stringtoint(strtok(NULL
, " ")));
399 password
= strtok(NULL
, " ");
400 p
->setRawPassword(password
);
401 tempname
= strtok(NULL
, " ");
404 p
->lastlogin
= stringtoint(tempname
);
406 p
->lastlogin
= time(NULL
);
408 tempname
= strtok(NULL
, " ");
409 tempnum
= stringtoint(tempname
);
413 tempitem
= findItemByID(tempnum
);
414 p
->setWeapon(*tempitem
);
417 tempname
= strtok(NULL
, " ");
418 tempnum
= stringtoint(tempname
);
422 tempitem
= findItemByID(tempnum
);
423 p
->setArmor(*tempitem
);
427 unsigned long hv
= iHASH((unsigned char *) p
->getName().c_str());
431 for (tempname
= strtok(NULL
, " "); tempname
!= NULL
; tempname
= strtok(NULL
, " "))
434 list
<item
*>::iterator item_iter
;
435 id
= stringtoint(tempname
);
436 tempname
= strtok(NULL
, " ");
437 uses
= stringtoint(tempname
);
439 item_iter
= Items
.begin();
440 while (item_iter
!= Items
.end())
442 if ((*item_iter
)->getID() == id
)
444 // Don't sort every time you add an item or it eats CPU
445 p
->inventory
->addItemNoChecks((*item_iter
))->setUses(uses
);
450 p
->inventory
->sort();
451 myToplist
.insertPlayer(p
);
452 players
[hv
].push_back(p
);
463 filename
= new char[256];
465 for (int x
= 1; x
<= LEVELS
; x
++)
467 sprintf(filename
, "data/levels/level%d.dat", x
);
468 if (levels
[x
- 1].loadLevel(filename
) == false)
484 buf
= new char[2048];
486 for (int level
= 1; level
<= LEVELS
; level
++)
488 filename
= new char[256];
489 sprintf(filename
, "data/monsters/level%d.dat", level
);
490 infile
.open(filename
);
494 log("Error opening %s", filename
);
501 log("Loading monsters from %s", filename
);
504 while (infile
.getline(buf
, 2048))
508 if (buf
[0] == '\n' || buf
[0] == '\0' || buf
[0] == '#')
513 temp
->name
= strtok(buf
, "~");
514 temp
->weapon
= strtok(NULL
, "~");
515 temp
->death
= strtok(NULL
, "~");
517 levels
[level
- 1].monsters
.push_back(temp
);