]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv/gameserv.cpp
Moved all but the do_ functions out of gameserv.cpp and updated dependencies
[irc/gameservirc.git] / gameserv / gameserv.cpp
index b8a10a3c3063f1422c37c7bfdc1298f76dca6feb..42bd6f2446e423f4b7895b5b11297a89134dfdb2 100644 (file)
@@ -4,11 +4,13 @@
 #include "player.h"
 #include "pouch.h"
 #include "flags.h"
-#include "list.h"
 #include "level.h"
 #include "sockhelp.h"
 #include "item.h"
+#include "script.h"
+#include "toplist.h"
 
+#include <algorithm>
 #include <cctype>
 #include <fstream>
 #include <stdlib.h>
@@ -31,85 +33,13 @@ Monster dragon;                             // The current dragon
 Level levels[LEVELS];                  // The newest way to store monsters
 list<item*> Items;                      // The master list of items
 list<tavernItem> tavern;                // The list of items available at the tavern
-list<item*> store;                      // The list of items available at the store
-
-// Database functions
-int save_gs_dbase();
-int load_gs_dbase();
-int load_items();
-int load_tavern();
-int load_store();
-int load_dragon();
-int save_dragon();
-
-item *findItemByID(int id);
-item *findStoreItemByID(int id);
-tavernItem *findTavernItemByID(int id);
-
-// String functions
-#ifndef HAVE_STRTOK
-char *strtok(char *str, const char *delim);
-#endif
-
-int stricmp(const char *s1, const char *s2);
-int strnicmp(const char *s1, const char *s2, size_t len);
-// String Functions
-
-/********** Password functions **********/
-
-bool passcmp(const char *encrypted, char *plaintext); // Compares an encrypted pass with a plain text one
+list<item*> store;                      // List of items available at the store
 
-bool check_password(char *name, char *plaintext); // Finds a password for the given name, and checks it with passcmp against the plaintext password given.
+toplist myToplist;          // List of the top 10 players
 
-/********** Password functions **********/
 
 
-/********** GameServ Booleans **********/
-
 bool shuttingdown;
-bool timedOut(Player *p);
-void updateTS(Player *p);
-void timeOutEvent(Player *p);
-
-bool is_playing(char *u); // True if the given nickname in the clients list is playing.
-bool is_playing(aClient *user);
-
-bool is_fighting(char *u); // True if the given nick in the clients list is fighting anything.
-bool is_fighting(aClient *user);
-
-bool player_fight(char *u); // True if the player is fighting another player.
-bool player_fight(aClient *user);
-
-bool master_fight(char *u); // True if the player is fighting their master.
-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);
-void display_monster(char *u);
-void display_players(char *u);
-void display_players(aClient *user);
-long int chartoint(char ch);
-int isstringnum(char *num);
-long int pow (int x, int y);
-long int stringtoint(char *number);
-
-char *spaces(int len, char *seperator);
-void refresh(Player *p);
-void refreshall();
-void rollover(Player *p);
-void rolloverall();
-
-void updateTS(Player *p);
-void reset(Player *p);
-bool load_masters();
-bool load_monsters();
-bool load_levels();
-void delete_monsters();
 
 void do_admin(char *u);
 void do_attack(char *u);
@@ -136,14 +66,6 @@ void do_stats(char *u);
 void do_store(char *u);
 void do_tavern(char *u);
 void do_use(char *u);
-void see_master(char *u);
-
-void logout(aClient *user);
-void showstats(const char *u, const char *nick);
-void showTavern(aClient *user);
-void showinventory(Player *from, aClient *to);
-void showBankBalance(const char *u);
-void end_turn(aClient *user);
 
 #define WNA 16
 
