]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv/gameserv.cpp
updated the Change log w/ new additions
[irc/gameservirc.git] / gameserv / gameserv.cpp
index ee16c51cb51adacaa2be5f84725dd9879b7b3c8f..05ac73953b5b33518fc5e1718163c5d05e633b1e 100644 (file)
@@ -4,11 +4,11 @@
 #include "player.h"
 #include "pouch.h"
 #include "flags.h"
-#include "list.h"
 #include "level.h"
 #include "sockhelp.h"
 #include "item.h"
 
+#include <algorithm>
 #include <cctype>
 #include <fstream>
 #include <stdlib.h>
@@ -60,7 +60,7 @@ int strnicmp(const char *s1, const char *s2, size_t len);
 bool passcmp(const char *encrypted, char *plaintext); // Compares an encrypted pass with a plain text one
 
 bool check_password(char *name, char *plaintext); // Finds a password for the given name, and checks it with passcmp against the plaintext password given.
+
 /********** Password functions **********/
 
 
@@ -86,6 +86,7 @@ bool master_fight(aClient *user);
 bool dragon_fight(char *u); // True if the player is fighting the dragon.
 bool dragon_fight(aClient *user);
 
+bool alphaNumeric(const char *str); // Returns true if all of the characters in str are alphanumeric non-special chars
 /********** GameServ Booleans **********/
 
 void display_help(char *u, char *file = NULL);
@@ -152,198 +153,261 @@ int defbonus[11] = {2, 3, 5, 10, 15, 22, 35, 60, 80, 120, 150};
 
 void gameserv(char *source, char *buf)
 {
-    char *cmd, z;
-    cmd = strtok(buf, " ");
-
-    #ifndef P10
-        source++; // Get rid of that : at the beginning of a :Nick privmsg Gameserv :text
-    #endif
-
-    z = cmd[0];
-    if (z == ':')
-        cmd++;    // Get rid of that : at the beginning of the :text  (command)
-
-    #ifdef DEBUGMODE
-       log("Source: %s  Command: %s", source, cmd);
-    #endif
-
-    if (strnicmp(cmd, "\1PING", 6) == 0)
+  char *cmd, z;
+  cmd = strtok(buf, " ");
+  
+#ifndef P10
+  source++; // Get rid of that : at the beginning of a :Nick privmsg Gameserv :text
+#endif
+  
+  z = cmd[0];
+  if (z == ':')
+       cmd++;    // Get rid of that : at the beginning of the :text  (command)
+  
+#ifdef DEBUGMODE
+  log("Source: %s  Command: %s", source, cmd);
+#endif
+  
+  if (strnicmp(cmd, "\1PING", 6) == 0)
     {
-       char *ts;
-       ts = strtok(NULL, "\1");
-        notice(s_GameServ, source, "\1PING %s\1", ts);
-    } else if (stricmp(cmd, "\1VERSION\1") == 0) {
-       notice(s_GameServ, source, "\1VERSION %s %s\1", PACKAGE, VERSION);
-    } else if (stricmp(cmd, "SEARCH") == 0) {
-       cmd = strtok(NULL, " ");
-
-       if (!cmd)
+         char *ts;
+         ts = strtok(NULL, "\1");
+         notice(s_GameServ, source, "\1PING %s\1", ts);
+    }
+  else if (stricmp(cmd, "\1VERSION\1") == 0)
+       {
+         notice(s_GameServ, source, "\1VERSION %s %s\1", PACKAGE, VERSION);
+    }
+  else if (stricmp(cmd, "SEARCH") == 0)
+       {
+         cmd = strtok(NULL, " ");
+         
+         if (!cmd)
            notice(s_GameServ, source, "SYNTAX: /msg %S SEARCH FOREST");
-       else
+         else
            do_forest(source);
-
-    } else if (stricmp(cmd, "ADMIN") == 0) {
-       do_admin(source);
-    } else if (stricmp(cmd, "ATTACK") == 0) {
-       do_attack(source);
-    } else if (stricmp(cmd, "BANK") == 0) {
-       do_bank(source);
-    } else if (stricmp(cmd, "CHECK") == 0) {
-       do_check(source);
-    } else if (stricmp(cmd, "DRAGON") == 0) {
-       do_dragon(source);
-    } else if (stricmp(cmd, "EQUIP") == 0) {
+         
+    }
+  else if (stricmp(cmd, "ADMIN") == 0)
+       {
+         do_admin(source);
+    }
+  else if (stricmp(cmd, "ATTACK") == 0)
+       {
+         do_attack(source);
+    }
+  else if (stricmp(cmd, "BANK") == 0)
+       {
+         do_bank(source);
+    }
+  else if (stricmp(cmd, "CHECK") == 0)
+       {
+         do_check(source);
+    }
+  else if (stricmp(cmd, "DRAGON") == 0)
+       {
+         do_dragon(source);
+    }
+  else if (stricmp(cmd, "EQUIP") == 0)
+       {
       do_equip(source);
-    } else if (stricmp(cmd, "FIGHT") == 0) {
-       do_fight(source);
-    } else if (stricmp(cmd, "HEAL") == 0) {
-       do_heal(source);
-    } else if (stricmp(cmd, "HELP") == 0) {
-       do_help(source);
-    } else if (stricmp(cmd, "IDENTIFY") == 0) {
-       do_identify(source);
-    } else if (stricmp(cmd, "INVENTORY") == 0) {
-       do_inventory(source);
-    } else if (stricmp(cmd, "LIST") == 0) {
-       do_list(source);
-    } else if (stricmp(cmd, "LOGOUT") == 0) {
-       do_logout(source);
-    } else if (stricmp(cmd, "MASTER") == 0) {
-       do_master(source);
-    } else if (stricmp(cmd, "NEWS") == 0) {
-       do_news(source);
-    } else if (stricmp(cmd, "REGISTER") == 0) {
-       do_register(source);
-    } else if (stricmp(cmd, "REFRESH") == 0) {
-       do_refresh(source);
-    } else if (stricmp(cmd, "RESET") == 0) {
-       do_reset(source);
-    } else if (stricmp(cmd, "RUN") == 0) {
-       do_run(source);
-    } else if (stricmp(cmd, "SET") == 0) {
-       do_set(source);
-    } else if (stricmp(cmd, "STATS") == 0) {
-       do_stats(source);
-    } else if (stricmp(cmd, "STORE") == 0) {
-       do_store(source);
-    } else if (stricmp(cmd, "TAVERN") == 0) {
-       do_tavern(source);
-    } else if (stricmp(cmd, "USE") == 0) {
-       do_use(source);
-    } else if (stricmp(cmd, "SHUTDOWN") == 0) {
-       aClient *user;
-
-       if (!(user = find(source)))
-       {
-           notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
-               log("Error: aClient not found: %s", source);
-       }
-       else if (!isAdmin(user))
+    }
+  else if (stricmp(cmd, "FIGHT") == 0)
        {
-           notice(s_GameServ, source, "You must be a %S admin to use this command!");
-       }
-       else
+         do_fight(source);
+    }
+  else if (stricmp(cmd, "HEAL") == 0)
        {
-           save_gs_dbase();
-           #ifdef P10
-               raw("[] SQ %s 0 :leaving: %s used the Shutdown command.", servername, user->getRealNick());
-           #else
-               raw("SQUIT %s :leaving: %s used the Shutdown command.", servername, source);
-           #endif
-           shuttingdown = true;
-       }
-    } else if (stricmp(cmd, "SAVE") == 0) {
-       aClient *user;
-
-       if (!(user = find(source)))
+         do_heal(source);
+    }
+  else if (stricmp(cmd, "HELP") == 0)
        {
-           notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
-               log("Error: aClient not found: %s", source);
-       }
-       else if (!isAdmin(user))
+         do_help(source);
+    }
+  else if (stricmp(cmd, "IDENTIFY") == 0)
        {
-           notice(s_GameServ, source, "You must be a %S admin to use this command!");
-       }
-       else
-        {
-           save_gs_dbase();
-        }
-    } else if (stricmp(cmd, "LOAD") == 0) {
-       aClient *user;
-
-       if (!(user = find(source)))
+         do_identify(source);
+    }
+  else if (stricmp(cmd, "INVENTORY") == 0)
        {
-           notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
-           log("Error: aClient not found: %s", source);
-       }
-       else if (!isAdmin(user))
+         do_inventory(source);
+    }
+  else if (stricmp(cmd, "LIST") == 0)
        {
-           notice(s_GameServ, source, "You must be a %S admin to use this command!");
-       }
-       else
+         do_list(source);
+    }
+  else if (stricmp(cmd, "LOGOUT") == 0)
+       {
+         do_logout(source);
+    }
+  else if (stricmp(cmd, "MASTER") == 0)
+       {
+         do_master(source);
+    }
+  else if (stricmp(cmd, "NEWS") == 0)
+       {
+         do_news(source);
+    }
+  else if (stricmp(cmd, "REGISTER") == 0)
+       {
+         do_register(source);
+    }
+  else if (stricmp(cmd, "REFRESH") == 0)
+       {
+         do_refresh(source);
+    }
+  else if (stricmp(cmd, "RESET") == 0)
+       {
+         do_reset(source);
+    }
+  else if (stricmp(cmd, "RUN") == 0)
+       {
+         do_run(source);
+    }
+  else if (stricmp(cmd, "SET") == 0)
+       {
+         do_set(source);
+    }
+  else if (stricmp(cmd, "STATS") == 0)
+       {
+         do_stats(source);
+    }
+  else if (stricmp(cmd, "STORE") == 0)
+       {
+         do_store(source);
+    }
+  else if (stricmp(cmd, "TAVERN") == 0)
+       {
+         do_tavern(source);
+    }
+  else if (stricmp(cmd, "USE") == 0)
+       {
+         do_use(source);
+    }
+  else if (stricmp(cmd, "SHUTDOWN") == 0)
+       {
+         aClient *user;
+         
+         if (!(user = find(source)))
+               {
+                 notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
+                 log("Error: aClient not found: %s", source);
+               }
+         else if (!isAdmin(user))
+               {
+                 notice(s_GameServ, source, "You must be a %S admin to use this command!");
+               }
+         else
+               {
+                 save_gs_dbase();
+#ifdef P10
+                 raw("[] SQ %s 0 :leaving: %s used the Shutdown command.", servername, user->getRealNick());
+#else
+                 raw("SQUIT %s :leaving: %s used the Shutdown command.", servername, source);
+#endif
+                 shuttingdown = true;
+               }
+    }
+  else if (stricmp(cmd, "SAVE") == 0)
+       {
+         aClient *user;
+         
+         if (!(user = find(source)))
+               {
+                 notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
+                 log("Error: aClient not found: %s", source);
+               }
+         else if (!isAdmin(user))
+               {
+                 notice(s_GameServ, source, "You must be a %S admin to use this command!");
+               }
+         else
         {
-           char *cmd2 = strtok(NULL, " ");
-           if (!cmd2)
-           {
-               notice(s_GameServ, source, "Loading player data from %s", playerdata);
-               load_gs_dbase();
-           }
-           else if (stricmp(cmd2, "MONSTERS") == 0)
-           {
-               notice(s_GameServ, source, "Loading monster data");
-               load_monsters();
-           }
-           else
-               display_help(source, cmd);
-       }
-    #ifdef DEBUGMODE
-    } else if (stricmp(cmd, "RAW") == 0) {
-       aClient *user;
-
-       if (!(user = find(source)))
+                 save_gs_dbase();
+        }
+    }
+  else if (stricmp(cmd, "LOAD") == 0)
        {
-           notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
-               log("Error: aClient not found: %s", source);
+         aClient *user;
+         
+         if (!(user = find(source)))
+               {
+                 notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
+                 log("Error: aClient not found: %s", source);
+               }
+         else if (!isAdmin(user))
+               {
+                 notice(s_GameServ, source, "You must be a %S admin to use this command!");
+               }
+         else
+        {
+                 char *cmd2 = strtok(NULL, " ");
+                 if (!cmd2)
+                       {
+                         notice(s_GameServ, source, "Loading player data from %s", playerdata);
+                         load_gs_dbase();
+                       }
+                 else if (stricmp(cmd2, "MONSTERS") == 0)
+                       {
+                         notice(s_GameServ, source, "Loading monster data");
+                         load_monsters();
+                       }
+                 else
+                       {
+                         display_help(source, cmd);
+                       }
+               }
        }
-       else if (!isAdmin(user))
+#ifdef DEBUGMODE
+  else if (stricmp(cmd, "RAW") == 0)
        {
-           notice(s_GameServ, source, "You must be a %S admin to use this command!");
-       }
-       else
+         aClient *user;
+         
+         if (!(user = find(source)))
+               {
+                 notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin");
+                 log("Error: aClient not found: %s", source);
+               }
+         else if (!isAdmin(user))
+               {
+                 notice(s_GameServ, source, "You must be a %S admin to use this command!");
+               }
+         else
         {
-           char *rest = strtok(NULL, "");
-           raw("%s", rest);
-       }
-    } else if (stricmp(cmd, "PRINT") == 0) {
-       for (int x = 0; x < LEVELS; x++)
-           levels[x].monsters.print();
-    } else if (stricmp(cmd, "RANDOM") == 0) {
-       char *rstr = strtok(NULL, "");
-       range trange;
-       trange.setRange(rstr);
-       notice(s_GameServ, source, "Random number in that range: %d", trange.random());
-    #endif
-    } else {
-       aClient *user;
-       if ((user = find(source)))
+                 char *rest = strtok(NULL, "");
+                 raw("%s", rest);
+               }
+    }
+  else if (stricmp(cmd, "RANDOM") == 0)
        {
-           if (isIgnore(user))
-           {
-               #ifdef DEBUGMODE
-                   log("Ignoring %s.", user->getNick());
-               #endif
-           }
-           else
-           {
-               notice(s_GameServ, source, "Unknown command \002%s\002. Type /msg %S \002HELP\002 to get a list of commands.", cmd);
-           }
+         char *rstr = strtok(NULL, "");
+         range trange;
+         trange.setRange(rstr);
+         notice(s_GameServ, source, "Random number in that range: %d", trange.random());
        }
-    } 
+#endif
+  else
+       {
+         aClient *user;
+         if ((user = find(source)))
+               {
+                 if (isIgnore(user))
+                       {
+#ifdef DEBUGMODE
+                         log("Ignoring %s.", user->getNick());
+#endif
+                       }
+                 else
+                       {
+                         notice(s_GameServ, source, "Unknown command \002%s\002. Type /msg %S \002HELP\002 to get a list of commands.", cmd);
+                       }
+               }
+    }
 
-    #ifndef P10
-       source--;  // Bring the ':' back so we don't leak memory
-    #endif
-    if (z == ':')
+#ifndef P10
+  source--;  // Bring the ':' back so we don't leak memory
+#endif
+  if (z == ':')
        cmd--;     // Same thing :)
 }
 
