]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv/gameserv.cpp
updated the Change log w/ new additions
[irc/gameservirc.git] / gameserv / gameserv.cpp
index b912ed091f3a3072f5d4302a6637c0b757645208..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>
@@ -153,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 :)
 }
 
@@ -365,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->getName().c_str());
+        notice(s_GameServ, sender->getNick(), "Stats for %s:", p->getName().c_str());
                
-        sprintf(buf, "Experience: %ld", ni->stats->getExp());
+        sprintf(buf, "Experience: %ld", p->getExp());
         space = spaces(strlen(buf), " ");
         notice(s_GameServ, sender->getNick(), "%s%sLevel: %d",  buf, space,
-                          ni->stats->getLevel());
+                          p->getLevel());
         delete [] space;
                
-        sprintf(buf, "Gold: %ld", ni->stats->getGold());
+        sprintf(buf, "Gold: %ld", p->getGold());
         space = spaces(strlen(buf), " ");
-        notice(s_GameServ, sender->getNick(), "%s%sGold in Bank: %ld", buf, space, ni->stats->getBank());
+        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->getHP(),
-                          ni->stats->getMaxHP());
+        notice(s_GameServ, sender->getNick(), "Hit Points: %d of %d", p->getHP(),
+                          p->getMaxHP());
                
-        sprintf(buf, "Strength: %d", ni->stats->getStrength());
+        sprintf(buf, "Strength: %d", p->getStrength());
         space = spaces(strlen(buf), " ");
         notice(s_GameServ, sender->getNick(), "%s%sDefense: %d",
-                          buf, space, ni->stats->getDefense());
+                          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->getForestFights());
+        sprintf(buf, "Forest Fights: %d", p->getForestFights());
         space = spaces(strlen(buf), " ");
-        notice(s_GameServ, sender->getNick(), "%s%sPlayer Fights: %d", buf, space, ni->stats->getPlayerFights());
+        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->getName().c_str());
-         }
+
     delete [] buf;
 }
 
@@ -617,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->getName().c_str());
-               #else
-               notice(s_GameServ, u, "IRC: %s     Game: %s", temp->getData()->getNick(), 
-                       temp->getData()->stats->getName().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;
@@ -694,12 +757,12 @@ void do_set(char *u)
       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;
       cmd = name;
-      target = user;
+      p = user->stats;
          
       if (!is_playing(user))
                {
@@ -723,12 +786,12 @@ void do_set(char *u)
       // 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)
+      if (isAdmin(user) || user == p->getClient())
                {
-                 target->stats->setPassword(cmd2);
+                 p->setPassword(cmd2);
                  notice(s_GameServ, u, "Password successfully changed");
                }
-      else if (user != target && !isAdmin(user))
+      else if (user != p->getClient() && !isAdmin(user))
                {
                  notice(s_GameServ, u, "You must be a %S admin to set other peoples' passwords.");
                  return;
@@ -751,9 +814,9 @@ void do_set(char *u)
                  return;
                }
          
-         target->stats->setBank(stringtoint(cmd2));
+         p->setBank(stringtoint(cmd2));
          
-         notice(s_GameServ, u, "Bank balance changed to %ld!", target->stats->getBank());
+         notice(s_GameServ, u, "Bank balance changed to %ld!", p->getBank());
     }
   else if (stricmp(cmd, "PLAYER") == 0)
     {
@@ -775,9 +838,9 @@ void do_set(char *u)
                          notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>");
                          return;
                        }
-                 target->stats->setPlayerFights(stringtoint(cmd2));
+                 p->setPlayerFights(stringtoint(cmd2));
                  
-                 notice(s_GameServ, u, "Player fights changed to %d!", target->stats->getPlayerFights());
+                 notice(s_GameServ, u, "Player fights changed to %d!", p->getPlayerFights());
                }         
     }
   else if (stricmp(cmd, "FOREST") == 0)
@@ -801,9 +864,9 @@ void do_set(char *u)
                          return;
                        }
                  
-                 target->stats->setForestFights(stringtoint(cmd2));
+                 p->setForestFights(stringtoint(cmd2));
                  