@@ -153,440 +75,272 @@ 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 *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
+  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)
+           notice(s_GameServ, source, "SYNTAX: /msg <S SEARCH FOREST");
+         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)))
+    }
+  else if (stricmp(cmd, "FIGHT") == 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_fight(source);
+    }
+  else if (stricmp(cmd, "HEAL") == 0)
        {
-           notice(s_GameServ, source, "You must be a %S admin to use this command!");
-       }
-       else
+         do_heal(source);
+    }
+  else if (stricmp(cmd, "HELP") == 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_help(source);
+    }
+  else if (stricmp(cmd, "IDENTIFY") == 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_identify(source);
+    }
+  else if (stricmp(cmd, "INVENTORY") == 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_inventory(source);
+    }
+  else if (stricmp(cmd, "LIST") == 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_list(source);
+    }
+  else if (stricmp(cmd, "LOGOUT") == 0)
        {
-           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)))
+         do_logout(source);
+    }
+  else if (stricmp(cmd, "MASTER") == 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_master(source);
+    }
+  else if (stricmp(cmd, "NEWS") == 0)
        {
-           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)))
+         do_news(source);
+    }
+  else if (stricmp(cmd, "REGISTER") == 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);
-           }
-       }
-    } 
-
-    #ifndef P10
-       source--;  // Bring the ':' back so we don't leak memory
-    #endif
-    if (z == ':')
-       cmd--;     // Same thing :)
-}
-
-int stricmp(const char *s1, const char *s2)
-{
-    register int c;
-
-    while ((c = tolower(*s1)) == tolower(*s2)) {
-        if (c == 0)
-            return 0;
-        s1++;
-        s2++;
+         do_register(source);
     }
-    if (c < tolower(*s2))
-        return -1;
-    return 1;
-}
-
-void showstats(const char *u, const char *nick)
-{
-    aClient *ni, *sender = find(u);
-    char *buf;
-    buf = new char[50];
-    char *space;
-
-
-    if (!(ni = findplayer(nick)))
-         {
-        notice(s_GameServ, u, "%s not found", nick);
-         }
-    else if (ni->stats)
-         {
-        notice(s_GameServ, sender->getNick(), "Stats for %s:", ni->stats->getName().c_str());
-               
-        sprintf(buf, "Experience: %ld", ni->stats->getExp());
-        space = spaces(strlen(buf), " ");
-        notice(s_GameServ, sender->getNick(), "%s%sLevel: %d",  buf, space,
-                          ni->stats->getLevel());
-        delete [] space;
-               
-        sprintf(buf, "Gold: %ld", ni->stats->getGold());
-        space = spaces(strlen(buf), " ");
-        notice(s_GameServ, sender->getNick(), "%s%sGold in Bank: %ld", buf, space, ni->stats->getBank());
-        delete [] space;
-               
-        notice(s_GameServ, sender->getNick(), "Hit Points: %d of %d", ni->stats->getHP(),
-                          ni->stats->getMaxHP());
-               
-        sprintf(buf, "Strength: %d", ni->stats->getStrength());
-        space = spaces(strlen(buf), " ");
-        notice(s_GameServ, sender->getNick(), "%s%sDefense: %d",
-                          buf, space, ni->stats->getDefense());
-        delete [] space;
-               
-        sprintf(buf, "Armor: %s", (ni->stats->getArmor() ? ni->stats->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"));
-               
-        delete [] space;
-               
-        sprintf(buf, "Forest Fights: %d", ni->stats->getForestFights());
-        space = spaces(strlen(buf), " ");
-        notice(s_GameServ, sender->getNick(), "%s%sPlayer Fights: %d", buf, space, ni->stats->getPlayerFights());
-        delete [] space;
-               if (ni == sender || isAdmin(sender))
-                 {
-                       showinventory(ni->stats, sender);
-                 }
-         }
-    else
-         {
-               notice(s_GameServ, u, "%s is not playing!", ni->stats->getName().c_str());
-         }
-    delete [] buf;
-}
-
-char *spaces(int len, char *seperator)
-{
-    char *final;
-    final = new char[30];
-    int y;
-    strcpy(final, seperator);
-    for (y = 0; y < 30 - len; y++)
-        strcat(final, seperator);
-    return final;
-}
-
-void raw(const char *fmt, ...)
-{
-    va_list args;
-    char *input;
-    const char *t = fmt;
-    input = new char[1024];
-    va_start(args, fmt);
-    memset(input, 0, sizeof(input)); // Initialize to NULL
-    for (; *t; t++)
-    {
-       if (*t == '%')
+  else if (stricmp(cmd, "REFRESH") == 0)
        {
-           switch(*++t) {
-               case 'd': sprintf(input, "%s%d", input, va_arg(args, int)); break;
-               case 's': sprintf(input, "%s%s", input, va_arg(args, char *)); break;
-               case 'S': sprintf(input, "%s%s", input, s_GameServ); break;
-               case 'l':
-                  if (*++t == 'd')
-                         sprintf(input, "%s%ld", input, va_arg(args, long int)); break;
-           }
-       }
-       else
+         do_refresh(source);
+    }
+  else if (stricmp(cmd, "RESET") == 0)
        {
-           sprintf(input, "%s%c", input, *t);
-       }
-
+         do_reset(source);
     }
-    #ifdef DEBUGMODE
-       log("Input: %s", input);
-    #endif
-
-    sprintf(input, "%s%s", input, "\r\n");
-    sock_puts(sock, input);
-    delete [] input;
-    va_end(args);
-}
-/* Send a NOTICE from the given source to the given nick. */
-
-void notice(const char *source, const char *dest, const char *fmt, ...)
-{
-    if (fmt[0] == '\0')
-       return;
-
-    char *commanduse;
-    commanduse = new char[16];
-
-    #ifdef P10
-       if (isUsePrivmsg())
-           strcpy(commanduse, "P");
-       else
-           strcpy(commanduse, "O");
-    #else
-
-       if (isUsePrivmsg())
-           strcpy(commanduse, "PRIVMSG");
-       else
-           strcpy(commanduse, "NOTICE");
-    #endif
-
-    va_list args;
-    char *input;
-    const char *t = fmt;
-    input = new char[1024];
-    va_start(args, fmt);
-    if (dest[0] == ':')
-    {
-       dest++;
-
-      #if !defined(P10)
-       sprintf(input, ":%s %s %s :", source, commanduse, dest);
-      #else
-       sprintf(input, "%s %s %s :", gsnum, commanduse, dest);
-      #endif
-
-       dest--;
+  else if (stricmp(cmd, "RUN") == 0)
+       {
+         do_run(source);
     }
-    else
-    {
-      #if !defined(P10)
-       sprintf(input, ":%s %s %s :", source, commanduse, dest);
-      #else
-       sprintf(input, "%s %s %s :", gsnum, commanduse, dest);
-      #endif
+  else if (stricmp(cmd, "SET") == 0)
+       {
+         do_set(source);
     }
-
-    for (; *t; t++)
-    {
-       if (*t == '%')
+  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
+        {
+                 save_gs_dbase();
+        }
+    }
+  else if (stricmp(cmd, "LOAD") == 0)
        {
-           switch(*++t) {
-               case 'd': sprintf(input, "%s%d", input, va_arg(args, int)); break; 
-               case 's': sprintf(input, "%s%s", input, va_arg(args, char *)); break;
-               case 'S': sprintf(input, "%s%s", input, s_GameServ); break;
-               case 'c': sprintf(input, "%s%c", input, va_arg(args, int)); break;
-               case 'l':
-                  if (*++t == 'd')
-                         sprintf(input, "%s%ld", input, va_arg(args, long int)); break;
-           }
+         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 if (stricmp(cmd2, "SCRIPTS") == 0)
+                       {
+                         // Testing scripts for now
+                         script scr;
+                         notice(s_GameServ, source, "Loading scripts");
+
+                         if (scr.loadScript("test.txt"))
+                               scr.executeScript(user->stats);
+                       }
+                 else
+                       {
+                         display_help(source, cmd);
+                       }
+               }
        }
-       else
+#ifdef DEBUGMODE
+  else if (stricmp(cmd, "RAW") == 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 *rest = strtok(NULL, "");
+                 raw("%s", rest);
+               }
+    }
+  else if (stricmp(cmd, "RANDOM") == 0)
        {
-           sprintf(input, "%s%c", input, *t);
+         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);
+                       }
+               }
     }
-    #ifdef DEBUGMODE
-       log("Input: %s", input);
-    #endif
-    sprintf(input, "%s%s", input, "\r\n");
-    sock_puts(sock, input);
-    delete [] commanduse;
-    delete [] input;
-va_end(args);
-}
-
 
-int strnicmp(const char *s1, const char *s2, size_t len)
-{
-    register int c;
-
-    if (!len)
-        return 0;
-    while ((c = tolower(*s1)) == tolower(*s2) && len > 0) {
-        if (c == 0 || --len == 0)
-            return 0;
-        s1++;
-        s2++;
-    }
-    if (c < tolower(*s2))
-        return -1;
-    return 1;
-}
-
-#ifndef HAVE_STRTOK
-char *strtok(char *str, const char *delim)
-{
-    static char *current = NULL;
-    char *ret;
-
-    if (str)
-        current = str;
-    if (!current)
-        return NULL;
-    current += strspn(current, delim);
-    ret = *current ? current : NULL;
-    current += strcspn(current, delim);
-    if (!*current)
-        current = NULL;
-    else
-        *current++ = 0;
-    return ret;
-}
+#ifndef P10
+  source--;  // Bring the ':' back so we don't leak memory
 #endif
+  if (z == ':')
+       cmd--;     // Same thing :)
+}
 
 void do_check(char *u)
 {
@@ -617,61 +371,95 @@ 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;
+  
+  if (cmd == NULL || stricmp(cmd, "TOP") == 0)
+  {
+    list<PlayerWrapper>::iterator iter;
     bool header = false;
 
-  for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
+    if (myToplist.empty())
+      {
+         notice(s_GameServ, u, "There are no players");
+         return;
+      }
+    myToplist.sort();
+    myToplist.reverse();
+     
+    iter = myToplist.begin();
+     
+    while (iter != myToplist.end())
+    {
+        if (!header)
+        {
+           notice(s_GameServ, u, "Top Players");
+           header = true;
+
+        }
+        notice(s_GameServ, u, "Level: %2d Exp: %10d Name: %s", 
+        (*iter).getLevel(), (*iter).getExp(), (*iter).getName().c_str());
+        iter++;
+     }
+  }
+  else
   {
-    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();
-       }
-    }
+        
+     list<Player*>::iterator iter;
+     bool header = false;
+   
+     for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
+      {
+        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)
+      notice(s_GameServ, u, "No one is playing");
+     else
+      notice(s_GameServ, u, "End of List"); 
    }
-    if (!header)
-       notice(s_GameServ, u, "No one is playing");
-    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;
@@ -691,15 +479,15 @@ void do_set(char *u)
     }
   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}");
+      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))
                {
@@ -713,7 +501,7 @@ void do_set(char *u)
     }
   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}");