@@ -364,61 +428,59 @@ int stricmp(const char *s1, const char *s2)
 
 void showstats(const char *u, const char *nick)
 {
-    aClient *ni, *sender = find(u);
+    aClient *sender = find(u);
+       Player *p;
     char *buf;
     buf = new char[50];
     char *space;
 
 
-    if (!(ni = findplayer(nick)))
+    if (!(p = findplayer(nick)))
          {
         notice(s_GameServ, u, "%s not found", nick);
          }
-    else if (ni->stats)
+    else
          {
-        notice(s_GameServ, sender->getNick(), "Stats for %s:", ni->stats->name.c_str());
+        notice(s_GameServ, sender->getNick(), "Stats for %s:", p->getName().c_str());
                
-        sprintf(buf, "Experience: %ld", ni->stats->exp);
+        sprintf(buf, "Experience: %ld", p->getExp());
         space = spaces(strlen(buf), " ");
         notice(s_GameServ, sender->getNick(), "%s%sLevel: %d",  buf, space,
-                          ni->stats->level);
+                          p->getLevel());
         delete [] space;
                
-        sprintf(buf, "Gold: %ld", ni->stats->gold);
+        sprintf(buf, "Gold: %ld", p->getGold());
         space = spaces(strlen(buf), " ");
-        notice(s_GameServ, sender->getNick(), "%s%sGold in Bank: %ld", buf, space, ni->stats->bank);
+        notice(s_GameServ, sender->getNick(), "%s%sGold in Bank: %ld", buf, space, p->getBank());
         delete [] space;
                
-        notice(s_GameServ, sender->getNick(), "Hit Points: %d of %d", ni->stats->hp,
-                          ni->stats->maxhp);
+        notice(s_GameServ, sender->getNick(), "Hit Points: %d of %d", p->getHP(),
+                          p->getMaxHP());
                
-        sprintf(buf, "Strength: %d", ni->stats->strength);
+        sprintf(buf, "Strength: %d", p->getStrength());
         space = spaces(strlen(buf), " ");
         notice(s_GameServ, sender->getNick(), "%s%sDefense: %d",
-                          buf, space, ni->stats->defense);
+                          buf, space, p->getDefense());
         delete [] space;
                
-        sprintf(buf, "Armor: %s", (ni->stats->getArmor() ? ni->stats->getArmor()->getName().c_str() : "Nothing"));
+        sprintf(buf, "Armor: %s", (p->getArmor() ? p->getArmor()->getName().c_str() : "Nothing"));
         space = spaces(strlen(buf), " ");
                
         notice(s_GameServ, sender->getNick(), "%s%sWeapon: %s", buf, space,
-                          (ni->stats->getWeapon() ? ni->stats->getWeapon()->getName().c_str() : "Fists"));
+                          (p->getWeapon() ? p->getWeapon()->getName().c_str() : "Fists"));
                
         delete [] space;
                
-        sprintf(buf, "Forest Fights: %d", ni->stats->forest_fights);
+        sprintf(buf, "Forest Fights: %d", p->getForestFights());
         space = spaces(strlen(buf), " ");
-        notice(s_GameServ, sender->getNick(), "%s%sPlayer Fights: %d", buf, space, ni->stats->player_fights);
+        notice(s_GameServ, sender->getNick(), "%s%sPlayer Fights: %d", buf, space, p->getPlayerFights());
         delete [] space;
-               if (ni == sender || isAdmin(sender))
+               if (p->getClient() == sender || isAdmin(sender))
                  {
-                       showinventory(ni->stats, sender);
+                       showinventory(p, sender);
                  }
          }
-    else
-         {
-               notice(s_GameServ, u, "%s is not playing!", ni->stats->name.c_str());
-         }
+
     delete [] buf;
 }
 
@@ -616,61 +678,63 @@ void do_check(char *u)
 
 void do_list(char *u)
 {
-    aClient *user;
-    char *cmd = strtok(NULL, " ");
-
-    if (!(user = find(u)))
+  aClient *user;
+  Player *p;
+  char *cmd = strtok(NULL, " ");
+  
+  if (!(user = find(u)))
     {
-       log("Fatal Error: Couldn't find %s in the client list", u);
-       return;
+         log("Fatal Error: Couldn't find %s in the client list", u);
+         return;
     }
-    else if (isIgnore(user))
+  else if (isIgnore(user))
     {
-       #ifdef DEBUGMODE
-           log("Ignoring %s. Command LIST", user->getNick());
-       #endif
-       return;
+#ifdef DEBUGMODE
+         log("Ignoring %s. Command LIST", user->getNick());
+#endif
+         return;
     }
-
-    ListNode<aClient> *temp;
-    bool header = false;
+  
+  list<Player*>::iterator iter;
+  bool header = false;
 
   for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
-  {
-    temp = players[x].First();
-    if (!players[x].isEmpty())
-    {
-       while(temp)
        {
-           if (cmd || is_playing(temp->getData()))
-           {
-               if (!header)
-               {
-                   notice(s_GameServ, u, "Players:");
-                   header = true;
-               }
-               #ifdef P10
-               notice(s_GameServ, u, "IRC: %s     Game: %s", temp->getData()->getRealNick(), 
-                       temp->getData()->stats->name.c_str());
-               #else
-               notice(s_GameServ, u, "IRC: %s     Game: %s", temp->getData()->getNick(), 
-                       temp->getData()->stats->name.c_str());
-               #endif
-           }
-
-           temp = temp->Next();
+         iter = players[x].begin();
+         if (!players[x].empty())
+               {
+                 while(iter != players[x].end())
+                       {
+                         p = (*iter);
+                         if (cmd || is_playing(p->getClient()))
+                               {
+                                 if (!header)
+                                       {
+                                         notice(s_GameServ, u, "Players:");
+                                         header = true;
+                                       }
+#ifdef P10
+                                 notice(s_GameServ, u, "IRC: %s     Game: %s", (p->getClient() ? p->getClient()->getRealNick() : "Not Playing"), 
+                                                p->getName().c_str());
+#else
+                                 notice(s_GameServ, u, "IRC: %s     Game: %s", (p->getClient() ? p->getClient()->getNick() : "Not Playing"), 
+                                                p->getName().c_str());
+#endif
+                               }
+                         iter++;
+                       }
+               }
        }
-    }
-   }
-    if (!header)
+  if (!header)
        notice(s_GameServ, u, "No one is playing");
-    else
-       notice(s_GameServ, u, "End of List");
-
+  else
+       notice(s_GameServ, u, "End of List"); 
 }
+
 void do_set(char *u)
 {
-  aClient *user, *target;
+  aClient *user;
+  Player *p;
   char *name = strtok(NULL, " ");
   char *cmd = strtok(NULL, " ");
   char *cmd2;
@@ -678,7 +742,7 @@ void do_set(char *u)
   if (!(user = find(u)))
     {
       notice(s_GameServ, u, "Fatal error. Cannot find aClient. "\
-            "Buf: %s LOGOUT", u);
+                        "Buf: %s LOGOUT", u);
       return;
     }
   else if (isIgnore(user))
@@ -688,866 +752,883 @@ void do_set(char *u)
 #endif
       return;
     }
-  else if (!name)
+  else if (!name || !cmd)
     {
       notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|ALIVE|SEEN MASTER} {STRING|NUMBER|TRUE|FALSE}");
       return;
     }
-  else if (!(target = findplayer(name)))
+  else if (!(p = findplayer(name)))
     {
       // Back the pointers up... they didn't send a name probably
-      cmd2= cmd;
+      cmd2 = cmd;
       cmd = name;
-      target = user;
-
+      p = user->stats;
+         
       if (!is_playing(user))
-       {
-         notice(s_GameServ, u, "You must be playing to set things for yourself!");
-         return;
-       }
+               {
+                 notice(s_GameServ, u, "You must be playing to set things for yourself!");
+                 return;
+               }
     }
   else
     {
       cmd2 = strtok(NULL, " ");
     }
-
+  if (!cmd2)
+       {
+         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|ALIVE|SEEN MASTER} {STRING|NUMBER|TRUE|FALSE}");
+         return;
+       }
+  
   // Regardless of the previous if/else, if it got here, we know we have the cmd pointer at the right spot.
   if (stricmp(cmd, "PASSWORD") == 0)
     {
       // Person is looking to change their password
       // If they're an admin, or it's theirself, allow it
       // cmd2 is pointing to the password now
-      if (isAdmin(user) || user == target)
-       {
-         target->stats->setPassword(cmd2);
-         notice(s_GameServ, u, "Password successfully changed");
-       }
-      else if (user != target && !isAdmin(user))
-       {
-         notice(s_GameServ, u, "You must be a %S admin to set other peoples' passwords.");
-         return;
-       }
+      if (isAdmin(user) || user == p->getClient())
+               {
+                 p->setPassword(cmd2);
+                 notice(s_GameServ, u, "Password successfully changed");
+               }
+      else if (user != p->getClient() && !isAdmin(user))
+               {
+                 notice(s_GameServ, u, "You must be a %S admin to set other peoples' passwords.");
+                 return;
+               }
     }
   else if (stricmp(cmd, "BANK") == 0 || stricmp(cmd, "BALANCE") == 0)
     {
-        if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;
-       }
-       else if (stricmp(cmd, "BANK") == 0)
-       {
-         cmd2 = strtok(NULL, " "); // Need an extra parameter for set bank balance
-       }
-       if (!cmd2)
-       {
-           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] [BANK] BALANCE <NUMBER>");
-           return;
-       }
-
-       target->stats->bank = stringtoint(cmd2);
-
-       // Cheap bounds checking
-       if (target->stats->bank > 2000000000)
-           target->stats->bank = 2000000000;
-       else if (target->stats->bank < 0)
-           target->stats->bank *= -1;
-
-       notice(s_GameServ, u, "Bank balance changed to %ld!", target->stats->bank);
+         if (!isAdmin(user))
+               {
+                 notice(s_GameServ, u, "Admins Only!");
+                 return;
+               }
+         else if (stricmp(cmd, "BANK") == 0)
+               {
+                 cmd2 = strtok(NULL, " "); // Need an extra parameter for set bank balance
+               }
+         if (!cmd2)
+               {
+                 notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] [BANK] BALANCE <NUMBER>");
+                 return;
+               }
+         
+         p->setBank(stringtoint(cmd2));
+         
+         notice(s_GameServ, u, "Bank balance changed to %ld!", p->getBank());
     }
   else if (stricmp(cmd, "PLAYER") == 0)
     {
       if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;
-       }
+               {
+                 notice(s_GameServ, u, "Admins Only!");
+                 return;
+               }
       else if (stricmp(cmd2, "FIGHTS") != 0)
-       {
-         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>");
-         return;
-       }
-      else
-       {
-         cmd2 = strtok(NULL, " ");
-           if (!cmd2)
-           {
-               notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>");
-               return;
-           }
-         target->stats->player_fights = stringtoint(cmd2);
-
-         if (target->stats->player_fights < 0)
-             target->stats->player_fights *= -1;
-
-         notice(s_GameServ, u, "Player fights changed to %d!", target->stats->player_fights);
-       }         
+               {
+                 notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>");
+                 return;
+               }
+      else
+               {
+                 cmd2 = strtok(NULL, " ");
+                 if (!cmd2)
+                       {
+                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>");
+                         return;
+                       }
+                 p->setPlayerFights(stringtoint(cmd2));
+                 
+                 notice(s_GameServ, u, "Player fights changed to %d!", p->getPlayerFights());
+               }         
     }
   else if (stricmp(cmd, "FOREST") == 0)
     {
       if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;
-       }
+               {
+                 notice(s_GameServ, u, "Admins Only!");
+                 return;
+               }
       else if (stricmp(cmd2, "FIGHTS") != 0)
-       {
-         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] FOREST FIGHTS <number>");
-         return;
-       }
+               {
+                 notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] FOREST FIGHTS <number>");
+                 return;
+               }
       else
-       {
-         cmd2 = strtok(NULL, " ");
-           if (!cmd2)
-           {
-               notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] FOREST FIGHTS <NUMBER>");
-               return;
-           }
-
-         target->stats->forest_fights = stringtoint(cmd2);
-
-         if (target->stats->forest_fights < 0)
-             target->stats->forest_fights *= -1;
-
-         notice(s_GameServ, u, "Forest fights changed to %d!", target->stats->forest_fights);
-       }         
+               {
+                 cmd2 = strtok(NULL, " ");
+                 if (!cmd2)
+                       {
+                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] FOREST FIGHTS <NUMBER>");
+                         return;
+                       }
+                 
+                 p->setForestFights(stringtoint(cmd2));
+                 
+                 notice(s_GameServ, u, "Forest fights changed to %d!", p->getForestFights());
+               }         
     }
   else if (stricmp(cmd, "GOLD") == 0)
-  {
-    if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;
-       }
-    else
-       {
-       if (!cmd2)
        {
-           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] GOLD <NUMBER>");
-           return;
+         if (!isAdmin(user))
+               {
+                 notice(s_GameServ, u, "Admins Only!");
+                 return;
+               }
+         else
+               {
+                 if (!cmd2)
+                       {
+                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] GOLD <NUMBER>");
+                         return;
+                       }
+                 p->setGold(stringtoint(cmd2));
+                 
+                 notice(s_GameServ, u, "Gold set to %ld", p->getGold());
+                 return;
+               }
        }
-         target->stats->gold = stringtoint(cmd2);
-
-         if (target->stats->gold > 2000000000)
-             target->stats->gold = 2000000000;
-         else if (target->stats->gold < 0)
-             target->stats->gold *= -1;
-
-         notice(s_GameServ, u, "Gold set to %ld", target->stats->gold);
-         return;
-       }
-  }
   else if (stricmp(cmd, "STRENGTH") == 0 && stricmp(cmd2, "POTIONS") != 0)
-  {
-    if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;         
-       }
-    else
-       {
-       if (!cmd2)
        {
-           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] STRENGTH <NUMBER>");
-           return;
+         if (!isAdmin(user))
+               {
+                 notice(s_GameServ, u, "Admins Only!");
+                 return;         
+               }
+         else
+               {
+                 if (!cmd2)
+                       {
+                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] STRENGTH <NUMBER>");
+                         return;
+                       }
+                 
+                 p->setStrength(stringtoint(cmd2));
+                 
+                 notice(s_GameServ, u, "Strength set to %d", p->getStrength());
+                 return;
+               }
        }
-
-         target->stats->strength = stringtoint(cmd2);
-
-         if (target->stats->strength < 0)
-               target->stats->strength *= -1;
-
-         notice(s_GameServ, u, "Strength set to %d", target->stats->strength);
-         return;
-       }
-  }
   else if (stricmp(cmd, "DEFENSE") == 0 && stricmp(cmd2, "POTIONS") != 0)
-  {
-    if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;         
-       }
-    else
-       {
-       if (!cmd2)
        {
-           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] DEFENSE <NUMBER>");
-           return;
+         if (!isAdmin(user))
+               {
+                 notice(s_GameServ, u, "Admins Only!");
+                 return;         
+               }
+         else
+               {
+                 if (!cmd2)
+                       {
+                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] DEFENSE <NUMBER>");
+                         return;
+                       }
+                 
+                 p->setDefense(stringtoint(cmd2));
+                 
+                 notice(s_GameServ, u, "Defense set to %d", p->getDefense());
+                 return;
+               }
        }
-
-         target->stats->defense = stringtoint(cmd2);
-
-         if (target->stats->defense < 0)
-               target->stats->defense *= -1;
-
-         notice(s_GameServ, u, "Defense set to %d", target->stats->defense);
-         return;
-       }
-  }
   else if (stricmp(cmd, "HP") == 0 && stricmp(cmd2, "POTIONS") != 0)
