X-Git-Url: https://jfr.im/git/irc/gameservirc.git/blobdiff_plain/ee38284faeb687ddbfccf352488654917902d387..6f727d4c9eb5c886f14598577f40da583577444e:/gameserv/gameserv.cpp diff --git a/gameserv/gameserv.cpp b/gameserv/gameserv.cpp index 1c6a600..164a90c 100644 --- a/gameserv/gameserv.cpp +++ b/gameserv/gameserv.cpp @@ -6,7 +6,11 @@ #include "sockhelp.h" #include -#include +#include + +using std::ifstream; +using std::ofstream; +using std::ios; #if defined(HAVE_CRYPT_H) @@ -18,8 +22,16 @@ #endif -List players; +// this will be hash.cpp start +// thank you wcampbel +unsigned long sHASH(const unsigned char *name); +unsigned long iHASH(const unsigned char *name); +List players[U_TABLE_SIZE]; +// this will be hash.cpp end + + Monster *monsters[LEVELS][MONSTERS]; // Monsters per level. Total = MONSTERS * LEVELS +Monster boss; // The boss monster Monster *masters[LEVELS]; // A master for each level @@ -36,7 +48,6 @@ int stricmp(const char *s1, const char *s2); int strnicmp(const char *s1, const char *s2, size_t len); // String Functions - /********** Password functions **********/ bool passcmp(char *encrypted, char *plaintext); // Compares an encrypted pass with a plain text one @@ -48,6 +59,11 @@ bool check_password(char *name, char *plaintext); // Finds a password for the gi /********** GameServ Booleans **********/ +bool shuttingdown; +bool timedOut(Player *p); +void updateTS(Player *p); +void timeOutEvent(Player *p); + bool is_playing(char *u); // True if the given nickname in the clients list is playing. bool is_playing(aClient *user); @@ -74,6 +90,7 @@ long int stringtoint(char *number); char *spaces(int len, char *seperator); void refresh(Player *p); void refreshall(); +void updateTS(Player *p); void reset(Player *p); void init_masters(); void init_monsters(); @@ -92,6 +109,7 @@ void do_inventory(char *u); void do_refresh(char *u); void do_register(char *u); void do_list(char *u); +void do_logout(char *u); void do_master(char *u); void do_play(char *u); void do_quitg(char *u); @@ -103,8 +121,9 @@ void do_tavern(char *u); void do_use(char *u); void see_master(char *u); +void logout(aClient *user); void showstats(const char *u, const char *nick); -void showinventory(aClient *from, aClient *to = NULL); +void showinventory(aClient *from, aClient *to); void showBankBalance(const char *u); void end_turn(aClient *user); @@ -117,12 +136,12 @@ char *weapons[WNA] = { "Fists", "Stick", "Dagger", "Quarterstaff", "Short Swor char *armors[WNA] = { "Nothing", "Clothes", "Leather Vest", "Chain Mail", "Plate Armor", "Full Body Armor", "Magic Mail", "Graphite Suit", "Steel Suit", "Force Field", "Armor of Light", "Mythril Vest", "DemiGod Armor", - "Hades' Cloak", "Dragon Scales", "Mystical Armor"}; + "Hades' Cloak", "Dragon Scales", "Adamantium"}; int prices[WNA - 1] = {200, 1000, 3000, 10000, 30000, 100000, 150000, 200000, 400000, 1000000, 4000000, 10000000, 40000000, 100000000, 400000000}; -int webonus[WNA] = {0, 10, 15, 25, 35, 45, 65, 85, 125, 185, 255, 355, 505, 805, 1205, 1805}; -int arbonus[WNA] = {0, 1, 3, 10, 15, 25, 35, 50, 75, 100, 150, 225, 300, 400, 600, 1000}; +int webonus[WNA] = {1, 10, 15, 25, 35, 45, 65, 85, 125, 185, 255, 355, 505, 805, 1205, 1805}; +int arbonus[WNA] = {1, 2, 4, 10, 15, 25, 35, 50, 75, 100, 150, 225, 300, 400, 600, 1000}; int hpbonus[11] = {10, 15, 20, 30, 50, 75, 125, 185, 250, 350, 550}; int strbonus[11] = {5, 7, 10, 12, 20, 35, 50, 75, 110, 150, 200}; @@ -130,20 +149,33 @@ int defbonus[11] = {2, 3, 5, 10, 15, 22, 35, 60, 80, 120, 150}; void gameserv(char *source, char *buf) { - char *cmd; + char *cmd, z; cmd = strtok(buf, " "); - source++; // Get rid of that : at the beginning of a :Nick privmsg Gameserv :text - cmd++; // Get rid of that : at the beginning of the :text (command) + #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) - cout << "Source: " << source << "\ncmd: " << cmd << endl; - long int mn = midnight() - 12 * 3600; // 12 noon ;) + #ifdef DEBUGMODE + log("Source: %s Command: %s", source, cmd); + #endif - if (mn > timestamp) + struct tm *tm; + time_t ti; + time(&ti); + tm = localtime(&ti); + + int curday = tm->tm_mday; + + if (curday != day) { refreshall(); - timestamp = mn; - save_timestamp(); + day = curday; + save_day(); // here i come to save the day! } if (strnicmp(cmd, "\1PING", 6) == 0) @@ -152,7 +184,7 @@ void gameserv(char *source, char *buf) 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 +devel\1", PACKAGE, VERSION); + notice(s_GameServ, source, "\1VERSION %s %s\1", PACKAGE, VERSION); } else if (stricmp(cmd, "SEARCH") == 0) { cmd = strtok(NULL, " "); @@ -187,22 +219,10 @@ void gameserv(char *source, char *buf) do_reset(source); } else if (stricmp(cmd, "TAVERN") == 0) { do_tavern(source); - } else if (stricmp(cmd, "PRINT") == 0) { - cout << "Printing Clients List: " << endl; - clients.print(); - cout << "\nPrinting Player List: " << endl; - players.print(); - cout << "\nPrinting Level 1 of monsters:" << endl; - for (int xx = 0; xx < 12; xx++) - { - cout << monsters[0][xx]->name << ' ' << -monsters[0][xx]->weapon << ' ' << monsters[0][xx]->hp << '/' << -monsters[0][xx]->maxhp << ' ' << -monsters[0][xx]->strength << ' ' << monsters[0][xx]->exp << ' ' << -monsters[0][xx]->gold << ' ' << monsters[0][xx]->death << endl; - } } else if (stricmp(cmd, "LIST") == 0) { do_list(source); + } else if (stricmp(cmd, "LOGOUT") == 0) { + do_logout(source); } else if (stricmp(cmd, "REGISTER") == 0) { do_register(source); } else if (stricmp(cmd, "IDENTIFY") == 0) { @@ -217,7 +237,7 @@ monsters[0][xx]->gold << ' ' << monsters[0][xx]->death << endl; if (!(user = find(source))) { notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin"); - cout << "Error: aClient not found: " << source << endl; + log("Error: aClient not found: %s", source); } else if (!isAdmin(user)) { @@ -226,7 +246,12 @@ monsters[0][xx]->gold << ' ' << monsters[0][xx]->death << endl; else { save_gs_dbase(); - raw("SQUIT %s :leaving", servername); + #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; @@ -234,7 +259,7 @@ monsters[0][xx]->gold << ' ' << monsters[0][xx]->death << endl; if (!(user = find(source))) { notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin"); - cout << "Error: aClient not found: " << source << endl; + log("Error: aClient not found: %s", source); } else if (!isAdmin(user)) { @@ -250,7 +275,7 @@ monsters[0][xx]->gold << ' ' << monsters[0][xx]->death << endl; if (!(user = find(source))) { notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin"); - cout << "Error: aClient not found: " << source << endl; + log("Error: aClient not found: %s", source); } else if (!isAdmin(user)) { @@ -272,13 +297,14 @@ monsters[0][xx]->gold << ' ' << monsters[0][xx]->death << endl; else display_help(source, cmd); } + #ifdef DEBUGMODE } else if (stricmp(cmd, "RAW") == 0) { aClient *user; if (!(user = find(source))) { notice(s_GameServ, source, "Error: aClient not found. Contact a %S admin"); - cout << "Error: aClient not found: " << source << endl; + log("Error: aClient not found: %s", source); } else if (!isAdmin(user)) { @@ -289,12 +315,29 @@ monsters[0][xx]->gold << ' ' << monsters[0][xx]->death << endl; char *rest = strtok(NULL, ""); raw("%s", rest); } + #endif } else { - notice(s_GameServ, source, "Unknown command \002%s\002. Type /msg %S \002HELP\002 to get a list of commands.", cmd); + 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); + } + } } - source--; // Bring the ':' back so we don't leak memory - cmd--; // Same thing :) + #ifndef P10 + source--; // Bring the ':' back so we don't leak memory + #endif + if (z == ':') + cmd--; // Same thing :) } int stricmp(const char *s1, const char *s2) @@ -404,8 +447,11 @@ void raw(const char *fmt, ...) } } + #ifdef DEBUGMODE + log("Input: %s", input); + #endif + sprintf(input, "%s%s", input, "\r\n"); - cout << "input: " << input << flush; sock_puts(sock, input); delete [] input; va_end(args); @@ -417,6 +463,22 @@ void notice(const char *source, const char *dest, const char *fmt, ...) if (fmt[0] == '\0') return; + char *commanduse; + commanduse = new char[16]; + + #ifdef P10 + if (isUsePrivmsg()) + strcpy(commanduse, "P"); + else + strcpy(commanduse, "N"); + #else + + if (isUsePrivmsg()) + strcpy(commanduse, "PRIVMSG"); + else + strcpy(commanduse, "NOTICE"); + #endif + va_list args; char *input; const char *t = fmt; @@ -425,11 +487,23 @@ void notice(const char *source, const char *dest, const char *fmt, ...) if (dest[0] == ':') { dest++; - sprintf(input, ":%s NOTICE %s :", source, dest); + + #if !defined(P10) + sprintf(input, ":%s %s %s :", source, commanduse, dest); + #else + sprintf(input, "%s %s %s :", gsnum, commanduse, dest); + #endif + dest--; } else - sprintf(input, ":%s NOTICE %s :", source, dest); + { + #if !defined(P10) + sprintf(input, ":%s %s %s :", source, commanduse, dest); + #else + sprintf(input, "%s %s %s :", gsnum, commanduse, dest); + #endif + } for (; *t; t++) { @@ -450,9 +524,12 @@ void notice(const char *source, const char *dest, const char *fmt, ...) } } + #ifdef DEBUGMODE + log("Input: %s", input); + #endif sprintf(input, "%s%s", input, "\r\n"); - cout << "input: " << input << flush; sock_puts(sock, input); + delete [] commanduse; delete [] input; va_end(args); } @@ -498,26 +575,143 @@ char *strtok(char *str, const char *delim) void do_list(char *u) { + aClient *user; + if (!(user = find(u))) + { + log("Fatal Error: Couldn't find %s in the client list", u); + return; + } + else if (isIgnore(user)) + { + #ifdef DEBUGMODE + log("Ignoring %s. Command LIST", user->getNick()); + #endif + return; + } + ListNode *temp; - temp = players.First(); - if (!players.isEmpty()) + bool header = false; + for (unsigned long x = 0; x < U_TABLE_SIZE; x++) + { + temp = players[x].First(); + if (!players[x].isEmpty()) { - notice(s_GameServ, u, "People Playing:"); + if (!header) + { + notice(s_GameServ, u, "People Playing:"); + header = true; + } while(temp) { - notice(s_GameServ, u, "IRC: %s Game: %s", temp->getData()->getNick(), temp->getData()->stats->name); + #ifdef P10 + notice(s_GameServ, u, "IRC: %s Game: %s", temp->getData()->getRealNick(), + temp->getData()->stats->name); + #else + notice(s_GameServ, u, "IRC: %s Game: %s", temp->getData()->getNick(), + temp->getData()->stats->name); + #endif + temp = temp->Next(); } + } + } + if (!header) + notice(s_GameServ, u, "No one is playing"); + else notice(s_GameServ, u, "End of List"); + +} + +void do_logout(char *u) +{ + aClient *user; + 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); + } + else if (isIgnore(user)) + { + #ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); + #endif + return; + } + else 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, "No one is playing"); + { + 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)) + { + ListNode *it; + aClient *temp; + unsigned long hv = iHASH((unsigned char *) user->stats->name); + it = players[hv].Find(user); + + if (!it) + { + notice(s_GameServ, user->getNick(), "Fatal error. Contact "\ + "%S Admin. Cannot find you in the players list."); + log("Error on logout(). Can't find %s in the players list", + #ifdef P10 + user->getRealNick() + #else + user->getNick() + #endif + ); + return; + } + + temp = new aClient; + temp->stats = new Player; + temp->stats->setData(user->stats); + user->stats->client = NULL; + + if (player_fight(user)) + user->stats->battle->stats->battle = NULL; + + delete user->stats; + user->stats = NULL; + temp->stats->client = NULL; + #ifdef P10 + temp->setRealNick("Not Playing"); + #endif + temp->setNick("Not Playing"); + + it->setNewPtr(temp); + #ifdef DEBUGMODE + log("Logged out player %s", + #ifdef P10 + user->getRealNick() + #else + user->getNick() + #endif + ); + #endif + } + clearPlaying(user); } void do_register(char *u) { - char *password; - aClient *user, *p; + char *password, *name; + aClient *user; + name = strtok(NULL, " "); password = strtok(NULL, " "); static char saltChars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./"; @@ -527,21 +721,49 @@ void do_register(char *u) salt[1] = saltChars[rand() % strlen(saltChars)]; salt[2] = '\0'; - if (!password) + if (!name) { - notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER PASSWORD"); + notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD"); } - else if ((user = find(u))) + else if (!password) { - p = findplayer(u); - if (!user->stats && !p) + notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD"); + } + else if ((user = findplayer(name))) + { + notice(s_GameServ, u, "%s is already registered!", name); + notice(s_GameServ, u, "Choose another name!"); + } + else if (!(user = find(u))) + { + log("Fatal Error: Couldn't find %s in the clients list", u); + } + else if (isIgnore(user)) + { + #ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); + #endif + return; + } + else + { + if (!is_playing(user)) { + ListNode *temp; user->stats = new Player(user); - user->stats->user = user; // Set the backwards pointer - strcpy(user->stats->password, crypt(password, salt)); - players.insertAtBack(user); + user->stats->client = user; // Set the backwards pointer + user->stats->reset(); // set the user up + strncpy(user->stats->password, crypt(password, salt), 255); + strncpy(user->stats->name, name, 255); + unsigned long hv = iHASH((unsigned char *) name); + updateTS(user->stats); + temp = players[hv].insertAtBack_RLN(user); + temp->setPtr(user); // This is an extra step, but necessary for now + notice(s_GameServ, u, "Player %s registered with password %s.", user->stats->name, password); notice(s_GameServ, u, "Write this password down. If you lose it, there is no way to retrieve it!"); + log("Nickname %s registered player %s.", u, user->stats->name); + setPlaying(user); // set the playing flag } else { @@ -556,50 +778,64 @@ void do_identify(char *u) aClient *user, *p; name = strtok(NULL, " "); password = strtok(NULL, " "); - user = find(u); if (!password || !name) { notice(s_GameServ, u, "SYNTAX: /msg %S IDENTIFY NAME PASSWORD"); } - else if (!user) - notice(s_GameServ, u, "Fatal error. Cannot find aClient. Buf: %s", strtok(NULL, "")); + 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); + } + else if (isIgnore(user)) + { + #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)) + { + notice(s_GameServ, u, "You are already playing!"); + } + else if (p->stats->client != NULL && !isAdmin(user)) + { + notice(s_GameServ, u, "That player has already identified."); + } else if (!check_password(name, password) && !isAdmin(user)) { notice(s_GameServ, u, "Password incorrect"); } - else - { - if (p->stats->user && !isAdmin(user)) + else { + ListNode *temp; + unsigned long hv = iHASH((unsigned char *) p->stats->name); + temp = players[hv].Find(p); + if (!temp) { - notice(s_GameServ, u, "That player has already identified."); + notice(s_GameServ, u, "Fatal error. Contact %S Admin. Buf: %s", + strtok(NULL, "")); return; } - if (!user->stats) - { - ListNode *temp; - temp = players.Find(p); - if (!temp) - { - notice(s_GameServ, u, "Fatal error. Contact %S Admin. Buf: %s", - strtok(NULL, "")); - return; - } - user->stats = new Player(p->stats->name); - cout << "Setting data for identified" << endl; - user->stats->setData(p->stats); - cout << "Player Identified" << endl << flush; + 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); - temp->setPtr(user); - notice(s_GameServ, u, "Password Accepted. Identified."); + #ifdef DEBUGMODE + log("Player %s IRC: %s Identified", user->stats->name, + user->getNick()); + #endif - } - else - { - notice(s_GameServ, u, "Already identified. Contact a %S admin for help."); - } + setPlaying(user); // set the playing flag + + temp->setPtr(user); + notice(s_GameServ, u, "Password Accepted. Identified."); } } @@ -610,34 +846,53 @@ void do_stats(char *u) nick = strtok(NULL, " "); - if (!nick) + if (!(user = find(u))) { - if (!(user = find(u))) - { - notice(s_GameServ, u, "Fatal Error in do_stats(). Contact a %S admin for help!"); - return; - } - else if (!is_playing(user)) + log("Fatal Error: %s not found in client list", u); + return; + } + else if (isIgnore(user)) + { + #ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); + #endif + return; + } + else if (!nick) + { + if (!is_playing(user)) { notice(s_GameServ, u, "You're not playing, so you have no stats!"); return; } else + { + updateTS(user->stats); showstats(u, user->stats->name); + } } else showstats(u, nick); } + void init_masters() { + #ifdef DEBUGMODE + log("Calling delete_masters()"); + #endif + delete_masters(); + #ifdef DEBUGMODE + log("Initializing masters"); + #endif + for (int x = 0; x < LEVELS; x++) masters[x] = new Monster; strcpy(masters[0]->name, "Old Bones"); strcpy(masters[0]->weapon, "Dull Sword Cane"); - masters[0]->strength = 15; + masters[0]->strength = 25; masters[0]->gold = 0; masters[0]->exp = 0; masters[0]->maxhp = 30; @@ -646,7 +901,7 @@ void init_masters() strcpy(masters[1]->name, "Master Chang"); strcpy(masters[1]->weapon, "Nanchaku"); - masters[1]->strength = 30; + masters[1]->strength = 35; masters[1]->gold = 0; masters[1]->exp = 0; masters[1]->maxhp = 40; @@ -655,7 +910,7 @@ void init_masters() strcpy(masters[2]->name, "Chuck Norris"); strcpy(masters[2]->weapon, "Ranger Kick"); - masters[2]->strength = 85; + masters[2]->strength = 95; masters[2]->gold = 0; masters[2]->exp = 0; masters[2]->maxhp = 70; @@ -665,7 +920,7 @@ void init_masters() strcpy(masters[3]->name, "Mr. Miagi"); strcpy(masters[3]->weapon, "Petrified Bonsai"); - masters[3]->strength = 100; + masters[3]->strength = 130; masters[3]->gold = 0; masters[3]->exp = 0; masters[3]->maxhp = 120; @@ -674,7 +929,7 @@ void init_masters() strcpy(masters[4]->name, "Jackie Chan"); strcpy(masters[4]->weapon, "Kung Fu Kick"); - masters[4]->strength = 125; + masters[4]->strength = 145; masters[4]->gold = 0; masters[4]->exp = 0; masters[4]->maxhp = 200; @@ -683,7 +938,7 @@ void init_masters() strcpy(masters[5]->name, "Jet Li"); strcpy(masters[5]->weapon, "Motorcycle"); - masters[5]->strength = 150; + masters[5]->strength = 170; masters[5]->gold = 0; masters[5]->exp = 0; masters[5]->maxhp = 400; @@ -693,7 +948,7 @@ void init_masters() strcpy(masters[6]->name, "Muhammad Ali"); strcpy(masters[6]->weapon, "Quick Jab"); - masters[6]->strength = 175; + masters[6]->strength = 195; masters[6]->gold = 0; masters[6]->exp = 0; masters[6]->maxhp = 600; @@ -702,7 +957,7 @@ void init_masters() strcpy(masters[7]->name, "Li Mu Bai"); strcpy(masters[7]->weapon, "Green Destiny"); - masters[7]->strength = 200; + masters[7]->strength = 220; masters[7]->gold = 0; masters[7]->exp = 0; masters[7]->maxhp = 800; @@ -712,7 +967,7 @@ void init_masters() strcpy(masters[8]->name, "Jimmy Wang Yu"); strcpy(masters[8]->weapon, "Flying Guillotine"); - masters[8]->strength = 275; + masters[8]->strength = 285; masters[8]->gold = 0; masters[8]->exp = 0; masters[8]->maxhp = 1200; @@ -721,7 +976,7 @@ void init_masters() strcpy(masters[9]->name, "Wong Fei Hung"); strcpy(masters[9]->weapon, "Drunken Boxing"); - masters[9]->strength = 350; + masters[9]->strength = 375; masters[9]->gold = 0; masters[9]->exp = 0; masters[9]->maxhp = 1800; @@ -730,7 +985,7 @@ void init_masters() strcpy(masters[10]->name, "Bruce Lee"); strcpy(masters[10]->weapon, "Fists of fury"); - masters[10]->strength = 575; + masters[10]->strength = 590; masters[10]->gold = 0; masters[10]->exp = 0; masters[10]->maxhp = 2500; @@ -740,1168 +995,15 @@ void init_masters() void init_monsters() { + #ifdef DEBUGMODE + log("Calling delete_monsters"); + #endif + delete_monsters(); + for (int x = 0; x < LEVELS; x++) for (int y = 0; y < MONSTERS; y++) monsters[x][y] = new Monster(); - - // Hard coded for now - Kain -/* - - strcpy(monsters[0][0]->name, "Slime"); - strcpy(monsters[0][0]->weapon, "Acid Goo"); - monsters[0][0]->strength = 6; - monsters[0][0]->gold = 50; - monsters[0][0]->exp = 3; - monsters[0][0]->maxhp = 9; - strcpy(monsters[0][0]->death, "The slime oozes into nothing... you clean the acid goo off of your weapon"); - - strcpy(monsters[0][1]->name, "Ghost"); - strcpy(monsters[0][1]->weapon, "Cold Breath"); - monsters[0][1]->strength = 8; - monsters[0][1]->gold = 100; - monsters[0][1]->exp = 10; - monsters[0][1]->maxhp = 10; - strcpy(monsters[0][1]->death, "You feel a chill as the spirit leaves the realm."); - - strcpy(monsters[0][2]->name, "Ugly Rodent"); - strcpy(monsters[0][2]->weapon, "Sharp Teeth"); - monsters[0][2]->strength = 9; - monsters[0][2]->gold = 75; - monsters[0][2]->exp = 8; - monsters[0][2]->maxhp = 13; - strcpy(monsters[0][2]->death, "You stomp on the Ugly Rodent's remains for a finishing blow."); - - strcpy(monsters[0][3]->name, "Whart Hog"); - strcpy(monsters[0][3]->weapon, "Tusks"); - monsters[0][3]->strength = 10; - monsters[0][3]->gold = 80; - monsters[0][3]->exp = 6; - monsters[0][3]->maxhp = 10; - strcpy(monsters[0][3]->death, "You cook and eat the hog for good measure!"); - - strcpy(monsters[0][4]->name, "Pesky Kid"); - strcpy(monsters[0][4]->weapon, "Slingshot"); - monsters[0][4]->strength = 8; - monsters[0][4]->gold = 30; - monsters[0][4]->exp = 4; - monsters[0][4]->maxhp = 6; - strcpy(monsters[0][4]->death, "You take his slingshot and snap the band, sending the kid crying home to mom!"); - - strcpy(monsters[0][5]->name, "Playground Bully"); - strcpy(monsters[0][5]->weapon, "Painful Noogie"); - monsters[0][5]->strength = 11; - monsters[0][5]->gold = 44; - monsters[0][5]->exp = 6; - monsters[0][5]->maxhp = 10; - strcpy(monsters[0][5]->death, "You give him an indian burn, and punt him across the schoolyard!"); - - strcpy(monsters[0][6]->name, "Small Imp"); - strcpy(monsters[0][6]->weapon, "Dagger"); - monsters[0][6]->strength = 6; - monsters[0][6]->gold = 64; - monsters[0][6]->exp = 10; - monsters[0][6]->maxhp = 10; - strcpy(monsters[0][6]->death, "You can't help but laugh as he stumbles and falls onto his own dagger!"); - - strcpy(monsters[0][7]->name, "Little Monkey"); - strcpy(monsters[0][7]->weapon, "Monkey Wrench"); - monsters[0][7]->strength = 6; - monsters[0][7]->gold = 53; - monsters[0][7]->exp = 9; - monsters[0][7]->maxhp = 9; - strcpy(monsters[0][7]->death, "You want to cook it, but you just can't think of eating something that looks so human!"); - - strcpy(monsters[0][8]->name, "Grub Worm"); - strcpy(monsters[0][8]->weapon, "Minor Nudge"); - monsters[0][8]->strength = 2; - monsters[0][8]->gold = 10; - monsters[0][8]->exp = 3; - monsters[0][8]->maxhp = 3; - strcpy(monsters[0][8]->death, "You decide to save the poor little fella for your next fishing trip."); - - strcpy(monsters[0][9]->name, "Drakee"); - strcpy(monsters[0][9]->weapon, "Tail Slap"); - monsters[0][9]->strength = 5; - monsters[0][9]->gold = 22; - monsters[0][9]->exp = 7; - monsters[0][9]->maxhp = 5; - strcpy(monsters[0][9]->death, "You pull the little Drakee by its tale and slam it down on a dry stump!"); - - strcpy(monsters[0][10]->name, "Fat Slob"); - strcpy(monsters[0][10]->weapon, "Smelly Breath"); - monsters[0][10]->strength = 6; - monsters[0][10]->gold = 40; - monsters[0][10]->exp = 10; - monsters[0][10]->maxhp = 7; - strcpy(monsters[0][10]->death, "You kick his stomach for fun, and are thrown back by the spring of it all!"); - - strcpy(monsters[0][11]->name, "Lost Warrior"); - strcpy(monsters[0][11]->weapon, "Long Sword"); - monsters[0][11]->strength = 10; - monsters[0][11]->gold = 250; - monsters[0][11]->exp = 19; - monsters[0][11]->maxhp = 15; - strcpy(monsters[0][11]->death, "You give him a proper burial in respect for the dead warrior."); - - strcpy(monsters[1][0]->name, "Lost Warrior's Cousin Larry"); - strcpy(monsters[1][0]->weapon, "Wood Axe"); - monsters[1][0]->strength = 19; - monsters[1][0]->gold = 134; - monsters[1][0]->exp = 24; - monsters[1][0]->maxhp = 30; - strcpy(monsters[1][0]->death, "He was pretty pissed you killed his cousin, but he seems to have suffered the same fate!"); - - strcpy(monsters[1][1]->name, "Sandman"); - strcpy(monsters[1][1]->weapon, "Sleeping Dust"); - monsters[1][1]->strength = 25; - monsters[1][1]->gold = 80; - monsters[1][1]->exp = 6; - monsters[1][1]->maxhp = 27; - strcpy(monsters[1][1]->death, "You put the sandman to his final sleep."); - - strcpy(monsters[1][2]->name, "Dirty Prostitute"); - strcpy(monsters[1][2]->weapon, "Stiletto Heel"); - monsters[1][2]->strength = 21; - monsters[1][2]->gold = 160; - monsters[1][2]->exp = 12; - monsters[1][2]->maxhp = 25; - strcpy(monsters[1][2]->death, "Your pimp hand is strong!"); - - strcpy(monsters[1][3]->name, "Goblin Gardener"); - strcpy(monsters[1][3]->weapon, "Garden Spade"); - monsters[1][3]->strength = 18; - monsters[1][3]->gold = 130; - monsters[1][3]->exp = 8; - monsters[1][3]->maxhp = 20; - strcpy(monsters[1][3]->death, "You trample on his garden after slaying him... that felt good!"); - - strcpy(monsters[1][4]->name, "Evil Elf"); - strcpy(monsters[1][4]->weapon, "Dark Bow"); - monsters[1][4]->strength = 23; - monsters[1][4]->gold = 136; - monsters[1][4]->exp = 13; - monsters[1][4]->maxhp = 24; - strcpy(monsters[1][4]->death, "Elves are usually nice you thought... hmm."); - - strcpy(monsters[1][5]->name, "Viking Warrior"); - strcpy(monsters[1][5]->weapon, "Broad Sword"); - monsters[1][5]->strength = 21; - monsters[1][5]->gold = 330; - monsters[1][5]->exp = 20; - monsters[1][5]->maxhp = 18; - strcpy(monsters[1][5]->death, "You heard vikings were big, but not THAT big you thought."); - - strcpy(monsters[1][6]->name, "Wicked Witch"); - strcpy(monsters[1][6]->weapon, "Cackling Laugh"); - monsters[1][6]->strength = 20; - monsters[1][6]->gold = 130; - monsters[1][6]->exp = 20; - monsters[1][6]->maxhp = 26; - strcpy(monsters[1][6]->death, "Just for kicks, you splash some water on her and watch her melt."); - - strcpy(monsters[1][7]->name, "Vampire Bat"); - strcpy(monsters[1][7]->weapon, "Blood Sucking Fangs"); - monsters[1][7]->strength = 18; - monsters[1][7]->gold = 125; - monsters[1][7]->exp = 21; - monsters[1][7]->maxhp = 29; - strcpy(monsters[1][7]->death, "You fry up the bat and eat it... needs garlic."); - - strcpy(monsters[1][8]->name, "Thorn Bush"); - strcpy(monsters[1][8]->weapon, "101 Thorns"); - monsters[1][8]->strength = 16; - monsters[1][8]->gold = 94; - monsters[1][8]->exp = 15; - monsters[1][8]->maxhp = 25; - strcpy(monsters[1][8]->death, "You set the bush ablaze and roast some marshmallows."); - - strcpy(monsters[1][9]->name, "Barbarian"); - strcpy(monsters[1][9]->weapon, "Heavy Sword"); - monsters[1][9]->strength = 29; - monsters[1][9]->gold = 250; - monsters[1][9]->exp = 25; - monsters[1][9]->maxhp = 30; - strcpy(monsters[1][9]->death, "You listen to him moan as he falls over dead."); - - strcpy(monsters[1][10]->name, "Crypt Rat"); - strcpy(monsters[1][10]->weapon, "Stinging Bite"); - monsters[1][10]->strength = 25; - monsters[1][10]->gold = 119; - monsters[1][10]->exp = 20; - monsters[1][10]->maxhp = 26; - strcpy(monsters[1][10]->death, "You squash the little rodent for fear that it might not be dead."); - - strcpy(monsters[1][11]->name, "Small Orc"); - strcpy(monsters[1][11]->weapon, "blade"); - monsters[1][11]->strength = 28; - monsters[1][11]->gold = 300; - monsters[1][11]->exp = 30; - monsters[1][11]->maxhp = 36; - strcpy(monsters[1][11]->death, "It's an ugly one, and it would've grown up to be a terror..."); - - strcpy(monsters[2][0]->name, "Teferi"); - strcpy(monsters[2][0]->weapon, "Puzzle Box"); - monsters[2][0]->strength = 29; - monsters[2][0]->gold = 380; - monsters[2][0]->exp = 18; - monsters[2][0]->maxhp = 29; - strcpy(monsters[2][0]->death, "It was a puzzling experience."); - - strcpy(monsters[2][1]->name, "Spineless Thug"); - strcpy(monsters[2][1]->weapon, "Spiked Bat"); - monsters[2][1]->strength = 37; - monsters[2][1]->gold = 384; - monsters[2][1]->exp = 27; - monsters[2][1]->maxhp = 32; - strcpy(monsters[2][1]->death, "See you at the crossroads!"); - - strcpy(monsters[2][2]->name, "Pyromaniac"); - strcpy(monsters[2][2]->weapon, "Flame Thrower"); - monsters[2][2]->strength = 29; - monsters[2][2]->gold = 563; - monsters[2][2]->exp = 22; - monsters[2][2]->maxhp = 45; - strcpy(monsters[2][2]->death, "He chants FIRE FIRE as he falls to the ground... a burning heap of flesh."); - - strcpy(monsters[2][3]->name, "Evil Enchantress"); - strcpy(monsters[2][3]->weapon, "Deadly Spell"); - monsters[2][3]->strength = 50; - monsters[2][3]->gold = 830; - monsters[2][3]->exp = 35; - monsters[2][3]->maxhp = 35; - strcpy(monsters[2][3]->death, "She looked just about as good as she fought."); - - strcpy(monsters[2][4]->name, "Killer Leprechaun"); - strcpy(monsters[2][4]->weapon, "Gold Rush"); - monsters[2][4]->strength = 35; - monsters[2][4]->gold = 1300; - monsters[2][4]->exp = 30; - monsters[2][4]->maxhp = 37; - strcpy(monsters[2][4]->death, "You steal his pot of gold... that's a lot of money!"); - - strcpy(monsters[2][5]->name, "Avalanche Rider"); - strcpy(monsters[2][5]->weapon, "Huge Snowball"); - monsters[2][5]->strength = 32; - monsters[2][5]->gold = 700; - monsters[2][5]->exp = 32; - monsters[2][5]->maxhp = 38; - strcpy(monsters[2][5]->death, "You take his snowboard and snap it in two!"); - - strcpy(monsters[2][6]->name, "Blundering Idiot"); - strcpy(monsters[2][6]->weapon, "Stupidity"); - monsters[2][6]->strength = 14; - monsters[2][6]->gold = 700; - monsters[2][6]->exp = 20; - monsters[2][6]->maxhp = 29; - strcpy(monsters[2][6]->death, "Now there's one person you don't feel sorry for killing!"); - - strcpy(monsters[2][7]->name, "Militant Anarchist"); - strcpy(monsters[2][7]->weapon, "Molotov Cocktail"); - monsters[2][7]->strength = 33; - monsters[2][7]->gold = 245; - monsters[2][7]->exp = 45; - monsters[2][7]->maxhp = 32; - strcpy(monsters[2][7]->death, "Order has been restored for now..."); - - strcpy(monsters[2][8]->name, "Scathe Zombies"); - strcpy(monsters[2][8]->weapon, "Death Grip"); - monsters[2][8]->strength = 38; - monsters[2][8]->gold = 763; - monsters[2][8]->exp = 15; - monsters[2][8]->maxhp = 45; - strcpy(monsters[2][8]->death, "That was perhaps the scariest experience of your life."); - - strcpy(monsters[2][9]->name, "Spitting Llama"); - strcpy(monsters[2][9]->weapon, "Spit Spray"); - monsters[2][9]->strength = 48; - monsters[2][9]->gold = 638; - monsters[2][9]->exp = 28; - monsters[2][9]->maxhp = 34; - strcpy(monsters[2][9]->death, "You wipe the spit off your face and fling it back at the Llama."); - - strcpy(monsters[2][10]->name, "Juggalo"); - strcpy(monsters[2][10]->weapon, "Clown Axe"); - monsters[2][10]->strength = 60; - monsters[2][10]->gold = 650; - monsters[2][10]->exp = 30; - monsters[2][10]->maxhp = 29; - strcpy(monsters[2][10]->death, "What is a Juggalo? I don't know!"); - - strcpy(monsters[2][11]->name, "The Boogie Man"); - strcpy(monsters[2][11]->weapon, "Striking Fear"); - monsters[2][11]->strength = 46; - monsters[2][11]->gold = 600; - monsters[2][11]->exp = 35; - monsters[2][11]->maxhp = 27; - strcpy(monsters[2][11]->death, "He's scared you for the very last time!"); - - strcpy(monsters[3][0]->name, "Living Fire"); - strcpy(monsters[3][0]->weapon, "Scorching Wind"); - monsters[3][0]->strength = 55; - monsters[3][0]->gold = 1100; - monsters[3][0]->exp = 36; - monsters[3][0]->maxhp = 55; - strcpy(monsters[3][0]->death, "You extinguish the Living Flame once and for all!"); - - strcpy(monsters[3][1]->name, "Raging Orc"); - strcpy(monsters[3][1]->weapon, "Orcish Artillary"); - monsters[3][1]->strength = 89; - monsters[3][1]->gold = 900; - monsters[3][1]->exp = 25; - monsters[3][1]->maxhp = 50; - strcpy(monsters[3][1]->death, "This orc was a bit tougher than you remembered!"); - - strcpy(monsters[3][2]->name, "Huge Tarantula"); - strcpy(monsters[3][2]->weapon, "Tangling Web"); - monsters[3][2]->strength = 59; - monsters[3][2]->gold = 1000; - monsters[3][2]->exp = 35; - monsters[3][2]->maxhp = 60; - strcpy(monsters[3][2]->death, "You're glad you overcame your arachniphobia so soon!"); - - strcpy(monsters[3][3]->name, "Rabid Wolf"); - strcpy(monsters[3][3]->weapon, "Cujo Bite"); - monsters[3][3]->strength = 40; - monsters[3][3]->gold = 1200; - monsters[3][3]->exp = 47; - monsters[3][3]->maxhp = 76; - strcpy(monsters[3][3]->death, "The mutt falls over dead as white foam drips from its deadly canines..."); - - strcpy(monsters[3][4]->name, "Goblin Fighter"); - strcpy(monsters[3][4]->weapon, "Morning Star"); - monsters[3][4]->strength = 38; - monsters[3][4]->gold = 700; - monsters[3][4]->exp = 30; - monsters[3][4]->maxhp = 75; - strcpy(monsters[3][4]->death, "He almost caught you with his chain mace, but you sliced off his head."); - - strcpy(monsters[3][5]->name, "Grizzly Bear"); - strcpy(monsters[3][5]->weapon, "Razor Claws"); - monsters[3][5]->strength = 68; - monsters[3][5]->gold = 1747; - monsters[3][5]->exp = 81; - monsters[3][5]->maxhp = 51; - strcpy(monsters[3][5]->death, "It almost got you this time... better be careful"); - - strcpy(monsters[3][6]->name, "Skeleton Man"); - strcpy(monsters[3][6]->weapon, "Leg Bone"); - monsters[3][6]->strength = 70; - monsters[3][6]->gold = 597; - monsters[3][6]->exp = 57; - monsters[3][6]->maxhp = 60; - strcpy(monsters[3][6]->death, "As a finisher, you wind up with the broad side of your weapon and hit his skull off for a home run!"); - - strcpy(monsters[3][7]->name, "Young Werewolf"); - strcpy(monsters[3][7]->weapon, "Howling Bites"); - monsters[3][7]->strength = 75; - monsters[3][7]->gold = 1742; - monsters[3][7]->exp = 65; - monsters[3][7]->maxhp = 42; - strcpy(monsters[3][7]->death, "You scatter the wolf's body parts in hopes he will stay dead!"); - - strcpy(monsters[3][8]->name, "Dark Infantry"); - strcpy(monsters[3][8]->weapon, "Flesh Reaper"); - monsters[3][8]->strength = 69; - monsters[3][8]->gold = 870; - monsters[3][8]->exp = 43; - monsters[3][8]->maxhp = 65; - strcpy(monsters[3][8]->death, "Light has prevailed this time... but it's only so long before you meet again."); - - strcpy(monsters[3][9]->name, "Erie Spirit"); - strcpy(monsters[3][9]->weapon, "Deadly Grin"); - monsters[3][9]->strength = 63; - monsters[3][9]->gold = 1300; - monsters[3][9]->exp = 32; - monsters[3][9]->maxhp = 50; - strcpy(monsters[3][9]->death, "His cousin the ghost was a little bit easier."); - - strcpy(monsters[3][10]->name, "Gollum"); - strcpy(monsters[3][10]->weapon, "Precious Treasure"); - monsters[3][10]->strength = 66; - monsters[3][10]->gold = 1492; - monsters[3][10]->exp = 73; - monsters[3][10]->maxhp = 54; - strcpy(monsters[3][10]->death, "Gollum screams out \"MY PRECIOUS\" as his small body falls limp from your blow."); - - strcpy(monsters[3][11]->name, "Rock Fighter"); - strcpy(monsters[3][11]->weapon, "Small Boulders"); - monsters[3][11]->strength = 87; - monsters[3][11]->gold = 1742; - monsters[3][11]->exp = 99; - monsters[3][11]->maxhp = 65; - strcpy(monsters[3][11]->death, "You dodge his last rock, and counter with a low blow, cutting off his legs."); - - - strcpy(monsters[4][0]->name, "Giant Sphinx"); - strcpy(monsters[4][0]->weapon, "Ancient Curse"); - monsters[4][0]->strength = 120; - monsters[4][0]->gold = 1000; - monsters[4][0]->exp = 100; - monsters[4][0]->maxhp = 80; - strcpy(monsters[4][0]->death, "You look in awe at the great wonder, collapsed at your feet!"); - - strcpy(monsters[4][1]->name, "Giant Ogre"); - strcpy(monsters[4][1]->weapon, "Big Log"); - monsters[4][1]->strength = 130; - monsters[4][1]->gold = 857; - monsters[4][1]->exp = 175; - monsters[4][1]->maxhp = 100; - strcpy(monsters[4][1]->death, "Your wits outmatched the ogre's brawn... big dumb thing."); - - strcpy(monsters[4][2]->name, "Massive Cockroach"); - strcpy(monsters[4][2]->weapon, "Piercing Hiss"); - monsters[4][2]->strength = 125; - monsters[4][2]->gold = 700; - monsters[4][2]->exp = 150; - monsters[4][2]->maxhp = 112; - strcpy(monsters[4][2]->death, "Where's the exterminator when you need one?"); - - strcpy(monsters[4][3]->name, "Big Venomous Snake"); - strcpy(monsters[4][3]->weapon, "Poison Fangs"); - monsters[4][3]->strength = 140; - monsters[4][3]->gold = 900; - monsters[4][3]->exp = 175; - monsters[4][3]->maxhp = 126; - strcpy(monsters[4][3]->death, "After killing this beast you check for puncture marks... you find none, luckily."); - - strcpy(monsters[4][4]->name, "Lizard Man"); - strcpy(monsters[4][4]->weapon, "Deadly Jaws"); - monsters[4][4]->strength = 145; - monsters[4][4]->gold = 1250; - monsters[4][4]->exp = 175; - monsters[4][4]->maxhp = 150; - strcpy(monsters[4][4]->death, "His scales made for tough armor, and his jaws for a tougher opponent!"); - - strcpy(monsters[4][5]->name, "Face Dancer"); - strcpy(monsters[4][5]->weapon, "Illusion Scyth"); - monsters[4][5]->strength = 138; - monsters[4][5]->gold = 1603; - monsters[4][5]->exp = 198; - monsters[4][5]->maxhp = 173; - strcpy(monsters[4][5]->death, "His carcus takes the shape of many things before it dies. His true form is so repulsive, you know why he changed faces so much!"); - - strcpy(monsters[4][6]->name, "Darklord Longbow Archer"); - strcpy(monsters[4][6]->weapon, "Deadly Bow and Arrows"); - monsters[4][6]->strength = 145; - monsters[4][6]->gold = 1569; - monsters[4][6]->exp = 243; - monsters[4][6]->maxhp = 170; - strcpy(monsters[4][6]->death, "Your face turns white with horror after you realize you just met the devil's protector!"); - - strcpy(monsters[4][7]->name, "Hell's Paladin"); - strcpy(monsters[4][7]->weapon, "Sword of Hellfire"); - monsters[4][7]->strength = 200; - monsters[4][7]->gold = 2191; - monsters[4][7]->exp = 254; - monsters[4][7]->maxhp = 175; - strcpy(monsters[4][7]->death, "This is starting to get tough you think. Do you really want to go to level 6?"); - - strcpy(monsters[4][8]->name, "The Unknown Soldier"); - strcpy(monsters[4][8]->weapon, "Soul Torture"); - monsters[4][8]->strength = 175; - monsters[4][8]->gold = 1890; - monsters[4][8]->exp = 200; - monsters[4][8]->maxhp = 180; - strcpy(monsters[4][8]->death, "Who was that? Where was he from? And what was that weapon??"); - - strcpy(monsters[4][9]->name, "Undead Cult Leader"); - strcpy(monsters[4][9]->weapon, "Lance of Deceit"); - monsters[4][9]->strength = 180; - monsters[4][9]->gold = 1792; - monsters[4][9]->exp = 195; - monsters[4][9]->maxhp = 190; - strcpy(monsters[4][9]->death, "His words fall on deaf ears... this is one cult you will NOT be part of!"); - - strcpy(monsters[4][10]->name, "Water Serpent"); - strcpy(monsters[4][10]->weapon, "Forked Tongue"); - monsters[4][10]->strength = 150; - monsters[4][10]->gold = 1500; - monsters[4][10]->exp = 176; - monsters[4][10]->maxhp = 220; - strcpy(monsters[4][10]->death, "The serpent squeals as you cut off its head!"); - - strcpy(monsters[4][11]->name, "Silverback Gorilla"); - strcpy(monsters[4][11]->weapon, "Deadly Banana Peel"); - monsters[4][11]->strength = 160; - monsters[4][11]->gold = 1300; - monsters[4][11]->exp = 150; - monsters[4][11]->maxhp = 178; - strcpy(monsters[4][11]->death, "Was that gorilla or guerilla?"); - - strcpy( monsters[5][0]->name, ""); - strcpy( monsters[5][0]->weapon, ""); - monsters[5][0]->strength = 200; - monsters[5][0]->gold = 2500; - monsters[5][0]->exp = 200; - monsters[5][0]->maxhp = 200; - strcpy( monsters[5][0]->death, ""); - - strcpy( monsters[5][1]->name, ""); - strcpy( monsters[5][1]->weapon, ""); - monsters[5][1]->strength = 230; - monsters[5][1]->gold = 3215; - monsters[5][1]->exp = 230; - monsters[5][1]->maxhp = 210; - strcpy( monsters[5][1]->death, ""); - - strcpy( monsters[5][2]->name, ""); - strcpy( monsters[5][2]->weapon, ""); - monsters[5][2]->strength = 215; - monsters[5][2]->gold = 2750; - monsters[5][2]->exp = 245; - monsters[5][2]->maxhp = 214; - strcpy( monsters[5][2]->death, ""); - - strcpy( monsters[5][3]->name, "Cheap Bastard"); - strcpy( monsters[5][3]->weapon, "Sack of Pennies"); - monsters[5][3]->strength = 245; - monsters[5][3]->gold = 1000; - monsters[5][3]->exp = 195; - monsters[5][3]->maxhp = 200; - strcpy( monsters[5][3]->death, "You hear him scream, \"MY COINS!!\" as you run off with his sack."); - - strcpy( monsters[5][4]->name, ""); - strcpy( monsters[5][4]->weapon, ""); - monsters[5][4]->strength = 300; - monsters[5][4]->gold = 4500; - monsters[5][4]->exp = 375; - monsters[5][4]->maxhp = 221; - strcpy( monsters[5][4]->death, ""); - - strcpy( monsters[5][5]->name, ""); - strcpy( monsters[5][5]->weapon, ""); - monsters[5][5]->strength = 1; - monsters[5][5]->gold = 1; - monsters[5][5]->exp = 1; - monsters[5][5]->maxhp = 1; - strcpy( monsters[5][5]->death, ""); - - strcpy( monsters[5][6]->name, ""); - strcpy( monsters[5][6]->weapon, ""); - monsters[5][6]->strength = 1; - monsters[5][6]->gold = 1; - monsters[5][6]->exp = 1; - monsters[5][6]->maxhp = 1; - strcpy( monsters[5][6]->death, ""); - - strcpy( monsters[5][7]->name, ""); - strcpy( monsters[5][7]->weapon, ""); - monsters[5][7]->strength = 1; - monsters[5][7]->gold = 1; - monsters[5][7]->exp = 1; - monsters[5][7]->maxhp = 1; - strcpy( monsters[5][7]->death, ""); - - strcpy( monsters[5][8]->name, ""); - strcpy( monsters[5][8]->weapon, ""); - monsters[5][8]->strength = 1; - monsters[5][8]->gold = 1; - monsters[5][8]->exp = 1; - monsters[5][8]->maxhp = 1; - strcpy( monsters[5][8]->death, ""); - - strcpy( monsters[5][9]->name, ""); - strcpy( monsters[5][9]->weapon, ""); - monsters[5][9]->strength = 1; - monsters[5][9]->gold = 1; - monsters[5][9]->exp = 1; - monsters[5][9]->maxhp = 1; - strcpy( monsters[5][9]->death, ""); - - strcpy( monsters[5][10]->name, ""); - strcpy( monsters[5][10]->weapon, ""); - monsters[5][10]->strength = 1; - monsters[5][10]->gold = 1; - monsters[5][10]->exp = 1; - monsters[5][10]->maxhp = 1; - strcpy( monsters[5][10]->death, ""); - - strcpy( monsters[5][11]->name, ""); - strcpy( monsters[5][11]->weapon, ""); - monsters[5][11]->strength = 1; - monsters[5][11]->gold = 1; - monsters[5][11]->exp = 1; - monsters[5][11]->maxhp = 1; - strcpy( monsters[5][11]->death, ""); - - strcpy( monsters[6][0]->name, ""); - strcpy( monsters[6][0]->weapon, ""); - monsters[6][0]->strength = 1; - monsters[6][0]->gold = 1; - monsters[6][0]->exp = 1; - monsters[6][0]->maxhp = 1; - strcpy( monsters[6][0]->death, ""); - - strcpy( monsters[6][1]->name, ""); - strcpy( monsters[6][1]->weapon, ""); - monsters[6][1]->strength = 1; - monsters[6][1]->gold = 1; - monsters[6][1]->exp = 1; - monsters[6][1]->maxhp = 1; - strcpy( monsters[6][1]->death, ""); - - strcpy( monsters[6][2]->name, ""); - strcpy( monsters[6][2]->weapon, ""); - monsters[6][2]->strength = 1; - monsters[6][2]->gold = 1; - monsters[6][2]->exp = 1; - monsters[6][2]->maxhp = 1; - strcpy( monsters[6][2]->death, ""); - - strcpy( monsters[6][3]->name, ""); - strcpy( monsters[6][3]->weapon, ""); - monsters[6][3]->strength = 1; - monsters[6][3]->gold = 1; - monsters[6][3]->exp = 1; - monsters[6][3]->maxhp = 1; - strcpy( monsters[6][3]->death, ""); - - strcpy( monsters[6][4]->name, ""); - strcpy( monsters[6][4]->weapon, ""); - monsters[6][4]->strength = 1; - monsters[6][4]->gold = 1; - monsters[6][4]->exp = 1; - monsters[6][4]->maxhp = 1; - strcpy( monsters[6][4]->death, ""); - - strcpy( monsters[6][5]->name, ""); - strcpy( monsters[6][5]->weapon, ""); - monsters[6][5]->strength = 1; - monsters[6][5]->gold = 1; - monsters[6][5]->exp = 1; - monsters[6][5]->maxhp = 1; - strcpy( monsters[6][5]->death, ""); - - strcpy( monsters[6][6]->name, ""); - strcpy( monsters[6][6]->weapon, ""); - monsters[6][6]->strength = 1; - monsters[6][6]->gold = 1; - monsters[6][6]->exp = 1; - monsters[6][6]->maxhp = 1; - strcpy( monsters[6][6]->death, ""); - - strcpy( monsters[6][7]->name, ""); - strcpy( monsters[6][7]->weapon, ""); - monsters[6][7]->strength = 1; - monsters[6][7]->gold = 1; - monsters[6][7]->exp = 1; - monsters[6][7]->maxhp = 1; - strcpy( monsters[6][7]->death, ""); - - strcpy( monsters[6][8]->name, ""); - strcpy( monsters[6][8]->weapon, ""); - monsters[6][8]->strength = 1; - monsters[6][8]->gold = 1; - monsters[6][8]->exp = 1; - monsters[6][8]->maxhp = 1; - strcpy( monsters[6][8]->death, ""); - - strcpy( monsters[6][9]->name, ""); - strcpy( monsters[6][9]->weapon, ""); - monsters[6][9]->strength = 1; - monsters[6][9]->gold = 1; - monsters[6][9]->exp = 1; - monsters[6][9]->maxhp = 1; - strcpy( monsters[6][9]->death, ""); - - strcpy( monsters[6][10]->name, ""); - strcpy( monsters[6][10]->weapon, ""); - monsters[6][10]->strength = 1; - monsters[6][10]->gold = 1; - monsters[6][10]->exp = 1; - monsters[6][10]->maxhp = 1; - strcpy( monsters[6][10]->death, ""); - - strcpy( monsters[6][11]->name, ""); - strcpy( monsters[6][11]->weapon, ""); - monsters[6][11]->strength = 1; - monsters[6][11]->gold = 1; - monsters[6][11]->exp = 1; - monsters[6][11]->maxhp = 1; - strcpy( monsters[6][11]->death, ""); - - strcpy( monsters[7][0]->name, ""); - strcpy( monsters[7][0]->weapon, ""); - monsters[7][0]->strength = 1; - monsters[7][0]->gold = 1; - monsters[7][0]->exp = 1; - monsters[7][0]->maxhp = 1; - strcpy( monsters[7][0]->death, ""); - - strcpy( monsters[7][1]->name, ""); - strcpy( monsters[7][1]->weapon, ""); - monsters[7][1]->strength = 1; - monsters[7][1]->gold = 1; - monsters[7][1]->exp = 1; - monsters[7][1]->maxhp = 1; - strcpy( monsters[7][1]->death, ""); - - strcpy( monsters[7][2]->name, ""); - strcpy( monsters[7][2]->weapon, ""); - monsters[7][2]->strength = 1; - monsters[7][2]->gold = 1; - monsters[7][2]->exp = 1; - monsters[7][2]->maxhp = 1; - strcpy( monsters[7][2]->death, ""); - - strcpy( monsters[7][3]->name, ""); - strcpy( monsters[7][3]->weapon, ""); - monsters[7][3]->strength = 1; - monsters[7][3]->gold = 1; - monsters[7][3]->exp = 1; - monsters[7][3]->maxhp = 1; - strcpy( monsters[7][3]->death, ""); - - strcpy( monsters[7][4]->name, ""); - strcpy( monsters[7][4]->weapon, ""); - monsters[7][4]->strength = 1; - monsters[7][4]->gold = 1; - monsters[7][4]->exp = 1; - monsters[7][4]->maxhp = 1; - strcpy( monsters[7][4]->death, ""); - - strcpy( monsters[7][5]->name, ""); - strcpy( monsters[7][5]->weapon, ""); - monsters[7][5]->strength = 1; - monsters[7][5]->gold = 1; - monsters[7][5]->exp = 1; - monsters[7][5]->maxhp = 1; - strcpy( monsters[7][5]->death, ""); - - strcpy( monsters[7][6]->name, ""); - strcpy( monsters[7][6]->weapon, ""); - monsters[7][6]->strength = 1; - monsters[7][6]->gold = 1; - monsters[7][6]->exp = 1; - monsters[7][6]->maxhp = 1; - strcpy( monsters[7][6]->death, ""); - - strcpy( monsters[7][7]->name, ""); - strcpy( monsters[7][7]->weapon, ""); - monsters[7][7]->strength = 1; - monsters[7][7]->gold = 1; - monsters[7][7]->exp = 1; - monsters[7][7]->maxhp = 1; - strcpy( monsters[7][7]->death, ""); - - strcpy( monsters[7][8]->name, ""); - strcpy( monsters[7][8]->weapon, ""); - monsters[7][8]->strength = 1; - monsters[7][8]->gold = 1; - monsters[7][8]->exp = 1; - monsters[7][8]->maxhp = 1; - strcpy( monsters[7][8]->death, ""); - - strcpy( monsters[7][9]->name, ""); - strcpy( monsters[7][9]->weapon, ""); - monsters[7][9]->strength = 1; - monsters[7][9]->gold = 1; - monsters[7][9]->exp = 1; - monsters[7][9]->maxhp = 1; - strcpy( monsters[7][9]->death, ""); - - strcpy( monsters[7][10]->name, ""); - strcpy( monsters[7][10]->weapon, ""); - monsters[7][10]->strength = 1; - monsters[7][10]->gold = 1; - monsters[7][10]->exp = 1; - monsters[7][10]->maxhp = 1; - strcpy( monsters[7][10]->death, ""); - - strcpy( monsters[7][11]->name, ""); - strcpy( monsters[7][11]->weapon, ""); - monsters[7][11]->strength = 1; - monsters[7][11]->gold = 1; - monsters[7][11]->exp = 1; - monsters[7][11]->maxhp = 1; - strcpy( monsters[7][11]->death, ""); - - strcpy( monsters[8][0]->name, ""); - strcpy( monsters[8][0]->weapon, ""); - monsters[8][0]->strength = 1; - monsters[8][0]->gold = 1; - monsters[8][0]->exp = 1; - monsters[8][0]->maxhp = 1; - strcpy( monsters[8][0]->death, ""); - - strcpy( monsters[8][1]->name, ""); - strcpy( monsters[8][1]->weapon, ""); - monsters[8][1]->strength = 1; - monsters[8][1]->gold = 1; - monsters[8][1]->exp = 1; - monsters[8][1]->maxhp = 1; - strcpy( monsters[8][1]->death, ""); - - strcpy( monsters[8][2]->name, ""); - strcpy( monsters[8][2]->weapon, ""); - monsters[8][2]->strength = 1; - monsters[8][2]->gold = 1; - monsters[8][2]->exp = 1; - monsters[8][2]->maxhp = 1; - strcpy( monsters[8][2]->death, ""); - - strcpy( monsters[8][3]->name, ""); - strcpy( monsters[8][3]->weapon, ""); - monsters[8][3]->strength = 1; - monsters[8][3]->gold = 1; - monsters[8][3]->exp = 1; - monsters[8][3]->maxhp = 1; - strcpy( monsters[8][3]->death, ""); - - strcpy( monsters[8][4]->name, ""); - strcpy( monsters[8][4]->weapon, ""); - monsters[8][4]->strength = 1; - monsters[8][4]->gold = 1; - monsters[8][4]->exp = 1; - monsters[8][4]->maxhp = 1; - strcpy( monsters[8][4]->death, ""); - - strcpy( monsters[8][5]->name, ""); - strcpy( monsters[8][5]->weapon, ""); - monsters[8][5]->strength = 1; - monsters[8][5]->gold = 1; - monsters[8][5]->exp = 1; - monsters[8][5]->maxhp = 1; - strcpy( monsters[8][5]->death, ""); - - strcpy( monsters[8][6]->name, ""); - strcpy( monsters[8][6]->weapon, ""); - monsters[8][6]->strength = 1; - monsters[8][6]->gold = 1; - monsters[8][6]->exp = 1; - monsters[8][6]->maxhp = 1; - strcpy( monsters[8][6]->death, ""); - - strcpy( monsters[8][7]->name, ""); - strcpy( monsters[8][7]->weapon, ""); - monsters[8][7]->strength = 1; - monsters[8][7]->gold = 1; - monsters[8][7]->exp = 1; - monsters[8][7]->maxhp = 1; - strcpy( monsters[8][7]->death, ""); - - strcpy( monsters[8][8]->name, ""); - strcpy( monsters[8][8]->weapon, ""); - monsters[8][8]->strength = 1; - monsters[8][8]->gold = 1; - monsters[8][8]->exp = 1; - monsters[8][8]->maxhp = 1; - strcpy( monsters[8][8]->death, ""); - - strcpy( monsters[8][9]->name, ""); - strcpy( monsters[8][9]->weapon, ""); - monsters[8][9]->strength = 1; - monsters[8][9]->gold = 1; - monsters[8][9]->exp = 1; - monsters[8][9]->maxhp = 1; - strcpy( monsters[8][9]->death, ""); - - strcpy( monsters[8][10]->name, ""); - strcpy( monsters[8][10]->weapon, ""); - monsters[8][10]->strength = 1; - monsters[8][10]->gold = 1; - monsters[8][10]->exp = 1; - monsters[8][10]->maxhp = 1; - strcpy( monsters[8][10]->death, ""); - - strcpy( monsters[8][11]->name, ""); - strcpy( monsters[8][11]->weapon, ""); - monsters[8][11]->strength = 1; - monsters[8][11]->gold = 1; - monsters[8][11]->exp = 1; - monsters[8][11]->maxhp = 1; - strcpy( monsters[8][11]->death, ""); - - strcpy( monsters[9][0]->name, ""); - strcpy( monsters[9][0]->weapon, ""); - monsters[9][0]->strength = 1; - monsters[9][0]->gold = 1; - monsters[9][0]->exp = 1; - monsters[9][0]->maxhp = 1; - strcpy( monsters[9][0]->death, ""); - - strcpy( monsters[9][1]->name, ""); - strcpy( monsters[9][1]->weapon, ""); - monsters[9][1]->strength = 1; - monsters[9][1]->gold = 1; - monsters[9][1]->exp = 1; - monsters[9][1]->maxhp = 1; - strcpy( monsters[9][1]->death, ""); - - strcpy( monsters[9][2]->name, ""); - strcpy( monsters[9][2]->weapon, ""); - monsters[9][2]->strength = 1; - monsters[9][2]->gold = 1; - monsters[9][2]->exp = 1; - monsters[9][2]->maxhp = 1; - strcpy( monsters[9][2]->death, ""); - - strcpy( monsters[9][3]->name, ""); - strcpy( monsters[9][3]->weapon, ""); - monsters[9][3]->strength = 1; - monsters[9][3]->gold = 1; - monsters[9][3]->exp = 1; - monsters[9][3]->maxhp = 1; - strcpy( monsters[9][3]->death, ""); - - strcpy( monsters[9][4]->name, ""); - strcpy( monsters[9][4]->weapon, ""); - monsters[9][4]->strength = 1; - monsters[9][4]->gold = 1; - monsters[9][4]->exp = 1; - monsters[9][4]->maxhp = 1; - strcpy( monsters[9][4]->death, ""); - - strcpy( monsters[9][5]->name, ""); - strcpy( monsters[9][5]->weapon, ""); - monsters[9][5]->strength = 1; - monsters[9][5]->gold = 1; - monsters[9][5]->exp = 1; - monsters[9][5]->maxhp = 1; - strcpy( monsters[9][5]->death, ""); - - strcpy( monsters[9][6]->name, ""); - strcpy( monsters[9][6]->weapon, ""); - monsters[9][6]->strength = 1; - monsters[9][6]->gold = 1; - monsters[9][6]->exp = 1; - monsters[9][6]->maxhp = 1; - strcpy( monsters[9][6]->death, ""); - - strcpy( monsters[9][7]->name, ""); - strcpy( monsters[9][7]->weapon, ""); - monsters[9][7]->strength = 1; - monsters[9][7]->gold = 1; - monsters[9][7]->exp = 1; - monsters[9][7]->maxhp = 1; - strcpy( monsters[9][7]->death, ""); - - strcpy( monsters[9][8]->name, ""); - strcpy( monsters[9][8]->weapon, ""); - monsters[9][8]->strength = 1; - monsters[9][8]->gold = 1; - monsters[9][8]->exp = 1; - monsters[9][8]->maxhp = 1; - strcpy( monsters[9][8]->death, ""); - - strcpy( monsters[9][9]->name, ""); - strcpy( monsters[9][9]->weapon, ""); - monsters[9][9]->strength = 1; - monsters[9][9]->gold = 1; - monsters[9][9]->exp = 1; - monsters[9][9]->maxhp = 1; - strcpy( monsters[9][9]->death, ""); - - strcpy( monsters[9][10]->name, ""); - strcpy( monsters[9][10]->weapon, ""); - monsters[9][10]->strength = 1; - monsters[9][10]->gold = 1; - monsters[9][10]->exp = 1; - monsters[9][10]->maxhp = 1; - strcpy( monsters[9][10]->death, ""); - - strcpy( monsters[9][11]->name, ""); - strcpy( monsters[9][11]->weapon, ""); - monsters[9][11]->strength = 1; - monsters[9][11]->gold = 1; - monsters[9][11]->exp = 1; - monsters[9][11]->maxhp = 1; - strcpy( monsters[9][11]->death, ""); - - strcpy( monsters[10][0]->name, ""); - strcpy( monsters[10][0]->weapon, ""); - monsters[10][0]->strength = 1; - monsters[10][0]->gold = 1; - monsters[10][0]->exp = 1; - monsters[10][0]->maxhp = 1; - strcpy( monsters[10][0]->death, ""); - - strcpy( monsters[10][1]->name, ""); - strcpy( monsters[10][1]->weapon, ""); - monsters[10][1]->strength = 1; - monsters[10][1]->gold = 1; - monsters[10][1]->exp = 1; - monsters[10][1]->maxhp = 1; - strcpy( monsters[10][1]->death, ""); - - strcpy( monsters[10][2]->name, ""); - strcpy( monsters[10][2]->weapon, ""); - monsters[10][2]->strength = 1; - monsters[10][2]->gold = 1; - monsters[10][2]->exp = 1; - monsters[10][2]->maxhp = 1; - strcpy( monsters[10][2]->death, ""); - - strcpy( monsters[10][3]->name, ""); - strcpy( monsters[10][3]->weapon, ""); - monsters[10][3]->strength = 1; - monsters[10][3]->gold = 1; - monsters[10][3]->exp = 1; - monsters[10][3]->maxhp = 1; - strcpy( monsters[10][3]->death, ""); - - strcpy( monsters[10][4]->name, ""); - strcpy( monsters[10][4]->weapon, ""); - monsters[10][4]->strength = 1; - monsters[10][4]->gold = 1; - monsters[10][4]->exp = 1; - monsters[10][4]->maxhp = 1; - strcpy( monsters[10][4]->death, ""); - - strcpy( monsters[10][5]->name, ""); - strcpy( monsters[10][5]->weapon, ""); - monsters[10][5]->strength = 1; - monsters[10][5]->gold = 1; - monsters[10][5]->exp = 1; - monsters[10][5]->maxhp = 1; - strcpy( monsters[10][5]->death, ""); - - strcpy( monsters[10][6]->name, ""); - strcpy( monsters[10][6]->weapon, ""); - monsters[10][6]->strength = 1; - monsters[10][6]->gold = 1; - monsters[10][6]->exp = 1; - monsters[10][6]->maxhp = 1; - strcpy( monsters[10][6]->death, ""); - - strcpy( monsters[10][7]->name, ""); - strcpy( monsters[10][7]->weapon, ""); - monsters[10][7]->strength = 1; - monsters[10][7]->gold = 1; - monsters[10][7]->exp = 1; - monsters[10][7]->maxhp = 1; - strcpy( monsters[10][7]->death, ""); - - strcpy( monsters[10][8]->name, ""); - strcpy( monsters[10][8]->weapon, ""); - monsters[10][8]->strength = 1; - monsters[10][8]->gold = 1; - monsters[10][8]->exp = 1; - monsters[10][8]->maxhp = 1; - strcpy( monsters[10][8]->death, ""); - - strcpy( monsters[10][9]->name, ""); - strcpy( monsters[10][9]->weapon, ""); - monsters[10][9]->strength = 1; - monsters[10][9]->gold = 1; - monsters[10][9]->exp = 1; - monsters[10][9]->maxhp = 1; - strcpy( monsters[10][9]->death, ""); - - strcpy( monsters[10][10]->name, ""); - strcpy( monsters[10][10]->weapon, ""); - monsters[10][10]->strength = 1; - monsters[10][10]->gold = 1; - monsters[10][10]->exp = 1; - monsters[10][10]->maxhp = 1; - strcpy( monsters[10][10]->death, ""); - - strcpy( monsters[10][11]->name, ""); - strcpy( monsters[10][11]->weapon, ""); - monsters[10][11]->strength = 1; - monsters[10][11]->gold = 1; - monsters[10][11]->exp = 1; - monsters[10][11]->maxhp = 1; - strcpy( monsters[10][11]->death, ""); - - strcpy( monsters[11][0]->name, ""); - strcpy( monsters[11][0]->weapon, ""); - monsters[11][0]->strength = 1; - monsters[11][0]->gold = 1; - monsters[11][0]->exp = 1; - monsters[11][0]->maxhp = 1; - strcpy( monsters[11][0]->death, ""); - - strcpy( monsters[11][1]->name, ""); - strcpy( monsters[11][1]->weapon, ""); - monsters[11][1]->strength = 1; - monsters[11][1]->gold = 1; - monsters[11][1]->exp = 1; - monsters[11][1]->maxhp = 1; - strcpy( monsters[11][1]->death, ""); - - strcpy( monsters[11][2]->name, ""); - strcpy( monsters[11][2]->weapon, ""); - monsters[11][2]->strength = 1; - monsters[11][2]->gold = 1; - monsters[11][2]->exp = 1; - monsters[11][2]->maxhp = 1; - strcpy( monsters[11][2]->death, ""); - - strcpy( monsters[11][3]->name, ""); - strcpy( monsters[11][3]->weapon, ""); - monsters[11][3]->strength = 1; - monsters[11][3]->gold = 1; - monsters[11][3]->exp = 1; - monsters[11][3]->maxhp = 1; - strcpy( monsters[11][3]->death, ""); - - strcpy( monsters[11][4]->name, ""); - strcpy( monsters[11][4]->weapon, ""); - monsters[11][4]->strength = 1; - monsters[11][4]->gold = 1; - monsters[11][4]->exp = 1; - monsters[11][4]->maxhp = 1; - strcpy( monsters[11][4]->death, ""); - - strcpy( monsters[11][5]->name, ""); - strcpy( monsters[11][5]->weapon, ""); - monsters[11][5]->strength = 1; - monsters[11][5]->gold = 1; - monsters[11][5]->exp = 1; - monsters[11][5]->maxhp = 1; - strcpy( monsters[11][5]->death, ""); - - strcpy( monsters[11][6]->name, ""); - strcpy( monsters[11][6]->weapon, ""); - monsters[11][6]->strength = 1; - monsters[11][6]->gold = 1; - monsters[11][6]->exp = 1; - monsters[11][6]->maxhp = 1; - strcpy( monsters[11][6]->death, ""); - - strcpy( monsters[11][7]->name, ""); - strcpy( monsters[11][7]->weapon, ""); - monsters[11][7]->strength = 1; - monsters[11][7]->gold = 1; - monsters[11][7]->exp = 1; - monsters[11][7]->maxhp = 1; - strcpy( monsters[11][7]->death, ""); - - strcpy( monsters[11][8]->name, ""); - strcpy( monsters[11][8]->weapon, ""); - monsters[11][8]->strength = 1; - monsters[11][8]->gold = 1; - monsters[11][8]->exp = 1; - monsters[11][8]->maxhp = 1; - strcpy( monsters[11][8]->death, ""); - - strcpy( monsters[11][9]->name, ""); - strcpy( monsters[11][9]->weapon, ""); - monsters[11][9]->strength = 1; - monsters[11][9]->gold = 1; - monsters[11][9]->exp = 1; - monsters[11][9]->maxhp = 1; - strcpy( monsters[11][9]->death, ""); - - strcpy( monsters[11][10]->name, ""); - strcpy( monsters[11][10]->weapon, ""); - monsters[11][10]->strength = 1; - monsters[11][10]->gold = 1; - monsters[11][10]->exp = 1; - monsters[11][10]->maxhp = 1; - strcpy( monsters[11][10]->death, ""); - - strcpy( monsters[11][11]->name, ""); - strcpy( monsters[11][11]->weapon, ""); - monsters[11][11]->strength = 1; - monsters[11][11]->gold = 1; - monsters[11][11]->exp = 1; - monsters[11][11]->maxhp = 1; - strcpy( monsters[11][11]->death, ""); - -*/ } void delete_monsters() @@ -1937,22 +1039,15 @@ void display_monster(char *u) void display_players(char *u) { - if (is_playing(u)) + aClient *user; + if (!(user = find(u))) { - aClient *ni = find(u); - - aClient *battle = ni->stats->battle; - - notice(s_GameServ, u, "Your Hitpoints: %d", ni->stats->hp); - notice(s_GameServ, u, "%s's Hitpoints: %d", battle->getNick(), - 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?"); + log("Fatal error in display_players(): Couldn't find %s", u); } + else + display_players(user); } + void display_players(aClient *user) { char *u = user->getNick(); @@ -1960,7 +1055,7 @@ void display_players(aClient *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->getNick(), battle->stats->hp); + notice(s_GameServ, u, "%s's Hitpoints: %d", battle->stats->name, battle->stats->hp); notice(s_GameServ, u, "Here are your commands:"); notice(s_GameServ, u, "/msg %S attack"); notice(s_GameServ, u, "/msg %S run"); @@ -1973,18 +1068,27 @@ bool is_playing(char *u) { aClient *user; if (!(user = find(u))) - { return false; - } else - { - return user->stats != NULL; - } + return is_playing(user); } bool is_playing(aClient *user) { - return user->stats != NULL && (stricmp(user->getNick(), "!NULL!") != 0); + if (user->stats == NULL) + { + return false; + } + else if (user->stats->client == NULL) + { + return false; + } + else if (!FL_is_playing(user)) + { + return false; + } + else + return true; } bool is_fighting(char *u) @@ -1992,23 +1096,17 @@ bool is_fighting(char *u) aClient *user; if (!(user = find(u))) - { return false; - } - else if (user->stats) - { - return user->stats->fight != NULL || user->stats->battle != NULL - || user->stats->master != NULL; - } else - return false; + return is_fighting(user); } + bool is_fighting(aClient *user) { if (!is_playing(user)) return false; else - return (user->stats->fight != NULL || user->stats->battle != NULL || user->stats->master != NULL); + return player_fight(user) || master_fight(user) || user->stats->fight != NULL; } bool player_fight(char *u) @@ -2017,14 +1115,13 @@ bool player_fight(char *u) if (!(user = find(u))) return false; - else if (user->stats) - return user->stats->battle != NULL; - else - return false; + else + return player_fight(user); } + bool player_fight(aClient *user) { - if (!is_fighting(user)) + if (!is_playing(user)) return false; else return user->stats->battle != NULL; @@ -2036,11 +1133,10 @@ bool master_fight(char *u) if (!(user = find(u))) return false; - else if (user->stats) - return user->stats->master != NULL; else - return false; + return master_fight(user); } + bool master_fight(aClient *user) { if (!is_playing(user)) @@ -2058,15 +1154,18 @@ void do_fight(char *u) if (!nick) { notice(s_GameServ, u, "SYNTAX: /msg %S FIGHT PLAYER"); + return; } else if (!(ni = find(u))) { notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, "")); return; } - else if (!(battle = find(nick))) + else if (isIgnore(ni)) { - notice(s_GameServ, u, "You can't attack %s while they aren't playing!", nick); + #ifdef DEBUGMODE + log("Ignoring %s.", ni->getNick()); + #endif return; } else if (!is_playing(ni)) @@ -2074,6 +1173,27 @@ void do_fight(char *u) notice(s_GameServ, u, "You are not playing!"); return; } + + updateTS(ni->stats); + + if (ni->stats->player_fights <= 0) + { + 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!"); + } + else if (!(battle = findplayer(nick))) + { + notice(s_GameServ, u, "Player %s not found!", nick); + } + else if (!isAlive(ni->stats)) + { + notice(s_GameServ, u, "You are dead. Wait until tomorrow to fight others!"); + } + else if (!is_playing(battle)) + { + notice(s_GameServ, u, "You can't attack %s while they aren't playing!", nick); + } /* * Offline fighting not implemented yet. * else if (!(fight = finduser(nick))) @@ -2083,45 +1203,68 @@ void do_fight(char *u) * ni->yourturn = 1; * battle->yourturn = 0; * notice(s_GameServ, u, "You decide to fight %s while they're not online!", - * battle->getNick()); + * battle->stats->name); * display_players(u); * } */ - else if (!isAlive(ni->stats)) + else if (stricmp(ni->stats->name, battle->stats->name) == 0) { - notice(s_GameServ, u, "You are dead. Wait until tomorrow to fight others!"); - return; + notice(s_GameServ, u, "Are you trying to commit suicide!?"); + } + else if (!isAlive(battle->stats)) + { + notice(s_GameServ, u, "They are dead. Cannot fight dead players!"); } else if (player_fight(battle)) { notice(s_GameServ, u, "%s is fighting %s already!", battle->stats->name, battle->stats->battle->stats->name); - return; + } + else if (master_fight(battle)) + { + notice(s_GameServ, u, "%s is fighting their master!", battle->stats->name); } else if (is_fighting(battle)) { notice(s_GameServ, u, "%s is fighting %s already!", battle->stats->name, battle->stats->fight->name); - return; } - else if (is_playing(ni) && is_playing(battle) && stricmp(ni->stats->name, battle->stats->name) != 0) + else if (ni->stats->level - battle->stats->level > maxbfightdistance) + { + // You can't fight someone below you by more than X level(s) + // level 12 can fight level (12 - X) but not < (12 - X) + notice(s_GameServ, u, "You may not fight %s. You're too strong!", + battle->stats->name); + } + else if (battle->stats->level - ni->stats->level > maxafightdistance) + { + // 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); + } + else { // Set your battle pointer to the other player ni->stats->battle = battle; // Set the other player's battle pointer to you - battle->stats->battle = ni; + 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! - notice(s_GameServ, u, "You challenge %s to an online duel!", battle->getNick()); - notice(s_GameServ, battle->getNick(), "%s has challenged you to an online duel!", u); - notice(s_GameServ, battle->getNick(), "%s gets to go first because he initiated!", u); - notice(s_GameServ, battle->getNick(), "Please wait while %s decides what to do.", u); - display_players(u); + ni->stats->player_fights -= 1; + + notice(s_GameServ, u, "You challenge %s to an online duel!", battle->stats->name); + notice(s_GameServ, battle->getNick(), "%s has challenged you to an online duel!", ni->stats->name); + notice(s_GameServ, battle->getNick(), "%s gets to go first "\ + "because they initiated!", ni->stats->name); + notice(s_GameServ, battle->getNick(), "Please wait while %s decides what to do.", ni->stats->name); + display_players(ni); } } + void do_use(char *u) { aClient *user; @@ -2140,12 +1283,21 @@ void do_use(char *u) notice(s_GameServ, u, "Fatal Error in do_use. Contact a(n) %S Admin"); return; } + else if (isIgnore(user)) + { + #ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); + #endif + return; + } else if (!is_playing(user)) { notice(s_GameServ, u, "You must be playing to use items!"); return; } + updateTS(user->stats); + p = &user->stats->inventory; if (stricmp(item, "HEALTH") == 0) @@ -2172,7 +1324,7 @@ void do_use(char *u) int oldstrength = user->stats->strength; notice(s_GameServ, u, "As you grip the flask containing pure power, you feel adrenaline coarse through your veins!"); notice(s_GameServ, u, "In one swallow you drink the potion and feel your muscle fibers bulging andgrowing!"); - user->stats->strength += rand() % 3; + user->stats->strength += 1 + (rand() % 10 >= 8 ? 1 : 0); // 1-2 notice(s_GameServ, u, "You gain %d Strength points!", user->stats->strength - oldstrength); p->decStrength(); } @@ -2183,13 +1335,28 @@ void do_use(char *u) notice(s_GameServ, u, "You are out of Defense Potions!"); return; } - int olddefense = user->stats->strength; + int olddefense = user->stats->defense; notice(s_GameServ, u, "You drink the foul tasting viscous liquid while pinching your nose in disgust."); notice(s_GameServ, u, "It tasted bad, but you feel like you are unbeatable!"); - user->stats->defense += rand() % 3; + user->stats->defense += 1 + (rand() % 10 >= 8 ? 1 : 0); // 1-2 notice(s_GameServ, u, "You gain %d Defense points!", user->stats->defense - olddefense); p->decDefense(); } + else if (stricmp(item, "HP") == 0) + { + if (p->HP() <= 0) + { + notice(s_GameServ, u, "You are out of HP Potions!"); + return; + } + int oldHP = user->stats->maxhp; + notice(s_GameServ, u, "You feel your life growing longer as you drink the green glowing liquid."); + user->stats->maxhp += 4 + + (rand() % 100 > 50 ? (rand() % 6) : (rand() % 2) ); + + notice(s_GameServ, u, "You gain %d Maximum hit points!", user->stats->maxhp - oldHP); + p->decHP(); + } else { notice(s_GameServ, u, "SYNTAX: /msg %S USE {HEALTH | STRENGTH | DEFENSE}"); @@ -2208,7 +1375,20 @@ void do_run(char *u) notice(s_GameServ, u, "Couldn't find you. Error. Contact a %S admin"); return; } + else if (isIgnore(user)) + { + #ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); + #endif + return; + } + else if (!is_playing(user)) + { + notice(s_GameServ, u, "You must be playing to run!"); + return; + } + updateTS(user->stats); p = user->stats; if (p->battle) @@ -2333,6 +1513,13 @@ void do_attack(char *u) notice(s_GameServ, u, "Fatal error in do_attack. Contact a(n) %S admin for help."); return; } + else if (isIgnore(ni)) + { + #ifdef DEBUGMODE + log("Ignoring %s.", ni->getNick()); + #endif + return; + } else if (!is_playing(ni)) { notice(s_GameServ, u, "You're not playing!"); @@ -2355,6 +1542,7 @@ void do_attack(char *u) // One has to be !NULL based on the previous else if // We wouldn't be here if they were all NULL } + updateTS(ni->stats); if (!player_fight(ni)) { @@ -2570,39 +1758,40 @@ void do_attack(char *u) } * end offline fighting */ - if (is_playing(battle->getNick())) + if (is_playing(battle)) { if (!isYourTurn(ni->stats)) { notice(s_GameServ, u, "Please wait until %s decides what to do!", - battle->getNick()); + battle->stats->name); return; } if (hit > 0) { - notice(s_GameServ, u, "You attack %s for %d points!", battle->getNick(), hit); + notice(s_GameServ, u, "You attack %s for %d points!", battle->stats->name, hit); notice(s_GameServ, battle->getNick(), "%s has hit you with their %s for "\ - "%d damage!", u, weapons[ni->stats->weapon], - hit); + "%d damage!", ni->stats->name, + weapons[ni->stats->weapon], hit); clearYourTurn(ni->stats); setYourTurn(battle->stats); - display_players(battle->getNick()); + display_players(battle); } else { - notice(s_GameServ, u, "You miss %s completely!", battle->getNick()); - notice(s_GameServ, battle->getNick(), "%s misses you completely!", u); + notice(s_GameServ, u, "You miss %s completely!", battle->stats->name); + notice(s_GameServ, battle->getNick(), "%s misses you completely!", ni->stats->name); clearYourTurn(ni->stats); setYourTurn(battle->stats); - display_players(battle->getNick()); + display_players(battle); } if (hit >= battle->stats->hp) { - notice(s_GameServ, u, "You have killed %s!", battle->getNick()); + notice(s_GameServ, u, "You have killed %s!", battle->stats->name); notice(s_GameServ, u, "You recieve %d experience and %ld gold!", (long int)(battle->stats->exp * .10), battle->stats->gold); - notice(s_GameServ, battle->getNick(), "You have been killed by %s!", u); + notice(s_GameServ, battle->getNick(), "You have been killed by %s!", + ni->stats->name); battle->stats->hp = 0; clearAlive(battle->stats); @@ -2630,7 +1819,7 @@ void do_attack(char *u) notice(s_GameServ, battle->getNick(), "You lose ten percent of your experience!"); notice(s_GameServ, battle->getNick(), "However, %s could not carry all of your "\ - "gold.", u); + "gold.", ni->stats->name); notice(s_GameServ, battle->getNick(), "Luckily, you still have %ld gold "\ "left. All is not lost!", battle->stats->gold); @@ -2648,13 +1837,14 @@ void do_attack(char *u) clearYourTurn(ni->stats); setYourTurn(battle->stats); notice(s_GameServ, u, "Please wait while %s decides what to do!", - battle->getNick()); + battle->stats->name); return; } } } } + void do_heal(char *u) { aClient *ni; @@ -2664,12 +1854,20 @@ void do_heal(char *u) if (!amount) { notice(s_GameServ, u, "SYNTAX: /msg %S HEAL {ALL | #}"); + return; } else if (!(ni = find(u))) { notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, "")); return; } + else if (isIgnore(ni)) + { + #ifdef DEBUGMODE + log("Ignoring %s.", ni->getNick()); + #endif + return; + } else if (!is_playing(ni)) { notice(s_GameServ, u, "You aren't playing!"); @@ -2683,12 +1881,16 @@ void do_heal(char *u) else if (is_fighting(ni)) { notice(s_GameServ, u, "You can't heal in battle!"); + return; } else if (ni->stats->hp >= ni->stats->maxhp) { notice(s_GameServ, u, "You don't need healing!"); + return; } - else if (stricmp(amount, "ALL") == 0) + + updateTS(ni->stats); + if (stricmp(amount, "ALL") == 0) { price = ni->stats->level * 3; if (ni->stats->gold < (ni->stats->maxhp - ni->stats->hp) * price) @@ -2789,7 +1991,7 @@ long int chartoint(char ch) int save_gs_dbase() { - ListNode *ptr = players.First(); + ListNode *ptr; Player *it; ofstream outfile; @@ -2797,21 +1999,26 @@ int save_gs_dbase() if (!outfile) { - cout << "Error opening " << playerdata << endl; + log("Error opening %s", playerdata); return 0; } + for (unsigned long x = 0; x < U_TABLE_SIZE; x++) + { + ptr = players[x].First(); while(ptr) { it = ptr->getData()->stats; + clearYourTurn(it); outfile << it->name << ' ' << it->level << ' ' << it->exp << ' ' << it->gold << ' ' << it->bank << ' ' << it->hp << ' ' << it->maxhp << ' ' << it->strength << ' ' << it->defense << ' ' << it->armor << ' ' << it->weapon << ' ' << it->forest_fights << ' ' << it->player_fights << ' ' << it->getFlags() << ' ' << it->password << ' ' << it->inventory.Healing() - << ' ' << it->inventory.Strength() << ' ' << it->inventory.Defense() << endl; + << ' ' << it->inventory.Strength() << ' ' << it->inventory.Defense() << ' ' << it->inventory.HP() << endl; ptr = ptr->Next(); } + } outfile.close(); return 1; } @@ -2828,7 +2035,7 @@ int load_gs_dbase() if (infile.fail()) { - cout << "Error opening " << playerdata << endl; + log("Error opening %s", playerdata); return 0; } @@ -2855,18 +2062,34 @@ int load_gs_dbase() password = strtok(NULL, " "); strcpy(p->password, password); - temp->setNick("!NULL!"); + temp->setNick("Not Playing"); + #ifdef P10 + temp->setRealNick("Not Playing"); + #endif + p->inventory.reset(); // Set inventory to all 0s // Old player databases didn't have these three extra values // If they come up null, leave them to 0 as the default. // On the next gameserv database save, it will save the values. tempname = strtok(NULL, " "); - cout << tempname << endl; - p->inventory.setHealing(stringtoint(tempname)); - p->inventory.setStrength(stringtoint(strtok(NULL, " "))); - p->inventory.setDefense(stringtoint(strtok(NULL, " "))); + if (tempname) + p->inventory.setHealing(stringtoint(tempname)); + + tempname = strtok(NULL, " "); + if (tempname) + p->inventory.setStrength(stringtoint(tempname)); + + tempname = strtok(NULL, " "); + if (tempname) + p->inventory.setDefense(stringtoint(tempname)); - players.insertAtBack(temp); + tempname = strtok(NULL, " "); + if (tempname) + p->inventory.setHP(stringtoint(tempname)); + unsigned long hv = iHASH((unsigned char *) temp->stats->name); + + temp->stats->client = NULL; + players[hv].insertAtBack(temp); delete temp; } delete [] buf; @@ -2923,15 +2146,33 @@ void do_store(char *u) notice(s_GameServ, u, "SYNTAX: STORE LIST {ARMOR | WEAPONS}"); notice(s_GameServ, u, " STORE SELL {ARMOR | WEAPON}"); notice(s_GameServ, u, " STORE BUY {ARMOR | WEAPON} NUMBER"); + return; } - else if (!(user = find(u)) || !is_playing(user)) + else if (!(user = find(u))) + { + log("Fatal Error: could not find %s in client list", u); + return; + } + else if (isIgnore(user)) + { + #ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); + #endif + return; + } + else if (!is_playing(user)) + { notice(s_GameServ, u, "You must be playing to use the store!"); + return; + } else if (!isAlive(user->stats)) { notice(s_GameServ, u, "You are dead. Wait until tomorrow to purchase weapons and armor!"); return; } - else if (stricmp(cmd, "LIST") == 0) + updateTS(user->stats); + + if (stricmp(cmd, "LIST") == 0) { if (stricmp(item, "WEAPONS") == 0) { @@ -3095,11 +2336,19 @@ void do_inventory(char *u) notice(s_GameServ, u, "Fatal Error. Contact a %S admin!"); return; } + else if (isIgnore(user)) + { + #ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); + #endif + return; + } else if (!is_playing(user)) { notice(s_GameServ, u, "You must be playing to check your inventory!"); return; } + updateTS(user->stats); showinventory(user, user); } void showinventory(aClient *from, aClient *to) @@ -3111,10 +2360,11 @@ void showinventory(aClient *from, aClient *to) if (is_playing(from)) { Pouch *p = &from->stats->inventory; - notice(s_GameServ, nick, "Inventory for %s:", from->getNick()); + notice(s_GameServ, nick, "Inventory for %s:", from->stats->name); notice(s_GameServ, nick, " Healing Potions: %d", p->Healing()); notice(s_GameServ, nick, "Strength Potions: %d", p->Strength()); notice(s_GameServ, nick, " Defense Potions: %d", p->Defense()); + notice(s_GameServ, nick, " HP Potions: %d", p->HP()); } } void do_tavern(char *u) @@ -3129,6 +2379,13 @@ void do_tavern(char *u) notice(s_GameServ, u, "Fatal Error. See a %S admin for help"); return; } + else if (isIgnore(user)) + { + #ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); + #endif + return; + } else if (!is_playing(user)) { notice(s_GameServ, u, "You must be playing to go to the Tavern"); @@ -3139,7 +2396,10 @@ void do_tavern(char *u) notice(s_GameServ, u, "You cannot go to the Tavern during a fight!"); return; } + + updateTS(user->stats); p = user->stats; + if (!cmd) { notice(s_GameServ, u, "Welcome to Boot Liquors Mystic Apothecary"); @@ -3150,9 +2410,10 @@ void do_tavern(char *u) else if (stricmp(cmd, "LIST") == 0) { notice(s_GameServ, u, "Here is a list of what we have to offer:"); - notice(s_GameServ, u, "1. Healing Potions for %ld Gold", 1000 * p->level + (p->exp / 10)); - notice(s_GameServ, u, "2. Strength Potions for %ld Gold", 2050 * p->level + (p->exp / 10)); - notice(s_GameServ, u, "3. Defense Potions for %ld Gold", 2000 * p->level + (p->exp / 10)); + notice(s_GameServ, u, "1. Healing Potions for %ld Gold", 100 * p->level + (p->exp / 10)); + notice(s_GameServ, u, "2. Strength Potions for %ld Gold", 205 * p->level + (p->exp / 10)); + notice(s_GameServ, u, "3. Defense Potions for %ld Gold", 200 * p->level + (p->exp / 10)); + notice(s_GameServ, u, "4. HP Potions for %ld Gold", 230 * p->level + (p->exp / 10)); notice(s_GameServ, u, "To buy a potion, type /msg %S TAVERN BUY #"); notice(s_GameServ, u, "Example: /msg %S TAVERN BUY 1 buys a healing potion!"); notice(s_GameServ, u, "By something will ya!"); @@ -3168,13 +2429,14 @@ void do_tavern(char *u) notice(s_GameServ, u, "Example: /msg %S TAVERN BUY 1"); return; } - if (num < 1 || num > 3) + if (num < 1 || num > 4) { notice(s_GameServ, u, "Invalid Choice!"); notice(s_GameServ, u, "Here is a list of what we have to offer:"); - notice(s_GameServ, u, "1. Healing Potions for %ld Gold", 1000 * p->level + (p->exp / 10)); - notice(s_GameServ, u, "2. Strength Potions for %ld Gold", 2050 * p->level + (p->exp / 10)); - notice(s_GameServ, u, "3. Defense Potions for %ld Gold", 2000 * p->level + (p->exp / 10)); + notice(s_GameServ, u, "1. Healing Potions for %ld Gold", 100 * p->level + (p->exp / 10)); + notice(s_GameServ, u, "2. Strength Potions for %ld Gold", 205 * p->level + (p->exp / 10)); + notice(s_GameServ, u, "3. Defense Potions for %ld Gold", 200 * p->level + (p->exp / 10)); + notice(s_GameServ, u, "4. HP Potions for %ld Gold", 230 * p->level + (p->exp / 10)); notice(s_GameServ, u, "To buy a potion, type /msg %S TAVERN BUY #"); notice(s_GameServ, u, "Example: /msg %S TAVERN BUY 1 buys a healing potion!"); return; @@ -3182,7 +2444,7 @@ void do_tavern(char *u) switch(num) { case 1: - price = (1000 * p->level) + (p->exp / 10); + price = (100 * p->level) + (p->exp / 10); if (p->gold >= price) { notice(s_GameServ, u, "One healing potion coming right up!"); @@ -3193,7 +2455,7 @@ void do_tavern(char *u) notice(s_GameServ, u, "You don't have enough gold!"); break; case 2: - price = (2050 * p->level) + (p->exp / 10); + price = (205 * p->level) + (p->exp / 10); if (p->gold >= price) { notice(s_GameServ, u, "One strength boost coming right up!"); @@ -3204,7 +2466,7 @@ void do_tavern(char *u) notice(s_GameServ, u, "You don't have enough gold!"); break; case 3: - price = (2000 * p->level) + (p->exp / 10); + price = (200 * p->level) + (p->exp / 10); if (p->gold >= price) { notice(s_GameServ, u, "One defense boost coming right up!"); @@ -3214,6 +2476,17 @@ void do_tavern(char *u) else notice(s_GameServ, u, "You don't have enough gold!"); break; + case 4: + price = (230 * p->level) + (p->exp / 10); + if (p->gold >= price) + { + notice(s_GameServ, u, "One HP Potion coming right up!"); + p->inventory.incHP(); + p->gold -= price; + } + else + notice(s_GameServ, u, "You don't have enough gold!"); + break; default: notice(s_GameServ, u, "Logical Error. See a %S admin for help!"); break; @@ -3235,19 +2508,38 @@ void do_bank(char *u) aClient *user; Player *p; - if (!cmd || !amount || (stricmp(cmd, "TRANSFER") == 0 && !nick)) + 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; } - - user = find(u); - if (!is_playing(user)) + else if (!(user = find(u))) + { + notice(s_GameServ, u, "Fatal Error. Couldn't find your aClient. Contact a(n) %S "\ + " admin for help"); + log("Fatal Error. Couldn't find %s while executing do_bank()", u); + return; + } + else if (isIgnore(user)) + { + #ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); + #endif + return; + } + else if (!is_playing(user)) { notice(s_GameServ, u, "You must be playing to use the bank!"); return; } + + updateTS(user->stats); + if (stricmp(cmd, "BALANCE") == 0) + { + showBankBalance(u); + return; + } else if (!isAlive(user->stats)) { notice(s_GameServ, u, "You are dead. We don't accept gold from dead folk! Wait 'til tomorrow!"); @@ -3261,11 +2553,7 @@ void do_bank(char *u) p = user->stats; - if (stricmp(cmd, "BALANCE") == 0) - { - showBankBalance(u); - } - else if (stricmp(cmd, "DEPOSIT") == 0) + if (stricmp(cmd, "DEPOSIT") == 0) { if (p->bank == 2000000000) { @@ -3373,13 +2661,20 @@ void do_bank(char *u) void do_master(char *u) { aClient *user; - user = find(u); - if (!user) + + if (!(user = find(u))) { notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, "")); return; } + else if (isIgnore(user)) + { + #ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); + #endif + return; + } else if (is_fighting(user)) { notice(s_GameServ, u, "You're in the middle of a fight! Pay attention!"); @@ -3395,7 +2690,8 @@ void do_master(char *u) notice(s_GameServ, u, "You must be playing to see your master!"); return; } - + + updateTS(user->stats); char *cmd = strtok(NULL, " "); Player *p = user->stats; long int need = 0; @@ -3524,8 +2820,9 @@ void refreshall() { ListNode *it; Player *p; - - it = players.First(); + for (unsigned long x = 0; x < U_TABLE_SIZE; x++) + { + it = players[x].First(); while (it) { @@ -3533,6 +2830,7 @@ void refreshall() refresh(p); it = it->Next(); } + } } void refresh(Player *p) @@ -3556,7 +2854,14 @@ void do_refresh(char *u) if (!(user = find(u))) { notice(s_GameServ, u, "Error: aClient not found. Contact a %S admin"); - cout << "Error: aClient not found: " << u << endl; + log("Error: aClient not found: %s", u); + return; + } + else if (isIgnore(user)) + { + #ifdef DEBUGMODE + log("Ignoring %s.", user->getNick()); + #endif return; } else if (!isAdmin(user)) @@ -3574,16 +2879,24 @@ void do_refresh(char *u) notice(s_GameServ, u, "Refreshing everyone's stats!"); refreshall(); } - else if ((user = find(nick))) + else if ((user = findplayer(nick))) { 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 } } else @@ -3599,7 +2912,9 @@ void resetall() ListNode *it; Player *p; - it = players.First(); + for (unsigned long x = 0; x < U_TABLE_SIZE; x++) + { + it = players[x].First(); while (it) { @@ -3607,6 +2922,7 @@ void resetall() reset(p); it = it->Next(); } + } } void reset(Player *p) @@ -3617,6 +2933,130 @@ void reset(Player *p) p->reset(); } +void updateTS(Player *p) +{ + if (!p) + return; + + #ifdef DEBUGMODE + log("Old timestamp for %s: %ld", p->name, p->lastcommand); + #endif + p->lastcommand = time(NULL); + #ifdef DEBUGMODE + log("New timestamp for %s: %ld", p->name, p->lastcommand); + #endif + +} + +bool timedOut(Player *p) +{ + if (!p) + return false; + else if (p->lastcommand == 0) + return false; + else + { + if ((time(NULL) - p->lastcommand) >= maxidletime) + return true; + + return false; + } +} + +void timeOutEvent(Player *p) +{ + aClient *user = findplayer(p->name); + + if (!user || !p->client) // then they're not playing + return; + + char *nick = user->getNick(); + + if (player_fight(user) && isYourTurn(p)) + { + // Check to see if they were the idler or if it was the other + // person + if (p->lastcommand != p->battle->stats->lastcommand) + { + // This person's last command was given earlier, + // so this person is the idler + notice(s_GameServ, nick, "You timed out "\ + "during a fight. You lose your turn!"); + notice(s_GameServ, p->battle->getNick(), + "%s hesitated for too long. Your move.", p->name); + clearYourTurn(p); + setYourTurn(p->battle->stats); + + // Update the TS for both players to give them another + // Chance to wake up, but if the other player doesn't + // Attack now, they both get logged out. + updateTS(p); + p->battle->stats->lastcommand = p->lastcommand; + display_players(p->battle); + return; + } + else + { + notice(s_GameServ, p->battle->getNick(), + "You and %s timed out at the same time."\ + " Don't fight if you're just going to "\ + "sit there!", p->name); + notice(s_GameServ, user->getNick(), + "You and %s timed out at the same time."\ + " Don't fight if you're just going to "\ + "sit there!", p->battle->stats->name); + logout(p->battle); + logout(user); + return; + } + } + else if (!player_fight(user)) + { + // Place fun stuff here :) + int randnum = 1 + rand() % 100; // 1-100 + #define GSN(s) notice(s_GameServ, nick, s) + #define GSN2(s, f) notice(s_GameServ, nick, s, f) + + if (randnum < 50) + { + // 35-100% of your gold goes pffft - kain + int stolen = (35 + (rand() % 66)) * user->stats->gold / 100; + + GSN("You stop for a moment to rest on the "\ + "street corner. All of a sudden, you "\ + "are ambushed from all sides by a hoarde "\ + "of knife wielding thugs."); + GSN2("The thugs beat you into utter submission "\ + "and steal %d gold from you!", stolen); + user->stats->gold -= stolen; + } + else if (randnum >= 50 && randnum < 75) + { + // 25-65% of your gold goes pffft - kain + int stolen = (25 + (rand() % 41)) * user->stats->gold / 100; + GSN("While dilly dallying around, you lose "\ + "your sense of time. Little did you know, "\ + "but thieves lifted your gold while you "\ + "weren't watching."); + GSN2("Better luck next time... you lose %d gold", stolen); + user->stats->gold -= stolen; + } + else if (randnum >= 75) + { + // 25-75% of your gold goes pffft - kain + int stolen = (25 + (rand() % 51)) * user->stats->gold / 100; + GSN("Good grief! A gaggle of gooey green ghostlike "\ + "goblins grabbed your gold!"); + GSN2("They stole %d gold from you!", stolen); + user->stats->gold -= stolen; + } + + + // Always log out the user + logout(user); + } +} + void do_reset(char *u) { char *nick = strtok(NULL, " "); @@ -3625,7 +3065,7 @@ void do_reset(char *u) if (!(user = find(u))) { notice(s_GameServ, u, "Error: aClient not found. Contact a %S admin"); - cout << "Error: aClient not found: " << u << endl; + log("Error: aClient not found: %s", u); return; } else if (!isAdmin(user)) @@ -3633,6 +3073,7 @@ void do_reset(char *u) notice(s_GameServ, u, "You must be a %S admin to use this command!"); return; } + if (!nick) { notice(s_GameServ, u, "SYNTAX: RESET {ALL | NICK}"); @@ -3643,16 +3084,24 @@ void do_reset(char *u) notice(s_GameServ, u, "Resetting everyone's stats!"); resetall(); } - else if ((user = find(nick))) + else if ((user = findbyrealnick(nick))) { if (is_playing(user)) { + #ifdef P10 + notice(s_GameServ, u, "Resetting %s.", user->getRealNick()); + #else notice(s_GameServ, u, "Resetting %s.", user->getNick()); + #endif reset(user->stats); } else { + #ifdef P10 + notice(s_GameServ, u, "%s is not playing.", user->getRealNick()); + #else notice(s_GameServ, u, "%s is not playing.", user->getNick()); + #endif } } else @@ -3679,7 +3128,7 @@ void display_help(char *u, char *file) infile.open("helpfiles/help"); if (infile.fail()) { - cout << "Error opening helpfiles/help" << endl; + log("Error opening helpfiles/help"); notice(s_GameServ, u, "Error opening helpfiles/help"); return; } @@ -3732,10 +3181,11 @@ void do_admin(char *u) if (!(user = find(u))) { - cout << "Error: aClient not found: " << u << endl; + log("Error: aClient not found: %s", u); notice(s_GameServ, u, "Error: aClient not found. Contact %S admin."); return; } + if (!pass) { notice(s_GameServ, u, "SYNTAX: ADMIN password"); @@ -3751,6 +3201,11 @@ void do_admin(char *u) { 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 { @@ -3768,12 +3223,16 @@ bool load_monsters() if (infile.fail()) { - cout << "Error opening monsters.dat" << endl; + log("Error opening monsters.dat"); return false; } init_monsters(); buf = new char[2048]; + #ifdef DEBUGMODE + log("Loading monsters from monsters.dat"); + #endif + for (int l = 0; l < REALLEVELS; l++) { for (int m = 0; m < MONSTERS;) @@ -3798,3 +3257,35 @@ bool load_monsters() delete [] buf; return true; } + +// this will be hash.cpp start +// thank you wcampbel +unsigned long sHASH(const unsigned char *name) +{ + unsigned long h = 0, g; + + while (*name) + { + h = (h << 4) + (*name++); // Case sensitive for numerics + if ((g = (h & 0xF0000000))) + h ^= g >> 24; + h &= ~g; + } + return h % U_TABLE_SIZE; +} + +unsigned long iHASH(const unsigned char *name) +{ + unsigned long h = 0, g; + + while (*name) + { + h = (h << 4) + tolower(*name++); + if ((g = (h & 0xF0000000))) + h ^= g >> 24; + h &= ~g; + } + return h % U_TABLE_SIZE; +} + +// this will be hash.cpp end