-                 notice(s_GameServ, u, "Forest fights changed to %d!", target->stats->getForestFights());
+                 notice(s_GameServ, u, "Forest fights changed to %d!", p->getForestFights());
                }         
     }
   else if (stricmp(cmd, "GOLD") == 0)
@@ -820,9 +883,9 @@ void do_set(char *u)
                          notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] GOLD <NUMBER>");
                          return;
                        }
-                 target->stats->setGold(stringtoint(cmd2));
+                 p->setGold(stringtoint(cmd2));
                  
-                 notice(s_GameServ, u, "Gold set to %ld", target->stats->getGold());
+                 notice(s_GameServ, u, "Gold set to %ld", p->getGold());
                  return;
                }
        }
@@ -841,9 +904,9 @@ void do_set(char *u)
                          return;
                        }
                  
-                 target->stats->setStrength(stringtoint(cmd2));
+                 p->setStrength(stringtoint(cmd2));
                  
-                 notice(s_GameServ, u, "Strength set to %d", target->stats->getStrength());
+                 notice(s_GameServ, u, "Strength set to %d", p->getStrength());
                  return;
                }
        }
@@ -862,9 +925,9 @@ void do_set(char *u)
                          return;
                        }
                  
-                 target->stats->setDefense(stringtoint(cmd2));
+                 p->setDefense(stringtoint(cmd2));
                  
-                 notice(s_GameServ, u, "Defense set to %d", target->stats->getDefense());
+                 notice(s_GameServ, u, "Defense set to %d", p->getDefense());
                  return;
                }
        }
@@ -882,9 +945,9 @@ void do_set(char *u)
                          notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HP <NUMBER>");
                          return;
                        }
-                 target->stats->setHP(stringtoint(cmd2));
+                 p->setHP(stringtoint(cmd2));
                  
-                 notice(s_GameServ, u, "HP set to %d", target->stats->getHP());
+                 notice(s_GameServ, u, "HP set to %d", p->getHP());
                  return;
                }
        }
@@ -902,9 +965,9 @@ void do_set(char *u)
                          notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] MAXHP <NUMBER>");
                          return;
                        }
-                 target->stats->setMaxHP(stringtoint(cmd2));
+                 p->setMaxHP(stringtoint(cmd2));
                  
-                 notice(s_GameServ, u, "MaxHP set to %d", target->stats->getMaxHP());
+                 notice(s_GameServ, u, "MaxHP set to %d", p->getMaxHP());
                  return;
                }
        }
@@ -923,9 +986,9 @@ void do_set(char *u)
                          return;
                        }
                  
-                 target->stats->setExp(stringtoint(cmd2));
+                 p->setExp(stringtoint(cmd2));
                  
-                 notice(s_GameServ, u, "Exp set to %ld", target->stats->getExp());
+                 notice(s_GameServ, u, "Exp set to %ld", p->getExp());
                  return;
                }
        }
@@ -943,9 +1006,9 @@ void do_set(char *u)
                          notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] LEVEL <NUMBER>");
                          return;
                        }
-                 target->stats->setLevel(stringtoint(cmd2));
+                 p->setLevel(stringtoint(cmd2));
                  
-                 notice(s_GameServ, u, "Level set to %d", target->stats->getLevel());
+                 notice(s_GameServ, u, "Level set to %d", p->getLevel());
                  return;
                }
        }
@@ -965,13 +1028,13 @@ void do_set(char *u)
                        }
                  else if (stricmp(cmd2, "TRUE") == 0)
                        {
-                         notice(s_GameServ, u, "%s has been Resurrected!", target->stats->getName().c_str());
-                         setAlive(target->stats);
+                         notice(s_GameServ, u, "%s has been Resurrected!", p->getName().c_str());
+                         setAlive(p);
                        }
                  else
                        {
-                         notice(s_GameServ, u, "%s is now dead!", target->stats->getName().c_str());
-                         clearAlive(target->stats);
+                         notice(s_GameServ, u, "%s is now dead!", p->getName().c_str());
+                         clearAlive(p);
                        }
                }
        }