+         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;
        }
   
@@ -723,14 +511,14 @@ 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.");
+                 notice(s_GameServ, u, "You must be a <S admin to set other peoples' passwords.");
                  return;
                }
     }
@@ -747,13 +535,13 @@ void do_set(char *u)
                }
          if (!cmd2)
                {
-                 notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] [BANK] BALANCE <NUMBER>");
+                 notice(s_GameServ, u, "SYNTAX: /msg <S SET [NAME] [BANK] BALANCE <NUMBER>");
                  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)
     {
@@ -764,7 +552,7 @@ void do_set(char *u)
                }
       else if (stricmp(cmd2, "FIGHTS") != 0)
                {
-                 notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>");
+                 notice(s_GameServ, u, "SYNTAX: /msg <S SET [NAME] PLAYER FIGHTS <NUMBER>");
                  return;
                }
       else
@@ -772,12 +560,12 @@ void do_set(char *u)
                  cmd2 = strtok(NULL, " ");
                  if (!cmd2)
                        {
-                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>");
+                         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)
@@ -789,7 +577,7 @@ void do_set(char *u)
                }
       else if (stricmp(cmd2, "FIGHTS") != 0)
                {
-                 notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] FOREST FIGHTS <number>");
+                 notice(s_GameServ, u, "SYNTAX: /msg <S SET [NAME] FOREST FIGHTS <number>");
                  return;
                }
       else
@@ -797,13 +585,13 @@ void do_set(char *u)
                  cmd2 = strtok(NULL, " ");
                  if (!cmd2)
                        {
-                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] FOREST FIGHTS <NUMBER>");
+                         notice(s_GameServ, u, "SYNTAX: /msg <S SET [NAME] FOREST FIGHTS <NUMBER>");
                          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)
@@ -817,12 +605,12 @@ void do_set(char *u)
                {
                  if (!cmd2)
                        {
-                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] GOLD <NUMBER>");
+                         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;
                }
        }
@@ -837,13 +625,13 @@ void do_set(char *u)
                {
                  if (!cmd2)
                        {
-                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] STRENGTH <NUMBER>");
+                         notice(s_GameServ, u, "SYNTAX: /msg <S SET [NAME] STRENGTH <NUMBER>");
                          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;
                }
        }
@@ -858,13 +646,13 @@ void do_set(char *u)
                {
                  if (!cmd2)
                        {
-                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] DEFENSE <NUMBER>");
+                         notice(s_GameServ, u, "SYNTAX: /msg <S SET [NAME] DEFENSE <NUMBER>");
                          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;
                }
        }
@@ -879,12 +667,17 @@ void do_set(char *u)
                {
                  if (!cmd2)
                        {
-                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HP <NUMBER>");
+                         notice(s_GameServ, u, "SYNTAX: /msg <S SET [NAME] HP <NUMBER>");
                          return;
                        }
-                 target->stats->setHP(stringtoint(cmd2));
+
+                 // Make sure it's easy for an admin to set the hp
+                 if (p->getMaxHP() < stringtoint(cmd2))
+                       p->setMaxHP(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;
                }
        }
@@ -899,12 +692,12 @@ void do_set(char *u)
                {
                  if (!cmd2)
                        {
-                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] MAXHP <NUMBER>");
+                         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;
                }
        }
@@ -919,13 +712,13 @@ void do_set(char *u)
                {
                  if (!cmd2)
                        {
-                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {EXPERIENCE|EXP} <NUMBER>");
+                         notice(s_GameServ, u, "SYNTAX: /msg <S SET [NAME] {EXPERIENCE|EXP} <NUMBER>");
                          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;
                }
        }
@@ -940,12 +733,12 @@ void do_set(char *u)
                {
                  if (!cmd2)
                        {
-                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] LEVEL <NUMBER>");
+                         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;
                }
        }
@@ -960,18 +753,18 @@ void do_set(char *u)
                {
                  if (!cmd2)
                        {
-                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] ALIVE TRUE|FALSE");
+                         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!", 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);
                        }
                }
        }
@@ -984,7 +777,7 @@ void do_set(char *u)
                }
       else if (stricmp(cmd2, "MASTER") != 0)
                {
-                 notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] SEEN MASTER {TRUE|FALSE}");
+                 notice(s_GameServ, u, "SYNTAX: /msg <S SET [NAME] SEEN MASTER {TRUE|FALSE}");
                  return;
                }
       else
@@ -992,157 +785,114 @@ void do_set(char *u)
                  cmd2 = strtok(NULL, " ");
                  if (!cmd2)
                        {
-                         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NICK] SEEN MASTER {TRUE|FALSE}");
+                         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->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);
                        }
                }         
     }
   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}");
+         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 (!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);
-       }
-    }
-    else if (!name)
+  
+  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 (!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());
+               }
     }
-}
-
-void logout(aClient *user)
-{
-    if (is_playing(user))
+  else if (!name)
     {
-       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",
-               #ifdef P10 
-                   user->getRealNick()
-               #else 
-                   user->getNick()
-               #endif
-               );
-            return;
-        }
-
-       temp = new aClient;
-       temp->stats = new Player;
-       temp->stats->setData(user->stats);
-       user->stats->setClient(NULL);
-
-       if (player_fight(user))
-           user->stats->getBattle()->stats->delBattle();
-
-       delete user->stats;
-       user->stats = NULL;
-       temp->stats->setClient(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
+         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);
+               }
     }
-    clearPlaying(user);
 }
 
 void do_register(char *u)
 {
   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)
     {
-         notice(s_GameServ, u, "You can't use %S as a name!");
+         notice(s_GameServ, u, "You can't use <S as a name!");
     }
   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!");
@@ -1151,10 +901,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
@@ -1165,32 +911,55 @@ 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);
+
+                 // Attempt to add the player to the top list
+                 // The class takes care of pruning the user out if they don't deserve to be in the list
+                 myToplist.insertPlayer(user->stats);
                }
          else
                {
-                 notice(s_GameServ, u, "Already registered. Contact a %S admin for help.");
+                 notice(s_GameServ, u, "Already registered. Contact a <S admin for help.");
                }
     }
 }
@@ -1198,12 +967,13 @@ 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)
     {
-         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)))
     {
@@ -1217,13 +987,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.");
     }
@@ -1233,36 +1005,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", 
+                 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);
     }
@@ -1296,7 +1067,8 @@ void do_stats(char *u)
                }
          else
                {
-                 updateTS(user->stats);
+                 if (!is_fighting(user))
+                       updateTS(user->stats);
                  showstats(u, user->stats->getName().c_str());
                }
     }
@@ -1304,242 +1076,25 @@ void do_stats(char *u)
        showstats(u, nick);
 }
 
