X-Git-Url: https://jfr.im/git/irc/gameservirc.git/blobdiff_plain/174e7f8facfa25922fe0cbc5e8dcb1e5a6f5bc07..f71a53ab6e251712c26a11c0b373d41014f775d5:/gameserv/gameserv.cpp diff --git a/gameserv/gameserv.cpp b/gameserv/gameserv.cpp index 7a6414a..05ac739 100644 --- a/gameserv/gameserv.cpp +++ b/gameserv/gameserv.cpp @@ -1,16 +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 #include #include +#include +#include +#include -using std::ifstream; -using std::ofstream; -using std::ios; +using namespace std; #if defined(HAVE_CRYPT_H) @@ -22,15 +27,24 @@ using std::ios; #endif - -Monster *monsters[LEVELS][MONSTERS]; // Monsters per level. Total = MONSTERS * LEVELS -Monster boss; // The boss monster - -Monster *masters[LEVELS]; // A master for each level +Monster dragon; // The current dragon +Level levels[LEVELS]; // The newest way to store monsters +list Items; // The master list of items +list tavern; // The list of items available at the tavern +list store; // The list of items available at the store // Database functions int save_gs_dbase(); int load_gs_dbase(); +int load_items(); +int load_tavern(); +int load_store(); +int load_dragon(); +int save_dragon(); + +item *findItemByID(int id); +item *findStoreItemByID(int id); +tavernItem *findTavernItemByID(int id); // String functions #ifndef HAVE_STRTOK @@ -43,10 +57,10 @@ int strnicmp(const char *s1, const char *s2, size_t len); /********** Password functions **********/ -bool passcmp(char *encrypted, char *plaintext); // Compares an encrypted pass with a plain text one +bool passcmp(const char *encrypted, char *plaintext); // Compares an encrypted pass with a plain text one bool check_password(char *name, char *plaintext); // Finds a password for the given name, and checks it with passcmp against the plaintext password given. - + /********** Password functions **********/ @@ -54,7 +68,7 @@ bool check_password(char *name, char *plaintext); // Finds a password for the gi bool shuttingdown; bool timedOut(Player *p); -void updateTS(Player *p); +void updateTS(Player *p); void timeOutEvent(Player *p); bool is_playing(char *u); // True if the given nickname in the clients list is playing. @@ -69,6 +83,10 @@ bool player_fight(aClient *user); bool master_fight(char *u); // True if the player is fighting their master. bool master_fight(aClient *user); +bool dragon_fight(char *u); // True if the player is fighting the dragon. +bool dragon_fight(aClient *user); + +bool alphaNumeric(const char *str); // Returns true if all of the characters in str are alphanumeric non-special chars /********** GameServ Booleans **********/ void display_help(char *u, char *file = NULL); @@ -83,17 +101,21 @@ long int stringtoint(char *number); char *spaces(int len, char *seperator); void refresh(Player *p); void refreshall(); +void rollover(Player *p); +void rolloverall(); + void updateTS(Player *p); void reset(Player *p); -void init_masters(); -void init_monsters(); +bool load_masters(); bool load_monsters(); +bool load_levels(); void delete_monsters(); -void delete_masters(); void do_admin(char *u); void do_attack(char *u); void do_bank(char *u); +void do_check(char *u); +void do_equip(char *u); void do_fight(char *u); void do_heal(char *u); void do_help(char *u); @@ -109,6 +131,7 @@ void do_play(char *u); void do_quitg(char *u); void do_reset(char *u); void do_run(char *u); +void do_set(char *u); void do_stats(char *u); void do_store(char *u); void do_tavern(char *u); @@ -117,25 +140,12 @@ void see_master(char *u); void logout(aClient *user); void showstats(const char *u, const char *nick); -void showinventory(aClient *from, aClient *to); +void showTavern(aClient *user); +void showinventory(Player *from, aClient *to); void showBankBalance(const char *u); void end_turn(aClient *user); #define WNA 16 -char *weapons[WNA] = { "Fists", "Stick", "Dagger", "Quarterstaff", "Short Sword", - "Long Sword", "Silver Spear", "Battle Axe", "The Ragnarok", - "Chain Saw", "Poison Sword", "Flame Sword", "Earth Hammer", - "Light Saber", "Masamune", "Mystical Sword"}; - -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] = {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}; @@ -143,199 +153,261 @@ int defbonus[11] = {2, 3, 5, 10, 15, 22, 35, 60, 80, 120, 150}; void gameserv(char *source, char *buf) { - char *cmd, z; - cmd = strtok(buf, " "); - - #ifndef P10 - source++; // Get rid of that : at the beginning of a :Nick privmsg Gameserv :text - #endif - - z = cmd[0]; - if (z == ':') - cmd++; // Get rid of that : at the beginning of the :text (command) - - #ifdef DEBUGMODE - log("Source: %s Command: %s", source, cmd); - #endif - - struct tm *tm; - time_t ti; - time(&ti); - tm = localtime(&ti); - - int curday = tm->tm_mday; - - if (curday != day) + char *cmd, z; + cmd = strtok(buf, " "); + +#ifndef P10 + source++; // Get rid of that : at the beginning of a :Nick privmsg Gameserv :text +#endif + + z = cmd[0]; + if (z == ':') + cmd++; // Get rid of that : at the beginning of the :text (command) + +#ifdef DEBUGMODE + log("Source: %s Command: %s", source, cmd); +#endif + + if (strnicmp(cmd, "\1PING", 6) == 0) { - refreshall(); - day = curday; - save_day(); // here i come to save the day! + char *ts; + ts = strtok(NULL, "\1"); + notice(s_GameServ, source, "\1PING %s\1", ts); } - - if (strnicmp(cmd, "\1PING", 6) == 0) - { - char *ts; - ts = strtok(NULL, "\1"); - notice(s_GameServ, source, "\1PING %s\1", ts); - } else if (stricmp(cmd, "\1VERSION\1") == 0) { - notice(s_GameServ, source, "\1VERSION %s %s\1", PACKAGE, VERSION); - } else if (stricmp(cmd, "SEARCH") == 0) { - cmd = strtok(NULL, " "); - - if (!cmd) + else if (stricmp(cmd, "\1VERSION\1") == 0) + { + notice(s_GameServ, source, "\1VERSION %s %s\1", PACKAGE, VERSION); + } + else if (stricmp(cmd, "SEARCH") == 0) + { + cmd = strtok(NULL, " "); + + if (!cmd) notice(s_GameServ, source, "SYNTAX: /msg %S SEARCH FOREST"); - else + else do_forest(source); - - } else if (stricmp(cmd, "FIGHT") == 0) { - do_fight(source); - } else if (stricmp(cmd, "ATTACK") == 0) { - do_attack(source); - } else if (stricmp(cmd, "RUN") == 0) { - do_run(source); - } else if (stricmp(cmd, "USE") == 0) { - do_use(source); - } else if (stricmp(cmd, "HEAL") == 0) { - do_heal(source); - } else if (stricmp(cmd, "INVENTORY") == 0) { - 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) { - do_bank(source); - } else if (stricmp(cmd, "ADMIN") == 0) { - do_admin(source); - } else if (stricmp(cmd, "REFRESH") == 0) { - do_refresh(source); - } else if (stricmp(cmd, "RESET") == 0) { - do_reset(source); - } else if (stricmp(cmd, "TAVERN") == 0) { - do_tavern(source); - } else if (stricmp(cmd, "LIST") == 0) { - do_list(source); - } else if (stricmp(cmd, "LOGOUT") == 0) { - do_logout(source); - } else if (stricmp(cmd, "NEWS") == 0) { - addNews(todaysnews, "This is a test"); - showNews(source, todaysnews); - } else if (stricmp(cmd, "REGISTER") == 0) { - do_register(source); - } else if (stricmp(cmd, "IDENTIFY") == 0) { - do_identify(source); - } else if (stricmp(cmd, "HELP") == 0) { - do_help(source); - } else if (stricmp(cmd, "STATS") == 0) { - do_stats(source); - } else if (stricmp(cmd, "SHUTDOWN") == 0) { - aClient *user; - - if (!(user = find(source))) - { - notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin"); - log("Error: aClient not found: %s", source); - } - else if (!isAdmin(user)) + + } + else if (stricmp(cmd, "ADMIN") == 0) { - notice(s_GameServ, source, "You must be a %S admin to use this command!"); - } - else + do_admin(source); + } + else if (stricmp(cmd, "ATTACK") == 0) { - save_gs_dbase(); - #ifdef P10 - raw("[] SQ %s 0 :leaving: %s used the Shutdown command.", servername, user->getRealNick()); - #else - raw("SQUIT %s :leaving: %s used the Shutdown command.", servername, source); - #endif - shuttingdown = true; - } - } else if (stricmp(cmd, "SAVE") == 0) { - aClient *user; - - if (!(user = find(source))) + do_attack(source); + } + else if (stricmp(cmd, "BANK") == 0) { - notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin"); - log("Error: aClient not found: %s", source); - } - else if (!isAdmin(user)) + do_bank(source); + } + else if (stricmp(cmd, "CHECK") == 0) { - notice(s_GameServ, source, "You must be a %S admin to use this command!"); - } - else - { - save_gs_dbase(); - } - } else if (stricmp(cmd, "LOAD") == 0) { - aClient *user; - - if (!(user = find(source))) + do_check(source); + } + else if (stricmp(cmd, "DRAGON") == 0) { - notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin"); - log("Error: aClient not found: %s", source); - } - else if (!isAdmin(user)) + do_dragon(source); + } + else if (stricmp(cmd, "EQUIP") == 0) { - notice(s_GameServ, source, "You must be a %S admin to use this command!"); - } - else + do_equip(source); + } + else if (stricmp(cmd, "FIGHT") == 0) + { + do_fight(source); + } + else if (stricmp(cmd, "HEAL") == 0) + { + do_heal(source); + } + else if (stricmp(cmd, "HELP") == 0) + { + do_help(source); + } + else if (stricmp(cmd, "IDENTIFY") == 0) + { + do_identify(source); + } + else if (stricmp(cmd, "INVENTORY") == 0) + { + do_inventory(source); + } + else if (stricmp(cmd, "LIST") == 0) + { + do_list(source); + } + else if (stricmp(cmd, "LOGOUT") == 0) + { + do_logout(source); + } + else if (stricmp(cmd, "MASTER") == 0) + { + do_master(source); + } + else if (stricmp(cmd, "NEWS") == 0) + { + do_news(source); + } + else if (stricmp(cmd, "REGISTER") == 0) + { + do_register(source); + } + else if (stricmp(cmd, "REFRESH") == 0) + { + do_refresh(source); + } + else if (stricmp(cmd, "RESET") == 0) + { + do_reset(source); + } + else if (stricmp(cmd, "RUN") == 0) + { + do_run(source); + } + else if (stricmp(cmd, "SET") == 0) + { + do_set(source); + } + else if (stricmp(cmd, "STATS") == 0) + { + do_stats(source); + } + else if (stricmp(cmd, "STORE") == 0) + { + do_store(source); + } + else if (stricmp(cmd, "TAVERN") == 0) + { + do_tavern(source); + } + else if (stricmp(cmd, "USE") == 0) + { + do_use(source); + } + else if (stricmp(cmd, "SHUTDOWN") == 0) + { + aClient *user; + + if (!(user = find(source))) + { + notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin"); + log("Error: aClient not found: %s", source); + } + else if (!isAdmin(user)) + { + notice(s_GameServ, source, "You must be a %S admin to use this command!"); + } + else + { + save_gs_dbase(); +#ifdef P10 + raw("[] SQ %s 0 :leaving: %s used the Shutdown command.", servername, user->getRealNick()); +#else + raw("SQUIT %s :leaving: %s used the Shutdown command.", servername, source); +#endif + shuttingdown = true; + } + } + else if (stricmp(cmd, "SAVE") == 0) + { + aClient *user; + + if (!(user = find(source))) + { + notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin"); + log("Error: aClient not found: %s", source); + } + else if (!isAdmin(user)) + { + notice(s_GameServ, source, "You must be a %S admin to use this command!"); + } + else { - char *cmd2 = strtok(NULL, " "); - if (!cmd2) - { - notice(s_GameServ, source, "Loading player data from %s", playerdata); - load_gs_dbase(); - } - else if (stricmp(cmd2, "MONSTERS") == 0) - { - notice(s_GameServ, source, "Loading monster data from %s", monsterdata); - load_monsters(); - } - else - display_help(source, cmd); - } - #ifdef DEBUGMODE - } else if (stricmp(cmd, "RAW") == 0) { - aClient *user; - - if (!(user = find(source))) + save_gs_dbase(); + } + } + else if (stricmp(cmd, "LOAD") == 0) { - notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin"); - log("Error: aClient not found: %s", source); + aClient *user; + + if (!(user = find(source))) + { + notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin"); + log("Error: aClient not found: %s", source); + } + else if (!isAdmin(user)) + { + notice(s_GameServ, source, "You must be a %S admin to use this command!"); + } + else + { + char *cmd2 = strtok(NULL, " "); + if (!cmd2) + { + notice(s_GameServ, source, "Loading player data from %s", playerdata); + load_gs_dbase(); + } + else if (stricmp(cmd2, "MONSTERS") == 0) + { + notice(s_GameServ, source, "Loading monster data"); + load_monsters(); + } + else + { + display_help(source, cmd); + } + } } - else if (!isAdmin(user)) +#ifdef DEBUGMODE + else if (stricmp(cmd, "RAW") == 0) { - notice(s_GameServ, source, "You must be a %S admin to use this command!"); - } - else + aClient *user; + + if (!(user = find(source))) + { + notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin"); + log("Error: aClient not found: %s", source); + } + else if (!isAdmin(user)) + { + notice(s_GameServ, source, "You must be a %S admin to use this command!"); + } + else { - char *rest = strtok(NULL, ""); - raw("%s", rest); - } - #endif - } else { - aClient *user; - if ((user = find(source))) + char *rest = strtok(NULL, ""); + raw("%s", rest); + } + } + else if (stricmp(cmd, "RANDOM") == 0) { - if (isIgnore(user)) - { - #ifdef DEBUGMODE - log("Ignoring %s.", user->getNick()); - #endif - } - else - { - notice(s_GameServ, source, "Unknown command \002%s\002. Type /msg %S \002HELP\002 to get a list of commands.", cmd); - } + char *rstr = strtok(NULL, ""); + range trange; + trange.setRange(rstr); + notice(s_GameServ, source, "Random number in that range: %d", trange.random()); } - } +#endif + else + { + aClient *user; + if ((user = find(source))) + { + if (isIgnore(user)) + { +#ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); +#endif + } + else + { + notice(s_GameServ, source, "Unknown command \002%s\002. Type /msg %S \002HELP\002 to get a list of commands.", cmd); + } + } + } - #ifndef P10 - source--; // Bring the ':' back so we don't leak memory - #endif - if (z == ':') +#ifndef P10 + source--; // Bring the ':' back so we don't leak memory +#endif + if (z == ':') cmd--; // Same thing :) } @@ -356,69 +428,59 @@ int stricmp(const char *s1, const char *s2) void showstats(const char *u, const char *nick) { - aClient *ni, *sender = find(u); + aClient *sender = find(u); + Player *p; char *buf; buf = new char[50]; char *space; - if (!(ni = findplayer(nick))) - { + if (!(p = findplayer(nick))) + { notice(s_GameServ, u, "%s not found", nick); - } - else if (ni->stats) - { - notice(s_GameServ, sender->getNick(), "Stats for %s:", ni->stats->name); - - sprintf(buf, "Experience: %ld", ni->stats->exp); + } + else + { + notice(s_GameServ, sender->getNick(), "Stats for %s:", p->getName().c_str()); + + sprintf(buf, "Experience: %ld", p->getExp()); space = spaces(strlen(buf), " "); notice(s_GameServ, sender->getNick(), "%s%sLevel: %d", buf, space, - ni->stats->level); + p->getLevel()); delete [] space; - - sprintf(buf, "Gold: %ld", ni->stats->gold); + + sprintf(buf, "Gold: %ld", p->getGold()); space = spaces(strlen(buf), " "); - notice(s_GameServ, sender->getNick(), "%s%sGold in Bank: %ld", buf, space, ni->stats->bank); + notice(s_GameServ, sender->getNick(), "%s%sGold in Bank: %ld", buf, space, p->getBank()); delete [] space; - - 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]); + + notice(s_GameServ, sender->getNick(), "Hit Points: %d of %d", p->getHP(), + p->getMaxHP()); + + sprintf(buf, "Strength: %d", p->getStrength()); space = spaces(strlen(buf), " "); notice(s_GameServ, sender->getNick(), "%s%sDefense: %d", - buf, space, ni->stats->defense + arbonus[ni->stats->armor]); + buf, space, p->getDefense()); delete [] space; - - sprintf(buf, "Armor: %s", armors[ni->stats->armor]); + + sprintf(buf, "Armor: %s", (p->getArmor() ? p->getArmor()->getName().c_str() : "Nothing")); space = spaces(strlen(buf), " "); + notice(s_GameServ, sender->getNick(), "%s%sWeapon: %s", buf, space, - weapons[ni->stats->weapon]); + (p->getWeapon() ? p->getWeapon()->getName().c_str() : "Fists")); + delete [] space; - - sprintf(buf, "Forest Fights: %d", ni->stats->forest_fights); + + sprintf(buf, "Forest Fights: %d", p->getForestFights()); space = spaces(strlen(buf), " "); - notice(s_GameServ, sender->getNick(), "%s%sPlayer Fights: %d", buf, space, ni->stats->player_fights); + notice(s_GameServ, sender->getNick(), "%s%sPlayer Fights: %d", buf, space, p->getPlayerFights()); 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; + if (p->getClient() == sender || isAdmin(sender)) + { + showinventory(p, sender); + } + } - sprintf(buf, "Strength: %d", inv->Strength()); - space = spaces(strlen(buf), " "); - notice(s_GameServ, sender->getNick(), "%s%sDefense: %d", buf, - space, inv->Defense()); - delete [] space; - } - else - { - notice(s_GameServ, u, "%s is not playing!", ni->stats->name); - } delete [] buf; } @@ -526,6 +588,7 @@ void notice(const char *source, const char *dest, const char *fmt, ...) case 'd': sprintf(input, "%s%d", input, va_arg(args, int)); break; case 's': sprintf(input, "%s%s", input, va_arg(args, char *)); break; case 'S': sprintf(input, "%s%s", input, s_GameServ); break; + case 'c': sprintf(input, "%s%c", input, va_arg(args, int)); break; case 'l': if (*++t == 'd') sprintf(input, "%s%ld", input, va_arg(args, long int)); break; @@ -586,1354 +649,1415 @@ char *strtok(char *str, const char *delim) } #endif -void do_list(char *u) +void do_check(char *u) { - aClient *user; - char *cmd = strtok(NULL, " "); - - if (!(user = find(u))) - { - log("Fatal Error: Couldn't find %s in the client list", u); - return; - } - else if (isIgnore(user)) - { - #ifdef DEBUGMODE - log("Ignoring %s. Command LIST", user->getNick()); - #endif - return; - } - - ListNode *temp; - bool header = false; - - for (unsigned long x = 0; x < U_TABLE_SIZE; x++) - { - temp = players[x].First(); - if (!players[x].isEmpty()) - { - while(temp) - { - if (!cmd || is_playing(temp->getData())) - { - if (!header) - { - notice(s_GameServ, u, "Players:"); - header = true; - } - #ifdef P10 - notice(s_GameServ, u, "IRC: %s Game: %s", temp->getData()->getRealNick(), - temp->getData()->stats->name); - #else - notice(s_GameServ, u, "IRC: %s Game: %s", temp->getData()->getNick(), - temp->getData()->stats->name); - #endif - } + int days, hours, minutes, seconds; + long complete; + complete = (lastrefresh + refreshperiod) - time(NULL); + days = complete / 86400; + hours = (complete % 86400) / 3600; + minutes = (complete % 86400) % 3600 / 60; + seconds = (complete % 86400) % 3600 % 60; - temp = temp->Next(); - } - } - } - if (!header) - notice(s_GameServ, u, "No one is playing"); - else - notice(s_GameServ, u, "End of List"); + notice(s_GameServ, u, "Time left to next refresh: %dd %dh %dm %ds", + days, hours, minutes, seconds); + if (isRolloverForestFights()) + { + complete = (lastrollover + rolloverperiod) - time(NULL); + + days = complete / 86400; + hours = (complete % 86400) / 3600; + minutes = (complete % 86400) % 3600 / 60; + seconds = (complete % 86400) % 3600 % 60; + + notice(s_GameServ, u, "Time left to next rollover: %dd %dh %dm %ds", + days, hours, minutes, seconds); + } } -void do_logout(char *u) +void do_list(char *u) { - aClient *user; - char *name = strtok(NULL, " "); - - if (!(user = find(u))) + aClient *user; + Player *p; + char *cmd = strtok(NULL, " "); + + if (!(user = find(u))) { - notice(s_GameServ, u, "Fatal error. Cannot find aClient. "\ - "Buf: %s LOGOUT", u); - log("Could not find aClient Buf: %s LOGOUT", - u); - return; + log("Fatal Error: Couldn't find %s in the client list", u); + return; } - else if (isIgnore(user)) + else if (isIgnore(user)) { - #ifdef DEBUGMODE - log("Ignoring %s.", user->getNick()); - #endif - return; +#ifdef DEBUGMODE + log("Ignoring %s. Command LIST", user->getNick()); +#endif + return; } + + list::iterator iter; + bool header = false; - if (name) - { - if (!isAdmin(user)) - { - notice(s_GameServ, u, "You must be a %S admin to use this command!"); - } - else if (!(user = findplayer(name))) - { - notice(s_GameServ, u, "Couldn't find a player named %s", name); - } - else - { - notice(s_GameServ, u, "Logging out %s", user->stats->name); - logout(user); - } - } - else if (!name) - { - if (!is_playing(user)) - { - notice(s_GameServ, u, "You're not logged in!"); - } - else if (is_fighting(user)) - { - notice(s_GameServ, u, "You can't logout while fighting!"); - } - else + for (unsigned long x = 0; x < U_TABLE_SIZE; x++) { - notice(s_GameServ, u, "You have left the fields. You have lived to kill another day!"); - logout(user); + iter = players[x].begin(); + if (!players[x].empty()) + { + while(iter != players[x].end()) + { + p = (*iter); + if (cmd || is_playing(p->getClient())) + { + if (!header) + { + notice(s_GameServ, u, "Players:"); + header = true; + } +#ifdef P10 + notice(s_GameServ, u, "IRC: %s Game: %s", (p->getClient() ? p->getClient()->getRealNick() : "Not Playing"), + p->getName().c_str()); +#else + notice(s_GameServ, u, "IRC: %s Game: %s", (p->getClient() ? p->getClient()->getNick() : "Not Playing"), + p->getName().c_str()); +#endif + } + iter++; + } + } } - } -} - -void logout(aClient *user) -{ - if (is_playing(user)) - { - ListNode *it; - aClient *temp; - unsigned long hv = iHASH((unsigned char *) user->stats->name); - it = players[hv].Find(user); - - if (!it) - { - notice(s_GameServ, user->getNick(), "Fatal error. Contact "\ - "%S Admin. Cannot find you in the players list."); - log("Error on logout(). Can't find %s in the players list", - #ifdef P10 - user->getRealNick() - #else - user->getNick() - #endif - ); - return; - } - - temp = new aClient; - temp->stats = new Player; - temp->stats->setData(user->stats); - user->stats->client = NULL; - - if (player_fight(user)) - user->stats->battle->stats->battle = NULL; - - delete user->stats; - user->stats = NULL; - temp->stats->client = NULL; - #ifdef P10 - temp->setRealNick("Not Playing"); - #endif - temp->setNick("Not Playing"); - - it->setNewPtr(temp); - #ifdef DEBUGMODE - log("Logged out player %s", - #ifdef P10 - user->getRealNick() - #else - user->getNick() - #endif - ); - #endif - } - clearPlaying(user); + if (!header) + notice(s_GameServ, u, "No one is playing"); + else + notice(s_GameServ, u, "End of List"); } -void do_register(char *u) +void do_set(char *u) { - char *password, *name; - aClient *user; - name = strtok(NULL, " "); - password = strtok(NULL, " "); - - static char saltChars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./"; - static char salt[3]; - - salt[0] = saltChars[rand() % strlen(saltChars)]; - salt[1] = saltChars[rand() % strlen(saltChars)]; - salt[2] = '\0'; - - if (!name) + aClient *user; + Player *p; + char *name = strtok(NULL, " "); + char *cmd = strtok(NULL, " "); + char *cmd2; + + if (!(user = find(u))) { - notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD"); + notice(s_GameServ, u, "Fatal error. Cannot find aClient. "\ + "Buf: %s LOGOUT", u); + return; } - else if (!password) + else if (isIgnore(user)) { - notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD"); +#ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); +#endif + return; } - else if ((user = findplayer(name))) + else if (!name || !cmd) { - notice(s_GameServ, u, "%s is already registered!", name); - notice(s_GameServ, u, "Choose another name!"); + 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 (!(user = find(u))) + else if (!(p = findplayer(name))) { - log("Fatal Error: Couldn't find %s in the clients list", u); + // Back the pointers up... they didn't send a name probably + cmd2 = cmd; + cmd = name; + p = user->stats; + + if (!is_playing(user)) + { + notice(s_GameServ, u, "You must be playing to set things for yourself!"); + return; + } } - else if (isIgnore(user)) + else { - #ifdef DEBUGMODE - log("Ignoring %s.", user->getNick()); - #endif - return; + cmd2 = strtok(NULL, " "); } - else - { - if (!is_playing(user)) - { - ListNode *temp; - user->stats = new Player(user); - user->stats->client = user; // Set the backwards pointer - user->stats->reset(); // set the user up - strncpy(user->stats->password, crypt(password, salt), 255); - strncpy(user->stats->name, name, 255); - unsigned long hv = iHASH((unsigned char *) name); - updateTS(user->stats); - temp = players[hv].insertAtBack_RLN(user); - temp->setPtr(user); // This is an extra step, but necessary for now - - notice(s_GameServ, u, "Player %s registered with password %s.", user->stats->name, password); - notice(s_GameServ, u, "Write this password down. If you lose it, there is no way to retrieve it!"); - log("Nickname %s registered player %s.", u, user->stats->name); - setPlaying(user); // set the playing flag - } - else + if (!cmd2) { - notice(s_GameServ, u, "Already registered. Contact a %S admin for help."); + 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; } + + // Regardless of the previous if/else, if it got here, we know we have the cmd pointer at the right spot. + if (stricmp(cmd, "PASSWORD") == 0) + { + // Person is looking to change their password + // If they're an admin, or it's theirself, allow it + // cmd2 is pointing to the password now + if (isAdmin(user) || user == p->getClient()) + { + p->setPassword(cmd2); + notice(s_GameServ, u, "Password successfully changed"); + } + else if (user != p->getClient() && !isAdmin(user)) + { + notice(s_GameServ, u, "You must be a %S admin to set other peoples' passwords."); + return; + } } -} - -void do_identify(char *u) -{ - char *password, *name; - aClient *user, *p; - name = strtok(NULL, " "); - password = strtok(NULL, " "); - if (!password || !name) - { - notice(s_GameServ, u, "SYNTAX: /msg %S IDENTIFY NAME PASSWORD"); - } - else if (!(user = find(u))) + else if (stricmp(cmd, "BANK") == 0 || stricmp(cmd, "BALANCE") == 0) { - notice(s_GameServ, u, "Fatal error. Cannot find aClient. Buf: %s", strtok(NULL, "")); - log("Error: aClient not found: %s", u); + if (!isAdmin(user)) + { + notice(s_GameServ, u, "Admins Only!"); + return; + } + else if (stricmp(cmd, "BANK") == 0) + { + cmd2 = strtok(NULL, " "); // Need an extra parameter for set bank balance + } + if (!cmd2) + { + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] [BANK] BALANCE "); + return; + } + + p->setBank(stringtoint(cmd2)); + + notice(s_GameServ, u, "Bank balance changed to %ld!", p->getBank()); } - else if (isIgnore(user)) + else if (stricmp(cmd, "PLAYER") == 0) { - #ifdef DEBUGMODE - log("Ignoring %s.", user->getNick()); - #endif - return; + if (!isAdmin(user)) + { + notice(s_GameServ, u, "Admins Only!"); + return; + } + else if (stricmp(cmd2, "FIGHTS") != 0) + { + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS "); + return; + } + else + { + cmd2 = strtok(NULL, " "); + if (!cmd2) + { + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS "); + return; + } + p->setPlayerFights(stringtoint(cmd2)); + + notice(s_GameServ, u, "Player fights changed to %d!", p->getPlayerFights()); + } + } + else if (stricmp(cmd, "FOREST") == 0) + { + if (!isAdmin(user)) + { + notice(s_GameServ, u, "Admins Only!"); + return; + } + else if (stricmp(cmd2, "FIGHTS") != 0) + { + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] FOREST FIGHTS "); + return; + } + else + { + cmd2 = strtok(NULL, " "); + if (!cmd2) + { + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] FOREST FIGHTS "); + return; + } + + p->setForestFights(stringtoint(cmd2)); + + notice(s_GameServ, u, "Forest fights changed to %d!", p->getForestFights()); + } + } + else if (stricmp(cmd, "GOLD") == 0) + { + if (!isAdmin(user)) + { + notice(s_GameServ, u, "Admins Only!"); + return; + } + else + { + if (!cmd2) + { + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] GOLD "); + return; + } + p->setGold(stringtoint(cmd2)); + + notice(s_GameServ, u, "Gold set to %ld", p->getGold()); + return; + } + } + else if (stricmp(cmd, "STRENGTH") == 0 && stricmp(cmd2, "POTIONS") != 0) + { + if (!isAdmin(user)) + { + notice(s_GameServ, u, "Admins Only!"); + return; + } + else + { + if (!cmd2) + { + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] STRENGTH "); + return; + } + + p->setStrength(stringtoint(cmd2)); + + notice(s_GameServ, u, "Strength set to %d", p->getStrength()); + return; + } + } + else if (stricmp(cmd, "DEFENSE") == 0 && stricmp(cmd2, "POTIONS") != 0) + { + if (!isAdmin(user)) + { + notice(s_GameServ, u, "Admins Only!"); + return; + } + else + { + if (!cmd2) + { + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] DEFENSE "); + return; + } + + p->setDefense(stringtoint(cmd2)); + + notice(s_GameServ, u, "Defense set to %d", p->getDefense()); + return; + } + } + else if (stricmp(cmd, "HP") == 0 && stricmp(cmd2, "POTIONS") != 0) + { + if (!isAdmin(user)) + { + notice(s_GameServ, u, "Admins Only!"); + return; + } + else + { + if (!cmd2) + { + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HP "); + return; + } + p->setHP(stringtoint(cmd2)); + + notice(s_GameServ, u, "HP set to %d", p->getHP()); + return; + } + } + else if (stricmp(cmd, "MAXHP") == 0) + { + if (!isAdmin(user)) + { + notice(s_GameServ, u, "Admins Only!"); + return; + } + else + { + if (!cmd2) + { + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] MAXHP "); + return; + } + p->setMaxHP(stringtoint(cmd2)); + + notice(s_GameServ, u, "MaxHP set to %d", p->getMaxHP()); + return; + } + } + else if (stricmp(cmd, "EXPERIENCE") == 0 || stricmp(cmd, "EXP") == 0) + { + if (!isAdmin(user)) + { + notice(s_GameServ, u, "Admins Only!"); + return; + } + else + { + if (!cmd2) + { + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {EXPERIENCE|EXP} "); + return; + } + + p->setExp(stringtoint(cmd2)); + + notice(s_GameServ, u, "Exp set to %ld", p->getExp()); + return; + } + } + else if (stricmp(cmd, "LEVEL") == 0) + { + if (!isAdmin(user)) + { + notice(s_GameServ, u, "Admins Only!"); + return; + } + else + { + if (!cmd2) + { + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] LEVEL "); + return; + } + p->setLevel(stringtoint(cmd2)); + + notice(s_GameServ, u, "Level set to %d", p->getLevel()); + return; + } + } + else if (stricmp(cmd, "ALIVE") == 0) + { + if (!isAdmin(user)) + { + notice(s_GameServ, u, "Admins Only!"); + return; + } + else + { + if (!cmd2) + { + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] ALIVE TRUE|FALSE"); + return; + } + else if (stricmp(cmd2, "TRUE") == 0) + { + notice(s_GameServ, u, "%s has been Resurrected!", p->getName().c_str()); + setAlive(p); + } + else + { + notice(s_GameServ, u, "%s is now dead!", p->getName().c_str()); + clearAlive(p); + } + } + } + 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) + { + 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.", p->getName().c_str()); + p->addFlag(FLAG_MASTER); + } + else + { + notice(s_GameServ, u, "%s has not seen their master now.", p->getName().c_str()); + p->remFlag(FLAG_MASTER); + } + } + } + else + { + notice(s_GameServ, u, "Unknown command: SET %s", cmd); + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|ALIVE|SEEN MASTER} {STRING|NUMBER|TRUE|FALSE}"); + return; + } +} + +void do_logout(char *u) +{ + aClient *user; + Player *p; + char *name = strtok(NULL, " "); + + if (!(user = find(u))) + { + notice(s_GameServ, u, "Fatal error. Cannot find aClient. "\ + "Buf: %s LOGOUT", u); + log("Could not find aClient Buf: %s LOGOUT", + u); + return; + } + else if (isIgnore(user)) + { +#ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); +#endif + return; + } + + if (name) + { + if (!isAdmin(user)) + { + notice(s_GameServ, u, "You must be a %S admin to use this command!"); + } + else if (!(p = findplayer(name))) + { + notice(s_GameServ, u, "Couldn't find a player named %s", name); + } + else + { + notice(s_GameServ, u, "Logging out %s", p->getName().c_str()); + logout(p->getClient()); + } + } + else if (!name) + { + if (!is_playing(user)) + { + notice(s_GameServ, u, "You're not logged in!"); + } + else if (is_fighting(user)) + { + notice(s_GameServ, u, "You can't logout while fighting!"); + } + else + { + notice(s_GameServ, u, "You have left the fields. You have lived to kill another day!"); + logout(user); + } } - else if (!(p = findplayer(name)) || !p->stats) - notice(s_GameServ, u, "Player %s not found", name); - else if (is_playing(user)) +} + +void logout(aClient *user) +{ + if (user != NULL) + { + if (user->stats != NULL) + { + + list::iterator iter; + unsigned long hv = iHASH((unsigned char *) user->stats->getName().c_str()); + iter = find(players[hv].begin(), players[hv].end(), user->stats); + + if (iter == players[hv].end()) + { + notice(s_GameServ, user->getNick(), "Fatal error. Contact "\ + "%S Admin. Cannot find you in the players list. This should NEVER happen"); + log("Error on logout(). Can't find %s in the players list", +#ifdef P10 + user->getRealNick() +#else + user->getNick() +#endif + ); + user->stats = NULL; + + return; + } + user->stats->delMonster(); + user->stats->delMaster(); + user->stats->delBattle(); + clearDragonFight(user->stats); + clearYourTurn(user->stats); + clearPlaying(user); + + user->stats->setClient(NULL); + + + if (player_fight(user)) + { + clearYourTurn(user->stats->getBattle()->stats); + user->stats->getBattle()->stats->delBattle(); + } + +#ifdef DEBUGMODE + log("Logged out player %s", +#ifdef P10 + user->getRealNick() +#else + user->getNick() +#endif + ); +#endif + } + } + if (user) + user->stats = NULL; +} + +void do_register(char *u) +{ + char *password, *name; + aClient *user; + Player *p; + name = strtok(NULL, " "); + password = strtok(NULL, " "); + + if (!name) { - notice(s_GameServ, u, "You are already playing!"); + notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD"); } - else if (p->stats->client != NULL && !isAdmin(user)) + else if (stricmp(name, s_GameServ) == 0) { - notice(s_GameServ, u, "That player has already identified."); + notice(s_GameServ, u, "You can't use %S as a name!"); } - else if (!check_password(name, password) && !isAdmin(user)) + else if (!password) { - notice(s_GameServ, u, "Password incorrect"); + notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD"); } - else { - ListNode *temp; - unsigned long hv = iHASH((unsigned char *) p->stats->name); - temp = players[hv].Find(p); - if (!temp) + else if (strlen(name) > maxnicklen) { - notice(s_GameServ, u, "Fatal error. Contact %S Admin. Buf: %s", - strtok(NULL, "")); - return; + notice(s_GameServ, u, "Name too long. Maximum length: %d", maxnicklen); } - user->stats = new Player(p->stats->name); - #ifdef DEBUGMODE - log("Setting data for identified"); - #endif - user->stats->setData(p->stats); - user->stats->client = user; - updateTS(user->stats); + else if (!alphaNumeric(name)) + { + notice(s_GameServ, u, "That is not a valid name. Please use only AlphaNumeric (A-Z, 0-9) characters!"); + } + else if ((p = findplayer(name))) + { + notice(s_GameServ, u, "%s is already registered!", name); + notice(s_GameServ, u, "Choose another name!"); + } + else if (!(user = find(u))) + { + log("Fatal Error: Couldn't find %s in the clients list", u); + } + else if (isIgnore(user)) + { +#ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); +#endif + } + else + { + if (!is_playing(user)) + { + item *tempItem; + unsigned long hv = iHASH((unsigned char *) name); + // First create the Player + user->stats = new Player(); - #ifdef DEBUGMODE - log("Player %s IRC: %s Identified", user->stats->name, - user->getNick()); - #endif + // Set the backwards pointer + user->stats->setClient(user); + + // Set the player's password + user->stats->setPassword(password); + + // Set the player's name + user->stats->setName(name); + + // Make sure they have a proper time stamp + updateTS(user->stats); + + // Update the last login time + user->stats->lastlogin = time(NULL); + + // Send notification of success + notice(s_GameServ, u, "Player %s registered with password %s.", user->stats->getName().c_str(), password); + notice(s_GameServ, u, "Write this password down. If you lose it, there is no way to retrieve it!"); + + // Log the new player + log("Nickname %s registered player %s.", u, user->stats->getName().c_str()); - setPlaying(user); // set the playing flag + // Log the player in + setPlaying(user); - temp->setPtr(user); - notice(s_GameServ, u, "Password Accepted. Identified."); - showNews(u, todaysnews); + // Start the player at the beginning + reset(user->stats); + + // Add the stick and clothes + tempItem = findItemByID(3001); + user->stats->inventory->addItem((*Items.begin()))->use(user->stats); // Add the stick + user->stats->inventory->addItem(tempItem)->use(user->stats); // Add Clothes + + // Add the player to the list + players[hv].push_back(user->stats); + } + else + { + notice(s_GameServ, u, "Already registered. Contact a %S admin for help."); + } } } -void do_stats(char *u) +void do_identify(char *u) { - char *nick; - aClient *user; - - nick = strtok(NULL, " "); - - if (!(user = find(u))) + char *password, *name; + aClient *user; + Player *p; + name = strtok(NULL, " "); + password = strtok(NULL, " "); + if (!password || !name) { - log("Fatal Error: %s not found in client list", u); - return; + notice(s_GameServ, u, "SYNTAX: /msg %S IDENTIFY NAME PASSWORD"); } - else if (isIgnore(user)) + else if (!(user = find(u))) { - #ifdef DEBUGMODE - log("Ignoring %s.", user->getNick()); - #endif - return; + notice(s_GameServ, u, "Fatal error. Cannot find aClient. Buf: %s", strtok(NULL, "")); + log("Error: aClient not found: %s", u); } - else if (!nick) + else if (isIgnore(user)) { - if (!is_playing(user)) - { - notice(s_GameServ, u, "You're not playing, so you have no stats!"); - return; - } - else +#ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); +#endif + return; + } + else if (!(p = findplayer(name))) { - updateTS(user->stats); - showstats(u, user->stats->name); + notice(s_GameServ, u, "Player %s not found", name); } + else if (is_playing(user)) + { + notice(s_GameServ, u, "You are already playing!"); } - else - showstats(u, nick); -} + else if (is_playing(p->getClient()) && !isAdmin(user)) + { + notice(s_GameServ, u, "That player has already identified."); + } + else if (!check_password(name, password) && !isAdmin(user)) + { + notice(s_GameServ, u, "Password incorrect"); + } + else + { + list::iterator iter; + unsigned long hv = iHASH((unsigned char *) p->getName().c_str()); -void init_masters() -{ - #ifdef DEBUGMODE - log("Calling delete_masters()"); - #endif + iter = find(players[hv].begin(), players[hv].end(), p); - delete_masters(); + if (iter == players[hv].end()) + { + notice(s_GameServ, u, "Fatal error. Contact %S Admin. Buf: %s", + strtok(NULL, "")); + return; + } + // Make sure the other user is logged out + logout(p->getClient()); + + user->stats = p; + p->setClient(user); + updateTS(p); + + +#ifdef DEBUGMODE + log("Player %s IRC: %s Identified", user->stats->getName().c_str(), + user->getNick()); +#endif + //Set the playing flag + setPlaying(user); + + // Update the last login time + user->stats->lastlogin = time(NULL); - #ifdef DEBUGMODE - log("Initializing masters"); - #endif + notice(s_GameServ, u, "Password Accepted. Identified."); + showNews(u, todaysnews); + } +} - for (int x = 0; x < LEVELS; x++) - masters[x] = new Monster; - - strcpy(masters[0]->name, "Old Bones"); - strcpy(masters[0]->weapon, "Dull Sword Cane"); - masters[0]->strength = 32; - masters[0]->gold = 0; - masters[0]->exp = 0; - masters[0]->maxhp = 35; - masters[0]->hp = 35; - strcpy(masters[0]->death, "You have done well my student, but the road is long. Use your new strength with humility and honor as you progress in levels!"); - - strcpy(masters[1]->name, "Master Chang"); - strcpy(masters[1]->weapon, "Nanchaku"); - masters[1]->strength = 48; - masters[1]->gold = 0; - masters[1]->exp = 0; - masters[1]->maxhp = 51; - masters[1]->hp = 51; - strcpy(masters[1]->death, "You try to make out what Master Chang is saying, but the only thing you catch is something about a grasshopper."); - - strcpy(masters[2]->name, "Chuck Norris"); - strcpy(masters[2]->weapon, "Ranger Kick"); - masters[2]->strength = 88; - masters[2]->gold = 0; - masters[2]->exp = 0; - masters[2]->maxhp = 100; - masters[2]->hp = 100; - strcpy(masters[2]->death, "Be strong, and keep your goals in site. Drink milk, and don't do drugs. One day you may be fighting next to me as a Texas Ranger YEEHAW!"); - - - strcpy(masters[3]->name, "Mr. Miagi"); - strcpy(masters[3]->weapon, "Petrified Bonsai"); - masters[3]->strength = 169; - masters[3]->gold = 0; - masters[3]->exp = 0; - masters[3]->maxhp = 165; - masters[3]->hp = 165; - strcpy(masters[3]->death, "Skill comes from repeating the correct but seemingly mundane actions. Wax ON, wax OFF!"); - - strcpy(masters[4]->name, "Jackie Chan"); - strcpy(masters[4]->weapon, "Kung Fu Kick"); - masters[4]->strength = 275; - masters[4]->gold = 0; - masters[4]->exp = 0; - masters[4]->maxhp = 232; - masters[4]->hp = 232; - strcpy(masters[4]->death, "I like to let people talk who like to talk... it's easier to find out how full of it they really are!"); - - strcpy(masters[5]->name, "Jet Li"); - strcpy(masters[5]->weapon, "Motorcycle"); - masters[5]->strength = 347; - masters[5]->gold = 0; - masters[5]->exp = 0; - masters[5]->maxhp = 504; - masters[5]->hp = 504; - strcpy(masters[5]->death, "Failure is a fuel for excuses. It's the doing the do, that makes the making."); - - - strcpy(masters[6]->name, "Muhammad Ali"); - strcpy(masters[6]->weapon, "Quick Jab"); - masters[6]->strength = 515; - masters[6]->gold = 0; - masters[6]->exp = 0; - masters[6]->maxhp = 1078; - masters[6]->hp = 1078; - strcpy(masters[6]->death, "It's just a job. Grass grows, birds fly, waves pound the sand. I beat people up."); - - strcpy(masters[7]->name, "Li Mu Bai"); - strcpy(masters[7]->weapon, "Green Destiny"); - masters[7]->strength = 655; - masters[7]->gold = 0; - masters[7]->exp = 0; - masters[7]->maxhp = 2207; - masters[7]->hp = 2207; - strcpy(masters[7]->death, "No growth without resistance. No action without reaction. No desire without restraint."); - - - strcpy(masters[8]->name, "Jimmy Wang Yu"); - strcpy(masters[8]->weapon, "Flying Guillotine"); - masters[8]->strength = 819; - masters[8]->gold = 0; - masters[8]->exp = 0; - masters[8]->maxhp = 2780; - masters[8]->hp = 2780; - strcpy(masters[8]->death, "You have beaten the one armed boxer. Proceed with caution!"); - - strcpy(masters[9]->name, "Wong Fei Hung"); - strcpy(masters[9]->weapon, "Drunken Boxing"); - masters[9]->strength = 1014; - masters[9]->gold = 0; - masters[9]->exp = 0; - masters[9]->maxhp = 3046; - masters[9]->hp = 3046; - strcpy(masters[9]->death, "Hiccup! Monkey drinks master's wine!"); - - strcpy(masters[10]->name, "Bruce Lee"); - strcpy(masters[10]->weapon, "Fists of fury"); - masters[10]->strength = 1286; - masters[10]->gold = 0; - masters[10]->exp = 0; - masters[10]->maxhp = 3988; - masters[10]->hp = 3988; - strcpy(masters[10]->death, "You must learn to concentrate. It is like a finger pointing away to the moon... DONT concentrate on the finger, or you will miss all the heavenly glory."); -} - -void init_monsters() +void do_stats(char *u) { - #ifdef DEBUGMODE - log("Calling delete_monsters"); - #endif - - delete_monsters(); - - for (int x = 0; x < LEVELS; x++) - for (int y = 0; y < MONSTERS; y++) - monsters[x][y] = new Monster(); + char *nick; + aClient *user; + + nick = strtok(NULL, " "); + + if (!(user = find(u))) + { + log("Fatal Error: %s not found in client list", u); + return; + } + else if (isIgnore(user)) + { +#ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); +#endif + return; + } + else if (!nick) + { + if (!is_playing(user)) + { + notice(s_GameServ, u, "You're not playing, so you have no stats!"); + return; + } + else + { + if (!is_fighting(user)) + updateTS(user->stats); + showstats(u, user->stats->getName().c_str()); + } + } + else + showstats(u, nick); } -void delete_monsters() +bool load_masters() { - for (int x = 0; x < LEVELS; x++) - for (int y = 0; y < MONSTERS; y++) - if (monsters[x][y]) - delete monsters[x][y]; + ifstream infile(masterdata); + char *buf; + int l = 0; + buf = new char[1024]; + + if (infile.fail()) + { + log("Error opening %s", masterdata); + return false; + } + +#ifdef DEBUGMODE + log("Loading masters from %s", masterdata); +#endif + + for (l = 0; l < LEVELS - 1; l++) + { + infile.getline(buf, 1024, '\n'); + + log("%s", buf); + if (buf[0] == '#' || buf[0] == '\n' || buf[0] == '\r') + { + l--; + continue; + } + else if (buf[0] == '^') + break; + + Monster *master = &levels[l].master; + + char *name, *weapon, *strength, *gold, *exp, *maxhp, *death; + + + name = strtok(buf, "~"); + weapon = strtok(NULL, "~"); + strength = strtok(NULL, "~"); + gold = strtok(NULL, "~"); + exp = strtok(NULL, "~"); + maxhp = strtok(NULL, "~"); + death = strtok(NULL, "~"); + + master->name = name; + master->weapon = weapon; + master->strength = stringtoint(strength); + master->gold = stringtoint(gold); + master->exp = stringtoint(exp); + master->maxhp = stringtoint(maxhp); + master->hp = master->maxhp; + master->death = death; + } + + delete []buf; + + if (l < LEVELS - 1) // We didn't load a master for every level - check data/masters.dat + return false; + else + return true; } -void delete_masters() +void delete_monsters() { - for (int x = 0; x < LEVELS; x++) - if (masters[x]) - delete masters[x]; + for (int x = 0; x < LEVELS; x++) + levels[x].monsters.clear(); } void display_monster(char *u) { - if (is_playing(u)) + if (is_playing(u)) { - aClient *user = find(u); - Player *ni = user->stats; - - notice(s_GameServ, u, "Your Hitpoints: %d", ni->hp); - notice(s_GameServ, u, "%s's Hitpoints: %d", ni->fight->name, ni->fight->hp); - notice(s_GameServ, u, "Here are your commands:"); - notice(s_GameServ, u, "/msg %S attack"); - notice(s_GameServ, u, "/msg %S run"); - notice(s_GameServ, u, "What will you do?"); + aClient *user = find(u); + Player *ni = user->stats; + + notice(s_GameServ, u, "Your Hitpoints: %d", ni->getHP()); + notice(s_GameServ, u, "%s's Hitpoints: %d", ni->getMonster()->name.c_str(), ni->getMonster()->hp); + notice(s_GameServ, u, "Here are your commands:"); + notice(s_GameServ, u, "/msg %S attack"); + notice(s_GameServ, u, "/msg %S run"); + notice(s_GameServ, u, "What will you do?"); } } void display_players(char *u) { - aClient *user; - if (!(user = find(u))) + aClient *user; + if (!(user = find(u))) { - log("Fatal error in display_players(): Couldn't find %s", u); + log("Fatal error in display_players(): Couldn't find %s", u); } - else + else display_players(user); } void display_players(aClient *user) { - char *u = user->getNick(); - if (is_playing(user) && player_fight(user)) + char *u = user->getNick(); + if (is_playing(user) && player_fight(user)) { - aClient *battle = user->stats->battle; - notice(s_GameServ, u, "Your Hitpoints: %d", user->stats->hp); - notice(s_GameServ, u, "%s's Hitpoints: %d", battle->stats->name, battle->stats->hp); - notice(s_GameServ, u, "Here are your commands:"); - notice(s_GameServ, u, "/msg %S attack"); - notice(s_GameServ, u, "/msg %S run"); - notice(s_GameServ, u, "What will you do?"); + aClient *battle = user->stats->getBattle(); + notice(s_GameServ, u, "Your Hitpoints: %d", user->stats->getHP()); + notice(s_GameServ, u, "%s's Hitpoints: %d", battle->stats->getName().c_str(), battle->stats->getHP()); + notice(s_GameServ, u, "Here are your commands:"); + notice(s_GameServ, u, "/msg %S attack"); + notice(s_GameServ, u, "/msg %S run"); + notice(s_GameServ, u, "What will you do?"); } } bool is_playing(char *u) { - aClient *user; - if (!(user = find(u))) + aClient *user; + if (!(user = find(u))) return false; - else + else return is_playing(user); } bool is_playing(aClient *user) { - if (user->stats == NULL) + if (!user) { - return false; + return false; } - else if (user->stats->client == NULL) + else if (!user->stats) + { + return false; + } + else if (!FL_is_playing(user)) { - return false; + return false; } - else if (!FL_is_playing(user)) + else if (user->stats->getClient() != user) { - return false; + return false; } - else + else return true; } bool is_fighting(char *u) { - aClient *user; - - if (!(user = find(u))) + aClient *user; + + if (!(user = find(u))) return false; - else + else return is_fighting(user); } bool is_fighting(aClient *user) { - if (!is_playing(user)) + if (!is_playing(user)) return false; - else - return player_fight(user) || master_fight(user) || user->stats->fight != NULL; + else + return player_fight(user) || master_fight(user) || user->stats->getMonster() != NULL; } bool player_fight(char *u) { - aClient *user; - - if (!(user = find(u))) + aClient *user; + + if (!(user = find(u))) return false; - else + else return player_fight(user); } bool player_fight(aClient *user) { - if (!is_playing(user)) + if (!is_playing(user)) return false; - else if (user->stats->battle != NULL) + else if (is_playing(user->stats->getBattle())) { - return user->stats->battle->stats != NULL; + return true; } - return false; + return false; } bool master_fight(char *u) { - aClient *user; - - if (!(user = find(u))) + aClient *user; + + if (!(user = find(u))) return false; - else + else return master_fight(user); } bool master_fight(aClient *user) { - if (!is_playing(user)) + if (!is_playing(user)) return false; - else - return user->stats->master != NULL; + else + return user->stats->getMaster() != NULL; } -void do_fight(char *u) +bool dragon_fight(char *u) { - aClient *ni, *battle; + aClient *user; + if (!(user = find(u))) + return false; + else + return dragon_fight(user); +} - char *nick = strtok(NULL, " "); +bool dragon_fight(aClient *user) +{ + if (!is_playing(user)) + return false; + else + return (isDragonFight(user->stats)); +} - if (!nick) +bool alphaNumeric(const char *str) +{ + int len = strlen(str); + for (int x = 0; x < len; x++) + { + if (!((int(str[x]) >= 65 && int(str[x]) <= 90) || (int(str[x]) >= 97 && int(str[x]) <= 122) || (int(str[x]) >= 48 && int(str[x]) <= 57) || int(str[x]) == 95)) + return false; + } + return true; +} + +void do_fight(char *u) +{ + aClient *ni; + Player *battle; + + char *nick = strtok(NULL, " "); + + if (!nick) { - notice(s_GameServ, u, "SYNTAX: /msg %S FIGHT PLAYER"); - return; + notice(s_GameServ, u, "SYNTAX: /msg %S FIGHT PLAYER"); + return; } - else if (!(ni = find(u))) + else if (!(ni = find(u))) { - notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, "")); - return; + notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, "")); + return; } - else if (isIgnore(ni)) - { - #ifdef DEBUGMODE - log("Ignoring %s.", ni->getNick()); - #endif - return; - } - else if (!is_playing(ni)) + else if (isIgnore(ni)) { - notice(s_GameServ, u, "You are not playing!"); - return; +#ifdef DEBUGMODE + log("Ignoring %s.", ni->getNick()); +#endif + return; } - - updateTS(ni->stats); - - if (ni->stats->player_fights <= 0) + else if (!is_playing(ni)) { - ni->stats->player_fights = 0; // just to be safe - notice(s_GameServ, u, "You are out of player fights for the "\ - "day. You have to wait until tomorrow!"); + notice(s_GameServ, u, "You are not playing!"); + return; } - else if (!(battle = findplayer(nick))) + + updateTS(ni->stats); + + if (ni->stats->getPlayerFights() <= 0) { - notice(s_GameServ, u, "Player %s not found!", nick); + ni->stats->setPlayerFights(0); // just to be safe + notice(s_GameServ, u, "You are out of player fights for the "\ + "day. You have to wait until tomorrow!"); } - else if (!isAlive(ni->stats)) + else if (!(battle = findplayer(nick))) { - notice(s_GameServ, u, "You are dead. Wait until tomorrow to fight others!"); + notice(s_GameServ, u, "Player %s not found!", nick); } - else if (!is_playing(battle)) + else if (!isAlive(ni->stats)) { - notice(s_GameServ, u, "You can't attack %s while they aren't playing!", nick); + notice(s_GameServ, u, "You are dead. Wait until tomorrow to fight others!"); } - -/* offline fighting not available yet - else if (!(fight = finduser(nick))) + else if (!is_playing(battle->getClient())) { - 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); + notice(s_GameServ, u, "You can't attack %s while they aren't playing!", nick); } -*/ - else if (stricmp(ni->stats->name, battle->stats->name) == 0) + + /* 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.c_str()); + display_players(u); + } + */ + else if (stricmp(ni->stats->getName().c_str(), battle->getName().c_str()) == 0) { - notice(s_GameServ, u, "Are you trying to commit suicide!?"); + notice(s_GameServ, u, "Are you trying to commit suicide!?"); } - else if (!isAlive(battle->stats)) + else if (!isAlive(battle)) { - notice(s_GameServ, u, "They are dead. Cannot fight dead players!"); + notice(s_GameServ, u, "They are dead. Cannot fight dead players!"); } - else if (player_fight(battle)) + else if (player_fight(battle->getClient())) { - notice(s_GameServ, u, "%s is fighting %s already!", battle->stats->name, battle->stats->battle->stats->name); + notice(s_GameServ, u, "%s is fighting %s already!", battle->getName().c_str(), battle->getBattle()->stats->getName().c_str()); } - else if (master_fight(battle)) + else if (master_fight(battle->getClient())) { - notice(s_GameServ, u, "%s is fighting their master!", battle->stats->name); + notice(s_GameServ, u, "%s is fighting their master!", battle->getName().c_str()); } - else if (is_fighting(battle)) + else if (is_fighting(battle->getClient())) { - notice(s_GameServ, u, "%s is fighting %s already!", battle->stats->name, battle->stats->fight->name); + notice(s_GameServ, u, "%s is fighting %s already!", battle->getName().c_str(), battle->getMonster()->name.c_str()); } - else if (ni->stats->level - battle->stats->level > maxbfightdistance) + else if (!isAdmin(ni) && isFairFights() && (ni->stats->getStrength()/2 - battle->getDefense()) > battle->getHP()) { - // You can't fight someone below you by more than X level(s) - // level 12 can fight level (12 - X) but not < (12 - X) - notice(s_GameServ, u, "You may not fight %s. You're too strong!", - battle->stats->name); - } - else if (battle->stats->level - ni->stats->level > maxafightdistance) + notice(s_GameServ, u, "Fair fighting is enabled, and you're too strong for %s!", battle->getName().c_str()); + } + else if (ni->stats->getLevel() - battle->getLevel() > maxbfightdistance) { - // You can't fight someone above you by more than X level(S) - // level 1 can fight level (1 + X), but not > (1 + X) - notice(s_GameServ, u, "%s, do you really have a death wish? Try the forest you "\ - "weakling!", ni->stats->name); + // You can't fight someone below you by more than X level(s) + // level 12 can fight level (12 - X) but not < (12 - X) + notice(s_GameServ, u, "You may not fight %s. You're too strong!", + battle->getName().c_str()); } - else + else if (battle->getLevel() - ni->stats->getLevel() > maxafightdistance) { - // Set your battle pointer to the other player - ni->stats->battle = battle; - - // Set the other player's battle pointer to you - ni->stats->battle->stats->battle = ni; - - // The initiator gets the first move (perhaps this should be 50/50) - setYourTurn(ni->stats); - clearYourTurn(battle->stats); - - // Initiate Battle sequence! - ni->stats->player_fights -= 1; - - notice(s_GameServ, u, "You challenge %s to an online duel!", battle->stats->name); - notice(s_GameServ, battle->getNick(), "%s has challenged you to an online duel!", ni->stats->name); - notice(s_GameServ, battle->getNick(), "%s gets to go first "\ - "because they initiated!", ni->stats->name); - notice(s_GameServ, battle->getNick(), "Please wait while %s decides what to do.", ni->stats->name); - display_players(ni); + // You can't fight someone above you by more than X level(S) + // level 1 can fight level (1 + X), but not > (1 + X) + notice(s_GameServ, u, "%s, do you really have a death wish? Try the forest you "\ + "weakling!", ni->stats->getName().c_str()); } + else + { + // Set your battle pointer to the other player + ni->stats->setBattle(battle->getClient()); + + // Set the other player's battle pointer to you + battle->setBattle(ni); + + // The initiator gets the first move (perhaps this should be 50/50) + setYourTurn(ni->stats); + clearYourTurn(battle); + + // Initiate Battle sequence! + ni->stats->subtractPlayerFights(1); + + notice(s_GameServ, u, "You challenge %s to an online duel!", battle->getName().c_str()); + notice(s_GameServ, c_Forest, "%s walks up and hits %s in the face! Let's see who will bite the dust.", + ni->stats->getName().c_str(), battle->getName().c_str()); /* DrLnet - Modified by Kain*/ + + notice(s_GameServ, battle->getClient()->getNick(), "%s has challenged you to an online duel!", ni->stats->getName().c_str()); + notice(s_GameServ, battle->getClient()->getNick(), "%s gets to go first "\ + "because they initiated!", ni->stats->getName().c_str()); + notice(s_GameServ, battle->getClient()->getNick(), "Please wait while %s decides what to do.", ni->stats->getName().c_str()); + display_players(ni); + } } -void do_use(char *u) +void do_equip(char *u) { - aClient *user; - Pouch *p; + aClient *user; + pouch *p; + itemContainer *equip; + int id; - char *item = strtok(NULL, " "); + char *item = strtok(NULL, " "); - if (!item) + if (!item || int(item[0]) < 48 || int(item[0] > 57)) { - notice(s_GameServ, u, "SYNTAX: USE ITEM"); - notice(s_GameServ, u, "Type /msg %S HELP USE for more information."); - return; + notice(s_GameServ, u, "SYNTAX: EQUIP ####"); + notice(s_GameServ, u, "Type /msg %S HELP EQUIP for more information."); + return; } - else if (!(user = find(u))) + else if (!(user = find(u))) { - notice(s_GameServ, u, "Fatal Error in do_use. Contact a(n) %S Admin"); - return; + notice(s_GameServ, u, "Fatal error in do_equip. Contact a(n) %S Admin"); + 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 items!"); - return; + notice(s_GameServ, u, "You must be playing to equip weapons and armor!"); + return; } + id = stringtoint(item); + if (!is_fighting(user)) + updateTS(user->stats); + p = user->stats->inventory; - updateTS(user->stats); - p = &user->stats->inventory; + if (!(equip = p->Find(id))) + { + if (!p->isEmpty()) + { + notice(s_GameServ, u, "You aren't carrying that item!"); + } + showinventory(user->stats, user); + } + else if (equip->getItem()->getType() != ARMOR && equip->getItem()->getType() != WEAPON) + { + notice(s_GameServ, u, "You can't use %s like that. Try /msg %S use", equip->getItem()->getName().c_str()); + } + else + { + // Use the item + notice(s_GameServ, u, "You equip %s.", equip->getItem()->getName().c_str()); + equip->use(user->stats); + } +} - if (stricmp(item, "HEALING") == 0) +void do_use(char *u) +{ + aClient *user; + pouch *p; + + char *item = strtok(NULL, " "); + char *numuse = strtok(NULL, " "); + int id, num; + itemContainer *used; + + if (!item || int(item[0]) < 48 || int(item[0]) > 57 || (numuse && (int(numuse[0]) < 48 || int(numuse[0]) > 57))) { - if (p->Healing() <= 0) - { - notice(s_GameServ, u, "You are out of Healing Potions!"); - return; - } - int oldhealing = user->stats->hp; - notice(s_GameServ, u, "You hastiliy gulp down the flask of cool life-giving waters."); - notice(s_GameServ, u, "Rejuvination spreads throughout your body."); - user->stats->hp += (10 * user->stats->level) + (rand() % 10) * user->stats->level; - notice(s_GameServ, u, "You gain %d HP!", user->stats->hp - oldhealing); - p->decHealing(); - if (player_fight(user)) - { - notice(s_GameServ, user->stats->battle->getNick(), - "%s has used a healing potion!"); - } + notice(s_GameServ, u, "SYNTAX: USE ####"); + notice(s_GameServ, u, "Type /msg %S HELP USE for more information."); + return; } - else if (stricmp(item, "STRENGTH") == 0) + else if (!(user = find(u))) { - if (p->Strength() <= 0) - { - notice(s_GameServ, u, "You are out of Strength Potions!"); - return; - } - int oldstrength = user->stats->strength; - notice(s_GameServ, u, "As you grip the flask containing pure power, you feel adrenaline coarse through your veins!"); - notice(s_GameServ, u, "In one swallow you drink the potion and feel your muscle fibers bulging andgrowing!"); - user->stats->strength += 1 + (rand() % 10 >= 8 ? 1 : 0); // 1-2 - notice(s_GameServ, u, "You gain %d Strength points!", user->stats->strength - oldstrength); - p->decStrength(); - if (player_fight(user)) - { - notice(s_GameServ, user->stats->battle->getNick(), - "%s has used a strength potion!"); - } + notice(s_GameServ, u, "Fatal Error in do_use. Contact a(n) %S Admin"); + return; } - else if (stricmp(item, "DEFENSE") == 0) + else if (isIgnore(user)) { - if (p->Defense() <= 0) - { - notice(s_GameServ, u, "You are out of Defense Potions!"); - return; - } - int olddefense = user->stats->defense; - notice(s_GameServ, u, "You drink the foul tasting viscous liquid while pinching your nose in disgust."); - notice(s_GameServ, u, "It tasted bad, but you feel like you are unbeatable!"); - user->stats->defense += 1 + (rand() % 10 >= 8 ? 1 : 0); // 1-2 - notice(s_GameServ, u, "You gain %d Defense points!", user->stats->defense - olddefense); - p->decDefense(); - if (player_fight(user)) - { - notice(s_GameServ, user->stats->battle->getNick(), - "%s has used a defense potion!"); - } +#ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); +#endif + return; } - else if (stricmp(item, "HP") == 0) + else if (!is_playing(user)) { - if (p->HP() <= 0) + notice(s_GameServ, u, "You must be playing to use items!"); + return; + } + id = stringtoint(item); + + if (!numuse) { - notice(s_GameServ, u, "You are out of HP Potions!"); - return; + num = 1; } - int oldHP = user->stats->maxhp; - notice(s_GameServ, u, "You feel your life growing longer as you drink the green glowing liquid."); - user->stats->maxhp += 2 + - (rand() % 100 > 70 ? (rand() % 7) : (rand() % 2) ); - - notice(s_GameServ, u, "You gain %d Maximum hit points!", user->stats->maxhp - oldHP); - p->decHP(); - if (player_fight(user)) + else { - notice(s_GameServ, user->stats->battle->getNick(), - "%s has used a HP potion!"); + num = stringtoint(numuse); } - } - else - { - notice(s_GameServ, u, "SYNTAX: /msg %S USE {HEALING | STRENGTH | DEFENSE | HP}"); - return; - } + + updateTS(user->stats); + p = user->stats->inventory; + - end_turn(user); // If they're fighting, end their turn + if (!(used = p->Find(id))) + { + if (!p->isEmpty()) + { + notice(s_GameServ, u, "You aren't carrying that item!"); + } + showinventory(user->stats, user); + } + else if (used->getItem()->getType() != POTION) + { + notice(s_GameServ, u, "You can't use %s like that. Try /msg %S equip", used->getItem()->getName().c_str()); + } + else + { + // Use the item(s) + if (num <= 1 || is_fighting(user)) + { + notice(s_GameServ, u, "You used %s.", used->getItem()->getName().c_str()); + used->use(user->stats); + if (used->getUses() <= 0) + { + p->deleteItem(used->getItem()); + } + end_turn(user); + } + else if (num > 1) + { + int count; + const char *name = used->getItem()->getName().c_str(); + for (count = 0; count < num; count++) + { + if (!(used = p->Find(id))) + { + break; + } + else + { + used->use(user->stats); + if (used->getUses() == 0) + { + p->deleteItem(used->getItem()); + } + } + } + notice(s_GameServ, u, "You used %d %s's", count, name); + } + } } void do_run(char *u) { - aClient *user; - Player *p, *p2 = NULL; - - if (!(user = find(u))) + aClient *user; + Player *p, *p2 = NULL; + + if (!(user = find(u))) { - notice(s_GameServ, u, "Couldn't find you. Error. Contact a %S admin"); - return; + notice(s_GameServ, u, "Couldn't find you. Error. Contact a %S admin"); + 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 run!"); - return; + notice(s_GameServ, u, "You must be playing to run!"); + return; } - - updateTS(user->stats); - p = user->stats; - - if (p->battle) - p2 = p->battle->stats; - - if (!is_fighting(user)) + + updateTS(user->stats); + p = user->stats; + + if (p->getBattle()) + p2 = p->getBattle()->stats; + + if (!is_fighting(user)) notice(s_GameServ, u, "You run in place... try fighting next time."); - else if (!player_fight(user) && !master_fight(user)) + else if (!player_fight(user) && !master_fight(user) && !dragon_fight(user)) { - notice(s_GameServ, u, "You run away from %s like a little baby!", p->fight->name); - delete p->fight; - p->fight = NULL; + notice(s_GameServ, u, "You run away from %s like a little baby!", p->getMonster()->name.c_str()); + p->delMonster(); } - else if (player_fight(user) && isYourTurn(p)) + else if (player_fight(user) && isYourTurn(p)) { - notice(s_GameServ, u, "You run away from %s like a little baby!", p2->name); - notice(s_GameServ, p->battle->getNick(), "%s ran away from you like a little baby!", p->name); - p2->battle = NULL; - } - else if (player_fight(user) && !isYourTurn(p)) + notice(s_GameServ, u, "You run away from %s like a little baby!", p2->getName().c_str()); + notice(s_GameServ, p->getBattle()->getNick(), "%s ran away from you like a little baby!", p->getName().c_str()); + addNews(todaysnews, "%s ran away from %s like a little baby!!", p->getName().c_str(), p2->getName().c_str()); /* DrLnet - edited by Kain */ + p2->delBattle(); + } + else if (player_fight(user) && !isYourTurn(p)) { - notice(s_GameServ, u, "It is not your turn. Please wait until %s decides what to do.", p2->name); + notice(s_GameServ, u, "It is not your turn. Please wait until %s decides what to do.", p2->getName().c_str()); } - else if (master_fight(user)) + else if (master_fight(user)) { - notice(s_GameServ, u, "You cannot run from %s! FIGHT!", p->master->name); + notice(s_GameServ, u, "You cannot run from %s! FIGHT!", p->getMaster()->name.c_str()); } - p->battle = NULL; + else if (dragon_fight(user)) + { + notice(s_GameServ, u, "You cannot run from %s! FIGHT!", dragon.name.c_str()); + } } void end_turn(aClient *user) { - char *nick, *u = user->getNick(); - Monster *fight; - aClient *battle; - int mhit; - - nick = new char[strlen(user->getNick()) + 1]; - - if (!user || !is_playing(user) || !is_fighting(user)) + char *nick, *u = user->getNick(); + Monster *fight; + aClient *battle; + int mhit; + + nick = new char[strlen(user->getNick()) + 1]; + + if (!user || !is_playing(user) || !is_fighting(user)) goto endturn; - - if (!player_fight(user) && !master_fight(user)) - fight = user->stats->fight; - else - fight = user->stats->master; - battle = user->stats->battle; - - if (!player_fight(user)) - { - // Opponent's Hit - mhit = (fight->strength / 2) + - (rand() % (fight->strength / 2) - (user->stats->defense + - arbonus[user->stats->armor])); - } - 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])); - } - if (!player_fight(user)) - { - - if (mhit > 0) - { - notice(s_GameServ, u, "%s attacks with their %s for %d damage!", - fight->name, fight->weapon, mhit); - } - else if (mhit <= 0) - notice(s_GameServ, u, "%s completely misses you!", fight->name); - - if (mhit >= user->stats->hp) - { - if (!master_fight(user)) - { - notice(s_GameServ, u, "You have been killed by %s!", fight->name); - notice(s_GameServ, u, "You lose all gold on hand and lose 10 percent "\ - "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; - } - else - { - notice(s_GameServ, u, "%s has bested you! You will have to wait "\ - "until tomorrow to try again", user->stats->master->name); - user->stats->fight = NULL; - user->stats->master = NULL; - goto endturn; - } - } - else - { - if (mhit > 0) - user->stats->hp -= mhit; - display_monster(u); - goto endturn; - } - } - else - { - clearYourTurn(user->stats); - setYourTurn(battle->stats); - display_players(battle); - } -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)) + + if (!player_fight(user) && !master_fight(user)) + fight = user->stats->getMonster(); + else + fight = user->stats->getMaster(); + battle = user->stats->getBattle(); + + if (!player_fight(user)) { - // 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])); + // Opponent's Hit + mhit = (fight->strength / 2) + (rand() % (fight->strength / 2)) - (user->stats->getDefense()); } - else + 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])); + // Opponent's Hit + mhit = (battle->stats->getStrength() / 2) + (rand() % (battle->stats->getStrength() / 2)) - user->stats->getDefense(); } - - if (!player_fight(ni)) - { - if (hit > 0) - notice(s_GameServ, u, "You attack %s for %d points!", fight->name, hit); - else - notice(s_GameServ, u, "You miss %s completely!", fight->name); - - if (hit >= fight->hp) + if (!player_fight(user)) { - if (master_fight(ni)) - { - notice(s_GameServ, u, "You have bested %s!", fight->name); - addNews(todaysnews, "%s has bested %s and moved "\ - "to level %d", ni->stats->name, fight->name, - (ni->stats->level + 1)); - } - else - notice(s_GameServ, u, "You have killed %s!", fight->name); - - notice(s_GameServ, u, "%s", fight->death); - notice(s_GameServ, u, "You recieve %d experience and %d gold!", - fight->exp, fight->gold); - - // 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 = ( (ni->stats->exp + fight->exp) > 2000000000 ? 2000000000 : - ni->stats->exp + fight->exp); - - ni->stats->gold = (ni->stats->gold + fight->gold > 2000000000 ? 2000000000 : - ni->stats->gold + fight->gold); - - - if (master_fight(ni)) + + if (mhit > 0) { - 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; + notice(s_GameServ, u, "%s attacks with their %s for %d damage!", + fight->name.c_str(), fight->weapon.c_str(), mhit); } - - // 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, "%s attacks with their %s for %d damage!", - fight->name, fight->weapon, mhit); - } - else if (mhit <= 0) - notice(s_GameServ, u, "%s completely misses you!", fight->name); - - if (mhit >= ni->stats->hp) + else if (mhit <= 0) + notice(s_GameServ, u, "%s completely misses you!", fight->name.c_str()); + + if (mhit >= user->stats->getHP()) { - if (!master_fight(ni)) + if (!master_fight(user)) { - notice(s_GameServ, u, "You have been killed by %s!", fight->name); - 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, fight->name); - 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; + notice(s_GameServ, u, "You have been killed by %s!", fight->name.c_str()); + notice(s_GameServ, u, "You lose all gold on hand and lose 10 percent "\ + "of your experience!"); + user->stats->setGold(0); + user->stats->subtractExp((long int)(user->stats->getExp() * .10)); + user->stats->setHP(0); + user->stats->delMonster(); + clearAlive(user->stats); + goto endturn; } - else + else { - notice(s_GameServ, u, "%s has bested you! You will have to wait "\ - "until tomorrow to try again", ni->stats->master->name); - addNews(todaysnews, "%s tried to best %s and failed!", - ni->stats->name, fight->name); - 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 %s for %d points!", battle->nick, hit); - else - notice(s_GameServ, u, "You miss %s completely!", battle->nick); - if (hit >= battle->stats->hp) - { - notice(s_GameServ, u, "You have killed %s!", battle->nick); -* notice(s_GameServ, u, "You recieve %d experience and %ld 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, "%s hits you with their %s for %d 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 killed 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); - return; - } - if (hit > 0) - { - notice(s_GameServ, u, "You attack %s for %d points!", battle->stats->name, hit); - - notice(s_GameServ, battle->getNick(), "%s has hit you with their %s for "\ - "%d damage!", ni->stats->name, - weapons[ni->stats->weapon], hit); - } - else - { - notice(s_GameServ, u, "You miss %s completely!", battle->stats->name); - notice(s_GameServ, battle->getNick(), "%s misses you completely!", ni->stats->name); - } - - if (hit >= battle->stats->hp) - { - notice(s_GameServ, u, "You have killed %s!", battle->stats->name); - notice(s_GameServ, u, "You recieve %d experience and %ld gold!", - (long int)(battle->stats->exp * .10), battle->stats->gold); - notice(s_GameServ, battle->getNick(), "You have been killed by %s!", - ni->stats->name); - battle->stats->hp = 0; - clearAlive(battle->stats); - - 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) - { - 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; + notice(s_GameServ, u, "%s has bested you! You will have to wait "\ + "until tomorrow to try again", user->stats->getMaster()->name.c_str()); + user->stats->delMonster(); + user->stats->delMaster(); + goto endturn; + } } - else + 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); - - notice(s_GameServ, battle->getNick(), "Luckily, you still have %ld gold "\ - "left. All is not lost!", battle->stats->gold); - - ni->stats->gold = 2000000000; + if (mhit > 0) + user->stats->subtractHP(mhit); + display_monster(u); + goto endturn; } - clearYourTurn(ni->stats); - clearYourTurn(battle->stats); - battle->stats->battle = NULL; - ni->stats->battle = NULL; - return; } - else + 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); - return; + clearYourTurn(user->stats); + setYourTurn(battle->stats); + display_players(battle); } - } - } + endturn: + delete []nick; } void do_heal(char *u) { - aClient *ni; - char *amount = strtok(NULL, " "); - int price, num; - - if (!amount) + aClient *ni; + char *amount = strtok(NULL, " "); + int price, num; + + if (!amount) { - notice(s_GameServ, u, "SYNTAX: /msg %S HEAL {ALL | #}"); - return; + notice(s_GameServ, u, "SYNTAX: /msg %S HEAL {ALL | #}"); + return; } - else if (!(ni = find(u))) + else if (!(ni = find(u))) { notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, "")); return; @@ -1960,7 +2084,7 @@ void do_heal(char *u) notice(s_GameServ, u, "You can't heal in battle!"); return; } - else if (ni->stats->hp >= ni->stats->maxhp) + else if (ni->stats->getHP() >= ni->stats->getMaxHP()) { notice(s_GameServ, u, "You don't need healing!"); return; @@ -1969,49 +2093,49 @@ void do_heal(char *u) updateTS(ni->stats); if (stricmp(amount, "ALL") == 0) { - price = ni->stats->level * 3; - if (ni->stats->gold < (ni->stats->maxhp - ni->stats->hp) * price) + price = ni->stats->getLevel() * 3; + if (ni->stats->getGold() < (ni->stats->getMaxHP() - ni->stats->getHP()) * price) { notice(s_GameServ, u, "Healing %d points for %d gold per point.", - (long int)ni->stats->gold/price, price); - ni->stats->hp += ni->stats->gold / price; - ni->stats->gold %= price; + (long int)ni->stats->getGold()/price, price); + ni->stats->addHP(ni->stats->getGold() / price); + ni->stats->setGold(ni->stats->getGold() % price); } else { notice(s_GameServ, u, "Healing all possible points at %d gold "\ "per point.", price); notice(s_GameServ, u, "%d points healed for %ld gold. HP at MAX!", - (ni->stats->maxhp - ni->stats->hp), - (price * (ni->stats->maxhp - ni->stats->hp)) ); - ni->stats->gold -= price * (ni->stats->maxhp - ni->stats->hp); - ni->stats->hp = ni->stats->maxhp; + (ni->stats->getMaxHP() - ni->stats->getHP()), + (price * (ni->stats->getMaxHP() - ni->stats->getHP())) ); + ni->stats->subtractGold(price * (ni->stats->getMaxHP() - ni->stats->getHP())); + ni->stats->healall(); } } else if (isstringnum(amount)) { num = stringtoint(amount); - price = ni->stats->level * 3; - if (ni->stats->gold < price * num) + price = ni->stats->getLevel() * 3; + if (ni->stats->getGold() < price * num) { notice(s_GameServ, u, "You only have enough gold to heal %d points!", - (long int)ni->stats->gold/price); + (long int)ni->stats->getGold()/price); } - else if (num <= ni->stats->maxhp - ni->stats->hp) + else if (num <= ni->stats->getMaxHP() - ni->stats->getHP()) { notice(s_GameServ, u, "Healing %d points at %d gold per point.", num, price); - ni->stats->hp += num; - ni->stats->gold -= num * price; + ni->stats->addHP(num); + ni->stats->subtractGold(num * price); } - else if (num > ni->stats->maxhp - ni->stats->hp) + else if (num > ni->stats->getMaxHP() - ni->stats->getHP()) { notice(s_GameServ, u, "Healing all possible points at %d gold "\ "per point.", price); notice(s_GameServ, u, "%d points healed. HP at MAX!", - (ni->stats->maxhp - ni->stats->hp)); - ni->stats->gold -= price * (ni->stats->maxhp - ni->stats->hp); - ni->stats->hp = ni->stats->maxhp; + (ni->stats->getMaxHP() - ni->stats->getHP())); + ni->stats->subtractGold(price * (ni->stats->getMaxHP() - ni->stats->getHP())); + ni->stats->healall(); } } else if (amount[0] == '-') @@ -2033,1391 +2157,1736 @@ return 1; long int stringtoint(char *number) { - long int x, len = strlen(number), sum = 0; - if (len == 1) - return chartoint(number[0]); - sum += chartoint(number[len - 1]); - for (x = len - 2; x >= 0; x--) - sum += chartoint(number[x]) * pow(10, abs(x - len + 1)); - return sum; + return atol(number); } long int pow(int x, int y) { - long int value = 0; - int count = 0; - value += x; - - if (x != 0 && y != 0) + long int value = 0; + int count = 0; + value += x; + + if (x != 0 && y != 0) { - for (count = 1; count <= y - 1; count++) - value *= x; + for (count = 1; count <= y - 1; count++) + value *= x; } - else - return 1; -return value; + else + { + return 1; + } + return value; } long int chartoint(char ch) { - if (int(ch) >= 48 && int(ch) <= 57) - return int(ch) - 48; - else - return 0; + if (int(ch) >= 48 && int(ch) <= 57) + return int(ch) - 48; + else + return 0; } int save_gs_dbase() { - ListNode *ptr; - Player *it; - ofstream outfile; - - outfile.open(playerdata); - - if (!outfile) + list::iterator iter; + Player *it; + ofstream outfile; + + outfile.open(playerdata); + + if (!outfile) { - log("Error opening %s", playerdata); - return 0; + log("Error opening %s", playerdata); + return 0; } + + for (unsigned long x = 0; x < U_TABLE_SIZE; x++) + { + for(iter = players[x].begin(); iter != players[x].end(); iter++) + { + it = (*iter); + clearYourTurn(it); + item *w, *a; + w = it->getWeapon(); + a = it->getArmor(); + + outfile << it->getName().c_str() << ' ' << it->getLevel() << ' ' << it->getExp() << ' ' << it->getGold() << ' ' << it->getBank() << ' '<< it->getHP() << ' ' << it->getMaxHP() << ' ' << it->getStrength() << ' ' << it->getDefense() << ' ' << it->getForestFights() << ' ' << it->getPlayerFights() << ' ' << it->getFlags() << ' ' << it->getPassword().c_str() << ' ' << it->lastlogin << ' ' << (w ? w->getID() : 0) << ' ' << (a ? a->getID() : 0); + + // Traverse the list and write out each item ID and how many uses are left + if (!it->inventory->isEmpty()) + { + list *myitems; + list::iterator item_iter; + myitems = it->inventory->getItems(); + + for(item_iter = myitems->begin();item_iter != myitems->end();item_iter++) + { + outfile << ' ' << (*item_iter).getItem()->getID() << ' ' << (*item_iter).getUses(); + } + } + outfile << endl; + } + } + outfile.close(); + return 1; +} + +int load_dragon() +{ + ifstream infile; + char *buf; + + infile.open(dragondata); - for (unsigned long x = 0; x < U_TABLE_SIZE; x++) - { - ptr = players[x].First(); - while(ptr) + if (infile.fail()) { - it = ptr->getData()->stats; - clearYourTurn(it); - outfile << it->name << ' ' << it->level << ' ' << it->exp << ' ' << it->gold << ' ' << it->bank << ' ' - << it->hp << ' ' << it->maxhp << ' ' << it->strength << ' ' << it->defense << ' ' - << it->armor << ' ' << it->weapon << ' ' - << it->forest_fights << ' ' << it->player_fights << ' ' - << it->getFlags() << ' ' << it->password << ' ' << it->inventory.Healing() - << ' ' << it->inventory.Strength() << ' ' << it->inventory.Defense() << ' ' << it->inventory.HP() << endl; - ptr = ptr->Next(); + 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; + } } - } -outfile.close(); -return 1; + + 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 load_gs_dbase() +int save_dragon() { - ifstream infile; - aClient *temp; - Player *p; - char *tempname, *buf, *password; - buf = new char[1023]; + ofstream outfile; - infile.open(playerdata); + outfile.open(dragondata); - if (infile.fail()) + if (outfile.fail()) { - log("Error opening %s", playerdata); + log ("Error opening %s. Exiting.", dragondata); return 0; } - 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, " ")); - p->bank = stringtoint(strtok(NULL, " ")); - p->hp = stringtoint(strtok(NULL, " ")); - 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->forest_fights = stringtoint(strtok(NULL, " ")); - p->player_fights = stringtoint(strtok(NULL, " ")); - p->setFlags(stringtoint(strtok(NULL, " "))); - - password = strtok(NULL, " "); - strcpy(p->password, password); - temp->setNick("Not Playing"); - #ifdef P10 - temp->setRealNick("Not Playing"); - #endif + outfile << dragon.name.c_str() << '~' << dragon.weapon.c_str() << '~' + << dragon.strength << '~' << dragon.hp << '~' + << dragon.defense << '~' << dragon.death.c_str() << "\n^" + << endl; + +outfile.close(); - p->inventory.reset(); // 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)); - - tempname = strtok(NULL, " "); - if (tempname) - p->inventory.setStrength(stringtoint(tempname)); - - tempname = strtok(NULL, " "); - if (tempname) - p->inventory.setDefense(stringtoint(tempname)); - - tempname = strtok(NULL, " "); - if (tempname) - p->inventory.setHP(stringtoint(tempname)); - unsigned long hv = iHASH((unsigned char *) temp->stats->name); - - temp->stats->client = NULL; - players[hv].insertAtBack(temp); - delete temp; - } -delete [] buf; -infile.close(); return 1; } -bool passcmp(char *encrypted, char *plaintext) +int load_store() { - char salt[3]; - char *plaintext2, *plainToencrypt; - bool same = false; + ifstream infile; + char *buf; + item *tempItem; + buf = new char[1024]; + long id; + + infile.open(storeitemdata); + + if (infile.fail()) + { + log("Error opening %s", storeitemdata); + return 0; + } + + while (infile.getline(buf, 1024, '\n')) + { + try + { + if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0') + { + item *tempItem2; + id = stringtoint(strtok(buf, "")); + tempItem2 = findItemByID(id); + if (tempItem2 == NULL) + { + log("Invalid ID in %s", storeitemdata); + return 0; + } - plaintext2 = new char[strlen(encrypted) + strlen(plaintext)]; // Extra - strcpy(plaintext2, plaintext); - - salt[0] = encrypted[0]; - salt[1] = encrypted[1]; - salt[3] = '\0'; + tempItem = tempItem2; + store.push_back(tempItem); + } + } + catch (char *str) + { + log("Exception loading store: %s", str); + delete []buf; + return 0; + } + } + delete []buf; + return 1; +} +int load_tavern() +{ + ifstream infile; + char *buf; + tavernItem tempItem; + buf = new char[1024]; + long id, level; - plainToencrypt = crypt(plaintext2, salt); + infile.open(tavernitemdata); + if (infile.fail()) + { + log("Error opening %s", tavernitemdata); + return 0; + } - same = (strcmp((const char *)encrypted, plainToencrypt) == 0 ? true : false); + while (infile.getline(buf, 1024, '\n')) + { + try + { + if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0') + { + item *tempItem2; + id = stringtoint(strtok(buf, "~")); + level = stringtoint(strtok(NULL, "")); + tempItem2 = findItemByID(id); + if (tempItem2 == NULL) + { + log("Invalid ID in %s", tavernitemdata); + return 0; + } + tempItem.setItem(tempItem2); + tempItem.setLevel(level); + tavern.push_back(tempItem); + } + } + catch (char *str) + { + log("Exception loading tavern: %s", str); + delete []buf; + return 0; + } + } + delete []buf; + return 1; +} +int load_items() +{ + ifstream infile; + char *buf; + item *tempItem; + + buf = new char[1024]; + + infile.open(itemdata); + + if (infile.fail()) + { + log("Error opening %s", itemdata); + return 0; + } + + while (infile.getline(buf, 1024, '\n')) + { + if (buf[0] == '^') + break; + try + { + if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0') + { + switch(buf[0]) + { + case '1': + tempItem = new weapon(); + break; + case '2': + tempItem = new armor(); + break; + case '3': + tempItem = new potion(); + break; + default: + log("Invalid Item Type %c in %s", buf[0], itemdata); + delete []buf; + return 0; + break; + } + if(tempItem->setData(buf)) + { + Items.push_back(tempItem); + } + } + } + catch (char *str) + { + log("Exception loading items: %s", str); + delete []buf; + return 0; + } + } + delete []buf; + return 1; +} - delete []plaintext2; +int load_gs_dbase() +{ + ifstream infile; + Player *p; + char *tempname, *buf, *password; + int tempnum; + buf = new char[100000]; + + infile.open(playerdata); + + if (infile.fail()) + { + log("Error opening %s", playerdata); + return 0; + } + + + for (int x = 0; x < U_TABLE_SIZE; x++) + { + list::iterator iter; + + for (iter = players[x].begin(); iter != players[x].end(); iter++) + { + logout((*iter)->getClient()); + delete (*iter); + } + players[x].clear(); + } + + while (infile.getline(buf, 100000, '\n')) + { + tempname = strtok(buf, " "); + p = new Player(tempname); + + p->setLevel(stringtoint(strtok(NULL, " "))); + p->setExp(stringtoint(strtok(NULL, " "))); + p->setGold(stringtoint(strtok(NULL, " "))); + p->setBank(stringtoint(strtok(NULL, " "))); + tempnum = stringtoint(strtok(NULL, " ")); + p->setMaxHP(stringtoint(strtok(NULL, " "))); + p->setHP(tempnum); + p->setStrength(stringtoint(strtok(NULL, " "))); + p->setDefense(stringtoint(strtok(NULL, " "))); + p->setForestFights(stringtoint(strtok(NULL, " "))); + p->setPlayerFights(stringtoint(strtok(NULL, " "))); + p->setFlags(stringtoint(strtok(NULL, " "))); + + + + password = strtok(NULL, " "); + p->setRawPassword(password); + tempname = strtok(NULL, " "); + + if (tempname) + p->lastlogin = stringtoint(tempname); + else + p->lastlogin = time(NULL); + + tempname = strtok(NULL, " "); + tempnum = stringtoint(tempname); + item *tempitem; + if (tempnum != 0) + { + tempitem = findItemByID(tempnum); + p->setWeapon(*tempitem); + } + + tempname = strtok(NULL, " "); + tempnum = stringtoint(tempname); + + if (tempnum != 0) + { + tempitem = findItemByID(tempnum); + p->setArmor(*tempitem); + } + + + unsigned long hv = iHASH((unsigned char *) p->getName().c_str()); + + p->setClient(NULL); + + for (tempname = strtok(NULL, " "); tempname != NULL; tempname = strtok(NULL, " ")) + { + long int id, uses; + list::iterator item_iter; + id = stringtoint(tempname); + tempname = strtok(NULL, " "); + uses = stringtoint(tempname); + + item_iter = Items.begin(); + while (item_iter != Items.end()) + { + if ((*item_iter)->getID() == id) + { + // Don't sort every time you add an item or it eats CPU + p->inventory->addItemNoChecks((*item_iter))->setUses(uses); + } + item_iter++; + } + } + p->inventory->sort(); + players[hv].push_back(p); + } - return same; + delete [] buf; + infile.close(); + return 1; +} + +bool passcmp(const char *encrypted, char *plaintext) +{ + char salt[3]; + char *plaintext2, *plainToencrypt; + bool same = false; + + plaintext2 = new char[strlen(encrypted) + strlen(plaintext)]; // Extra + strcpy(plaintext2, plaintext); + + salt[0] = encrypted[0]; + salt[1] = encrypted[1]; + salt[3] = '\0'; + + plainToencrypt = crypt(plaintext2, salt); + + same = (strcmp((const char *)encrypted, plainToencrypt) == 0 ? true : false); + + delete []plaintext2; + + return same; } bool check_password(char *name, char *plaintext) { - aClient *client; - - if (!(client = findplayer(name))) - return false; - else + Player *p; + + if (!(p = findplayer(name))) + return false; + else { - return passcmp(client->stats->password, plaintext); + return passcmp(p->getPassword().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) + list::iterator item_iterator; + item *tempItem; + char *cmd = strtok(NULL, " "); + char *num = strtok(NULL, " "); + char *space; + int id; + aClient *user; + Player *p; + + + if (!cmd || !num) { - notice(s_GameServ, u, "SYNTAX: STORE LIST {ARMOR | WEAPONS}"); - notice(s_GameServ, u, " STORE SELL {ARMOR | WEAPON}"); - notice(s_GameServ, u, " STORE BUY {ARMOR | WEAPON} NUMBER"); - return; + notice(s_GameServ, u, "SYNTAX: STORE LIST {ARMOR | WEAPONS}"); + notice(s_GameServ, u, " STORE SELL NUMBER"); + notice(s_GameServ, u, " STORE BUY NUMBER"); + 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 (is_fighting(user)) { - notice(s_GameServ, u, "You are dead. Wait until tomorrow to purchase weapons and armor!"); - return; + notice(s_GameServ, u, "You can't go to the store while fighting!"); + return; } - updateTS(user->stats); - - if (stricmp(cmd, "LIST") == 0) + else if (!isAlive(user->stats)) { - 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++) - { - 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 NUM."); - notice(s_GameServ, u, "Where num. is the weapon number from the menu above."); - - } - 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++) - { - 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."); - - - } - } else if (stricmp(cmd, "BUY") == 0) { - if (!num) - { - notice(s_GameServ, u, "SYNTAX: STORE BUY {ARMOR | WEAPON} NUMBER"); - return; - } - else if (!isstringnum(num)) - { - notice(s_GameServ, u, "You must specify a number between 1 and %d. Not %s!", WNA - 1, num); - return; - } - if (stricmp(item, "WEAPON") == 0) - { - 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; - } - - 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 - { - notice(s_GameServ, u, "You have purchased %s! Thanks for the gold!", weapons[wep]); - p->weapon = wep; - p->gold -= prices[wep - 1]; - } - } - else if (stricmp(item, "ARMOR") == 0) - { - 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; - } - - 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 - { - 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 are dead. Wait until tomorrow to purchase weapons and armor!"); + return; } - else if (stricmp(cmd, "SELL" ) == 0) + updateTS(user->stats); + + if (stricmp(cmd, "LIST") == 0) { - p = user->stats; - - if (stricmp(item, "WEAPON") == 0) - { - if (p->weapon == 0) - { - notice(s_GameServ, u, "You want me to chop off your hands?"); - return; - } - 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; - } - else if (2000000000 - p->gold < (prices[p->weapon - 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; - } - 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; - } - } - else if (stricmp(item, "ARMOR") == 0) - { - p = user->stats; - - if (p->armor == 0) - { - notice(s_GameServ, u, "I don't think you can be any more naked..."); - return; - } - if (p->gold == 2000000000) - { - notice(s_GameServ, u, "You have enough gold. I'll just take that off your hands, sire."); - p->armor = 0; - } - else if (2000000000 - p->gold < (prices[p->armor - 1] / 2)) + if (stricmp(num, "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 (item_iterator = store.begin(); item_iterator != store.end(); ++item_iterator) { - 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; - } - else + if ((*item_iterator)->getType() == WEAPON) + { + space = spaces(strlen((*item_iterator)->getName().c_str()), "."); + notice(s_GameServ, u, "%s%ld. %s%s%ld", ((*item_iterator)->getID() < 10 ? " " : ""), (*item_iterator)->getID(), (*item_iterator)->getName().c_str(), space, (*item_iterator)->price()); + free(space); + } + } + notice(s_GameServ, u, "To purchase a weapon, type /msg %S STORE BUY #."); + notice(s_GameServ, u, "Where # is the weapon number from the menu above."); + + } + else if (stricmp(num, "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 (item_iterator = store.begin(); item_iterator != store.end(); ++item_iterator) { - 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; + if ((*item_iterator)->getType() == ARMOR) + { + space = spaces(strlen((*item_iterator)->getName().c_str()), "."); + notice(s_GameServ, u, "%s%ld. %s%s%d",((*item_iterator)->getID() < 10 ? " " : ""), (*item_iterator)->getID(), (*item_iterator)->getName().c_str(), space, (*item_iterator)->price()); + free(space); + } } - } - else - { - notice(s_GameServ, u, "SYNTAX: STORE LIST {ARMOR | WEAPONS}"); - notice(s_GameServ, u, " STORE SELL {ARMOR | WEAPON}"); - notice(s_GameServ, u, " STORE BUY {ARMOR | WEAPON} NUMBER"); - } + + notice(s_GameServ, u, "To purchase armor, type /msg %S store buy #"); + notice(s_GameServ, u, "Where # is the armor number from the menu above."); + } + + } + else if (stricmp(cmd, "BUY") == 0) + { + p = user->stats; + if (!num) + { + notice(s_GameServ, u, "SYNTAX: STORE BUY #"); + return; + } + else + { + id = stringtoint(num); + } + + if (!isstringnum(num)) + { + notice(s_GameServ, u, "SYNTAX: STORE BUY #"); + return; + } + else if (!(tempItem = findStoreItemByID(id))) + { + notice(s_GameServ, u, "Sorry, we don't carry that item!"); + return; + } + else if (p->getGold() < tempItem->price()) + { + notice(s_GameServ, u, "You can't afford to buy %s", tempItem->getName().c_str()); + return; + } + else if (p->inventory->addItem(tempItem)) + { + notice(s_GameServ, u, "You have purchased %s! Thanks for the gold!", tempItem->getName().c_str()); + p->subtractGold(tempItem->price()); + notice(s_GameServ, u, "Don't forget to type /msg %S equip %ld", tempItem->getID()); + } + else + { + notice(s_GameServ, u, "You can't carry any more!"); + } } - else + else if (stricmp(cmd, "SELL" ) == 0) { - notice(s_GameServ, u, "SYNTAX: STORE LIST {ARMOR | WEAPONS}"); - notice(s_GameServ, u, " STORE SELL {ARMOR | WEAPON}"); - notice(s_GameServ, u, " STORE BUY {ARMOR | WEAPON} NUMBER"); - return; + itemContainer *tempContainer; + p = user->stats; + id = stringtoint(num); + if (!isstringnum(num)) + { + notice(s_GameServ, u, "SYNTAX: /msg %S store sell #"); + return; + } + else if (!(tempContainer = p->inventory->Find(id))) + { + notice(s_GameServ, u, "You're not carrying that!"); + return; + } + else if (p->getGold() >= 2000000000) + { + notice(s_GameServ, u, "You have enough gold. Just hang on to it for now."); + } + else + { + tempItem = tempContainer->getItem(); + + notice(s_GameServ, u, "Thank you for your business! We gave you %ld gold for %s!", (tempItem->price() / 2), tempItem->getName().c_str()); + p->addGold((tempItem->price() / 2)); + p->inventory->deleteItem(tempItem); + if (tempItem == p->getWeapon()) + { + notice(s_GameServ, u, "Since you equipped %s, you're going to have to reequip something", tempItem->getName().c_str()); + tempItem->undo(p); + p->clearWeapon(); + } + else if (tempItem == p->getArmor()) + { + tempItem->undo(p); + notice(s_GameServ, u, "Since you equipped %s, you're going to have to reequip something", tempItem->getName().c_str()); + p->clearArmor(); + } + } + } + else + { + notice(s_GameServ, u, "SYNTAX: STORE LIST {ARMOR | WEAPONS}"); + notice(s_GameServ, u, " STORE SELL #"); + notice(s_GameServ, u, " STORE BUY #"); + return; } } void do_inventory(char *u) { - aClient *user; - - if (!(user = find(u))) + aClient *user; + + if (!(user = find(u))) { - notice(s_GameServ, u, "Fatal Error. Contact a %S admin!"); - return; + notice(s_GameServ, u, "Fatal Error. Contact a %S admin!"); + 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 check your inventory!"); - return; + notice(s_GameServ, u, "You must be playing to check your inventory!"); + return; } - updateTS(user->stats); - showinventory(user, user); + if (!is_fighting(user)) + updateTS(user->stats); + showinventory(user->stats, user); } -void showinventory(aClient *from, aClient *to) + +void showinventory(Player *from, aClient *to) { - char *nick = to->getNick(); + char *nick; + if (!to || !from) + { + return; + } - if (!to) - to = from; - if (is_playing(from)) - { - Pouch *p = &from->stats->inventory; - notice(s_GameServ, nick, "Inventory for %s:", from->stats->name); - 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()); - } + nick = to->getNick(); + + if (from->inventory->isEmpty()) + { + notice(s_GameServ, nick, "You aren't carrying anything"); + return; + } + + list *items; + items = from->inventory->getItems(); + + list ::iterator item_iter, item_iter2; + item_iter = items->begin(); + + notice(s_GameServ, nick, "Inventory for %s:", from->getName().c_str()); + long count; + while (item_iter != items->end()) + { + // Display a list of counted items so as not to show an extra line for duplicate items + count = 0; + item_iter2 = item_iter; + while (item_iter != items->end() && (*item_iter) == (*item_iter2)) + { + if ((*item_iter) == (*item_iter2)) + { + ++count; + } + else + { + break; + } + ++item_iter; + } + notice(s_GameServ, nick, "%ld.) %s (%ld)", (*item_iter2).getItem()->getID(), (*item_iter2).getItem()->getName().c_str(), count); + } } + void do_tavern(char *u) { - char *cmd = strtok(NULL, " "); - long int price; - - aClient *user; - Player *p; + char *cmd = strtok(NULL, " "); - if (!(user = find(u))) + aClient *user; + Player *p; + + if (!(user = find(u))) { - notice(s_GameServ, u, "Fatal Error. See a %S admin for help"); - return; + notice(s_GameServ, u, "Fatal Error. See a %S admin for help"); + 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 go to the Tavern"); - return; + notice(s_GameServ, u, "You must be playing to go to the Tavern"); + return; } - else if (is_fighting(user)) + else if (is_fighting(user)) { - notice(s_GameServ, u, "You cannot go to the Tavern during a fight!"); - return; + notice(s_GameServ, u, "You cannot go to the Tavern during a fight!"); + return; } - - updateTS(user->stats); - p = user->stats; - - if (!cmd) + + updateTS(user->stats); + p = user->stats; + + if (!cmd) { - notice(s_GameServ, u, "Welcome to Boot Liquors Mystic Apothecary"); - notice(s_GameServ, u, "Your commands:"); - notice(s_GameServ, u, "/msg %S TAVERN {LIST | BUY} [NUMBER]"); - notice(s_GameServ, u, "What'll it be?"); + notice(s_GameServ, u, "Welcome to Boot Liquors Mystic Apothecary and General Store"); + notice(s_GameServ, u, "Your commands:"); + notice(s_GameServ, u, "/msg %S TAVERN {LIST | BUY} [NUMBER]"); + notice(s_GameServ, u, "What'll it be?"); } - else if (stricmp(cmd, "LIST") == 0) + else if (stricmp(cmd, "LIST") == 0) { - notice(s_GameServ, u, "Here is a list of what we have to offer:"); - notice(s_GameServ, u, "1. Healing Potions for %ld Gold", - 1000 * p->level * 4); - notice(s_GameServ, u, "2. Strength Potions for %ld Gold", - 2500 * p->level * 4); - notice(s_GameServ, u, "3. Defense Potions for %ld Gold", - 3000 * p->level * 4); - notice(s_GameServ, u, "4. HP Potions for %ld Gold", - 2000 * p->level * 4); - notice(s_GameServ, u, "To buy a potion, type /msg %S TAVERN BUY #"); - notice(s_GameServ, u, "Example: /msg %S TAVERN BUY 1 buys a healing potion!"); + notice(s_GameServ, u, "Here is a list of what we have to offer:"); + showTavern(user); + notice(s_GameServ, u, "To buy an item, type /msg %S TAVERN BUY #"); } - else if (stricmp(cmd, "BUY") == 0) + else if (stricmp(cmd, "BUY") == 0) { - char *chnum = strtok(NULL, " "); - int num = stringtoint(chnum); + int amt = 1; + char *chid = strtok(NULL, " "); + char *amount = strtok(NULL, " "); - if (!chnum) - { - notice(s_GameServ, u, "SYNTAX: TAVERN BUY #"); - notice(s_GameServ, u, "Example: /msg %S TAVERN BUY 1"); - return; - } - if (num < 1 || num > 4) - { - notice(s_GameServ, u, "Invalid Choice!"); - notice(s_GameServ, u, "Here is a list of what we have to offer:"); - notice(s_GameServ, u, "1. Healing Potions for %ld Gold", - 1000 * p->level * 4); - notice(s_GameServ, u, "2. Strength Potions for %ld Gold", - 2500 * p->level * 4); - notice(s_GameServ, u, "3. Defense Potions for %ld Gold", - 3000 * p->level * 4); - notice(s_GameServ, u, "4. HP Potions for %ld Gold", - 2000 * p->level * 4); - notice(s_GameServ, u, "To buy a potion, type /msg %S TAVERN BUY #"); - notice(s_GameServ, u, "Example: /msg %S TAVERN BUY 1 buys a healing potion!"); - return; - } - switch(num) - { - case 1: - price = (1000 * p->level * 4); - if (p->gold >= price) - { - notice(s_GameServ, u, "One healing potion coming right up!"); - p->inventory.incHealing(); - p->gold -= price; - } - else - notice(s_GameServ, u, "You don't have enough gold!"); - break; - case 2: - price = 2500 * p->level * 4; - if (p->gold >= price) + if (amount) + amt = stringtoint(amount); + + if (!chid) { - notice(s_GameServ, u, "One strength boost coming right up!"); - p->inventory.incStrength(); - p->gold -= price; + notice(s_GameServ, u, "SYNTAX: TAVERN BUY # [#]"); + notice(s_GameServ, u, "Example: /msg %S TAVERN BUY 6001"); + notice(s_GameServ, u, "Example: /msg %S TAVERN BUY 6001 10"); + return; } - else - notice(s_GameServ, u, "You don't have enough gold!"); - break; - case 3: - price = 3000 * p->level * 4; - if (p->gold >= price) + long id = stringtoint(chid); + tavernItem *tempItem; + + if (!(tempItem = findTavernItemByID(id)) || user->stats->getLevel() < tempItem->getLevel()) { - notice(s_GameServ, u, "One defense boost coming right up!"); - p->inventory.incDefense(); - p->gold -= price; + notice(s_GameServ, u, "Invalid Choice!"); + notice(s_GameServ, u, "Here is a list of what we have to offer:"); + showTavern(user); + notice(s_GameServ, u, "To buy an item, type /msg %S TAVERN BUY #"); + return; } - else - notice(s_GameServ, u, "You don't have enough gold!"); - break; - case 4: - price = 3000 * p->level * 4; - if (p->gold >= price) + else if (!amount && user->stats->getGold() < tempItem->getItem()->price()) { - notice(s_GameServ, u, "One HP Potion coming right up!"); - p->inventory.incHP(); - p->gold -= price; + notice(s_GameServ, u, "You don't have enough gold!"); + notice(s_GameServ, u, "Here is a list of what we have to offer:"); + showTavern(user); + notice(s_GameServ, u, "To buy an item, type /msg %S TAVERN BUY #"); + } + else if (user->stats->getGold() < amt * tempItem->getItem()->price()) + { + notice(s_GameServ, u, "You don't have enough gold!"); + notice(s_GameServ, u, "Here is a list of what we have to offer:"); + showTavern(user); + notice(s_GameServ, u, "To buy an item, type /msg %S TAVERN BUY # [#]"); + } + else + { + if (amount) + { + int amt = stringtoint(amount); + if (amt < 0 || amount[0] == '-') + { + notice(s_GameServ, u, "You trying to steal from me?"); + } + else if (user->stats->inventory->addItem(tempItem->getItem(), amt) == NULL) + { + notice(s_GameServ, u, "You can't carry that many!"); + } + else + { + notice(s_GameServ, u, "%d %s's coming right up!", amt, tempItem->getItem()->getName().c_str()); + user->stats->subtractGold(tempItem->getItem()->price() * amt); + } + } + else + { + if (user->stats->inventory->addItem(tempItem->getItem()) == NULL) + { + notice(s_GameServ, u, "You can't carry any more!"); + } + else + { + notice(s_GameServ, u, "One %s coming right up!", tempItem->getItem()->getName().c_str()); + user->stats->subtractGold(tempItem->getItem()->price()); + } + } } - else - notice(s_GameServ, u, "You don't have enough gold!"); - break; - default: - notice(s_GameServ, u, "Logical Error. See a %S admin for help!"); - break; - } } - else + else { - notice(s_GameServ, u, "Improper Syntax."); - notice(s_GameServ, u, "Type /msg %S HELP TAVERN for help"); + notice(s_GameServ, u, "Improper Syntax."); + notice(s_GameServ, u, "Type /msg %S HELP TAVERN for help"); } + return; } void do_bank(char *u) { - char *cmd = strtok(NULL, " "); - char *amount = strtok(NULL, " "); - char *nick = strtok(NULL, " "); - - aClient *user; - Player *p; - - if (!cmd || (!amount && stricmp(cmd, "BALANCE") != 0) || (stricmp(cmd, "TRANSFER") == 0 && !nick)) + char *cmd = strtok(NULL, " "); + char *amount = strtok(NULL, " "); + char *nick = strtok(NULL, " "); + + aClient *user; + Player *p; + + if (!cmd || (!amount && stricmp(cmd, "BALANCE") != 0) || (stricmp(cmd, "TRANSFER") == 0 && !nick)) { - notice(s_GameServ, u, "BANK {WITHDRAW | DEPOSIT} {ALL | AMOUNT}"); - notice (s_GameServ, u, "BANK BALANCE"); - return; + notice(s_GameServ, u, "BANK {WITHDRAW | DEPOSIT} {ALL | AMOUNT}"); + notice (s_GameServ, u, "BANK BALANCE"); + return; + } + else if (!(user = find(u))) + { + notice(s_GameServ, u, "Fatal Error. Couldn't find your aClient. Contact a(n) %S "\ + " admin for help"); + log("Fatal Error. Couldn't find %s while executing do_bank()", u); + return; } - else if (!(user = find(u))) + else if (isIgnore(user)) { - notice(s_GameServ, u, "Fatal Error. Couldn't find your aClient. Contact a(n) %S "\ - " admin for help"); - log("Fatal Error. Couldn't find %s while executing do_bank()", u); - return; +#ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); +#endif + return; } - else if (isIgnore(user)) + else if (!is_playing(user)) { - #ifdef DEBUGMODE - log("Ignoring %s.", user->getNick()); - #endif - return; + notice(s_GameServ, u, "You must be playing to use the bank!"); + return; } - else if (!is_playing(user)) + else if (is_fighting(user)) { - notice(s_GameServ, u, "You must be playing to use the bank!"); - return; + notice(s_GameServ, u, "You can't go to the bank during a fight!"); + return; } - else if (is_fighting(user)) + updateTS(user->stats); + if (stricmp(cmd, "BALANCE") == 0) { - notice(s_GameServ, u, "You can't go to the bank during a fight!"); - return; + showBankBalance(u); + return; } - updateTS(user->stats); - if (stricmp(cmd, "BALANCE") == 0) + else if (!isAlive(user->stats)) { - showBankBalance(u); - return; + notice(s_GameServ, u, "You are dead. We don't accept gold from dead folk! Wait 'til tomorrow!"); + return; } - else if (!isAlive(user->stats)) + else if (!isstringnum(amount) && stricmp(amount, "ALL") != 0) { - notice(s_GameServ, u, "You are dead. We don't accept gold from dead folk! Wait 'til tomorrow!"); - return; + notice(s_GameServ, u, "I don't know how to convert alphabet letters into currency, sire!"); + return; } - else if (!isstringnum(amount) && stricmp(amount, "ALL") != 0) + if (stringtoint(amount) < 0) { - notice(s_GameServ, u, "I don't know how to convert alphabet letters into currency, sire!"); - return; + notice(s_GameServ, u, "Sorry. This bank is not licensed "\ + "to handle such sums of cash, noble Lord."); + return; } - - p = user->stats; - - if (stricmp(cmd, "DEPOSIT") == 0) + p = user->stats; + + if (stricmp(cmd, "DEPOSIT") == 0) { - if (p->bank == 2000000000) + if (p->getBank() == 2000000000) { - notice(s_GameServ, u, "Your bank account is full, sire!"); - return; + notice(s_GameServ, u, "Your bank account is full, sire!"); + return; } - else if (stricmp(amount, "ALL") == 0) + else if (stricmp(amount, "ALL") == 0) { - if (2000000000 - p->bank < p->gold) + if (2000000000 - p->getBank() < p->getGold()) { - notice(s_GameServ, u, "You don't have enough room for all of your gold."); - notice(s_GameServ, u, "Depositing %ld gold into your account", (2000000000 - p->bank)); - p->gold -= (2000000000 - p->bank); - p->bank = 2000000000; - showBankBalance(u); + notice(s_GameServ, u, "You don't have enough room for all of your gold."); + notice(s_GameServ, u, "Depositing %ld gold into your account", (2000000000 - p->getBank())); + p->subtractGold((2000000000 - p->getBank())); + p->setBank(2000000000); + showBankBalance(u); } - else + else { - notice(s_GameServ, u, "Depositing %ld gold into your account!", p->gold); - p->bank += p->gold; - p->gold = 0; - showBankBalance(u); + notice(s_GameServ, u, "Depositing %ld gold into your account!", p->getGold()); + p->addBank(p->getGold()); + p->setGold(0); + showBankBalance(u); } } - else if (stringtoint(amount) > p->gold) + else if (stringtoint(amount) > p->getGold()) { - notice(s_GameServ, u, "Sire, you only have %ld gold!", p->gold); - showBankBalance(u); - return; + notice(s_GameServ, u, "Sire, you only have %ld gold!", p->getGold()); + showBankBalance(u); + return; } - else + else { - if (2000000000 - p->bank < stringtoint(amount)) + if (2000000000 - p->getBank() < stringtoint(amount)) { - notice(s_GameServ, u, "You don't have room in your account for that much."); - notice(s_GameServ, u, "Capping off your account with %ld gold!", (2000000000 - p->bank)); - p->gold -= (2000000000 - p->bank); - p->bank = 2000000000; - showBankBalance(u); + notice(s_GameServ, u, "You don't have room in your account for that much."); + notice(s_GameServ, u, "Capping off your account with %ld gold!", (2000000000 - p->getBank())); + p->subtractGold((2000000000 - p->getBank())); + p->setBank(2000000000); + showBankBalance(u); } - else + else { - notice(s_GameServ, u, "Depositing %d gold into your account!", stringtoint(amount)); - p->bank += stringtoint(amount); - p->gold -= stringtoint(amount); - showBankBalance(u); + notice(s_GameServ, u, "Depositing %d gold into your account!", stringtoint(amount)); + p->addBank(stringtoint(amount)); + p->subtractGold(stringtoint(amount)); + showBankBalance(u); } } } - else if (stricmp(cmd, "WITHDRAW") == 0) + else if (stricmp(cmd, "WITHDRAW") == 0) { - if (p->gold == 2000000000) + if (p->getGold() == 2000000000) { - notice(s_GameServ, u, "You cannot carry any more gold, sire!"); - showBankBalance(u); - return; + notice(s_GameServ, u, "You cannot carry any more gold, sire!"); + showBankBalance(u); + return; } - else if (stricmp(amount, "ALL") == 0) + else if (stricmp(amount, "ALL") == 0) { - if (2000000000 - p->gold < p->bank) + if (2000000000 - p->getGold() < p->getBank()) { - notice(s_GameServ, u, "You don't have enough room to carry all that gold."); - notice(s_GameServ, u, "Withdrawing %ld gold from your account", (2000000000 - p->gold)); - p->bank -= (2000000000 - p->gold); - p->gold = 2000000000; - showBankBalance(u); + notice(s_GameServ, u, "You don't have enough room to carry all that gold."); + notice(s_GameServ, u, "Withdrawing %ld gold from your account", (2000000000 - p->getGold())); + p->subtractBank((2000000000 - p->getGold())); + p->setGold(2000000000); + showBankBalance(u); } - else + else { - notice(s_GameServ, u, "Withdrawing %ld gold from your account!", p->bank); - p->gold += p->bank; - p->bank = 0; - showBankBalance(u); + notice(s_GameServ, u, "Withdrawing %ld gold from your account!", p->getBank()); + p->addGold(p->getBank()); + p->setBank(0); + showBankBalance(u); } } - else if (stringtoint(amount) > p->bank) + else if (stringtoint(amount) > p->getBank()) { - notice(s_GameServ, u, "Sire, you only have %ld gold in the bank!", p->bank); - showBankBalance(u); - return; + notice(s_GameServ, u, "Sire, you only have %ld gold in the bank!", p->getBank()); + showBankBalance(u); + return; } - else + else { - if (2000000000 - p->gold < stringtoint(amount)) + if (2000000000 - p->getGold() < stringtoint(amount)) { - notice(s_GameServ, u, "You don't enough have room to carry that much gold!"); - notice(s_GameServ, u, "You fill your pockets with %ld gold!", - (2000000000 - p->gold)); - p->bank -= (2000000000 - p->gold); - p->gold = 2000000000; - showBankBalance(u); + notice(s_GameServ, u, "You don't enough have room to carry that much gold!"); + notice(s_GameServ, u, "You fill your pockets with %ld gold!", + (2000000000 - p->getGold())); + p->subtractBank((2000000000 - p->getGold())); + p->setGold(2000000000); + showBankBalance(u); } - else + else { - notice(s_GameServ, u, "Withdrawing %d gold from your account!", stringtoint(amount)); - p->gold += stringtoint(amount); - p->bank -= stringtoint(amount); - showBankBalance(u); + notice(s_GameServ, u, "Withdrawing %d gold from your account!", stringtoint(amount)); + p->addGold(stringtoint(amount)); + p->subtractBank(stringtoint(amount)); + showBankBalance(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)) + aClient *user; + + if (!(user = find(u))) { - 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; + notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, "")); + return; } - else if (!isAlive(user->stats)) + else if (isIgnore(user)) { - 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); +#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->getLevel() < LEVELS) + { + 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; + setMaster(p); + 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.", + (p->getArmor() ? p->getArmor()->getName().c_str() : "Fists"), (p->getWeapon() ? p->getWeapon()->getName().c_str() : "Birthday Suit")); + 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!"); + p->setMonster(&dragon); + setDragonFight(p); + display_monster(u); } void do_master(char *u) { - aClient *user; - - - if (!(user = find(u))) + aClient *user; + + + if (!(user = find(u))) { - notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, "")); - return; + notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, "")); + 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 see your master!"); - return; + notice(s_GameServ, u, "You must be playing to see your master!"); + return; } - else if (is_fighting(user)) + else if (is_fighting(user)) { - notice(s_GameServ, u, "You're in the middle of a fight! Pay attention!"); - return; + notice(s_GameServ, u, "You're in the middle of a fight! Pay attention!"); + return; } - else if (!isAlive(user->stats)) + else if (!isAlive(user->stats)) { - notice(s_GameServ, u, "You're dead. Wait until tomorrow to see your master!"); - return; + notice(s_GameServ, u, "You're dead. Wait until tomorrow to see your master!"); + return; } - - updateTS(user->stats); - - char *cmd = strtok(NULL, " "); - Player *p = user->stats; - long int need = 0; - - if (seenMaster(p)) + + updateTS(user->stats); + + char *cmd = strtok(NULL, " "); + Player *p = user->stats; + long int need = 0; + + if (seenMaster(p)) { - notice(s_GameServ, u, "You have already seen your master today. Wait until tomorrow to try again"); - return; + notice(s_GameServ, u, "You have already seen your master today. Wait until tomorrow to try again"); + return; } - - if (cmd != NULL) + + if (cmd != NULL) { - switch(p->level) - { + switch(p->getLevel()) + { case 1: - need = 200; - break; + need = 200; + break; case 2: - need = 800; - break; + need = 800; + break; case 3: - need = 2000; - break; + need = 2000; + break; case 4: - need = 8000; - break; + need = 8000; + break; case 5: - need = 20000; - break; + need = 20000; + break; case 6: - need = 80000; - break; + need = 80000; + break; case 7: - need = 200000; - break; + need = 200000; + break; case 8: - need = 800000; - break; + need = 800000; + break; case 9: - need = 2000000; - break; + need = 2000000; + break; case 10: - need = 8000000; - break; + need = 8000000; + break; case 11: - need = 20000000; - break; - + need = 20000000; + break; + case REALLEVELS: - need = p->exp + 1; - notice(s_GameServ, u, "You are at level %d. You are the master. What's left? The DRAGON!", REALLEVELS); - return; - break; + need = p->getExp() + 1; + 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! - break; - } + need = p->getExp() + 1; // Unknown level... don't let them fight a fake master! + break; + } } - else + else { - notice(s_GameServ, u, "SYNTAX: MASTER {FIGHT | QUESTION}"); - return; + notice(s_GameServ, u, "SYNTAX: MASTER {FIGHT | QUESTION}"); + return; } - - if (stricmp(cmd, "FIGHT") == 0) + + if (stricmp(cmd, "FIGHT") == 0) { - if (p->exp >= need) - { - setMaster(p); - see_master(u); - } - else - notice(s_GameServ, u, "You are not worthy of fighting %s! You need %ld more experience.", masters[p->level - 1]->name, (need - p->exp)); - return; + if (p->getExp() >= need) + { + setMaster(p); + see_master(u); + } + else + notice(s_GameServ, u, "You are not worthy of fighting %s! You need %ld more experience.", + levels[p->getLevel() - 1].master.name.c_str(), (need - p->getExp())); + return; } - else if (stricmp(cmd, "QUESTION") == 0) + else if (stricmp(cmd, "QUESTION") == 0) { - if (p->exp >= need) - notice(s_GameServ, u, "%s looks you up and down and decides you are more ready than you will ever be.", masters[p->level - 1]->name); - else - notice(s_GameServ, u, "You pathetic fool! You are no match for %s, %s!", masters[p->level - 1]->name, p->name); - - return; + if (p->getExp() >= need) + notice(s_GameServ, u, "%s looks you up and down and decides you are more ready than you will ever be.", + levels[p->getLevel() - 1].master.name.c_str()); + else + notice(s_GameServ, u, "You pathetic fool! You are no match for %s, %s!", + levels[p->getLevel() - 1].master.name.c_str(), p->getName().c_str()); + + return; } - else + else { - notice(s_GameServ, u, "SYNTAX: MASTER {FIGHT | QUESTION}"); + notice(s_GameServ, u, "SYNTAX: MASTER {FIGHT | QUESTION}"); } } void see_master(char *u) { - aClient *user; + aClient *user; - if (!(user = find(u))) + if (!(user = find(u))) { - notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, "")); - return; + notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, "")); + return; + } + + if (!is_fighting(user) && is_playing(user)) + { + Player *p = user->stats; + p->setMyMaster(&levels[p->getLevel() - 1].master); + p->setMonster(&levels[p->getLevel() - 1].master); + display_monster(u); // Since master is the same structure, use this function } +} - if (!is_fighting(user) && is_playing(user)) +void showTavern(aClient *user) +{ + Player *p; + list::iterator item_iterator; + item *tempItem; + + p = user->stats; + + if (!p) + return; + + item_iterator = tavern.begin(); + if (tavern.empty()) + { + notice(s_GameServ, user->getNick(), "Tavern is empty"); + return; + } + + while (item_iterator != tavern.end()) { - Player *p = user->stats; - p->master = new Monster(masters[p->level - 1]); - p->fight = p->master; - display_monster(u); // Since master is the same structure, use this function + if (p->getLevel() < (*item_iterator).getLevel()) + { + item_iterator++; + continue; + } + tempItem = (*item_iterator).getItem(); + notice(s_GameServ, user->getNick(), "%d. %s for %ld gold", tempItem->getID(), tempItem->getName().c_str(), tempItem->price()); + item_iterator++; } } void showBankBalance(const char *u) { - aClient *user; - Player *p; - - if (!(user = find(u))) - return; - - p = user->stats; - - if (!p) + aClient *user; + Player *p; + + if (!(user = find(u))) return; - - notice(s_GameServ, u, "Account Balance: %ld Gold On hand: %ld", p->bank, p->gold); - + + p = user->stats; + + if (!p) + return; + + notice(s_GameServ, u, "Account Balance: %ld Gold On hand: %ld", p->getBank(), p->getGold()); } +void rolloverall() +{ + list::iterator iter; + for (unsigned long x = 0; x < U_TABLE_SIZE; x++) + { + for (iter = players[x].begin(); iter != players[x].end(); iter++) + { + rollover((*iter)); + } + } +} void refreshall() { - ListNode *it; - Player *p; - for (unsigned long x = 0; x < U_TABLE_SIZE; x++) - { - it = players[x].First(); - - while (it) + list::iterator iter; + for (unsigned long x = 0; x < U_TABLE_SIZE; x++) { - p = it->getData()->stats; - refresh(p); - it = it->Next(); + for (iter = players[x].begin(); iter != players[x].end(); iter++) + { + refresh((*iter)); + } } - } +} + +void rollover(Player *p) +{ + if (!p) + return; + + p->addForestFights(numrolloverfights); + + if (p->getForestFights() > maxforestfights) + p->setForestFights(maxforestfights); } void refresh(Player *p) { - if (!p) + if (!p) return; - if (p->hp < p->maxhp) - p->hp = p->maxhp; - p->forest_fights = forestfights; - p->player_fights = 3; - setAlive(p); - clearMaster(p); + if (p->getHP() < p->getMaxHP()) + p->healall(); + if (p->getForestFights() < forestfights) + { + p->setForestFights(forestfights); + } + + p->setPlayerFights(3); + setAlive(p); + clearMaster(p); } void do_refresh(char *u) { - char *nick = strtok(NULL, " "); - aClient *user; - - if (!(user = find(u))) + char *name = strtok(NULL, " "); + aClient *user; + Player *p; + + if (!(user = find(u))) { - notice(s_GameServ, u, "Error: aClient not found. Contact a %S admin"); - log("Error: aClient not found: %s", u); - return; + notice(s_GameServ, u, "Error: aClient not found. Contact a %S admin"); + log("Error: aClient not found: %s", 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 (!isAdmin(user)) + else if (!isAdmin(user)) { - notice(s_GameServ, u, "You must be a %S admin to use this command!"); - return; + notice(s_GameServ, u, "You must be a %S admin to use this command!"); + return; } - if (!nick) + if (!name) { - notice(s_GameServ, u, "SYNTAX: REFRESH {ALL | NICK}"); - return; + notice(s_GameServ, u, "SYNTAX: REFRESH {ALL | NICK}"); + return; } - else if (stricmp(nick, "ALL") == 0) + else if (stricmp(name, "ALL") == 0) { - notice(s_GameServ, u, "Refreshing everyone's stats!"); - refreshall(); + notice(s_GameServ, u, "Refreshing everyone's stats!"); + refreshall(); } - else if ((user = findplayer(nick))) + else if ((p = findplayer(name))) { - if (is_playing(user)) - { - #ifdef P10 - notice(s_GameServ, u, "Refreshing %s.", user->getRealNick()); - #else - notice(s_GameServ, u, "Refreshing %s.", user->getNick()); - #endif - refresh(user->stats); + notice(s_GameServ, u, "Refreshing %s.", p->getName().c_str()); + refresh(p); } - else - { - #ifdef P10 - notice(s_GameServ, u, "%s is not playing.", user->getRealNick()); - #else - notice(s_GameServ, u, "%s is not playing.", user->getNick()); - #endif - } - } - else + else { - notice(s_GameServ, u, "Nick %s not found.", nick); - return; + notice(s_GameServ, u, "Player %s not found.", name); + return; } } void resetall() { - ListNode *it; - Player *p; - - for (unsigned long x = 0; x < U_TABLE_SIZE; x++) - { - it = players[x].First(); - - while (it) - { - p = it->getData()->stats; - reset(p); - it = it->Next(); - } - } + list::iterator iter; + for (unsigned long x = 0; x < U_TABLE_SIZE; x++) + { + for (iter = players[x].begin(); iter != players[x].end(); iter++) + { + reset((*iter)); + } + } } void reset(Player *p) { - if (!p) - return; + item *tempItem; - p->reset(); + if (!p) + return; + + p->reset(); + // Add the stick and clothes + tempItem = findItemByID(3001); + p->inventory->addItem((*Items.begin()))->use(p); // Add the stick + p->inventory->addItem(tempItem)->use(p); // Add Clothes } void updateTS(Player *p) { - if (!p) + if (!p) return; - - #ifdef DEBUGMODE - log("Old timestamp for %s: %ld", p->name, p->lastcommand); - #endif - p->lastcommand = time(NULL); - #ifdef DEBUGMODE - log("New timestamp for %s: %ld", p->name, p->lastcommand); - #endif - + +#ifdef DEBUGMODE + log("Old timestamp for %s: %ld", p->getName().c_str(), p->lastcommand); +#endif + p->lastcommand = time(NULL); +#ifdef DEBUGMODE + log("New timestamp for %s: %ld", p->getName().c_str(), p->lastcommand); +#endif + PF_cleartimedout(p); + } bool timedOut(Player *p) { - if (!p) + if (!p) return false; - else if (p->lastcommand == 0) + else if (p->lastcommand == 0) return false; - else + else { - if ((time(NULL) - p->lastcommand) >= maxidletime) + if ((time(NULL) - p->lastcommand) >= maxidletime) return true; - - return false; + + return false; } } void timeOutEvent(Player *p) { - aClient *user = findplayer(p->name); - - if (!user || !p->client) // then they're not playing + if (!p || !is_playing(p->getClient())) // then they're not playing return; + + char *nick = p->getClient()->getNick(); - char *nick = user->getNick(); - - if (player_fight(user) && isYourTurn(p)) - { - // Check to see if they were the idler or if it was the other - // person - if (p->lastcommand != p->battle->stats->lastcommand) - { - // This person's last command was given earlier, - // so this person is the idler - notice(s_GameServ, nick, "You timed out "\ - "during a fight. You lose your turn!"); - notice(s_GameServ, p->battle->getNick(), - "%s hesitated for too long. Your move.", p->name); - clearYourTurn(p); - setYourTurn(p->battle->stats); - - // Update the TS for both players to give them another - // Chance to wake up, but if the other player doesn't - // Attack now, they both get logged out. - updateTS(p); - p->battle->stats->lastcommand = p->lastcommand; - display_players(p->battle); - return; - } - else - { - notice(s_GameServ, p->battle->getNick(), - "You and %s timed out at the same time."\ - " Don't fight if you're just going to "\ - "sit there!", p->name); - notice(s_GameServ, user->getNick(), - "You and %s timed out at the same time."\ - " Don't fight if you're just going to "\ - "sit there!", p->battle->stats->name); - logout(p->battle); - logout(user); - return; - } + if (player_fight(p->getClient()) && isYourTurn(p)) + { + // Check to see if they were the idler or if it was the other + // person + if (!PF_timedout(p->getBattle()->stats)) + { + // This person's last command was given earlier, + // so this person is the idler + notice(s_GameServ, nick, "You timed out "\ + "during a fight. You lose your turn!"); + notice(s_GameServ, p->getBattle()->getNick(), + "%s hesitated for too long. Your move.", p->getName().c_str()); + clearYourTurn(p); + setYourTurn(p->getBattle()->stats); + + // Update the TS for both players to give them another + // Chance to wake up, but if the other player doesn't + // Attack now, they both get logged out. + updateTS(p); + PF_settimedout(p); + display_players(p->getBattle()); + return; + } + else + { + notice(s_GameServ, p->getBattle()->getNick(), + "You and %s timed out at the same time."\ + " Don't fight if you're just going to "\ + "sit there!", p->getName().c_str()); + notice(s_GameServ, p->getClient()->getNick(), + "You and %s timed out at the same time."\ + " Don't fight if you're just going to "\ + "sit there!", p->getBattle()->stats->getName().c_str()); + logout(p->getBattle()); + logout(p->getClient()); + return; + } } - else if (!player_fight(user)) + else if (!player_fight(p->getClient())) { - if (isAlive(user->stats) && user->stats->gold > 0) - { - // Place fun stuff here :) - int randnum = 1 + rand() % 100; // 1-100 - #define GSN(s) notice(s_GameServ, nick, s) - #define GSN2(s, f) notice(s_GameServ, nick, s, f) - - if (randnum < 50) - { - // 35-100% of your gold goes pffft - kain - int stolen = (35 + (rand() % 66)) * user->stats->gold / 100; - - GSN("You stop for a moment to rest on the "\ - "street corner. All of a sudden, you "\ - "are ambushed from all sides by a hoarde "\ - "of knife wielding thugs."); - GSN2("The thugs beat you into utter submission "\ - "and steal %d gold from you!", stolen); - user->stats->gold -= stolen; - } - else if (randnum >= 50 && randnum < 75) - { - // 25-65% of your gold goes pffft - kain - int stolen = (25 + (rand() % 41)) * user->stats->gold / 100; - GSN("While dilly dallying around, you lose "\ - "your sense of time. Little did you know, "\ - "but thieves lifted your gold while you "\ - "weren't watching."); - GSN2("Better luck next time... you lose %d gold", stolen); - user->stats->gold -= stolen; - } - else if (randnum >= 75) - { - // 25-75% of your gold goes pffft - kain - int stolen = (25 + (rand() % 51)) * user->stats->gold / 100; - GSN("Good grief! A gaggle of gooey green ghostlike "\ - "goblins grabbed your gold!"); - GSN2("They stole %d gold from you!", stolen); - user->stats->gold -= stolen; - } - } - - // Always log out the user - logout(user); + if (isAlive(p) && p->getGold() > 0) + { + // Place fun stuff here :) + int randnum = 1 + rand() % 100; // 1-100 +#define GSN(s) notice(s_GameServ, nick, s) +#define GSN2(s, f) notice(s_GameServ, nick, s, f) + + if (randnum < 50) + { + // 35-100% of your gold goes pffft - kain + int stolen = (35 + (rand() % 66)) * (p->getGold() / 100); + + GSN("You stop for a moment to rest on the "\ + "street corner. All of a sudden, you "\ + "are ambushed from all sides by a hoarde "\ + "of knife wielding thugs."); + GSN2("The thugs beat you into utter submission "\ + "and steal %ld gold from you!", stolen); + p->subtractGold(stolen); + } + else if (randnum >= 50 && randnum < 75) + { + // 25-65% of your gold goes pffft - kain + int stolen = (25 + (rand() % 41)) * (p->getGold() / 100); + GSN("While dilly dallying around, you lose "\ + "your sense of time. Little did you know, "\ + "but thieves lifted your gold while you "\ + "weren't watching."); + GSN2("Better luck next time... you lose %d gold", stolen); + p->subtractGold(stolen); + } + else if (randnum >= 75) + { + // 25-75% of your gold goes pffft - kain + int stolen = (25 + (rand() % 51)) * (p->getGold() / 100); + GSN("Good grief! A gaggle of gooey green ghostlike "\ + "goblins grabbed your gold!"); + GSN2("They stole %d gold from you!", stolen); + p->subtractGold(stolen); + } + } + + // Always log out the user + logout(p->getClient()); } } void do_reset(char *u) { - char *nick = strtok(NULL, " "); - aClient *user; - - if (!(user = find(u))) + char *nick = strtok(NULL, " "); + aClient *user; + Player *p; + + if (!(user = find(u))) { - notice(s_GameServ, u, "Error: aClient not found. Contact a %S admin"); - log("Error: aClient not found: %s", u); - return; + notice(s_GameServ, u, "Error: aClient not found. Contact a %S admin"); + log("Error: aClient not found: %s", u); + return; } - else if (!isAdmin(user)) + else if (!isAdmin(user)) { - notice(s_GameServ, u, "You must be a %S admin to use this command!"); - return; + notice(s_GameServ, u, "You must be a %S admin to use this command!"); + return; } - - if (!nick) + + if (!nick) { - notice(s_GameServ, u, "SYNTAX: RESET {ALL | NICK}"); - return; + notice(s_GameServ, u, "SYNTAX: RESET {ALL | NICK}"); } - else if (stricmp(nick, "ALL") == 0) + else if (stricmp(nick, "ALL") == 0) { - notice(s_GameServ, u, "Resetting everyone's stats!"); - resetall(); + notice(s_GameServ, u, "Resetting everyone's stats!"); + resetall(); } - else if ((user = findbyrealnick(nick))) - { - if (is_playing(user)) - { - #ifdef P10 - notice(s_GameServ, u, "Resetting %s.", user->getRealNick()); - #else - notice(s_GameServ, u, "Resetting %s.", user->getNick()); - #endif - reset(user->stats); - } - else + else if (!(p = findplayer(nick))) { - #ifdef P10 - notice(s_GameServ, u, "%s is not playing.", user->getRealNick()); - #else - notice(s_GameServ, u, "%s is not playing.", user->getNick()); - #endif + notice(s_GameServ, u, "Nick %s not found.", nick); } - } - else + else { - notice(s_GameServ, u, "Nick %s not found.", nick); - return; - } + notice(s_GameServ, u, "Resetting %s.", p->getName().c_str()); + reset(p); + } } void do_help(char *u) { - char *cmd = strtok(NULL, " "); - - display_help(u, cmd); + char *cmd = strtok(NULL, " "); + + display_help(u, cmd); } void display_help(char *u, char *file) { - ifstream infile; - char *buf; - - if (!file) + ifstream infile; + char *buf; + + if (!file) { - infile.open("helpfiles/help"); - if (infile.fail()) - { - log("Error opening helpfiles/help"); - notice(s_GameServ, u, "Error opening helpfiles/help"); - return; - } - buf = new char[1024]; - while(infile.getline(buf, 1024)) - { - // Written this way, it will process %S in the helpfiles - // Instead of notice(s_GameServ, u, "%s", buf); - notice(s_GameServ, u, buf); - } - - // Minor recursion - aClient *user = find(u); - if (user && isAdmin(user)) + infile.open("helpfiles/help"); + if (infile.fail()) + { + log("Error opening helpfiles/help"); + notice(s_GameServ, u, "Error opening helpfiles/help"); + return; + } + buf = new char[1024]; + while(infile.getline(buf, 1024)) + { + // Written this way, it will process %S in the helpfiles + // Instead of notice(s_GameServ, u, "%s", buf); + notice(s_GameServ, u, buf); + } + + // Minor recursion + aClient *user = find(u); + if (user && isAdmin(user)) display_help(u, "admin_commands"); } - else + else { - char *filename; - filename = new char[strlen(file) + 11]; - strcpy(filename, "helpfiles/"); - strcat(filename, file); - - for (unsigned int x = 10; x < strlen(filename); x++) + char *filename; + filename = new char[strlen(file) + 11]; + strcpy(filename, "helpfiles/"); + strcat(filename, file); + + for (unsigned int x = 10; x < strlen(filename); x++) filename[x] = tolower(filename[x]); - - infile.open(filename); - delete [] filename; - if (infile.fail()) - { - notice(s_GameServ, u, "No help for %s", file); - return; - } - buf = new char[1024]; - while(infile.getline(buf, 1024)) - { - // Written this way, it will process %S in the helpfiles - // Instead of notice(s_GameServ, u, "%s", buf); - notice(s_GameServ, u, buf); - } + + infile.open(filename); + delete [] filename; + if (infile.fail()) + { + notice(s_GameServ, u, "No help for %s", file); + return; + } + buf = new char[1024]; + while(infile.getline(buf, 1024)) + { + // Written this way, it will process %S in the helpfiles + // Instead of notice(s_GameServ, u, "%s", buf); + notice(s_GameServ, u, buf); + } } - infile.close(); - delete [] buf; + infile.close(); + delete [] buf; } void do_admin(char *u) { - aClient *user; - char *pass = strtok(NULL, " "); - - if (!(user = find(u))) + aClient *user; + char *pass = strtok(NULL, " "); + + if (!(user = find(u))) { - log("Error: aClient not found: %s", u); - notice(s_GameServ, u, "Error: aClient not found. Contact %S admin."); - return; + log("Error: aClient not found: %s", u); + notice(s_GameServ, u, "Error: aClient not found. Contact %S admin."); + return; } - - if (!pass) + + if (!pass) { - notice(s_GameServ, u, "SYNTAX: ADMIN password"); - return; + notice(s_GameServ, u, "SYNTAX: ADMIN password"); + return; } - - if (isAdmin(user)) + + if (isAdmin(user)) { - notice(s_GameServ, u, "You already have administrator privledges."); - return; + notice(s_GameServ, u, "You already have administrator privledges."); + return; } - else if (strcmp(pass, adminpass) == 0) + else if (strcmp(pass, adminpass) == 0) { - notice(s_GameServ, u, "Password accepted. You now have administrator privledges."); - setAdmin(user); - #ifdef P10 - log("%s became an administrator.", user->getRealNick()); - #else - log("%s became an administrator.", user->getNick()); - #endif + notice(s_GameServ, u, "Password accepted. You now have administrator privledges."); + setAdmin(user); +#ifdef P10 + log("%s became an administrator.", user->getRealNick()); +#else + log("%s became an administrator.", user->getNick()); +#endif } - else + else { - notice(s_GameServ, u, "Invalid password. Remember: case sensitive"); - return; + notice(s_GameServ, u, "Invalid password. Remember: case sensitive"); + return; + } +} + +bool load_levels() +{ + char *filename; + filename = new char[256]; + + for (int x = 1; x <= LEVELS; x++) + { + sprintf(filename, "data/levels/level%d.dat", x); + if (levels[x - 1].loadLevel(filename) == false) + { + delete []filename; + return false; + } } + + delete []filename; + return true; } bool load_monsters() { - ifstream infile; - infile.open("monsters.dat"); + char *filename; + ifstream infile; + char *buf; + buf = new char[2048]; + + for (int level = 1; level <= LEVELS; level++) + { + filename = new char[256]; + sprintf(filename, "data/monsters/level%d.dat", level); + infile.open(filename); + + if (!infile) + { + log("Error opening %s", filename); + delete []filename; + delete []buf; + return false; + } + +#ifdef DEBUGMODE + log("Loading monsters from %s", filename); +#endif + + while (infile.getline(buf, 2048)) + { + if (buf[0] == '^') + break; + if (buf[0] == '\n' || buf[0] == '\0' || buf[0] == '#') + continue; + Monster *temp; + temp = new Monster; + + temp->name = strtok(buf, "~"); + temp->weapon = strtok(NULL, "~"); + temp->death = strtok(NULL, "~"); + + levels[level - 1].monsters.push_back(temp); - char *buf; + } + delete [] filename; + infile.close(); + } + delete [] buf; + return true; +} - if (infile.fail()) +item *findItemByID(int id) +{ + list::iterator item_iterator; + + item_iterator = Items.begin(); + + while (item_iterator != Items.end()) { - log("Error opening monsters.dat"); - return false; + if ((*item_iterator)->getID() == id) + { + return (*item_iterator); + } + item_iterator++; } - init_monsters(); - buf = new char[2048]; + return NULL; +} - #ifdef DEBUGMODE - log("Loading monsters from monsters.dat"); - #endif +item *findStoreItemByID(int id) +{ + list::iterator item_iterator; + + item_iterator = store.begin(); + + while (item_iterator != store.end()) + { + if ((*item_iterator)->getID() == id) + { + return (*item_iterator); + } + item_iterator++; + } + return NULL; +} - for (int l = 0; l < REALLEVELS; l++) - { - for (int m = 0; m < MONSTERS;) +tavernItem *findTavernItemByID(int id) +{ + list::iterator item_iterator; + + item_iterator = tavern.begin(); + + while (item_iterator != tavern.end()) { - infile.getline(buf, 2048); - if (buf[0] == '\n' || buf[0] == '\0' || buf[0] == '#') - continue; - else - { - strcpy(monsters[l][m]->name, strtok(buf, "~")); - strcpy(monsters[l][m]->weapon, strtok(NULL, "~")); - monsters[l][m]->strength = stringtoint(strtok(NULL, "~")); - monsters[l][m]->gold = stringtoint(strtok(NULL, "~")); - monsters[l][m]->exp = stringtoint(strtok(NULL, "~")); - monsters[l][m]->maxhp = stringtoint(strtok(NULL, "~")); - monsters[l][m]->hp = monsters[l][m]->maxhp; - strcpy(monsters[l][m]->death, strtok(NULL, "")); - m++; - } + if ((*item_iterator).getItem()->getID() == id) + { + return &(*item_iterator); + } + item_iterator++; } - } - delete [] buf; -return true; + return NULL; }