X-Git-Url: https://jfr.im/git/irc/gameservirc.git/blobdiff_plain/20d5d7219d871c31dd7b20e2001df9f52fe117cd..03e0a9d83003fd07ae25f946053ec10989bfd132:/gameserv/gameserv.cpp diff --git a/gameserv/gameserv.cpp b/gameserv/gameserv.cpp index a476397..485937c 100644 --- a/gameserv/gameserv.cpp +++ b/gameserv/gameserv.cpp @@ -6,7 +6,10 @@ #include "sockhelp.h" #include -#include +#include + +using std::ifstream; +using std::ofstream; #if defined(HAVE_CRYPT_H) @@ -19,7 +22,9 @@ #endif List players; + Monster *monsters[LEVELS][MONSTERS]; // Monsters per level. Total = MONSTERS * LEVELS +Monster boss; // The boss monster Monster *masters[LEVELS]; // A master for each level @@ -54,9 +59,6 @@ bool is_playing(aClient *user); bool is_fighting(char *u); // True if the given nick in the clients list is fighting anything. bool is_fighting(aClient *user); -bool is_alive(char *u); // True if the given nick is playing and is alive -bool is_alive(aClient *user); - bool player_fight(char *u); // True if the player is fighting another player. bool player_fight(aClient *user); @@ -68,6 +70,7 @@ bool master_fight(aClient *user); void display_help(char *u, char *file = NULL); void display_monster(char *u); void display_players(char *u); +void display_players(aClient *user); long int chartoint(char ch); int isstringnum(char *num); long int pow (int x, int y); @@ -76,7 +79,7 @@ long int stringtoint(char *number); char *spaces(int len, char *seperator); void refresh(Player *p); void refreshall(); -void reset(aClient *ni); +void reset(Player *p); void init_masters(); void init_monsters(); bool load_monsters(); @@ -90,6 +93,7 @@ void do_fight(char *u); void do_heal(char *u); void do_help(char *u); void do_identify(char *u); +void do_inventory(char *u); void do_refresh(char *u); void do_register(char *u); void do_list(char *u); @@ -100,10 +104,14 @@ void do_reset(char *u); void do_run(char *u); void do_stats(char *u); void do_store(char *u); +void do_tavern(char *u); +void do_use(char *u); void see_master(char *u); void showstats(const char *u, const char *nick); +void showinventory(aClient *from, aClient *to); void showBankBalance(const char *u); +void end_turn(aClient *user); #define WNA 16 char *weapons[WNA] = { "Fists", "Stick", "Dagger", "Quarterstaff", "Short Sword", @@ -114,12 +122,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,17 +138,29 @@ void gameserv(char *source, char *buf) char *cmd; 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 + + if (cmd[0] == ':') + cmd++; // Get rid of that : at the beginning of the :text (command) + + #ifdef DEBUGMODE + log("Source: %s Command: %s", source, cmd); + #endif + + struct tm *tm; + time_t ti; + time(&ti); + tm = localtime(&ti); - cout << "Source: " << source << "\ncmd: " << cmd << endl; - long int mn = midnight() - 12 * 3600; // 12 noon ;) + int curday = tm->tm_mday; - if (mn > timestamp) + 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) @@ -164,8 +184,12 @@ void gameserv(char *source, char *buf) do_attack(source); } else if (stricmp(cmd, "RUN") == 0) { do_run(source); + } else if (stricmp(cmd, "USE") == 0) { + do_use(source); } else if (stricmp(cmd, "HEAL") == 0) { do_heal(source); + } else if (stricmp(cmd, "INVENTORY") == 0) { + do_inventory(source); } else if (stricmp(cmd, "MASTER") == 0) { do_master(source); } else if (stricmp(cmd, "STORE") == 0) { @@ -176,13 +200,19 @@ void gameserv(char *source, char *buf) do_admin(source); } else if (stricmp(cmd, "REFRESH") == 0) { do_refresh(source); + } else if (stricmp(cmd, "RESET") == 0) { + do_reset(source); + } else if (stricmp(cmd, "TAVERN") == 0) { + do_tavern(source); + } else if (stricmp(cmd, "LIST") == 0) { + do_list(source); + #ifdef DEBUGMODE } else if (stricmp(cmd, "PRINT") == 0) { - cout << "Printing Clients List: " << endl; + cout << "Printing the clients list:" << endl; clients.print(); - cout << "\nPrinting Player List: " << endl; + cout << "\nPrinting the players list:" << endl; players.print(); - } else if (stricmp(cmd, "LIST") == 0) { - do_list(source); + #endif } else if (stricmp(cmd, "REGISTER") == 0) { do_register(source); } else if (stricmp(cmd, "IDENTIFY") == 0) { @@ -197,7 +227,7 @@ void gameserv(char *source, char *buf) 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)) { @@ -206,7 +236,11 @@ void gameserv(char *source, char *buf) 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 } } else if (stricmp(cmd, "SAVE") == 0) { aClient *user; @@ -214,7 +248,7 @@ void gameserv(char *source, char *buf) 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)) { @@ -230,7 +264,7 @@ void gameserv(char *source, char *buf) 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)) { @@ -252,13 +286,14 @@ void gameserv(char *source, char *buf) 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)) { @@ -269,6 +304,7 @@ void gameserv(char *source, char *buf) 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); } @@ -300,14 +336,12 @@ void showstats(const char *u, const char *nick) char *space; - cout << "\n\nu: " << u << "\nnick: " << nick << endl; - if (!(ni = findbynick(nick))) + if (!(ni = findplayer(nick))) { notice(s_GameServ, u, "%s not found", nick); } else if (ni->stats) { - notice(s_GameServ, sender->getNick(), "Stats for %s:", ni->stats->name); sprintf(buf, "Experience: %ld", ni->stats->exp); @@ -341,8 +375,11 @@ void showstats(const char *u, const char *nick) notice(s_GameServ, sender->getNick(), "%s%sPlayer Fights: %d", buf, space, ni->stats->player_fights); delete [] space; } + else + { + notice(s_GameServ, u, "%s is not playing!", ni->stats->name); + } delete [] buf; - } char *spaces(int len, char *seperator) @@ -383,8 +420,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); @@ -404,11 +444,23 @@ void notice(const char *source, const char *dest, const char *fmt, ...) if (dest[0] == ':') { dest++; + + #if !defined(P10) sprintf(input, ":%s NOTICE %s :", source, dest); + #else + sprintf(input, "%s O %s :", gsnum, dest); + #endif + dest--; } else + { + #if !defined(P10) sprintf(input, ":%s NOTICE %s :", source, dest); + #else + sprintf(input, "%s O %s :", gsnum, dest); + #endif + } for (; *t; t++) { @@ -429,8 +481,10 @@ 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 [] input; va_end(args); @@ -484,7 +538,14 @@ void do_list(char *u) notice(s_GameServ, u, "People Playing:"); 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(); } notice(s_GameServ, u, "End of List"); @@ -495,8 +556,9 @@ void do_list(char *u) void do_register(char *u) { - char *password; - aClient *user; + char *password, *name; + aClient *user, *p; + name = strtok(NULL, " "); password = strtok(NULL, " "); static char saltChars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./"; @@ -504,22 +566,34 @@ void do_register(char *u) salt[0] = saltChars[rand() % strlen(saltChars)]; salt[1] = saltChars[rand() % strlen(saltChars)]; - salt[3] = '\0'; + salt[2] = '\0'; - if (!password) + if (!name) + { + notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD"); + } + else if (!password) { - notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER PASSWORD"); + 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))) { - if (!user->stats) + p = findplayer(u); + if (!user->stats && !p) { user->stats = new Player(user); user->stats->user = user; // Set the backwards pointer strcpy(user->stats->password, crypt(password, salt)); + strcpy(user->stats->name, name); players.insertAtBack(user); 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); } else { @@ -540,21 +614,23 @@ void do_identify(char *u) 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, "")); + { + notice(s_GameServ, u, "Fatal error. Cannot find aClient. Buf: %s", strtok(NULL, "")); + log("Error: aClient not found: %s", u); + } else if (!(p = findplayer(name)) || !p->stats) notice(s_GameServ, u, "Player %s not found", name); + else if (p->stats->user != NULL && !isAdmin(user)) + { + notice(s_GameServ, u, "That player has already identified."); + return; + } else if (!check_password(name, password) && !isAdmin(user)) { notice(s_GameServ, u, "Password incorrect"); } - else - { - if (p->stats->user && !isAdmin(user)) - { - notice(s_GameServ, u, "That player has already identified."); - return; - } - if (!user->stats) + else { + if (!user->stats) { ListNode *temp; temp = players.Find(p); @@ -565,9 +641,14 @@ void do_identify(char *u) return; } user->stats = new Player(p->stats->name); - cout << "Setting data for identified" << endl; + #ifdef DEBUGMODE + log("Setting data for identified"); + #endif user->stats->setData(p->stats); - cout << "Player Identified" << endl << flush; + + #ifdef DEBUGMODE + log("Player Identified"); + #endif temp->setPtr(user); @@ -584,20 +665,41 @@ void do_identify(char *u) void do_stats(char *u) { char *nick; - aClient *source; + aClient *user; nick = strtok(NULL, " "); - source = find(u); if (!nick) - showstats(u, source->getNick()); + { + if (!(user = find(u))) + { + notice(s_GameServ, u, "Fatal Error in do_stats(). Contact a %S admin for help!"); + log("Error: aClient not found: %s", u); + return; + } + else if (!is_playing(user)) + { + notice(s_GameServ, u, "You're not playing, so you have no stats!"); + return; + } + else + 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; @@ -631,7 +733,7 @@ void init_masters() strcpy(masters[3]->name, "Mr. Miagi"); strcpy(masters[3]->weapon, "Petrified Bonsai"); - masters[3]->strength = 100; + masters[3]->strength = 120; masters[3]->gold = 0; masters[3]->exp = 0; masters[3]->maxhp = 120; @@ -640,7 +742,7 @@ void init_masters() strcpy(masters[4]->name, "Jackie Chan"); strcpy(masters[4]->weapon, "Kung Fu Kick"); - masters[4]->strength = 125; + masters[4]->strength = 135; masters[4]->gold = 0; masters[4]->exp = 0; masters[4]->maxhp = 200; @@ -649,7 +751,7 @@ void init_masters() strcpy(masters[5]->name, "Jet Li"); strcpy(masters[5]->weapon, "Motorcycle"); - masters[5]->strength = 150; + masters[5]->strength = 160; masters[5]->gold = 0; masters[5]->exp = 0; masters[5]->maxhp = 400; @@ -659,7 +761,7 @@ void init_masters() strcpy(masters[6]->name, "Muhammad Ali"); strcpy(masters[6]->weapon, "Quick Jab"); - masters[6]->strength = 175; + masters[6]->strength = 185; masters[6]->gold = 0; masters[6]->exp = 0; masters[6]->maxhp = 600; @@ -668,7 +770,7 @@ void init_masters() strcpy(masters[7]->name, "Li Mu Bai"); strcpy(masters[7]->weapon, "Green Destiny"); - masters[7]->strength = 200; + masters[7]->strength = 210; masters[7]->gold = 0; masters[7]->exp = 0; masters[7]->maxhp = 800; @@ -687,7 +789,7 @@ void init_masters() strcpy(masters[9]->name, "Wong Fei Hung"); strcpy(masters[9]->weapon, "Drunken Boxing"); - masters[9]->strength = 350; + masters[9]->strength = 360; masters[9]->gold = 0; masters[9]->exp = 0; masters[9]->maxhp = 1800; @@ -706,1168 +808,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() @@ -1910,12 +859,25 @@ void display_players(char *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(), + 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", s_GameServ); - notice(s_GameServ, u, "/msg %s run", s_GameServ); + 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(aClient *user) +{ + char *u = user->getNick(); + if (is_playing(user) && player_fight(user)) + { + aClient *battle = user->stats->battle; + notice(s_GameServ, u, "Your Hitpoints: %d", user->stats->hp); + notice(s_GameServ, u, "%s's Hitpoints: %d", battle->stats->name, battle->stats->hp); + notice(s_GameServ, u, "Here are your commands:"); + notice(s_GameServ, u, "/msg %S attack"); + notice(s_GameServ, u, "/msg %S run"); notice(s_GameServ, u, "What will you do?"); } } @@ -1936,28 +898,9 @@ bool is_playing(char *u) bool is_playing(aClient *user) { - return user->stats != NULL; + return user->stats != NULL && (stricmp(user->getNick(), "!NULL!") != 0); } -bool is_alive(char *u) -{ - aClient *user; - if (!(user = find(u))) - return false; - else if (user->stats == NULL) - return false; - else - return user->stats->alive; -} - -bool is_alive(aClient *user) -{ - if (user->stats == NULL) - return false; - else - return user->stats->alive; -} - bool is_fighting(char *u) { aClient *user; @@ -2035,13 +978,15 @@ void do_fight(char *u) notice(s_GameServ, u, "Fatal error. Contact a(n) %S admin. buf: %s", strtok(NULL, "")); return; } - else if (!(battle = find(nick))) - { - notice(s_GameServ, u, "You can't attack %s while they aren't playing!", nick); - } else if (!is_playing(ni)) { notice(s_GameServ, u, "You are not playing!"); + return; + } + else if (!(battle = findplayer(nick))) + { + notice(s_GameServ, u, "You can't attack %s while they aren't playing!", nick); + return; } /* * Offline fighting not implemented yet. @@ -2052,15 +997,46 @@ 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 (!is_alive(ni)) + else if (!isAlive(ni->stats)) { notice(s_GameServ, u, "You are dead. Wait until tomorrow to fight others!"); return; } + else if (!isAlive(battle->stats)) + { + notice(s_GameServ, u, "They are dead. Cannot fight dead players!"); + return; + } + 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 (is_fighting(battle)) + { + notice(s_GameServ, u, "%s is fighting %s already!", battle->stats->name, battle->stats->fight->name); + return; + } + 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->level); + return; + } + 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); + return; + } else if (is_playing(ni) && is_playing(battle) && stricmp(ni->stats->name, battle->stats->name) != 0) { // Set your battle pointer to the other player @@ -2070,17 +1046,107 @@ void do_fight(char *u) battle->stats->battle = ni; // The initiator gets the first move (perhaps this should be 50/50) - ni->stats->yourturn = 1; - battle->stats->yourturn = 0; + 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); + 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(u); } } +void do_use(char *u) +{ + aClient *user; + Pouch *p; + + char *item = strtok(NULL, " "); + + if (!item) + { + notice(s_GameServ, u, "SYNTAX: USE ITEM"); + notice(s_GameServ, u, "Type /msg %S HELP USE for more information."); + return; + } + else if (!(user = find(u))) + { + notice(s_GameServ, u, "Fatal Error in do_use. Contact a(n) %S Admin"); + return; + } + else if (!is_playing(user)) + { + notice(s_GameServ, u, "You must be playing to use items!"); + return; + } + + p = &user->stats->inventory; + + if (stricmp(item, "HEALTH") == 0) + { + if (p->Healing() <= 0) + { + notice(s_GameServ, u, "You are out of Health Potions!"); + return; + } + int oldhealth = user->stats->hp; + notice(s_GameServ, u, "You hastiliy gulp down the flask of cool life-giving waters."); + notice(s_GameServ, u, "Rejuvination spreads throughout your body."); + user->stats->hp += (10 * user->stats->level) + (rand() % 10) * user->stats->level; + notice(s_GameServ, u, "You gain %d HP!", user->stats->hp - oldhealth); + p->decHealing(); + } + else if (stricmp(item, "STRENGTH") == 0) + { + if (p->Strength() <= 0) + { + notice(s_GameServ, u, "You are out of Strength Potions!"); + return; + } + int oldstrength = user->stats->strength; + notice(s_GameServ, u, "As you grip the flask containing pure power, you feel adrenaline coarse through your veins!"); + notice(s_GameServ, u, "In one swallow you drink the potion and feel your muscle fibers bulging andgrowing!"); + user->stats->strength += 1 + rand() % 2; // 1 - 2 Strength Added + notice(s_GameServ, u, "You gain %d Strength points!", user->stats->strength - oldstrength); + p->decStrength(); + } + else if (stricmp(item, "DEFENSE") == 0) + { + if (p->Defense() <= 0) + { + notice(s_GameServ, u, "You are out of Defense Potions!"); + return; + } + int olddefense = user->stats->defense; + notice(s_GameServ, u, "You drink the foul tasting viscous liquid while pinching your nose in disgust."); + notice(s_GameServ, u, "It tasted bad, but you feel like you are unbeatable!"); + user->stats->defense += 1 + rand() % 2; // 1 - 2 Defense Added + 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 += 1 + rand() % 5; // 1 - 5 Maxhp + 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}"); + return; + } + + end_turn(user); // If they're fighting, end their turn +} void do_run(char *u) { aClient *user; @@ -2092,6 +1158,12 @@ void do_run(char *u) return; } + else if (!is_playing(user)) + { + notice(s_GameServ, u, "You must be playing to run!"); + return; + } + p = user->stats; if (p->battle) @@ -2105,13 +1177,13 @@ void do_run(char *u) delete p->fight; p->fight = NULL; } - else if (player_fight(user) && p->yourturn) + else if (player_fight(user) && isYourTurn(p)) { notice(s_GameServ, u, "You run away from %s like a little baby!", p2->name); notice(s_GameServ, p->battle->getNick(), "%s ran away from you like a little baby!", p->name); p2->battle = NULL; } - else if (player_fight(user) && !p->yourturn) + 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); } @@ -2121,6 +1193,90 @@ void do_run(char *u) } p->battle = NULL; } + +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)) + goto endturn; + + if (!player_fight(user) && !master_fight(user)) + fight = user->stats->fight; + else + fight = user->stats->master; + battle = user->stats->battle; + + if (!player_fight(user)) + { + // Opponent's Hit + mhit = (fight->strength / 2) + + (rand() % (fight->strength / 2) - (user->stats->defense + + arbonus[user->stats->armor])); + } + else + { + // Opponent's Hit + mhit = (((battle->stats->strength + webonus[battle->stats->weapon]) / 2) + + (rand() % ((battle->stats->strength + webonus[battle->stats->weapon])) / 2) - + (user->stats->defense + arbonus[user->stats->armor])); + } + if (!player_fight(user)) + { + + if (mhit > 0) + { + notice(s_GameServ, u, "%s attacks with their %s for %d damage!", + fight->name, fight->weapon, mhit); + } + else if (mhit <= 0) + notice(s_GameServ, u, "%s completely misses you!", fight->name); + + if (mhit >= user->stats->hp) + { + if (!master_fight(user)) + { + notice(s_GameServ, u, "You have been killed by %s!", fight->name); + notice(s_GameServ, u, "You lose all gold on hand and lose 10 percent "\ + "of your experience!"); + user->stats->gold = 0; + user->stats->exp -= (long int)(user->stats->exp * .10); + user->stats->fight = NULL; + clearAlive(user->stats); + goto endturn; + } + else + { + notice(s_GameServ, u, "%s has bested you! You will have to wait "\ + "until tomorrow to try again", user->stats->master->name); + user->stats->fight = NULL; + user->stats->master = NULL; + goto endturn; + } + } + else + { + if (mhit > 0) + user->stats->hp -= mhit; + display_monster(u); + goto endturn; + } + } + else + { + clearYourTurn(user->stats); + setYourTurn(battle->stats); + display_players(battle); + } +endturn: + delete nick; +} + void do_attack(char *u) { int hit, mhit; @@ -2128,11 +1284,16 @@ void do_attack(char *u) Monster *fight; // The monster they may be fighting if (!(ni = find(u))) + { + notice(s_GameServ, u, "Fatal error in do_attack. Contact a(n) %S admin for help."); + return; + } + else if (!is_playing(ni)) { notice(s_GameServ, u, "You're not playing!"); return; } - else if (!ni->stats->fight && !ni->stats->battle && !ni->stats->master) + else if (!is_fighting(ni)) { notice(s_GameServ, u, "You're not in battle!"); return; @@ -2198,6 +1359,7 @@ void do_attack(char *u) // Unsigned long int maybe? Leave it for now. ni->stats->exp = ( (ni->stats->exp + fight->exp) > 2000000000 ? 2000000000 : ni->stats->exp + fight->exp); + ni->stats->gold = (ni->stats->gold + fight->gold > 2000000000 ? 2000000000 : ni->stats->gold + fight->gold); @@ -2256,7 +1418,7 @@ void do_attack(char *u) ni->stats->gold = 0; ni->stats->exp -= (long int)(ni->stats->exp * .10); ni->stats->fight = NULL; - ni->stats->alive = false; + clearAlive(ni->stats); return; } else @@ -2363,41 +1525,42 @@ void do_attack(char *u) } * end offline fighting */ - if (is_playing(battle->getNick())) + if (is_playing(battle)) { - if (ni->stats->yourturn == 0) + 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); - ni->stats->yourturn = 0; - battle->stats->yourturn = 1; + "%d damage!", ni->stats->name, + weapons[ni->stats->weapon], hit); + clearYourTurn(ni->stats); + setYourTurn(battle->stats); display_players(battle->getNick()); } else { - notice(s_GameServ, u, "You miss %s completely!", battle->getNick()); - notice(s_GameServ, battle->getNick(), "%s misses you completely!", u); - ni->stats->yourturn = 0; - battle->stats->yourturn = 1; + 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()); } 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; - battle->stats->alive = false; + clearAlive(battle->stats); if (2000000000 - ni->stats->exp > (long int)(battle->stats->exp * .10)) { @@ -2423,7 +1586,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); @@ -2438,17 +1601,17 @@ void do_attack(char *u) { if (hit > 0) battle->stats->hp -= hit; - //display_players(battle->getNick()); - ni->stats->yourturn = 0; - battle->stats->yourturn = 1; + 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; @@ -2469,7 +1632,7 @@ void do_heal(char *u) notice(s_GameServ, u, "You aren't playing!"); return; } - else if (!is_alive(ni)) + else if (!isAlive(ni->stats)) { notice(s_GameServ, u, "You are dead. Wait until tomorrow for healing."); return; @@ -2591,7 +1754,7 @@ int save_gs_dbase() if (!outfile) { - cout << "Error opening " << playerdata << endl; + log("Error opening %s", playerdata); return 0; } @@ -2600,9 +1763,10 @@ int save_gs_dbase() it = ptr->getData()->stats; outfile << it->name << ' ' << it->level << ' ' << it->exp << ' ' << it->gold << ' ' << it->bank << ' ' << it->hp << ' ' << it->maxhp << ' ' << it->strength << ' ' << it->defense << ' ' - << it->armor << ' ' << it->weapon << ' ' << (it->alive ? "alive" : "dead") << ' ' + << it->armor << ' ' << it->weapon << ' ' << it->forest_fights << ' ' << it->player_fights << ' ' - << it->getFlags() << ' ' << it->password << endl; + << it->getFlags() << ' ' << it->password << ' ' << it->inventory.Healing() + << ' ' << it->inventory.Strength() << ' ' << it->inventory.Defense() << ' ' << it->inventory.HP() << endl; ptr = ptr->Next(); } outfile.close(); @@ -2614,14 +1778,14 @@ int load_gs_dbase() ifstream infile; aClient *temp; Player *p; - char *alive, *tempname, *buf, *password; + char *tempname, *buf, *password; buf = new char[1023]; infile.open(playerdata); if (infile.fail()) { - cout << "Error opening " << playerdata << endl; + log("Error opening %s", playerdata); return 0; } @@ -2642,19 +1806,37 @@ int load_gs_dbase() p->defense = stringtoint(strtok(NULL, " ")); p->armor = stringtoint(strtok(NULL, " ")); p->weapon = stringtoint(strtok(NULL, " ")); - alive = strtok(NULL, " "); - p->alive = (stricmp(alive, "ALIVE") == 0 ? true : false); p->forest_fights = stringtoint(strtok(NULL, " ")); p->player_fights = stringtoint(strtok(NULL, " ")); p->setFlags(stringtoint(strtok(NULL, " "))); + password = strtok(NULL, " "); strcpy(p->password, password); - temp->setNick("NULL"); - - printf("%s %d %ld %ld %ld %d %d %d %d %d %d %s %d %d %s\n", p->name, p->level, - p->exp, p->gold, p->bank, p->hp, p->maxhp, p->strength, p->defense, p->armor, p->weapon, - alive, p->forest_fights, p->player_fights, p->password); - + temp->setNick("!NULL!"); + #ifdef P10 + temp->setRealNick("!NULL!"); + #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, " "); + if (tempname) + p->inventory.setHealing(stringtoint(tempname)); + + tempname = strtok(NULL, " "); + if (tempname) + p->inventory.setStrength(stringtoint(tempname)); + + tempname = strtok(NULL, " "); + if (tempname) + p->inventory.setDefense(stringtoint(tempname)); + + tempname = strtok(NULL, " "); + if (tempname) + p->inventory.setHP(stringtoint(tempname)); + temp->stats->user = NULL; players.insertAtBack(temp); delete temp; } @@ -2715,7 +1897,7 @@ void do_store(char *u) } else if (!(user = find(u)) || !is_playing(user)) notice(s_GameServ, u, "You must be playing to use the store!"); - else if (!is_alive(user)) + else if (!isAlive(user->stats)) { notice(s_GameServ, u, "You are dead. Wait until tomorrow to purchase weapons and armor!"); return; @@ -2875,6 +2057,159 @@ void do_store(char *u) } } } +void do_inventory(char *u) +{ + aClient *user; + + if (!(user = find(u))) + { + notice(s_GameServ, u, "Fatal Error. Contact a %S admin!"); + return; + } + else if (!is_playing(user)) + { + notice(s_GameServ, u, "You must be playing to check your inventory!"); + return; + } + showinventory(user, user); +} +void showinventory(aClient *from, aClient *to) +{ + char *nick = to->getNick(); + + if (!to) + to = from; + if (is_playing(from)) + { + Pouch *p = &from->stats->inventory; + notice(s_GameServ, nick, "Inventory for %s:", from->stats->name); + notice(s_GameServ, nick, " Healing Potions: %d", p->Healing()); + notice(s_GameServ, nick, "Strength Potions: %d", p->Strength()); + notice(s_GameServ, nick, " Defense Potions: %d", p->Defense()); + notice(s_GameServ, nick, " HP Potions: %d", p->HP()); + } +} +void do_tavern(char *u) +{ + char *cmd = strtok(NULL, " "); + long int price; + + aClient *user; + Player *p; + if (!(user = find(u))) + { + notice(s_GameServ, u, "Fatal Error. See a %S admin for help"); + return; + } + else if (!is_playing(user)) + { + notice(s_GameServ, u, "You must be playing to go to the Tavern"); + return; + } + else if (is_fighting(user)) + { + notice(s_GameServ, u, "You cannot go to the Tavern during a fight!"); + return; + } + p = user->stats; + if (!cmd) + { + notice(s_GameServ, u, "Welcome to Boot Liquors Mystic Apothecary"); + notice(s_GameServ, u, "Your commands:"); + notice(s_GameServ, u, "/msg %S TAVERN {LIST | BUY} [NUMBER]"); + notice(s_GameServ, u, "What'll it be?"); + } + 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, "4. HP Potions for %ld Gold", 2300 * 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!"); + } + else if (stricmp(cmd, "BUY") == 0) + { + char *chnum = strtok(NULL, " "); + int num = stringtoint(chnum); + + if (!chnum) + { + notice(s_GameServ, u, "SYNTAX: TAVERN BUY #"); + notice(s_GameServ, u, "Example: /msg %S TAVERN BUY 1"); + return; + } + if (num < 1 || num > 4) + { + notice(s_GameServ, u, "Invalid Choice!"); + notice(s_GameServ, u, "Here is a list of what we have to offer:"); + notice(s_GameServ, u, "1. Healing Potions for %ld Gold", 1000 * p->level + (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, "4. HP Potions for %ld Gold", 2300 * 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; + } + switch(num) + { + case 1: + price = (1000 * p->level) + (p->exp / 10); + if (p->gold >= price) + { + notice(s_GameServ, u, "One healing potion coming right up!"); + p->inventory.incHealing(); + p->gold -= price; + } + else + notice(s_GameServ, u, "You don't have enough gold!"); + break; + case 2: + price = (2050 * p->level) + (p->exp / 10); + if (p->gold >= price) + { + notice(s_GameServ, u, "One strength boost coming right up!"); + p->inventory.incStrength(); + p->gold -= price; + } + else + notice(s_GameServ, u, "You don't have enough gold!"); + break; + case 3: + price = (2000 * p->level) + (p->exp / 10); + if (p->gold >= price) + { + notice(s_GameServ, u, "One defense boost coming right up!"); + p->inventory.incDefense(); + p->gold -= price; + } + else + notice(s_GameServ, u, "You don't have enough gold!"); + break; + case 4: + price = (2300 * 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; + } + } + else + { + notice(s_GameServ, u, "Improper Syntax."); + notice(s_GameServ, u, "Type /msg %S HELP TAVERN for help"); + } +} void do_bank(char *u) { @@ -2885,7 +2220,7 @@ 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"); @@ -2898,7 +2233,12 @@ void do_bank(char *u) notice(s_GameServ, u, "You must be playing to use the bank!"); return; } - else if (!is_alive(user)) + else 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!"); return; @@ -2911,11 +2251,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) { @@ -3035,7 +2371,7 @@ void do_master(char *u) notice(s_GameServ, u, "You're in the middle of a fight! Pay attention!"); return; } - else if (!is_alive(user)) + else if (!isAlive(user->stats)) { notice(s_GameServ, u, "You're dead. Wait until tomorrow to see your master!"); return; @@ -3190,10 +2526,11 @@ void refresh(Player *p) if (!p) return; - p->hp = p->maxhp; + if (p->hp < p->maxhp) + p->hp = p->maxhp; p->forest_fights = forestfights; p->player_fights = 3; - p->alive = true; + setAlive(p); clearMaster(p); } @@ -3205,7 +2542,7 @@ 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 (!isAdmin(user)) @@ -3223,16 +2560,101 @@ void do_refresh(char *u) notice(s_GameServ, u, "Refreshing everyone's stats!"); refreshall(); } - else if ((user = find(nick))) + else if ((user = findbyrealnick(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 + { + notice(s_GameServ, u, "Nick %s not found.", nick); + return; + } +} + + +void resetall() +{ + ListNode *it; + Player *p; + + it = players.First(); + + while (it) + { + p = it->getData()->stats; + reset(p); + it = it->Next(); + } +} + +void reset(Player *p) +{ + if (!p) + return; + + p->reset(); +} + +void do_reset(char *u) +{ + char *nick = strtok(NULL, " "); + aClient *user; + + if (!(user = find(u))) + { + notice(s_GameServ, u, "Error: aClient not found. Contact a %S admin"); + log("Error: aClient not found: %s", u); + return; + } + else if (!isAdmin(user)) + { + 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}"); + return; + } + else if (stricmp(nick, "ALL") == 0) + { + notice(s_GameServ, u, "Resetting everyone's stats!"); + resetall(); + } + else if ((user = findbyrealnick(nick))) + { + if (is_playing(user)) + { + #ifdef P10 + notice(s_GameServ, u, "Resetting %s.", user->getRealNick()); + #else + notice(s_GameServ, u, "Resetting %s.", user->getNick()); + #endif + reset(user->stats); + } + else + { + #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 @@ -3259,7 +2681,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; } @@ -3279,12 +2701,13 @@ void display_help(char *u, char *file) else { char *filename; + filename = new char[strlen(file) + 11]; + strcpy(filename, "helpfiles/"); + strcat(filename, file); - for (unsigned int x = 0; x < strlen(file); x++) - file[x] = tolower(file[x]); + for (unsigned int x = 10; x < strlen(filename); x++) + filename[x] = tolower(filename[x]); - filename = new char[strlen(file) + 12]; - sprintf(filename, "helpfiles/%s", file); infile.open(filename); delete [] filename; if (infile.fail()) @@ -3311,7 +2734,7 @@ 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; } @@ -3330,6 +2753,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 { @@ -3347,12 +2775,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;) @@ -3368,6 +2800,7 @@ bool load_monsters() monsters[l][m]->gold = stringtoint(strtok(NULL, "~")); monsters[l][m]->exp = stringtoint(strtok(NULL, "~")); monsters[l][m]->maxhp = stringtoint(strtok(NULL, "~")); + monsters[l][m]->hp = monsters[l][m]->maxhp; strcpy(monsters[l][m]->death, strtok(NULL, "")); m++; }