]> jfr.im git - irc/gameservirc.git/commitdiff
Moved some more code from gameserv.cpp and added loadsave.cpp and strings.cpp.
authorkainazzzo <redacted>
Sun, 21 Jan 2007 18:44:31 +0000 (18:44 +0000)
committerkainazzzo <redacted>
Sun, 21 Jan 2007 18:44:31 +0000 (18:44 +0000)
git-svn-id: https://svn.code.sf.net/p/gameservirc/code/trunk@471 bc333340-6410-0410-a689-9d09f3c113fa

gameserv/.depend
gameserv/Makefile.in
gameserv/gameserv.cpp
gameserv/loadsave.cpp [new file with mode: 0755]
gameserv/strings.cpp [new file with mode: 0755]

index db8ce72fad1836b1ac62b4339b550e90ab9c8833..c23d348056b1d5ce56f729e307eb2a4463874420 100644 (file)
@@ -1,5 +1,7 @@
 aClient.o: aClient.cpp aClient.h options.h player.h script.h extern.h \
   config.h
+boolean.o: boolean.cpp extern.h config.h options.h aClient.h player.h \
+  script.h flags.h
 config.o: config.cpp extern.h config.h options.h flags.h
 c_forest.o: c_forest.cpp aClient.h options.h player.h script.h extern.h \
   config.h flags.h item.h level.h pouch.h sockhelp.h
@@ -14,6 +16,8 @@ item.o: item.cpp item.h level.h player.h script.h extern.h config.h \
   options.h
 level.o: level.cpp item.h level.h player.h script.h extern.h config.h \
   options.h
+loadsave.o: loadsave.cpp extern.h config.h options.h level.h player.h \
+  script.h aClient.h item.h pouch.h toplist.h flags.h
 log.o: log.cpp extern.h config.h options.h
 news.o: news.cpp extern.h config.h options.h
 pouch.o: pouch.cpp extern.h config.h options.h pouch.h item.h level.h \
@@ -22,6 +26,7 @@ player.o: player.cpp item.h level.h player.h script.h pouch.h extern.h \
   config.h options.h flags.h
 script.o: script.cpp script.h extern.h config.h options.h player.h
 sockhelp.o: sockhelp.cpp sockhelp.h extern.h config.h options.h
+strings.o: strings.cpp extern.h config.h options.h
 messages.o: messages.cpp aClient.h options.h player.h script.h item.h \
   level.h pouch.h extern.h config.h sockhelp.h flags.h
 toplist.o: toplist.cpp toplist.h player.h script.h
index 6405d22bad1384debd6b832be44be51f82d4464d..572e5ab6b0c5cb528b4ea5f84316786de842192c 100644 (file)
@@ -31,12 +31,14 @@ TSRCS =     aClient.cpp \
        hash.cpp \
        item.cpp \
        level.cpp \
+       loadsave.cpp \
        log.cpp \
        news.cpp \
        pouch.cpp \
        player.cpp \
        script.cpp \
        sockhelp.cpp \
+       strings.cpp \
        messages.cpp \
        toplist.cpp
 
index c91338f2f1110dc8ffaa9cdc1d64aae6ff4c1865..c56c427a6709c2d1fe29bb547e166254a5280e82 100644 (file)
@@ -46,15 +46,6 @@ int load_store();
 int load_dragon();
 int save_dragon();
 
-// String functions
-#ifndef HAVE_STRTOK
-char *strtok(char *str, const char *delim);
-#endif
-
-int stricmp(const char *s1, const char *s2);
-int strnicmp(const char *s1, const char *s2, size_t len);
-// String Functions
-
 
 bool shuttingdown;
 void updateTS(Player *p);
@@ -387,74 +378,6 @@ void gameserv(char *source, char *buf)
        cmd--;     // Same thing :)
 }
 