-  {
-    if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;         
-       }
-    else
-       {
-       if (!cmd2)
        {
-           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HP <NUMBER>");
-           return;
+         if (!isAdmin(user))
+               {
+                 notice(s_GameServ, u, "Admins Only!");
+                 return;         
+               }
+         else
+               {
+                 if (!cmd2)
+                       {
+                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HP <NUMBER>");
+                         return;
+                       }
+                 p->setHP(stringtoint(cmd2));
+                 
+                 notice(s_GameServ, u, "HP set to %d", p->getHP());
+                 return;
+               }
        }
-         target->stats->hp = stringtoint(cmd2);
-
-         if (target->stats->hp < 0)
-               target->stats->hp *= -1;
-
-         notice(s_GameServ, u, "HP set to %d", target->stats->hp);
-         return;
-       }
-  }
   else if (stricmp(cmd, "MAXHP") == 0)
-  {
-    if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;         
-       }
-    else
-       {
-       if (!cmd2)
        {
-           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] MAXHP <NUMBER>");
-           return;
+         if (!isAdmin(user))
+               {
+                 notice(s_GameServ, u, "Admins Only!");
+                 return;         
+               }
+         else
+               {
+                 if (!cmd2)
+                       {
+                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] MAXHP <NUMBER>");
+                         return;
+                       }
+                 p->setMaxHP(stringtoint(cmd2));
+                 
+                 notice(s_GameServ, u, "MaxHP set to %d", p->getMaxHP());
+                 return;
+               }
        }
-         target->stats->maxhp = stringtoint(cmd2);
-
-         if (target->stats->maxhp < 0)
-               target->stats->maxhp *= -1;
-
-         notice(s_GameServ, u, "MaxHP set to %d", target->stats->maxhp);
-         return;
-       }
-  }
   else if (stricmp(cmd, "EXPERIENCE") == 0 || stricmp(cmd, "EXP") == 0)
-  {
-    if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;         
-       }
-    else
-       {
-       if (!cmd2)
        {
-           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {EXPERIENCE|EXP} <NUMBER>");
-           return;
+         if (!isAdmin(user))
+               {
+                 notice(s_GameServ, u, "Admins Only!");
+                 return;         
+               }
+         else
+               {
+                 if (!cmd2)
+                       {
+                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {EXPERIENCE|EXP} <NUMBER>");
+                         return;
+                       }
+                 
+                 p->setExp(stringtoint(cmd2));
+                 
+                 notice(s_GameServ, u, "Exp set to %ld", p->getExp());
+                 return;
+               }
        }
-
-         target->stats->exp = stringtoint(cmd2);
-
-         if (target->stats->exp > 2000000000)
-               target->stats->exp = 2000000000;
-         else if (target->stats->exp < 0)
-               target->stats->exp *= -1;
-
-         notice(s_GameServ, u, "Exp set to %ld", target->stats->exp);
-         return;
-       }
-  }
   else if (stricmp(cmd, "LEVEL") == 0)
-  {
-    if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;         
-       }
-    else
-       {
-       if (!cmd2)
        {
-           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] LEVEL <NUMBER>");
-           return;
+         if (!isAdmin(user))
+               {
+                 notice(s_GameServ, u, "Admins Only!");
+                 return;         
+               }
+         else
+               {
+                 if (!cmd2)
+                       {
+                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] LEVEL <NUMBER>");
+                         return;
+                       }
+                 p->setLevel(stringtoint(cmd2));
+                 
+                 notice(s_GameServ, u, "Level set to %d", p->getLevel());
+                 return;
+               }
        }
-         target->stats->level = stringtoint(cmd2);
-
-         if (target->stats->level < 0)
-               target->stats->level = 1;
-         else if (target->stats->level > REALLEVELS)
-               target->stats->level = REALLEVELS;
-
-         notice(s_GameServ, u, "Level set to %d", target->stats->level);
-         return;
-       }
-  }
   else if (stricmp(cmd, "ALIVE") == 0)
-  {
-     if (!isAdmin(user))
        {
-         notice(s_GameServ, u, "Admins Only!");
-         return;
-       }
-     else
-       {
-         cmd2 = strtok(NULL, " ");
-         if (!cmd2 || (stricmp(cmd2, "TRUE") != 0 && stricmp(cmd2, "FALSE") != 0))
-         {
-            notice(s_GameServ, u, "SYNTAX: /msg %S SET ALIVE TRUE|FALSE");
-            return;
-         }
-         else if (stricmp(cmd2, "TRUE") == 0)
-         {
-            notice(s_GameServ, u, "%s has been Resurrected!", target->stats->name.c_str());
-            setAlive(target->stats);
-         }
+         if (!isAdmin(user))
+               {
+                 notice(s_GameServ, u, "Admins Only!");
+                 return;
+               }
          else
-         {
-            notice(s_GameServ, u, "%s is now dead!", target->stats->name.c_str());
-            clearAlive(target->stats);
-         }
+               {
+                 if (!cmd2)
+                       {
+                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] ALIVE TRUE|FALSE");
+                         return;
+                       }
+                 else if (stricmp(cmd2, "TRUE") == 0)
+                       {
+                         notice(s_GameServ, u, "%s has been Resurrected!", p->getName().c_str());
+                         setAlive(p);
+                       }
+                 else
+                       {
+                         notice(s_GameServ, u, "%s is now dead!", p->getName().c_str());
+                         clearAlive(p);
+                       }
+               }
        }
-  }
   else if (stricmp(cmd, "SEEN") == 0)
     {
       if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;
-       }
+               {
+                 notice(s_GameServ, u, "Admins Only!");
+                 return;
+               }
       else if (stricmp(cmd2, "MASTER") != 0)
-       {
-         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] SEEN MASTER {TRUE|FALSE}");
-         return;
-       }
+               {
+                 notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] SEEN MASTER {TRUE|FALSE}");
+                 return;
+               }
       else
-       {
-         cmd2 = strtok(NULL, " ");
-         if (!cmd2 || (stricmp(cmd2, "TRUE") != 0 && stricmp(cmd2, "FALSE") != 0))
-         {
-            notice(s_GameServ, u, "SYNTAX: /msg %S SET [NICK] SEEN MASTER {TRUE|FALSE}");
-            return;
-         }
-         else if (stricmp(cmd2, "TRUE") == 0)
-         {
-            notice(s_GameServ, u, "%s has seen their master now.", target->stats->name.c_str());
-            target->addFlag(FLAG_MASTER);
-         }
-         else
-         {
-            notice(s_GameServ, u, "%s has not seen their master now.", target->stats->name.c_str());
-            target->remFlag(FLAG_MASTER);
-         }
-       }         
+               {
+                 cmd2 = strtok(NULL, " ");
+                 if (!cmd2)
+                       {
+                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NICK] SEEN MASTER {TRUE|FALSE}");
+                         return;
+                       }
+                 else if (stricmp(cmd2, "TRUE") == 0)
+                       {
+                         notice(s_GameServ, u, "%s has seen their master now.", p->getName().c_str());
+                         p->addFlag(FLAG_MASTER);
+                       }
+                 else
+                       {
+                         notice(s_GameServ, u, "%s has not seen their master now.", p->getName().c_str());
+                         p->remFlag(FLAG_MASTER);
+                       }
+               }         
     }
   else