-bool load_masters()
-{
-  ifstream infile(masterdata);
-  char *buf;
-  int l = 0;
-  buf = new char[1024];
-  
-  if (infile.fail())
-    {
-         log("Error opening %s", masterdata);
-         return false;
-    }
-  
-#ifdef DEBUGMODE
-  log("Loading masters from %s", masterdata);
-#endif
-  
-  for (l = 0; l < LEVELS - 1; l++)
-    {
-         infile.getline(buf, 1024, '\n');
-         
-         log("%s", buf);
-         if (buf[0] == '#' || buf[0] == '\n' || buf[0] == '\r')
-               {
-                 l--;
-                 continue;
-               }
-         else if (buf[0] == '^')
-           break;
-         
-         Monster *master = &levels[l].master;
-         
-         char *name, *weapon, *strength, *gold, *exp, *maxhp, *death;
-         
-         
-         name = strtok(buf, "~");
-         weapon = strtok(NULL, "~");
-         strength = strtok(NULL, "~");
-         gold = strtok(NULL, "~");
-         exp = strtok(NULL, "~");
-         maxhp = strtok(NULL, "~");
-         death = strtok(NULL, "~");
-       
-         master->name = name;
-         master->weapon = weapon;
-         master->strength = stringtoint(strength);
-         master->gold = stringtoint(gold);
-         master->exp = stringtoint(exp);
-         master->maxhp = stringtoint(maxhp);
-         master->hp = master->maxhp;
-         master->death = death;
-    }
-
-  delete []buf;
-  
-  if (l < LEVELS - 1)  // We didn't load a master for every level - check data/masters.dat
-       return false;
-  else
-       return true;
-}
-
-void delete_monsters()
-{
-  for (int x = 0; x < LEVELS; x++)
-       levels[x].monsters.deleteNodes();
-}
-
-void display_monster(char *u)
-{
-  if (is_playing(u))
-    {
-         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)))
-    {
-         log("Fatal error in display_players(): Couldn't find %s", u);
-    }
-  else
-       display_players(user);
-}
-
-void display_players(aClient *user)
-{
-  char *u = user->getNick();
-  if (is_playing(user) && player_fight(user))
-    {
-         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)))
-       return false;
-  else
-       return is_playing(user);
-}
-
-bool is_playing(aClient *user)
-{
-  if (user->stats == NULL)
-    {
-         return false;
-    }
-  else if (user->stats->getClient() == NULL)
-    {
-         return false;
-    }
-  else if (!FL_is_playing(user))
-    {
-         return false;
-    }
-  else
-       return true;
-}
-
-bool is_fighting(char *u)
-{
-  aClient *user;
-  
-  if (!(user = find(u)))
-       return false;
-  else
-       return is_fighting(user);
-}
-
-bool is_fighting(aClient *user)
-{
-  if (!is_playing(user))
-       return false;
-  else
-       return player_fight(user) || master_fight(user) || user->stats->getMonster() != NULL;
-}
-
-bool player_fight(char *u)
-{
-  aClient *user;
-  
-  if (!(user = find(u)))
-       return false;
-  else 
-       return player_fight(user);
-}
-
-bool player_fight(aClient *user)
-{
-  if (!is_playing(user))
-       return false;
-  else if (user->stats->getBattle() != NULL && is_playing(user->stats->getBattle()))
-    {
-         return user->stats->getBattle()->stats != NULL;
-    }
-  return false;
-}
-
-bool master_fight(char *u)
-{
-  aClient *user;
-  
-  if (!(user = find(u)))
-       return false;
-  else
-       return master_fight(user);
-}
-
-bool master_fight(aClient *user)
-{
-  if (!is_playing(user))
-       return false;
-  else
-       return user->stats->getMaster() != NULL;
-}
 
-bool dragon_fight(char *u)
-{
-  aClient *user;
-  if (!(user = find(u)))
-       return false;
-  else
-       return dragon_fight(user);
-}
 
-bool dragon_fight(aClient *user)
-{
-  if (!is_playing(user))
-       return false;
-  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)))
-               return false;
-       }
-  return true;
-}
 
 void do_fight(char *u)
 {
-  aClient *ni, *battle;
+  aClient *ni;
+  Player *battle;
   
   char *nick = strtok(NULL, " ");
   
   if (!nick)
     {
-         notice(s_GameServ, u, "SYNTAX: /msg %S FIGHT PLAYER");
+         notice(s_GameServ, u, "SYNTAX: /msg <S FIGHT PLAYER");
          return;
     }
   else if (!(ni = find(u)))
     {
-         notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, ""));
+         notice(s_GameServ, u, "Fatal error. Contact a(n) <S admin. buf: %s", strtok(NULL, ""));
          return;
     }
   else if (isIgnore(ni))
@@ -1571,7 +1126,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);
     }
@@ -1590,38 +1145,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)
@@ -1631,26 +1186,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);
        }
 }
@@ -1667,12 +1222,12 @@ void do_equip(char *u)
   if (!item || int(item[0]) < 48 || int(item[0] > 57))
     {
       notice(s_GameServ, u, "SYNTAX: EQUIP ####");
-      notice(s_GameServ, u, "Type /msg %S HELP EQUIP for more information.");
+      notice(s_GameServ, u, "Type /msg <S HELP EQUIP for more information.");
       return;
     }
   else if (!(user = find(u)))
     {
-      notice(s_GameServ, u, "Fatal error in do_equip. Contact a(n) %S Admin");
+      notice(s_GameServ, u, "Fatal error in do_equip. Contact a(n) <S Admin");
       return;
     }
   else if (isIgnore(user))
@@ -1688,7 +1243,8 @@ void do_equip(char *u)
       return;
     }
   id = stringtoint(item);
-  updateTS(user->stats);
+  if (!is_fighting(user))
+       updateTS(user->stats);
   p = user->stats->inventory;
 
 
@@ -1702,7 +1258,7 @@ void do_equip(char *u)
       }
     else if (equip->getItem()->getType() != ARMOR && equip->getItem()->getType() != WEAPON)
       {
-               notice(s_GameServ, u, "You can't use %s like that. Try /msg %S use", equip->getItem()->getName().c_str());
+               notice(s_GameServ, u, "You can't use %s like that. Try /msg <S use", equip->getItem()->getName().c_str());
       }
     else
       {
@@ -1711,24 +1267,26 @@ 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.");
+         notice(s_GameServ, u, "Type /msg <S HELP USE for more information.");
          return;
     }
   else if (!(user = find(u)))
     {
-         notice(s_GameServ, u, "Fatal Error in do_use. Contact a(n) %S Admin");
+         notice(s_GameServ, u, "Fatal Error in do_use. Contact a(n) <S Admin");
          return;
     }
   else if (isIgnore(user))
@@ -1744,10 +1302,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())
@@ -1758,19 +1326,43 @@ void do_use(char *u)
        }
   else if (used->getItem()->getType() != POTION)
        {
-         notice(s_GameServ, u, "You can't use %s like that. Try /msg %S equip", used->getItem()->getName().c_str());
+         notice(s_GameServ, u, "You can't use %s like that. Try /msg <S equip", used->getItem()->getName().c_str());
        }
   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)
 {
@@ -1779,7 +1371,7 @@ void do_run(char *u)
   
   if (!(user = find(u)))
     {
-         notice(s_GameServ, u, "Couldn't find you. Error. Contact a %S admin");
+         notice(s_GameServ, u, "Couldn't find you. Error. Contact a <S admin");
          return;
     }
   else if (isIgnore(user))
@@ -1814,6 +1406,7 @@ void do_run(char *u)
          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();
+         p->delBattle();
        }
   else if (player_fight(user) && !isYourTurn(p))
     {
@@ -1829,85 +1422,6 @@ void do_run(char *u)
        }
 }
 
