#include "extern.h"
#include "flags.h"
#include "list.h"
+#include "level.h"
#include "sockhelp.h"
#include <cctype>
#endif
-Monster *monsters[LEVELS][MONSTERS]; // Monsters per level. Total = MONSTERS * LEVELS
Monster boss; // The boss monster
+Level levels[LEVELS]; // The newest way to store monsters
Monster *masters[LEVELS]; // A master for each level
bool shuttingdown;
bool timedOut(Player *p);
-void updateTS(Player *p);
+void updateTS(Player *p);
void timeOutEvent(Player *p);
bool is_playing(char *u); // True if the given nickname in the clients list is playing.
void updateTS(Player *p);
void reset(Player *p);
void init_masters();
-void init_monsters();
bool load_monsters();
+bool load_levels();
void delete_monsters();
void delete_masters();
char *rest = strtok(NULL, "");
raw("%s", rest);
}
+ } else if (stricmp(cmd, "PRINT") == 0) {
+ for (int x = 0; x < LEVELS; x++)
+ levels[x].monsters.print();
+ } else if (stricmp(cmd, "RANDOM") == 0) {
+ char *rstr = strtok(NULL, "");
+ range trange;
+ trange.setRange(rstr);
+ notice(s_GameServ, source, "Random number in that range: %d", trange.random());
#endif
} else {
aClient *user;
{
while(temp)
{
- if (!cmd || is_playing(temp->getData()))
+ if (cmd || is_playing(temp->getData()))
{
if (!header)
{
temp = players[hv].insertAtBack_RLN(user);
temp->setPtr(user); // This is an extra step, but necessary for now
+ // Update the last login time
+ user->stats->lastlogin = time(NULL);
+
notice(s_GameServ, u, "Player %s registered with password %s.", user->stats->name, password);
notice(s_GameServ, u, "Write this password down. If you lose it, there is no way to retrieve it!");
log("Nickname %s registered player %s.", u, user->stats->name);
setPlaying(user); // set the playing flag
temp->setPtr(user);
+
+ // Update the last login time
+ user->stats->lastlogin = time(NULL);
+
notice(s_GameServ, u, "Password Accepted. Identified.");
showNews(u, todaysnews);
}
strcpy(masters[10]->death, "You must learn to concentrate. It is like a finger pointing away to the moon... DONT concentrate on the finger, or you will miss all the heavenly glory.");
}
-void init_monsters()
-{
- #ifdef DEBUGMODE
- log("Calling delete_monsters");
- #endif
-
- delete_monsters();
-
- for (int x = 0; x < LEVELS; x++)
- for (int y = 0; y < MONSTERS; y++)
- monsters[x][y] = new Monster();
-}
-
void delete_monsters()
{
for (int x = 0; x < LEVELS; x++)
- for (int y = 0; y < MONSTERS; y++)
- if (monsters[x][y])
- delete monsters[x][y];
+ levels[x].monsters.deleteNodes();
}
void delete_masters()
// 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 = ( (ni->stats->exp + fight->exp) > 2000000000 ? 2000000000 :
- ni->stats->exp + fight->exp);
-
- ni->stats->gold = (ni->stats->gold + fight->gold > 2000000000 ? 2000000000 :
- ni->stats->gold + fight->gold);
+ 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))
{
battle->stats->hp = 0;
clearAlive(battle->stats);
- 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 += (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)
{
ni->stats->gold = 2000000000;
}
+
clearYourTurn(ni->stats);
clearYourTurn(battle->stats);
battle->stats->battle = NULL;
<< it->armor << ' ' << it->weapon << ' '
<< it->forest_fights << ' ' << it->player_fights << ' '
<< it->getFlags() << ' ' << it->password << ' ' << it->inventory.Healing()
- << ' ' << it->inventory.Strength() << ' ' << it->inventory.Defense() << ' ' << it->inventory.HP() << endl;
+ << ' ' << it->inventory.Strength() << ' ' << it->inventory.Defense() << ' ' << it->inventory.HP()
+ << ' ' << it->lastlogin << endl;
ptr = ptr->Next();
}
}
tempname = strtok(NULL, " ");
if (tempname)
p->inventory.setHP(stringtoint(tempname));
+
+ tempname = strtok(NULL, " ");
+ if (tempname)
+ p->lastlogin = stringtoint(tempname);
+ else
+ p->lastlogin = time(NULL);
+
unsigned long hv = iHASH((unsigned char *) temp->stats->name);
temp->stats->client = NULL;
updateTS(user->stats);
Player *p = user->stats;
- p->fight = new Monster(boss);
+ p->fight = new Monster(&boss);
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 "\
void reset(Player *p)
{
+ char *myname;
+ myname = new char[strlen(p->name)];
+ strcpy(myname, p->name);
if (!p)
return;
p->reset();
+ strcpy(p->name, myname);
+ delete [] myname;
}
void updateTS(Player *p)
notice(s_GameServ, u, "Resetting everyone's stats!");
resetall();
}
- else if ((user = findbyrealnick(nick)))
+ else if ((user = findplayer(nick)))
{
if (is_playing(user))
{
}
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, "Resetting %s", user->stats->name);
+ reset(user->stats);
}
}
else
}
}
+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)
+ return false;
+ }
+
+ delete []filename;
+ return true;
+}
bool load_monsters()
{
+ char *filename;
ifstream infile;
- infile.open("monsters.dat");
-
char *buf;
+ buf = new char[2048];
- if (infile.fail())
+ 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 monsters.dat");
+ log("Error opening %s", filename);
return false;
}
- init_monsters();
- buf = new char[2048];
#ifdef DEBUGMODE
- log("Loading monsters from monsters.dat");
+ log("Loading monsters from %s", filename);
#endif
- for (int l = 0; l < REALLEVELS; l++)
- {
- for (int m = 0; m < MONSTERS;)
+ while (infile.getline(buf, 2048))
{
- infile.getline(buf, 2048);
+ if (buf[0] == '^')
+ break;
if (buf[0] == '\n' || buf[0] == '\0' || buf[0] == '#')
continue;
- else
- {
- strcpy(monsters[l][m]->name, strtok(buf, "~"));
- strcpy(monsters[l][m]->weapon, strtok(NULL, "~"));
- monsters[l][m]->strength = stringtoint(strtok(NULL, "~"));
- monsters[l][m]->gold = stringtoint(strtok(NULL, "~"));
- monsters[l][m]->exp = stringtoint(strtok(NULL, "~"));
- monsters[l][m]->maxhp = stringtoint(strtok(NULL, "~"));
- monsters[l][m]->hp = monsters[l][m]->maxhp;
- strcpy(monsters[l][m]->death, strtok(NULL, ""));
- m++;
- }
+ Monster *temp;
+ temp = new Monster;
+
+ strcpy(temp->name, strtok(buf, "~"));
+ strcpy(temp->weapon, strtok(NULL, "~"));
+ /*
+ temp->strength = stringtoint(strtok(NULL, "~"));
+ temp->gold = stringtoint(strtok(NULL, "~"));
+ temp->exp = stringtoint(strtok(NULL, "~"));
+ temp->maxhp = stringtoint(strtok(NULL, "~"));
+ temp->hp = temp->maxhp;
+ */
+ strcpy(temp->death, strtok(NULL, "~"));
+
+ levels[level - 1].monsters.insertAtBack_RLN(temp);
+ delete temp;
}
+ delete [] filename;
+ infile.close();
}
delete [] buf;
return true;