X-Git-Url: https://jfr.im/git/irc/gameservirc.git/blobdiff_plain/1781f48acb7a88a79ef85708ad4afe88ce35b7b1..f71a53ab6e251712c26a11c0b373d41014f775d5:/gameserv/gameserv.cpp diff --git a/gameserv/gameserv.cpp b/gameserv/gameserv.cpp index 59eb75e..05ac739 100644 --- a/gameserv/gameserv.cpp +++ b/gameserv/gameserv.cpp @@ -4,11 +4,11 @@ #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 @@ -31,16 +31,19 @@ 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 @@ -57,7 +60,7 @@ int strnicmp(const char *s1, const char *s2, size_t len); 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 **********/ @@ -83,6 +86,7 @@ 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); @@ -97,6 +101,9 @@ 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); bool load_masters(); @@ -134,7 +141,7 @@ void see_master(char *u); void logout(aClient *user); void showstats(const char *u, const char *nick); void showTavern(aClient *user); -void showinventory(aClient *from, aClient *to); +void showinventory(Player *from, aClient *to); void showBankBalance(const char *u); void end_turn(aClient *user); @@ -146,198 +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 - - if (strnicmp(cmd, "\1PING", 6) == 0) + 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) { - 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) + 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) notice(s_GameServ, source, "SYNTAX: /msg %S SEARCH FOREST"); - else + else do_forest(source); - - } else if (stricmp(cmd, "ADMIN") == 0) { - do_admin(source); - } else if (stricmp(cmd, "ATTACK") == 0) { - do_attack(source); - } else if (stricmp(cmd, "BANK") == 0) { - do_bank(source); - } else if (stricmp(cmd, "CHECK") == 0) { - do_check(source); - } else if (stricmp(cmd, "DRAGON") == 0) { - do_dragon(source); - } else if (stricmp(cmd, "EQUIP") == 0) { + + } + else if (stricmp(cmd, "ADMIN") == 0) + { + do_admin(source); + } + else if (stricmp(cmd, "ATTACK") == 0) + { + do_attack(source); + } + else if (stricmp(cmd, "BANK") == 0) + { + do_bank(source); + } + else if (stricmp(cmd, "CHECK") == 0) + { + do_check(source); + } + else if (stricmp(cmd, "DRAGON") == 0) + { + do_dragon(source); + } + else if (stricmp(cmd, "EQUIP") == 0) + { 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)) + } + else if (stricmp(cmd, "FIGHT") == 0) { - notice(s_GameServ, source, "You must be a %S admin to use this command!"); - } - else + do_fight(source); + } + else if (stricmp(cmd, "HEAL") == 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_heal(source); + } + else if (stricmp(cmd, "HELP") == 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_help(source); + } + else if (stricmp(cmd, "IDENTIFY") == 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_identify(source); + } + else if (stricmp(cmd, "INVENTORY") == 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_inventory(source); + } + else if (stricmp(cmd, "LIST") == 0) { - notice(s_GameServ, source, "You must be a %S admin to use this command!"); - } - else + 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"); - 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); - } - } else if (stricmp(cmd, "PRINT") == 0) { - for (int x = 0; x < LEVELS; x++) - levels[x].monsters.print(); - } else if (stricmp(cmd, "RANDOM") == 0) { - 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))) + 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 :) } @@ -358,58 +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.c_str()); - - 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); + + 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); + buf, space, p->getDefense()); delete [] space; - - sprintf(buf, "Armor: %s", (ni->stats->getArmor() ? ni->stats->getArmor()->getName().c_str() : "Nothing")); + + sprintf(buf, "Armor: %s", (p->getArmor() ? p->getArmor()->getName().c_str() : "Nothing")); space = spaces(strlen(buf), " "); - log("got here 1"); + notice(s_GameServ, sender->getNick(), "%s%sWeapon: %s", buf, space, - (ni->stats->getWeapon() ? ni->stats->getWeapon()->getName().c_str() : "Fists")); - log("got here 2"); + (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; - showinventory(ni, ni); - } - else - { - notice(s_GameServ, u, "%s is not playing!", ni->stats->name.c_str()); - } + if (p->getClient() == sender || isAdmin(sender)) + { + showinventory(p, sender); + } + } + delete [] buf; } @@ -590,65 +661,80 @@ void do_check(char *u) 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_list(char *u) { - aClient *user; - char *cmd = strtok(NULL, " "); - - if (!(user = find(u))) + aClient *user; + Player *p; + char *cmd = strtok(NULL, " "); + + if (!(user = find(u))) { - log("Fatal Error: Couldn't find %s in the client list", 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. Command LIST", user->getNick()); - #endif - return; +#ifdef DEBUGMODE + log("Ignoring %s. Command LIST", user->getNick()); +#endif + return; } - - ListNode *temp; - bool header = false; + + list::iterator iter; + 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.c_str()); - #else - notice(s_GameServ, u, "IRC: %s Game: %s", temp->getData()->getNick(), - temp->getData()->stats->name.c_str()); - #endif - } - - temp = temp->Next(); + 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++; + } + } } - } - } - if (!header) + if (!header) notice(s_GameServ, u, "No one is playing"); - else - notice(s_GameServ, u, "End of List"); - + else + notice(s_GameServ, u, "End of List"); } + void do_set(char *u) { - aClient *user, *target; + aClient *user; + Player *p; char *name = strtok(NULL, " "); char *cmd = strtok(NULL, " "); char *cmd2; @@ -656,7 +742,7 @@ void do_set(char *u) if (!(user = find(u))) { notice(s_GameServ, u, "Fatal error. Cannot find aClient. "\ - "Buf: %s LOGOUT", u); + "Buf: %s LOGOUT", u); return; } else if (isIgnore(user)) @@ -666,983 +752,1007 @@ void do_set(char *u) #endif return; } - else if (!name) + else if (!name || !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; } - else if (!(target = findplayer(name))) + else if (!(p = findplayer(name))) { // Back the pointers up... they didn't send a name probably - cmd2= cmd; + cmd2 = cmd; cmd = name; - target = user; - + p = user->stats; + if (!is_playing(user)) - { - notice(s_GameServ, u, "You must be playing to set things for yourself!"); - return; - } + { + notice(s_GameServ, u, "You must be playing to set things for yourself!"); + return; + } } else { cmd2 = strtok(NULL, " "); } - + if (!cmd2) + { + 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 == target) - { - target->stats->setPassword(cmd2); - notice(s_GameServ, u, "Password successfully changed"); - } - else if (user != target && !isAdmin(user)) - { - notice(s_GameServ, u, "You must be a %S admin to set other peoples' passwords."); - return; - } + 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; + } } else if (stricmp(cmd, "BANK") == 0 || stricmp(cmd, "BALANCE") == 0) { - 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; - } - - target->stats->bank = stringtoint(cmd2); - - // Cheap bounds checking - if (target->stats->bank > 2000000000) - target->stats->bank = 2000000000; - else if (target->stats->bank < 0) - target->stats->bank *= -1; - - notice(s_GameServ, u, "Bank balance changed to %ld!", target->stats->bank); + 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 (stricmp(cmd, "PLAYER") == 0) { if (!isAdmin(user)) - { - notice(s_GameServ, u, "Admins Only!"); - return; - } + { + 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; - } - target->stats->player_fights = stringtoint(cmd2); - - if (target->stats->player_fights < 0) - target->stats->player_fights *= -1; - - notice(s_GameServ, u, "Player fights changed to %d!", target->stats->player_fights); - } + { + 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; - } + { + 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; - } + { + 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; - } - - target->stats->forest_fights = stringtoint(cmd2); - - if (target->stats->forest_fights < 0) - target->stats->forest_fights *= -1; - - notice(s_GameServ, u, "Forest fights changed to %d!", target->stats->forest_fights); - } + { + 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; + 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; + } } - target->stats->gold = stringtoint(cmd2); - - if (target->stats->gold > 2000000000) - target->stats->gold = 2000000000; - else if (target->stats->gold < 0) - target->stats->gold *= -1; - - notice(s_GameServ, u, "Gold set to %ld", target->stats->gold); - return; - } - } else if (stricmp(cmd, "STRENGTH") == 0 && stricmp(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; + 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; + } } - - target->stats->strength = stringtoint(cmd2); - - if (target->stats->strength < 0) - target->stats->strength *= -1; - - notice(s_GameServ, u, "Strength set to %d", target->stats->strength); - return; - } - } else if (stricmp(cmd, "DEFENSE") == 0 && stricmp(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; + 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; + } } - - target->stats->defense = stringtoint(cmd2); - - if (target->stats->defense < 0) - target->stats->defense *= -1; - - notice(s_GameServ, u, "Defense set to %d", target->stats->defense); - 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; + 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; + } } - target->stats->hp = stringtoint(cmd2); - - if (target->stats->hp < 0) - target->stats->hp *= -1; - - notice(s_GameServ, u, "HP set to %d", target->stats->hp); - 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; + 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; + } } - target->stats->maxhp = stringtoint(cmd2); - - if (target->stats->maxhp < 0) - target->stats->maxhp *= -1; - - notice(s_GameServ, u, "MaxHP set to %d", target->stats->maxhp); - 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; + 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; + } } - - target->stats->exp = stringtoint(cmd2); - - if (target->stats->exp > 2000000000) - target->stats->exp = 2000000000; - else if (target->stats->exp < 0) - target->stats->exp *= -1; - - notice(s_GameServ, u, "Exp set to %ld", target->stats->exp); - return; - } - } 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; + 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; + } } - target->stats->level = stringtoint(cmd2); - - if (target->stats->level < 0) - target->stats->level = 1; - else if (target->stats->level > REALLEVELS) - target->stats->level = REALLEVELS; - - notice(s_GameServ, u, "Level set to %d", target->stats->level); - return; - } - } else if (stricmp(cmd, "ALIVE") == 0) - { - if (!isAdmin(user)) { - notice(s_GameServ, u, "Admins Only!"); - return; - } - else - { - cmd2 = strtok(NULL, " "); - if (!cmd2 || (stricmp(cmd2, "TRUE") != 0 && stricmp(cmd2, "FALSE") != 0)) - { - notice(s_GameServ, u, "SYNTAX: /msg %S SET ALIVE TRUE|FALSE"); - return; - } - else if (stricmp(cmd2, "TRUE") == 0) - { - notice(s_GameServ, u, "%s has been Resurrected!", target->stats->name.c_str()); - setAlive(target->stats); - } + if (!isAdmin(user)) + { + notice(s_GameServ, u, "Admins Only!"); + return; + } else - { - notice(s_GameServ, u, "%s is now dead!", target->stats->name.c_str()); - clearAlive(target->stats); - } + { + 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; - } + { + 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; - } + { + notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] SEEN MASTER {TRUE|FALSE}"); + return; + } else - { - cmd2 = strtok(NULL, " "); - if (!cmd2 || (stricmp(cmd2, "TRUE") != 0 && stricmp(cmd2, "FALSE") != 0)) - { - notice(s_GameServ, u, "SYNTAX: /msg %S SET [NICK] SEEN MASTER {TRUE|FALSE}"); - return; - } - else if (stricmp(cmd2, "TRUE") == 0) - { - notice(s_GameServ, u, "%s has seen their master now.", target->stats->name.c_str()); - target->addFlag(FLAG_MASTER); - } - else - { - notice(s_GameServ, u, "%s has not seen their master now.", target->stats->name.c_str()); - target->remFlag(FLAG_MASTER); - } - } + { + 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; - } + { + 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; - char *name = strtok(NULL, " "); - - if (!(user = find(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; + 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)) + else if (isIgnore(user)) { - #ifdef DEBUGMODE - log("Ignoring %s.", user->getNick()); - #endif - return; +#ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); +#endif + return; } - - if (name) + + 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.c_str()); - logout(user); - } + 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) + 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); - } + 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); + } } } void logout(aClient *user) { - if (is_playing(user)) + if (user != NULL) { - ListNode *it; - aClient *temp; - unsigned long hv = iHASH((unsigned char *) user->stats->name.c_str()); - 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; + 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; - 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); } void do_register(char *u) { - char *password, *name; - aClient *user; - name = strtok(NULL, " "); - password = strtok(NULL, " "); - - if (!name) + char *password, *name; + aClient *user; + Player *p; + name = strtok(NULL, " "); + password = strtok(NULL, " "); + + if (!name) { - notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD"); + notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD"); } - else if (stricmp(name, s_GameServ) == 0) + else if (stricmp(name, s_GameServ) == 0) { - notice(s_GameServ, u, "You can't use %S as a name!"); - return; + notice(s_GameServ, u, "You can't use %S as a name!"); } - else if (!password) + else if (!password) { - notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD"); + notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD"); } - else if ((user = findplayer(name))) + else if (strlen(name) > maxnicklen) + { + notice(s_GameServ, u, "Name too long. Maximum length: %d", maxnicklen); + } + 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!"); + notice(s_GameServ, u, "%s is already registered!", name); + notice(s_GameServ, u, "Choose another name!"); } - else if (!(user = find(u))) + else if (!(user = find(u))) { - log("Fatal Error: Couldn't find %s in the clients list", u); + log("Fatal Error: Couldn't find %s in the clients list", u); } - 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 } - else + else { - if (!is_playing(user)) + if (!is_playing(user)) { - ListNode *temp; - item *tempItem; - user->stats = new Player(); - user->stats->client = user; // Set the backwards pointer - user->stats->reset(); // set the user up - user->stats->setPassword(password); - user->stats->name = name; - 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 - - // Update the last login time - user->stats->lastlogin = time(NULL); - - notice(s_GameServ, u, "Player %s registered with password %s.", user->stats->name.c_str(), 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.c_str()); - setPlaying(user); // set the playing flag - tempItem = findItemByID(3001); - user->stats->inventory->addItem((*Items.begin())); // Add the stick - user->stats->inventory->addItem(tempItem); // Add Clothes - } - else - { - notice(s_GameServ, u, "Already registered. Contact a %S admin for help."); - } + item *tempItem; + unsigned long hv = iHASH((unsigned char *) name); + + // First create the Player + user->stats = new Player(); + + // 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()); + + // Log the player in + setPlaying(user); + + // 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_identify(char *u) { - char *password, *name; - aClient *user, *p; - name = strtok(NULL, " "); - password = strtok(NULL, " "); - if (!password || !name) + char *password, *name; + aClient *user; + Player *p; + name = strtok(NULL, " "); + password = strtok(NULL, " "); + if (!password || !name) { - notice(s_GameServ, u, "SYNTAX: /msg %S IDENTIFY NAME PASSWORD"); + notice(s_GameServ, u, "SYNTAX: /msg %S IDENTIFY NAME PASSWORD"); } - else if (!(user = find(u))) + else if (!(user = find(u))) { - notice(s_GameServ, u, "Fatal error. Cannot find aClient. Buf: %s", strtok(NULL, "")); - log("Error: aClient not found: %s", u); + notice(s_GameServ, u, "Fatal error. Cannot find aClient. Buf: %s", strtok(NULL, "")); + log("Error: aClient not found: %s", u); } - 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 (!(p = findplayer(name)) || !p->stats) - notice(s_GameServ, u, "Player %s not found", name); - else if (is_playing(user)) + else if (!(p = findplayer(name))) + { + notice(s_GameServ, u, "Player %s not found", name); + } + else if (is_playing(user)) { - notice(s_GameServ, u, "You are already playing!"); + notice(s_GameServ, u, "You are already playing!"); } - else if (p->stats->client != NULL && !isAdmin(user)) + else if (is_playing(p->getClient()) && !isAdmin(user)) { - notice(s_GameServ, u, "That player has already identified."); + notice(s_GameServ, u, "That player has already identified."); } - else if (!check_password(name, password) && !isAdmin(user)) + else if (!check_password(name, password) && !isAdmin(user)) { - notice(s_GameServ, u, "Password incorrect"); + notice(s_GameServ, u, "Password incorrect"); } - else { - ListNode *temp; - unsigned long hv = iHASH((unsigned char *) p->stats->name.c_str()); - temp = players[hv].Find(p); - if (!temp) + else { - notice(s_GameServ, u, "Fatal error. Contact %S Admin. Buf: %s", - strtok(NULL, "")); - return; - } - 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); - + list::iterator iter; + unsigned long hv = iHASH((unsigned char *) p->getName().c_str()); - #ifdef DEBUGMODE - log("Player %s IRC: %s Identified", user->stats->name.c_str(), - user->getNick()); - #endif - - setPlaying(user); // set the playing flag + iter = find(players[hv].begin(), players[hv].end(), p); - temp->setPtr(user); - - // Update the last login time - user->stats->lastlogin = time(NULL); + 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); - notice(s_GameServ, u, "Password Accepted. Identified."); - showNews(u, todaysnews); + notice(s_GameServ, u, "Password Accepted. Identified."); + showNews(u, todaysnews); } } void do_stats(char *u) { - char *nick; - aClient *user; - - nick = strtok(NULL, " "); - - if (!(user = find(u))) + char *nick; + aClient *user; + + nick = strtok(NULL, " "); + + if (!(user = find(u))) { - log("Fatal Error: %s not found in client list", u); - return; + log("Fatal Error: %s not found 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 (!nick) + else if (!nick) { - if (!is_playing(user)) - { - notice(s_GameServ, u, "You're not playing, so you have no stats!"); - return; - } - else - { - updateTS(user->stats); - showstats(u, user->stats->name.c_str()); - } + 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 + else showstats(u, nick); } bool load_masters() { - ifstream infile(masterdata); - char *buf; - int l = 0; - buf = new char[1024]; - - if (infile.fail()) + ifstream infile(masterdata); + char *buf; + int l = 0; + buf = new char[1024]; + + if (infile.fail()) { - log("Error opening %s", masterdata); - return false; + log("Error opening %s", masterdata); + return false; } - - #ifdef DEBUGMODE - log("Loading masters from %s", masterdata); - #endif - - for (l = 0; l < LEVELS - 1; l++) + +#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] == '^') + 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, "~"); + + 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; + 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 + delete []buf; + + if (l < LEVELS - 1) // We didn't load a master for every level - check data/masters.dat return false; - else + else return true; } void delete_monsters() { - for (int x = 0; x < LEVELS; x++) - levels[x].monsters.deleteNodes(); + 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.c_str(), 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.c_str(), 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 && is_playing(user->stats->battle)) + 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; } bool dragon_fight(char *u) { - aClient *user; - if (!(user = find(u))) + aClient *user; + if (!(user = find(u))) return false; - else + else return dragon_fight(user); } bool dragon_fight(aClient *user) { - if (!is_playing(user)) + if (!is_playing(user)) return false; - else + else return (isDragonFight(user->stats)); } -void do_fight(char *u) -{ - aClient *ni, *battle; - char *nick = strtok(NULL, " "); +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; +} - if (!nick) - { - notice(s_GameServ, u, "SYNTAX: /msg %S FIGHT PLAYER"); - return; - } - else if (!(ni = find(u))) +void do_fight(char *u) +{ + aClient *ni; + Player *battle; + + char *nick = strtok(NULL, " "); + + if (!nick) { - notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, "")); - return; + notice(s_GameServ, u, "SYNTAX: /msg %S FIGHT PLAYER"); + return; } - else if (isIgnore(ni)) + else if (!(ni = find(u))) { - #ifdef DEBUGMODE - log("Ignoring %s.", ni->getNick()); - #endif - return; + notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, "")); + 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.c_str()); - display_players(u); + notice(s_GameServ, u, "You can't attack %s while they aren't playing!", nick); } -*/ - else if (stricmp(ni->stats->name.c_str(), battle->stats->name.c_str()) == 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.c_str(), battle->stats->battle->stats->name.c_str()); + 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.c_str()); + 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.c_str(), battle->stats->fight->name.c_str()); + 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.c_str()); - } - 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.c_str()); + // 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.c_str()); - notice(s_GameServ, battle->getNick(), "%s has challenged you to an online duel!", ni->stats->name.c_str()); - notice(s_GameServ, battle->getNick(), "%s gets to go first "\ - "because they initiated!", ni->stats->name.c_str()); - notice(s_GameServ, battle->getNick(), "Please wait while %s decides what to do.", ni->stats->name.c_str()); - 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_equip(char *u) @@ -1650,9 +1760,9 @@ void do_equip(char *u) aClient *user; pouch *p; itemContainer *equip; + int id; char *item = strtok(NULL, " "); - int id = stringtoint(item); if (!item || int(item[0]) < 48 || int(item[0] > 57)) { @@ -1677,237 +1787,277 @@ void do_equip(char *u) notice(s_GameServ, u, "You must be playing to equip weapons and armor!"); return; } - updateTS(user->stats); - p = user->stats->inventory; + id = stringtoint(item); + if (!is_fighting(user)) + updateTS(user->stats); + p = user->stats->inventory; - if (!(equip = p->Find(id))) + if (!(equip = p->Find(id))) { - if (!p->isEmpty()) - { - notice(s_GameServ, u, "You aren't carrying that item!"); - } - showinventory(user, user); + 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()); + 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); + // Use the item + notice(s_GameServ, u, "You equip %s.", equip->getItem()->getName().c_str()); + equip->use(user->stats); } } + void do_use(char *u) { - aClient *user; - pouch *p; - - char *item = strtok(NULL, " "); - int id = stringtoint(item); - itemContainer *used; - - if (!item || int(item[0]) < 48 || int(item[0]) > 57) + 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))) { - notice(s_GameServ, u, "SYNTAX: USE ####"); - notice(s_GameServ, u, "Type /msg %S HELP USE for more information."); - return; + notice(s_GameServ, u, "SYNTAX: USE ####"); + notice(s_GameServ, u, "Type /msg %S HELP USE 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_use. 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 use items!"); + return; } + id = stringtoint(item); + + if (!numuse) + { + num = 1; + } + else + { + num = stringtoint(numuse); + } + + updateTS(user->stats); + p = user->stats->inventory; + - updateTS(user->stats); - p = user->stats->inventory; - - - if (!(used = p->Find(id))) - { - if (!p->isEmpty()) - { - notice(s_GameServ, u, "You aren't carrying that item!"); - } - showinventory(user, 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 - 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); - } - + 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.c_str()); - 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.c_str()); - notice(s_GameServ, p->battle->getNick(), "%s ran away from you like a little baby!", p->name.c_str()); - 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.c_str()); + 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.c_str()); + 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)) + + if (!player_fight(user) && !master_fight(user)) + fight = user->stats->getMonster(); + else + fight = user->stats->getMaster(); + battle = user->stats->getBattle(); + + if (!player_fight(user)) { - // Opponent's Hit - mhit = (fight->strength / 2) + (rand() % (fight->strength / 2)) - (user->stats->defense); + // Opponent's Hit + mhit = (fight->strength / 2) + (rand() % (fight->strength / 2)) - (user->stats->getDefense()); } - else + else { - // Opponent's Hit - mhit = (battle->stats->strength / 2) + (rand() % (battle->stats->strength / 2)) - user->stats->defense; + // Opponent's Hit + mhit = (battle->stats->getStrength() / 2) + (rand() % (battle->stats->getStrength() / 2)) - user->stats->getDefense(); } - if (!player_fight(user)) + if (!player_fight(user)) { - - if (mhit > 0) + + if (mhit > 0) { - notice(s_GameServ, u, "%s attacks with their %s for %d damage!", - fight->name.c_str(), fight->weapon.c_str(), mhit); + notice(s_GameServ, u, "%s attacks with their %s for %d damage!", + fight->name.c_str(), fight->weapon.c_str(), mhit); } - else if (mhit <= 0) - notice(s_GameServ, u, "%s completely misses you!", fight->name.c_str()); - - if (mhit >= user->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(user)) + if (!master_fight(user)) { - 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->gold = 0; - user->stats->exp -= (long int)(user->stats->exp * .10); - user->stats->hp = 0; - user->stats->fight = NULL; - clearAlive(user->stats); - goto endturn; + 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", user->stats->master->name.c_str()); - user->stats->fight = NULL; - user->stats->master = NULL; - goto endturn; + 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 { - if (mhit > 0) - user->stats->hp -= mhit; - display_monster(u); - goto endturn; + if (mhit > 0) + user->stats->subtractHP(mhit); + display_monster(u); + goto endturn; } } - else + else { - clearYourTurn(user->stats); - setYourTurn(battle->stats); - display_players(battle); + clearYourTurn(user->stats); + setYourTurn(battle->stats); + display_players(battle); } -endturn: - delete nick; + 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; @@ -1934,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; @@ -1943,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] == '-') @@ -2012,73 +2162,73 @@ long int stringtoint(char *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) - { - log("Error opening %s", playerdata); - return 0; - } - - for (unsigned long x = 0; x < U_TABLE_SIZE; x++) - { - ptr = players[x].First(); - while(ptr) + list::iterator iter; + Player *it; + ofstream outfile; + + outfile.open(playerdata); + + if (!outfile) { - it = ptr->getData()->stats; - clearYourTurn(it); - item *w, *a; - w = it->getWeapon(); - a = it->getArmor(); - - outfile << it->name.c_str() << ' ' << it->level << ' ' << it->exp << ' ' << it->gold << ' ' << it->bank << ' '<< it->hp << ' ' << it->maxhp << ' ' << it->strength << ' ' << it->defense << ' ' << it->forest_fights << ' ' << it->player_fights << ' ' << it->getFlags() << ' ' << it->password << ' ' << 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; - ptr = ptr->Next(); + log("Error opening %s", playerdata); + return 0; } - } -outfile.close(); -return 1; + + 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() @@ -2142,6 +2292,52 @@ outfile.close(); return 1; } + +int load_store() +{ + 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; + } + + 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; @@ -2174,8 +2370,6 @@ int load_tavern() } tempItem.setItem(tempItem2); tempItem.setLevel(level); - - log("pushing item %s level %ld", tempItem2->getName().c_str(), level); tavern.push_back(tempItem); } } @@ -2194,168 +2388,166 @@ 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; + 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 (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); + } + } } - if(tempItem->setData(buf)) + catch (char *str) { - Items.push_back(tempItem); + log("Exception loading items: %s", str); + delete []buf; + return 0; } - } - } - catch (char *str) - { - log("Exception loading items: %s", str); - delete []buf; - return 0; - } } delete []buf; return 1; } + int load_gs_dbase() { - ifstream infile; - aClient *temp; - Player *p; - char *tempname, *buf, *password; - int tempnum; - buf = new char[100000]; - - infile.open(playerdata); - - if (infile.fail()) + 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; + log("Error opening %s", playerdata); + return 0; } - - for (int x = 0; x < U_TABLE_SIZE; x++) + + + for (int x = 0; x < U_TABLE_SIZE; x++) { - ListNode *tempNode; - tempNode = players[x].First(); - while (tempNode) + 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')) { - if (tempNode->getData()->stats->client) - logout(tempNode->getData()->stats->client); - tempNode = tempNode->Next(); + 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); } - players[x].deleteNodes(); - } - - while (infile.getline(buf, 100000, '\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->forest_fights = stringtoint(strtok(NULL, " ")); - p->player_fights = stringtoint(strtok(NULL, " ")); - p->setFlags(stringtoint(strtok(NULL, " "))); - - - - password = strtok(NULL, " "); - p->password = password; - temp->setNick("Not Playing"); -#ifdef P10 - temp->setRealNick("Not Playing"); -#endif - tempname = strtok(NULL, " "); - if (tempname) - p->lastlogin = stringtoint(tempname); - else - p->lastlogin = time(NULL); - - tempname = strtok(NULL, " "); - tempnum = stringtoint(tempname); - if (tempnum != 0) - { - p->setWeapon(*findItemByID(tempnum)); - } - tempname = strtok(NULL, " "); - tempnum = stringtoint(tempname); - - if (tempnum != 0) - { - p->setArmor(*findItemByID(tempnum)); - } - - - 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(); - - unsigned long hv = iHASH((unsigned char *) temp->stats->name.c_str()); - - temp->stats->client = NULL; - players[hv].insertAtBack(temp); - delete temp; - } - delete [] buf; - infile.close(); - return 1; + delete [] buf; + infile.close(); + return 1; } bool passcmp(const char *encrypted, char *plaintext) @@ -2382,32 +2574,33 @@ bool passcmp(const char *encrypted, char *plaintext) bool check_password(char *name, char *plaintext) { - aClient *client; + Player *p; - if (!(client = findplayer(name))) + if (!(p = findplayer(name))) return false; else { - return passcmp(client->stats->password.c_str(), plaintext); + return passcmp(p->getPassword().c_str(), plaintext); } } void do_store(char *u) { - /* + list::iterator item_iterator; + item *tempItem; char *cmd = strtok(NULL, " "); - char *item = strtok(NULL, " "); char *num = strtok(NULL, " "); char *space; - int wep; + int id; aClient *user; Player *p; - if (!cmd || !item) + + 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"); + notice(s_GameServ, u, " STORE SELL NUMBER"); + notice(s_GameServ, u, " STORE BUY NUMBER"); return; } else if (!(user = find(u))) @@ -2427,6 +2620,11 @@ void do_store(char *u) notice(s_GameServ, u, "You must be playing to use the store!"); return; } + else if (is_fighting(user)) + { + notice(s_GameServ, u, "You can't go to the store while fighting!"); + return; + } else if (!isAlive(user->stats)) { notice(s_GameServ, u, "You are dead. Wait until tomorrow to purchase weapons and armor!"); @@ -2436,222 +2634,180 @@ void do_store(char *u) if (stricmp(cmd, "LIST") == 0) { - if (stricmp(item, "WEAPONS") == 0) - { - notice(s_GameServ, u, "Welcome to Kain's Armory"); - notice(s_GameServ, u, "Here are the weapons we have available for the killing, sire:"); - for (int x = 1; x < WNA; x++) - { - 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->wea != 0) - notice(s_GameServ, u, "You have to sell your %s first!", weapons[p->wea]); - else if (p->gold < prices[wep - 1]) - notice(s_GameServ, u, "You don't have enough gold for %s!", weapons[wep]); - else - { - notice(s_GameServ, u, "You have purchased %s! Thanks for the gold!", weapons[wep]); - p->wea = wep; - p->gold -= prices[wep - 1]; - } - } - else if (stricmp(item, "ARMOR") == 0) - { - wep = stringtoint(num); - if (wep >= WNA || wep < 1) + 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, "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->arm != 0) - notice(s_GameServ, u, "You have to sell your %s first!", armors[p->arm]); - else if (p->gold < prices[wep - 1]) - notice(s_GameServ, u, "You don't have enough gold for %s!", armors[wep]); - else + 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, "You have purchased %s! Thanks for the gold!", armors[wep]); - p->arm = wep; - p->gold -= prices[wep - 1]; + 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 BUY {ARMOR | WEAPON} NUMBER"); - return; - } - } - else if (stricmp(cmd, "SELL" ) == 0) + + 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 (stricmp(item, "WEAPON") == 0) - { - if (p->wea == 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->wea = 0; - } - else if (2000000000 - p->gold < (prices[p->wea - 1] / 2)) - { - notice(s_GameServ, u, "Thank you for your business! You now have as much gold as you can carry."); - notice(s_GameServ, u, "However, you have no weapon... can I interest you in the %s?", weapons[WNA - 1]); - p->gold = 2000000000; - p->wea = 0; - } - else - { - notice(s_GameServ, u, "Thank you for your business! You now have %d more gold but no weapon!", (prices[p->wea - 1] / 2)); - p->gold += (prices[p->wea - 1] / 2); - p->wea = 0; - } - } - else if (stricmp(item, "ARMOR") == 0) - { - p = user->stats; + if (!num) + { + notice(s_GameServ, u, "SYNTAX: STORE BUY #"); + return; + } + else + { + id = stringtoint(num); + } - if (p->arm == 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->arm = 0; - } - else if (2000000000 - p->gold < (prices[p->arm - 1] / 2)) - { - notice(s_GameServ, u, "Thank you for your business! You now have as much gold as you can carry."); - notice(s_GameServ, u, "However, you have no armor... can I interest you in %s?", armors[WNA - 1]); - p->gold = 2000000000; - p->arm = 0; - } + 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, "Thank you for your business! You now have %d more gold but no armor!", - (prices[p->arm - 1] / 2)); - - p->gold += (prices[p->arm - 1] / 2); - p->arm = 0; - } - } - else - { - 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, "You can't carry any more!"); + } + } + else if (stricmp(cmd, "SELL" ) == 0) + { + 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 {ARMOR | WEAPON}"); - notice(s_GameServ, u, " STORE BUY {ARMOR | WEAPON} NUMBER"); + 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; - if (!to) - to = from; + if (!to || !from) + { + return; + } nick = to->getNick(); - if (is_playing(from)) - { - if (from->stats->inventory->isEmpty()) + if (from->inventory->isEmpty()) { notice(s_GameServ, nick, "You aren't carrying anything"); return; } - - list *items; - items = from->stats->inventory->getItems(); - - list ::iterator item_iter, item_iter2; - item_iter = items->begin(); - - notice(s_GameServ, nick, "Inventory for %s:", from->stats->name.c_str()); - long count; - while (item_iter != items->end()) + + 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; @@ -2659,23 +2815,23 @@ void showinventory(aClient *from, aClient *to) while (item_iter != items->end() && (*item_iter) == (*item_iter2)) { if ((*item_iter) == (*item_iter2)) - { - ++count; - } + { + ++count; + } else - { - break; - } + { + 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, " "); + aClient *user; Player *p; @@ -2720,42 +2876,77 @@ void do_tavern(char *u) } else if (stricmp(cmd, "BUY") == 0) { + int amt = 1; char *chid = strtok(NULL, " "); + char *amount = strtok(NULL, " "); + + if (amount) + amt = stringtoint(amount); if (!chid) - { - notice(s_GameServ, u, "SYNTAX: TAVERN BUY #"); - notice(s_GameServ, u, "Example: /msg %S TAVERN BUY 6001"); - return; - } + { + 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; + } long id = stringtoint(chid); tavernItem *tempItem; - if (!(tempItem = findTavernItemByID(id)) || user->stats->level < tempItem->getLevel()) - { - 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 if (user->stats->gold < 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 (user->stats->inventory->addItem(tempItem->getItem()) == NULL) - { - notice(s_GameServ, u, "You can't carry any more!"); - return; - } - notice(s_GameServ, u, "One %s coming right up!", tempItem->getItem()->getName().c_str()); - user->stats->gold -= tempItem->getItem()->price(); - } + if (!(tempItem = findTavernItemByID(id)) || user->stats->getLevel() < tempItem->getLevel()) + { + 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 if (!amount && user->stats->getGold() < 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 (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 { @@ -2767,382 +2958,381 @@ void do_tavern(char *u) 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))) + 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; + 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 (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 bank!"); - return; + notice(s_GameServ, u, "You must be playing to use the bank!"); + return; } - else if (is_fighting(user)) + else if (is_fighting(user)) { - notice(s_GameServ, u, "You can't go to the bank during a fight!"); - return; + notice(s_GameServ, u, "You can't go to the bank during a fight!"); + return; } - updateTS(user->stats); - if (stricmp(cmd, "BALANCE") == 0) + updateTS(user->stats); + if (stricmp(cmd, "BALANCE") == 0) { - showBankBalance(u); - return; + showBankBalance(u); + return; } - else if (!isAlive(user->stats)) + else if (!isAlive(user->stats)) { - notice(s_GameServ, u, "You are dead. We don't accept gold from dead folk! Wait 'til tomorrow!"); - return; + notice(s_GameServ, u, "You are dead. We don't accept gold from dead folk! Wait 'til tomorrow!"); + return; } - else if (!isstringnum(amount) && stricmp(amount, "ALL") != 0) + else if (!isstringnum(amount) && stricmp(amount, "ALL") != 0) { - notice(s_GameServ, u, "I don't know how to convert alphabet letters into currency, sire!"); - return; + notice(s_GameServ, u, "I don't know how to convert alphabet letters into currency, sire!"); + return; } - if (stringtoint(amount) < 0) + if (stringtoint(amount) < 0) { - notice(s_GameServ, u, "Sorry. This bank is not licensed "\ - "to handle such sums of cash, noble Lord."); - 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))) + 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 fight the dragon!"); - return; + notice(s_GameServ, u, "You must be playing to fight the dragon!"); + return; } - else if (is_fighting(user)) + 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, "You are already in a fight. How will you fight the almighty dragon!?"); + 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; } - else if (user->stats->level < LEVELS) + 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; + 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->fight = new Monster(dragon); - setDragonFight(p); - display_monster(u); + + 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 + 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->level - 1].master.name.c_str(), (need - p->exp)); - return; + 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) + 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->level - 1].master.name.c_str()); - else + 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->level - 1].master.name.c_str(), p->name.c_str()); - - return; + 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)) + + if (!is_fighting(user) && is_playing(user)) { - Player *p = user->stats; - p->master = new Monster(&levels[p->level - 1].master); - p->fight = p->master; - display_monster(u); // Since master is the same structure, use this function + 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 } } @@ -3151,26 +3341,26 @@ 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()) { - if (p->level < (*item_iterator).getLevel()) - { - item_iterator++; - continue; - } + 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++; @@ -3179,497 +3369,506 @@ void showTavern(aClient *user) 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; + + p = user->stats; + + if (!p) return; - - notice(s_GameServ, u, "Account Balance: %ld Gold On hand: %ld", p->bank, p->gold); - + + 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); - } - 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 + notice(s_GameServ, u, "Refreshing %s.", p->getName().c_str()); + refresh(p); } - } - 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) { - string *myname; + item *tempItem; - if (!p) + if (!p) return; - - myname = new string(p->name); - - p->reset(); - p->name = *myname; - delete myname; + + 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.c_str(), p->lastcommand); - #endif - p->lastcommand = time(NULL); - #ifdef DEBUGMODE - log("New timestamp for %s: %ld", p->name.c_str(), 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.c_str()); - - 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.c_str()); - 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.c_str()); - 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.c_str()); - 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 %ld 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 = findplayer(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))) { - notice(s_GameServ, u, "Resetting %s", user->stats->name.c_str()); - reset(user->stats); + 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++) + 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) - return false; + sprintf(filename, "data/levels/level%d.dat", x); + if (levels[x - 1].loadLevel(filename) == false) + { + delete []filename; + return false; + } } - - delete []filename; - return true; + + delete []filename; + return true; } + bool load_monsters() { - char *filename; - ifstream infile; - char *buf; - buf = new char[2048]; - + 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); - 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, "~"); + { + 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); - levels[level - 1].monsters.insertAtBack_RLN(temp); - delete temp; - } - delete [] filename; - infile.close(); - } - delete [] buf; -return true; + } + delete [] filename; + infile.close(); + } + delete [] buf; + return true; } item *findItemByID(int id) { list::iterator item_iterator; - + item_iterator = Items.begin(); - + while (item_iterator != Items.end()) { if ((*item_iterator)->getID() == id) - { - return (*item_iterator); - } + { + return (*item_iterator); + } + item_iterator++; + } + return NULL; +} + +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; @@ -3678,15 +3877,15 @@ item *findItemByID(int id) tavernItem *findTavernItemByID(int id) { list::iterator item_iterator; - + item_iterator = tavern.begin(); - + while (item_iterator != tavern.end()) { if ((*item_iterator).getItem()->getID() == id) - { - return &(*item_iterator); - } + { + return &(*item_iterator); + } item_iterator++; } return NULL;