-void end_turn(aClient *user)
-{
-  char *nick, *u = user->getNick();
-  Monster *fight;
-  aClient *battle;
-  int mhit;
-  
-  nick = new char[strlen(user->getNick()) + 1];
-  
-  if (!user || !is_playing(user) || !is_fighting(user))
-       goto endturn;
-  
-  if (!player_fight(user) && !master_fight(user))
-       fight = user->stats->getMonster();
-  else
-       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->getDefense());
-    }
-  else
-    {
-         // Opponent's Hit
-         mhit = (battle->stats->getStrength() / 2) + (rand() % (battle->stats->getStrength() / 2)) - user->stats->getDefense();
-    }
-  if (!player_fight(user))
-    {
-         
-         if (mhit > 0)
-        {
-                 notice(s_GameServ, u, "\1f%s\1f attacks with their \1f%s\1f for \ 2%d\ 2 damage!",
-                                fight->name.c_str(), fight->weapon.c_str(), mhit);
-        }
-         else if (mhit <= 0)
-               notice(s_GameServ, u, "%s completely misses you!", fight->name.c_str());
-         
-         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->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->getMaster()->name.c_str());
-                         user->stats->delMonster();
-                         user->stats->delMaster();
-                         goto endturn;
-            }
-        }
-         else
-        {
-                 if (mhit > 0)
-                       user->stats->subtractHP(mhit);
-                 display_monster(u);
-                 goto endturn;
-        }
-    }
-  else
-    {
-         clearYourTurn(user->stats);
-         setYourTurn(battle->stats);
-         display_players(battle);
-    }
- endturn:
-  delete []nick;
-}
 
 void do_heal(char *u)
 {
@@ -1917,12 +1431,12 @@ void do_heal(char *u)
   
   if (!amount)
     {
-         notice(s_GameServ, u, "SYNTAX: /msg %S HEAL {ALL | #}");
+         notice(s_GameServ, u, "SYNTAX: /msg <S HEAL {ALL | #}");
          return;
     }
   else if (!(ni = find(u)))
     {
-       notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, ""));
+       notice(s_GameServ, u, "Fatal error. Contact a(n) <S admin. buf: %s", strtok(NULL, ""));
        return;
     }
     else if (isIgnore(ni))
@@ -2004,453 +1518,11 @@ void do_heal(char *u)
     else if (amount[0] == '-')
         notice(s_GameServ, u, "You trying to cheat?");
     else
-       notice(s_GameServ, u, "SYNTAX: /msg %S HEAL {ALL | #}");
+       notice(s_GameServ, u, "SYNTAX: /msg <S HEAL {ALL | #}");
 }
 
-int isstringnum(char *num)
-{
-    unsigned int x;
-    for (x = 0; x < strlen(num); x++)
-    {
-        if ((int)num[x] < 48 || (int)num[x] > 57)
-            return 0;
-    }
-return 1;
-}
 
-long int stringtoint(char *number)
-{
-    return atol(number);
-}
 
-long int pow(int x, int y)
-{
-    long int value = 0;
-    int count = 0;
-    value += x;
-
-    if (x != 0 && y != 0)
-    {
-        for (count = 1; count <= y - 1; count++)
-            value *= x;
-    }
-    else
-        return 1;
-return value;
-}
-
-long int chartoint(char ch)
-{
-       if (int(ch) >= 48 && int(ch) <= 57)
-               return int(ch) - 48;
-       else
-               return 0;
-}
-
-int save_gs_dbase()
-{
-    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)
-    {
-       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();
-    }
-   }
-outfile.close();
-return 1;
-}
-
-int load_dragon()
-{
-    ifstream infile;
-    char *buf;
-
-    infile.open(dragondata);
-
-    if (infile.fail())
-    {
-       infile.clear();
-       log ("Error opening %s. Trying initialdragon.dat", dragondata);
-       infile.open("data/initialdragon.dat");
-       if (infile.fail())
-        {
-           log ("Error opening data/initialdragon.dat");
-           return 0;
-       }
-    }
-
-    buf = new char[1024];
-
-    infile.getline(buf, 1024, '\n');
-    infile.close(); // Done with the file... we have what we want
-
-    dragon.name = strtok(buf, "~");
-    dragon.weapon = strtok(NULL, "~");
-    dragon.gold = 0;
-    dragon.exp = 0;
-    dragon.strength = stringtoint(strtok(NULL, "~"));
-    dragon.hp = stringtoint(strtok(NULL, "~"));
-    dragon.defense = stringtoint(strtok(NULL, "~"));
-    dragon.death = strtok(NULL, "");
-
-    log ("loaded dragon: %s", dragon.name.c_str());
-
-    delete []buf;
-
-return save_dragon();  // Save the dragon file and return the status code :)
-}
-
-int save_dragon()
-{
-    ofstream outfile;
-
-    outfile.open(dragondata);
-
-    if (outfile.fail())
-    {
-       log ("Error opening %s. Exiting.", dragondata);
-       return 0;
-    }
-
-    outfile << dragon.name.c_str() << '~' << dragon.weapon.c_str() << '~' 
-               << dragon.strength << '~' << dragon.hp << '~' 
-               << dragon.defense << '~' << dragon.death.c_str() << "\n^"
-               << endl;
-
-outfile.close();
-
-return 1;
-}
-
-int load_store()
-{
-  ifstream infile;
-  char *buf;
-  item *tempItem;
-  buf = new char[1024];
-  long id;
-  
-  infile.open(storeitemdata);
-  
-  if (infile.fail())
-    {
-      log("Error opening %s", storeitemdata);
-      return 0;
-    }
-  
-  while (infile.getline(buf, 1024, '\n'))
-    {
-      try
-       {
-         if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0')
-           {
-             item *tempItem2;
-             id = stringtoint(strtok(buf, ""));
-             tempItem2 = findItemByID(id);
-             if (tempItem2 == NULL)
-               {
-                 log("Invalid ID in %s", storeitemdata);
-                 return 0;
-               }
-
-             tempItem = tempItem2;
-             store.push_back(tempItem);
-           }
-       }
-      catch (char *str)
-       {
-         log("Exception loading store: %s", str);
-         delete []buf;
-         return 0;
-       }
-    }
-  delete []buf;
-  return 1;
-}
-int load_tavern()
-{
-  ifstream infile;
-  char *buf;
-  tavernItem tempItem;
-  buf = new char[1024];
-  long id, level;
-
-  infile.open(tavernitemdata);
-  if (infile.fail())
-    {
-      log("Error opening %s", tavernitemdata);
-      return 0;
-    }
-
-  while (infile.getline(buf, 1024, '\n'))
-    {
-      try
-       {
-         if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0')
-           {
-             item *tempItem2;
-             id = stringtoint(strtok(buf, "~"));
-             level = stringtoint(strtok(NULL, ""));
-             tempItem2 = findItemByID(id);
-             if (tempItem2 == NULL)
-               {
-                 log("Invalid ID in %s", tavernitemdata);
-                 return 0;
-               }
-             tempItem.setItem(tempItem2);
-             tempItem.setLevel(level);
-             tavern.push_back(tempItem);
-           }
-       }
-      catch (char *str)
-       {
-         log("Exception loading tavern: %s", str);
-         delete []buf;
-         return 0;
-       }
-    }
-  delete []buf;
-  return 1;
-}
-int load_items()
-{
-  ifstream infile;
-  char *buf;
-  item *tempItem;
-
-
-  buf = new char[1024];
-
-  infile.open(itemdata);
-
-  if (infile.fail())
-    {
-      log("Error opening %s", itemdata);
-      return 0;
-    }
-
-  while (infile.getline(buf, 1024, '\n'))
-    {
-      if (buf[0] == '^')
-       break;
-      try
-       {
-         if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0')
-           {
-             switch(buf[0])
-               {
-               case '1':
-                 tempItem = new weapon();
-                 break;
-               case '2':
-                 tempItem = new armor();
-                 break;
-               case '3':
-                 tempItem = new potion();
-                 break;
-               default:
-                 log("Invalid Item Type %c in %s", buf[0], itemdata);
-                 delete []buf;
-                 return 0;
-                 break;
-               }
-             if(tempItem->setData(buf))
-               {
-                 Items.push_back(tempItem);
-               }
-           }
-       }
-      catch (char *str)
-       {
-         log("Exception loading items: %s", str);
-         delete []buf;
-         return 0;
-       }
-    }
-  delete []buf;
-  return 1;
-}
-
-int load_gs_dbase()
-{
-  ifstream infile;
-  aClient *temp;
-  Player *p;
-  char *tempname, *buf, *password;
-  int tempnum;
-  buf = new char[100000];
-  
-  infile.open(playerdata);
-  
-  if (infile.fail())
-    {
-         log("Error opening %s", playerdata);
-         return 0;
-    }
-  
-  for (int x = 0; x < U_TABLE_SIZE; x++)
-    {
-         ListNode<aClient> *tempNode;
-         tempNode = players[x].First();
-         while (tempNode)
-               {
-                 if (tempNode->getData()->stats->getClient())
-                       {
-                         logout(tempNode->getData()->stats->getClient());
-                       }
-                 tempNode = tempNode->Next();
-               }
-         players[x].deleteNodes();
-    }
-  
-  while (infile.getline(buf, 100000, '\n'))
-       {
-         temp = new aClient;
-         tempname = strtok(buf, " ");
-         temp->stats = new Player(tempname);
-         p = temp->stats;
-         
-         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, " ")));
-         p->setMaxHP(stringtoint(strtok(NULL, " ")));
-         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);
-  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->getName().c_str());
-  
-  temp->stats->setClient(NULL);
-  players[hv].insertAtBack(temp);
-  delete temp;
-}
-delete [] buf;
-infile.close();
-return 1;
-}
-
-bool passcmp(const char *encrypted, char *plaintext)
-{
-  char salt[3];
-  char *plaintext2, *plainToencrypt;
-  bool same = false;
-  
-  plaintext2 = new char[strlen(encrypted) + strlen(plaintext)]; // Extra
-  strcpy(plaintext2, plaintext);
-  
-  salt[0] = encrypted[0];
-  salt[1] = encrypted[1];
-  salt[3] = '\0';
-  
-  plainToencrypt = crypt(plaintext2, salt);
-  
-  same = (strcmp((const char *)encrypted, plainToencrypt) == 0 ? true : false);
-  
-  delete []plaintext2;
-  
-  return same;
-}
-
-bool check_password(char *name, char *plaintext)
-{
-  aClient *client;
-  
-  if (!(client = findplayer(name)))
-    return false;
-  else
-    {
-      return passcmp(client->stats->getPassword().c_str(), plaintext);
-    }
-}
 
 void do_store(char *u)
 {
@@ -2511,11 +1583,12 @@ void do_store(char *u)
                          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, "%s%ld. %20s..........%ld", 
+              ((*item_iterator)->getID() < 10 ? " " : ""), 
+              (*item_iterator)->getID(), (*item_iterator)->getName().c_str(), (*item_iterator)->price());
                                }
                        }