-int stricmp(const char *s1, const char *s2)
-{
-    register int c;
-
-    while ((c = tolower(*s1)) == tolower(*s2)) {
-        if (c == 0)
-            return 0;
-        s1++;
-        s2++;
-    }
-    if (c < tolower(*s2))
-        return -1;
-    return 1;
-}
-
-
-
-char *spaces(int len, char *seperator)
-{
-    char *final;
-    final = new char[30];
-    int y;
-    strcpy(final, seperator);
-    for (y = 0; y < 30 - len; y++)
-        strcat(final, seperator);
-    return final;
-}
-
-
-
-int strnicmp(const char *s1, const char *s2, size_t len)
-{
-    register int c;
-
-    if (!len)
-        return 0;
-    while ((c = tolower(*s1)) == tolower(*s2) && len > 0) {
-        if (c == 0 || --len == 0)
-            return 0;
-        s1++;
-        s2++;
-    }
-    if (c < tolower(*s2))
-        return -1;
-    return 1;
-}
-
-#ifndef HAVE_STRTOK
-char *strtok(char *str, const char *delim)
-{
-    static char *current = NULL;
-    char *ret;
-
-    if (str)
-        current = str;
-    if (!current)
-        return NULL;
-    current += strspn(current, delim);
-    ret = *current ? current : NULL;
-    current += strcspn(current, delim);
-    if (!*current)
-        current = NULL;
-    else
-        *current++ = 0;
-    return ret;
-}
-#endif
-
 void do_check(char *u)
 {
     int days, hours, minutes, seconds;
@@ -1246,72 +1169,6 @@ void do_stats(char *u)
        showstats(u, nick);
 }
 
-bool load_masters()
-{
-  ifstream infile(masterdata);
-  char *buf;
-  int l = 0;
-  buf = new char[1024];
-  
-  if (infile.fail())
-    {
-         log("Error opening %s", masterdata);
-         return false;
-    }
-  
-#ifdef DEBUGMODE
-  log("Loading masters from %s", masterdata);
-#endif
-  
-  for (l = 0; l < LEVELS - 1; l++)
-    {
-         infile.getline(buf, 1024, '\n');
-         
-         log("%s", buf);
-         if (buf[0] == '#' || buf[0] == '\n' || buf[0] == '\r')
-               {
-                 l--;
-                 continue;
-               }
-         else if (buf[0] == '^')
-           break;
-         
-         Monster *master = &levels[l].master;
-         
-         char *name, *weapon, *strength, *gold, *exp, *maxhp, *death;
-         
-         
-         name = strtok(buf, "~");
-         weapon = strtok(NULL, "~");
-         strength = strtok(NULL, "~");
-         gold = strtok(NULL, "~");
-         exp = strtok(NULL, "~");
-         maxhp = strtok(NULL, "~");
-         death = strtok(NULL, "~");
-       
-         master->name = name;
-         master->weapon = weapon;
-         master->strength = stringtoint(strength);
-         master->gold = stringtoint(gold);
-         master->exp = stringtoint(exp);
-         master->maxhp = stringtoint(maxhp);
-         master->hp = master->maxhp;
-         master->death = death;
-    }
-
-  delete []buf;
-  
-  if (l < LEVELS - 1)  // We didn't load a master for every level - check data/masters.dat
-       return false;
-  else
-       return true;
-}
-
-void delete_monsters()
-{
-  for (int x = 0; x < LEVELS; x++)
-       levels[x].monsters.clear();
-}
 
 
 
@@ -1836,412 +1693,6 @@ void do_heal(char *u)
        notice(s_GameServ, u, "SYNTAX: /msg <S HEAL {ALL | #}");
 }
 
