]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv/gameserv.cpp
Shrunk the dependencies immensely with forward declarations in all H files instead...
[irc/gameservirc.git] / gameserv / gameserv.cpp
index 8926afea894f02e69bf2a0c7060f613854ee213f..18bd0fe246f5cdb58199af991df577d179ba77b5 100644 (file)
@@ -1,17 +1,21 @@
 #include "aClient.h"
 #include "config.h"
 #include "extern.h"
+#include "player.h"
+#include "pouch.h"
 #include "flags.h"
 #include "list.h"
 #include "level.h"
 #include "sockhelp.h"
+#include "item.h"
 
 #include <cctype>
 #include <fstream>
+#include <stdlib.h>
+#include <list>
+#include <iterator>
 
-using std::ifstream;
-using std::ofstream;
-using std::ios;
+using namespace std;
 
 #if defined(HAVE_CRYPT_H)
 
@@ -23,12 +27,14 @@ using std::ios;
 
 #endif
 
-
+Monster dragon;                                // The current dragon
 Level levels[LEVELS];                  // The newest way to store monsters
 
 // Database functions
 int save_gs_dbase();
 int load_gs_dbase();
+int load_dragon();
+int save_dragon();
 
 // String functions
 #ifndef HAVE_STRTOK
@@ -383,36 +389,23 @@ void showstats(const char *u, const char *nick)
         notice(s_GameServ, sender->getNick(), "Hit Points: %d of %d", ni->stats->hp,
                  ni->stats->maxhp);
 
-        sprintf(buf, "Strength: %d", ni->stats->strength + webonus[ni->stats->weapon]);
+        sprintf(buf, "Strength: %d", ni->stats->strength + webonus[ni->stats->wea]);
         space = spaces(strlen(buf), " ");
         notice(s_GameServ, sender->getNick(), "%s%sDefense: %d",
-                 buf, space, ni->stats->defense + arbonus[ni->stats->armor]);
+                 buf, space, ni->stats->defense + arbonus[ni->stats->arm]);
         delete [] space;
 
-        sprintf(buf, "Armor: %s", armors[ni->stats->armor]);
+        sprintf(buf, "Armor: %s", armors[ni->stats->arm]);
         space = spaces(strlen(buf), " ");
         notice(s_GameServ, sender->getNick(), "%s%sWeapon: %s", buf, space,
-                 weapons[ni->stats->weapon]);
+                 weapons[ni->stats->wea]);
         delete [] space;
 
         sprintf(buf, "Forest Fights: %d", ni->stats->forest_fights);
         space = spaces(strlen(buf), " ");
         notice(s_GameServ, sender->getNick(), "%s%sPlayer Fights: %d", buf, space, ni->stats->player_fights);
         delete [] space;
-       Pouch *inv = &ni->stats->inventory;
-
-       notice(s_GameServ, u, "Potions");
-       sprintf(buf, "Healing: %d", inv->Healing());
-       space = spaces(strlen(buf), " ");
-       notice(s_GameServ, sender->getNick(), "%s%sHP: %d", buf, 
-               space, inv->HP());
-       delete [] space;
-
-       sprintf(buf, "Strength: %d", inv->Strength());
-       space = spaces(strlen(buf), " ");
-       notice(s_GameServ, sender->getNick(), "%s%sDefense: %d", buf, 
-               space, inv->Defense());
-       delete [] space;
+       showinventory(ni, ni);
     }
     else
     {
@@ -675,7 +668,7 @@ void do_set(char *u)
     }
   else if (!name)
     {
-      notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|WEAPON|ARMOR|HP POTIONS|STRENGTH POTIONS|DEFENSE POTIONS|HEALING POTIONS|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)))
@@ -731,7 +724,14 @@ void do_set(char *u)
        }
 
        target->stats->bank = stringtoint(cmd2);
-       notice(s_GameServ, u, "Bank balance changed to %s!", cmd2);
+
+       // Cheap bounds checking
+       if (target->stats->bank > 2000000000)
+           target->stats->bank = 2000000000;
+       else if (target->stats->bank < 0)
+           target->stats->bank *= -1;
+
+       notice(s_GameServ, u, "Bank balance changed to %ld!", target->stats->bank);
     }
   else if (stricmp(cmd, "PLAYER") == 0)
     {
@@ -754,7 +754,11 @@ void do_set(char *u)
                return;
            }
          target->stats->player_fights = stringtoint(cmd2);
-         notice(s_GameServ, u, "Player fights changed to %s!", cmd2);
+
+         if (target->stats->player_fights < 0)
+             target->stats->player_fights *= -1;
+
+         notice(s_GameServ, u, "Player fights changed to %d!", target->stats->player_fights);
        }         
     }
   else if (stricmp(cmd, "FOREST") == 0)
@@ -777,8 +781,13 @@ void do_set(char *u)
                notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] FOREST FIGHTS <NUMBER>");
                return;
            }
+
          target->stats->forest_fights = stringtoint(cmd2);
-         notice(s_GameServ, u, "Forest fights changed to %s!", cmd2);
+
+         if (target->stats->forest_fights < 0)
+             target->stats->forest_fights *= -1;
+
+         notice(s_GameServ, u, "Forest fights changed to %d!", target->stats->forest_fights);
        }         
     }
   else if (stricmp(cmd, "GOLD") == 0)
@@ -796,7 +805,13 @@ void do_set(char *u)
            return;
        }
          target->stats->gold = stringtoint(cmd2);
-         notice(s_GameServ, u, "Gold set to %s", cmd2);
+
+         if (target->stats->gold > 2000000000)
+             target->stats->gold = 2000000000;
+         else if (target->stats->gold < 0)
+             target->stats->gold *= -1;
+
+         notice(s_GameServ, u, "Gold set to %ld", target->stats->gold);
          return;
        }
   }
@@ -816,7 +831,11 @@ void do_set(char *u)
        }
 
          target->stats->strength = stringtoint(cmd2);
-         notice(s_GameServ, u, "Strength set to %s", cmd2);
+
+         if (target->stats->strength < 0)
+               target->stats->strength *= -1;
+
+         notice(s_GameServ, u, "Strength set to %d", target->stats->strength);
          return;
        }
   }
@@ -836,7 +855,11 @@ void do_set(char *u)
        }
 
          target->stats->defense = stringtoint(cmd2);
-         notice(s_GameServ, u, "Defense set to %s", cmd2);
+
+         if (target->stats->defense < 0)
+               target->stats->defense *= -1;
+
+         notice(s_GameServ, u, "Defense set to %d", target->stats->defense);
          return;
        }
   }