-                 notice(s_GameServ, u, "To purchase a weapon, type /msg %S STORE BUY \ 2#\ 2.");
+                 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.");
                  
                }
@@ -2527,13 +1600,14 @@ void do_store(char *u)
             {
                          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, "%s%ld. %20s..........%d",
+              ((*item_iterator)->getID() < 10 ? " " : ""), 
+               (*item_iterator)->getID(), (*item_iterator)->getName().c_str(), 
+               (*item_iterator)->price());
                                }
             }
                  
-                 notice(s_GameServ, u, "To purchase armor, type /msg %S store buy #");
+                 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.");
                }
       
@@ -2566,12 +1640,15 @@ void do_store(char *u)
                  notice(s_GameServ, u, "You can't afford to buy %s", tempItem->getName().c_str());
                  return;
                }
-      else
+      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());
-                 p->inventory->addItem(tempItem);
-                 notice(s_GameServ, u, "Don't forget to type /msg %S equip %ld", tempItem->getID());
+                 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)
@@ -2581,7 +1658,7 @@ void do_store(char *u)
       id = stringtoint(num);
       if (!isstringnum(num))
                {
-                 notice(s_GameServ, u, "SYNTAX: /msg %S store sell #");
+                 notice(s_GameServ, u, "SYNTAX: /msg <S store sell #");
                  return;
                }
       else if (!(tempContainer = p->inventory->Find(id)))
@@ -2628,7 +1705,7 @@ void do_inventory(char *u)
   
   if (!(user = find(u)))
     {
-         notice(s_GameServ, u, "Fatal Error. Contact a %S admin!");
+         notice(s_GameServ, u, "Fatal Error. Contact a <S admin!");
          return;
     }
   else if (isIgnore(user))
@@ -2643,54 +1720,11 @@ 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);
 }
 
-void showinventory(Player *from, aClient *to)
-{
-  char *nick;
-  if (!to || !from)
-       {
-         return;
-       }
-
-  nick = to->getNick();
-  
-  if (from->inventory->isEmpty())
-       {
-         notice(s_GameServ, nick, "You aren't carrying anything");
-         return;
-       }
-  
-  list <itemContainer> *items;
-  items = from->inventory->getItems();
-  
-  list <itemContainer>::iterator item_iter, item_iter2;
-  item_iter = items->begin();
-  
-  notice(s_GameServ, nick, "Inventory for %s:", from->getName().c_str());
-  long count;
-  while (item_iter != items->end())
-       {
-         // Display a list of counted items so as not to show an extra line for duplicate items
-         count = 0;
-         item_iter2 = item_iter;
-         while (item_iter != items->end() && (*item_iter) == (*item_iter2))
-           {
-             if ((*item_iter) == (*item_iter2))
-                       {
-                         ++count;
-                       }
-             else
-                       {
-                         break;
-                       }
-             ++item_iter;
-           }
-         notice(s_GameServ, nick, "%ld.) %s (%ld)", (*item_iter2).getItem()->getID(), (*item_iter2).getItem()->getName().c_str(), count);
-       }
-}
 
 void do_tavern(char *u)
 {
@@ -2701,7 +1735,7 @@ void do_tavern(char *u)
   
   if (!(user = find(u)))
     {
-      notice(s_GameServ, u, "Fatal Error. See a %S admin for help");
+      notice(s_GameServ, u, "Fatal Error. See a <S admin for help");
       return;
     }
   else if (isIgnore(user))
@@ -2729,14 +1763,14 @@ void do_tavern(char *u)
     {
       notice(s_GameServ, u, "Welcome to Boot Liquors Mystic Apothecary and General Store");
       notice(s_GameServ, u, "Your commands:");
-      notice(s_GameServ, u, "/msg %S TAVERN {LIST | BUY} [NUMBER]");
+      notice(s_GameServ, u, "/msg <S TAVERN {LIST | BUY} [NUMBER]");
       notice(s_GameServ, u, "What'll it be?");
     }
   else if (stricmp(cmd, "LIST") == 0)
     {
       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 #");
+      notice(s_GameServ, u, "To buy an item, type /msg <S TAVERN BUY #");
     }
   else if (stricmp(cmd, "BUY") == 0)
     {
@@ -2750,8 +1784,8 @@ void do_tavern(char *u)
       if (!chid)
                {
                  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");
+                 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);
@@ -2762,7 +1796,7 @@ void do_tavern(char *u)
                  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 #");
+                 notice(s_GameServ, u, "To buy an item, type /msg <S TAVERN BUY #");
                  return;
                }
       else if (!amount && user->stats->getGold() < tempItem->getItem()->price())
@@ -2770,14 +1804,14 @@ void do_tavern(char *u)
                  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 #");
+                 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 # [#]");
+                 notice(s_GameServ, u, "To buy an item, type /msg <S TAVERN BUY # [#]");
                }
          else
                {
@@ -2815,7 +1849,7 @@ void do_tavern(char *u)
   else
     {
       notice(s_GameServ, u, "Improper Syntax.");
-      notice(s_GameServ, u, "Type /msg %S HELP TAVERN for help");
+      notice(s_GameServ, u, "Type /msg <S HELP TAVERN for help");
     }
   return;
 }