-  {
-     notice(s_GameServ, u, "Unknown command: SET %s", cmd);
-     notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|ALIVE|SEEN MASTER} {STRING|NUMBER|TRUE|FALSE}");
-     return;
-  }
+       {
+         notice(s_GameServ, u, "Unknown command: SET %s", cmd);
+         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|ALIVE|SEEN MASTER} {STRING|NUMBER|TRUE|FALSE}");
+         return;
+       }
 }
 
 void do_logout(char *u)
 {
-    aClient *user;
-    char *name = strtok(NULL, " ");
-
-    if (!(user = find(u)))
+  aClient *user;
+  Player *p;
+  char *name = strtok(NULL, " ");
+  
+  if (!(user = find(u)))
     {
-       notice(s_GameServ, u, "Fatal error. Cannot find aClient. "\
-               "Buf: %s LOGOUT", u);
-       log("Could not find aClient Buf: %s LOGOUT", 
-               u);
-       return;
+         notice(s_GameServ, u, "Fatal error. Cannot find aClient. "\
+                        "Buf: %s LOGOUT", u);
+         log("Could not find aClient Buf: %s LOGOUT", 
+                 u);
+         return;
     }
-    else if (isIgnore(user))
+  else if (isIgnore(user))
     {
-       #ifdef DEBUGMODE
-           log("Ignoring %s.", user->getNick());
-       #endif
-       return;
+#ifdef DEBUGMODE
+         log("Ignoring %s.", user->getNick());
+#endif
+         return;
     }
-
-    if (name)
+  
+  if (name)
     {
-       if (!isAdmin(user))
-       {
-           notice(s_GameServ, u, "You must be a %S admin to use this command!");
-       }
-       else if (!(user = findplayer(name)))
-       {
-           notice(s_GameServ, u, "Couldn't find a player named %s", name);
-       }
-       else
-       {
-           notice(s_GameServ, u, "Logging out %s", user->stats->name.c_str());
-           logout(user);
-       }
+         if (!isAdmin(user))
+               {
+                 notice(s_GameServ, u, "You must be a %S admin to use this command!");
+               }
+         else if (!(p = findplayer(name)))
+               {
+                 notice(s_GameServ, u, "Couldn't find a player named %s", name);
+               }
+         else
+               {
+                 notice(s_GameServ, u, "Logging out %s", p->getName().c_str());
+                 logout(p->getClient());
+               }
     }
-    else if (!name)
+  else if (!name)
     {
-       if (!is_playing(user))
-       {
-           notice(s_GameServ, u, "You're not logged in!");
-       }
-       else if (is_fighting(user))
-       {
-           notice(s_GameServ, u, "You can't logout while fighting!");
-       }
-       else
-       {
-           notice(s_GameServ, u, "You have left the fields. You have lived to kill another day!");
-           logout(user);
-       }
+         if (!is_playing(user))
+               {
+                 notice(s_GameServ, u, "You're not logged in!");
+               }
+         else if (is_fighting(user))
+               {
+                 notice(s_GameServ, u, "You can't logout while fighting!");
+               }
+         else
+               {
+                 notice(s_GameServ, u, "You have left the fields. You have lived to kill another day!");
+                 logout(user);
+               }
     }
 }
 
 void logout(aClient *user)
 {
-    if (is_playing(user))
+  if (user != NULL)
     {
-       ListNode<aClient> *it;
-       aClient *temp;
-       unsigned long hv = iHASH((unsigned char *) user->stats->name.c_str());
-       it = players[hv].Find(user);
-
-        if (!it)
-        {
-            notice(s_GameServ, user->getNick(), "Fatal error. Contact "\
-               "%S Admin. Cannot find you in the players list.");
-           log("Error on logout(). Can't find %s in the players list",
-               #ifdef P10 
-                   user->getRealNick()
-               #else 
-                   user->getNick()
-               #endif
-               );
-            return;
-        }
-
-       temp = new aClient;
-       temp->stats = new Player;
-       temp->stats->setData(user->stats);
-       user->stats->client = NULL;
-
-       if (player_fight(user))
-           user->stats->battle->stats->battle = NULL;
-
-       delete user->stats;
+         if (user->stats != NULL)
+               {
+               
+                 list<Player*>::iterator iter;
+                 unsigned long hv = iHASH((unsigned char *) user->stats->getName().c_str());
+                 iter = find(players[hv].begin(), players[hv].end(), user->stats);
+                 
+                 if (iter == players[hv].end())
+                       {
+                         notice(s_GameServ, user->getNick(), "Fatal error. Contact "\
+                                        "%S Admin. Cannot find you in the players list. This should NEVER happen");
+                         log("Error on logout(). Can't find %s in the players list",
+#ifdef P10 
+                                 user->getRealNick()
+#else 
+                                 user->getNick()
+#endif
+                                 );
+                         user->stats = NULL;
+                         
+                         return;
+                       }
+                 user->stats->delMonster();
+                 user->stats->delMaster();
+                 user->stats->delBattle();
+                 clearDragonFight(user->stats);
+                 clearYourTurn(user->stats);
+                 clearPlaying(user);
+                 
+                 user->stats->setClient(NULL);
+                 
+                 
+                 if (player_fight(user))
+                       {
+                         clearYourTurn(user->stats->getBattle()->stats);
+                         user->stats->getBattle()->stats->delBattle();
+                       }
+                 
+#ifdef DEBUGMODE
+                 log("Logged out player %s",
+#ifdef P10 
+                         user->getRealNick()
+#else 
+                         user->getNick()
+#endif 
+                         );
+#endif
+               }
+       }
+  if (user)
        user->stats = NULL;
-       temp->stats->client = NULL;
-       #ifdef P10
-           temp->setRealNick("Not Playing");
-       #endif
-       temp->setNick("Not Playing");
-
-       it->setNewPtr(temp);
-       #ifdef DEBUGMODE
-           log("Logged out player %s",
-               #ifdef P10 
-                   user->getRealNick()
-               #else 
-                   user->getNick()
-               #endif 
-               );
-       #endif
-    }
-    clearPlaying(user);
 }
 
 void do_register(char *u)
 {
-    char *password, *name;
-    aClient *user;
-    name = strtok(NULL, " ");
-    password = strtok(NULL, " ");
-
-    if (!name)
+  char *password, *name;
+  aClient *user;
+  Player *p;
+  name = strtok(NULL, " ");
+  password = strtok(NULL, " ");
+  
+  if (!name)
     {
-       notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD");
+         notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD");
     }
-    else if (stricmp(name, s_GameServ) == 0)
+  else if (stricmp(name, s_GameServ) == 0)
     {
-       notice(s_GameServ, u, "You can't use %S as a name!");
-       return;
+         notice(s_GameServ, u, "You can't use %S as a name!");
     }
-    else if (!password)
+  else if (!password)
     {
-       notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD");
+         notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD");
     }
-    else if ((user = findplayer(name)))
+  else if (strlen(name) > maxnicklen)
+       {
+         notice(s_GameServ, u, "Name too long. Maximum length: %d", maxnicklen);
+       }
+  else if (!alphaNumeric(name))
+       {
+         notice(s_GameServ, u, "That is not a valid name. Please use only AlphaNumeric (A-Z, 0-9) characters!");
+       }
+  else if ((p = findplayer(name)))
     {
-       notice(s_GameServ, u, "%s is already registered!", name);
-       notice(s_GameServ, u, "Choose another name!");
+         notice(s_GameServ, u, "%s is already registered!", name);
+         notice(s_GameServ, u, "Choose another name!");
     }
-    else if (!(user = find(u)))
+  else if (!(user = find(u)))
     {
-       log("Fatal Error: Couldn't find %s in the clients list", u);
+         log("Fatal Error: Couldn't find %s in the clients list", u);
     }
-    else if (isIgnore(user))
+  else if (isIgnore(user))
     {
-       #ifdef DEBUGMODE
-           log("Ignoring %s.", user->getNick());
-       #endif
-       return;
+#ifdef DEBUGMODE
+         log("Ignoring %s.", user->getNick());
+#endif
     }
-    else
+  else
     {
-        if (!is_playing(user))
+         if (!is_playing(user))
         {
-           ListNode<aClient> *temp;
-           item *tempItem;
-           user->stats = new Player();
-           user->stats->client = user; // Set the backwards pointer
-           user->stats->reset(); // set the user up
-           user->stats->setPassword(password);
-           user->stats->name = name;
-           unsigned long hv = iHASH((unsigned char *) name);
-           updateTS(user->stats);
-           temp = players[hv].insertAtBack_RLN(user);
-           temp->setPtr(user); // This is an extra step, but necessary for now
-
-           // Update the last login time
-           user->stats->lastlogin = time(NULL);
-
-           notice(s_GameServ, u, "Player %s registered with password %s.", user->stats->name.c_str(), password);
-           notice(s_GameServ, u, "Write this password down. If you lose it, there is no way to retrieve it!");
-           log("Nickname %s registered player %s.", u, user->stats->name.c_str());
-           setPlaying(user); // set the playing flag
-           tempItem = findItemByID(3001);
-           user->stats->inventory->addItem((*Items.begin())); // Add the stick
-           user->stats->inventory->addItem(tempItem); // Add Clothes
-       }
-       else
-       {
-           notice(s_GameServ, u, "Already registered. Contact a %S admin for help.");
-       }
+                 item *tempItem;
+                 unsigned long hv = iHASH((unsigned char *) name);
+
+                 // First create the Player
+                 user->stats = new Player();
+
+                 // Set the backwards pointer
+                 user->stats->setClient(user);
+
+                 // Set the player's password
+                 user->stats->setPassword(password);
+
+                 // Set the player's name
+                 user->stats->setName(name);
+
+                 // Make sure they have a proper time stamp
+                 updateTS(user->stats);
+
+                 // Update the last login time
+                 user->stats->lastlogin = time(NULL);
+                 
+                 // Send notification of success
+                 notice(s_GameServ, u, "Player %s registered with password %s.", user->stats->getName().c_str(), password);
+                 notice(s_GameServ, u, "Write this password down. If you lose it, there is no way to retrieve it!");
+
+                 // Log the new player
+                 log("Nickname %s registered player %s.", u, user->stats->getName().c_str());
+
+                 // Log the player in
+                 setPlaying(user);
+
+                 // Start the player at the beginning
+                 reset(user->stats);
+                 
+                 // Add the stick and clothes
+                 tempItem = findItemByID(3001);
+                 user->stats->inventory->addItem((*Items.begin()))->use(user->stats); // Add the stick
+                 user->stats->inventory->addItem(tempItem)->use(user->stats); // Add Clothes
+
+                 // Add the player to the list
+                 players[hv].push_back(user->stats);
+               }
+         else
+               {
+                 notice(s_GameServ, u, "Already registered. Contact a %S admin for help.");
+               }
     }
 }
 
 void do_identify(char *u)
 {
-    char *password, *name;
-    aClient *user, *p;
-    name = strtok(NULL, " ");
-    password = strtok(NULL, " ");
-    if (!password || !name)
+  char *password, *name;
+  aClient *user;
+  Player *p;
+  name = strtok(NULL, " ");
+  password = strtok(NULL, " ");
+  if (!password || !name)
     {
-       notice(s_GameServ, u, "SYNTAX: /msg %S IDENTIFY NAME PASSWORD");
+         notice(s_GameServ, u, "SYNTAX: /msg %S IDENTIFY NAME PASSWORD");
     }
-    else if (!(user = find(u)))
+  else if (!(user = find(u)))
     {
-       notice(s_GameServ, u, "Fatal error. Cannot find aClient. Buf: %s", strtok(NULL, ""));
-       log("Error: aClient not found: %s", u);
+         notice(s_GameServ, u, "Fatal error. Cannot find aClient. Buf: %s", strtok(NULL, ""));
+         log("Error: aClient not found: %s", u);
     }
-    else if (isIgnore(user))
+  else if (isIgnore(user))
     {
-       #ifdef DEBUGMODE
-           log("Ignoring %s.", user->getNick());
-       #endif
-       return;
+#ifdef DEBUGMODE
+         log("Ignoring %s.", user->getNick());
+#endif
+         return;
     }
-    else if (!(p = findplayer(name)) || !p->stats)
-           notice(s_GameServ, u, "Player %s not found", name);
-    else if (is_playing(user))
+  else if (!(p = findplayer(name)))
+       {
+         notice(s_GameServ, u, "Player %s not found", name);
+       }
+  else if (is_playing(user))
     {
-       notice(s_GameServ, u, "You are already playing!");
+         notice(s_GameServ, u, "You are already playing!");
     }
-    else if (p->stats->client != NULL && !isAdmin(user))
+  else if (is_playing(p->getClient()) && !isAdmin(user))
     {
-       notice(s_GameServ, u, "That player has already identified.");
+         notice(s_GameServ, u, "That player has already identified.");
     }
-    else if (!check_password(name, password) && !isAdmin(user))
+  else if (!check_password(name, password) && !isAdmin(user))
     {
-           notice(s_GameServ, u, "Password incorrect");
+         notice(s_GameServ, u, "Password incorrect");
     }
-    else {
-       ListNode<aClient> *temp;
-       unsigned long hv = iHASH((unsigned char *) p->stats->name.c_str());
-       temp = players[hv].Find(p);
-       if (!temp)
-       {
-           notice(s_GameServ, u, "Fatal error. Contact %S Admin. Buf: %s", 
-               strtok(NULL, ""));
-           return;
-       }
-       user->stats = new Player(p->stats->name);
-       #ifdef DEBUGMODE
-           log("Setting data for identified");
-       #endif
-       user->stats->setData(p->stats);
-       user->stats->client = user;
-       updateTS(user->stats);
-
-
-       #ifdef DEBUGMODE
-           log("Player %s IRC: %s Identified", user->stats->name.c_str(), 
-               user->getNick());
-       #endif
-
-       setPlaying(user); // set the playing flag
+  else
+       {
+         list<Player*>::iterator iter;
+         unsigned long hv = iHASH((unsigned char *) p->getName().c_str());
 
-       temp->setPtr(user);
+         iter = find(players[hv].begin(), players[hv].end(), p);
 
-       // Update the last login time
-       user->stats->lastlogin = time(NULL);
+         if (iter == players[hv].end())
+               {
+                 notice(s_GameServ, u, "Fatal error. Contact %S Admin. Buf: %s", 
+                                strtok(NULL, ""));
+                 return;
+               }
+         // Make sure the other user is logged out
+         logout(p->getClient());
+         
+         user->stats = p;
+         p->setClient(user);
+         updateTS(p);
+               
+               
+#ifdef DEBUGMODE
+           log("Player %s IRC: %s Identified", user->stats->getName().c_str(), 
+                       user->getNick());
+#endif
+               //Set the playing flag
+               setPlaying(user);
+               
+               // Update the last login time
+               user->stats->lastlogin = time(NULL);
 
-       notice(s_GameServ, u, "Password Accepted. Identified.");
-       showNews(u, todaysnews);
+               notice(s_GameServ, u, "Password Accepted. Identified.");
+               showNews(u, todaysnews);
     }
 }
 
 void do_stats(char *u)
 {
-    char *nick;
-    aClient *user;
-
-    nick = strtok(NULL, " ");
-
-    if (!(user = find(u)))
+  char *nick;
+  aClient *user;
+  
+  nick = strtok(NULL, " ");
+  
+  if (!(user = find(u)))
     {
-       log("Fatal Error: %s not found in client list", u);
-       return;
+         log("Fatal Error: %s not found in client list", u);
+         return;
     }
-    else if (isIgnore(user))
+  else if (isIgnore(user))
     {
-       #ifdef DEBUGMODE
-           log("Ignoring %s.", user->getNick());
-       #endif
-       return;
+#ifdef DEBUGMODE
+         log("Ignoring %s.", user->getNick());
+#endif
+         return;
     }
-    else if (!nick)
+  else if (!nick)
     {
-       if (!is_playing(user))
-       {
-           notice(s_GameServ, u, "You're not playing, so you have no stats!");
-           return;
-       }
-       else
-       {
-           updateTS(user->stats);
-           showstats(u, user->stats->name.c_str());
-       }
+         if (!is_playing(user))
+               {
+                 notice(s_GameServ, u, "You're not playing, so you have no stats!");
+                 return;
+               }
+         else
+               {
+                 if (!is_fighting(user))
+                       updateTS(user->stats);
+                 showstats(u, user->stats->getName().c_str());
+               }
     }
-    else
+  else
        showstats(u, nick);
 }
 
 bool load_masters()
 {
-    ifstream infile(masterdata);
-    char *buf;
-    int l = 0;
-    buf = new char[1024];
-
-    if (infile.fail())
+  ifstream infile(masterdata);
+  char *buf;
+  int l = 0;
+  buf = new char[1024];
+  
+  if (infile.fail())
     {
-       log("Error opening %s", masterdata);
-       return false;
+         log("Error opening %s", masterdata);
+         return false;
     }
-
-    #ifdef DEBUGMODE
-       log("Loading masters from %s", masterdata);
-    #endif
-
-    for (l = 0; l < LEVELS - 1; l++)
+  
+#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] == '^')
+         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, "~");
+         
+         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;
+         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
+  delete []buf;
+  
+  if (l < LEVELS - 1)  // We didn't load a master for every level - check data/masters.dat
        return false;
-    else
+  else
        return true;
 }
 
 void delete_monsters()
 {
-    for (int x = 0; x < LEVELS; x++)
-       levels[x].monsters.deleteNodes();
+  for (int x = 0; x < LEVELS; x++)
+       levels[x].monsters.clear();
 }
 
 void display_monster(char *u)
 {
-    if (is_playing(u))
+  if (is_playing(u))
     {
-       aClient *user = find(u);
-       Player *ni = user->stats;
-       
-       notice(s_GameServ, u, "Your Hitpoints: \ 2%d\ 2", ni->hp);
-       notice(s_GameServ, u, "%s's Hitpoints: \ 2%d\ 2", ni->fight->name.c_str(), ni->fight->hp);
-       notice(s_GameServ, u, "Here are your commands:");
-       notice(s_GameServ, u, "/msg %S attack");
-       notice(s_GameServ, u, "/msg %S run");
-       notice(s_GameServ, u, "What will you do?");
+         aClient *user = find(u);
+         Player *ni = user->stats;
+         
+         notice(s_GameServ, u, "Your Hitpoints: \ 2%d\ 2", ni->getHP());
+         notice(s_GameServ, u, "%s's Hitpoints: \ 2%d\ 2", ni->getMonster()->name.c_str(), ni->getMonster()->hp);
+         notice(s_GameServ, u, "Here are your commands:");
+         notice(s_GameServ, u, "/msg %S attack");
+         notice(s_GameServ, u, "/msg %S run");
+         notice(s_GameServ, u, "What will you do?");
     }
 }
 
 void display_players(char *u)
 {
-    aClient *user;
-    if (!(user = find(u)))
+  aClient *user;
+  if (!(user = find(u)))
     {
-       log("Fatal error in display_players(): Couldn't find %s", u);
+         log("Fatal error in display_players(): Couldn't find %s", u);
     }
-    else
+  else
        display_players(user);
 }
 
 void display_players(aClient *user)
 {
-    char *u = user->getNick();
-    if (is_playing(user) && player_fight(user))
+  char *u = user->getNick();
+  if (is_playing(user) && player_fight(user))
     {
-       aClient *battle = user->stats->battle;
-       notice(s_GameServ, u, "Your Hitpoints: \ 2%d\ 2", user->stats->hp);
-       notice(s_GameServ, u, "%s's Hitpoints: \ 2%d\ 2", battle->stats->name.c_str(), battle->stats->hp);
-       notice(s_GameServ, u, "Here are your commands:");
-       notice(s_GameServ, u, "/msg %S attack");
-       notice(s_GameServ, u, "/msg %S run");
-       notice(s_GameServ, u, "What will you do?");
+         aClient *battle = user->stats->getBattle();
+         notice(s_GameServ, u, "Your Hitpoints: \ 2%d\ 2", user->stats->getHP());
+         notice(s_GameServ, u, "%s's Hitpoints: \ 2%d\ 2", battle->stats->getName().c_str(), battle->stats->getHP());
+         notice(s_GameServ, u, "Here are your commands:");
+         notice(s_GameServ, u, "/msg %S attack");
+         notice(s_GameServ, u, "/msg %S run");
+         notice(s_GameServ, u, "What will you do?");
     }
 }
 
 
 bool is_playing(char *u)
 {
-    aClient *user;
-    if (!(user = find(u)))
+  aClient *user;
+  if (!(user = find(u)))
        return false;
-    else
+  else
        return is_playing(user);
 }
 
 bool is_playing(aClient *user)
 {
-    if (user->stats == NULL)
+  if (!user)
     {
-       return false;
+         return false;
     }
-    else if (user->stats->client == NULL)
+  else if (!user->stats)
+       {
+         return false;
+       }
+  else if (!FL_is_playing(user))
     {
-       return false;
+         return false;
     }
-    else if (!FL_is_playing(user))
+  else if (user->stats->getClient() != user)
     {
-       return false;
+         return false;
     }
-    else
+  else
        return true;
 }
 
 bool is_fighting(char *u)
 {
-    aClient *user;
-
-    if (!(user = find(u)))
+  aClient *user;
+  
+  if (!(user = find(u)))
        return false;
-    else
+  else
        return is_fighting(user);
 }
 
 bool is_fighting(aClient *user)
 {
-    if (!is_playing(user))
+  if (!is_playing(user))
        return false;
-    else
-       return player_fight(user) || master_fight(user) || user->stats->fight != NULL;
+  else
+       return player_fight(user) || master_fight(user) || user->stats->getMonster() != NULL;
 }
 
 bool player_fight(char *u)
 {
-    aClient *user;
-
-    if (!(user = find(u)))
+  aClient *user;
+  
+  if (!(user = find(u)))
        return false;
-    else 
+  else 
        return player_fight(user);
 }
 
 bool player_fight(aClient *user)
 {
-    if (!is_playing(user))
+  if (!is_playing(user))
        return false;
-    else if (user->stats->battle != NULL && is_playing(user->stats->battle))
+  else if (is_playing(user->stats->getBattle()))
     {
-       return user->stats->battle->stats != NULL;
+         return true;
     }
-    return false;
+  return false;
 }
 
 bool master_fight(char *u)
 {
-    aClient *user;
-
-    if (!(user = find(u)))
+  aClient *user;
+  
+  if (!(user = find(u)))
        return false;
-    else
+  else
        return master_fight(user);
 }
 
 bool master_fight(aClient *user)
 {
-    if (!is_playing(user))
+  if (!is_playing(user))
        return false;
-    else
-       return user->stats->master != NULL;
+  else
+       return user->stats->getMaster() != NULL;
 }
 
 bool dragon_fight(char *u)
 {
-    aClient *user;
-    if (!(user = find(u)))
+  aClient *user;
+  if (!(user = find(u)))
        return false;
-    else
+  else
        return dragon_fight(user);
 }
 
 bool dragon_fight(aClient *user)
 {
-    if (!is_playing(user))
+  if (!is_playing(user))
        return false;
-    else
+  else
        return (isDragonFight(user->stats));
 }
