#include "player.h"
#include "pouch.h"
#include "flags.h"
-#include "list.h"
#include "level.h"
#include "sockhelp.h"
#include "item.h"
void showstats(const char *u, const char *nick)
{
- aClient *ni, *sender = find(u);
+ aClient *sender = find(u);
+ Player *p;
char *buf;
buf = new char[50];
char *space;
- if (!(ni = findplayer(nick)))
+ if (!(p = findplayer(nick)))
{
notice(s_GameServ, u, "%s not found", nick);
}
- else if (ni->stats)
+ else
{
- notice(s_GameServ, sender->getNick(), "Stats for %s:", ni->stats->getName().c_str());
+ notice(s_GameServ, sender->getNick(), "Stats for %s:", p->getName().c_str());
- sprintf(buf, "Experience: %ld", ni->stats->getExp());
+ sprintf(buf, "Experience: %ld", p->getExp());
space = spaces(strlen(buf), " ");
notice(s_GameServ, sender->getNick(), "%s%sLevel: %d", buf, space,
- ni->stats->getLevel());
+ p->getLevel());
delete [] space;
- sprintf(buf, "Gold: %ld", ni->stats->getGold());
+ sprintf(buf, "Gold: %ld", p->getGold());
space = spaces(strlen(buf), " ");
- notice(s_GameServ, sender->getNick(), "%s%sGold in Bank: %ld", buf, space, ni->stats->getBank());
+ notice(s_GameServ, sender->getNick(), "%s%sGold in Bank: %ld", buf, space, p->getBank());
delete [] space;
- notice(s_GameServ, sender->getNick(), "Hit Points: %d of %d", ni->stats->getHP(),
- ni->stats->getMaxHP());
+ notice(s_GameServ, sender->getNick(), "Hit Points: %d of %d", p->getHP(),
+ p->getMaxHP());
- sprintf(buf, "Strength: %d", ni->stats->getStrength());
+ sprintf(buf, "Strength: %d", p->getStrength());
space = spaces(strlen(buf), " ");
notice(s_GameServ, sender->getNick(), "%s%sDefense: %d",
- buf, space, ni->stats->getDefense());
+ buf, space, p->getDefense());
delete [] space;
- sprintf(buf, "Armor: %s", (ni->stats->getArmor() ? ni->stats->getArmor()->getName().c_str() : "Nothing"));
+ sprintf(buf, "Armor: %s", (p->getArmor() ? p->getArmor()->getName().c_str() : "Nothing"));
space = spaces(strlen(buf), " ");
notice(s_GameServ, sender->getNick(), "%s%sWeapon: %s", buf, space,
- (ni->stats->getWeapon() ? ni->stats->getWeapon()->getName().c_str() : "Fists"));
+ (p->getWeapon() ? p->getWeapon()->getName().c_str() : "Fists"));
delete [] space;
- sprintf(buf, "Forest Fights: %d", ni->stats->getForestFights());
+ sprintf(buf, "Forest Fights: %d", p->getForestFights());
space = spaces(strlen(buf), " ");
- notice(s_GameServ, sender->getNick(), "%s%sPlayer Fights: %d", buf, space, ni->stats->getPlayerFights());
+ notice(s_GameServ, sender->getNick(), "%s%sPlayer Fights: %d", buf, space, p->getPlayerFights());
delete [] space;
- if (ni == sender || isAdmin(sender))
+ if (p->getClient() == sender || isAdmin(sender))
{
- showinventory(ni->stats, sender);
+ showinventory(p, sender);
}
}
- else
- {
- notice(s_GameServ, u, "%s is not playing!", ni->stats->getName().c_str());
- }
+
delete [] buf;
}
void do_list(char *u)
{
aClient *user;
+ Player *p;
char *cmd = strtok(NULL, " ");
if (!(user = find(u)))
return;
}
- list<aClient*>::iterator iter;
+ list<Player*>::iterator iter;
bool header = false;
- if (isAdmin(user))
- {
- for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
- {
- for (iter = clients[x].begin(); iter != clients[x].end(); iter++)
- {
- notice(s_GameServ, u, "Nick: %s", (*iter)->getNick());
- }
- }
- }
for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
{
iter = players[x].begin();
{
while(iter != players[x].end())
{
- if (cmd || is_playing((*iter)))
+ p = (*iter);
+ if (cmd || is_playing(p->getClient()))
{
if (!header)
{
header = true;
}
#ifdef P10
- notice(s_GameServ, u, "IRC: %s Game: %s", (*iter)->getRealNick(),
- (*iter)->stats->getName().c_str());
+ notice(s_GameServ, u, "IRC: %s Game: %s", (p->getClient() ? p->getClient()->getRealNick() : "Not Playing"),
+ p->getName().c_str());
#else
- notice(s_GameServ, u, "IRC: %s Game: %s", (*iter)->getNick(),
- (*iter)->stats->getName().c_str());
+ notice(s_GameServ, u, "IRC: %s Game: %s", (p->getClient() ? p->getClient()->getNick() : "Not Playing"),
+ p->getName().c_str());
#endif
}
iter++;
void do_set(char *u)
{
- aClient *user, *target;
+ aClient *user;
+ Player *p;
char *name = strtok(NULL, " ");
char *cmd = strtok(NULL, " ");
char *cmd2;
notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|ALIVE|SEEN MASTER} {STRING|NUMBER|TRUE|FALSE}");
return;
}
- else if (!(target = findplayer(name)))
+ else if (!(p = findplayer(name)))
{
// Back the pointers up... they didn't send a name probably
cmd2 = cmd;
cmd = name;
- target = user;
+ p = user->stats;
if (!is_playing(user))
{
// Person is looking to change their password
// If they're an admin, or it's theirself, allow it
// cmd2 is pointing to the password now
- if (isAdmin(user) || user == target)
+ if (isAdmin(user) || user == p->getClient())
{
- target->stats->setPassword(cmd2);
+ p->setPassword(cmd2);
notice(s_GameServ, u, "Password successfully changed");
}
- else if (user != target && !isAdmin(user))
+ else if (user != p->getClient() && !isAdmin(user))
{
notice(s_GameServ, u, "You must be a %S admin to set other peoples' passwords.");
return;
return;
}
- target->stats->setBank(stringtoint(cmd2));
+ p->setBank(stringtoint(cmd2));
- notice(s_GameServ, u, "Bank balance changed to %ld!", target->stats->getBank());
+ notice(s_GameServ, u, "Bank balance changed to %ld!", p->getBank());
}
else if (stricmp(cmd, "PLAYER") == 0)
{
notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>");
return;
}
- target->stats->setPlayerFights(stringtoint(cmd2));
+ p->setPlayerFights(stringtoint(cmd2));
- notice(s_GameServ, u, "Player fights changed to %d!", target->stats->getPlayerFights());
+ notice(s_GameServ, u, "Player fights changed to %d!", p->getPlayerFights());
}
}
else if (stricmp(cmd, "FOREST") == 0)
return;
}
- target->stats->setForestFights(stringtoint(cmd2));
+ p->setForestFights(stringtoint(cmd2));
- notice(s_GameServ, u, "Forest fights changed to %d!", target->stats->getForestFights());
+ notice(s_GameServ, u, "Forest fights changed to %d!", p->getForestFights());
}
}
else if (stricmp(cmd, "GOLD") == 0)
notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] GOLD <NUMBER>");
return;
}
- target->stats->setGold(stringtoint(cmd2));
+ p->setGold(stringtoint(cmd2));
- notice(s_GameServ, u, "Gold set to %ld", target->stats->getGold());
+ notice(s_GameServ, u, "Gold set to %ld", p->getGold());
return;
}
}
return;
}
- target->stats->setStrength(stringtoint(cmd2));
+ p->setStrength(stringtoint(cmd2));
- notice(s_GameServ, u, "Strength set to %d", target->stats->getStrength());
+ notice(s_GameServ, u, "Strength set to %d", p->getStrength());
return;
}
}
return;
}
- target->stats->setDefense(stringtoint(cmd2));
+ p->setDefense(stringtoint(cmd2));
- notice(s_GameServ, u, "Defense set to %d", target->stats->getDefense());
+ notice(s_GameServ, u, "Defense set to %d", p->getDefense());
return;
}
}
notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HP <NUMBER>");
return;
}
- target->stats->setHP(stringtoint(cmd2));
+ p->setHP(stringtoint(cmd2));
- notice(s_GameServ, u, "HP set to %d", target->stats->getHP());
+ notice(s_GameServ, u, "HP set to %d", p->getHP());
return;
}
}
notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] MAXHP <NUMBER>");
return;
}
- target->stats->setMaxHP(stringtoint(cmd2));
+ p->setMaxHP(stringtoint(cmd2));
- notice(s_GameServ, u, "MaxHP set to %d", target->stats->getMaxHP());
+ notice(s_GameServ, u, "MaxHP set to %d", p->getMaxHP());
return;
}
}
return;
}
- target->stats->setExp(stringtoint(cmd2));
+ p->setExp(stringtoint(cmd2));
- notice(s_GameServ, u, "Exp set to %ld", target->stats->getExp());
+ notice(s_GameServ, u, "Exp set to %ld", p->getExp());
return;
}
}
notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] LEVEL <NUMBER>");
return;
}
- target->stats->setLevel(stringtoint(cmd2));
+ p->setLevel(stringtoint(cmd2));
- notice(s_GameServ, u, "Level set to %d", target->stats->getLevel());
+ notice(s_GameServ, u, "Level set to %d", p->getLevel());
return;
}
}
}
else if (stricmp(cmd2, "TRUE") == 0)
{
- notice(s_GameServ, u, "%s has been Resurrected!", target->stats->getName().c_str());
- setAlive(target->stats);
+ notice(s_GameServ, u, "%s has been Resurrected!", p->getName().c_str());
+ setAlive(p);
}
else
{
- notice(s_GameServ, u, "%s is now dead!", target->stats->getName().c_str());
- clearAlive(target->stats);
+ notice(s_GameServ, u, "%s is now dead!", p->getName().c_str());
+ clearAlive(p);
}
}
}
}
else if (stricmp(cmd2, "TRUE") == 0)
{
- notice(s_GameServ, u, "%s has seen their master now.", target->stats->getName().c_str());
- target->stats->addFlag(FLAG_MASTER);
+ notice(s_GameServ, u, "%s has seen their master now.", p->getName().c_str());
+ p->addFlag(FLAG_MASTER);
}
else
{
- notice(s_GameServ, u, "%s has not seen their master now.", target->stats->getName().c_str());
- target->stats->remFlag(FLAG_MASTER);
+ notice(s_GameServ, u, "%s has not seen their master now.", p->getName().c_str());
+ p->remFlag(FLAG_MASTER);
}
}
}
void do_logout(char *u)
{
aClient *user;
+ Player *p;
char *name = strtok(NULL, " ");
if (!(user = find(u)))
{
notice(s_GameServ, u, "You must be a %S admin to use this command!");
}
- else if (!(user = findplayer(name)))
+ else if (!(p = findplayer(name)))
{
notice(s_GameServ, u, "Couldn't find a player named %s", name);
}
else
{
- notice(s_GameServ, u, "Logging out %s", user->stats->getName().c_str());
- logout(user);
+ notice(s_GameServ, u, "Logging out %s", p->getName().c_str());
+ logout(p->getClient());
}
}
else if (!name)
void logout(aClient *user)
{
- if (is_playing(user))
+ if (user != NULL)
{
- list<aClient*>::iterator iter;
- aClient *temp;
- unsigned long hv = iHASH((unsigned char *) user->stats->getName().c_str());
- iter = find(players[hv].begin(), players[hv].end(), user);
-
- if (iter == players[hv].end())
- {
- notice(s_GameServ, user->getNick(), "Fatal error. Contact "\
- "%S Admin. Cannot find you in the players list. This should NEVER happen");
- log("Error on logout(). Can't find %s in the players list",
+ if (user->stats != NULL)
+ {
+
+ list<Player*>::iterator iter;
+ unsigned long hv = iHASH((unsigned char *) user->stats->getName().c_str());
+ iter = find(players[hv].begin(), players[hv].end(), user->stats);
+
+ if (iter == players[hv].end())
+ {
+ notice(s_GameServ, user->getNick(), "Fatal error. Contact "\
+ "%S Admin. Cannot find you in the players list. This should NEVER happen");
+ log("Error on logout(). Can't find %s in the players list",
#ifdef P10
- user->getRealNick()
+ user->getRealNick()
#else
- user->getNick()
+ user->getNick()
#endif
- );
- return;
- }
- user->stats->delMonster();
- user->stats->delMaster();
- clearDragonFight(user->stats);
- clearYourTurn(user->stats);
-
- if (player_fight(user))
- {
- clearYourTurn(user->stats->getBattle()->stats);
- user->stats->getBattle()->stats->delBattle();
- }
-
- user->stats->delBattle();
-
- temp = new aClient;
- temp->stats = new Player;
- temp->stats->setData(user->stats);
- user->stats->setClient(NULL);
-
-
- delete user->stats;
- user->stats = NULL;
- temp->stats->setClient(NULL);
-
-#ifdef P10
- temp->setRealNick("Not Playing");
-#endif
- temp->setNick("Not Playing");
-
- players[hv].erase(iter);
- players[hv].push_back(temp);
+ );
+ user->stats = NULL;
+
+ return;
+ }
+ user->stats->delMonster();
+ user->stats->delMaster();
+ user->stats->delBattle();
+ clearDragonFight(user->stats);
+ clearYourTurn(user->stats);
+ clearPlaying(user);
+
+ user->stats->setClient(NULL);
+
+
+ if (player_fight(user))
+ {
+ clearYourTurn(user->stats->getBattle()->stats);
+ user->stats->getBattle()->stats->delBattle();
+ }
+
#ifdef DEBUGMODE
- log("Logged out player %s",
+ log("Logged out player %s",
#ifdef P10
- user->getRealNick()
+ user->getRealNick()
#else
- user->getNick()
+ user->getNick()
#endif
- );
+ );
#endif
- }
- clearPlaying(user);
+ }
+ }
+ if (user)
+ user->stats = NULL;
}
void do_register(char *u)
{
char *password, *name;
aClient *user;
+ Player *p;
name = strtok(NULL, " ");
password = strtok(NULL, " ");
{
notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD");
}
- else if ((user = findplayer(name)))
+ else if (strlen(name) > maxnicklen)
+ {
+ notice(s_GameServ, u, "Name too long. Maximum length: %d", maxnicklen);
+ }
+ else if (!alphaNumeric(name))
+ {
+ notice(s_GameServ, u, "That is not a valid name. Please use only AlphaNumeric (A-Z, 0-9) characters!");
+ }
+ else if ((p = findplayer(name)))
{
notice(s_GameServ, u, "%s is already registered!", name);
notice(s_GameServ, u, "Choose another name!");
{
log("Fatal Error: Couldn't find %s in the clients list", u);
}
- else if (!alphaNumeric(name))
- {
- notice(s_GameServ, u, "That is not a valid name. Please use only AlphaNumeric (A-Z, 0-9) characters!");
- }
else if (isIgnore(user))
{
#ifdef DEBUGMODE
if (!is_playing(user))
{
item *tempItem;
+ unsigned long hv = iHASH((unsigned char *) name);
+
+ // First create the Player
user->stats = new Player();
- user->stats->setClient(user); // Set the backwards pointer
- user->stats->reset(); // set the user up
+
+ // Set the backwards pointer
+ user->stats->setClient(user);
+
+ // Set the player's password
user->stats->setPassword(password);
+
+ // Set the player's name
user->stats->setName(name);
- unsigned long hv = iHASH((unsigned char *) name);
+
+ // Make sure they have a proper time stamp
updateTS(user->stats);
-
+
// Update the last login time
user->stats->lastlogin = time(NULL);
+ // Send notification of success
notice(s_GameServ, u, "Player %s registered with password %s.", user->stats->getName().c_str(), password);
notice(s_GameServ, u, "Write this password down. If you lose it, there is no way to retrieve it!");
+
+ // Log the new player
log("Nickname %s registered player %s.", u, user->stats->getName().c_str());
- setPlaying(user); // set the playing flag
+
+ // Log the player in
+ setPlaying(user);
+
+ // Start the player at the beginning
+ reset(user->stats);
+
+ // Add the stick and clothes
tempItem = findItemByID(3001);
user->stats->inventory->addItem((*Items.begin()))->use(user->stats); // Add the stick
user->stats->inventory->addItem(tempItem)->use(user->stats); // Add Clothes
- players[hv].push_back(user);
+ // Add the player to the list
+ players[hv].push_back(user->stats);
}
else
{
void do_identify(char *u)
{
char *password, *name;
- aClient *user, *p;
+ aClient *user;
+ Player *p;
name = strtok(NULL, " ");
password = strtok(NULL, " ");
if (!password || !name)
#endif
return;
}
- else if (!(p = findplayer(name)) || !p->stats)
- notice(s_GameServ, u, "Player %s not found", name);
+ else if (!(p = findplayer(name)))
+ {
+ notice(s_GameServ, u, "Player %s not found", name);
+ }
else if (is_playing(user))
{
notice(s_GameServ, u, "You are already playing!");
}
- else if (p->stats->getClient() != NULL && !isAdmin(user))
+ else if (is_playing(p->getClient()) && !isAdmin(user))
{
notice(s_GameServ, u, "That player has already identified.");
}
}
else
{
- list<aClient*>::iterator iter;
- unsigned long hv = iHASH((unsigned char *) p->stats->getName().c_str());
+ list<Player*>::iterator iter;
+ unsigned long hv = iHASH((unsigned char *) p->getName().c_str());
iter = find(players[hv].begin(), players[hv].end(), p);
strtok(NULL, ""));
return;
}
- user->stats = new Player(p->stats->getName());
-#ifdef DEBUGMODE
- log("Setting data for identified");
-#endif
- user->stats->setData(p->stats);
- user->stats->setClient(user);
- updateTS(user->stats);
+ // Make sure the other user is logged out
+ logout(p->getClient());
+
+ user->stats = p;
+ p->setClient(user);
+ updateTS(p);
#ifdef DEBUGMODE
log("Player %s IRC: %s Identified", user->stats->getName().c_str(),
user->getNick());
#endif
-
- setPlaying(user); // set the playing flag
+ //Set the playing flag
+ setPlaying(user);
// Update the last login time
user->stats->lastlogin = time(NULL);
- players[hv].erase(iter);
- players[hv].push_back(user);
-
notice(s_GameServ, u, "Password Accepted. Identified.");
showNews(u, todaysnews);
}
}
else
{
- updateTS(user->stats);
+ if (!is_fighting(user))
+ updateTS(user->stats);
showstats(u, user->stats->getName().c_str());
}
}
bool is_playing(aClient *user)
{
- if (user->stats == NULL)
+ if (!user)
{
return false;
}
- else if (user->stats->getClient() == NULL)
+ else if (!user->stats)
+ {
+ return false;
+ }
+ else if (!FL_is_playing(user))
{
return false;
}
- else if (!FL_is_playing(user))
+ else if (user->stats->getClient() != user)
{
return false;
}
{
if (!is_playing(user))
return false;
- else if (user->stats->getBattle() != NULL && is_playing(user->stats->getBattle()))
+ else if (is_playing(user->stats->getBattle()))
{
- return user->stats->getBattle()->stats != NULL;
+ return true;
}
return false;
}
void do_fight(char *u)
{
- aClient *ni, *battle;
+ aClient *ni;
+ Player *battle;
char *nick = strtok(NULL, " ");
{
notice(s_GameServ, u, "You are dead. Wait until tomorrow to fight others!");
}
- else if (!is_playing(battle))
+ else if (!is_playing(battle->getClient()))
{
notice(s_GameServ, u, "You can't attack %s while they aren't playing!", nick);
}
display_players(u);
}
*/
- else if (stricmp(ni->stats->getName().c_str(), battle->stats->getName().c_str()) == 0)
+ else if (stricmp(ni->stats->getName().c_str(), battle->getName().c_str()) == 0)
{
notice(s_GameServ, u, "Are you trying to commit suicide!?");
}
- else if (!isAlive(battle->stats))
+ else if (!isAlive(battle))
{
notice(s_GameServ, u, "They are dead. Cannot fight dead players!");
}
- else if (player_fight(battle))
+ else if (player_fight(battle->getClient()))
{
- notice(s_GameServ, u, "%s is fighting %s already!", battle->stats->getName().c_str(), battle->stats->getBattle()->stats->getName().c_str());
+ notice(s_GameServ, u, "%s is fighting %s already!", battle->getName().c_str(), battle->getBattle()->stats->getName().c_str());
}
- else if (master_fight(battle))
+ else if (master_fight(battle->getClient()))
{
- notice(s_GameServ, u, "%s is fighting their master!", battle->stats->getName().c_str());
+ notice(s_GameServ, u, "%s is fighting their master!", battle->getName().c_str());
}
- else if (is_fighting(battle))
+ else if (is_fighting(battle->getClient()))
{
- notice(s_GameServ, u, "%s is fighting %s already!", battle->stats->getName().c_str(), battle->stats->getMonster()->name.c_str());
+ notice(s_GameServ, u, "%s is fighting %s already!", battle->getName().c_str(), battle->getMonster()->name.c_str());
}
- else if (!isAdmin(ni) && isFairFights() && (ni->stats->getStrength()/2 - battle->stats->getDefense()) > battle->stats->getHP())
+ else if (!isAdmin(ni) && isFairFights() && (ni->stats->getStrength()/2 - battle->getDefense()) > battle->getHP())
{
- notice(s_GameServ, u, "Fair fighting is enabled, and you're too strong for %s!", battle->stats->getName().c_str());
+ notice(s_GameServ, u, "Fair fighting is enabled, and you're too strong for %s!", battle->getName().c_str());
}
- else if (ni->stats->getLevel() - battle->stats->getLevel() > maxbfightdistance)
+ else if (ni->stats->getLevel() - battle->getLevel() > 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->getName().c_str());
+ battle->getName().c_str());
}
- else if (battle->stats->getLevel() - ni->stats->getLevel() > maxafightdistance)
+ else if (battle->getLevel() - ni->stats->getLevel() > 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)
else
{
// Set your battle pointer to the other player
- ni->stats->setBattle(battle);
+ ni->stats->setBattle(battle->getClient());
// Set the other player's battle pointer to you
- battle->stats->setBattle(ni);
+ battle->setBattle(ni);
// The initiator gets the first move (perhaps this should be 50/50)
setYourTurn(ni->stats);
- clearYourTurn(battle->stats);
+ clearYourTurn(battle);
// Initiate Battle sequence!
ni->stats->subtractPlayerFights(1);
- notice(s_GameServ, u, "You challenge %s to an online duel!", battle->stats->getName().c_str());
+ notice(s_GameServ, u, "You challenge %s to an online duel!", battle->getName().c_str());
notice(s_GameServ, c_Forest, "%s walks up and hits %s in the face! Let's see who will bite the dust.",
- ni->stats->getName().c_str(), battle->stats->getName().c_str()); /* DrLnet - Modified by Kain*/
+ ni->stats->getName().c_str(), battle->getName().c_str()); /* DrLnet - Modified by Kain*/
- notice(s_GameServ, battle->getNick(), "%s has challenged you to an online duel!", ni->stats->getName().c_str());
- notice(s_GameServ, battle->getNick(), "%s gets to go first "\
+ notice(s_GameServ, battle->getClient()->getNick(), "%s has challenged you to an online duel!", ni->stats->getName().c_str());
+ notice(s_GameServ, battle->getClient()->getNick(), "%s gets to go first "\
"because they initiated!", ni->stats->getName().c_str());
- notice(s_GameServ, battle->getNick(), "Please wait while %s decides what to do.", ni->stats->getName().c_str());
+ notice(s_GameServ, battle->getClient()->getNick(), "Please wait while %s decides what to do.", ni->stats->getName().c_str());
display_players(ni);
}
}
return;
}
id = stringtoint(item);
- updateTS(user->stats);
+ if (!is_fighting(user))
+ updateTS(user->stats);
p = user->stats->inventory;
equip->use(user->stats);
}
}
+
void do_use(char *u)
{
aClient *user;
pouch *p;
char *item = strtok(NULL, " ");
- int id;
+ char *numuse = strtok(NULL, " ");
+ int id, num;
itemContainer *used;
- if (!item || int(item[0]) < 48 || int(item[0]) > 57)
+ if (!item || int(item[0]) < 48 || int(item[0]) > 57 || (numuse && (int(numuse[0]) < 48 || int(numuse[0]) > 57)))
{
notice(s_GameServ, u, "SYNTAX: USE ####");
notice(s_GameServ, u, "Type /msg %S HELP USE for more information.");
return;
}
id = stringtoint(item);
+
+ if (!numuse)
+ {
+ num = 1;
+ }
+ else
+ {
+ num = stringtoint(numuse);
+ }
+
updateTS(user->stats);
p = user->stats->inventory;
-
+
if (!(used = p->Find(id)))
{
if (!p->isEmpty())
}
else
{
- // Use the item
- notice(s_GameServ, u, "You used %s.", used->getItem()->getName().c_str());
- used->use(user->stats);
- if (used->getUses() <= 0)
+ // Use the item(s)
+ if (num <= 1 || is_fighting(user))
+ {
+ notice(s_GameServ, u, "You used %s.", used->getItem()->getName().c_str());
+ used->use(user->stats);
+ if (used->getUses() <= 0)
+ {
+ p->deleteItem(used->getItem());
+ }
+ end_turn(user);
+ }
+ else if (num > 1)
{
- p->deleteItem(used->getItem());
+ int count;
+ const char *name = used->getItem()->getName().c_str();
+ for (count = 0; count < num; count++)
+ {
+ if (!(used = p->Find(id)))
+ {
+ break;
+ }
+ else
+ {
+ used->use(user->stats);
+ if (used->getUses() == 0)
+ {
+ p->deleteItem(used->getItem());
+ }
+ }
+ }
+ notice(s_GameServ, u, "You used %d %s's", count, name);
}
- end_turn(user);
- }
+ }
}
void do_run(char *u)
{
long int pow(int x, int y)
{
- long int value = 0;
- int count = 0;
- value += x;
-
- if (x != 0 && y != 0)
+ long int value = 0;
+ int count = 0;
+ value += x;
+
+ if (x != 0 && y != 0)
{
- for (count = 1; count <= y - 1; count++)
- value *= x;
+ for (count = 1; count <= y - 1; count++)
+ value *= x;
}
- else
- return 1;
-return value;
+ else
+ {
+ return 1;
+ }
+ return value;
}
long int chartoint(char ch)
{
- if (int(ch) >= 48 && int(ch) <= 57)
- return int(ch) - 48;
- else
- return 0;
+ if (int(ch) >= 48 && int(ch) <= 57)
+ return int(ch) - 48;
+ else
+ return 0;
}
int save_gs_dbase()
{
- list<aClient*>::iterator iter;
+ list<Player*>::iterator iter;
Player *it;
ofstream outfile;
{
for(iter = players[x].begin(); iter != players[x].end(); iter++)
{
- it = (*iter)->stats;
+ it = (*iter);
clearYourTurn(it);
item *w, *a;
w = it->getWeapon();
int load_gs_dbase()
{
ifstream infile;
- aClient *temp;
Player *p;
char *tempname, *buf, *password;
int tempnum;
log("Error opening %s", playerdata);
return 0;
}
-
-
+
+
for (int x = 0; x < U_TABLE_SIZE; x++)
{
- list<aClient*>::iterator iter;
-
+ list<Player*>::iterator iter;
+
for (iter = players[x].begin(); iter != players[x].end(); iter++)
{
- if ((*iter)->stats->getClient())
- {
- logout((*iter)->stats->getClient());
- }
+ logout((*iter)->getClient());
+ delete (*iter);
}
players[x].clear();
}
while (infile.getline(buf, 100000, '\n'))
{
- temp = new aClient;
tempname = strtok(buf, " ");
- temp->stats = new Player(tempname);
- p = temp->stats;
+ p = new Player(tempname);
p->setLevel(stringtoint(strtok(NULL, " ")));
p->setExp(stringtoint(strtok(NULL, " ")));
p->setGold(stringtoint(strtok(NULL, " ")));
p->setBank(stringtoint(strtok(NULL, " ")));
- p->setHP(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->setFlags(stringtoint(strtok(NULL, " ")));
-
- password = strtok(NULL, " ");
- p->setRawPassword(password);
- temp->setNick("Not Playing");
-#ifdef P10
- temp->setRealNick("Not Playing");
-#endif
- tempname = strtok(NULL, " ");
- if (tempname)
- p->lastlogin = stringtoint(tempname);
- else
- p->lastlogin = time(NULL);
-
- tempname = strtok(NULL, " ");
- tempnum = stringtoint(tempname);
- 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 *) temp->stats->getName().c_str());
-
- temp->stats->setClient(NULL);
-
- for (tempname = strtok(NULL, " "); tempname != NULL; tempname = strtok(NULL, " "))
- {
- long int id, uses;
- list<item*>::iterator item_iter;
- id = stringtoint(tempname);
+
+ password = strtok(NULL, " ");
+ p->setRawPassword(password);
tempname = strtok(NULL, " ");
- uses = stringtoint(tempname);
- item_iter = Items.begin();
- while (item_iter != Items.end())
+ if (tempname)
+ p->lastlogin = stringtoint(tempname);
+ else
+ p->lastlogin = time(NULL);
+
+ tempname = strtok(NULL, " ");
+ tempnum = stringtoint(tempname);
+ item *tempitem;
+ if (tempnum != 0)
{
- if ((*item_iter)->getID() == id)
+ 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<item*>::iterator item_iter;
+ id = stringtoint(tempname);
+ tempname = strtok(NULL, " ");
+ uses = stringtoint(tempname);
+
+ item_iter = Items.begin();
+ while (item_iter != Items.end())
{
- // Don't sort every time you add an item or it eats CPU
- p->inventory->addItemNoChecks((*item_iter))->setUses(uses);
- log("Inventory Count: %d", p->inventory->getCount());
+ 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++;
}
- item_iter++;
}
+ p->inventory->sort();
+ players[hv].push_back(p);
}
- p->inventory->sort();
- players[hv].push_back(temp);
- log("Inventory Count: %d", p->inventory->getCount());
-}
- // Can't delete the temporary ptr to the aClient because we're using it
-delete [] buf;
-infile.close();
-return 1;
+
+ delete [] buf;
+ infile.close();
+ return 1;
}
bool passcmp(const char *encrypted, char *plaintext)
bool check_password(char *name, char *plaintext)
{
- aClient *client;
+ Player *p;
- if (!(client = findplayer(name)))
+ if (!(p = findplayer(name)))
return false;
else
{
- return passcmp(client->stats->getPassword().c_str(), plaintext);
+ return passcmp(p->getPassword().c_str(), plaintext);
}
}
notice(s_GameServ, u, "You must be playing to check your inventory!");
return;
}
- updateTS(user->stats);
+ if (!is_fighting(user))
+ updateTS(user->stats);
showinventory(user->stats, user);
}
{
notice(s_GameServ, u, "One %s coming right up!", tempItem->getItem()->getName().c_str());
user->stats->subtractGold(tempItem->getItem()->price());
- notice(s_GameServ, u, "%d", user->stats->inventory->getCount());
}
}
}
notice(s_GameServ, u, "Just then you notice the eye begin to "\
"glare orange! The tooth is moving... but it is still too "\
"dark for you to make out.... THE DRAGON! You see it!");
- p->setMonster(new Monster(dragon));
+ p->setMonster(&dragon);
setDragonFight(p);
display_monster(u);
}
if (!is_fighting(user) && is_playing(user))
{
- Monster *temp;
Player *p = user->stats;
- temp = new Monster(levels[p->getLevel() - 1].master);
- p->setMyMaster(temp);
- p->setMonster(temp);
+ p->setMyMaster(&levels[p->getLevel() - 1].master);
+ p->setMonster(&levels[p->getLevel() - 1].master);
display_monster(u); // Since master is the same structure, use this function
}
}
void rolloverall()
{
- list<aClient*>::iterator iter;
+ list<Player*>::iterator iter;
for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
{
for (iter = players[x].begin(); iter != players[x].end(); iter++)
{
- rollover((*iter)->stats);
+ rollover((*iter));
}
}
}
void refreshall()
{
- list<aClient*>::iterator iter;
+ list<Player*>::iterator iter;
for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
{
for (iter = players[x].begin(); iter != players[x].end(); iter++)
{
- refresh((*iter)->stats);
+ refresh((*iter));
}
}
}
void do_refresh(char *u)
{
- char *nick = strtok(NULL, " ");
+ char *name = strtok(NULL, " ");
aClient *user;
+ Player *p;
if (!(user = find(u)))
{
notice(s_GameServ, u, "You must be a %S admin to use this command!");
return;
}
- if (!nick)
+ if (!name)
{
notice(s_GameServ, u, "SYNTAX: REFRESH {ALL | NICK}");
return;
}
- else if (stricmp(nick, "ALL") == 0)
+ else if (stricmp(name, "ALL") == 0)
{
notice(s_GameServ, u, "Refreshing everyone's stats!");
refreshall();
}
- else if ((user = findplayer(nick)))
+ else if ((p = findplayer(name)))
{
- if (is_playing(user))
- {
-#ifdef P10
- notice(s_GameServ, u, "Refreshing %s.", user->getRealNick());
-#else
- notice(s_GameServ, u, "Refreshing %s.", user->getNick());
-#endif
- refresh(user->stats);
- }
- else
- {
-#ifdef P10
- notice(s_GameServ, u, "%s is not playing.", user->getRealNick());
-#else
- notice(s_GameServ, u, "%s is not playing.", user->getNick());
-#endif
- }
- }
+ notice(s_GameServ, u, "Refreshing %s.", p->getName().c_str());
+ refresh(p);
+ }
else
{
- notice(s_GameServ, u, "Nick %s not found.", nick);
+ notice(s_GameServ, u, "Player %s not found.", name);
return;
}
}
void resetall()
{
- list<aClient*>::iterator iter;
+ list<Player*>::iterator iter;
for (unsigned long x = 0; x < U_TABLE_SIZE; x++)
{
for (iter = players[x].begin(); iter != players[x].end(); iter++)
{
- reset((*iter)->stats);
+ reset((*iter));
}
}
}
void reset(Player *p)
{
item *tempItem;
+
if (!p)
return;
p->reset();
+ // Add the stick and clothes
tempItem = findItemByID(3001);
p->inventory->addItem((*Items.begin()))->use(p); // Add the stick
- p->inventory->addItem(tempItem)->use(p); // Add Clothes
-
+ p->inventory->addItem(tempItem)->use(p); // Add Clothes
}
void updateTS(Player *p)
#ifdef DEBUGMODE
log("New timestamp for %s: %ld", p->getName().c_str(), p->lastcommand);
#endif
+ PF_cleartimedout(p);
}
void timeOutEvent(Player *p)
{
- aClient *user = findplayer(p->getName().c_str());
-
- if (!user || !p->getClient()) // then they're not playing
+ if (!p || !is_playing(p->getClient())) // then they're not playing
return;
- char *nick = user->getNick();
-
- if (player_fight(user) && isYourTurn(p))
+ char *nick = p->getClient()->getNick();
+
+ if (player_fight(p->getClient()) && isYourTurn(p))
{
// Check to see if they were the idler or if it was the other
// person
- if (p->lastcommand != p->getBattle()->stats->lastcommand)
+ if (!PF_timedout(p->getBattle()->stats))
{
// This person's last command was given earlier,
// so this person is the idler
// Chance to wake up, but if the other player doesn't
// Attack now, they both get logged out.
updateTS(p);
- p->getBattle()->stats->lastcommand = p->lastcommand;
+ PF_settimedout(p);
display_players(p->getBattle());
return;
}
"You and %s timed out at the same time."\
" Don't fight if you're just going to "\
"sit there!", p->getName().c_str());
- notice(s_GameServ, user->getNick(),
+ notice(s_GameServ, p->getClient()->getNick(),
"You and %s timed out at the same time."\
" Don't fight if you're just going to "\
"sit there!", p->getBattle()->stats->getName().c_str());
logout(p->getBattle());
- logout(user);
+ logout(p->getClient());
return;
}
}
- else if (!player_fight(user))
+ else if (!player_fight(p->getClient()))
{
- if (isAlive(user->stats) && user->stats->getGold() > 0)
+ if (isAlive(p) && p->getGold() > 0)
{
// Place fun stuff here :)
int randnum = 1 + rand() % 100; // 1-100
if (randnum < 50)
{
// 35-100% of your gold goes pffft - kain
- int stolen = (35 + (rand() % 66)) * (user->stats->getGold() / 100);
+ int stolen = (35 + (rand() % 66)) * (p->getGold() / 100);
GSN("You stop for a moment to rest on the "\
"street corner. All of a sudden, you "\
"of knife wielding thugs.");
GSN2("The thugs beat you into utter submission "\
"and steal %ld gold from you!", stolen);
- user->stats->subtractGold(stolen);
+ p->subtractGold(stolen);
}
else if (randnum >= 50 && randnum < 75)
{
// 25-65% of your gold goes pffft - kain
- int stolen = (25 + (rand() % 41)) * (user->stats->getGold() / 100);
+ int stolen = (25 + (rand() % 41)) * (p->getGold() / 100);
GSN("While dilly dallying around, you lose "\
"your sense of time. Little did you know, "\
"but thieves lifted your gold while you "\
"weren't watching.");
GSN2("Better luck next time... you lose %d gold", stolen);
- user->stats->subtractGold(stolen);
+ p->subtractGold(stolen);
}
else if (randnum >= 75)
{
// 25-75% of your gold goes pffft - kain
- int stolen = (25 + (rand() % 51)) * (user->stats->getGold() / 100);
+ int stolen = (25 + (rand() % 51)) * (p->getGold() / 100);
GSN("Good grief! A gaggle of gooey green ghostlike "\
"goblins grabbed your gold!");
GSN2("They stole %d gold from you!", stolen);
- user->stats->subtractGold(stolen);
+ p->subtractGold(stolen);
}
}
// Always log out the user
- logout(user);
+ logout(p->getClient());
}
}
{
char *nick = strtok(NULL, " ");
aClient *user;
+ Player *p;
if (!(user = find(u)))
{
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 = findplayer(nick)))
- {
- if (is_playing(user))
- {
-#ifdef P10
- notice(s_GameServ, u, "Resetting %s.", user->getRealNick());
-#else
- notice(s_GameServ, u, "Resetting %s.", user->getNick());
-#endif
- reset(user->stats);
- }
- else
- {
- notice(s_GameServ, u, "Resetting %s", user->stats->getName().c_str());
- reset(user->stats);
- }
- }
+ else if (!(p = findplayer(nick)))
+ {
+ notice(s_GameServ, u, "Nick %s not found.", nick);
+ }
else
{
- notice(s_GameServ, u, "Nick %s not found.", nick);
- return;
- }
+ notice(s_GameServ, u, "Resetting %s.", p->getName().c_str());
+ reset(p);
+ }
}
void do_help(char *u)
{
sprintf(filename, "data/levels/level%d.dat", x);
if (levels[x - 1].loadLevel(filename) == false)
- return false;
+ {
+ delete []filename;
+ return false;
+ }
}
delete []filename;
return true;
}
+
bool load_monsters()
{
char *filename;
if (!infile)
{
log("Error opening %s", filename);
+ delete []filename;
+ delete []buf;
return false;
}