@@ -2837,7 +1871,7 @@ void do_bank(char *u)
     }
   else if (!(user = find(u)))
     {
-         notice(s_GameServ, u, "Fatal Error. Couldn't find your aClient. Contact a(n) %S "\
+         notice(s_GameServ, u, "Fatal Error. Couldn't find your aClient. Contact a(n) <S "\
                         " admin for help");
          log("Fatal Error. Couldn't find %s while executing do_bank()", u);
          return; 
@@ -2993,7 +2027,7 @@ void do_dragon(char *u)
   
   if (!(user = find(u)))
     {
-         notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, ""));
+         notice(s_GameServ, u, "Fatal error. Contact a(n) <S admin. buf: %s", strtok(NULL, ""));
          return;
     }
   else if (isIgnore(user))
@@ -3048,7 +2082,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);
 }
@@ -3060,7 +2094,7 @@ void do_master(char *u)
   
   if (!(user = find(u)))
     {
-         notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, ""));
+         notice(s_GameServ, u, "Fatal error. Contact a(n) <S admin. buf: %s", strtok(NULL, ""));
          return;
     }
   else if (isIgnore(user))
@@ -3181,398 +2215,44 @@ void do_master(char *u)
     }
 }
 
-void see_master(char *u)
-{
-  aClient *user;
-
-  if (!(user = find(u)))
-    {
-         notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, ""));
-         return;       
-    }
-  
-  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);
-         display_monster(u);  // Since master is the same structure, use this function
-    }
-}
-
-void showTavern(aClient *user)
-{
-  Player *p;
-  list<tavernItem>::iterator item_iterator;
-  item *tempItem;
-  
-  p = user->stats;
-  
-  if (!p)
-    return;
-  
-  item_iterator = tavern.begin();
-  if (tavern.empty())
-    {
-      notice(s_GameServ, user->getNick(), "Tavern is empty");
-      return;
-    }
-  
-  while (item_iterator != tavern.end())
-    {
-      if (p->getLevel() < (*item_iterator).getLevel())
-               {
-                 item_iterator++;
-                 continue;
-               }
-      tempItem = (*item_iterator).getItem();
-      notice(s_GameServ, user->getNick(), "%d. %s for %ld gold", tempItem->getID(), tempItem->getName().c_str(), tempItem->price());
-      item_iterator++;
-    }
-}
-
-void showBankBalance(const char *u)
-{
-  aClient *user;
-  Player *p;
-  
-  if (!(user = find(u)))
-       return;
-  
-  p = user->stats;
-  
-  if (!p)
-       return;
-  
-  notice(s_GameServ, u, "Account Balance: %ld     Gold On hand: %ld", p->getBank(), p->getGold());
-}
-
-void rolloverall()
-{
-  ListNode <aClient> *it;
-  Player *p;
-  for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
-    {
-      it = players[x].First();
-      while (it)
-               {
-                 p = it->getData()->stats;
-                 rollover(p);
-                 it = it->Next();
-               }
-    }
-}
-void refreshall()
-{
-  ListNode <aClient> *it;
-  Player *p;
-  for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
-    {
-      it = players[x].First();
-      
-      while (it)
-               {
-                 p = it->getData()->stats;
-                 refresh(p);
-                 it = it->Next();
-               }
-    }
-}
-
-void rollover(Player *p)
-{
-  if (!p)
-    return;
-  
-  p->addForestFights(numrolloverfights);
-  
-  if (p->getForestFights() > maxforestfights)
-    p->setForestFights(maxforestfights);
-}
-
-void refresh(Player *p)
-{
-  if (!p)
-       return;
 
-  if (p->getHP() < p->getMaxHP())
-       p->healall();
-  if (p->getForestFights() < forestfights)
-       {
-         p->setForestFights(forestfights);
-       }
-  
-  p->setPlayerFights(3);
-  setAlive(p);
-  clearMaster(p);
-}
-
-void do_refresh(char *u)
-{
-  char *nick = strtok(NULL, " ");
-  aClient *user;
-  
-  if (!(user = find(u)))
-    {
-         notice(s_GameServ, u, "Error: aClient not found. Contact a %S admin");
-         log("Error: aClient not found: %s", u);
-         return;
-    }
-  else if (isIgnore(user))
-    {
-#ifdef DEBUGMODE
-         log("Ignoring %s.", user->getNick());
-#endif
-         return;
-    }
-  else if (!isAdmin(user))
-    {
-         notice(s_GameServ, u, "You must be a %S admin to use this command!");
-         return;
-    }
-  if (!nick)
-    {
-         notice(s_GameServ, u, "SYNTAX: REFRESH {ALL | NICK}");
-         return;
-    }
-  else if (stricmp(nick, "ALL") == 0)
-    {
-         notice(s_GameServ, u, "Refreshing everyone's stats!");
-         refreshall();
-    }
-  else if ((user = findplayer(nick)))
-    {
-         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
-               }
-    }
-  else
-    {
-         notice(s_GameServ, u, "Nick %s not found.", nick);
-         return;
-    }
-}
-
-
-void resetall()
-{
-  ListNode <aClient> *it;
-  Player *p;
-  
-  for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
-       {
-         it = players[x].First();
-         
-         while (it)
-               {
-                 p = it->getData()->stats;
-                 reset(p);
-                 it = it->Next();
-               }
-       }
-}
-
-void reset(Player *p)
-{
-  item *tempItem;
-  if (!p)
-       return;
-  
-  p->reset();
-  tempItem = findItemByID(3001);
-}
-
-void updateTS(Player *p)
-{
-  if (!p)
-       return;
-  
-#ifdef DEBUGMODE
-  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->getName().c_str(), p->lastcommand);
-#endif
-  
-}
-
-bool timedOut(Player *p)
-{
-  if (!p)
-       return false;
-  else if (p->lastcommand == 0)
-       return false;
-  else
-    {
-         if ((time(NULL) - p->lastcommand) >= maxidletime)
-           return true;
-         
-         return false;
-    }
-}
-
-void timeOutEvent(Player *p)
-{
-  aClient *user = findplayer(p->getName().c_str());
-  
-  if (!user || !p->getClient()) // then they're not playing
-       return;
-  
-  char *nick = user->getNick();
-  
-  if (player_fight(user) && isYourTurn(p))
-    {
-         // Check to see if they were the idler or if it was the other 
-         // person
-         if (p->lastcommand != p->getBattle()->stats->lastcommand)
-               {
-                 // 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->getBattle()->getNick(),
-                                "%s hesitated for too long. Your move.", p->getName().c_str());
-                 clearYourTurn(p);
-                 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->getBattle()->stats->lastcommand = p->lastcommand;
-                 display_players(p->getBattle());
-                 return;
-               }
-         else
-               {
-                 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->getName().c_str());
-                 notice(s_GameServ, user->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);
-                 return;
-               }
-    }
-  else if (!player_fight(user))
-    {
-         if (isAlive(user->stats) && user->stats->getGold() > 0)
-               {
-                 // Place fun stuff here :)
-                 int randnum = 1 + rand() % 100; // 1-100
-#define GSN(s) notice(s_GameServ, nick, s)
-#define GSN2(s, f) notice(s_GameServ, nick, s, f)
-                 
-                 if (randnum < 50)
-                       {
-                         // 35-100% of your gold goes pffft - kain
-                         int stolen = (35 + (rand() % 66)) * (user->stats->getGold() / 100);
-                         
-                         GSN("You stop for a moment to rest on the "\
-                                 "street corner. All of a sudden, you "\
-                                 "are ambushed from all sides by a hoarde "\
-                                 "of knife wielding thugs.");
-                         GSN2("The thugs beat you into utter submission "\
-                                  "and steal %ld gold from you!", stolen);
-                         user->stats->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);
-                         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);
-                       }
-                 else if (randnum >= 75)
-                       {
-                         // 25-75% of your gold goes pffft - kain
-                         int stolen = (25 + (rand() % 51)) * (user->stats->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);
-                       }
-               }
-         
-         // Always log out the user
-         logout(user);
-    }
-}
 
 void do_reset(char *u)
 {
   char *nick = strtok(NULL, " ");
   aClient *user;
+  Player *p;
   
   if (!(user = find(u)))
     {
-         notice(s_GameServ, u, "Error: aClient not found. Contact a %S admin");
+         notice(s_GameServ, u, "Error: aClient not found. Contact a <S admin");
          log("Error: aClient not found: %s", u);
          return;
     }
   else if (!isAdmin(user))
     {
-         notice(s_GameServ, u, "You must be a %S admin to use this command!");
+         notice(s_GameServ, u, "You must be a <S admin to use this command!");
          return;
     }
   
   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)