+
+bool alphaNumeric(const char *str)
+{
+  int len = strlen(str);
+  for (int x = 0; x < len; x++)
+       {
+         if (!((int(str[x]) >= 65 && int(str[x]) <= 90) || (int(str[x]) >= 97 && int(str[x]) <= 122) || (int(str[x]) >= 48 && int(str[x]) <= 57) || int(str[x]) == 95))
+               return false;
+       }
+  return true;
+}
+
 void do_fight(char *u)
 {
-  aClient *ni, *battle;
+  aClient *ni;
+  Player *battle;
   
   char *nick = strtok(NULL, " ");
   
@@ -1576,9 +1657,9 @@ void do_fight(char *u)
   
   updateTS(ni->stats);
   
-  if (ni->stats->player_fights <= 0)
+  if (ni->stats->getPlayerFights() <= 0)
     {
-         ni->stats->player_fights = 0; // just to be safe
+         ni->stats->setPlayerFights(0); // just to be safe
          notice(s_GameServ, u, "You are out of player fights for the "\
                         "day. You have to wait until tomorrow!");
     }
@@ -1590,7 +1671,7 @@ void do_fight(char *u)
     {
          notice(s_GameServ, u, "You are dead. Wait until tomorrow to fight others!");
     }
-  else if (!is_playing(battle))
+  else if (!is_playing(battle->getClient()))
     {
          notice(s_GameServ, u, "You can't attack %s while they aren't playing!", nick);
     }
@@ -1609,63 +1690,67 @@ void do_fight(char *u)
         display_players(u);
         }
   */
-  else if (stricmp(ni->stats->name.c_str(), battle->stats->name.c_str()) == 0)
+  else if (stricmp(ni->stats->getName().c_str(), battle->getName().c_str()) == 0)
     {
          notice(s_GameServ, u, "Are you trying to commit suicide!?");
     }
-  else if (!isAlive(battle->stats))
+  else if (!isAlive(battle))
     {
          notice(s_GameServ, u, "They are dead. Cannot fight dead players!");
     }
-  else if (player_fight(battle))
+  else if (player_fight(battle->getClient()))
     {
-         notice(s_GameServ, u, "%s is fighting %s already!", battle->stats->name.c_str(), battle->stats->battle->stats->name.c_str());
+         notice(s_GameServ, u, "%s is fighting %s already!", battle->getName().c_str(), battle->getBattle()->stats->getName().c_str());
     }
-  else if (master_fight(battle))
+  else if (master_fight(battle->getClient()))
     {
-         notice(s_GameServ, u, "%s is fighting their master!", battle->stats->name.c_str());
+         notice(s_GameServ, u, "%s is fighting their master!", battle->getName().c_str());
     }
-  else if (is_fighting(battle))
+  else if (is_fighting(battle->getClient()))
     {
-         notice(s_GameServ, u, "%s is fighting %s already!", battle->stats->name.c_str(), battle->stats->fight->name.c_str());
+         notice(s_GameServ, u, "%s is fighting %s already!", battle->getName().c_str(), battle->getMonster()->name.c_str());
     }
-  else if (ni->stats->level - battle->stats->level > maxbfightdistance)
+  else if (!isAdmin(ni) && isFairFights() && (ni->stats->getStrength()/2 - battle->getDefense()) > battle->getHP())
+    {
+         notice(s_GameServ, u, "Fair fighting is enabled, and you're too strong for %s!", battle->getName().c_str());
+    } 
+  else if (ni->stats->getLevel() - battle->getLevel() > maxbfightdistance)
     {
          // You can't fight someone below you by more than X level(s)
          // level 12 can fight level (12 - X) but not < (12 - X)
          notice(s_GameServ, u, "You may not fight %s. You're too strong!", 
-                        battle->stats->name.c_str());
+                        battle->getName().c_str());
     }
-  else if (battle->stats->level - ni->stats->level > maxafightdistance)
+  else if (battle->getLevel() - ni->stats->getLevel() > maxafightdistance)
     {
          // You can't fight someone above you by more than X level(S)
          // level 1 can fight level (1 + X), but not > (1 + X)
          notice(s_GameServ, u, "%s, do you really have a death wish? Try the forest you "\
-                        "weakling!", ni->stats->name.c_str());
+                        "weakling!", ni->stats->getName().c_str());
     }
   else
        {
          // Set your battle pointer to the other player
-         ni->stats->battle = battle;
+         ni->stats->setBattle(battle->getClient());
          
          // Set the other player's battle pointer to you
-         ni->stats->battle->stats->battle = ni;
-         
+         battle->setBattle(ni);
+                 
          // The initiator gets the first move (perhaps this should be 50/50)
          setYourTurn(ni->stats);
-         clearYourTurn(battle->stats);
+         clearYourTurn(battle);
          
          // Initiate Battle sequence!
-         ni->stats->player_fights -= 1;
+         ni->stats->subtractPlayerFights(1);
          
-         notice(s_GameServ, u, "You challenge %s to an online duel!", battle->stats->name.c_str());
+         notice(s_GameServ, u, "You challenge %s to an online duel!", battle->getName().c_str());
          notice(s_GameServ, c_Forest, "%s walks up and hits %s in the face! Let's see who will bite the dust.",
-                        ni->stats->name.c_str(), battle->stats->name.c_str()); /* DrLnet - Modified by Kain*/
+                        ni->stats->getName().c_str(), battle->getName().c_str()); /* DrLnet - Modified by Kain*/
          
-         notice(s_GameServ, battle->getNick(), "%s has challenged you to an online duel!", ni->stats->name.c_str());
-         notice(s_GameServ, battle->getNick(), "%s gets to go first "\
-                        "because they initiated!", ni->stats->name.c_str());
-         notice(s_GameServ, battle->getNick(), "Please wait while %s decides what to do.", ni->stats->name.c_str());
+         notice(s_GameServ, battle->getClient()->getNick(), "%s has challenged you to an online duel!", ni->stats->getName().c_str());
+         notice(s_GameServ, battle->getClient()->getNick(), "%s gets to go first "\
+                        "because they initiated!", ni->stats->getName().c_str());
+         notice(s_GameServ, battle->getClient()->getNick(), "Please wait while %s decides what to do.", ni->stats->getName().c_str());
          display_players(ni);
        }
 }
@@ -1703,7 +1788,8 @@ void do_equip(char *u)
       return;
     }
   id = stringtoint(item);
-  updateTS(user->stats);
+  if (!is_fighting(user))
+       updateTS(user->stats);
   p = user->stats->inventory;
 
 
@@ -1726,16 +1812,18 @@ void do_equip(char *u)
                equip->use(user->stats);
       }
 }
+
 void do_use(char *u)
 {
   aClient *user;
   pouch *p;
   
   char *item = strtok(NULL, " ");
-  int id;
+  char *numuse = strtok(NULL, " ");
+  int id, num;
   itemContainer *used;
   
-  if (!item || int(item[0]) < 48 || int(item[0]) > 57)
+  if (!item || int(item[0]) < 48 || int(item[0]) > 57 || (numuse && (int(numuse[0]) < 48 || int(numuse[0]) > 57)))
     {
          notice(s_GameServ, u, "SYNTAX: USE ####");
          notice(s_GameServ, u, "Type /msg %S HELP USE for more information.");
@@ -1759,10 +1847,20 @@ void do_use(char *u)
          return;
     }
   id = stringtoint(item);
+  
+  if (!numuse)
+       {
+         num = 1;
+       }
+  else
+       {
+         num = stringtoint(numuse);
+       }
+  
   updateTS(user->stats);
   p = user->stats->inventory;
   
-  
+
   if (!(used = p->Find(id)))
        {
          if (!p->isEmpty())
@@ -1777,15 +1875,39 @@ void do_use(char *u)
        }
   else
        {
-         // Use the item
-         notice(s_GameServ, u, "You used %s.", used->getItem()->getName().c_str());
-         used->use(user->stats);
-         if (used->getUses() == 0)
+         // Use the item(s)
+         if (num <= 1 || is_fighting(user))
+               {
+                 notice(s_GameServ, u, "You used %s.", used->getItem()->getName().c_str());
+                 used->use(user->stats);
+                 if (used->getUses() <= 0)
+                       {
+                         p->deleteItem(used->getItem());
+                       }
+                 end_turn(user);
+               }
+         else if (num > 1)
                {
-                 p->deleteItem(used->getItem());
+                 int count;
+                 const char *name = used->getItem()->getName().c_str();
+                 for (count = 0; count < num; count++)
+                       {
+                         if (!(used = p->Find(id)))
+                               {
+                                 break;
+                               }
+                         else
+                               {
+                                 used->use(user->stats);
+                                 if (used->getUses() == 0)
+                                       {
+                                         p->deleteItem(used->getItem());
+                                       }
+                               }
+                       }
+                 notice(s_GameServ, u, "You used %d %s's", count, name);
                }
-         end_turn(user);
-       }   
+       }
 }
 void do_run(char *u)
 {
@@ -1813,33 +1935,35 @@ void do_run(char *u)
   updateTS(user->stats);
   p = user->stats;
   
-  if (p->battle)
-       p2 = p->battle->stats;
+  if (p->getBattle())
+       p2 = p->getBattle()->stats;
   
   if (!is_fighting(user))
        notice(s_GameServ, u, "You run in place... try fighting next time.");
-  else if (!player_fight(user) && !master_fight(user))
+  else if (!player_fight(user) && !master_fight(user) && !dragon_fight(user))
     {
-         notice(s_GameServ, u, "You run away from \ 2%s\ 2 like a little baby!", p->fight->name.c_str());
-         delete p->fight;
-         p->fight = NULL;
+         notice(s_GameServ, u, "You run away from \ 2%s\ 2 like a little baby!", p->getMonster()->name.c_str());
+         p->delMonster();
     }
   else if (player_fight(user) && isYourTurn(p))
     {
-         notice(s_GameServ, u, "You run away from \ 2%s\ 2 like a little baby!", p2->name.c_str());
-         notice(s_GameServ, p->battle->getNick(), "\ 2%s\ 2 ran away from you like a little baby!", p->name.c_str());
-         addNews(todaysnews, "%s ran away from %s like a little baby!!", p->name.c_str(), p2->name.c_str()); /* DrLnet - edited by Kain */
-         p2->battle = NULL;
-    }
+         notice(s_GameServ, u, "You run away from \ 2%s\ 2 like a little baby!", p2->getName().c_str());
+         notice(s_GameServ, p->getBattle()->getNick(), "\ 2%s\ 2 ran away from you like a little baby!", p->getName().c_str());
+         addNews(todaysnews, "%s ran away from %s like a little baby!!", p->getName().c_str(), p2->getName().c_str()); /* DrLnet - edited by Kain */
+         p2->delBattle();
+       }
   else if (player_fight(user) && !isYourTurn(p))
     {
-         notice(s_GameServ, u, "It is not your turn. Please wait until \ 2%s\ 2 decides what to do.", p2->name.c_str());
+         notice(s_GameServ, u, "It is not your turn. Please wait until \ 2%s\ 2 decides what to do.", p2->getName().c_str());
     }
   else if (master_fight(user))
     {
-         notice(s_GameServ, u, "You cannot run from \ 2%s\ 2! FIGHT!", p->master->name.c_str());
+         notice(s_GameServ, u, "You cannot run from \ 2%s\ 2! FIGHT!", p->getMaster()->name.c_str());
     }
-  p->battle = NULL;
+  else if (dragon_fight(user))
+       {
+         notice(s_GameServ, u, "You cannot run from %s! FIGHT!", dragon.name.c_str());
+       }
 }
 
 void end_turn(aClient *user)
@@ -1855,20 +1979,20 @@ void end_turn(aClient *user)
        goto endturn;
   
   if (!player_fight(user) && !master_fight(user))
-       fight = user->stats->fight;
+       fight = user->stats->getMonster();
   else
-       fight = user->stats->master;
-  battle = user->stats->battle;
+       fight = user->stats->getMaster();
+  battle = user->stats->getBattle();
   
   if (!player_fight(user))
     {
          // Opponent's Hit
-         mhit = (fight->strength / 2) + (rand() % (fight->strength / 2)) - (user->stats->defense);
+         mhit = (fight->strength / 2) + (rand() % (fight->strength / 2)) - (user->stats->getDefense());
     }
   else
     {
          // Opponent's Hit
-         mhit = (battle->stats->strength / 2) + (rand() % (battle->stats->strength / 2)) - user->stats->defense;
+         mhit = (battle->stats->getStrength() / 2) + (rand() % (battle->stats->getStrength() / 2)) - user->stats->getDefense();
     }
   if (!player_fight(user))
     {
@@ -1881,33 +2005,33 @@ void end_turn(aClient *user)
          else if (mhit <= 0)
                notice(s_GameServ, u, "%s completely misses you!", fight->name.c_str());
          
-         if (mhit >= user->stats->hp)
+         if (mhit >= user->stats->getHP())
         {
                  if (!master_fight(user))
             {
                          notice(s_GameServ, u, "You have been \ 2\1fkilled\1f\ 2 by %s!", fight->name.c_str());
                          notice(s_GameServ, u, "You lose all gold on hand and lose 10 percent "\
                                         "of your experience!");
-                         user->stats->gold = 0;
-                         user->stats->exp -= (long int)(user->stats->exp * .10);
-                         user->stats->hp = 0;
-                         user->stats->fight = NULL;
+                         user->stats->setGold(0);
+                         user->stats->subtractExp((long int)(user->stats->getExp() * .10));
+                         user->stats->setHP(0);
+                         user->stats->delMonster();
                          clearAlive(user->stats);
                          goto endturn;
             }
                  else
             {
                          notice(s_GameServ, u, "%s has bested you! You will have to wait "\
-                                        "until tomorrow to try again", user->stats->master->name.c_str());
-                         user->stats->fight = NULL;
-                         user->stats->master = NULL;
+                                        "until tomorrow to try again", user->stats->getMaster()->name.c_str());
+                         user->stats->delMonster();
+                         user->stats->delMaster();
                          goto endturn;
             }
         }
          else
         {
                  if (mhit > 0)
-                       user->stats->hp -= mhit;
+                       user->stats->subtractHP(mhit);
                  display_monster(u);
                  goto endturn;
         }
@@ -1960,7 +2084,7 @@ void do_heal(char *u)
        notice(s_GameServ, u, "You can't heal in battle!");
        return;
     }