@@ -997,13 +1060,13 @@ void do_set(char *u)
                        }
                  else if (stricmp(cmd2, "TRUE") == 0)
                        {
-                         notice(s_GameServ, u, "%s has seen their master now.", target->stats->getName().c_str());
-                         target->stats->addFlag(FLAG_MASTER);
+                         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.", target->stats->getName().c_str());
-                         target->stats->remFlag(FLAG_MASTER);
+                         notice(s_GameServ, u, "%s has not seen their master now.", p->getName().c_str());
+                         p->remFlag(FLAG_MASTER);
                        }
                }         
     }
@@ -1017,122 +1080,122 @@ void do_set(char *u)
 
 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->getName().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->getName().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",
+         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()
+                                 user->getRealNick()
 #else 
-                         user->getNick()
+                                 user->getNick()
 #endif
-                         );
-                 return;
-        }
-         user->stats->delMonster();
-         user->stats->delMaster();
-         clearDragonFight(user->stats);
-         
-         if (player_fight(user))
-           user->stats->getBattle()->stats->delBattle();
-
-         user->stats->delBattle();
-
-         temp = new aClient;
-         temp->stats = new Player;
-         temp->stats->setData(user->stats);
-         user->stats->setClient(NULL);
-         
-         
-         delete user->stats;
-         user->stats = NULL;
-         temp->stats->setClient(NULL);
-#ifdef P10
-         temp->setRealNick("Not Playing");
-#endif
-         temp->setNick("Not Playing");
-         
-         it->setNewPtr(temp);
+                                 );
+                         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",
+                 log("Logged out player %s",
 #ifdef P10 
-                 user->getRealNick()
+                         user->getRealNick()
 #else 
-                 user->getNick()
+                         user->getNick()
 #endif 
-                 );
+                         );
 #endif
