]> 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 523431f35c26c251008f85c25ed5c4e0a5418b2e..18bd0fe246f5cdb58199af991df577d179ba77b5 100644 (file)
@@ -1,18 +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)
 
@@ -24,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
@@ -384,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
     {
@@ -676,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)))
@@ -732,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)
     {
@@ -755,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)
@@ -778,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)
@@ -797,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;
        }
   }
@@ -817,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;
        }
   }
@@ -837,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;
        }
   }
@@ -856,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;
        }
   }
@@ -875,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;
        }
   }
@@ -895,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;
        }
   }
@@ -914,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;
        }
   }
@@ -1054,12 +977,12 @@ void do_set(char *u)
          }
          else if (stricmp(cmd2, "TRUE") == 0)
          {
-            notice(s_GameServ, u, "Target has been Resurrected!");
+            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!");
+            notice(s_GameServ, u, "%s is now dead!", target->stats->name.c_str());
             clearAlive(target->stats);
          }
        }
@@ -1086,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);
          }
        }         
@@ -1099,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;
   }
 }
@@ -1223,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");
@@ -1248,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);
@@ -1383,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');
 
@@ -1436,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;
@@ -1589,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)
 {
@@ -1715,6 +1643,7 @@ void do_fight(char *u)
 
 void do_use(char *u)
 {
+  /*
     aClient *user;
     Pouch *p;
 
@@ -1843,6 +1772,8 @@ void do_use(char *u)
     }
 
     end_turn(user); // If they're fighting, end their turn
+  */
+  return;
 }
 void do_run(char *u)
 {
@@ -1921,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))
     {
@@ -2152,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();
     }
    }
@@ -2164,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);
 
@@ -2194,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, " "));
@@ -2208,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)
@@ -2524,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;
 
@@ -2679,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)
@@ -2902,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 "\
@@ -2910,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)