@@ -855,7 +878,11 @@ void do_set(char *u)
            return;
        }
          target->stats->hp = stringtoint(cmd2);
-         notice(s_GameServ, u, "HP set to %s", cmd2);
+
+         if (target->stats->hp < 0)
+               target->stats->hp *= -1;
+
+         notice(s_GameServ, u, "HP set to %d", target->stats->hp);
          return;
        }
   }
@@ -874,7 +901,11 @@ void do_set(char *u)
            return;
        }
          target->stats->maxhp = stringtoint(cmd2);
-         notice(s_GameServ, u, "MaxHP set to %s", cmd2);
+
+         if (target->stats->maxhp < 0)
+               target->stats->maxhp *= -1;
+
+         notice(s_GameServ, u, "MaxHP set to %d", target->stats->maxhp);
          return;
        }
   }
@@ -894,7 +925,13 @@ void do_set(char *u)
        }
 
          target->stats->exp = stringtoint(cmd2);
-         notice(s_GameServ, u, "Exp set to %s", cmd2);
+
+         if (target->stats->exp > 2000000000)
+               target->stats->exp = 2000000000;
+         else if (target->stats->exp < 0)
+               target->stats->exp *= -1;
+
+         notice(s_GameServ, u, "Exp set to %ld", target->stats->exp);
          return;
        }
   }
@@ -913,126 +950,13 @@ void do_set(char *u)
            return;
        }
          target->stats->level = stringtoint(cmd2);
-         notice(s_GameServ, u, "Level set to %s", cmd2);
-         return;
-       }
-  }
-  else if (stricmp(cmd, "WEAPON") == 0)
-  {
-    if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;         
-       }
-    else
-       {
-       if (!cmd2)
-       {
-           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] WEAPON <NUMBER>");
-           return;
-       }
 
-         target->stats->weapon = stringtoint(cmd2);
-         notice(s_GameServ, u, "Weapon set to %s", weapons[target->stats->weapon]);
-         return;
-       }
-  }
-  else if (stricmp(cmd, "ARMOR") == 0)
-  {
-    if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;         
-       }
-    else
-       {
-       if (!cmd2)
-       {
-           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] ARMOR <NUMBER>");
-           return;
-       }
-         target->stats->armor = stringtoint(cmd2);
-         notice(s_GameServ, u, "Armor set to %s", armors[target->stats->armor]);
-         return;
-       }
-  }
-  else if (stricmp(cmd, "HP") == 0 && stricmp(cmd2, "POTIONS") == 0)
-  {
-    if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;         
-       }
-    else
-       {
-         cmd2 = strtok(NULL, " ");
-       if (!cmd2)
-       {
-           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HP POTIONS <NUMBER>");
-           return;
-       }
-         target->stats->inventory.setHP(stringtoint(cmd2));
-         notice(s_GameServ, u, "HP Potions set to %s", cmd2);
-         return;
-       }
-  }
-  else if (stricmp(cmd, "HEALING") == 0 && stricmp(cmd2, "POTIONS") == 0)
-  {
-    if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;         
-       }
-    else
-       {
-         cmd2 = strtok(NULL, " ");
-       if (!cmd2)
-       {
-           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HEALING POTIONS <NUMBER>");
-           return;
-       }
-         target->stats->inventory.setHealing(stringtoint(cmd2));
-         notice(s_GameServ, u, "Healing Potions set to %s", cmd2);
-         return;
-       }
-  }
-  else if (stricmp(cmd, "STRENGTH") == 0 && stricmp(cmd2, "POTIONS") == 0)
-  {
-    if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;         
-       }
-    else
-       {
-         cmd2 = strtok(NULL, " ");
-       if (!cmd2)
-       {
-           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] STRENGTH POTIONS <NUMBER>");
-           return;
-       }
-         target->stats->inventory.setStrength(stringtoint(cmd2));
-         notice(s_GameServ, u, "Strength Potions set to %s", cmd2);
-         return;
-       }
-  }
-  else if (stricmp(cmd, "DEFENSE") == 0 && stricmp(cmd2, "POTIONS") == 0)
-  {
-    if (!isAdmin(user))
-       {
-         notice(s_GameServ, u, "Admins Only!");
-         return;         
-       }
-    else
-       {
-         cmd2 = strtok(NULL, " ");
-       if (!cmd2)
-       {
-           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] DEFENSE POTIONS <NUMBER>");
-           return;
-       }
-         target->stats->inventory.setDefense(stringtoint(cmd2));
-         notice(s_GameServ, u, "Defense Potions set to %s", cmd2);
+         if (target->stats->level < 0)
+               target->stats->level = 1;
+         else if (target->stats->level > REALLEVELS)
+               target->stats->level = REALLEVELS;
+
+         notice(s_GameServ, u, "Level set to %d", target->stats->level);
          return;
        }
   }
@@ -1053,13 +977,13 @@ void do_set(char *u)
          }
          else if (stricmp(cmd2, "TRUE") == 0)
          {
-            notice(s_GameServ, u, "Target has been Resurrected!");
-            target->addFlag(FLAG_ALIVE);
+            notice(s_GameServ, u, "%s has been Resurrected!", target->stats->name.c_str());
+            setAlive(target->stats);
          }
          else
          {
-            notice(s_GameServ, u, "Target is now dead!");
-            target->remFlag(FLAG_ALIVE);
+            notice(s_GameServ, u, "%s is now dead!", target->stats->name.c_str());
+            clearAlive(target->stats);
          }
        }
   }
@@ -1085,12 +1009,12 @@ void do_set(char *u)
          }
          else if (stricmp(cmd2, "TRUE") == 0)
          {
-            notice(s_GameServ, u, "Target has seen their master now.");
+            notice(s_GameServ, u, "%s has seen their master now.", target->stats->name.c_str());
             target->addFlag(FLAG_MASTER);
          }
          else
          {
-            notice(s_GameServ, u, "Target has not seen their master now.");
+            notice(s_GameServ, u, "%s has not seen their master now.", target->stats->name.c_str());
             target->remFlag(FLAG_MASTER);
          }
        }         
@@ -1098,7 +1022,7 @@ void do_set(char *u)
   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|WEAPON|ARMOR|HP POTIONS|STRENGTH POTIONS|DEFENSE POTIONS|HEALING POTIONS|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;
   }
 }