-    else if (ni->stats->hp >= ni->stats->maxhp)
+    else if (ni->stats->getHP() >= ni->stats->getMaxHP())
     {
         notice(s_GameServ, u, "You don't need healing!");
        return;
@@ -1969,49 +2093,49 @@ void do_heal(char *u)
     updateTS(ni->stats);
     if (stricmp(amount, "ALL") == 0)
     {
-        price = ni->stats->level * 3;
-        if (ni->stats->gold < (ni->stats->maxhp - ni->stats->hp) * price)
+        price = ni->stats->getLevel() * 3;
+        if (ni->stats->getGold() < (ni->stats->getMaxHP() - ni->stats->getHP()) * price)
         {
             notice(s_GameServ, u, "Healing \ 2%d\ 2 points for \ 2%d\ 2 gold per point.",
-                     (long int)ni->stats->gold/price, price);
-            ni->stats->hp += ni->stats->gold / price;
-            ni->stats->gold %= price;
+                     (long int)ni->stats->getGold()/price, price);
+            ni->stats->addHP(ni->stats->getGold() / price);
+            ni->stats->setGold(ni->stats->getGold() % price);
         }
         else
         {
             notice(s_GameServ, u, "Healing all possible points at \ 2%d\ 2 gold "\
                        "per point.", price);
             notice(s_GameServ, u, "\ 2%d\ 2 points healed for \ 2%ld\ 2 gold. HP at MAX!",
-                     (ni->stats->maxhp - ni->stats->hp), 
-                    (price * (ni->stats->maxhp - ni->stats->hp)) );
-            ni->stats->gold -= price * (ni->stats->maxhp - ni->stats->hp);
-            ni->stats->hp = ni->stats->maxhp;
+                     (ni->stats->getMaxHP() - ni->stats->getHP()), 
+                    (price * (ni->stats->getMaxHP() - ni->stats->getHP())) );
+            ni->stats->subtractGold(price * (ni->stats->getMaxHP() - ni->stats->getHP()));
+            ni->stats->healall();
         }
     }
     else if (isstringnum(amount))
     {
         num = stringtoint(amount);
-        price = ni->stats->level * 3;
-        if (ni->stats->gold < price * num)
+        price = ni->stats->getLevel() * 3;
+        if (ni->stats->getGold() < price * num)
         {
             notice(s_GameServ, u, "You only have enough gold to heal \ 2%d\ 2 points!",
-                     (long int)ni->stats->gold/price);
+                     (long int)ni->stats->getGold()/price);
         }
-        else if (num <= ni->stats->maxhp - ni->stats->hp)
+        else if (num <= ni->stats->getMaxHP() - ni->stats->getHP())
         {
             notice(s_GameServ, u, "Healing \ 2%d\ 2 points at \ 2%d\ 2 gold per point.",
                      num, price);
-            ni->stats->hp += num;
-            ni->stats->gold -= num * price;
+            ni->stats->addHP(num);
+            ni->stats->subtractGold(num * price);
         }
-        else if (num > ni->stats->maxhp - ni->stats->hp)
+        else if (num > ni->stats->getMaxHP() - ni->stats->getHP())
         {
             notice(s_GameServ, u, "Healing all possible points at \ 2%d\ 2 gold "\
                        "per point.", price);
             notice(s_GameServ, u, "\ 2%d\ 2 points healed. HP at MAX!",
-                     (ni->stats->maxhp - ni->stats->hp));
-            ni->stats->gold -= price * (ni->stats->maxhp - ni->stats->hp);
-            ni->stats->hp = ni->stats->maxhp;
+                     (ni->stats->getMaxHP() - ni->stats->getHP()));
+            ni->stats->subtractGold(price * (ni->stats->getMaxHP() - ni->stats->getHP()));
+            ni->stats->healall();
         }
     }
     else if (amount[0] == '-')
@@ -2038,73 +2162,73 @@ long int stringtoint(char *number)
 
 long int pow(int x, int y)
 {
-    long int value = 0;
-    int count = 0;
-    value += x;
-
-    if (x != 0 && y != 0)
+  long int value = 0;
+  int count = 0;
+  value += x;
+  
+  if (x != 0 && y != 0)
     {
-        for (count = 1; count <= y - 1; count++)
-            value *= x;
+         for (count = 1; count <= y - 1; count++)
+               value *= x;
     }
-    else
-        return 1;
-return value;
+  else
+       {
+         return 1;
+       }
+  return value;
 }
 
 long int chartoint(char ch)
 {
-       if (int(ch) >= 48 && int(ch) <= 57)
-               return int(ch) - 48;
-       else
-               return 0;
+  if (int(ch) >= 48 && int(ch) <= 57)
+       return int(ch) - 48;
+  else
+       return 0;
 }
 
 int save_gs_dbase()
 {
-    ListNode<aClient> *ptr;
-    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++)
-   {
-    ptr = players[x].First();
-    while(ptr)
+  list<Player*>::iterator iter;
+  Player *it;
+  ofstream outfile;
+  
+  outfile.open(playerdata);
+  
+  if (!outfile)
     {
-       it = ptr->getData()->stats;
-       clearYourTurn(it);
-       item *w, *a;
-       w = it->getWeapon();
-       a = it->getArmor();
-
-       outfile << it->name.c_str() << ' ' << it->level << ' ' << it->exp << ' ' << it->gold << ' ' << it->bank << ' '<< it->hp << ' ' << it->maxhp << ' ' << it->strength << ' ' << it->defense << ' ' << it->forest_fights << ' ' << it->player_fights <<  ' ' << it->getFlags() << ' ' << it->password << ' ' << 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;
-       ptr = ptr->Next();
+         log("Error opening %s", playerdata);
+         return 0;
     }
-   }
-outfile.close();
-return 1;
+  
+  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()
@@ -2264,168 +2388,166 @@ 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;
+               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 (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);
+                               }
+                       }
                }
-             if(tempItem->setData(buf))
+      catch (char *str)
                {
-                 Items.push_back(tempItem);
+                 log("Exception loading items: %s", str);
+                 delete []buf;
+                 return 0;
                }
-           }
-       }
-      catch (char *str)
-       {
-         log("Exception loading items: %s", str);
-         delete []buf;
-         return 0;
-       }
     }
   delete []buf;
   return 1;
 }
+
 int load_gs_dbase()
 {
-    ifstream infile;
-    aClient *temp;
-    Player *p;
-    char *tempname, *buf, *password;
-    int tempnum;
-    buf = new char[100000];
-
-    infile.open(playerdata);
-
-    if (infile.fail())
+  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;
+         log("Error opening %s", playerdata);
+         return 0;
     }
-
-    for (int x = 0; x < U_TABLE_SIZE; x++)
+  
+  
+  for (int x = 0; x < U_TABLE_SIZE; x++)
     {
-       ListNode<aClient> *tempNode;
-       tempNode = players[x].First();
-       while (tempNode)
+         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'))
        {
-           if (tempNode->getData()->stats->client)
-               logout(tempNode->getData()->stats->client);
-           tempNode = tempNode->Next();
+         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();
+         players[hv].push_back(p);
        }
-       players[x].deleteNodes();
-    }
-
-    while (infile.getline(buf, 100000, '\n'))
-      {
-       temp = new aClient;
-       tempname = strtok(buf, " ");
-       temp->stats = new Player(tempname);
-       p = temp->stats;
-
-       p->level = stringtoint(strtok(NULL, " "));
-       p->exp = stringtoint(strtok(NULL, " "));
-       p->gold = stringtoint(strtok(NULL, " "));
-       p->bank = stringtoint(strtok(NULL, " "));
-       p->hp = stringtoint(strtok(NULL, " "));
-       p->maxhp = stringtoint(strtok(NULL, " "));
-       p->strength = stringtoint(strtok(NULL, " "));
-       p->defense = stringtoint(strtok(NULL, " "));
-       p->forest_fights = stringtoint(strtok(NULL, " "));
-       p->player_fights = stringtoint(strtok(NULL, " "));
-       p->setFlags(stringtoint(strtok(NULL, " ")));
-
-       
-       
-       password = strtok(NULL, " ");
-       p->password = password;
-       temp->setNick("Not Playing");
-#ifdef P10
-       temp->setRealNick("Not Playing");
-#endif
-        tempname = strtok(NULL, " ");
-       if (tempname)
-         p->lastlogin = stringtoint(tempname);
-       else
-         p->lastlogin = time(NULL);
-
-       tempname = strtok(NULL, " ");
-       tempnum = stringtoint(tempname);
-       if (tempnum != 0)
-         {
-           p->setWeapon(*findItemByID(tempnum));
-         }
-
-       tempname = strtok(NULL, " ");
-       tempnum = stringtoint(tempname);
-
-       if (tempnum != 0)
-         {
-           p->setArmor(*findItemByID(tempnum));
-         }
-       
-       
-       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();
 
-       unsigned long hv = iHASH((unsigned char *) temp->stats->name.c_str());
-       
-       temp->stats->client = NULL;
-       players[hv].insertAtBack(temp);
-       delete temp;
-      }
-    delete [] buf;
-    infile.close();
-    return 1;
+  delete [] buf;
+  infile.close();
+  return 1;
 }
 
 bool passcmp(const char *encrypted, char *plaintext)
@@ -2452,13 +2574,13 @@ bool passcmp(const char *encrypted, char *plaintext)
 
 bool check_password(char *name, char *plaintext)
 {
-  aClient *client;
+  Player *p;
   
-  if (!(client = findplayer(name)))
+  if (!(p = findplayer(name)))
     return false;
   else
     {
-      return passcmp(client->stats->password.c_str(), plaintext);
+      return passcmp(p->getPassword().c_str(), plaintext);
     }
 }
 
@@ -2472,8 +2594,8 @@ void do_store(char *u)
   int id;
   aClient *user;
   Player *p;
-
-
+  
+  
   if (!cmd || !num)
     {
       notice(s_GameServ, u, "SYNTAX: STORE LIST {ARMOR | WEAPONS}");
@@ -2513,76 +2635,79 @@ void do_store(char *u)
   if (stricmp(cmd, "LIST") == 0)
     {
       if (stricmp(num, "WEAPONS") == 0)
-       {
-         notice(s_GameServ, u, "Welcome to Kain's Armory");
-         notice(s_GameServ, u, "Here are the weapons we have available for the killing, sire:");
-         for (item_iterator = store.begin(); item_iterator != store.end(); ++item_iterator)
-            {
-             if ((*item_iterator)->getType() == WEAPON)
                {
-                 space = spaces(strlen((*item_iterator)->getName().c_str()), ".");
-                 notice(s_GameServ, u, "%s%ld. %s%s%ld", ((*item_iterator)->getID() < 10 ? " " : ""), (*item_iterator)->getID(), (*item_iterator)->getName().c_str(), space, (*item_iterator)->price());
-                 free(space);
+                 notice(s_GameServ, u, "Welcome to Kain's Armory");
+                 notice(s_GameServ, u, "Here are the weapons we have available for the killing, sire:");
+                 for (item_iterator = store.begin(); item_iterator != store.end(); ++item_iterator)
+            {
+                         if ((*item_iterator)->getType() == WEAPON)
+                               {
+                                 space = spaces(strlen((*item_iterator)->getName().c_str()), ".");
+                                 notice(s_GameServ, u, "%s%ld. %s%s%ld", ((*item_iterator)->getID() < 10 ? " " : ""), (*item_iterator)->getID(), (*item_iterator)->getName().c_str(), space, (*item_iterator)->price());
+                                 free(space);
+                               }
+                       }
+                 notice(s_GameServ, u, "To purchase a weapon, type /msg %S STORE BUY \ 2#\ 2.");
+                 notice(s_GameServ, u, "Where # is the weapon number from the menu above.");
+                 
                }
-           }
-         notice(s_GameServ, u, "To purchase a weapon, type /msg %S STORE BUY \ 2#\ 2.");
-         notice(s_GameServ, u, "Where # is the weapon number from the menu above.");
-         
-       }
       else if (stricmp(num, "ARMOR") == 0)
-       {
-         notice(s_GameServ, u, "Welcome to Kain's Armory");
-         notice(s_GameServ, u, "I hope you enjoy the fine armor we have available for your protection:");
-         for (item_iterator = store.begin(); item_iterator != store.end(); ++item_iterator)
-            {
-             if ((*item_iterator)->getType() == ARMOR)
                {
-                 space = spaces(strlen((*item_iterator)->getName().c_str()), ".");
-                 notice(s_GameServ, u, "%s%ld. %s%s%d",((*item_iterator)->getID() < 10 ? " " : ""), (*item_iterator)->getID(), (*item_iterator)->getName().c_str(), space, (*item_iterator)->price());
-                 free(space);
-               }
+                 notice(s_GameServ, u, "Welcome to Kain's Armory");
+                 notice(s_GameServ, u, "I hope you enjoy the fine armor we have available for your protection:");
+                 for (item_iterator = store.begin(); item_iterator != store.end(); ++item_iterator)
+            {
+                         if ((*item_iterator)->getType() == ARMOR)
+                               {
+                                 space = spaces(strlen((*item_iterator)->getName().c_str()), ".");
+                                 notice(s_GameServ, u, "%s%ld. %s%s%d",((*item_iterator)->getID() < 10 ? " " : ""), (*item_iterator)->getID(), (*item_iterator)->getName().c_str(), space, (*item_iterator)->price());
+                                 free(space);
+                               }
             }
-
-         notice(s_GameServ, u, "To purchase armor, type /msg %S store buy #");
-         notice(s_GameServ, u, "Where # is the armor number from the menu above.");
-       }
+                 
+                 notice(s_GameServ, u, "To purchase armor, type /msg %S store buy #");
+                 notice(s_GameServ, u, "Where # is the armor number from the menu above.");
+               }
       
     } 
   else if (stricmp(cmd, "BUY") == 0) 
     {
       p = user->stats;
       if (!num)
-       {
-         notice(s_GameServ, u, "SYNTAX: \ 2STORE BUY \1f#\1f\ 2");
-         return;
-       }
+               {
+                 notice(s_GameServ, u, "SYNTAX: \ 2STORE BUY \1f#\1f\ 2");
+                 return;
+               }
       else
-       {
-         id = stringtoint(num);
-       }
-
+               {
+                 id = stringtoint(num);
+               }
+         
       if (!isstringnum(num))
-       {
-         notice(s_GameServ, u, "SYNTAX: \ 2STORE BUY \1f#\1f\ 2");
-         return;
-       }
+               {
+                 notice(s_GameServ, u, "SYNTAX: \ 2STORE BUY \1f#\1f\ 2");
+                 return;
+               }
       else if (!(tempItem = findStoreItemByID(id)))
-       {
-         notice(s_GameServ, u, "Sorry, we don't carry that item!");
-         return;
-       }
-      else if (p->gold < tempItem->price())
-       {
-         notice(s_GameServ, u, "You can't afford to buy %s", tempItem->getName().c_str());
-         return;
-       }
-      else
-       {
-         notice(s_GameServ, u, "You have purchased %s! Thanks for the gold!", tempItem->getName().c_str());
-         p->gold -= tempItem->price();
-         p->inventory->addItem(tempItem);
-         notice(s_GameServ, u, "Don't forget to type /msg %S equip %ld", tempItem->getID());
-       }
+               {
+                 notice(s_GameServ, u, "Sorry, we don't carry that item!");
+                 return;
+               }
+      else if (p->getGold() < tempItem->price())
+               {
+                 notice(s_GameServ, u, "You can't afford to buy %s", tempItem->getName().c_str());
+                 return;
+               }
+      else if (p->inventory->addItem(tempItem))
+               {
+                 notice(s_GameServ, u, "You have purchased %s! Thanks for the gold!", tempItem->getName().c_str());
+                 p->subtractGold(tempItem->price());
+                 notice(s_GameServ, u, "Don't forget to type /msg %S equip %ld", tempItem->getID());
+               }
+         else
+               {
+                 notice(s_GameServ, u, "You can't carry any more!");
+               }
     }
   else if (stricmp(cmd, "SELL" ) == 0)
     {
@@ -2590,46 +2715,39 @@ void do_store(char *u)
       p = user->stats;
       id = stringtoint(num);
       if (!isstringnum(num))
-       {
-         notice(s_GameServ, u, "SYNTAX: /msg %S store sell #");
-         return;
-       }
+               {
+                 notice(s_GameServ, u, "SYNTAX: /msg %S store sell #");
+                 return;
+               }
       else if (!(tempContainer = p->inventory->Find(id)))
-       {
-         notice(s_GameServ, u, "You're not carrying that!");
-         return;
-       }
-      else if (p->gold >= 2000000000)
-       {
-         notice(s_GameServ, u, "You have enough gold. Just hang on to it for now.");
-       }
+               {
+                 notice(s_GameServ, u, "You're not carrying that!");
+                 return;
+               }
+      else if (p->getGold() >= 2000000000)
+               {
+                 notice(s_GameServ, u, "You have enough gold. Just hang on to it for now.");
+               }
       else 
-       {
-         tempItem = tempContainer->getItem();
-         if (2000000000 - p->gold < (tempItem->price() / 2))
-           {
-             notice(s_GameServ, u, "Thank you for your business! You now have as much gold as you can carry.");
-             p->gold = 2000000000;
-           }
-         else
-           {
-             notice(s_GameServ, u, "Thank you for your business! We gave you %ld gold for %s!", (tempItem->price() / 2), tempItem->getName().c_str());
-             p->gold += (tempItem->price() / 2);
-           }
-         p->inventory->deleteItem(tempItem);
-         if (tempItem == p->getWeapon())
-           {
-             notice(s_GameServ, u, "Since you equipped %s, you're going to have to reequip something", tempItem->getName().c_str());
-             tempItem->undo(p);
-             p->clearWeapon();
-           }
-         else if (tempItem == p->getArmor())
-           {
-             tempItem->undo(p);
-             notice(s_GameServ, u, "Since you equipped %s, you're going to have to reequip something", tempItem->getName().c_str());
-             p->clearArmor();
-           }
-       }
+               {
+                 tempItem = tempContainer->getItem();
+                 
+                 notice(s_GameServ, u, "Thank you for your business! We gave you %ld gold for %s!", (tempItem->price() / 2), tempItem->getName().c_str());
+                 p->addGold((tempItem->price() / 2));
+                 p->inventory->deleteItem(tempItem);
+                 if (tempItem == p->getWeapon())
+                       {
+                         notice(s_GameServ, u, "Since you equipped %s, you're going to have to reequip something", tempItem->getName().c_str());
+                         tempItem->undo(p);
+                         p->clearWeapon();
+                       }
+                 else if (tempItem == p->getArmor())
+                       {
+                         tempItem->undo(p);
+                         notice(s_GameServ, u, "Since you equipped %s, you're going to have to reequip something", tempItem->getName().c_str());
+                         p->clearArmor();
+                       }
+               }
     }
   else
     {
@@ -2641,27 +2759,28 @@ void do_store(char *u)
 }
 void do_inventory(char *u)
 {
-    aClient *user;
-
-    if (!(user = find(u)))
+  aClient *user;
+  
+  if (!(user = find(u)))
     {
-       notice(s_GameServ, u, "Fatal Error. Contact a %S admin!");
-       return;
+         notice(s_GameServ, u, "Fatal Error. Contact a %S admin!");
+         return;
     }
-    else if (isIgnore(user))
+  else if (isIgnore(user))
     {
-       #ifdef DEBUGMODE
-           log("Ignoring %s.", user->getNick());
-       #endif
-       return;
+#ifdef DEBUGMODE
+         log("Ignoring %s.", user->getNick());
+#endif
+         return;
     }
-    else if (!is_playing(user))
+  else if (!is_playing(user))
     {
-       notice(s_GameServ, u, "You must be playing to check your inventory!");
-       return;
+         notice(s_GameServ, u, "You must be playing to check your inventory!");
+         return;
     }
-    updateTS(user->stats);
-    showinventory(user->stats, user);
+  if (!is_fighting(user))
+       updateTS(user->stats);
+  showinventory(user->stats, user);
 }
 
 void showinventory(Player *from, aClient *to)
@@ -2686,7 +2805,7 @@ void showinventory(Player *from, aClient *to)
   list <itemContainer>::iterator item_iter, item_iter2;
   item_iter = items->begin();
   
-  notice(s_GameServ, nick, "Inventory for %s:", from->name.c_str());
+  notice(s_GameServ, nick, "Inventory for %s:", from->getName().c_str());
   long count;
   while (item_iter != items->end())
        {
@@ -2708,9 +2827,11 @@ void showinventory(Player *from, aClient *to)
          notice(s_GameServ, nick, "%ld.) %s (%ld)", (*item_iter2).getItem()->getID(), (*item_iter2).getItem()->getName().c_str(), count);
        }
 }
