From: kainazzzo Date: Sun, 21 Jan 2007 18:44:31 +0000 (+0000) Subject: Moved some more code from gameserv.cpp and added loadsave.cpp and strings.cpp. X-Git-Url: https://jfr.im/git/irc/gameservirc.git/commitdiff_plain/32ae1ba93418ca263bf258d879999338f100e026 Moved some more code from gameserv.cpp and added loadsave.cpp and strings.cpp. git-svn-id: https://svn.code.sf.net/p/gameservirc/code/trunk@471 bc333340-6410-0410-a689-9d09f3c113fa --- diff --git a/gameserv/.depend b/gameserv/.depend index db8ce72..c23d348 100644 --- a/gameserv/.depend +++ b/gameserv/.depend @@ -1,5 +1,7 @@ aClient.o: aClient.cpp aClient.h options.h player.h script.h extern.h \ config.h +boolean.o: boolean.cpp extern.h config.h options.h aClient.h player.h \ + script.h flags.h config.o: config.cpp extern.h config.h options.h flags.h c_forest.o: c_forest.cpp aClient.h options.h player.h script.h extern.h \ config.h flags.h item.h level.h pouch.h sockhelp.h @@ -14,6 +16,8 @@ item.o: item.cpp item.h level.h player.h script.h extern.h config.h \ options.h level.o: level.cpp item.h level.h player.h script.h extern.h config.h \ options.h +loadsave.o: loadsave.cpp extern.h config.h options.h level.h player.h \ + script.h aClient.h item.h pouch.h toplist.h flags.h log.o: log.cpp extern.h config.h options.h news.o: news.cpp extern.h config.h options.h pouch.o: pouch.cpp extern.h config.h options.h pouch.h item.h level.h \ @@ -22,6 +26,7 @@ player.o: player.cpp item.h level.h player.h script.h pouch.h extern.h \ config.h options.h flags.h script.o: script.cpp script.h extern.h config.h options.h player.h sockhelp.o: sockhelp.cpp sockhelp.h extern.h config.h options.h +strings.o: strings.cpp extern.h config.h options.h messages.o: messages.cpp aClient.h options.h player.h script.h item.h \ level.h pouch.h extern.h config.h sockhelp.h flags.h toplist.o: toplist.cpp toplist.h player.h script.h diff --git a/gameserv/Makefile.in b/gameserv/Makefile.in index 6405d22..572e5ab 100644 --- a/gameserv/Makefile.in +++ b/gameserv/Makefile.in @@ -31,12 +31,14 @@ TSRCS = aClient.cpp \ hash.cpp \ item.cpp \ level.cpp \ + loadsave.cpp \ log.cpp \ news.cpp \ pouch.cpp \ player.cpp \ script.cpp \ sockhelp.cpp \ + strings.cpp \ messages.cpp \ toplist.cpp diff --git a/gameserv/gameserv.cpp b/gameserv/gameserv.cpp index c91338f..c56c427 100644 --- a/gameserv/gameserv.cpp +++ b/gameserv/gameserv.cpp @@ -46,15 +46,6 @@ int load_store(); int load_dragon(); int save_dragon(); -// String functions -#ifndef HAVE_STRTOK -char *strtok(char *str, const char *delim); -#endif - -int stricmp(const char *s1, const char *s2); -int strnicmp(const char *s1, const char *s2, size_t len); -// String Functions - bool shuttingdown; void updateTS(Player *p); @@ -387,74 +378,6 @@ void gameserv(char *source, char *buf) cmd--; // Same thing :) } -int stricmp(const char *s1, const char *s2) -{ - register int c; - - while ((c = tolower(*s1)) == tolower(*s2)) { - if (c == 0) - return 0; - s1++; - s2++; - } - if (c < tolower(*s2)) - return -1; - return 1; -} - - - -char *spaces(int len, char *seperator) -{ - char *final; - final = new char[30]; - int y; - strcpy(final, seperator); - for (y = 0; y < 30 - len; y++) - strcat(final, seperator); - return final; -} - - - -int strnicmp(const char *s1, const char *s2, size_t len) -{ - register int c; - - if (!len) - return 0; - while ((c = tolower(*s1)) == tolower(*s2) && len > 0) { - if (c == 0 || --len == 0) - return 0; - s1++; - s2++; - } - if (c < tolower(*s2)) - return -1; - return 1; -} - -#ifndef HAVE_STRTOK -char *strtok(char *str, const char *delim) -{ - static char *current = NULL; - char *ret; - - if (str) - current = str; - if (!current) - return NULL; - current += strspn(current, delim); - ret = *current ? current : NULL; - current += strcspn(current, delim); - if (!*current) - current = NULL; - else - *current++ = 0; - return ret; -} -#endif - void do_check(char *u) { int days, hours, minutes, seconds; @@ -1246,72 +1169,6 @@ void do_stats(char *u) showstats(u, nick); } -bool load_masters() -{ - ifstream infile(masterdata); - char *buf; - int l = 0; - buf = new char[1024]; - - if (infile.fail()) - { - log("Error opening %s", masterdata); - return false; - } - -#ifdef DEBUGMODE - log("Loading masters from %s", masterdata); -#endif - - for (l = 0; l < LEVELS - 1; l++) - { - infile.getline(buf, 1024, '\n'); - - log("%s", buf); - if (buf[0] == '#' || buf[0] == '\n' || buf[0] == '\r') - { - l--; - continue; - } - else if (buf[0] == '^') - break; - - Monster *master = &levels[l].master; - - char *name, *weapon, *strength, *gold, *exp, *maxhp, *death; - - - name = strtok(buf, "~"); - weapon = strtok(NULL, "~"); - strength = strtok(NULL, "~"); - gold = strtok(NULL, "~"); - exp = strtok(NULL, "~"); - maxhp = strtok(NULL, "~"); - death = strtok(NULL, "~"); - - master->name = name; - master->weapon = weapon; - master->strength = stringtoint(strength); - master->gold = stringtoint(gold); - master->exp = stringtoint(exp); - master->maxhp = stringtoint(maxhp); - master->hp = master->maxhp; - master->death = death; - } - - delete []buf; - - if (l < LEVELS - 1) // We didn't load a master for every level - check data/masters.dat - return false; - else - return true; -} - -void delete_monsters() -{ - for (int x = 0; x < LEVELS; x++) - levels[x].monsters.clear(); -} @@ -1836,412 +1693,6 @@ void do_heal(char *u) notice(s_GameServ, u, "SYNTAX: /msg 57) - return 0; - } -return 1; -} - -long int stringtoint(char *number) -{ - return atol(number); -} - -long int pow(int x, int y) -{ - long int value = 0; - int count = 0; - value += x; - - if (x != 0 && y != 0) - { - for (count = 1; count <= y - 1; count++) - value *= x; - } - else - { - return 1; - } - return value; -} - -long int chartoint(char ch) -{ - if (int(ch) >= 48 && int(ch) <= 57) - return int(ch) - 48; - else - return 0; -} - -int save_gs_dbase() -{ - list::iterator iter; - Player *it; - ofstream outfile; - - outfile.open(playerdata); - - if (!outfile) - { - log("Error opening %s", playerdata); - return 0; - } - - for (unsigned long x = 0; x < U_TABLE_SIZE; x++) - { - for(iter = players[x].begin(); iter != players[x].end(); iter++) - { - it = (*iter); - clearYourTurn(it); - item *w, *a; - w = it->getWeapon(); - a = it->getArmor(); - - outfile << it->getName().c_str() << ' ' << it->getLevel() << ' ' << it->getExp() << ' ' << it->getGold() << ' ' << it->getBank() << ' '<< it->getHP() << ' ' << it->getMaxHP() << ' ' << it->getStrength() << ' ' << it->getDefense() << ' ' << it->getForestFights() << ' ' << it->getPlayerFights() << ' ' << it->getFlags() << ' ' << it->getPassword().c_str() << ' ' << it->lastlogin << ' ' << (w ? w->getID() : 0) << ' ' << (a ? a->getID() : 0); - - // Traverse the list and write out each item ID and how many uses are left - if (!it->inventory->isEmpty()) - { - list *myitems; - list::iterator item_iter; - myitems = it->inventory->getItems(); - - for(item_iter = myitems->begin();item_iter != myitems->end();item_iter++) - { - outfile << ' ' << (*item_iter).getItem()->getID() << ' ' << (*item_iter).getUses(); - } - } - outfile << endl; - } - } - outfile.close(); - return 1; -} - -int load_dragon() -{ - ifstream infile; - char *buf; - - infile.open(dragondata); - - if (infile.fail()) - { - infile.clear(); - log ("Error opening %s. Trying initialdragon.dat", dragondata); - infile.open("data/initialdragon.dat"); - if (infile.fail()) - { - log ("Error opening data/initialdragon.dat"); - return 0; - } - } - - buf = new char[1024]; - - infile.getline(buf, 1024, '\n'); - infile.close(); // Done with the file... we have what we want - - dragon.name = strtok(buf, "~"); - dragon.weapon = strtok(NULL, "~"); - dragon.gold = 0; - dragon.exp = 0; - dragon.strength = stringtoint(strtok(NULL, "~")); - dragon.hp = stringtoint(strtok(NULL, "~")); - dragon.defense = stringtoint(strtok(NULL, "~")); - dragon.death = strtok(NULL, ""); - - log ("loaded dragon: %s", dragon.name.c_str()); - - delete []buf; - -return save_dragon(); // Save the dragon file and return the status code :) -} - -int save_dragon() -{ - ofstream outfile; - - outfile.open(dragondata); - - if (outfile.fail()) - { - log ("Error opening %s. Exiting.", dragondata); - return 0; - } - - outfile << dragon.name.c_str() << '~' << dragon.weapon.c_str() << '~' - << dragon.strength << '~' << dragon.hp << '~' - << dragon.defense << '~' << dragon.death.c_str() << "\n^" - << endl; - -outfile.close(); - -return 1; -} - -int load_store() -{ - ifstream infile; - char *buf; - item *tempItem; - buf = new char[1024]; - long id; - - infile.open(storeitemdata); - - if (infile.fail()) - { - log("Error opening %s", storeitemdata); - return 0; - } - - while (infile.getline(buf, 1024, '\n')) - { - try - { - if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0') - { - item *tempItem2; - id = stringtoint(strtok(buf, "")); - tempItem2 = findItemByID(id); - if (tempItem2 == NULL) - { - log("Invalid ID in %s", storeitemdata); - return 0; - } - - tempItem = tempItem2; - store.push_back(tempItem); - } - } - catch (char *str) - { - log("Exception loading store: %s", str); - delete []buf; - return 0; - } - } - delete []buf; - return 1; -} -int load_tavern() -{ - ifstream infile; - char *buf; - tavernItem tempItem; - buf = new char[1024]; - long id, level; - - infile.open(tavernitemdata); - if (infile.fail()) - { - log("Error opening %s", tavernitemdata); - return 0; - } - - while (infile.getline(buf, 1024, '\n')) - { - try - { - if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0') - { - item *tempItem2; - id = stringtoint(strtok(buf, "~")); - level = stringtoint(strtok(NULL, "")); - tempItem2 = findItemByID(id); - if (tempItem2 == NULL) - { - log("Invalid ID in %s", tavernitemdata); - return 0; - } - tempItem.setItem(tempItem2); - tempItem.setLevel(level); - tavern.push_back(tempItem); - } - } - catch (char *str) - { - log("Exception loading tavern: %s", str); - delete []buf; - return 0; - } - } - delete []buf; - return 1; -} -int load_items() -{ - ifstream infile; - char *buf; - item *tempItem; - - buf = new char[1024]; - - infile.open(itemdata); - - if (infile.fail()) - { - log("Error opening %s", itemdata); - return 0; - } - - while (infile.getline(buf, 1024, '\n')) - { - if (buf[0] == '^') - break; - try - { - if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0') - { - switch(buf[0]) - { - case '1': - tempItem = new weapon(); - break; - case '2': - tempItem = new armor(); - break; - case '3': - tempItem = new potion(); - break; - default: - log("Invalid Item Type %c in %s", buf[0], itemdata); - delete []buf; - return 0; - break; - } - if(tempItem->setData(buf)) - { - Items.push_back(tempItem); - } - } - } - catch (char *str) - { - log("Exception loading items: %s", str); - delete []buf; - return 0; - } - } - delete []buf; - return 1; -} - -int load_gs_dbase() -{ - ifstream infile; - Player *p; - char *tempname, *buf, *password; - int tempnum; - buf = new char[100000]; - - infile.open(playerdata); - - if (infile.fail()) - { - log("Error opening %s", playerdata); - return 0; - } - - - for (int x = 0; x < U_TABLE_SIZE; x++) - { - list::iterator iter; - - for (iter = players[x].begin(); iter != players[x].end(); iter++) - { - logout((*iter)->getClient()); - delete (*iter); - } - players[x].clear(); - } - - while (infile.getline(buf, 100000, '\n')) - { - tempname = strtok(buf, " "); - p = new Player(tempname); - - p->setLevel(stringtoint(strtok(NULL, " "))); - p->setExp(stringtoint(strtok(NULL, " "))); - p->setGold(stringtoint(strtok(NULL, " "))); - p->setBank(stringtoint(strtok(NULL, " "))); - tempnum = stringtoint(strtok(NULL, " ")); - p->setMaxHP(stringtoint(strtok(NULL, " "))); - p->setHP(tempnum); - p->setStrength(stringtoint(strtok(NULL, " "))); - p->setDefense(stringtoint(strtok(NULL, " "))); - p->setForestFights(stringtoint(strtok(NULL, " "))); - p->setPlayerFights(stringtoint(strtok(NULL, " "))); - p->setFlags(stringtoint(strtok(NULL, " "))); - - - - password = strtok(NULL, " "); - p->setRawPassword(password); - tempname = strtok(NULL, " "); - - if (tempname) - p->lastlogin = stringtoint(tempname); - else - p->lastlogin = time(NULL); - - tempname = strtok(NULL, " "); - tempnum = stringtoint(tempname); - item *tempitem; - if (tempnum != 0) - { - tempitem = findItemByID(tempnum); - p->setWeapon(*tempitem); - } - - tempname = strtok(NULL, " "); - tempnum = stringtoint(tempname); - - if (tempnum != 0) - { - tempitem = findItemByID(tempnum); - p->setArmor(*tempitem); - } - - - unsigned long hv = iHASH((unsigned char *) p->getName().c_str()); - - p->setClient(NULL); - - for (tempname = strtok(NULL, " "); tempname != NULL; tempname = strtok(NULL, " ")) - { - long int id, uses; - list::iterator item_iter; - id = stringtoint(tempname); - tempname = strtok(NULL, " "); - uses = stringtoint(tempname); - - item_iter = Items.begin(); - while (item_iter != Items.end()) - { - if ((*item_iter)->getID() == id) - { - // Don't sort every time you add an item or it eats CPU - p->inventory->addItemNoChecks((*item_iter))->setUses(uses); - } - item_iter++; - } - } - p->inventory->sort(); - myToplist.insertPlayer(p); - players[hv].push_back(p); - } - - delete [] buf; - infile.close(); - return 1; -} @@ -3280,71 +2731,3 @@ void do_admin(char *u) } } -bool load_levels() -{ - char *filename; - filename = new char[256]; - - for (int x = 1; x <= LEVELS; x++) - { - sprintf(filename, "data/levels/level%d.dat", x); - if (levels[x - 1].loadLevel(filename) == false) - { - delete []filename; - return false; - } - } - - delete []filename; - return true; -} - -bool load_monsters() -{ - char *filename; - ifstream infile; - char *buf; - buf = new char[2048]; - - for (int level = 1; level <= LEVELS; level++) - { - filename = new char[256]; - sprintf(filename, "data/monsters/level%d.dat", level); - infile.open(filename); - - if (!infile) - { - log("Error opening %s", filename); - delete []filename; - delete []buf; - return false; - } - -#ifdef DEBUGMODE - log("Loading monsters from %s", filename); -#endif - - while (infile.getline(buf, 2048)) - { - if (buf[0] == '^') - break; - if (buf[0] == '\n' || buf[0] == '\0' || buf[0] == '#') - continue; - Monster *temp; - temp = new Monster; - - temp->name = strtok(buf, "~"); - temp->weapon = strtok(NULL, "~"); - temp->death = strtok(NULL, "~"); - - levels[level - 1].monsters.push_back(temp); - - } - delete [] filename; - infile.close(); - } - delete [] buf; - return true; -} - - diff --git a/gameserv/loadsave.cpp b/gameserv/loadsave.cpp new file mode 100755 index 0000000..b3a5060 --- /dev/null +++ b/gameserv/loadsave.cpp @@ -0,0 +1,518 @@ + /* This file includes functions that deal with loading and + saving to and from files. It also includes some miscellaneous related + functions */ + + #include "extern.h" + #include "level.h" + #include "player.h" + #include "aClient.h" + #include "item.h" + #include "pouch.h" + #include "toplist.h" + #include "flags.h" + + #include + + using namespace std; + + bool load_masters() +{ + ifstream infile(masterdata); + char *buf; + int l = 0; + buf = new char[1024]; + + if (infile.fail()) + { + log("Error opening %s", masterdata); + return false; + } + +#ifdef DEBUGMODE + log("Loading masters from %s", masterdata); +#endif + + for (l = 0; l < LEVELS - 1; l++) + { + infile.getline(buf, 1024, '\n'); + + log("%s", buf); + if (buf[0] == '#' || buf[0] == '\n' || buf[0] == '\r') + { + l--; + continue; + } + else if (buf[0] == '^') + break; + + Monster *master = &levels[l].master; + + char *name, *weapon, *strength, *gold, *exp, *maxhp, *death; + + + name = strtok(buf, "~"); + weapon = strtok(NULL, "~"); + strength = strtok(NULL, "~"); + gold = strtok(NULL, "~"); + exp = strtok(NULL, "~"); + maxhp = strtok(NULL, "~"); + death = strtok(NULL, "~"); + + master->name = name; + master->weapon = weapon; + master->strength = stringtoint(strength); + master->gold = stringtoint(gold); + master->exp = stringtoint(exp); + master->maxhp = stringtoint(maxhp); + master->hp = master->maxhp; + master->death = death; + } + + delete []buf; + + if (l < LEVELS - 1) // We didn't load a master for every level - check data/masters.dat + return false; + else + return true; +} + +void delete_monsters() +{ + for (int x = 0; x < LEVELS; x++) + levels[x].monsters.clear(); +} + +int save_gs_dbase() +{ + list::iterator iter; + Player *it; + ofstream outfile; + + outfile.open(playerdata); + + if (!outfile) + { + log("Error opening %s", playerdata); + return 0; + } + + for (unsigned long x = 0; x < U_TABLE_SIZE; x++) + { + for(iter = players[x].begin(); iter != players[x].end(); iter++) + { + it = (*iter); + clearYourTurn(it); + item *w, *a; + w = it->getWeapon(); + a = it->getArmor(); + + outfile << it->getName().c_str() << ' ' << it->getLevel() << ' ' << it->getExp() << ' ' << it->getGold() << ' ' << it->getBank() << ' '<< it->getHP() << ' ' << it->getMaxHP() << ' ' << it->getStrength() << ' ' << it->getDefense() << ' ' << it->getForestFights() << ' ' << it->getPlayerFights() << ' ' << it->getFlags() << ' ' << it->getPassword().c_str() << ' ' << it->lastlogin << ' ' << (w ? w->getID() : 0) << ' ' << (a ? a->getID() : 0); + + // Traverse the list and write out each item ID and how many uses are left + if (!it->inventory->isEmpty()) + { + list *myitems; + list::iterator item_iter; + myitems = it->inventory->getItems(); + + for(item_iter = myitems->begin();item_iter != myitems->end();item_iter++) + { + outfile << ' ' << (*item_iter).getItem()->getID() << ' ' << (*item_iter).getUses(); + } + } + outfile << endl; + } + } + outfile.close(); + return 1; +} + +int load_dragon() +{ + ifstream infile; + char *buf; + + infile.open(dragondata); + + if (infile.fail()) + { + infile.clear(); + log ("Error opening %s. Trying initialdragon.dat", dragondata); + infile.open("data/initialdragon.dat"); + if (infile.fail()) + { + log ("Error opening data/initialdragon.dat"); + return 0; + } + } + + buf = new char[1024]; + + infile.getline(buf, 1024, '\n'); + infile.close(); // Done with the file... we have what we want + + dragon.name = strtok(buf, "~"); + dragon.weapon = strtok(NULL, "~"); + dragon.gold = 0; + dragon.exp = 0; + dragon.strength = stringtoint(strtok(NULL, "~")); + dragon.hp = stringtoint(strtok(NULL, "~")); + dragon.defense = stringtoint(strtok(NULL, "~")); + dragon.death = strtok(NULL, ""); + + log ("loaded dragon: %s", dragon.name.c_str()); + + delete []buf; + +return save_dragon(); // Save the dragon file and return the status code :) +} + +int save_dragon() +{ + ofstream outfile; + + outfile.open(dragondata); + + if (outfile.fail()) + { + log ("Error opening %s. Exiting.", dragondata); + return 0; + } + + outfile << dragon.name.c_str() << '~' << dragon.weapon.c_str() << '~' + << dragon.strength << '~' << dragon.hp << '~' + << dragon.defense << '~' << dragon.death.c_str() << "\n^" + << endl; + +outfile.close(); + +return 1; +} + +int load_store() +{ + ifstream infile; + char *buf; + item *tempItem; + buf = new char[1024]; + long id; + + infile.open(storeitemdata); + + if (infile.fail()) + { + log("Error opening %s", storeitemdata); + return 0; + } + + while (infile.getline(buf, 1024, '\n')) + { + try + { + if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0') + { + item *tempItem2; + id = stringtoint(strtok(buf, "")); + tempItem2 = findItemByID(id); + if (tempItem2 == NULL) + { + log("Invalid ID in %s", storeitemdata); + return 0; + } + + tempItem = tempItem2; + store.push_back(tempItem); + } + } + catch (char *str) + { + log("Exception loading store: %s", str); + delete []buf; + return 0; + } + } + delete []buf; + return 1; +} +int load_tavern() +{ + ifstream infile; + char *buf; + tavernItem tempItem; + buf = new char[1024]; + long id, level; + + infile.open(tavernitemdata); + if (infile.fail()) + { + log("Error opening %s", tavernitemdata); + return 0; + } + + while (infile.getline(buf, 1024, '\n')) + { + try + { + if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0') + { + item *tempItem2; + id = stringtoint(strtok(buf, "~")); + level = stringtoint(strtok(NULL, "")); + tempItem2 = findItemByID(id); + if (tempItem2 == NULL) + { + log("Invalid ID in %s", tavernitemdata); + return 0; + } + tempItem.setItem(tempItem2); + tempItem.setLevel(level); + tavern.push_back(tempItem); + } + } + catch (char *str) + { + log("Exception loading tavern: %s", str); + delete []buf; + return 0; + } + } + delete []buf; + return 1; +} +int load_items() +{ + ifstream infile; + char *buf; + item *tempItem; + + buf = new char[1024]; + + infile.open(itemdata); + + if (infile.fail()) + { + log("Error opening %s", itemdata); + return 0; + } + + while (infile.getline(buf, 1024, '\n')) + { + if (buf[0] == '^') + break; + try + { + if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\0') + { + switch(buf[0]) + { + case '1': + tempItem = new weapon(); + break; + case '2': + tempItem = new armor(); + break; + case '3': + tempItem = new potion(); + break; + default: + log("Invalid Item Type %c in %s", buf[0], itemdata); + delete []buf; + return 0; + break; + } + if(tempItem->setData(buf)) + { + Items.push_back(tempItem); + } + } + } + catch (char *str) + { + log("Exception loading items: %s", str); + delete []buf; + return 0; + } + } + delete []buf; + return 1; +} + +int load_gs_dbase() +{ + ifstream infile; + Player *p; + char *tempname, *buf, *password; + int tempnum; + buf = new char[100000]; + + infile.open(playerdata); + + if (infile.fail()) + { + log("Error opening %s", playerdata); + return 0; + } + + + for (int x = 0; x < U_TABLE_SIZE; x++) + { + list::iterator iter; + + for (iter = players[x].begin(); iter != players[x].end(); iter++) + { + logout((*iter)->getClient()); + delete (*iter); + } + players[x].clear(); + } + + while (infile.getline(buf, 100000, '\n')) + { + tempname = strtok(buf, " "); + p = new Player(tempname); + + p->setLevel(stringtoint(strtok(NULL, " "))); + p->setExp(stringtoint(strtok(NULL, " "))); + p->setGold(stringtoint(strtok(NULL, " "))); + p->setBank(stringtoint(strtok(NULL, " "))); + tempnum = stringtoint(strtok(NULL, " ")); + p->setMaxHP(stringtoint(strtok(NULL, " "))); + p->setHP(tempnum); + p->setStrength(stringtoint(strtok(NULL, " "))); + p->setDefense(stringtoint(strtok(NULL, " "))); + p->setForestFights(stringtoint(strtok(NULL, " "))); + p->setPlayerFights(stringtoint(strtok(NULL, " "))); + p->setFlags(stringtoint(strtok(NULL, " "))); + + + + password = strtok(NULL, " "); + p->setRawPassword(password); + tempname = strtok(NULL, " "); + + if (tempname) + p->lastlogin = stringtoint(tempname); + else + p->lastlogin = time(NULL); + + tempname = strtok(NULL, " "); + tempnum = stringtoint(tempname); + item *tempitem; + if (tempnum != 0) + { + tempitem = findItemByID(tempnum); + p->setWeapon(*tempitem); + } + + tempname = strtok(NULL, " "); + tempnum = stringtoint(tempname); + + if (tempnum != 0) + { + tempitem = findItemByID(tempnum); + p->setArmor(*tempitem); + } + + + unsigned long hv = iHASH((unsigned char *) p->getName().c_str()); + + p->setClient(NULL); + + for (tempname = strtok(NULL, " "); tempname != NULL; tempname = strtok(NULL, " ")) + { + long int id, uses; + list::iterator item_iter; + id = stringtoint(tempname); + tempname = strtok(NULL, " "); + uses = stringtoint(tempname); + + item_iter = Items.begin(); + while (item_iter != Items.end()) + { + if ((*item_iter)->getID() == id) + { + // Don't sort every time you add an item or it eats CPU + p->inventory->addItemNoChecks((*item_iter))->setUses(uses); + } + item_iter++; + } + } + p->inventory->sort(); + myToplist.insertPlayer(p); + players[hv].push_back(p); + } + + delete [] buf; + infile.close(); + return 1; +} + +bool load_levels() +{ + char *filename; + filename = new char[256]; + + for (int x = 1; x <= LEVELS; x++) + { + sprintf(filename, "data/levels/level%d.dat", x); + if (levels[x - 1].loadLevel(filename) == false) + { + delete []filename; + return false; + } + } + + delete []filename; + return true; +} + +bool load_monsters() +{ + char *filename; + ifstream infile; + char *buf; + buf = new char[2048]; + + for (int level = 1; level <= LEVELS; level++) + { + filename = new char[256]; + sprintf(filename, "data/monsters/level%d.dat", level); + infile.open(filename); + + if (!infile) + { + log("Error opening %s", filename); + delete []filename; + delete []buf; + return false; + } + +#ifdef DEBUGMODE + log("Loading monsters from %s", filename); +#endif + + while (infile.getline(buf, 2048)) + { + if (buf[0] == '^') + break; + if (buf[0] == '\n' || buf[0] == '\0' || buf[0] == '#') + continue; + Monster *temp; + temp = new Monster; + + temp->name = strtok(buf, "~"); + temp->weapon = strtok(NULL, "~"); + temp->death = strtok(NULL, "~"); + + levels[level - 1].monsters.push_back(temp); + + } + delete [] filename; + infile.close(); + } + delete [] buf; + return true; +} + + + diff --git a/gameserv/strings.cpp b/gameserv/strings.cpp new file mode 100755 index 0000000..9a4d3a3 --- /dev/null +++ b/gameserv/strings.cpp @@ -0,0 +1,123 @@ + /* This file contains functions dealing with strings */ + + #include "extern.h" + #include "config.h" + + // String functions +#ifndef HAVE_STRTOK +char *strtok(char *str, const char *delim); +#endif + +int stricmp(const char *s1, const char *s2); +int strnicmp(const char *s1, const char *s2, size_t len); +// String Functions + +int stricmp(const char *s1, const char *s2) +{ + register int c; + + while ((c = tolower(*s1)) == tolower(*s2)) { + if (c == 0) + return 0; + s1++; + s2++; + } + if (c < tolower(*s2)) + return -1; + return 1; +} + + + +char *spaces(int len, char *seperator) +{ + char *final; + final = new char[30]; + int y; + strcpy(final, seperator); + for (y = 0; y < 30 - len; y++) + strcat(final, seperator); + return final; +} + + + +int strnicmp(const char *s1, const char *s2, size_t len) +{ + register int c; + + if (!len) + return 0; + while ((c = tolower(*s1)) == tolower(*s2) && len > 0) { + if (c == 0 || --len == 0) + return 0; + s1++; + s2++; + } + if (c < tolower(*s2)) + return -1; + return 1; +} + +#ifndef HAVE_STRTOK +char *strtok(char *str, const char *delim) +{ + static char *current = NULL; + char *ret; + + if (str) + current = str; + if (!current) + return NULL; + current += strspn(current, delim); + ret = *current ? current : NULL; + current += strcspn(current, delim); + if (!*current) + current = NULL; + else + *current++ = 0; + return ret; +} +#endif + +int isstringnum(char *num) +{ + unsigned int x; + for (x = 0; x < strlen(num); x++) + { + if ((int)num[x] < 48 || (int)num[x] > 57) + return 0; + } +return 1; +} + +long int stringtoint(char *number) +{ + return atol(number); +} + +long int pow(int x, int y) +{ + long int value = 0; + int count = 0; + value += x; + + if (x != 0 && y != 0) + { + for (count = 1; count <= y - 1; count++) + value *= x; + } + else + { + return 1; + } + return value; +} + +long int chartoint(char ch) +{ + if (int(ch) >= 48 && int(ch) <= 57) + return int(ch) - 48; + else + return 0; +}