-int isstringnum(char *num)
-{
-    unsigned int x;
-    for (x = 0; x < strlen(num); x++)
-    {
-        if ((int)num[x] < 48 || (int)num[x] > 57)
-            return 0;
-    }
-return 1;
-}
-
-long int stringtoint(char *number)
-{
-    return atol(number);
-}
-
-long int pow(int x, int y)
-{
-  long int value = 0;
-  int count = 0;
-  value += x;
-  
-  if (x != 0 && y != 0)
-    {
-         for (count = 1; count <= y - 1; count++)
-               value *= x;
-    }
-  else
-       {
-         return 1;
-       }
-  return value;
-}
-
-long int chartoint(char ch)
-{
-  if (int(ch) >= 48 && int(ch) <= 57)
-       return int(ch) - 48;
-  else
-       return 0;
-}
-
-int save_gs_dbase()
-{
-  list<Player*>::iterator iter;
-  Player *it;
-  ofstream outfile;
-  
-  outfile.open(playerdata);
-  
-  if (!outfile)
-    {
-         log("Error opening %s", playerdata);
-         return 0;
-    }
-  
-  for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
-       {
-         for(iter = players[x].begin(); iter != players[x].end(); iter++)
-               {
-                 it = (*iter);
-                 clearYourTurn(it);
-                 item *w, *a;
-                 w = it->getWeapon();
-                 a = it->getArmor();
-                 
-                 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);
-                 
-                 // Traverse the list and write out each item ID and how many uses are left
-                 if (!it->inventory->isEmpty())
-                       {
-                         list<itemContainer> *myitems;
-                         list<itemContainer>::iterator item_iter;
-                         myitems = it->inventory->getItems();
-                         
-                         for(item_iter = myitems->begin();item_iter != myitems->end();item_iter++)
-                               {
-                                 outfile << ' ' << (*item_iter).getItem()->getID() << ' ' << (*item_iter).getUses();
-                               }
-                       }
-                 outfile << endl;
-               }
-       }
-  outfile.close();
-  return 1;
-}
-
-int load_dragon()
-{
-    ifstream infile;
-    char *buf;
-
-    infile.open(dragondata);
-
-    if (infile.fail())
-    {
-       infile.clear();
-       log ("Error opening %s. Trying initialdragon.dat", dragondata);
-       infile.open("data/initialdragon.dat");
-       if (infile.fail())
-        {
-           log ("Error opening data/initialdragon.dat");
-           return 0;
-       }
-    }
-
-    buf = new char[1024];
-
-    infile.getline(buf, 1024, '\n');
-    infile.close(); // Done with the file... we have what we want
-
-    dragon.name = strtok(buf, "~");
-    dragon.weapon = strtok(NULL, "~");
-    dragon.gold = 0;
-    dragon.exp = 0;
-    dragon.strength = stringtoint(strtok(NULL, "~"));
-    dragon.hp = stringtoint(strtok(NULL, "~"));
-    dragon.defense = stringtoint(strtok(NULL, "~"));
-    dragon.death = strtok(NULL, "");
-
-    log ("loaded dragon: %s", dragon.name.c_str());
-
-    delete []buf;
-
-return save_dragon();  // Save the dragon file and return the status code :)
-}
-
-int save_dragon()
-{
-    ofstream outfile;
-
-    outfile.open(dragondata);
-
-    if (outfile.fail())
-    {
-       log ("Error opening %s. Exiting.", dragondata);
-       return 0;
-    }
-
-    outfile << dragon.name.c_str() << '~' << dragon.weapon.c_str() << '~' 
-               << dragon.strength << '~' << dragon.hp << '~' 
-               << dragon.defense << '~' << dragon.death.c_str() << "\n^"
-               << endl;
-
-outfile.close();
-
-return 1;
-}
-
-int load_store()
-{
-  ifstream infile;
-  char *buf;
-  item *tempItem;
-  buf = new char[1024];
-  long id;
-  
-  infile.open(storeitemdata);
-  
-  if (infile.fail())
-    {
-      log("Error opening %s", storeitemdata);
-      return 0;
-    }
-  
-  while (infile.getline(buf, 1024, '\n'))
-    {
-      try
-       {
-         if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0')
-           {
-             item *tempItem2;
-             id = stringtoint(strtok(buf, ""));
-             tempItem2 = findItemByID(id);
-             if (tempItem2 == NULL)
-               {
-                 log("Invalid ID in %s", storeitemdata);
-                 return 0;
-               }
-
-             tempItem = tempItem2;
-             store.push_back(tempItem);
-           }
-       }
-      catch (char *str)
-       {
-         log("Exception loading store: %s", str);
-         delete []buf;
-         return 0;
-       }
-    }
-  delete []buf;
-  return 1;
-}
-int load_tavern()
-{
-  ifstream infile;
-  char *buf;
-  tavernItem tempItem;
-  buf = new char[1024];
-  long id, level;
-
-  infile.open(tavernitemdata);
-  if (infile.fail())
-    {
-      log("Error opening %s", tavernitemdata);
-      return 0;
-    }
-
-  while (infile.getline(buf, 1024, '\n'))
-    {
-      try
-       {
-         if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0')
-           {
-             item *tempItem2;
-             id = stringtoint(strtok(buf, "~"));
-             level = stringtoint(strtok(NULL, ""));
-             tempItem2 = findItemByID(id);
-             if (tempItem2 == NULL)
-               {
-                 log("Invalid ID in %s", tavernitemdata);
-                 return 0;
-               }
-             tempItem.setItem(tempItem2);
-             tempItem.setLevel(level);
-             tavern.push_back(tempItem);
-           }
-       }
-      catch (char *str)
-       {
-         log("Exception loading tavern: %s", str);
-         delete []buf;
-         return 0;
-       }
-    }
-  delete []buf;
-  return 1;
-}
-int load_items()
-{
-  ifstream infile;
-  char *buf;
-  item *tempItem;
-  
-  buf = new char[1024];
-  
-  infile.open(itemdata);
-  
-  if (infile.fail())
-    {
-      log("Error opening %s", itemdata);
-      return 0;
-    }
-  
-  while (infile.getline(buf, 1024, '\n'))
-    {
-      if (buf[0] == '^')
-               break;
-      try
-               {
-                 if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0')
-                       {
-                         switch(buf[0])
-                               {
-                               case '1':
-                                 tempItem = new weapon();
-                                 break;
-                               case '2':
-                                 tempItem = new armor();
-                                 break;
-                               case '3':
-                                 tempItem = new potion();
-                                 break;
-                               default:
-                                 log("Invalid Item Type %c in %s", buf[0], itemdata);
-                                 delete []buf;
-                                 return 0;
-                                 break;
-                               }
-                         if(tempItem->setData(buf))
-                               {
-                                 Items.push_back(tempItem);
-                               }
-                       }
-               }
-      catch (char *str)
-               {
-                 log("Exception loading items: %s", str);
-                 delete []buf;
-                 return 0;
-               }
-    }
-  delete []buf;
-  return 1;
-}
-
-int load_gs_dbase()
-{
-  ifstream infile;
-  Player *p;
-  char *tempname, *buf, *password;
-  int tempnum;
-  buf = new char[100000];
-  
-  infile.open(playerdata);
-  
-  if (infile.fail())
-    {
-         log("Error opening %s", playerdata);
-         return 0;
-    }
-  
-  
-  for (int x = 0; x < U_TABLE_SIZE; x++)
-    {
-         list<Player*>::iterator iter;
-         
-         for (iter = players[x].begin(); iter != players[x].end(); iter++)
-               {
-                 logout((*iter)->getClient());
-                 delete (*iter);
-               }
-         players[x].clear();
-    }
-  
-  while (infile.getline(buf, 100000, '\n'))
-       {
-         tempname = strtok(buf, " ");
-         p = new Player(tempname);
-         
-         p->setLevel(stringtoint(strtok(NULL, " ")));
-         p->setExp(stringtoint(strtok(NULL, " ")));
-         p->setGold(stringtoint(strtok(NULL, " ")));
-         p->setBank(stringtoint(strtok(NULL, " ")));
-         tempnum = stringtoint(strtok(NULL, " "));
-         p->setMaxHP(stringtoint(strtok(NULL, " ")));
-         p->setHP(tempnum);
-         p->setStrength(stringtoint(strtok(NULL, " ")));
-         p->setDefense(stringtoint(strtok(NULL, " ")));
-         p->setForestFights(stringtoint(strtok(NULL, " ")));
-         p->setPlayerFights(stringtoint(strtok(NULL, " ")));
-         p->setFlags(stringtoint(strtok(NULL, " ")));
-  
-  
-         
-         password = strtok(NULL, " ");
-         p->setRawPassword(password);
-         tempname = strtok(NULL, " ");
-         
-         if (tempname)
-               p->lastlogin = stringtoint(tempname);
-         else
-               p->lastlogin = time(NULL);
-         
-         tempname = strtok(NULL, " ");
-         tempnum = stringtoint(tempname);
-         item *tempitem;
-         if (tempnum != 0)
-               {
-                 tempitem = findItemByID(tempnum);
-                 p->setWeapon(*tempitem);
-               }
-         
-         tempname = strtok(NULL, " ");
-         tempnum = stringtoint(tempname);
-         
-         if (tempnum != 0)
-               {
-                 tempitem = findItemByID(tempnum);
-                 p->setArmor(*tempitem);
-               }
-         
-         
-         unsigned long hv = iHASH((unsigned char *) p->getName().c_str());
-         
-         p->setClient(NULL);
-         
-         for (tempname = strtok(NULL, " "); tempname != NULL; tempname = strtok(NULL, " "))
-               {
-                 long int id, uses;
-                 list<item*>::iterator item_iter;
-                 id = stringtoint(tempname);
-                 tempname = strtok(NULL, " ");
-                 uses = stringtoint(tempname);
-                 
-                 item_iter = Items.begin();
-                 while (item_iter != Items.end())
-                       {
-                         if ((*item_iter)->getID() == id)
-                               {
-                                 // Don't sort every time you add an item or it eats CPU
-                                 p->inventory->addItemNoChecks((*item_iter))->setUses(uses);
-                               }
-                         item_iter++;
-                       }
-               }
-         p->inventory->sort();
-     myToplist.insertPlayer(p);
-         players[hv].push_back(p);
-       }
-
-  delete [] buf;
-  infile.close();
-  return 1;
-}
 
 
 
