#include <cctype>
#include <fstream>
+#include <stdlib.h>
using std::ifstream;
using std::ofstream;
#endif
-
+Monster dragon; // The current dragon
Level levels[LEVELS]; // The newest way to store monsters
// Database functions
int save_gs_dbase();
int load_gs_dbase();
+int load_dragon();
+int save_dragon();
// String functions
#ifndef HAVE_STRTOK
notice(s_GameServ, sender->getNick(), "Hit Points: %d of %d", ni->stats->hp,
ni->stats->maxhp);
- sprintf(buf, "Strength: %d", ni->stats->strength + webonus[ni->stats->weapon]);
+ sprintf(buf, "Strength: %d", ni->stats->strength + webonus[ni->stats->wea]);
space = spaces(strlen(buf), " ");
notice(s_GameServ, sender->getNick(), "%s%sDefense: %d",
- buf, space, ni->stats->defense + arbonus[ni->stats->armor]);
+ buf, space, ni->stats->defense + arbonus[ni->stats->arm]);
delete [] space;
- sprintf(buf, "Armor: %s", armors[ni->stats->armor]);
+ sprintf(buf, "Armor: %s", armors[ni->stats->arm]);
space = spaces(strlen(buf), " ");
notice(s_GameServ, sender->getNick(), "%s%sWeapon: %s", buf, space,
- weapons[ni->stats->weapon]);
+ weapons[ni->stats->wea]);
delete [] space;
sprintf(buf, "Forest Fights: %d", ni->stats->forest_fights);
}
else if (!name)
{
- notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|WEAPON|ARMOR|HP POTIONS|STRENGTH POTIONS|DEFENSE POTIONS|HEALING POTIONS|ALIVE|SEEN MASTER} {STRING|NUMBER|ON|OFF}");
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|WEAPON|ARMOR|HP POTIONS|STRENGTH POTIONS|DEFENSE POTIONS|HEALING POTIONS|ALIVE|SEEN MASTER} {STRING|NUMBER|TRUE|FALSE}");
return;
}
else if (!(target = findplayer(name)))
}
else if (stricmp(cmd, "BANK") == 0 || stricmp(cmd, "BALANCE") == 0)
{
- if (!isAdmin(user))
+ if (!isAdmin(user))
{
notice(s_GameServ, u, "Admins Only!");
return;
}
- else if (stricmp(cmd, "BANK") == 0)
+ else if (stricmp(cmd, "BANK") == 0)
{
cmd2 = strtok(NULL, " "); // Need an extra parameter for set bank balance
}
- else
+ if (!cmd2)
{
- target->stats->bank = stringtoint(cmd2);
- notice(s_GameServ, u, "Balance changed!");
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] [BANK] BALANCE <NUMBER>");
+ return;
}
+
+ target->stats->bank = stringtoint(cmd2);
+
+ // Cheap bounds checking
+ if (target->stats->bank > 2000000000)
+ target->stats->bank = 2000000000;
+ else if (target->stats->bank < 0)
+ target->stats->bank *= -1;
+
+ notice(s_GameServ, u, "Bank balance changed to %ld!", target->stats->bank);
}
else if (stricmp(cmd, "PLAYER") == 0)
{
}
else if (stricmp(cmd2, "FIGHTS") != 0)
{
- notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <number>");
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>");
return;
}
else
{
cmd2 = strtok(NULL, " ");
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>");
+ return;
+ }
target->stats->player_fights = stringtoint(cmd2);
- notice(s_GameServ, u, "Player fights changed!");
+
+ if (target->stats->player_fights < 0)
+ target->stats->player_fights *= -1;
+
+ notice(s_GameServ, u, "Player fights changed to %d!", target->stats->player_fights);
}
}
else if (stricmp(cmd, "FOREST") == 0)
else
{
cmd2 = strtok(NULL, " ");
- target->stats->player_fights = stringtoint(cmd2);
- notice(s_GameServ, u, "Player fights changed!");
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] FOREST FIGHTS <NUMBER>");
+ return;
+ }
+
+ target->stats->forest_fights = stringtoint(cmd2);
+
+ if (target->stats->forest_fights < 0)
+ target->stats->forest_fights *= -1;
+
+ notice(s_GameServ, u, "Forest fights changed to %d!", target->stats->forest_fights);
}
}
else if (stricmp(cmd, "GOLD") == 0)
}
else
{
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] GOLD <NUMBER>");
+ return;
+ }
target->stats->gold = stringtoint(cmd2);
- notice(s_GameServ, u, "Gold set to %s", cmd2);
+
+ if (target->stats->gold > 2000000000)
+ target->stats->gold = 2000000000;
+ else if (target->stats->gold < 0)
+ target->stats->gold *= -1;
+
+ notice(s_GameServ, u, "Gold set to %ld", target->stats->gold);
return;
}
}
- else if (stricmp(cmd, "STRENGTH") == 0 && stricmp(cmd, "POTIONS") != 0)
+ else if (stricmp(cmd, "STRENGTH") == 0 && stricmp(cmd2, "POTIONS") != 0)
{
if (!isAdmin(user))
{
}
else
{
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] STRENGTH <NUMBER>");
+ return;
+ }
+
target->stats->strength = stringtoint(cmd2);
- notice(s_GameServ, u, "Strength set to %s", cmd2);
+
+ if (target->stats->strength < 0)
+ target->stats->strength *= -1;
+
+ notice(s_GameServ, u, "Strength set to %d", target->stats->strength);
return;
}
}
- else if (stricmp(cmd, "DEFENSE") == 0 && stricmp(cmd, "POTIONS") != 0)
+ else if (stricmp(cmd, "DEFENSE") == 0 && stricmp(cmd2, "POTIONS") != 0)
{
if (!isAdmin(user))
{
}
else
{
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] DEFENSE <NUMBER>");
+ return;
+ }
+
target->stats->defense = stringtoint(cmd2);
- notice(s_GameServ, u, "Defense set to %s", cmd2);
+
+ if (target->stats->defense < 0)
+ target->stats->defense *= -1;
+
+ notice(s_GameServ, u, "Defense set to %d", target->stats->defense);
return;
}
}
}
else
{
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HP <NUMBER>");
+ return;
+ }
target->stats->hp = stringtoint(cmd2);
- notice(s_GameServ, u, "HP set to %s", cmd2);
+
+ if (target->stats->hp < 0)
+ target->stats->hp *= -1;
+
+ notice(s_GameServ, u, "HP set to %d", target->stats->hp);
return;
}
}
}
else
{
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] MAXHP <NUMBER>");
+ return;
+ }
target->stats->maxhp = stringtoint(cmd2);
- notice(s_GameServ, u, "MaxHP set to %s", cmd2);
+
+ if (target->stats->maxhp < 0)
+ target->stats->maxhp *= -1;
+
+ notice(s_GameServ, u, "MaxHP set to %d", target->stats->maxhp);
return;
}
}
}
else
{
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {EXPERIENCE|EXP} <NUMBER>");
+ return;
+ }
+
target->stats->exp = stringtoint(cmd2);
- notice(s_GameServ, u, "Exp set to %s", cmd2);
+
+ if (target->stats->exp > 2000000000)
+ target->stats->exp = 2000000000;
+ else if (target->stats->exp < 0)
+ target->stats->exp *= -1;
+
+ notice(s_GameServ, u, "Exp set to %ld", target->stats->exp);
return;
}
}
}
else
{
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] LEVEL <NUMBER>");
+ return;
+ }
target->stats->level = stringtoint(cmd2);
- notice(s_GameServ, u, "Level set to %s", cmd2);
+
+ if (target->stats->level < 0)
+ target->stats->level = 1;
+ else if (target->stats->level > REALLEVELS)
+ target->stats->level = REALLEVELS;
+
+ notice(s_GameServ, u, "Level set to %d", target->stats->level);
return;
}
}
}
else
{
- target->stats->weapon = stringtoint(cmd2);
- notice(s_GameServ, u, "Weapon set to %s", weapons[target->stats->weapon]);
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] WEAPON <NUMBER>");
+ return;
+ }
+
+ target->stats->wea = stringtoint(cmd2);
+
+ if (target->stats->wea < 0)
+ target->stats->wea = 0;
+ else if (target->stats->wea >= WNA)
+ target->stats->wea = WNA - 1;
+ notice(s_GameServ, u, "Weapon set to %s", weapons[target->stats->wea]);
return;
}
}
}
else
{
- target->stats->armor = stringtoint(cmd2);
- notice(s_GameServ, u, "Armor set to %s", armors[target->stats->armor]);
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] ARMOR <NUMBER>");
+ return;
+ }
+ target->stats->arm = stringtoint(cmd2);
+
+ if (target->stats->arm < 0)
+ target->stats->arm = 0;
+ else if (target->stats->arm >= WNA)
+ target->stats->arm = WNA - 1;
+
+ notice(s_GameServ, u, "Armor set to %s", armors[target->stats->arm]);
return;
}
}
else
{
cmd2 = strtok(NULL, " ");
- target->stats->inventory.setHP(stringtoint(cmd2));
- notice(s_GameServ, u, "HP Potions set to %s", cmd2);
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HP POTIONS <NUMBER>");
+ return;
+ }
+ target->stats->inventory.setHP(abs(stringtoint(cmd2)));
+
+ notice(s_GameServ, u, "HP Potions set to %d", target->stats->inventory.HP());
return;
}
}
else
{
cmd2 = strtok(NULL, " ");
- target->stats->inventory.setHealing(stringtoint(cmd2));
- notice(s_GameServ, u, "Healing Potions set to %s", cmd2);
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] HEALING POTIONS <NUMBER>");
+ return;
+ }
+ target->stats->inventory.setHealing(abs(stringtoint(cmd2)));
+ notice(s_GameServ, u, "Healing Potions set to %d", target->stats->inventory.Healing());
return;
}
}
else
{
cmd2 = strtok(NULL, " ");
- target->stats->inventory.setStrength(stringtoint(cmd2));
- notice(s_GameServ, u, "Strength Potions set to %s", cmd2);
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] STRENGTH POTIONS <NUMBER>");
+ return;
+ }
+ target->stats->inventory.setStrength(abs(stringtoint(cmd2)));
+ notice(s_GameServ, u, "Strength Potions set to %d", target->stats->inventory.Strength());
return;
}
}
else
{
cmd2 = strtok(NULL, " ");
- target->stats->inventory.setDefense(stringtoint(cmd2));
- notice(s_GameServ, u, "Defense Potions set to %s", cmd2);
+ if (!cmd2)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] DEFENSE POTIONS <NUMBER>");
+ return;
+ }
+ target->stats->inventory.setDefense(abs(stringtoint(cmd2)));
+ notice(s_GameServ, u, "Defense Potions set to %d", target->stats->inventory.Defense());
return;
}
}
notice(s_GameServ, u, "SYNTAX: /msg %S SET ALIVE TRUE|FALSE");
return;
}
+ else if (stricmp(cmd2, "TRUE") == 0)
+ {
+ notice(s_GameServ, u, "%s has been Resurrected!", target->stats->name.c_str());
+ setAlive(target->stats);
+ }
+ else
+ {
+ notice(s_GameServ, u, "%s is now dead!", target->stats->name.c_str());
+ clearAlive(target->stats);
+ }
}
}
+ else if (stricmp(cmd, "SEEN") == 0)
+ {
+ if (!isAdmin(user))
+ {
+ notice(s_GameServ, u, "Admins Only!");
+ return;
+ }
+ else if (stricmp(cmd2, "MASTER") != 0)
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] SEEN MASTER {TRUE|FALSE}");
+ return;
+ }
+ else
+ {
+ cmd2 = strtok(NULL, " ");
+ if (!cmd2 || (stricmp(cmd2, "TRUE") != 0 && stricmp(cmd2, "FALSE") != 0))
+ {
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NICK] SEEN MASTER {TRUE|FALSE}");
+ return;
+ }
+ else if (stricmp(cmd2, "TRUE") == 0)
+ {
+ notice(s_GameServ, u, "%s has seen their master now.", target->stats->name.c_str());
+ target->addFlag(FLAG_MASTER);
+ }
+ else
+ {
+ notice(s_GameServ, u, "%s has not seen their master now.", target->stats->name.c_str());
+ target->remFlag(FLAG_MASTER);
+ }
+ }
+ }
else
{
notice(s_GameServ, u, "Unknown command: SET %s", cmd);
- notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|WEAPON|ARMOR|HP POTIONS|STRENGTH POTIONS|DEFENSE POTIONS|HEALING POTIONS|ALIVE|SEEN MASTER} {STRING|NUMBER|ON|OFF}");
+ notice(s_GameServ, u, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|WEAPON|ARMOR|HP POTIONS|STRENGTH POTIONS|DEFENSE POTIONS|HEALING POTIONS|ALIVE|SEEN MASTER} {STRING|NUMBER|TRUE|FALSE}");
return;
}
}
{
notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD");
}
+ else if (stricmp(name, s_GameServ) == 0)
+ {
+ notice(s_GameServ, u, "You can't use %S as a name!");
+ return;
+ }
else if (!password)
{
notice(s_GameServ, u, "SYNTAX: /msg %S REGISTER NAME PASSWORD");
if (!is_playing(user))
{
ListNode<aClient> *temp;
- user->stats = new Player(user);
+ user->stats = new Player();
user->stats->client = user; // Set the backwards pointer
user->stats->reset(); // set the user up
user->stats->setPassword(password);
bool load_masters()
{
- ifstream infile("data/masters.dat");
+ ifstream infile(masterdata);
char *buf;
int l = 0;
buf = new char[1024];
if (infile.fail())
{
- log("Error opening data/masters.dat");
+ log("Error opening %s", masterdata);
return false;
}
#ifdef DEBUGMODE
- log("Loading masters from data/masters.dat");
+ log("Loading masters from %s", masterdata);
#endif
- for (l = 0; l < LEVELS; l++)
+ for (l = 0; l < LEVELS - 1; l++)
{
infile.getline(buf, 1024, '\n');
delete []buf;
- if (l < LEVELS) // We didn't load a master for every level - check data/masters.dat
+ if (l < LEVELS - 1) // We didn't load a master for every level - check data/masters.dat
return false;
else
return true;
{
if (!is_playing(user))
return false;
- else if (user->stats->battle != NULL)
+ else if (user->stats->battle != NULL && is_playing(user->stats->battle))
{
return user->stats->battle->stats != NULL;
}
if (!is_playing(user))
return false;
else
- return (user->stats->level == LEVELS && master_fight(user));
+ return (isDragonFight(user->stats));
}
void do_fight(char *u)
{
// Opponent's Hit
mhit = (fight->strength / 2) +
(rand() % (fight->strength / 2) - (user->stats->defense +
- arbonus[user->stats->armor]));
+ arbonus[user->stats->arm]));
}
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]));
+ mhit = (((battle->stats->strength + webonus[battle->stats->wea]) / 2) +
+ (rand() % ((battle->stats->strength + webonus[battle->stats->wea])) / 2) -
+ (user->stats->defense + arbonus[user->stats->arm]));
}
if (!player_fight(user))
{
delete nick;
}
-void do_attack(char *u)
-{
- int hit, mhit;
- aClient *ni, *battle; // The player and perhaps the player they're fighting
- 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 (isIgnore(ni))
- {
- #ifdef DEBUGMODE
- log("Ignoring %s.", ni->getNick());
- #endif
- return;
- }
- else if (!is_playing(ni))
- {
- notice(s_GameServ, u, "You're not playing!");
- return;
- }
- else if (!is_fighting(ni))
- {
- notice(s_GameServ, u, "You're not in battle!");
- return;
- }
- else
- {
- if (!ni->stats->master) // This is not a master fight
- fight = ni->stats->fight; // Monster Could be NULL
- else // This IS a master fight
- fight = ni->stats->master; // Master Could be NULL
-
- battle = ni->stats->battle; // Player Could be NULL
-
- // One has to be !NULL based on the previous else if
- // We wouldn't be here if they were all NULL
- }
- updateTS(ni->stats);
-
- if (!player_fight(ni))
- {
- // Player's Hit
- hit = ((ni->stats->strength + webonus[ni->stats->weapon]) / 2) +
- (rand() % ((ni->stats->strength + webonus[ni->stats->weapon]) / 2));
-
- // Opponent's Hit
- mhit = (fight->strength / 2) +
- (rand() % (fight->strength / 2) - (ni->stats->defense +
- arbonus[ni->stats->armor]));
- }
- else
- {
- // Opponent's Hit
- mhit = (((battle->stats->strength + webonus[battle->stats->weapon]) / 2) +
- (rand() % ((battle->stats->strength + webonus[battle->stats->weapon])) / 2) -
- (ni->stats->defense + arbonus[ni->stats->armor]));
-
- // Player's Hit
- hit = (((ni->stats->strength + webonus[ni->stats->weapon]) / 2) +
- (rand() % ((ni->stats->strength + webonus[ni->stats->weapon])) / 2) -
- (battle->stats->defense + arbonus[battle->stats->armor]));
- }
-
- if (!player_fight(ni))
- {
- if (hit > 0)
- notice(s_GameServ, u, "You attack \1f%s\1f for \ 2%d\ 2 points!", fight->name.c_str(), hit);
- else
- notice(s_GameServ, u, "You miss \1f%s\1f completely!", fight->name.c_str());
-
- if (hit >= fight->hp)
- {
- if (master_fight(ni) && !dragon_fight(ni))
- {
- notice(s_GameServ, u, "You have bested %s!", fight->name.c_str());
- addNews(todaysnews, "%s has bested %s and moved "\
- "to level %d", ni->stats->name.c_str(), fight->name.c_str(),
- (ni->stats->level + 1));
- }
- else
- notice(s_GameServ, u, "You have killed \ 2%s\ 2!", fight->name.c_str());
-
- notice(s_GameServ, u, "%s", fight->death.c_str());
- notice(s_GameServ, u, "You recieve \ 2%d\ 2 experience and \ 2%d\ 2 gold!",
- fight->exp, fight->gold);
-
- if (dragon_fight(ni))
- {
- addNews(todaysnews, "%s is a true warrior! %s has beaten %s!!",
- ni->stats->name.c_str(), ni->stats->name.c_str(),
- ni->stats->master->name.c_str());
- ni->stats->master = NULL; // Don't progress in levels
- }
-
- // If your new experience (or gold) will be greater than 2 billion,
- // then set your exp to 2bil. (2 billion max)... otherwise add them.
- // This could be a problem with overflowing out of the sign bit.
- // Unsigned long int maybe? Leave it for now.
- ni->stats->exp += fight->exp;
- if (ni->stats->exp < 0 || ni->stats->exp > 2000000000)
- ni->stats->exp = 2000000000;
-
- ni->stats->gold += fight->gold;
- if (ni->stats->gold < 0 || ni->stats->gold > 2000000000)
- ni->stats->gold = 2000000000;
-
- if (master_fight(ni))
- {
- notice(s_GameServ, u, "You are now level %d!", ni->stats->level + 1);
- notice(s_GameServ, u, "You gain %d Strength, and %d Defense points!",
- strbonus[ni->stats->level - 1], defbonus[ni->stats->level - 1]);
-
- // Increase your level
-
- // Increase your maximum hit points
- ni->stats->maxhp += hpbonus[ni->stats->level - 1];
-
- // Heal the player by setting hp to their max
- ni->stats->hp = ni->stats->maxhp;
-
- // Add to your strength
- ni->stats->strength += strbonus[ni->stats->level - 1];
-
- // Add to your defensive power
- ni->stats->defense += defbonus[ni->stats->level - 1];
-
- ni->stats->level++;
-
- // Clear the pointer for your master
- ni->stats->master = NULL;
- }
-
- // They're dead so remove the pointer
- delete ni->stats->fight;
- ni->stats->fight = NULL;
- ni->stats->master = NULL;
-
- return;
- }
- else
- {
- if (hit > 0)
- fight->hp -= hit;
- if (mhit > 0)
- {
- notice(s_GameServ, u, "\1f%s\1f attacks with their \1f%s\1f for \ 2%d\ 2 damage!",
- fight->name.c_str(), fight->weapon.c_str(), mhit);
- }
- else if (mhit <= 0)
- notice(s_GameServ, u, "%s completely misses you!", fight->name.c_str());
-
- if (mhit >= ni->stats->hp)
- {
- if (!master_fight(ni))
- {
- notice(s_GameServ, u, "You have been \ 2\1fkilled\1f\ 2 by %s!", fight->name.c_str());
- notice(s_GameServ, u, "You lose all gold on hand and lose 10 percent "\
- "of your experience!");
- addNews(todaysnews, "%s has been killed by %s!",
- ni->stats->name.c_str(), fight->name.c_str());
- ni->stats->gold = 0;
- ni->stats->exp -= (long int)(ni->stats->exp * .10);
- ni->stats->hp = 0;
- ni->stats->fight = NULL;
- clearAlive(ni->stats);
- return;
- }
- else
- {
- notice(s_GameServ, u, "%s has bested you! You will have to wait "\
- "until tomorrow to try again", ni->stats->master->name.c_str());
- addNews(todaysnews, "%s tried to best %s and failed!",
- ni->stats->name.c_str(), fight->name.c_str());
- ni->stats->fight = NULL;
- ni->stats->master = NULL;
- return;
- }
- }
- else
- {
- if (mhit > 0)
- ni->stats->hp -= mhit;
- display_monster(u);
- return;
- }
- }
- }
- else if (player_fight(ni))
- {
-/* Offline fighting not available yet
- if (!(online = finduser(ni->stats->battle->nick)) || !nick_identified(online))
- {
- if (hit > 0)
- notice(s_GameServ, u, "You attack \1f%s\1f for \ 2%d\ 2 points!", battle->nick, hit);
- else
- notice(s_GameServ, u, "You miss \1f%s\1f completely!", battle->nick);
- if (hit >= battle->stats->hp)
- {
- notice(s_GameServ, u, "You have killed \ 2%s\ 2!", battle->nick);
-* notice(s_GameServ, u, "You recieve \ 2%d\ 2 experience and \ 2%ld\ 2 gold!",
- (long int)(battle->stats->exp * .10), battle->stats->gold);
- if (2000000000 - ni->stats->exp > (long int)(battle->stats->exp * .10))
- {
- ni->stats->exp += (long int)(battle->stats->exp * .10);
- battle->stats->exp -= (long int)(battle->stats->exp * .10);
- }
-* else
- {
- battle->stats->exp -= (long int)(battle->stats->exp * .10);
- ni->stats->exp = 2000000000;
- }
-
- if (2000000000 - ni->stats->gold > battle->stats->gold)
- {
-* ni->stats->gold += battle->stats->gold;
- battle->stats->gold = 0;
- }
- else
- {
- battle->stats->gold = 2000000000 - ni->stats->gold;
- ni->stats->gold = 2000000000;
- }
-* ni->stats->battle->stats->alive = 0;
- ni->stats->battle->battle = NULL;
- ni->stats->battle = NULL;
- return;
- }
- else
- {
- if (hit > 0)
-* battle->stats->hp -= hit;
- if (mhit > 0)
- {
- notice(s_GameServ, u, "\1f%s\1f hits you with their \1f%s\1f for \ 2%d\ 2 damage!",
- battle->nick, weapons[battle->stats->weapon], mhit);
- }
- else if (mhit <= 0)
- notice(s_GameServ, u, "%s completely misses you!", battle->nick);
-*
- if (mhit >= ni->stats->hp)
- {
- notice(s_GameServ, u, "You have been \ 2\1fkilled\1f\ 2 by %s!", battle->nick);
- if (2000000000 - battle->stats->gold > ni->stats->gold)
- {
- notice(s_GameServ, u, "%s took all your gold!", battle->nick);
- battle->stats->gold += ni->stats->gold;
-* ni->stats->gold = 0;
- }
- else
- {
- notice(s_GameServ, u, "You're lucky, %s couldn't carry all your gold.",
- battle->nick);
- ni->stats->gold -= (2000000000 - battle->stats->gold);
- notice(s_GameServ, u, "You were left dead with %d gold.",
-* (long int)ni->stats->gold);
- battle->stats->gold = 2000000000;
- }
- ni->stats->battle->battle = NULL;
- ni->stats->battle = NULL;
- ni->stats->alive = 0;
- return;
- }
-* else
- {
- if (mhit > 0)
- ni->stats->hp -= mhit;
- display_players(u);
- return;
- }
- }
- }
-* end offline fighting */
-
- if (is_playing(battle))
- {
- if (!isYourTurn(ni->stats))
- {
- notice(s_GameServ, u, "Please wait until %s decides what to do!",
- battle->stats->name.c_str());
- return;
- }
- if (hit > 0)
- {
- notice(s_GameServ, u, "You attack \1f%s\1f for \ 2%d\ 2 points!", battle->stats->name.c_str(), hit);
-
- notice(s_GameServ, battle->getNick(), "%s has hit you with their %s for "\
- "\ 2%d\ 2 damage!", ni->stats->name.c_str(),
- weapons[ni->stats->weapon], hit);
- }
- else
- {
- notice(s_GameServ, u, "You miss \1f%s\1f completely!", battle->stats->name.c_str());
- notice(s_GameServ, battle->getNick(), "%s misses you completely!", ni->stats->name.c_str());
- }
-
- if (hit >= battle->stats->hp)
- {
- notice(s_GameServ, u, "You have killed \ 2%s\ 2!", battle->stats->name.c_str());
- notice(s_GameServ, u, "You recieve \ 2%d\ 2 experience and \ 2%ld\ 2 gold!",
- (long int)(battle->stats->exp * .10), battle->stats->gold);
- notice(s_GameServ, battle->getNick(), "You have been killed by \ 2%s\ 2!",
- ni->stats->name.c_str());
- battle->stats->hp = 0;
- clearAlive(battle->stats);
-
- ni->stats->exp += (long int)(battle->stats->exp * .10);
- battle->stats->exp -= (long int)(battle->stats->exp * .10);
-
- if (ni->stats->exp < 0 || ni->stats->exp > 2000000000)
- ni->stats->exp = 2000000000;
-
- if (2000000000 - ni->stats->gold > battle->stats->gold)
- {
- notice(s_GameServ, battle->getNick(), "You lose ten percent of experience and "\
- "all gold on hand!");
- ni->stats->gold += battle->stats->gold;
- battle->stats->gold = 0;
- }
- else
- {
- battle->stats->gold = 2000000000 - ni->stats->gold;
- 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.", ni->stats->name.c_str());
-
- notice(s_GameServ, battle->getNick(), "Luckily, you still have \ 2%ld\ 2 gold "\
- "left. All is not lost!", battle->stats->gold);
-
- ni->stats->gold = 2000000000;
- }
-
- clearYourTurn(ni->stats);
- clearYourTurn(battle->stats);
- battle->stats->battle = NULL;
- ni->stats->battle = NULL;
- return;
- }
- else
- {
- if (hit > 0)
- battle->stats->hp -= hit;
- clearYourTurn(ni->stats);
- setYourTurn(battle->stats);
- display_players(battle);
- notice(s_GameServ, u, "Please wait while %s decides what to do!",
- battle->stats->name.c_str());
- return;
- }
- }
- }
-}
-
void do_heal(char *u)
{
aClient *ni;
long int stringtoint(char *number)
{
+ return atol(number);
+/*
long int x, len = strlen(number), sum = 0;
if (len == 1)
return chartoint(number[0]);
for (x = len - 2; x >= 0; x--)
sum += chartoint(number[x]) * pow(10, abs(x - len + 1));
return sum;
+*/
}
long int pow(int x, int y)
clearYourTurn(it);
outfile << it->name.c_str() << ' ' << it->level << ' ' << it->exp << ' ' << it->gold << ' ' << it->bank << ' '
<< it->hp << ' ' << it->maxhp << ' ' << it->strength << ' ' << it->defense << ' '
- << it->armor << ' ' << it->weapon << ' '
+ << it->arm << ' ' << it->wea << ' '
<< it->forest_fights << ' ' << it->player_fights << ' '
<< it->getFlags() << ' ' << it->password << ' ' << it->inventory.Healing()
<< ' ' << it->inventory.Strength() << ' ' << it->inventory.Defense() << ' ' << it->inventory.HP()
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_gs_dbase()
{
ifstream infile;
aClient *temp;
Player *p;
char *tempname, *buf, *password;
- buf = new char[1023];
+ buf = new char[1024];
infile.open(playerdata);
p->maxhp = stringtoint(strtok(NULL, " "));
p->strength = stringtoint(strtok(NULL, " "));
p->defense = stringtoint(strtok(NULL, " "));
- p->armor = stringtoint(strtok(NULL, " "));
- p->weapon = stringtoint(strtok(NULL, " "));
+ p->arm = stringtoint(strtok(NULL, " "));
+ p->wea = stringtoint(strtok(NULL, " "));
p->forest_fights = stringtoint(strtok(NULL, " "));
p->player_fights = stringtoint(strtok(NULL, " "));
p->setFlags(stringtoint(strtok(NULL, " ")));
p = user->stats;
- if (p->weapon != 0)
- notice(s_GameServ, u, "You have to sell your %s first!", weapons[p->weapon]);
+ if (p->wea != 0)
+ notice(s_GameServ, u, "You have to sell your %s first!", weapons[p->wea]);
else if (p->gold < prices[wep - 1])
notice(s_GameServ, u, "You don't have enough gold for %s!", weapons[wep]);
else
{
notice(s_GameServ, u, "You have purchased %s! Thanks for the gold!", weapons[wep]);
- p->weapon = wep;
+ p->wea = wep;
p->gold -= prices[wep - 1];
}
}
p = user->stats;
- if (p->armor != 0)
- notice(s_GameServ, u, "You have to sell your %s first!", armors[p->armor]);
+ if (p->arm != 0)
+ notice(s_GameServ, u, "You have to sell your %s first!", armors[p->arm]);
else if (p->gold < prices[wep - 1])
notice(s_GameServ, u, "You don't have enough gold for %s!", armors[wep]);
else
{
notice(s_GameServ, u, "You have purchased %s! Thanks for the gold!", armors[wep]);
- p->armor = wep;
+ p->arm = wep;
p->gold -= prices[wep - 1];
}
}
if (stricmp(item, "WEAPON") == 0)
{
- if (p->weapon == 0)
+ if (p->wea == 0)
{
notice(s_GameServ, u, "You want me to chop off your hands?");
return;
else if (p->gold == 2000000000)
{
notice(s_GameServ, u, "You have enough gold. I'll just take that off your hands, sire.");
- p->weapon = 0;
+ p->wea = 0;
}
- else if (2000000000 - p->gold < (prices[p->weapon - 1] / 2))
+ else if (2000000000 - p->gold < (prices[p->wea - 1] / 2))
{
notice(s_GameServ, u, "Thank you for your business! You now have as much gold as you can carry.");
notice(s_GameServ, u, "However, you have no weapon... can I interest you in the %s?", weapons[WNA - 1]);
p->gold = 2000000000;
- p->weapon = 0;
+ p->wea = 0;
}
else
{
- notice(s_GameServ, u, "Thank you for your business! You now have %d more gold but no weapon!", (prices[p->weapon - 1] / 2));
- p->gold += (prices[p->weapon - 1] / 2);
- p->weapon = 0;
+ notice(s_GameServ, u, "Thank you for your business! You now have %d more gold but no weapon!", (prices[p->wea - 1] / 2));
+ p->gold += (prices[p->wea - 1] / 2);
+ p->wea = 0;
}
}
else if (stricmp(item, "ARMOR") == 0)
{
p = user->stats;
- if (p->armor == 0)
+ if (p->arm == 0)
{
notice(s_GameServ, u, "I don't think you can be any more naked...");
return;
if (p->gold == 2000000000)
{
notice(s_GameServ, u, "You have enough gold. I'll just take that off your hands, sire.");
- p->armor = 0;
+ p->arm = 0;
}
- else if (2000000000 - p->gold < (prices[p->armor - 1] / 2))
+ else if (2000000000 - p->gold < (prices[p->arm - 1] / 2))
{
notice(s_GameServ, u, "Thank you for your business! You now have as much gold as you can carry.");
notice(s_GameServ, u, "However, you have no armor... can I interest you in %s?", armors[WNA - 1]);
p->gold = 2000000000;
- p->armor = 0;
+ p->arm = 0;
}
else
{
notice(s_GameServ, u, "Thank you for your business! You now have %d more gold but no armor!",
- (prices[p->armor - 1] / 2));
+ (prices[p->arm - 1] / 2));
- p->gold += (prices[p->armor - 1] / 2);
- p->armor = 0;
+ p->gold += (prices[p->arm - 1] / 2);
+ p->arm = 0;
}
}
else
Player *p = user->stats;
setMaster(p);
- see_master(u);
notice(s_GameServ, u, "You approach the dragon's lair cautiously.");
notice(s_GameServ, u, "The stench of sulfer fills the air as a "\
"deep, red fog rolls in. The air is filled with the "\
"your %s, and venture into the hot, dark cave. "\
"You are surprised at the angle of descent as you climb "\
"lower and lower, deeper into the dragon's den.",
- armors[p->armor], weapons[p->weapon]);
+ armors[p->arm], weapons[p->wea]);
notice(s_GameServ, u, "You come to the end of the cave to find "\
"a tooth. It is a large tooth... bigger than your torso."\
" Suddenly the darkness lifts from the gleam of an eye "\
notice(s_GameServ, u, "Just then you notice the eye begin to "\
"glare orange! The tooth is moving... but it is still too "\
"dark for you to make out.... THE DRAGON! You see it!");
+ p->fight = new Monster(dragon);
+ setDragonFight(p);
display_monster(u);
}