]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv/gameserv.cpp
Implemented the definitions for the new items class and added some declarations into...
[irc/gameservirc.git] / gameserv / gameserv.cpp
index 527480a1804b90acc18af95c029e6a5a07fad558..a4ed61a167f9e872176e4300bb5a184b22a4be30 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <cctype>
 #include <fstream>
+#include <stdlib.h>
 
 using std::ifstream;
 using std::ofstream;
@@ -23,12 +24,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,16 +386,16 @@ 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);
@@ -675,7 +678,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|ON|OFF}");
+      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}");
       return;
     }
   else if (!(target = findplayer(name)))
@@ -715,20 +718,30 @@ void do_set(char *u)
     }
   else if (stricmp(cmd, "BANK") == 0 || stricmp(cmd, "BALANCE") == 0)
     {
-      if (!isAdmin(user))
+        if (!isAdmin(user))
        {
          notice(s_GameServ, u, "Admins Only!");
          return;
        }
-      else if (stricmp(cmd, "BANK") == 0)
+       else if (stricmp(cmd, "BANK") == 0)
        {
          cmd2 = strtok(NULL, " "); // Need an extra parameter for set bank balance
        }
-      else
+       if (!cmd2)
        {
-         target->stats->bank = stringtoint(cmd2);
-         notice(s_GameServ, u, "Balance changed!");
+           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] [BANK] BALANCE <NUMBER>");
+           return;
        }
+
+       target->stats->bank = stringtoint(cmd2);
+
+       // Cheap bounds checking
+       if (target->stats->bank > 2000000000)
+           target->stats->bank = 2000000000;
+       else if (target->stats->bank < 0)
+           target->stats->bank *= -1;
+
+       notice(s_GameServ, u, "Bank balance changed to %ld!", target->stats->bank);
     }
   else if (stricmp(cmd, "PLAYER") == 0)
     {
@@ -739,14 +752,23 @@ void do_set(char *u)
        }
       else if (stricmp(cmd2, "FIGHTS") != 0)
        {
-         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <number>");
+         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>");
          return;
        }
       else
        {
          cmd2 = strtok(NULL, " ");
+           if (!cmd2)
+           {
+               notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>");
+               return;
+           }
          target->stats->player_fights = stringtoint(cmd2);
-         notice(s_GameServ, u, "Player fights changed!");
+
+         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)
@@ -764,8 +786,18 @@ void do_set(char *u)
       else
        {
          cmd2 = strtok(NULL, " ");
-         target->stats->player_fights = stringtoint(cmd2);
-         notice(s_GameServ, u, "Player fights changed!");
+           if (!cmd2)
+           {
+               notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] FOREST FIGHTS <NUMBER>");
+               return;
+           }
+
+         target->stats->forest_fights = stringtoint(cmd2);
+
+         if (target->stats->forest_fights < 0)
+             target->stats->forest_fights *= -1;
+
+         notice(s_GameServ, u, "Forest fights changed to %d!", target->stats->forest_fights);
        }         
     }
   else if (stricmp(cmd, "GOLD") == 0)
@@ -777,12 +809,23 @@ void do_set(char *u)
        }
     else
        {
+       if (!cmd2)
+       {
+           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] GOLD <NUMBER>");
+           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;
        }
   }
-  else if (stricmp(cmd, "STRENGTH") == 0 && stricmp(cmd, "POTIONS") != 0)
+  else if (stricmp(cmd, "STRENGTH") == 0 && stricmp(cmd2, "POTIONS") != 0)
   {
     if (!isAdmin(user))
        {
@@ -791,12 +834,22 @@ void do_set(char *u)
        }
     else
        {
+       if (!cmd2)
+       {
+           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] STRENGTH <NUMBER>");
+           return;
+       }
+
          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;
        }
   }
-  else if (stricmp(cmd, "DEFENSE") == 0 && stricmp(cmd, "POTIONS") != 0)
+  else if (stricmp(cmd, "DEFENSE") == 0 && stricmp(cmd2, "POTIONS") != 0)
   {
     if (!isAdmin(user))
        {
@@ -805,8 +858,18 @@ void do_set(char *u)
        }
     else
        {
+       if (!cmd2)
+       {
+           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] DEFENSE <NUMBER>");
+           return;
+       }
+
          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;
        }
   }
@@ -819,8 +882,17 @@ void do_set(char *u)
        }
     else
        {
+       if (!cmd2)
+       {
+           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HP <NUMBER>");
+           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;
        }
   }
@@ -833,8 +905,17 @@ void do_set(char *u)
        }
     else
        {
+       if (!cmd2)
+       {
+           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] MAXHP <NUMBER>");
+           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;
        }
   }
