]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv/gameserv.cpp
Added a new forest event (finding potions) 2% chance 20% chance for each potion after...
[irc/gameservirc.git] / gameserv / gameserv.cpp
index d2e37a4f4931f048de5b0cc9154efa6b04a64eb8..fbe8ded0ad05bed0f1798580d369fb22f9aaf822 100644 (file)
@@ -111,6 +111,7 @@ void do_register(char *u);
 void do_list(char *u);
 void do_logout(char *u);
 void do_master(char *u);
+void do_dragon(char *u);
 void do_play(char *u);
 void do_quitg(char *u);
 void do_reset(char *u);
@@ -133,15 +134,15 @@ char *weapons[WNA] = {  "Fists", "Stick", "Dagger", "Quarterstaff",  "Short Swor
                        "Chain Saw", "Poison Sword",  "Flame Sword", "Earth Hammer", 
                        "Light Saber", "Masamune", "Mystical Sword"};
 
-char *armors[WNA] = { "Nothing", "Clothes", "Leather Vest", "Chain Mail", "Plate Armor", 
+char *armors[WNA] = { "Birthday Suit", "Clothes", "Leather Vest", "Chain Mail", "Plate Armor", 
                      "Full Body Armor", "Magic Mail", "Graphite Suit", "Steel Suit", 
                      "Force Field", "Armor of Light", "Mythril Vest", "DemiGod Armor", 
                      "Hades' Cloak", "Dragon Scales", "Adamantium"};
 
 int prices[WNA - 1] = {200, 1000, 3000, 10000, 30000, 100000, 150000, 200000, 400000, 
                        1000000, 4000000, 10000000, 40000000, 100000000, 400000000};
-int webonus[WNA] = {1, 10, 15, 25, 35, 45, 65, 85, 125, 185, 255, 355, 505, 805, 1205, 1805};
-int arbonus[WNA] = {1, 2, 4, 10, 15, 25, 35, 50, 75, 100, 150, 225, 300, 400, 600, 1000};
+int webonus[WNA] = {2, 10, 15, 25, 35, 45, 65, 85, 125, 185, 255, 355, 505, 805, 1205, 1805};
+int arbonus[WNA] = {2, 3, 5, 10, 15, 25, 35, 50, 75, 100, 150, 225, 300, 400, 600, 1000};
 
 int hpbonus[11] = {10, 15, 20, 30, 50, 75, 125, 185, 250, 350, 550};
 int strbonus[11] = {5, 7, 10, 12, 20, 35, 50, 75, 110, 150, 200};
@@ -207,6 +208,8 @@ void gameserv(char *source, char *buf)
        do_inventory(source);
     } else if (stricmp(cmd, "MASTER") == 0) {
        do_master(source);
+    } else if (stricmp(cmd, "DRAGON") == 0) {
+       do_dragon(source);
     } else if (stricmp(cmd, "STORE") == 0) {
        do_store(source);
     } else if (stricmp(cmd, "BANK") == 0) {
@@ -470,7 +473,7 @@ void notice(const char *source, const char *dest, const char *fmt, ...)
        if (isUsePrivmsg())
            strcpy(commanduse, "P");
        else
-           strcpy(commanduse, "N");
+           strcpy(commanduse, "O");
     #else
 
        if (isUsePrivmsg())
@@ -576,6 +579,8 @@ char *strtok(char *str, const char *delim)
 void do_list(char *u)
 {
     aClient *user;
+    char *cmd = strtok(NULL, " ");
+
     if (!(user = find(u)))
     {
        log("Fatal Error: Couldn't find %s in the client list", u);
@@ -591,25 +596,29 @@ void do_list(char *u)
 
     ListNode<aClient> *temp;
     bool header = false;
+
   for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
   {
     temp = players[x].First();
     if (!players[x].isEmpty())
     {
-       if (!header)
-       {
-           notice(s_GameServ, u, "People Playing:");
-           header = true;
-       }
        while(temp)
        {
-           #ifdef P10
-           notice(s_GameServ, u, "IRC: %s     Game: %s", temp->getData()->getRealNick(), 
-                  temp->getData()->stats->name);
-           #else
-           notice(s_GameServ, u, "IRC: %s     Game: %s", temp->getData()->getNick(), 
-                  temp->getData()->stats->name);
-           #endif
+           if (!cmd || is_playing(temp->getData()))
+           {
+               if (!header)
+               {
+                   notice(s_GameServ, u, "Players:");
+                   header = true;
+               }
+               #ifdef P10
+               notice(s_GameServ, u, "IRC: %s     Game: %s", temp->getData()->getRealNick(), 
+                       temp->getData()->stats->name);
+               #else
+               notice(s_GameServ, u, "IRC: %s     Game: %s", temp->getData()->getNick(), 
+                       temp->getData()->stats->name);
+               #endif
+           }
 
            temp = temp->Next();
        }
@@ -1146,8 +1155,11 @@ bool player_fight(aClient *user)
 {
     if (!is_playing(user))
        return false;
-    else
-       return user->stats->battle != NULL;
+    else if (user->stats->battle != NULL)
+    {
+       return user->stats->battle->stats != NULL;
+    }
+    return false;
 }
 
 bool master_fight(char *u)
@@ -1217,19 +1229,21 @@ void do_fight(char *u)
     {
        notice(s_GameServ, u, "You can't attack %s while they aren't playing!", nick);
     }
-/*
- * Offline fighting not implemented yet.
- *   else if (!(fight = finduser(nick)))
- *   {
- *       ni->stats->battle = battle;
- *       battle->battle = ni;
- *       ni->yourturn = 1;
- *       battle->yourturn = 0;
- *       notice(s_GameServ, u, "You decide to fight %s while they're not online!",
- *                battle->stats->name);
- *       display_players(u);
- *   }
- */
+
+/* offline fighting not available yet
+    else if (!(fight = finduser(nick)))
+    {
+        ni->stats->battle = battle;
+        battle->battle = ni;
+       setYourTurn(ni->stats);
+        clearYourTurn(battle->stats);
+
+        notice(s_GameServ, u, "You decide to fight %s while they're "\
+                             "not in the realm!",
+                 battle->stats->name);
+        display_players(u);
+    }
+*/
     else if (stricmp(ni->stats->name, battle->stats->name) == 0)
     {
        notice(s_GameServ, u, "Are you trying to commit suicide!?");
@@ -1494,6 +1508,7 @@ void end_turn(aClient *user)
                         "of your experience!");
                 user->stats->gold = 0;
                 user->stats->exp -= (long int)(user->stats->exp * .10);
+               user->stats->hp = 0;
                 user->stats->fight = NULL;
                clearAlive(user->stats);
                 goto endturn;
@@ -1673,6 +1688,7 @@ void do_attack(char *u)
                         "of your experience!");
                 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;
@@ -2563,7 +2579,11 @@ void do_bank(char *u)
        notice(s_GameServ, u, "You must be playing to use the bank!");
        return;
     }
-
+    else if (is_fighting(user))
+    {
+       notice(s_GameServ, u, "You can't go to the bank during a fight!");
+       return;
+    }
     updateTS(user->stats);
     if (stricmp(cmd, "BALANCE") == 0)
     {
@@ -2688,6 +2708,69 @@ void do_bank(char *u)
 
 }
 
+void do_dragon(char *u)
+{
+    aClient *user;
+
+    if (!(user = find(u)))
+    {
+       notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, ""));
+       return;
+    }
+    else if (isIgnore(user))
+    {
+       #ifdef DEBUGMODE
+           log("Ignoring %s.", user->getNick());
+       #endif
+       return;
+    }
+    else if (!is_playing(user))
+    {
+       notice(s_GameServ, u, "You must be playing to fight the dragon!");
+       return;
+    }
+    else if (is_fighting(user))
+    {
+       notice(s_GameServ, u, "You are already in a fight. How will you fight the almighty dragon!?");
+       return;
+    }
+    else if (!isAlive(user->stats))
+    {
+       notice(s_GameServ, u, "You're dead. Wait until tomorrow to see your master!");
+       return;
+    }
+    else if (user->stats->level < REALLEVELS)
+    {
+       notice(s_GameServ, u, "You fool! Only those strong enough "\
+               "to vanquish any foe should DARE fight the dragon!");
+       notice(s_GameServ, u, "To put it in terms you can understand: "\
+               "You are too weak. You must be Level %d!", REALLEVELS);
+       return;
+    }
+
+    updateTS(user->stats);
+
+    Player *p = user->stats;
+    p->fight = new Monster(boss);
+    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 "\
+       "heated mist of deadly fire from beyond the cave "\
+       "entrance.");
+    notice(s_GameServ, u, "You adjust your %s, tighten your grip on "\
+       "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.");
+    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 "\
+       " staring into your soul! The eye is large... HUGE!");
+    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!");
+    display_monster(u);
+}
+
 void do_master(char *u)
 {
     aClient *user;
@@ -2738,41 +2821,43 @@ void do_master(char *u)
        switch(p->level)
        {
            case 1:
-               need = 100;
+               need = 200;
                break;
            case 2:
-               need = 400;
+               need = 800;
                break;
            case 3:
-               need = 1000;
+               need = 2000;
                break;
            case 4:
-               need = 4000;
+               need = 8000;
                break;
            case 5:
-               need = 10000;
+               need = 20000;
                break;
            case 6:
-               need = 40000;
+               need = 80000;
                break;
            case 7:
-               need = 100000;
+               need = 200000;
                break;
            case 8:
-               need = 400000;
+               need = 800000;
                break;
            case 9:
-               need = 1000000;
+               need = 2000000;
                break;
            case 10:
-               need = 4000000;
+               need = 8000000;
                break;
            case 11:
-               need = 10000000;
+               need = 20000000;
                break;
-           case 12:
+
+           case REALLEVELS:
                need = p->exp + 1;
-               notice(s_GameServ, u, "You are at level 12. You are the master. What's left? The DRAGON!");
+               notice(s_GameServ, u, "You are at level %d. You are the master. What's left? The DRAGON!", REALLEVELS);
+               return;
                break;
            default:
                need = p->exp + 1; // Unknown level... don't let them fight a fake master!