-    }
-  clearPlaying(user);
+               }
+       }
+  if (user)
+       user->stats = NULL;
 }
 
 void do_register(char *u)
 {
   char *password, *name;
   aClient *user;
+  Player *p;
   name = strtok(NULL, " ");
   password = strtok(NULL, " ");
   
@@ -1148,7 +1211,15 @@ void do_register(char *u)
     {
          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!");
@@ -1157,10 +1228,6 @@ void do_register(char *u)
     {
          log("Fatal Error: Couldn't find %s in the clients list", u);
     }
-  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 (isIgnore(user))
     {
 #ifdef DEBUGMODE
@@ -1171,28 +1238,47 @@ void do_register(char *u)
     {
          if (!is_playing(user))
         {
-                 ListNode<aClient> *temp;
                  item *tempItem;
+                 unsigned long hv = iHASH((unsigned char *) name);
+
+                 // First create the Player
                  user->stats = new Player();
-                 user->stats->setClient(user); // Set the backwards pointer
-                 user->stats->reset(); // set the user up
+
+                 // 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);
-                 unsigned long hv = iHASH((unsigned char *) name);
+
+                 // Make sure they have a proper time stamp
                  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);
                  
+                 // 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());
-                 setPlaying(user); // set the playing flag
+
+                 // 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
                {
@@ -1204,7 +1290,8 @@ void do_register(char *u)
 void do_identify(char *u)
 {
   char *password, *name;
-  aClient *user, *p;
+  aClient *user;
+  Player *p;
   name = strtok(NULL, " ");
   password = strtok(NULL, " ");
   if (!password || !name)
@@ -1223,13 +1310,15 @@ void do_identify(char *u)
 #endif
          return;
     }
-  else if (!(p = findplayer(name)) || !p->stats)
-       notice(s_GameServ, u, "Player %s not found", name);
+  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!");
     }
-  else if (p->stats->getClient() != NULL && !isAdmin(user))
+  else if (is_playing(p->getClient()) && !isAdmin(user))
     {
          notice(s_GameServ, u, "That player has already identified.");
     }
@@ -1239,36 +1328,35 @@ void do_identify(char *u)
     }
   else
        {
-         ListNode<aClient> *temp;
-         unsigned long hv = iHASH((unsigned char *) p->stats->getName().c_str());
-         temp = players[hv].Find(p);
-         if (!temp)
+         list<Player*>::iterator iter;
+         unsigned long hv = iHASH((unsigned char *) p->getName().c_str());
+
+         iter = find(players[hv].begin(), players[hv].end(), p);
+
+         if (iter == players[hv].end())
                {
                  notice(s_GameServ, u, "Fatal error. Contact %S Admin. Buf: %s", 
                                 strtok(NULL, ""));
                  return;
                }
-         user->stats = new Player(p->stats->getName());
-#ifdef DEBUGMODE
-           log("Setting data for identified");
-#endif
-               user->stats->setData(p->stats);
-               user->stats->setClient(user);
-               updateTS(user->stats);
+         // 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
-               
-               setPlaying(user); // set the playing flag
-               
-               temp->setPtr(user);
+               //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);
     }
@@ -1302,7 +1390,8 @@ void do_stats(char *u)
                }
          else
                {
-                 updateTS(user->stats);
+                 if (!is_fighting(user))
+                       updateTS(user->stats);
                  showstats(u, user->stats->getName().c_str());
                }
     }
@@ -1374,7 +1463,7 @@ bool load_masters()
 void delete_monsters()
 {
   for (int x = 0; x < LEVELS; x++)
-       levels[x].monsters.deleteNodes();
+       levels[x].monsters.clear();
 }
 
 void display_monster(char *u)
@@ -1431,15 +1520,19 @@ bool is_playing(char *u)
 
 bool is_playing(aClient *user)
 {
-  if (user->stats == NULL)
+  if (!user)
     {
          return false;
     }
-  else if (user->stats->getClient() == NULL)
+  else if (!user->stats)
+       {
+         return false;
+       }
+  else if (!FL_is_playing(user))
     {
          return false;
     }
-  else if (!FL_is_playing(user))
+  else if (user->stats->getClient() != user)
     {
          return false;
     }
@@ -1479,9 +1572,9 @@ bool player_fight(aClient *user)
 {
   if (!is_playing(user))
        return false;
-  else if (user->stats->getBattle() != NULL && is_playing(user->stats->getBattle()))
+  else if (is_playing(user->stats->getBattle()))
     {
-         return user->stats->getBattle()->stats != NULL;
+         return true;
     }
   return false;
 }
@@ -1534,7 +1627,8 @@ bool alphaNumeric(const char *str)
 
 void do_fight(char *u)
 {
-  aClient *ni, *battle;
+  aClient *ni;
+  Player *battle;
   
   char *nick = strtok(NULL, " ");
   
@@ -1577,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);
     }
@@ -1596,38 +1690,38 @@ void do_fight(char *u)
         display_players(u);
         }
   */
-  else if (stricmp(ni->stats->getName().c_str(), battle->stats->getName().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->getName().c_str(), battle->stats->getBattle()->stats->getName().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->getName().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->getName().c_str(), battle->stats->getMonster()->name.c_str());
+         notice(s_GameServ, u, "%s is fighting %s already!", battle->getName().c_str(), battle->getMonster()->name.c_str());
     }
-  else if (!isAdmin(ni) && isFairFights() && (ni->stats->getStrength()/2 - battle->stats->getDefense()) > battle->stats->getHP())
+  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->stats->getName().c_str());
+         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->stats->getLevel() > maxbfightdistance)
+  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->getName().c_str());
+                        battle->getName().c_str());
     }
-  else if (battle->stats->getLevel() - ni->stats->getLevel() > 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)
@@ -1637,26 +1731,26 @@ void do_fight(char *u)
   else
        {
          // Set your battle pointer to the other player
-         ni->stats->setBattle(battle);
+         ni->stats->setBattle(battle->getClient());
          
          // Set the other player's battle pointer to you
-         battle->stats->setBattle(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->subtractPlayerFights(1);
          
-         notice(s_GameServ, u, "You challenge %s to an online duel!", battle->stats->getName().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->getName().c_str(), battle->stats->getName().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->getName().c_str());
-         notice(s_GameServ, battle->getNick(), "%s gets to go first "\
+         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->getNick(), "Please wait while %s decides what to do.", 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);
        }
 }
