char *remotepass; // Password for the server link
char *playerdata; // File to store player data in
+char *dragondata; // File to store current dragon data in
+char *masterdata; // File to store the master data in
char *newsdata; // File to store news data in
char *pidfile; // Process ID file
delete [] remotepass;
if (playerdata)
delete [] playerdata;
+ if (dragondata)
+ delete [] dragondata;
+ if (masterdata)
+ delete [] masterdata;
if (adminpass)
delete [] adminpass;
if (welcomemsg)
{
char *buf, *directive, *value;
- #define numdirectives 28
+ #define numdirectives 30
unload_config_file();
"GameServ should identify with NickServ";
directives[26].desc = "NSNAME - Your network's NickServ nickname";
directives[27].desc = "NSPASS - GameServ's NickServ Password";
+ directives[28].desc = "DRAGONDATA - File to store the current "\
+ "dragon's stats in";
+ directives[29].desc = "MASTERDATA - File to store the level master stats in";
configflags = 0;
strcpy(nspass, value);
directives[27].done = true;
}
+ else if (stricmp(directive, "DRAGONDATA") == 0)
+ {
+ value = strtok(NULL, "");
+ dragondata = new char[strlen(value) + 1];
+ strcpy(dragondata, value);
+ directives[28].done = true;
+ }
+ else if (stricmp(directive, "MASTERDATA") == 0)
+ {
+ value = strtok(NULL, "");
+ masterdata = new char[strlen(value) + 1];
+ strcpy(masterdata, value);
+ directives[29].done = true;
+ }
else if (stricmp(directive, "WELCOMEMSG") == 0)
{
// This directive is optional
{
// Player's Hit
hit = ((ni->stats->strength + webonus[ni->stats->weapon]) / 2) +
- (rand() % ((ni->stats->strength + webonus[ni->stats->weapon]) / 2));
+ (rand() % ((ni->stats->strength + webonus[ni->stats->weapon]) / 2)) -
+ fight->defense;
// Opponent's Hit
mhit = (fight->strength / 2) +
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 (dragon_fight(ni))
+ {
+ addNews(todaysnews, "%s is a true warrior! %s has beaten %s!!"\
+ " %s is now watching over the Dragon's lair!",
+ ni->stats->name.c_str(), ni->stats->name.c_str(),
+ ni->stats->fight->name.c_str(), ni->stats->name.c_str());
+ dragon.name = "DRAGON-" + ni->stats->name;
+ dragon.weapon = weapons[ni->stats->weapon];
+ dragon.strength = ni->stats->strength + webonus[ni->stats->weapon];
+ dragon.defense = ni->stats->defense + arbonus[ni->stats->armor];
+ dragon.hp = ni->stats->maxhp;
+ dragon.maxhp = ni->stats->maxhp;
+ save_dragon();
+ clearDragonFight(ni->stats);
+ reset(ni->stats);
+ }
// If your new experience (or gold) will be greater than 2 billion,
// then set your exp to 2bil. (2 billion max)... otherwise add them.
E char *newsdata;
E char *nsname;
E char *nspass;
+E Monster dragon;
#if defined(P10)
E char *gsnum;
E char *remoteport;
E char *remotepass;
E char *playerdata;
+E char *dragondata;
+E char *masterdata;
E char *logfile;
E char *adminpass;
E char *VERSION;
E int save_gs_dbase();
E int load_gs_dbase();
+E int load_dragon();
+E int save_dragon();
// Log File Stuff
E void log(const char *fmt, ...);
#define FLAG_ALIVE 0x00000002
#define FLAG_YOURTURN 0x00000004
#define FLAG_WONGAME 0x00000008
+#define FLAG_DRAGONFIGHT 0x00000010
// Config File flags
#define CFLAG_LISTENONCF 0x00000001
#define setWonGame(x) ((x)->addFlag(FLAG_WONGAME))
#define clearWonGame(x) ((x)->remFlag(FLAG_WONGAME))
+#define isDragonFight(x) ((x)->getFlags() & FLAG_DRAGONFIGHT)
+#define setDragonFight(x) ((x)->addFlag(FLAG_DRAGONFIGHT))
+#define clearDragonFight(x) ((x)->remFlag(FLAG_DRAGONFIGHT))
+
#endif
#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
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
- return (user->stats->level == LEVELS && master_fight(user));
+ return (isDragonFight(user->stats));
}
void do_fight(char *u)
{
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);
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!");
- see_master(u);
+ p->fight = new Monster(dragon);
+ setDragonFight(p);
+ display_monster(u);
}
void do_master(char *u)
weapon.erase();
death.erase();
strength = 0;
+ defense = 0;
exp = 0;
gold = 0;
maxhp = hp = 0;
weapon = m->weapon;
death = m->death;
strength = m->strength;
+ defense = m->defense;
maxhp = m->maxhp;
hp = m->hp;
gold = m->gold;
weapon = m.weapon;
death = m.death;
strength = m.strength;
+ defense = m.defense;
maxhp = m.maxhp;
hp = m.hp;
gold = m.gold;
monster_(monster_ *);
monster_(monster_ &);
~monster_();
- string name; // The monster's name
- string weapon; // A name for their weapon. Doesn't have to be in weapons[]
- int strength; // Their strength
- int gold; // The gold you get when you kill them
- int exp; // The experience you get when you kill them
- int hp; // Their remaining hitpoints
- int maxhp; // Their max hitpoints
- string death; // What is said when they die
+ string name; // The monster's name
+ string weapon; // A name for their weapon. Doesn't have to be in weapons[]
+ int strength; // Their strength
+ int gold; // The gold you get when you kill them
+ int exp; // The experience you get when you kill them
+ int hp; // Their remaining hitpoints
+ int maxhp; // Their max hitpoints
+ int defense; // Only used seldomly
+ string death; // What is said when they die
};
#endif
goto end;
}
+ if (!load_dragon())
+ {
+ log("Error loading dragon");
+ goto end;
+ }
+
if (load_levels() == false)
{
log("Error loading levels");
end:
save_gs_dbase();
+ save_dragon();
saveNews(newsdata, todaysnews);
delete_monsters();