@@ -847,8 +928,20 @@ void do_set(char *u)
        }
     else
        {
+       if (!cmd2)
+       {
+           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {EXPERIENCE|EXP} <NUMBER>");
+           return;
+       }
+
          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;
        }
   }
@@ -861,8 +954,19 @@ void do_set(char *u)
        }
     else
        {
+       if (!cmd2)
+       {
+           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] LEVEL <NUMBER>");
+           return;
+       }
          target->stats->level = stringtoint(cmd2);
-         notice(s_GameServ, u, "Level 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;
        }
   }
@@ -875,8 +979,19 @@ void do_set(char *u)
        }
     else
        {
-         target->stats->weapon = stringtoint(cmd2);
-         notice(s_GameServ, u, "Weapon set to %s", weapons[target->stats->weapon]);
+       if (!cmd2)
+       {
+           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] WEAPON <NUMBER>");
+           return;
+       }
+
+         target->stats->wea = stringtoint(cmd2);
+
+         if (target->stats->wea < 0)
+               target->stats->wea = 0;
+         else if (target->stats->wea >= WNA)
+               target->stats->wea = WNA - 1;
+         notice(s_GameServ, u, "Weapon set to %s", weapons[target->stats->wea]);
          return;
        }
   }
@@ -889,8 +1004,19 @@ void do_set(char *u)
        }
     else
        {
-         target->stats->armor = stringtoint(cmd2);
-         notice(s_GameServ, u, "Armor set to %s", armors[target->stats->armor]);
+       if (!cmd2)
+       {
+           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] ARMOR <NUMBER>");
+           return;
+       }
+         target->stats->arm = stringtoint(cmd2);
+
+         if (target->stats->arm < 0)
+             target->stats->arm = 0;
+         else if (target->stats->arm >= WNA)
+             target->stats->arm = WNA - 1;
+
+         notice(s_GameServ, u, "Armor set to %s", armors[target->stats->arm]);
          return;
        }
   }
@@ -904,8 +1030,14 @@ void do_set(char *u)
     else
        {
          cmd2 = strtok(NULL, " ");
-         target->stats->inventory.setHP(stringtoint(cmd2));
-         notice(s_GameServ, u, "HP Potions set to %s", cmd2);
+       if (!cmd2)
+       {
+           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HP POTIONS <NUMBER>");
+           return;
+       }
+         target->stats->inventory.setHP(abs(stringtoint(cmd2)));
+
+         notice(s_GameServ, u, "HP Potions set to %d", target->stats->inventory.HP());
          return;
        }
   }
@@ -919,8 +1051,13 @@ void do_set(char *u)
     else
        {
          cmd2 = strtok(NULL, " ");
-         target->stats->inventory.setHealing(stringtoint(cmd2));
-         notice(s_GameServ, u, "Healing Potions set to %s", cmd2);
+       if (!cmd2)
+       {
+           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HEALING POTIONS <NUMBER>");
+           return;
+       }
+         target->stats->inventory.setHealing(abs(stringtoint(cmd2)));
+         notice(s_GameServ, u, "Healing Potions set to %d", target->stats->inventory.Healing());
          return;
        }
   }
@@ -934,8 +1071,13 @@ void do_set(char *u)
     else
        {
          cmd2 = strtok(NULL, " ");
-         target->stats->inventory.setStrength(stringtoint(cmd2));
-         notice(s_GameServ, u, "Strength Potions set to %s", cmd2);
+       if (!cmd2)
+       {
+           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] STRENGTH POTIONS <NUMBER>");
+           return;
+       }
+         target->stats->inventory.setStrength(abs(stringtoint(cmd2)));
+         notice(s_GameServ, u, "Strength Potions set to %d", target->stats->inventory.Strength());
          return;
        }
   }
@@ -949,8 +1091,13 @@ void do_set(char *u)
     else
        {
          cmd2 = strtok(NULL, " ");
-         target->stats->inventory.setDefense(stringtoint(cmd2));
-         notice(s_GameServ, u, "Defense Potions set to %s", cmd2);
+       if (!cmd2)
+       {
+           notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] DEFENSE POTIONS <NUMBER>");
+           return;
+       }
+         target->stats->inventory.setDefense(abs(stringtoint(cmd2)));
+         notice(s_GameServ, u, "Defense Potions set to %d", target->stats->inventory.Defense());
          return;
        }
   }
@@ -969,12 +1116,54 @@ void do_set(char *u)
             notice(s_GameServ, u, "SYNTAX: /msg %S SET ALIVE TRUE|FALSE");
             return;
          }