+
 void do_tavern(char *u)
 {
   char *cmd = strtok(NULL, " ");
+
   aClient *user;
   Player *p;
   
@@ -2755,42 +2876,77 @@ void do_tavern(char *u)
     }
   else if (stricmp(cmd, "BUY") == 0)
     {
+         int amt = 1;
       char *chid = strtok(NULL, " ");
+         char *amount = strtok(NULL, " ");
+
+         if (amount)
+               amt = stringtoint(amount);
       
       if (!chid)
-       {
-         notice(s_GameServ, u, "SYNTAX: TAVERN BUY #");
-         notice(s_GameServ, u, "Example: /msg %S TAVERN BUY 6001");
-         return;
-       }
+               {
+                 notice(s_GameServ, u, "SYNTAX: TAVERN BUY # [#]");
+                 notice(s_GameServ, u, "Example: /msg %S TAVERN BUY 6001");
+                 notice(s_GameServ, u, "Example: /msg %S TAVERN BUY 6001 10");
+                 return;
+               }
       long id = stringtoint(chid);
       tavernItem *tempItem;
       
-      if (!(tempItem = findTavernItemByID(id)) || user->stats->level < tempItem->getLevel())
-       {
-         notice(s_GameServ, u, "Invalid Choice!");
-         notice(s_GameServ, u, "Here is a list of what we have to offer:");
-         showTavern(user);
-         notice(s_GameServ, u, "To buy an item, type /msg %S TAVERN BUY #");
-         return;
-       }
-      else if (user->stats->gold < tempItem->getItem()->price())
-       {
-         notice(s_GameServ, u, "You don't have enough gold!");
-         notice(s_GameServ, u, "Here is a list of what we have to offer:");
-         showTavern(user);
-         notice(s_GameServ, u, "To buy an item, type /msg %S TAVERN BUY #");
-       }
-      else
-       {
-         if (user->stats->inventory->addItem(tempItem->getItem()) == NULL)
-           {
-             notice(s_GameServ, u, "You can't carry any more!");
-             return;
-           }
-         notice(s_GameServ, u, "One %s coming right up!", tempItem->getItem()->getName().c_str());
-         user->stats->gold -= tempItem->getItem()->price();
-       }
+      if (!(tempItem = findTavernItemByID(id)) || user->stats->getLevel() < tempItem->getLevel())
+               {
+                 notice(s_GameServ, u, "Invalid Choice!");
+                 notice(s_GameServ, u, "Here is a list of what we have to offer:");
+                 showTavern(user);
+                 notice(s_GameServ, u, "To buy an item, type /msg %S TAVERN BUY #");
+                 return;
+               }
+      else if (!amount && user->stats->getGold() < tempItem->getItem()->price())
+               {
+                 notice(s_GameServ, u, "You don't have enough gold!");
+                 notice(s_GameServ, u, "Here is a list of what we have to offer:");
+                 showTavern(user);
+                 notice(s_GameServ, u, "To buy an item, type /msg %S TAVERN BUY #");
+               }
+         else if (user->stats->getGold() < amt * tempItem->getItem()->price())
+               {
+                 notice(s_GameServ, u, "You don't have enough gold!");
+                 notice(s_GameServ, u, "Here is a list of what we have to offer:");
+                 showTavern(user);
+                 notice(s_GameServ, u, "To buy an item, type /msg %S TAVERN BUY # [#]");
+               }
+         else
+               {
+                 if (amount)
+                       {
+                         int amt = stringtoint(amount);
+                         if (amt < 0 || amount[0] == '-')
+                               {
+                                 notice(s_GameServ, u, "You trying to steal from me?");
+                               }
+                         else if (user->stats->inventory->addItem(tempItem->getItem(), amt) == NULL)
+                               {
+                                 notice(s_GameServ, u, "You can't carry that many!");
+                               }
+                         else
+                               {
+                                 notice(s_GameServ, u, "%d %s's coming right up!", amt, tempItem->getItem()->getName().c_str());
+                                 user->stats->subtractGold(tempItem->getItem()->price() * amt);
+                               }
+                       }
+                 else
+                       {
+                         if (user->stats->inventory->addItem(tempItem->getItem()) == NULL)
+                               {
+                                 notice(s_GameServ, u, "You can't carry any more!");
+                               }
+                         else
+                               {
+                                 notice(s_GameServ, u, "One %s coming right up!", tempItem->getItem()->getName().c_str());
+                                 user->stats->subtractGold(tempItem->getItem()->price());
+                               }
+                       }
+               }
     }
   else
     {
@@ -2865,57 +3021,57 @@ void do_bank(char *u)
   
   if (stricmp(cmd, "DEPOSIT") == 0)
     {
-         if (p->bank == 2000000000)
+         if (p->getBank() == 2000000000)
         {
                  notice(s_GameServ, u, "Your bank account is full, sire!");
                  return;
         }
          else if (stricmp(amount, "ALL") == 0)
         {
-                 if (2000000000 - p->bank < p->gold)
+                 if (2000000000 - p->getBank() < p->getGold())
             {
                          notice(s_GameServ, u, "You don't have enough room for all of your gold.");
-                         notice(s_GameServ, u, "Depositing %ld gold into your account", (2000000000 - p->bank));
-                         p->gold -= (2000000000 - p->bank);
-                         p->bank = 2000000000;
+                         notice(s_GameServ, u, "Depositing %ld gold into your account", (2000000000 - p->getBank()));
+                         p->subtractGold((2000000000 - p->getBank()));
+                         p->setBank(2000000000);
                          showBankBalance(u);
             }
                  else
             {
-                         notice(s_GameServ, u, "Depositing %ld gold into your account!", p->gold);
-                         p->bank += p->gold;
-                         p->gold = 0;
+                         notice(s_GameServ, u, "Depositing %ld gold into your account!", p->getGold());
+                         p->addBank(p->getGold());
+                         p->setGold(0);
                          showBankBalance(u);
             }
         }
-         else if (stringtoint(amount) > p->gold)
+         else if (stringtoint(amount) > p->getGold())
         {
-                 notice(s_GameServ, u, "Sire, you only have %ld gold!", p->gold);
+                 notice(s_GameServ, u, "Sire, you only have %ld gold!", p->getGold());
                  showBankBalance(u);
                  return;
         }
          else
         {
-                 if (2000000000 - p->bank < stringtoint(amount))
+                 if (2000000000 - p->getBank() < stringtoint(amount))
             {
                          notice(s_GameServ, u, "You don't have room in your account for that much.");
-                         notice(s_GameServ, u, "Capping off your account with %ld gold!", (2000000000 - p->bank));
-                         p->gold -= (2000000000 - p->bank);
-                         p->bank = 2000000000;
+                         notice(s_GameServ, u, "Capping off your account with %ld gold!", (2000000000 - p->getBank()));
+                         p->subtractGold((2000000000 - p->getBank()));
+                         p->setBank(2000000000);
                          showBankBalance(u);
             }
                  else
             {
                          notice(s_GameServ, u, "Depositing %d gold into your account!", stringtoint(amount));
-                         p->bank += stringtoint(amount);
-                         p->gold -= stringtoint(amount);
+                         p->addBank(stringtoint(amount));
+                         p->subtractGold(stringtoint(amount));
                          showBankBalance(u);
             }
         }
     }
   else if (stricmp(cmd, "WITHDRAW") == 0)
     {
-         if (p->gold == 2000000000)
+         if (p->getGold() == 2000000000)
         {
                  notice(s_GameServ, u, "You cannot carry any more gold, sire!");
                  showBankBalance(u);
@@ -2923,44 +3079,44 @@ void do_bank(char *u)
         }
          else if (stricmp(amount, "ALL") == 0)
         {
-                 if (2000000000 - p->gold < p->bank)
+                 if (2000000000 - p->getGold() < p->getBank())
             {
                          notice(s_GameServ, u, "You don't have enough room to carry all that gold.");
-                         notice(s_GameServ, u, "Withdrawing %ld gold from your account", (2000000000 - p->gold));
-                         p->bank -= (2000000000 - p->gold);
-                         p->gold = 2000000000;
+                         notice(s_GameServ, u, "Withdrawing %ld gold from your account", (2000000000 - p->getGold()));
+                         p->subtractBank((2000000000 - p->getGold()));
+                         p->setGold(2000000000);
                          showBankBalance(u);
             }
                  else
             {
-                         notice(s_GameServ, u, "Withdrawing %ld gold from your account!", p->bank);
-                         p->gold += p->bank;
-                         p->bank = 0;
+                         notice(s_GameServ, u, "Withdrawing %ld gold from your account!", p->getBank());
+                         p->addGold(p->getBank());
+                         p->setBank(0);
                          showBankBalance(u);
             }
         }
-         else if (stringtoint(amount) > p->bank)
+         else if (stringtoint(amount) > p->getBank())
         {
-                 notice(s_GameServ, u, "Sire, you only have %ld gold in the bank!", p->bank);
+                 notice(s_GameServ, u, "Sire, you only have %ld gold in the bank!", p->getBank());
                  showBankBalance(u);
                  return;
         }
          else
         {
-                 if (2000000000 - p->gold < stringtoint(amount))
+                 if (2000000000 - p->getGold() < stringtoint(amount))
             {
                          notice(s_GameServ, u, "You don't enough have room to carry that much gold!");
                          notice(s_GameServ, u, "You fill your pockets with %ld gold!",
-                                        (2000000000 - p->gold));
-                         p->bank -= (2000000000 - p->gold);
-                         p->gold = 2000000000;
+                                        (2000000000 - p->getGold()));
+                         p->subtractBank((2000000000 - p->getGold()));
+                         p->setGold(2000000000);
                          showBankBalance(u);
             }
                  else
             {
                          notice(s_GameServ, u, "Withdrawing %d gold from your account!", stringtoint(amount));
-                         p->gold += stringtoint(amount);
-                         p->bank -= stringtoint(amount);
+                         p->addGold(stringtoint(amount));
+                         p->subtractBank(stringtoint(amount));
                          showBankBalance(u);
             }
         }
@@ -2998,7 +3154,7 @@ void do_dragon(char *u)
          notice(s_GameServ, u, "You're dead. Wait until tomorrow to see your master!");
          return;
     }
-  else if (user->stats->level < LEVELS)
+  else if (user->stats->getLevel() < LEVELS)
     {
          notice(s_GameServ, u, "You fool! Only those strong enough "\
                         "to vanquish any foe should DARE fight the dragon!");
@@ -3028,7 +3184,7 @@ void do_dragon(char *u)
   notice(s_GameServ, u, "Just then you notice the eye begin to "\
                 "glare orange! The tooth is moving... but it is still too "\
                 "dark for you to make out.... THE DRAGON! You see it!");
-  p->fight = new Monster(dragon);
+  p->setMonster(&dragon);
   setDragonFight(p);
   display_monster(u);
 }