@@ -3280,71 +2731,3 @@ void do_admin(char *u)
     }
 }
 
-bool load_levels()
-{
-  char *filename;
-  filename = new char[256];
-  
-  for (int x = 1; x <= LEVELS; x++)
-    {
-         sprintf(filename, "data/levels/level%d.dat", x);
-         if (levels[x - 1].loadLevel(filename) == false)
-               {
-                 delete []filename;
-                 return false;
-               }
-    }
-  
-  delete []filename;
-  return true;
-}
-
-bool load_monsters()
-{
-  char *filename;
-  ifstream infile;
-  char *buf;
-  buf = new char[2048];
-  
-  for (int level = 1; level <= LEVELS; level++)
-       {
-         filename = new char[256];
-         sprintf(filename, "data/monsters/level%d.dat", level);
-         infile.open(filename);
-         
-         if (!infile)
-               {
-                 log("Error opening %s", filename);
-                 delete []filename;
-                 delete []buf;
-                 return false;
-               }
-         
-#ifdef DEBUGMODE
-         log("Loading monsters from %s", filename);
-#endif
-         
-         while (infile.getline(buf, 2048))
-               {
-                 if (buf[0] == '^')
-                       break;
-                 if (buf[0] == '\n' || buf[0] == '\0' || buf[0] == '#')
-                       continue;
-                 Monster *temp;
-                 temp = new Monster;
-                 
-                 temp->name = strtok(buf, "~");
-                 temp->weapon = strtok(NULL, "~");
-                 temp->death = strtok(NULL, "~");
-                 
-                 levels[level - 1].monsters.push_back(temp);
-
-               }
-         delete [] filename;
-         infile.close();
-       }
-  delete [] buf;
-  return true;
-}
-
-
diff --git a/gameserv/loadsave.cpp b/gameserv/loadsave.cpp
new file mode 100755 (executable)
index 0000000..b3a5060
--- /dev/null
@@ -0,0 +1,518 @@
+ /* This file includes functions that deal with loading and
+    saving to and from files. It also includes some miscellaneous related
+    functions */
+ #include "extern.h"
+ #include "level.h"
+ #include "player.h"
+ #include "aClient.h"
+ #include "item.h"
+ #include "pouch.h"
+ #include "toplist.h"
+ #include "flags.h"
+ #include <fstream>
+ using namespace std;
+ bool load_masters()
+{
+  ifstream infile(masterdata);
+  char *buf;
+  int l = 0;
+  buf = new char[1024];
+  
+  if (infile.fail())
+    {
+         log("Error opening %s", masterdata);
+         return false;
+    }
+  
+#ifdef DEBUGMODE
+  log("Loading masters from %s", masterdata);
+#endif
+  
+  for (l = 0; l < LEVELS - 1; l++)
+    {
+         infile.getline(buf, 1024, '\n');
+         
+         log("%s", buf);
+         if (buf[0] == '#' || buf[0] == '\n' || buf[0] == '\r')
+               {
+                 l--;
+                 continue;
+               }
+         else if (buf[0] == '^')
+           break;
+         
+         Monster *master = &levels[l].master;
+         
+         char *name, *weapon, *strength, *gold, *exp, *maxhp, *death;
+         
+         
+         name = strtok(buf, "~");
+         weapon = strtok(NULL, "~");
+         strength = strtok(NULL, "~");
+         gold = strtok(NULL, "~");
+         exp = strtok(NULL, "~");
+         maxhp = strtok(NULL, "~");
+         death = strtok(NULL, "~");
+       
+         master->name = name;
+         master->weapon = weapon;
+         master->strength = stringtoint(strength);
+         master->gold = stringtoint(gold);
+         master->exp = stringtoint(exp);
+         master->maxhp = stringtoint(maxhp);
+         master->hp = master->maxhp;
+         master->death = death;
+    }
+
+  delete []buf;
+  
+  if (l < LEVELS - 1)  // We didn't load a master for every level - check data/masters.dat
+       return false;
+  else
+       return true;
+}
+
+void delete_monsters()
+{
+  for (int x = 0; x < LEVELS; x++)
+       levels[x].monsters.clear();
+}
+
+int save_gs_dbase()
+{
+  list<Player*>::iterator iter;
+  Player *it;
+  ofstream outfile;
+  
+  outfile.open(playerdata);
+  
+  if (!outfile)
+    {
+         log("Error opening %s", playerdata);
+         return 0;
+    }
+  
+  for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
+       {
+         for(iter = players[x].begin(); iter != players[x].end(); iter++)
+               {
+                 it = (*iter);
+                 clearYourTurn(it);
+                 item *w, *a;
+                 w = it->getWeapon();
+                 a = it->getArmor();
+                 
+                 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);
+                 
+                 // Traverse the list and write out each item ID and how many uses are left
+                 if (!it->inventory->isEmpty())
+                       {
+                         list<itemContainer> *myitems;
+                         list<itemContainer>::iterator item_iter;
+                         myitems = it->inventory->getItems();
+                         
+                         for(item_iter = myitems->begin();item_iter != myitems->end();item_iter++)
+                               {
+                                 outfile << ' ' << (*item_iter).getItem()->getID() << ' ' << (*item_iter).getUses();
+                               }
+                       }
+                 outfile << endl;
+               }
+       }
+  outfile.close();
+  return 1;
+}
+
+int load_dragon()
+{
+    ifstream infile;
+    char *buf;
+
+    infile.open(dragondata);
+
+    if (infile.fail())
+    {
+       infile.clear();
+       log ("Error opening %s. Trying initialdragon.dat", dragondata);
+       infile.open("data/initialdragon.dat");
+       if (infile.fail())
+        {
+           log ("Error opening data/initialdragon.dat");
+           return 0;
+       }
+    }
+
+    buf = new char[1024];
+
+    infile.getline(buf, 1024, '\n');
+    infile.close(); // Done with the file... we have what we want
+
+    dragon.name = strtok(buf, "~");
+    dragon.weapon = strtok(NULL, "~");
+    dragon.gold = 0;
+    dragon.exp = 0;
+    dragon.strength = stringtoint(strtok(NULL, "~"));
+    dragon.hp = stringtoint(strtok(NULL, "~"));
+    dragon.defense = stringtoint(strtok(NULL, "~"));
+    dragon.death = strtok(NULL, "");
+
+    log ("loaded dragon: %s", dragon.name.c_str());
+
+    delete []buf;
+
+return save_dragon();  // Save the dragon file and return the status code :)
+}
+
+int save_dragon()
+{
+    ofstream outfile;
+
+    outfile.open(dragondata);
+
+    if (outfile.fail())
+    {
+       log ("Error opening %s. Exiting.", dragondata);
+       return 0;
+    }
+
+    outfile << dragon.name.c_str() << '~' << dragon.weapon.c_str() << '~' 
+               << dragon.strength << '~' << dragon.hp << '~' 
+               << dragon.defense << '~' << dragon.death.c_str() << "\n^"
+               << endl;
+
+outfile.close();
+
+return 1;
+}
+
+int load_store()
+{
+  ifstream infile;
+  char *buf;
+  item *tempItem;
+  buf = new char[1024];
+  long id;
+  
+  infile.open(storeitemdata);
+  
+  if (infile.fail())
+    {
+      log("Error opening %s", storeitemdata);
+      return 0;
+    }
+  
+  while (infile.getline(buf, 1024, '\n'))
+    {
+      try
+       {
+         if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0')
+           {
+             item *tempItem2;
+             id = stringtoint(strtok(buf, ""));
+             tempItem2 = findItemByID(id);
+             if (tempItem2 == NULL)
+               {
+                 log("Invalid ID in %s", storeitemdata);
+                 return 0;
+               }
+
+             tempItem = tempItem2;
+             store.push_back(tempItem);
+           }
+       }
+      catch (char *str)
+       {
+         log("Exception loading store: %s", str);
+         delete []buf;
+         return 0;
+       }
+    }
+  delete []buf;
+  return 1;
+}
+int load_tavern()
+{
+  ifstream infile;
+  char *buf;
+  tavernItem tempItem;
+  buf = new char[1024];
+  long id, level;
+
+  infile.open(tavernitemdata);
+  if (infile.fail())
+    {
+      log("Error opening %s", tavernitemdata);
+      return 0;
+    }
+
+  while (infile.getline(buf, 1024, '\n'))
+    {
+      try
+       {
+         if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0')
+           {
+             item *tempItem2;
+             id = stringtoint(strtok(buf, "~"));
+             level = stringtoint(strtok(NULL, ""));
+             tempItem2 = findItemByID(id);
+             if (tempItem2 == NULL)
+               {
+                 log("Invalid ID in %s", tavernitemdata);
+                 return 0;
+               }
+             tempItem.setItem(tempItem2);
+             tempItem.setLevel(level);
+             tavern.push_back(tempItem);
+           }
+       }
+      catch (char *str)
+       {
+         log("Exception loading tavern: %s", str);
+         delete []buf;
+         return 0;
+       }
+    }
+  delete []buf;
+  return 1;
+}
+int load_items()
+{
+  ifstream infile;
+  char *buf;
+  item *tempItem;
+  
+  buf = new char[1024];
+  
+  infile.open(itemdata);
+  
+  if (infile.fail())
+    {
+      log("Error opening %s", itemdata);
+      return 0;
+    }
+  
+  while (infile.getline(buf, 1024, '\n'))
+    {
+      if (buf[0] == '^')
+               break;
+      try
+               {
+                 if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0')
+                       {
+                         switch(buf[0])
+                               {
+                               case '1':
+                                 tempItem = new weapon();
+                                 break;
+                               case '2':
+                                 tempItem = new armor();
+                                 break;
+                               case '3':
+                                 tempItem = new potion();
+                                 break;
+                               default:
+                                 log("Invalid Item Type %c in %s", buf[0], itemdata);
+                                 delete []buf;
+                                 return 0;
+                                 break;
+                               }
+                         if(tempItem->setData(buf))
+                               {
+                                 Items.push_back(tempItem);
+                               }
+                       }
+               }
+      catch (char *str)
+               {
+                 log("Exception loading items: %s", str);
+                 delete []buf;
+                 return 0;
+               }
+    }
+  delete []buf;
+  return 1;
+}
+
+int load_gs_dbase()
+{
+  ifstream infile;
+  Player *p;
+  char *tempname, *buf, *password;
+  int tempnum;
+  buf = new char[100000];
+  
+  infile.open(playerdata);
+  
+  if (infile.fail())
+    {
+         log("Error opening %s", playerdata);
+         return 0;
+    }
+  
+  
+  for (int x = 0; x < U_TABLE_SIZE; x++)
+    {
+         list<Player*>::iterator iter;
+         
+         for (iter = players[x].begin(); iter != players[x].end(); iter++)
+               {
+                 logout((*iter)->getClient());
+                 delete (*iter);
+               }
+         players[x].clear();
+    }
+  
+  while (infile.getline(buf, 100000, '\n'))
+       {
+         tempname = strtok(buf, " ");
+         p = new Player(tempname);
+         
+         p->setLevel(stringtoint(strtok(NULL, " ")));
+         p->setExp(stringtoint(strtok(NULL, " ")));
+         p->setGold(stringtoint(strtok(NULL, " ")));
+         p->setBank(stringtoint(strtok(NULL, " ")));
+         tempnum = stringtoint(strtok(NULL, " "));
+         p->setMaxHP(stringtoint(strtok(NULL, " ")));
+         p->setHP(tempnum);
+         p->setStrength(stringtoint(strtok(NULL, " ")));
+         p->setDefense(stringtoint(strtok(NULL, " ")));
+         p->setForestFights(stringtoint(strtok(NULL, " ")));
+         p->setPlayerFights(stringtoint(strtok(NULL, " ")));
+         p->setFlags(stringtoint(strtok(NULL, " ")));
+  
+  
+         
+         password = strtok(NULL, " ");
+         p->setRawPassword(password);
+         tempname = strtok(NULL, " ");
+         
+         if (tempname)
+               p->lastlogin = stringtoint(tempname);
+         else
+               p->lastlogin = time(NULL);
+         
+         tempname = strtok(NULL, " ");
+         tempnum = stringtoint(tempname);
+         item *tempitem;
+         if (tempnum != 0)
+               {
+                 tempitem = findItemByID(tempnum);
+                 p->setWeapon(*tempitem);
+               }
+         
+         tempname = strtok(NULL, " ");
+         tempnum = stringtoint(tempname);
+         
+         if (tempnum != 0)
+               {
+                 tempitem = findItemByID(tempnum);
+                 p->setArmor(*tempitem);
+               }
+         
+         
+         unsigned long hv = iHASH((unsigned char *) p->getName().c_str());
+         
+         p->setClient(NULL);
+         
+         for (tempname = strtok(NULL, " "); tempname != NULL; tempname = strtok(NULL, " "))
+               {
+                 long int id, uses;
+                 list<item*>::iterator item_iter;
+                 id = stringtoint(tempname);
+                 tempname = strtok(NULL, " ");
+                 uses = stringtoint(tempname);
+                 
+                 item_iter = Items.begin();
+                 while (item_iter != Items.end())
+                       {
+                         if ((*item_iter)->getID() == id)
+                               {
+                                 // Don't sort every time you add an item or it eats CPU
+                                 p->inventory->addItemNoChecks((*item_iter))->setUses(uses);
+                               }
+                         item_iter++;
+                       }
+               }
+         p->inventory->sort();
+     myToplist.insertPlayer(p);
+         players[hv].push_back(p);
+       }
+
+  delete [] buf;
+  infile.close();
+  return 1;
+}
+
+bool load_levels()
+{
+  char *filename;
+  filename = new char[256];
+  
+  for (int x = 1; x <= LEVELS; x++)
+    {
+         sprintf(filename, "data/levels/level%d.dat", x);
+         if (levels[x - 1].loadLevel(filename) == false)
+               {
+                 delete []filename;
+                 return false;
+               }
+    }
+  
+  delete []filename;
+  return true;
+}
+
+bool load_monsters()
+{
+  char *filename;
+  ifstream infile;
+  char *buf;
+  buf = new char[2048];
+  
+  for (int level = 1; level <= LEVELS; level++)
+       {
+         filename = new char[256];
+         sprintf(filename, "data/monsters/level%d.dat", level);
+         infile.open(filename);
+         
+         if (!infile)
+               {
+                 log("Error opening %s", filename);
+                 delete []filename;
+                 delete []buf;
+                 return false;
+               }
+         
+#ifdef DEBUGMODE
+         log("Loading monsters from %s", filename);
+#endif
+         
+         while (infile.getline(buf, 2048))
+               {
+                 if (buf[0] == '^')
+                       break;
+                 if (buf[0] == '\n' || buf[0] == '\0' || buf[0] == '#')
+                       continue;
+                 Monster *temp;
+                 temp = new Monster;
+                 
+                 temp->name = strtok(buf, "~");
+                 temp->weapon = strtok(NULL, "~");
+                 temp->death = strtok(NULL, "~");
+                 
+                 levels[level - 1].monsters.push_back(temp);
+
+               }
+         delete [] filename;
+         infile.close();
+       }
+  delete [] buf;
+  return true;
+}
+
+
+
diff --git a/gameserv/strings.cpp b/gameserv/strings.cpp
new file mode 100755 (executable)
index 0000000..9a4d3a3
--- /dev/null
@@ -0,0 +1,123 @@
+ /* This file contains functions dealing with strings */
+ #include "extern.h"
+ #include "config.h"
+ // String functions
+#ifndef HAVE_STRTOK
+char *strtok(char *str, const char *delim);
+#endif
+
+int stricmp(const char *s1, const char *s2);
+int strnicmp(const char *s1, const char *s2, size_t len);
+// String Functions
+
+int stricmp(const char *s1, const char *s2)
+{
+    register int c;
+
+    while ((c = tolower(*s1)) == tolower(*s2)) {
+        if (c == 0)
+            return 0;
+        s1++;
+        s2++;
+    }
+    if (c < tolower(*s2))
+        return -1;
+    return 1;
+}
+
+
+
+char *spaces(int len, char *seperator)
+{
+    char *final;
+    final = new char[30];
+    int y;
+    strcpy(final, seperator);
+    for (y = 0; y < 30 - len; y++)
+        strcat(final, seperator);
+    return final;
+}
+
+
+
+int strnicmp(const char *s1, const char *s2, size_t len)
+{
+    register int c;
+
+    if (!len)
+        return 0;
+    while ((c = tolower(*s1)) == tolower(*s2) && len > 0) {
+        if (c == 0 || --len == 0)
+            return 0;
+        s1++;
+        s2++;
+    }
+    if (c < tolower(*s2))
+        return -1;
+    return 1;
+}
+
+#ifndef HAVE_STRTOK
+char *strtok(char *str, const char *delim)
+{
+    static char *current = NULL;
+    char *ret;
+
+    if (str)
+        current = str;
+    if (!current)
+        return NULL;
+    current += strspn(current, delim);
+    ret = *current ? current : NULL;
+    current += strcspn(current, delim);
+    if (!*current)
+        current = NULL;
+    else
+        *current++ = 0;
+    return ret;
+}
+#endif
+
+int isstringnum(char *num)
+{
+    unsigned int x;
+    for (x = 0; x < strlen(num); x++)
+    {
+        if ((int)num[x] < 48 || (int)num[x] > 57)
+            return 0;
+    }
+return 1;
+}
+
+long int stringtoint(char *number)
+{
+    return atol(number);
+}
+
+long int pow(int x, int y)
+{
+  long int value = 0;
+  int count = 0;
+  value += x;
+  
+  if (x != 0 && y != 0)
+    {
+         for (count = 1; count <= y - 1; count++)
+               value *= x;
+    }
+  else
+       {
+         return 1;
+       }
+  return value;
+}
+
+long int chartoint(char ch)
+{
+  if (int(ch) >= 48 && int(ch) <= 57)
+       return int(ch) - 48;
+  else
+       return 0;
+}