@@ -1222,6 +1146,11 @@ void do_register(char *u)
     {
        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!");
+       return;
+    }
     else if (!password)
     {
        notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD");
@@ -1247,7 +1176,7 @@ void do_register(char *u)
         if (!is_playing(user))
         {
            ListNode<aClient> *temp;
-           user->stats = new Player(user);
+           user->stats = new Player();
            user->stats->client = user; // Set the backwards pointer
            user->stats->reset(); // set the user up
            user->stats->setPassword(password);
@@ -1382,22 +1311,22 @@ void do_stats(char *u)
 
 bool load_masters()
 {
-    ifstream infile("data/masters.dat");
+    ifstream infile(masterdata);
     char *buf;
     int l = 0;
     buf = new char[1024];
 
     if (infile.fail())
     {
-       log("Error opening data/masters.dat");
+       log("Error opening %s", masterdata);
        return false;
     }
 
     #ifdef DEBUGMODE
-       log("Loading masters from data/masters.dat");
+       log("Loading masters from %s", masterdata);
     #endif
 
-    for (l = 0; l < LEVELS; l++)
+    for (l = 0; l < LEVELS - 1; l++)
     {
        infile.getline(buf, 1024, '\n');
 
@@ -1435,7 +1364,7 @@ bool load_masters()
 
     delete []buf;
 
-    if (l < LEVELS)  // We didn't load a master for every level - check data/masters.dat
+    if (l < LEVELS - 1)  // We didn't load a master for every level - check data/masters.dat
        return false;
     else
        return true;
@@ -1549,7 +1478,7 @@ bool player_fight(aClient *user)
 {
     if (!is_playing(user))
        return false;
-    else if (user->stats->battle != NULL)
+    else if (user->stats->battle != NULL && is_playing(user->stats->battle))
     {
        return user->stats->battle->stats != NULL;
     }
@@ -1588,7 +1517,7 @@ bool dragon_fight(aClient *user)
     if (!is_playing(user))
        return false;
     else
-       return (user->stats->level == LEVELS && master_fight(user));
+       return (isDragonFight(user->stats));
 }
 void do_fight(char *u)
 {
@@ -1714,6 +1643,7 @@ void do_fight(char *u)
 
 void do_use(char *u)
 {
+  /*
     aClient *user;
     Pouch *p;
 
@@ -1842,6 +1772,8 @@ void do_use(char *u)
     }
 
     end_turn(user); // If they're fighting, end their turn
+  */
+  return;
 }
 void do_run(char *u)
 {
@@ -1920,14 +1852,14 @@ void end_turn(aClient *user)
         // Opponent's Hit
         mhit = (fight->strength / 2) +
                (rand() % (fight->strength / 2) - (user->stats->defense +
-                arbonus[user->stats->armor]));
+                arbonus[user->stats->arm]));
     }
     else
     {
         // Opponent's Hit
-        mhit = (((battle->stats->strength + webonus[battle->stats->weapon]) / 2) +
-               (rand() % ((battle->stats->strength + webonus[battle->stats->weapon])) / 2) -
-               (user->stats->defense + arbonus[user->stats->armor]));
+        mhit = (((battle->stats->strength + webonus[battle->stats->wea]) / 2) +
+               (rand() % ((battle->stats->strength + webonus[battle->stats->wea])) / 2) -
+               (user->stats->defense + arbonus[user->stats->arm]));
     }
     if (!player_fight(user))
     {
@@ -1981,362 +1913,6 @@ endturn:
     delete nick;
 }
 
-void do_attack(char *u)
-{
-    int hit, mhit;
-    aClient *ni, *battle; // The player and perhaps the player they're fighting
-    Monster *fight; // The monster they may be fighting
-
-    if (!(ni = find(u)))
-    {
-       notice(s_GameServ, u, "Fatal error in do_attack. Contact a(n) %S admin for help.");
-       return;
-    }
-    else if (isIgnore(ni))
-    {
-       #ifdef DEBUGMODE
-           log("Ignoring %s.", ni->getNick());
-       #endif
-       return;
-    }
-    else if (!is_playing(ni))
-    {
-       notice(s_GameServ, u, "You're not playing!");
-       return;
-    }
-    else if (!is_fighting(ni))
-    {
-       notice(s_GameServ, u, "You're not in battle!");
-       return;
-    }
-    else
-    {
-       if (!ni->stats->master) // This is not a master fight
-               fight = ni->stats->fight;       // Monster      Could be NULL
-       else                    // This IS a master fight
-               fight = ni->stats->master;      // Master       Could be NULL
-
-       battle = ni->stats->battle;             // Player       Could be NULL
-
-       // One has to be !NULL based on the previous else if
-       // We wouldn't be here if they were all NULL
-    }
-    updateTS(ni->stats);
-
-    if (!player_fight(ni))
-    {
-       // Player's Hit
-        hit = ((ni->stats->strength + webonus[ni->stats->weapon]) / 2) +
-              (rand() % ((ni->stats->strength + webonus[ni->stats->weapon]) / 2));
-
-       // Opponent's Hit
-        mhit = (fight->strength / 2) +
-               (rand() % (fight->strength / 2) - (ni->stats->defense +
-                arbonus[ni->stats->armor]));
-    }
-    else
-    {
-       // Opponent's Hit
-        mhit = (((battle->stats->strength + webonus[battle->stats->weapon]) / 2) +
-               (rand() % ((battle->stats->strength + webonus[battle->stats->weapon])) / 2) -
-               (ni->stats->defense + arbonus[ni->stats->armor]));
-
-       // Player's Hit
-        hit = (((ni->stats->strength + webonus[ni->stats->weapon]) / 2) +
-               (rand() % ((ni->stats->strength + webonus[ni->stats->weapon])) / 2) -
-               (battle->stats->defense + arbonus[battle->stats->armor]));
-    }
-
-  if (!player_fight(ni))
-  {
-    if (hit > 0)
-        notice(s_GameServ, u, "You attack \1f%s\1f for \ 2%d\ 2 points!", fight->name.c_str(), hit);
-    else
-        notice(s_GameServ, u, "You miss \1f%s\1f completely!", fight->name.c_str());
-
-    if (hit >= fight->hp)
-    {
-        if (master_fight(ni) && !dragon_fight(ni))
-       {
-            notice(s_GameServ, u, "You have bested %s!", fight->name.c_str());
-           addNews(todaysnews, "%s has bested %s and moved "\
-                   "to level %d", ni->stats->name.c_str(), fight->name.c_str(),
-                   (ni->stats->level + 1));
-       }
-        else
-            notice(s_GameServ, u, "You have killed \ 2%s\ 2!", fight->name.c_str());
-
-        notice(s_GameServ, u, "%s", fight->death.c_str());
-        notice(s_GameServ, u, "You recieve \ 2%d\ 2 experience and \ 2%d\ 2 gold!",
-                 fight->exp, fight->gold);
-
-       if (dragon_fight(ni))
-       {
-           addNews(todaysnews, "%s is a true warrior! %s has beaten %s!!", 
-               ni->stats->name.c_str(), ni->stats->name.c_str(), 
-               ni->stats->master->name.c_str());
-           ni->stats->master = NULL; // Don't progress in levels
-       }
-
-       // If your new experience (or gold) will be greater than 2 billion,
-       // then set your exp to 2bil. (2 billion max)... otherwise add them.
-       // This could be a problem with overflowing out of the sign bit.
-       // Unsigned long int maybe? Leave it for now.
-       ni->stats->exp += fight->exp;
-       if (ni->stats->exp < 0 || ni->stats->exp > 2000000000)
-           ni->stats->exp = 2000000000;
-
-       ni->stats->gold += fight->gold;
-       if (ni->stats->gold < 0 || ni->stats->gold > 2000000000)
-           ni->stats->gold = 2000000000;
-
-        if (master_fight(ni))
-        {
-            notice(s_GameServ, u, "You are now level %d!", ni->stats->level + 1);
-            notice(s_GameServ, u, "You gain %d Strength, and %d Defense points!",
-                     strbonus[ni->stats->level - 1], defbonus[ni->stats->level - 1]);
-
-           // Increase your level
-
-           // Increase your maximum hit points
-            ni->stats->maxhp += hpbonus[ni->stats->level - 1];
-
-           // Heal the player by setting hp to their max
-            ni->stats->hp = ni->stats->maxhp;
-
-           // Add to your strength
-            ni->stats->strength += strbonus[ni->stats->level - 1];
-
-           // Add to your defensive power
-            ni->stats->defense += defbonus[ni->stats->level - 1];
-
-            ni->stats->level++;
-
-           // Clear the pointer for your master
-            ni->stats->master = NULL;
-        }
-
-       // They're dead so remove the pointer
-       delete ni->stats->fight;
-        ni->stats->fight = NULL; 
-       ni->stats->master = NULL;
-
-        return;
-    }
-    else
-    {
-        if (hit > 0)
-            fight->hp -= hit;
-        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 >= ni->stats->hp)
-        {
-            if (!master_fight(ni))
-            {
-                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!");
-               addNews(todaysnews, "%s has been killed by %s!",
-                       ni->stats->name.c_str(), fight->name.c_str());
-                ni->stats->gold = 0;
-                ni->stats->exp -= (long int)(ni->stats->exp * .10);
-               ni->stats->hp = 0;
-                ni->stats->fight = NULL;
-               clearAlive(ni->stats);
-                return;
-            }
-            else
-            {
-                notice(s_GameServ, u, "%s has bested you! You will have to wait "\
-                        "until tomorrow to try again", ni->stats->master->name.c_str());
-               addNews(todaysnews, "%s tried to best %s and failed!",
-                       ni->stats->name.c_str(), fight->name.c_str());
-                ni->stats->fight = NULL;
-                ni->stats->master = NULL;
-               return;
-            }
-        }
-        else
-        {
-            if (mhit > 0)
-                ni->stats->hp -= mhit;
-            display_monster(u);
-            return;
-        }
-    }
-  }
-  else if (player_fight(ni))
-  {
-/* Offline fighting not available yet
-   if (!(online = finduser(ni->stats->battle->nick)) || !nick_identified(online))
-   {
-    if (hit > 0)
-        notice(s_GameServ, u, "You attack \1f%s\1f for \ 2%d\ 2 points!", battle->nick, hit);
-    else
-        notice(s_GameServ, u, "You miss \1f%s\1f completely!", battle->nick);
-    if (hit >= battle->stats->hp)
-    {
-        notice(s_GameServ, u, "You have killed \ 2%s\ 2!", battle->nick);
-*        notice(s_GameServ, u, "You recieve \ 2%d\ 2 experience and \ 2%ld\ 2 gold!",
-                (long int)(battle->stats->exp * .10), battle->stats->gold);
-        if (2000000000 - ni->stats->exp > (long int)(battle->stats->exp * .10))
-        {
-            ni->stats->exp += (long int)(battle->stats->exp * .10);
-            battle->stats->exp -= (long int)(battle->stats->exp * .10);
-        }
-*        else
-        {
-            battle->stats->exp -= (long int)(battle->stats->exp * .10);
-            ni->stats->exp = 2000000000;
-        }
-
-        if (2000000000 - ni->stats->gold > battle->stats->gold)
-        {
-*            ni->stats->gold += battle->stats->gold;
-            battle->stats->gold = 0;
-        }
-        else
-        {
-            battle->stats->gold = 2000000000 - ni->stats->gold;
-            ni->stats->gold = 2000000000;
-        }
-*        ni->stats->battle->stats->alive = 0;
-        ni->stats->battle->battle = NULL;
-        ni->stats->battle = NULL;
-        return;
-    }
-    else
-    {
-        if (hit > 0)
-*            battle->stats->hp -= hit;
-        if (mhit > 0)
-        {
-            notice(s_GameServ, u, "\1f%s\1f hits you with their \1f%s\1f for \ 2%d\ 2 damage!",
-                     battle->nick, weapons[battle->stats->weapon], mhit);
-        }
-        else if (mhit <= 0)
-            notice(s_GameServ, u, "%s completely misses you!", battle->nick);
-*
-        if (mhit >= ni->stats->hp)
-        {
-            notice(s_GameServ, u, "You have been \ 2\1fkilled\1f\ 2 by %s!", battle->nick);
-            if (2000000000 - battle->stats->gold > ni->stats->gold)
-            {
-                notice(s_GameServ, u, "%s took all your gold!", battle->nick);
-                battle->stats->gold += ni->stats->gold;
-*                ni->stats->gold = 0;
-            }
-            else
-            {
-                notice(s_GameServ, u, "You're lucky, %s couldn't carry all your gold.",
-                        battle->nick);
-                ni->stats->gold -= (2000000000 - battle->stats->gold);
-                notice(s_GameServ, u, "You were left dead with %d gold.",
-*                         (long int)ni->stats->gold);
-                battle->stats->gold = 2000000000;
-            }
-            ni->stats->battle->battle = NULL;
-            ni->stats->battle = NULL;
-            ni->stats->alive = 0;
-            return;
-        }
-*        else
-        {
-            if (mhit > 0)
-                ni->stats->hp -= mhit;
-            display_players(u);
-            return;
-        }
-    }
-   }
-* end offline fighting */
-
-   if (is_playing(battle))
-   {
-    if (!isYourTurn(ni->stats))
-    {
-        notice(s_GameServ, u, "Please wait until %s decides what to do!", 
-               battle->stats->name.c_str());
-        return;
-    }
-    if (hit > 0)
-    {
-        notice(s_GameServ, u, "You attack \1f%s\1f for \ 2%d\ 2 points!", battle->stats->name.c_str(), hit);
-
-        notice(s_GameServ, battle->getNick(), "%s has hit you with their %s for "\
-                                             "\ 2%d\ 2 damage!", ni->stats->name.c_str(), 
-                                             weapons[ni->stats->weapon], hit);
-    }
-    else
-    {
-        notice(s_GameServ, u, "You miss \1f%s\1f completely!", battle->stats->name.c_str());
-        notice(s_GameServ, battle->getNick(), "%s misses you completely!", ni->stats->name.c_str());
-    }
-
-    if (hit >= battle->stats->hp)
-    {
-        notice(s_GameServ, u, "You have killed \ 2%s\ 2!", battle->stats->name.c_str());
-        notice(s_GameServ, u, "You recieve \ 2%d\ 2 experience and \ 2%ld\ 2 gold!",
-                (long int)(battle->stats->exp * .10), battle->stats->gold);
-        notice(s_GameServ, battle->getNick(), "You have been killed by \ 2%s\ 2!", 
-               ni->stats->name.c_str());
-        battle->stats->hp = 0;
-        clearAlive(battle->stats);
-
-        ni->stats->exp += (long int)(battle->stats->exp * .10);
-        battle->stats->exp -= (long int)(battle->stats->exp * .10);
-
-        if (ni->stats->exp < 0 || ni->stats->exp > 2000000000)
-            ni->stats->exp = 2000000000;
-
-        if (2000000000 - ni->stats->gold > battle->stats->gold)
-        {
-           notice(s_GameServ, battle->getNick(), "You lose ten percent of experience and "\
-                                                "all gold on hand!");
-            ni->stats->gold += battle->stats->gold;
-            battle->stats->gold = 0;
-        }
-        else
-        {
-            battle->stats->gold = 2000000000 - ni->stats->gold;
-            notice(s_GameServ, battle->getNick(), "You lose ten percent of your experience!");
-
-            notice(s_GameServ, battle->getNick(), "However, %s could not carry all of your "\
-                       "gold.", ni->stats->name.c_str());
-
-            notice(s_GameServ, battle->getNick(), "Luckily, you still have \ 2%ld\ 2 gold "\
-                       "left. All is not lost!", battle->stats->gold);
-
-            ni->stats->gold = 2000000000;
-        }
-
-       clearYourTurn(ni->stats);
-       clearYourTurn(battle->stats);
-       battle->stats->battle = NULL;
-        ni->stats->battle = NULL;
-        return;
-    }
-    else
-    {
-        if (hit > 0)
-            battle->stats->hp -= hit;
-       clearYourTurn(ni->stats);
-       setYourTurn(battle->stats);
-        display_players(battle);
-        notice(s_GameServ, u, "Please wait while %s decides what to do!", 
-               battle->stats->name.c_str());
-        return;
-    }
-   }
-  }
-}
-
 void do_heal(char *u)
 {
     aClient *ni;
@@ -2448,6 +2024,8 @@ return 1;
 
 long int stringtoint(char *number)
 {
+    return atol(number);
+/*
     long int x, len = strlen(number), sum = 0;
     if (len == 1)
         return chartoint(number[0]);
@@ -2455,6 +2033,7 @@ long int stringtoint(char *number)
     for (x = len - 2; x >= 0; x--)
         sum += chartoint(number[x]) * pow(10, abs(x - len + 1));
     return sum;
+*/
 }
 
 long int pow(int x, int y)
@@ -2504,11 +2083,12 @@ int save_gs_dbase()
        clearYourTurn(it);
        outfile << it->name.c_str() << ' ' << it->level << ' ' << it->exp << ' ' << it->gold << ' ' << it->bank << ' '
                << it->hp << ' ' << it->maxhp << ' ' << it->strength << ' ' << it->defense << ' '
-               << it->armor << ' ' << it->weapon << ' '
+               << it->arm << ' ' << it->wea << ' '
                << it->forest_fights << ' ' << it->player_fights <<  ' ' 
-               << it->getFlags() << ' ' << it->password << ' ' << it->inventory.Healing()
+               << it->getFlags() << ' ' << it->password << ' ' 
+/* fixing this << it->inventory.Healing()
                << ' ' << it->inventory.Strength() << ' ' << it->inventory.Defense() << ' ' << it->inventory.HP()
-               << ' ' << it->lastlogin << endl;
+               << ' ' */ << it->lastlogin << endl;
        ptr = ptr->Next();
     }
    }
@@ -2516,13 +2096,75 @@ 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_gs_dbase()
 {
     ifstream infile;
     aClient *temp;
     Player *p;
     char *tempname, *buf, *password;
-    buf = new char[1023];
+    buf = new char[1024];
 
     infile.open(playerdata);
 
@@ -2546,12 +2188,12 @@ int load_gs_dbase()
     }
 
     while (infile.getline(buf, 1024, '\n'))
-    {
+      {
        temp = new aClient;
        tempname = strtok(buf, " ");
        temp->stats = new Player(tempname);
        p = temp->stats;
-
+       
        p->level = stringtoint(strtok(NULL, " "));
        p->exp = stringtoint(strtok(NULL, " "));
        p->gold = stringtoint(strtok(NULL, " "));
@@ -2560,296 +2202,298 @@ int load_gs_dbase()
        p->maxhp = stringtoint(strtok(NULL, " "));
        p->strength = stringtoint(strtok(NULL, " "));
        p->defense = stringtoint(strtok(NULL, " "));
-       p->armor = stringtoint(strtok(NULL, " "));
-       p->weapon = stringtoint(strtok(NULL, " "));
+       p->arm = stringtoint(strtok(NULL, " "));
+       p->wea = stringtoint(strtok(NULL, " "));
        p->forest_fights = stringtoint(strtok(NULL, " "));
        p->player_fights = stringtoint(strtok(NULL, " "));
        p->setFlags(stringtoint(strtok(NULL, " ")));
 
+       
+       
        password = strtok(NULL, " ");
        p->password = password;
        temp->setNick("Not Playing");
-       #ifdef P10
+#ifdef P10
        temp->setRealNick("Not Playing");
-       #endif
-
-       p->inventory.reset(); // Set inventory to all 0s
+#endif
+       
+       p->inventory->clear(); // Set inventory to all 0s
        // Old player databases didn't have these three extra values
        // If they come up null, leave them to 0 as the default.
        // On the next gameserv database save, it will save the values.
        tempname = strtok(NULL, " ");
-       if (tempname)
-           p->inventory.setHealing(stringtoint(tempname));
-
+       //      if (tempname)
+       //  p->inventory.setHealing(stringtoint(tempname));
+       
        tempname = strtok(NULL, " ");
-       if (tempname)
-           p->inventory.setStrength(stringtoint(tempname));
-
+       //if (tempname)
+       //   p->inventory.setStrength(stringtoint(tempname));
+       
        tempname = strtok(NULL, " ");
-       if (tempname)
-           p->inventory.setDefense(stringtoint(tempname));
-
+       //if (tempname)
+       //    p->inventory.setDefense(stringtoint(tempname));
+       
        tempname = strtok(NULL, " ");
-       if (tempname)
-           p->inventory.setHP(stringtoint(tempname));
-
+       //if (tempname)
+       //  p->inventory.setHP(stringtoint(tempname));
+       
         tempname = strtok(NULL, " ");
        if (tempname)
-           p->lastlogin = stringtoint(tempname);
+         p->lastlogin = stringtoint(tempname);
        else
-           p->lastlogin = time(NULL);
-
+         p->lastlogin = time(NULL);
+       
        unsigned long hv = iHASH((unsigned char *) temp->stats->name.c_str());
-
+       
        temp->stats->client = NULL;
        players[hv].insertAtBack(temp);
        delete temp;
-    }
-delete [] buf;
-infile.close();
-return 1;
+      }
+    delete [] buf;
+    infile.close();
+    return 1;
 }
 
 bool passcmp(const char *encrypted, char *plaintext)
 {
-    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;
+  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
+  aClient *client;
+  
+  if (!(client = findplayer(name)))
+    return false;
+  else
     {
-       return passcmp(client->stats->password.c_str(), plaintext);
+      return passcmp(client->stats->password.c_str(), plaintext);
     }
 }
 
 void do_store(char *u)
 {
-    char *cmd = strtok(NULL, " ");
-    char *item = strtok(NULL, " ");
-    char *num = strtok(NULL, " ");
-    char *space;
-    int wep;
-    aClient *user;
-    Player *p;
-
-    if (!cmd || !item)
+  char *cmd = strtok(NULL, " ");
+  char *item = strtok(NULL, " ");
+  char *num = strtok(NULL, " ");
+  char *space;
+  int wep;
+  aClient *user;
+  Player *p;
+  
+  if (!cmd || !item)
     {
-       notice(s_GameServ, u, "SYNTAX: STORE LIST {ARMOR | WEAPONS}");
-       notice(s_GameServ, u, "        \ 2STORE SELL {ARMOR | WEAPON}\ 2");
-       notice(s_GameServ, u, "        \ 2STORE BUY {ARMOR | WEAPON} \1fNUMBER\1f\ 2");
-       return;
+      notice(s_GameServ, u, "SYNTAX: STORE LIST {ARMOR | WEAPONS}");
+      notice(s_GameServ, u, "        \ 2STORE SELL {ARMOR | WEAPON}\ 2");
+      notice(s_GameServ, u, "        \ 2STORE BUY {ARMOR | WEAPON} \1fNUMBER\1f\ 2");
+      return;
     }
-    else if (!(user = find(u)))
+  else if (!(user = find(u)))
     {
-       log("Fatal Error: could not find %s in client list", u);
-       return;
+      log("Fatal Error: could not find %s in client list", u);
+      return;
     }
-    else if (isIgnore(user))
+  else if (isIgnore(user))
     {
-       #ifdef DEBUGMODE
-           log("Ignoring %s.", user->getNick());
-       #endif
-       return;
+#ifdef DEBUGMODE
+      log("Ignoring %s.", user->getNick());
+#endif
+      return;
     }
-    else if (!is_playing(user))
+  else if (!is_playing(user))
     {
-       notice(s_GameServ, u, "You must be playing to use the store!");
-       return;
+      notice(s_GameServ, u, "You must be playing to use the store!");
+      return;
     }
-    else if (!isAlive(user->stats))
+  else if (!isAlive(user->stats))
     {
-       notice(s_GameServ, u, "You are dead. Wait until tomorrow to purchase weapons and armor!");
-       return;
+      notice(s_GameServ, u, "You are dead. Wait until tomorrow to purchase weapons and armor!");
+      return;
     }
-    updateTS(user->stats);
-
-    if (stricmp(cmd, "LIST") == 0)
+  updateTS(user->stats);
+  
+  if (stricmp(cmd, "LIST") == 0)
     {
-       if (stricmp(item, "WEAPONS") == 0)
+      if (stricmp(item, "WEAPONS") == 0)
        {
-            notice(s_GameServ, u, "Welcome to Kain's Armory");
-            notice(s_GameServ, u, "Here are the weapons we have available for the killing, sire:");
-           for (int x = 1; x < WNA; x++)
+         notice(s_GameServ, u, "Welcome to Kain's Armory");
+         notice(s_GameServ, u, "Here are the weapons we have available for the killing, sire:");
+         for (int x = 1; x < WNA; x++)
             {
-                space = spaces(strlen(weapons[x]), ".");
-                notice(s_GameServ, u, "%s%d. %s%s%d",(x < 10 ? " " : ""), x, weapons[x], space, prices[x - 1]);
-                free(space);
+             space = spaces(strlen(weapons[x]), ".");
+             notice(s_GameServ, u, "%s%d. %s%s%d",(x < 10 ? " " : ""), x, weapons[x], space, prices[x - 1]);
+             free(space);
             }
-           notice(s_GameServ, u, "To purchase a weapon, type /msg %S STORE BUY \ 2NUM\ 2.");
-            notice(s_GameServ, u, "Where num. is the weapon number from the menu above.");
-
+         notice(s_GameServ, u, "To purchase a weapon, type /msg %S STORE BUY \ 2NUM\ 2.");
+         notice(s_GameServ, u, "Where num. is the weapon number from the menu above.");
+         
        }
-       else if (stricmp(item, "ARMOR") == 0)
+      else if (stricmp(item, "ARMOR") == 0)
        {
-           notice(s_GameServ, u, "Welcome to Kain's Armory");
-           notice(s_GameServ, u, "I hope you enjoy the fine armor we have available for your protection:");
-           for (int x = 1; x < WNA; x++)
+         notice(s_GameServ, u, "Welcome to Kain's Armory");
+         notice(s_GameServ, u, "I hope you enjoy the fine armor we have available for your protection:");
+         for (int x = 1; x < WNA; x++)
             {
-               space = spaces(strlen(armors[x]), ".");
-               notice(s_GameServ, u, "%s%d. %s%s%d",(x < 10 ? " " : ""), x, armors[x], space, prices[x - 1]);
-               free(space);
+             space = spaces(strlen(armors[x]), ".");
+             notice(s_GameServ, u, "%s%d. %s%s%d",(x < 10 ? " " : ""), x, armors[x], space, prices[x - 1]);
+             free(space);
            }
-            notice(s_GameServ, u, "To purchase armor, type /msg %S store buy armor num.");
-            notice(s_GameServ, u, "Where num. is the armor number from the menu above.");
-
-
+         notice(s_GameServ, u, "To purchase armor, type /msg %S store buy armor num.");
+         notice(s_GameServ, u, "Where num. is the armor number from the menu above.");
+         
+         
        }
     } else if (stricmp(cmd, "BUY") == 0) {
-       if (!num)
+      if (!num)
        {
-           notice(s_GameServ, u, "SYNTAX: \ 2STORE BUY {ARMOR | WEAPON} \1fNUMBER\1f\ 2");
-           return;
+         notice(s_GameServ, u, "SYNTAX: \ 2STORE BUY {ARMOR | WEAPON} \1fNUMBER\1f\ 2");
+         return;
        }
-       else if (!isstringnum(num))
+      else if (!isstringnum(num))
        {
-           notice(s_GameServ, u, "You must specify a number between 1 and %d. Not %s!", WNA - 1, num);
-           return;
+         notice(s_GameServ, u, "You must specify a number between 1 and %d. Not %s!", WNA - 1, num);
+         return;
        }
-       if (stricmp(item, "WEAPON") == 0)
+      if (stricmp(item, "WEAPON") == 0)
         {
-            wep = stringtoint(num);
-            if (wep >= WNA || wep < 1)
+         wep = stringtoint(num);
+         if (wep >= WNA || wep < 1)
             {
-               notice(s_GameServ, u, "The number %d is out of range. The number you provide must be between 1 and %d.", wep, WNA - 1);
-                return;
+             notice(s_GameServ, u, "The number %d is out of range. The number you provide must be between 1 and %d.", wep, WNA - 1);
+             return;
             }
-
-           p = user->stats;
-
-            if (p->weapon != 0)
-                notice(s_GameServ, u, "You have to sell your %s first!", weapons[p->weapon]);
-            else if (p->gold < prices[wep - 1])
-                notice(s_GameServ, u, "You don't have enough gold for %s!", weapons[wep]);
-            else
+         
+         p = user->stats;
+         
+         if (p->wea != 0)
+           notice(s_GameServ, u, "You have to sell your %s first!", weapons[p->wea]);
+         else if (p->gold < prices[wep - 1])
+           notice(s_GameServ, u, "You don't have enough gold for %s!", weapons[wep]);
+         else
             {
-                notice(s_GameServ, u, "You have purchased %s! Thanks for the gold!", weapons[wep]);
-                p->weapon = wep;
-                p->gold -= prices[wep - 1];
+             notice(s_GameServ, u, "You have purchased %s! Thanks for the gold!", weapons[wep]);
+             p->wea = wep;
+             p->gold -= prices[wep - 1];
             }
         }
-       else if (stricmp(item, "ARMOR") == 0)
+      else if (stricmp(item, "ARMOR") == 0)
         {
-            wep = stringtoint(num);
-            if (wep >= WNA || wep < 1)
+         wep = stringtoint(num);
+         if (wep >= WNA || wep < 1)
             {
-               notice(s_GameServ, u, "The number %d is out of range. The number you provide must be between 1 and %d.", wep, WNA - 1);
-                return;
+             notice(s_GameServ, u, "The number %d is out of range. The number you provide must be between 1 and %d.", wep, WNA - 1);
+             return;
             }
-
-           p = user->stats;
-
-            if (p->armor != 0)
-                notice(s_GameServ, u, "You have to sell your %s first!", armors[p->armor]);
-            else if (p->gold < prices[wep - 1])
-                notice(s_GameServ, u, "You don't have enough gold for %s!", armors[wep]);
-            else
+         
+         p = user->stats;
+         
+         if (p->arm != 0)
+           notice(s_GameServ, u, "You have to sell your %s first!", armors[p->arm]);
+         else if (p->gold < prices[wep - 1])
+           notice(s_GameServ, u, "You don't have enough gold for %s!", armors[wep]);
+         else
             {
-                notice(s_GameServ, u, "You have purchased %s! Thanks for the gold!", armors[wep]);
-                p->armor = wep;
-                p->gold -= prices[wep - 1];
+             notice(s_GameServ, u, "You have purchased %s! Thanks for the gold!", armors[wep]);
+             p->arm = wep;
+             p->gold -= prices[wep - 1];
             }
         }
-       else
+      else
        {
-           notice(s_GameServ, u, "SYNTAX: \ 2STORE BUY {ARMOR | WEAPON} \1fNUMBER\1f\ 2");
-           return;
+         notice(s_GameServ, u, "SYNTAX: \ 2STORE BUY {ARMOR | WEAPON} \1fNUMBER\1f\ 2");
+         return;
        }
     }
-    else if (stricmp(cmd, "SELL" ) == 0)
+  else if (stricmp(cmd, "SELL" ) == 0)
     {
-       p = user->stats;
-
-        if (stricmp(item, "WEAPON") == 0)
+      p = user->stats;
+      
+      if (stricmp(item, "WEAPON") == 0)
         {
-            if (p->weapon == 0)
+         if (p->wea == 0)
             {
-                notice(s_GameServ, u, "You want me to chop off your hands?");
-                return;
+             notice(s_GameServ, u, "You want me to chop off your hands?");
+             return;
             }
-            else if (p->gold == 2000000000)
+         else if (p->gold == 2000000000)
             {
-                notice(s_GameServ, u, "You have enough gold. I'll just take that off your hands, sire.");
-                p->weapon = 0;
+             notice(s_GameServ, u, "You have enough gold. I'll just take that off your hands, sire.");
+             p->wea = 0;
             }
-            else if (2000000000 - p->gold < (prices[p->weapon - 1] / 2))
+         else if (2000000000 - p->gold < (prices[p->wea - 1] / 2))
             {
-                notice(s_GameServ, u, "Thank you for your business! You now have as much gold as you can carry.");
-                notice(s_GameServ, u, "However, you have no weapon... can I interest you in the %s?", weapons[WNA - 1]);
-                p->gold = 2000000000;
-                p->weapon = 0;
+             notice(s_GameServ, u, "Thank you for your business! You now have as much gold as you can carry.");
+             notice(s_GameServ, u, "However, you have no weapon... can I interest you in the %s?", weapons[WNA - 1]);
+             p->gold = 2000000000;
+             p->wea = 0;
             }
-            else
+         else
            {
-                notice(s_GameServ, u, "Thank you for your business! You now have %d more gold but no weapon!", (prices[p->weapon - 1] / 2));
-                p->gold += (prices[p->weapon - 1] / 2);
-                p->weapon = 0;
+             notice(s_GameServ, u, "Thank you for your business! You now have %d more gold but no weapon!", (prices[p->wea - 1] / 2));
+             p->gold += (prices[p->wea - 1] / 2);
+             p->wea = 0;
             }
         }
-        else if (stricmp(item, "ARMOR") == 0)
+      else if (stricmp(item, "ARMOR") == 0)
         {
-           p = user->stats;
-
-            if (p->armor == 0)
+         p = user->stats;
+         
+         if (p->arm == 0)
             {
-                notice(s_GameServ, u, "I don't think you can be any more naked...");
-                return;
+             notice(s_GameServ, u, "I don't think you can be any more naked...");
+             return;
             }
-            if (p->gold == 2000000000)
+         if (p->gold == 2000000000)
             {
-                notice(s_GameServ, u, "You have enough gold. I'll just take that off your hands, sire.");
-                p->armor = 0;
+             notice(s_GameServ, u, "You have enough gold. I'll just take that off your hands, sire.");
+             p->arm = 0;
             }
-            else if (2000000000 - p->gold < (prices[p->armor - 1] / 2))
+         else if (2000000000 - p->gold < (prices[p->arm - 1] / 2))
             {
-                notice(s_GameServ, u, "Thank you for your business! You now have as much gold as you can carry.");
-                notice(s_GameServ, u, "However, you have no armor... can I interest you in %s?", armors[WNA - 1]);
-               p->gold = 2000000000;
-                p->armor = 0;
+             notice(s_GameServ, u, "Thank you for your business! You now have as much gold as you can carry.");
+             notice(s_GameServ, u, "However, you have no armor... can I interest you in %s?", armors[WNA - 1]);
+             p->gold = 2000000000;
+             p->arm = 0;
             }
-            else
+         else
             {
-                notice(s_GameServ, u, "Thank you for your business! You now have %d more gold but no armor!",
-                         (prices[p->armor - 1] / 2));
-
-                p->gold += (prices[p->armor - 1] / 2);
-                p->armor = 0;
+             notice(s_GameServ, u, "Thank you for your business! You now have %d more gold but no armor!",
+                    (prices[p->arm - 1] / 2));
+             
+             p->gold += (prices[p->arm - 1] / 2);
+             p->arm = 0;
             }
        }
-        else
+      else
        {
-           notice(s_GameServ, u, "SYNTAX: STORE LIST {ARMOR | WEAPONS}");
-           notice(s_GameServ, u, "        \ 2STORE SELL {ARMOR | WEAPON}\ 2");
-           notice(s_GameServ, u, "        \ 2STORE BUY {ARMOR | WEAPON} \1fNUMBER\1f\ 2");
+         notice(s_GameServ, u, "SYNTAX: STORE LIST {ARMOR | WEAPONS}");
+         notice(s_GameServ, u, "        \ 2STORE SELL {ARMOR | WEAPON}\ 2");
+         notice(s_GameServ, u, "        \ 2STORE BUY {ARMOR | WEAPON} \1fNUMBER\1f\ 2");
        }
     }
-    else
+  else
     {
-       notice(s_GameServ, u, "SYNTAX: STORE LIST {ARMOR | WEAPONS}");
-       notice(s_GameServ, u, "        \ 2STORE SELL {ARMOR | WEAPON}\ 2");
-       notice(s_GameServ, u, "        \ 2STORE BUY {ARMOR | WEAPON} \1fNUMBER\1f\ 2");
-       return;
+      notice(s_GameServ, u, "SYNTAX: STORE LIST {ARMOR | WEAPONS}");
+      notice(s_GameServ, u, "        \ 2STORE SELL {ARMOR | WEAPON}\ 2");
+      notice(s_GameServ, u, "        \ 2STORE BUY {ARMOR | WEAPON} \1fNUMBER\1f\ 2");
+      return;
     }
 }
 void do_inventory(char *u)