@@ -3080,7 +3236,7 @@ void do_master(char *u)
   
   if (cmd != NULL)
     {
-         switch(p->level)
+         switch(p->getLevel())
                {
            case 1:
                  need = 200;
@@ -3117,12 +3273,12 @@ void do_master(char *u)
                  break;
                  
            case REALLEVELS:
-                 need = p->exp + 1;
+                 need = p->getExp() + 1;
                  notice(s_GameServ, u, "You are at level %d. You are the master. What's left? The DRAGON!", REALLEVELS);
                  return;
                  break;
            default:
-                 need = p->exp + 1; // Unknown level... don't let them fight a fake master!
+                 need = p->getExp() + 1; // Unknown level... don't let them fight a fake master!
                  break;
                }   
     }
@@ -3134,24 +3290,24 @@ void do_master(char *u)
   
   if (stricmp(cmd, "FIGHT") == 0)
     {
-         if (p->exp >= need)
+         if (p->getExp() >= need)
                {
                  setMaster(p);
                  see_master(u);
                }
          else
            notice(s_GameServ, u, "You are not worthy of fighting %s! You need %ld more experience.", 
-                          levels[p->level - 1].master.name.c_str(), (need - p->exp));
+                          levels[p->getLevel() - 1].master.name.c_str(), (need - p->getExp()));
          return;
     }
   else if (stricmp(cmd, "QUESTION") == 0)
     {
-         if (p->exp >= need)
+         if (p->getExp() >= need)
            notice(s_GameServ, u, "%s looks you up and down and decides you are more ready than you will ever be.", 
-                          levels[p->level - 1].master.name.c_str());
+                          levels[p->getLevel() - 1].master.name.c_str());
          else
            notice(s_GameServ, u, "You pathetic fool! You are no match for %s, %s!", 
-                          levels[p->level - 1].master.name.c_str(), p->name.c_str());
+                          levels[p->getLevel() - 1].master.name.c_str(), p->getName().c_str());
          
          return;
     }
@@ -3174,8 +3330,8 @@ void see_master(char *u)
   if (!is_fighting(user) && is_playing(user))
     {
          Player *p = user->stats;
-         p->master = new Monster(&levels[p->level - 1].master);
-         p->fight = p->master;
+         p->setMyMaster(&levels[p->getLevel() - 1].master);
+         p->setMonster(&levels[p->getLevel() - 1].master);
          display_monster(u);  // Since master is the same structure, use this function
     }
 }
@@ -3200,7 +3356,7 @@ void showTavern(aClient *user)
   
   while (item_iterator != tavern.end())
     {
-      if (p->level < (*item_iterator).getLevel())
+      if (p->getLevel() < (*item_iterator).getLevel())
                {
                  item_iterator++;
                  continue;
@@ -3224,38 +3380,28 @@ void showBankBalance(const char *u)
   if (!p)
        return;
   
-  notice(s_GameServ, u, "Account Balance: %ld     Gold On hand: %ld", p->bank, p->gold);
-  
+  notice(s_GameServ, u, "Account Balance: %ld     Gold On hand: %ld", p->getBank(), p->getGold());
 }
 
 void rolloverall()
 {
-  ListNode <aClient> *it;
-  Player *p;
+  list<Player*>::iterator iter;
   for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
     {
-      it = players[x].First();
-      while (it)
+      for (iter = players[x].begin(); iter != players[x].end(); iter++)
                {
-                 p = it->getData()->stats;
-                 rollover(p);
-                 it = it->Next();
+                 rollover((*iter));
                }
     }
 }
 void refreshall()
 {
-  ListNode <aClient> *it;
-  Player *p;
+  list<Player*>::iterator iter;
   for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
     {
-      it = players[x].First();
-      
-      while (it)
+      for (iter = players[x].begin(); iter != players[x].end(); iter++)
                {
-                 p = it->getData()->stats;
-                 refresh(p);
-                 it = it->Next();
+                 refresh((*iter));
                }
     }
 }
@@ -3265,33 +3411,34 @@ void rollover(Player *p)
   if (!p)
     return;
   
-  p->forest_fights += numrolloverfights;
+  p->addForestFights(numrolloverfights);
   
-  if (p->forest_fights > maxforestfights)
-    p->forest_fights = maxforestfights;
+  if (p->getForestFights() > maxforestfights)
+    p->setForestFights(maxforestfights);
 }
 
 void refresh(Player *p)
 {
   if (!p)
        return;
-  
-  if (p->hp < p->maxhp)
-       p->hp = p->maxhp;
-  if (p->forest_fights < forestfights)
+
+  if (p->getHP() < p->getMaxHP())
+       p->healall();
+  if (p->getForestFights() < forestfights)
        {
-         p->forest_fights = forestfights;
+         p->setForestFights(forestfights);
        }
   
-  p->player_fights = 3;
+  p->setPlayerFights(3);
   setAlive(p);
   clearMaster(p);
 }
 
 void do_refresh(char *u)
 {
-  char *nick = strtok(NULL, " ");
+  char *name = strtok(NULL, " ");
   aClient *user;
+  Player *p;
   
   if (!(user = find(u)))
     {
@@ -3311,39 +3458,24 @@ void do_refresh(char *u)
          notice(s_GameServ, u, "You must be a %S admin to use this command!");
          return;
     }
-  if (!nick)
+  if (!name)
     {
          notice(s_GameServ, u, "SYNTAX: REFRESH {ALL | NICK}");
          return;
     }
-  else if (stricmp(nick, "ALL") == 0)
+  else if (stricmp(name, "ALL") == 0)
     {
          notice(s_GameServ, u, "Refreshing everyone's stats!");
          refreshall();
     }
-  else if ((user = findplayer(nick)))
+  else if ((p = findplayer(name)))
     {
-         if (is_playing(user))
-               {
-#ifdef P10
-                 notice(s_GameServ, u, "Refreshing %s.", user->getRealNick());
-#else
-                 notice(s_GameServ, u, "Refreshing %s.", user->getNick());
-#endif
-                 refresh(user->stats);
-               }
-         else
-               {
-#ifdef P10
-                 notice(s_GameServ, u, "%s is not playing.", user->getRealNick());
-#else
-                 notice(s_GameServ, u, "%s is not playing.", user->getNick());
-#endif
-               }
-    }
+         notice(s_GameServ, u, "Refreshing %s.", p->getName().c_str());
+         refresh(p);
+       }
   else
     {
-         notice(s_GameServ, u, "Nick %s not found.", nick);
+         notice(s_GameServ, u, "Player %s not found.", name);
          return;
     }
 }
@@ -3351,34 +3483,28 @@ void do_refresh(char *u)
 
 void resetall()
 {
-  ListNode <aClient> *it;
-  Player *p;
-  
+  list<Player*>::iterator iter;
   for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
        {
-         it = players[x].First();
-         
-         while (it)
+         for (iter = players[x].begin(); iter != players[x].end(); iter++)
                {
-                 p = it->getData()->stats;
-                 reset(p);
-                 it = it->Next();
+                 reset((*iter));
                }
        }
 }
 
 void reset(Player *p)
 {
-  string *myname;
-  
+  item *tempItem;
+
   if (!p)
        return;
   
-  myname = new string(p->name);
-  
   p->reset();
-  p->name = *myname;
-  delete myname;
+  // Add the stick and clothes
+  tempItem = findItemByID(3001);
+  p->inventory->addItem((*Items.begin()))->use(p); // Add the stick
+  p->inventory->addItem(tempItem)->use(p); // Add Clothes      
 }
 
 void updateTS(Player *p)
@@ -3387,12 +3513,13 @@ void updateTS(Player *p)
        return;
   
 #ifdef DEBUGMODE
-  log("Old timestamp for %s: %ld", p->name.c_str(), p->lastcommand);
+  log("Old timestamp for %s: %ld", p->getName().c_str(), p->lastcommand);
 #endif
   p->lastcommand = time(NULL);
 #ifdef DEBUGMODE
-  log("New timestamp for %s: %ld", p->name.c_str(), p->lastcommand);
+  log("New timestamp for %s: %ld", p->getName().c_str(), p->lastcommand);
 #endif
+  PF_cleartimedout(p);
   
 }
 
@@ -3413,54 +3540,52 @@ bool timedOut(Player *p)
 
 void timeOutEvent(Player *p)
 {
-  aClient *user = findplayer(p->name.c_str());
-  
-  if (!user || !p->client) // then they're not playing
+  if (!p || !is_playing(p->getClient())) // then they're not playing
        return;
   
-  char *nick = user->getNick();
-  
-  if (player_fight(user) && isYourTurn(p))
+  char *nick = p->getClient()->getNick();
+
+  if (player_fight(p->getClient()) && isYourTurn(p))
     {
          // Check to see if they were the idler or if it was the other 
          // person
-         if (p->lastcommand != p->battle->stats->lastcommand)
+         if (!PF_timedout(p->getBattle()->stats))
                {
                  // This person's last command was given earlier,
                  // so this person is the idler
                  notice(s_GameServ, nick, "You timed out "\
                                 "during a fight. You lose your turn!");
-                 notice(s_GameServ, p->battle->getNick(),
-                                "%s hesitated for too long. Your move.", p->name.c_str());
+                 notice(s_GameServ, p->getBattle()->getNick(),
+                                "%s hesitated for too long. Your move.", p->getName().c_str());
                  clearYourTurn(p);
-                 setYourTurn(p->battle->stats);
+                 setYourTurn(p->getBattle()->stats);
                  
                  // Update the TS for both players to give them another
                  // Chance to wake up, but if the other player doesn't
                  // Attack now, they both get logged out.
                  updateTS(p);
-                 p->battle->stats->lastcommand = p->lastcommand;
-                 display_players(p->battle);
+                 PF_settimedout(p);
+                 display_players(p->getBattle());
                  return;
                }
          else
                {
-                 notice(s_GameServ, p->battle->getNick(),
+                 notice(s_GameServ, p->getBattle()->getNick(),
                                 "You and %s timed out at the same time."\
                                 " Don't fight if you're just going to "\
-                                "sit there!", p->name.c_str());
-                 notice(s_GameServ, user->getNick(),
+                                "sit there!", p->getName().c_str());
+                 notice(s_GameServ, p->getClient()->getNick(),
                                 "You and %s timed out at the same time."\
                                 " Don't fight if you're just going to "\
-                                "sit there!", p->battle->stats->name.c_str());
-                 logout(p->battle);
-                 logout(user);
+                                "sit there!", p->getBattle()->stats->getName().c_str());
+                 logout(p->getBattle());
+                 logout(p->getClient());
                  return;
                }
     }
-  else if (!player_fight(user))
+  else if (!player_fight(p->getClient()))
     {
-      if (isAlive(user->stats) && user->stats->gold > 0)
+         if (isAlive(p) && p->getGold() > 0)
                {
                  // Place fun stuff here :)
                  int randnum = 1 + rand() % 100; // 1-100
@@ -3470,7 +3595,7 @@ void timeOutEvent(Player *p)
                  if (randnum < 50)
                        {
                          // 35-100% of your gold goes pffft - kain
-                         int stolen = (35 + (rand() % 66)) * (user->stats->gold / 100);
+                         int stolen = (35 + (rand() % 66)) * (p->getGold() / 100);
                          
                          GSN("You stop for a moment to rest on the "\
                                  "street corner. All of a sudden, you "\
@@ -3478,32 +3603,32 @@ void timeOutEvent(Player *p)
                                  "of knife wielding thugs.");
                          GSN2("The thugs beat you into utter submission "\
                                   "and steal %ld gold from you!", stolen);
-                         user->stats->gold -= stolen;
+                         p->subtractGold(stolen);
                        }
                  else if (randnum >= 50 && randnum < 75)
                        {
                          // 25-65% of your gold goes pffft - kain
-                         int stolen = (25 + (rand() % 41)) * (user->stats->gold / 100);
+                         int stolen = (25 + (rand() % 41)) * (p->getGold() / 100);
                          GSN("While dilly dallying around, you lose "\
                                  "your sense of time. Little did you know, "\
                                  "but thieves lifted your gold while you "\
                                  "weren't watching.");
                          GSN2("Better luck next time... you lose %d gold", stolen);
-                         user->stats->gold -= stolen;
+                         p->subtractGold(stolen);
                        }
                  else if (randnum >= 75)
                        {
                          // 25-75% of your gold goes pffft - kain
-                         int stolen = (25 + (rand() % 51)) * (user->stats->gold / 100);
+                         int stolen = (25 + (rand() % 51)) * (p->getGold() / 100);
                          GSN("Good grief! A gaggle of gooey green ghostlike "\
                                  "goblins grabbed your gold!");
                          GSN2("They stole %d gold from you!", stolen);
-                         user->stats->gold -= stolen;
+                         p->subtractGold(stolen);
                        }
                }
          
          // Always log out the user
-         logout(user);
+         logout(p->getClient());
     }
 }
 
@@ -3511,6 +3636,7 @@ void do_reset(char *u)
 {
   char *nick = strtok(NULL, " ");
   aClient *user;
+  Player *p;
   
   if (!(user = find(u)))
     {
@@ -3527,35 +3653,21 @@ void do_reset(char *u)
   if (!nick)
     {
          notice(s_GameServ, u, "SYNTAX: RESET {ALL | NICK}");
-         return;
     }
   else if (stricmp(nick, "ALL") == 0)
     {
          notice(s_GameServ, u, "Resetting everyone's stats!");
          resetall();
     }
-  else if ((user = findplayer(nick)))
-    {
-         if (is_playing(user))
-               {
-#ifdef P10
-                 notice(s_GameServ, u, "Resetting %s.", user->getRealNick());
-#else
-                 notice(s_GameServ, u, "Resetting %s.", user->getNick());
-#endif
-                 reset(user->stats);
-               }
-         else
-               {
-                 notice(s_GameServ, u, "Resetting %s", user->stats->name.c_str());
-                 reset(user->stats);
-               }
-    }
+  else if (!(p = findplayer(nick)))
+       {
+         notice(s_GameServ, u, "Nick %s not found.", nick);
+       }
   else
     {
-         notice(s_GameServ, u, "Nick %s not found.", nick);
-         return;
-    }
+         notice(s_GameServ, u, "Resetting %s.", p->getName().c_str());
+         reset(p);
+       }
 }
 
 void do_help(char *u)
@@ -3670,12 +3782,16 @@ bool load_levels()
     {
          sprintf(filename, "data/levels/level%d.dat", x);
          if (levels[x - 1].loadLevel(filename) == false)
-           return false;
+               {
+                 delete []filename;
+                 return false;
+               }
     }
   
   delete []filename;
   return true;
 }
+
 bool load_monsters()
 {
   char *filename;
@@ -3692,6 +3808,8 @@ bool load_monsters()
          if (!infile)
                {
                  log("Error opening %s", filename);
+                 delete []filename;
+                 delete []buf;
                  return false;
                }
          
@@ -3712,8 +3830,8 @@ bool load_monsters()
                  temp->weapon = strtok(NULL, "~");
                  temp->death = strtok(NULL, "~");
                  
-                 levels[level - 1].monsters.insertAtBack_RLN(temp);
-                 delete temp;
+                 levels[level - 1].monsters.push_back(temp);
+
                }
          delete [] filename;
          infile.close();