@@ -1694,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;
 
 
@@ -1717,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.");
@@ -1750,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())
@@ -1768,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)
 {
@@ -2031,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->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;
-       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()
@@ -2257,55 +2388,54 @@ 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;
@@ -2314,7 +2444,6 @@ int load_items()
 int load_gs_dbase()
 {
   ifstream infile;
-  aClient *temp;
   Player *p;
   char *tempname, *buf, *password;
   int tempnum;
@@ -2328,34 +2457,31 @@ int load_gs_dbase()
          return 0;
     }
   
+  
   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++)
                {
-                 if (tempNode->getData()->stats->getClient())
-                       {
-                         logout(tempNode->getData()->stats->getClient());
-                       }
-                 tempNode = tempNode->Next();
+                 logout((*iter)->getClient());
+                 delete (*iter);
                }
-         players[x].deleteNodes();
+         players[x].clear();
     }
   
   while (infile.getline(buf, 100000, '\n'))
        {
-         temp = new aClient;
          tempname = strtok(buf, " ");
-         temp->stats = new Player(tempname);
-         p = temp->stats;
+         p = new Player(tempname);
          
          p->setLevel(stringtoint(strtok(NULL, " ")));
          p->setExp(stringtoint(strtok(NULL, " ")));
          p->setGold(stringtoint(strtok(NULL, " ")));
          p->setBank(stringtoint(strtok(NULL, " ")));
-         p->setHP(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, " ")));
@@ -2363,65 +2489,65 @@ int load_gs_dbase()
          p->setFlags(stringtoint(strtok(NULL, " ")));
   
   
-  
-  password = strtok(NULL, " ");
-  p->setRawPassword(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);
+         
+         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, " ");
-         uses = stringtoint(tempname);
+         tempnum = stringtoint(tempname);
+         
+         if (tempnum != 0)
+               {
+                 tempitem = findItemByID(tempnum);
+                 p->setArmor(*tempitem);
+               }
          
-         item_iter = Items.begin();
-         while (item_iter != Items.end())
+         
+         unsigned long hv = iHASH((unsigned char *) p->getName().c_str());
+         
+         p->setClient(NULL);
+         
+         for (tempname = strtok(NULL, " "); tempname != NULL; tempname = strtok(NULL, " "))
                {
-                 if ((*item_iter)->getID() == id)
+                 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())
                        {
-                         // Don't sort every time you add an item or it eats CPU
-                         p->inventory->addItemNoChecks((*item_iter))->setUses(uses);
+                         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++;
                        }
-                 item_iter++;
                }
+         p->inventory->sort();
+         players[hv].push_back(p);
        }
-  p->inventory->sort();
-  
-  unsigned long hv = iHASH((unsigned char *) temp->stats->getName().c_str());
-  
-  temp->stats->setClient(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)
@@ -2448,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->getPassword().c_str(), plaintext);
+      return passcmp(p->getPassword().c_str(), plaintext);
     }
 }
 
@@ -2652,7 +2778,8 @@ void do_inventory(char *u)
          notice(s_GameServ, u, "You must be playing to check your inventory!");
          return;
     }
-  updateTS(user->stats);
+  if (!is_fighting(user))
+       updateTS(user->stats);
   showinventory(user->stats, user);
 }
 
@@ -2817,7 +2944,6 @@ void do_tavern(char *u)
                                {
                                  notice(s_GameServ, u, "One %s coming right up!", tempItem->getItem()->getName().c_str());
                                  user->stats->subtractGold(tempItem->getItem()->price());
-                                 notice(s_GameServ, u, "%d", user->stats->inventory->getCount());
                                }
                        }
                }
@@ -3058,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->setMonster(new Monster(dragon));
+  p->setMonster(&dragon);
   setDragonFight(p);
   display_monster(u);
 }