@@ -2876,24 +2520,41 @@ void do_inventory(char *u)
     updateTS(user->stats);
     showinventory(user, user);
 }
+
 void showinventory(aClient *from, aClient *to)
 {
-    char *nick = to->getNick();
+  char *nick = to->getNick();
 
-    if (!to)
-       to = from;
-    if (is_playing(from))
+  if (!to)
+    to = from;
+  
+  if (is_playing(from))
     {
-       Pouch *p = &from->stats->inventory;
-       notice(s_GameServ, nick, "Inventory for %s:", from->stats->name.c_str());
-       notice(s_GameServ, nick, " Healing Potions: %d", p->Healing());
-       notice(s_GameServ, nick, "Strength Potions: %d", p->Strength());
-       notice(s_GameServ, nick, " Defense Potions: %d", p->Defense());
-       notice(s_GameServ, nick, "      HP Potions: %d", p->HP());
+      if (from->stats->inventory->isEmpty())
+       {
+         notice(s_GameServ, nick, "You aren't carrying anything");
+         return;
+       }
+
+      list <item*> *items;
+      items = from->stats->inventory->getItems();
+
+      list <item*>::iterator item_iter;
+      item_iter = items->begin();
+
+      notice(s_GameServ, nick, "Inventory for %s:", from->stats->name.c_str());
+      while (item_iter != items->end())
+       {
+         int x = 0;
+         notice(s_GameServ, nick, "%d.) %s", x, (*item_iter)->getName().c_str());
+       }
+
     }
+
 }
 void do_tavern(char *u)
 {
+  /*
     char *cmd = strtok(NULL, " ");
     long int price;
 
@@ -3031,6 +2692,8 @@ void do_tavern(char *u)
        notice(s_GameServ, u, "Improper Syntax.");
        notice(s_GameServ, u, "Type /msg %S HELP TAVERN for help");
     }
+  */
+  return;
 }
 
 void do_bank(char *u)
@@ -3254,7 +2917,7 @@ void do_dragon(char *u)
        "your %s, and venture into the hot, dark cave. "\
        "You are surprised at the angle of descent as you climb "\
        "lower and lower, deeper into the dragon's den.", 
-       armors[p->armor], weapons[p->weapon]);
+       armors[p->arm], weapons[p->wea]);
     notice(s_GameServ, u, "You come to the end of the cave to find "\
        "a tooth. It is a large tooth... bigger than your torso."\
        " Suddenly the darkness lifts from the gleam of an eye "\
@@ -3262,7 +2925,9 @@ 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!");
-    see_master(u);
+    p->fight = new Monster(dragon);
+    setDragonFight(p);
+    display_monster(u);
 }
 
 void do_master(char *u)