@@ -3582,61 +2262,7 @@ void do_help(char *u)
   display_help(u, cmd);
 }
 
-void display_help(char *u, char *file)
-{
-  ifstream infile;
-  char *buf;
-  
-  if (!file)
-    {
-         infile.open("helpfiles/help");
-         if (infile.fail())
-               {
-                 log("Error opening helpfiles/help");
-                 notice(s_GameServ, u, "Error opening helpfiles/help");
-                 return;
-               }
-         buf = new char[1024];
-         while(infile.getline(buf, 1024))
-               {
-                 // Written this way, it will process %S in the helpfiles
-                 // Instead of notice(s_GameServ, u, "%s", buf);
-                 notice(s_GameServ, u, buf);
-               }
-         
-         // Minor recursion
-         aClient *user = find(u);
-         if (user && isAdmin(user))
-           display_help(u, "admin_commands");
-    }
-  else
-    {
-         char *filename;
-         filename = new char[strlen(file) + 11];
-         strcpy(filename, "helpfiles/");
-         strcat(filename, file);
-         
-         for (unsigned int x = 10; x < strlen(filename); x++)
-           filename[x] = tolower(filename[x]);
-         
-         infile.open(filename);
-         delete [] filename;
-         if (infile.fail())
-               {
-                 notice(s_GameServ, u, "No help for \ 2%s\ 2", file);
-                 return;
-               }
-         buf = new char[1024];
-         while(infile.getline(buf, 1024))
-               {
-                 // Written this way, it will process %S in the helpfiles
-                 // Instead of notice(s_GameServ, u, "%s", buf);
-                 notice(s_GameServ, u, buf);
-               }
-    }
-  infile.close();
-  delete [] buf;
-}
+
 
 void do_admin(char *u)
 {
@@ -3646,7 +2272,7 @@ void do_admin(char *u)
   if (!(user = find(u)))
     {
          log("Error: aClient not found: %s", u);
-         notice(s_GameServ, u, "Error: aClient not found. Contact %S admin.");
+         notice(s_GameServ, u, "Error: aClient not found. Contact <S admin.");
          return;
     }
   
@@ -3678,114 +2304,3 @@ void do_admin(char *u)
     }
 }
 
-bool load_levels()
-{
-  char *filename;
-  filename = new char[256];
-  
-  for (int x = 1; x <= LEVELS; x++)
-    {
-         sprintf(filename, "data/levels/level%d.dat", x);
-         if (levels[x - 1].loadLevel(filename) == false)
-           return false;
-    }
-  
-  delete []filename;
-  return true;
-}
-bool load_monsters()
-{
-  char *filename;
-  ifstream infile;
-  char *buf;
-  buf = new char[2048];
-  
-  for (int level = 1; level <= LEVELS; level++)
-       {
-         filename = new char[256];
-         sprintf(filename, "data/monsters/level%d.dat", level);
-         infile.open(filename);
-         
-         if (!infile)
-               {
-                 log("Error opening %s", filename);
-                 return false;
-               }
-         
-#ifdef DEBUGMODE
-         log("Loading monsters from %s", filename);
-#endif
-         
-         while (infile.getline(buf, 2048))
-               {
-                 if (buf[0] == '^')
-                       break;
-                 if (buf[0] == '\n' || buf[0] == '\0' || buf[0] == '#')
-                       continue;
-                 Monster *temp;
-                 temp = new Monster;
-                 
-                 temp->name = strtok(buf, "~");
-                 temp->weapon = strtok(NULL, "~");
-                 temp->death = strtok(NULL, "~");
-                 
-                 levels[level - 1].monsters.insertAtBack_RLN(temp);
-                 delete temp;
-               }
-         delete [] filename;
-         infile.close();
-       }
-  delete [] buf;
-  return true;
-}
-
-item *findItemByID(int id)
-{
-  list<item*>::iterator item_iterator;
-  
-  item_iterator = Items.begin();
-  
-  while (item_iterator != Items.end())
-    {
-      if ((*item_iterator)->getID() == id)
-               {
-                 return (*item_iterator);
-               }
-      item_iterator++;
-    }
-  return NULL;
-}
-
-item *findStoreItemByID(int id)
-{
-  list<item*>::iterator item_iterator;
-  
-  item_iterator = store.begin();
-  
-  while (item_iterator != store.end())
-    {
-      if ((*item_iterator)->getID() == id)
-               {
-                 return (*item_iterator);
-               }
-      item_iterator++;
-    }
-  return NULL;
-}
-
-tavernItem *findTavernItemByID(int id)
-{
-  list<tavernItem>::iterator item_iterator;
-  
-  item_iterator = tavern.begin();
-  
-  while (item_iterator != tavern.end())
-    {
-      if ((*item_iterator).getItem()->getID() == id)
-               {
-                 return &(*item_iterator);
-               }
-      item_iterator++;
-    }
-  return NULL;
-}