+         else if (stricmp(cmd2, "TRUE") == 0)
+         {
+            notice(s_GameServ, u, "%s has been Resurrected!", target->stats->name.c_str());
+            setAlive(target->stats);
+         }
+         else
+         {
+            notice(s_GameServ, u, "%s is now dead!", target->stats->name.c_str());
+            clearAlive(target->stats);
+         }
        }
   }
+  else if (stricmp(cmd, "SEEN") == 0)
+    {
+      if (!isAdmin(user))
+       {
+         notice(s_GameServ, u, "Admins Only!");
+         return;
+       }
+      else if (stricmp(cmd2, "MASTER") != 0)
+       {
+         notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] SEEN MASTER {TRUE|FALSE}");
+         return;
+       }
+      else
+       {
+         cmd2 = strtok(NULL, " ");
+         if (!cmd2 || (stricmp(cmd2, "TRUE") != 0 && stricmp(cmd2, "FALSE") != 0))
+         {
+            notice(s_GameServ, u, "SYNTAX: /msg %S SET [NICK] SEEN MASTER {TRUE|FALSE}");
+            return;
+         }
+         else if (stricmp(cmd2, "TRUE") == 0)
+         {
+            notice(s_GameServ, u, "%s has seen their master now.", target->stats->name.c_str());
+            target->addFlag(FLAG_MASTER);
+         }
+         else
+         {
+            notice(s_GameServ, u, "%s has not seen their master now.", target->stats->name.c_str());
+            target->remFlag(FLAG_MASTER);
+         }
+       }         
+    }
   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|ON|OFF}");
+     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}");
      return;
   }
 }
@@ -1098,6 +1287,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");
@@ -1123,7 +1317,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);
@@ -1258,22 +1452,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');
 
@@ -1311,7 +1505,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;
@@ -1425,7 +1619,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;
     }
@@ -1464,7 +1658,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)
 {
@@ -1796,14 +1990,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))
     {
@@ -1857,362 +2051,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;
@@ -2324,6 +2162,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]);
@@ -2331,6 +2171,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)
@@ -2380,7 +2221,7 @@ 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->inventory.Strength() << ' ' << it->inventory.Defense() << ' ' << it->inventory.HP()
@@ -2392,13 +2233,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);
 
@@ -2436,8 +2339,8 @@ 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, " ")));
@@ -2614,14 +2517,14 @@ void do_store(char *u)
 
            p = user->stats;
 
-            if (p->weapon != 0)
-                notice(s_GameServ, u, "You have to sell your %s first!", weapons[p->weapon]);
+            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->wea = wep;
                 p->gold -= prices[wep - 1];
             }
         }
@@ -2636,14 +2539,14 @@ void do_store(char *u)
 
            p = user->stats;
 
-            if (p->armor != 0)
-                notice(s_GameServ, u, "You have to sell your %s first!", armors[p->armor]);
+            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->arm = wep;
                 p->gold -= prices[wep - 1];
             }
         }
@@ -2659,7 +2562,7 @@ void do_store(char *u)
 
         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;
@@ -2667,27 +2570,27 @@ void do_store(char *u)
             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;
+                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;
+                p->wea = 0;
             }
             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)
         {
            p = user->stats;
 
-            if (p->armor == 0)
+            if (p->arm == 0)
             {
                 notice(s_GameServ, u, "I don't think you can be any more naked...");
                 return;
@@ -2695,22 +2598,22 @@ void do_store(char *u)
             if (p->gold == 2000000000)
             {
                 notice(s_GameServ, u, "You have enough gold. I'll just take that off your hands, sire.");
-                p->armor = 0;
+                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;
+                p->arm = 0;
             }
             else
             {
                 notice(s_GameServ, u, "Thank you for your business! You now have %d more gold but no armor!",
-                         (prices[p->armor - 1] / 2));
+                         (prices[p->arm - 1] / 2));
 
-                p->gold += (prices[p->armor - 1] / 2);
-                p->armor = 0;
+                p->gold += (prices[p->arm - 1] / 2);
+                p->arm = 0;
             }
        }
         else
@@ -3121,7 +3024,6 @@ void do_dragon(char *u)
 
     Player *p = user->stats;
     setMaster(p);
-    see_master(u);
     notice(s_GameServ, u, "You approach the dragon's lair cautiously.");
     notice(s_GameServ, u, "The stench of sulfer fills the air as a "\
        "deep, red fog rolls in. The air is filled with the "\
@@ -3131,7 +3033,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 "\
@@ -3139,6 +3041,8 @@ void do_dragon(char *u)
     notice(s_GameServ, u, "Just then you notice the eye begin to "\
        "glare orange! The tooth is moving... but it is still too "\
        "dark for you to make out.... THE DRAGON! You see it!");
+    p->fight = new Monster(dragon);
+    setDragonFight(p);
     display_monster(u);
 }