]>
jfr.im git - irc/gameservirc.git/blob - gameserv/loadsave.cpp
b3a506049601e29bd8ff7eb34edfcda681b0c458
1 /* This file includes functions that deal with loading and
2 saving to and from files. It also includes some miscellaneous related
20 ifstream
infile(masterdata
);
27 log("Error opening %s", masterdata
);
32 log("Loading masters from %s", masterdata
);
35 for (l
= 0; l
< LEVELS
- 1; l
++)
37 infile
.getline(buf
, 1024, '\n');
40 if (buf
[0] == '#' || buf
[0] == '\n' || buf
[0] == '\r')
45 else if (buf
[0] == '^')
48 Monster
*master
= &levels
[l
].master
;
50 char *name
, *weapon
, *strength
, *gold
, *exp
, *maxhp
, *death
;
53 name
= strtok(buf
, "~");
54 weapon
= strtok(NULL
, "~");
55 strength
= strtok(NULL
, "~");
56 gold
= strtok(NULL
, "~");
57 exp
= strtok(NULL
, "~");
58 maxhp
= strtok(NULL
, "~");
59 death
= strtok(NULL
, "~");
62 master
->weapon
= weapon
;
63 master
->strength
= stringtoint(strength
);
64 master
->gold
= stringtoint(gold
);
65 master
->exp
= stringtoint(exp
);
66 master
->maxhp
= stringtoint(maxhp
);
67 master
->hp
= master
->maxhp
;
68 master
->death
= death
;
73 if (l
< LEVELS
- 1) // We didn't load a master for every level - check data/masters.dat
79 void delete_monsters()
81 for (int x
= 0; x
< LEVELS
; x
++)
82 levels
[x
].monsters
.clear();
87 list
<Player
*>::iterator iter
;
91 outfile
.open(playerdata
);
95 log("Error opening %s", playerdata
);
99 for (unsigned long x
= 0; x
< U_TABLE_SIZE
; x
++)
101 for(iter
= players
[x
].begin(); iter
!= players
[x
].end(); iter
++)
109 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);
111 // Traverse the list and write out each item ID and how many uses are left
112 if (!it
->inventory
->isEmpty())
114 list
<itemContainer
> *myitems
;
115 list
<itemContainer
>::iterator item_iter
;
116 myitems
= it
->inventory
->getItems();
118 for(item_iter
= myitems
->begin();item_iter
!= myitems
->end();item_iter
++)
120 outfile
<< ' ' << (*item_iter
).getItem()->getID() << ' ' << (*item_iter
).getUses();
135 infile
.open(dragondata
);
140 log ("Error opening %s. Trying initialdragon.dat", dragondata
);
141 infile
.open("data/initialdragon.dat");
144 log ("Error opening data/initialdragon.dat");
149 buf
= new char[1024];
151 infile
.getline(buf
, 1024, '\n');
152 infile
.close(); // Done with the file... we have what we want
154 dragon
.name
= strtok(buf
, "~");
155 dragon
.weapon
= strtok(NULL
, "~");
158 dragon
.strength
= stringtoint(strtok(NULL
, "~"));
159 dragon
.hp
= stringtoint(strtok(NULL
, "~"));
160 dragon
.defense
= stringtoint(strtok(NULL
, "~"));
161 dragon
.death
= strtok(NULL
, "");
163 log ("loaded dragon: %s", dragon
.name
.c_str());
167 return save_dragon(); // Save the dragon file and return the status code :)
174 outfile
.open(dragondata
);
178 log ("Error opening %s. Exiting.", dragondata
);
182 outfile
<< dragon
.name
.c_str() << '~' << dragon
.weapon
.c_str() << '~'
183 << dragon
.strength
<< '~' << dragon
.hp
<< '~'
184 << dragon
.defense
<< '~' << dragon
.death
.c_str() << "\n^"
197 buf
= new char[1024];
200 infile
.open(storeitemdata
);
204 log("Error opening %s", storeitemdata
);
208 while (infile
.getline(buf
, 1024, '\n'))
212 if (buf
[0] != '#' && buf
[0] != '\n' && buf
[0] != '\0')
215 id
= stringtoint(strtok(buf
, ""));
216 tempItem2
= findItemByID(id
);
217 if (tempItem2
== NULL
)
219 log("Invalid ID in %s", storeitemdata
);
223 tempItem
= tempItem2
;
224 store
.push_back(tempItem
);
229 log("Exception loading store: %s", str
);
242 buf
= new char[1024];
245 infile
.open(tavernitemdata
);
248 log("Error opening %s", tavernitemdata
);
252 while (infile
.getline(buf
, 1024, '\n'))
256 if (buf
[0] != '#' && buf
[0] != '\n' && buf
[0] != '\0')
259 id
= stringtoint(strtok(buf
, "~"));
260 level
= stringtoint(strtok(NULL
, ""));
261 tempItem2
= findItemByID(id
);
262 if (tempItem2
== NULL
)
264 log("Invalid ID in %s", tavernitemdata
);
267 tempItem
.setItem(tempItem2
);
268 tempItem
.setLevel(level
);
269 tavern
.push_back(tempItem
);
274 log("Exception loading tavern: %s", str
);
288 buf
= new char[1024];
290 infile
.open(itemdata
);
294 log("Error opening %s", itemdata
);
298 while (infile
.getline(buf
, 1024, '\n'))
304 if (buf
[0] != '#' && buf
[0] != '\n' && buf
[0] != '\0')
309 tempItem
= new weapon();
312 tempItem
= new armor();
315 tempItem
= new potion();
318 log("Invalid Item Type %c in %s", buf
[0], itemdata
);
323 if(tempItem
->setData(buf
))
325 Items
.push_back(tempItem
);
331 log("Exception loading items: %s", str
);
344 char *tempname
, *buf
, *password
;
346 buf
= new char[100000];
348 infile
.open(playerdata
);
352 log("Error opening %s", playerdata
);
357 for (int x
= 0; x
< U_TABLE_SIZE
; x
++)
359 list
<Player
*>::iterator iter
;
361 for (iter
= players
[x
].begin(); iter
!= players
[x
].end(); iter
++)
363 logout((*iter
)->getClient());
369 while (infile
.getline(buf
, 100000, '\n'))
371 tempname
= strtok(buf
, " ");
372 p
= new Player(tempname
);
374 p
->setLevel(stringtoint(strtok(NULL
, " ")));
375 p
->setExp(stringtoint(strtok(NULL
, " ")));
376 p
->setGold(stringtoint(strtok(NULL
, " ")));
377 p
->setBank(stringtoint(strtok(NULL
, " ")));
378 tempnum
= stringtoint(strtok(NULL
, " "));
379 p
->setMaxHP(stringtoint(strtok(NULL
, " ")));
381 p
->setStrength(stringtoint(strtok(NULL
, " ")));
382 p
->setDefense(stringtoint(strtok(NULL
, " ")));
383 p
->setForestFights(stringtoint(strtok(NULL
, " ")));
384 p
->setPlayerFights(stringtoint(strtok(NULL
, " ")));
385 p
->setFlags(stringtoint(strtok(NULL
, " ")));
389 password
= strtok(NULL
, " ");
390 p
->setRawPassword(password
);
391 tempname
= strtok(NULL
, " ");
394 p
->lastlogin
= stringtoint(tempname
);
396 p
->lastlogin
= time(NULL
);
398 tempname
= strtok(NULL
, " ");
399 tempnum
= stringtoint(tempname
);
403 tempitem
= findItemByID(tempnum
);
404 p
->setWeapon(*tempitem
);
407 tempname
= strtok(NULL
, " ");
408 tempnum
= stringtoint(tempname
);
412 tempitem
= findItemByID(tempnum
);
413 p
->setArmor(*tempitem
);
417 unsigned long hv
= iHASH((unsigned char *) p
->getName().c_str());
421 for (tempname
= strtok(NULL
, " "); tempname
!= NULL
; tempname
= strtok(NULL
, " "))
424 list
<item
*>::iterator item_iter
;
425 id
= stringtoint(tempname
);
426 tempname
= strtok(NULL
, " ");
427 uses
= stringtoint(tempname
);
429 item_iter
= Items
.begin();
430 while (item_iter
!= Items
.end())
432 if ((*item_iter
)->getID() == id
)
434 // Don't sort every time you add an item or it eats CPU
435 p
->inventory
->addItemNoChecks((*item_iter
))->setUses(uses
);
440 p
->inventory
->sort();
441 myToplist
.insertPlayer(p
);
442 players
[hv
].push_back(p
);
453 filename
= new char[256];
455 for (int x
= 1; x
<= LEVELS
; x
++)
457 sprintf(filename
, "data/levels/level%d.dat", x
);
458 if (levels
[x
- 1].loadLevel(filename
) == false)
474 buf
= new char[2048];
476 for (int level
= 1; level
<= LEVELS
; level
++)
478 filename
= new char[256];
479 sprintf(filename
, "data/monsters/level%d.dat", level
);
480 infile
.open(filename
);
484 log("Error opening %s", filename
);
491 log("Loading monsters from %s", filename
);
494 while (infile
.getline(buf
, 2048))
498 if (buf
[0] == '\n' || buf
[0] == '\0' || buf
[0] == '#')
503 temp
->name
= strtok(buf
, "~");
504 temp
->weapon
= strtok(NULL
, "~");
505 temp
->death
= strtok(NULL
, "~");
507 levels
[level
- 1].monsters
.push_back(temp
);