@@ -3203,11 +3329,9 @@ void see_master(char *u)
   
   if (!is_fighting(user) && is_playing(user))
     {
-         Monster *temp;
          Player *p = user->stats;
-         temp = new Monster(levels[p->getLevel() - 1].master);
-         p->setMyMaster(temp);
-         p->setMonster(temp);
+         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
     }
 }
@@ -3261,32 +3385,23 @@ void showBankBalance(const char *u)
 
 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));
                }
     }
 }
@@ -3321,8 +3436,9 @@ void refresh(Player *p)
 
 void do_refresh(char *u)
 {
-  char *nick = strtok(NULL, " ");
+  char *name = strtok(NULL, " ");
   aClient *user;
+  Player *p;
   
   if (!(user = find(u)))
     {
@@ -3342,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;
     }
 }
@@ -3382,18 +3483,12 @@ 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));
                }
        }
 }
@@ -3401,14 +3496,15 @@ void resetall()
 void reset(Player *p)
 {
   item *tempItem;
+
   if (!p)
        return;
   
   p->reset();
+  // 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
-  
+  p->inventory->addItem(tempItem)->use(p); // Add Clothes      
 }
 
 void updateTS(Player *p)
@@ -3423,6 +3519,7 @@ void updateTS(Player *p)
 #ifdef DEBUGMODE
   log("New timestamp for %s: %ld", p->getName().c_str(), p->lastcommand);
 #endif
+  PF_cleartimedout(p);
   
 }
 
@@ -3443,18 +3540,16 @@ bool timedOut(Player *p)
 
 void timeOutEvent(Player *p)
 {
-  aClient *user = findplayer(p->getName().c_str());
-  
-  if (!user || !p->getClient()) // 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->getBattle()->stats->lastcommand)
+         if (!PF_timedout(p->getBattle()->stats))
                {
                  // This person's last command was given earlier,
                  // so this person is the idler
@@ -3469,7 +3564,7 @@ void timeOutEvent(Player *p)
                  // Chance to wake up, but if the other player doesn't
                  // Attack now, they both get logged out.
                  updateTS(p);
-                 p->getBattle()->stats->lastcommand = p->lastcommand;
+                 PF_settimedout(p);
                  display_players(p->getBattle());
                  return;
                }
@@ -3479,18 +3574,18 @@ void timeOutEvent(Player *p)
                                 "You and %s timed out at the same time."\
                                 " Don't fight if you're just going to "\
                                 "sit there!", p->getName().c_str());
-                 notice(s_GameServ, user->getNick(),
+                 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->getBattle()->stats->getName().c_str());
                  logout(p->getBattle());
-                 logout(user);
+                 logout(p->getClient());
                  return;
                }
     }
-  else if (!player_fight(user))
+  else if (!player_fight(p->getClient()))
     {
-         if (isAlive(user->stats) && user->stats->getGold() > 0)
+         if (isAlive(p) && p->getGold() > 0)
                {
                  // Place fun stuff here :)
                  int randnum = 1 + rand() % 100; // 1-100
@@ -3500,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->getGold() / 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 "\
@@ -3508,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->subtractGold(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->getGold() / 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->subtractGold(stolen);
+                         p->subtractGold(stolen);
                        }
                  else if (randnum >= 75)
                        {
                          // 25-75% of your gold goes pffft - kain
-                         int stolen = (25 + (rand() % 51)) * (user->stats->getGold() / 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->subtractGold(stolen);
+                         p->subtractGold(stolen);
                        }
                }
          
          // Always log out the user
-         logout(user);
+         logout(p->getClient());
     }
 }
 
@@ -3541,6 +3636,7 @@ void do_reset(char *u)
 {
   char *nick = strtok(NULL, " ");
   aClient *user;
+  Player *p;
   
   if (!(user = find(u)))
     {
@@ -3557,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->getName().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)
@@ -3700,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;
@@ -3722,6 +3808,8 @@ bool load_monsters()
          if (!infile)
                {
                  log("Error opening %s", filename);
+                 delete []filename;
+                 delete []buf;
                  return false;
                }
          
@@ -3742,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();