132 lines
2.9 KiB
C++
132 lines
2.9 KiB
C++
#ifndef RPGMODULE_H
|
|
#define RPGMODULE_H
|
|
|
|
#include "module.h"
|
|
#include <unordered_map>
|
|
|
|
class User;
|
|
|
|
enum
|
|
{
|
|
FOREST = 'X',
|
|
MOUNTAINS = '^',
|
|
PLAINS = ' ',
|
|
ROAD = '#',
|
|
VILLAGE = 'O'
|
|
};
|
|
|
|
const char WORLDMAP[25][26] = {
|
|
"^^^^^^^^^^^^^^^^^^^^^^^^^",
|
|
"^^^^^^^^^^^^^^^^^^^^^^^^^",
|
|
"^^^^^^^^^^XXXXXXX^^^^^^^^",
|
|
"^^^^^XXXXXXXXXXXXXX^^^^^^",
|
|
"^^^XXXXOXXXXXXXXXXXXXXXXX",
|
|
"^^^XXXX#XXXXXXXXXXXXXXXXX",
|
|
"^^XXXXX#XXXXXXXXXXXXXXXXX",
|
|
"XXXXXXX#XXXXXXXXXXXXXXXXX",
|
|
"XXXXXXX##########OXXXXXXX",
|
|
"XXXXXXX#XXXXXXX#XXXXXXXXX",
|
|
"XXXXXXX#XXXXXXX#XXXXXXXXX",
|
|
"XO######XXXXXXX#XXXXXXXXX",
|
|
"XXXXXXX#XXXXXXX#XXXXXXXXX",
|
|
"XXXXXXX# # XXXXXXXX",
|
|
"XXXX # # XXXX",
|
|
"XXXX #####O####### XX",
|
|
"XXXX # # ",
|
|
"XXXX # # ",
|
|
"XXXO#### # ",
|
|
"XXXX # ",
|
|
"XXXX # ",
|
|
"XXXXXXX ^^^#^^^ ",
|
|
"XXXXXXXXX^^^^^^^^^^O^^^^^",
|
|
"XXXXXX^^^^^^^^^^^^^^^^^^^",
|
|
"XX^^^^^^^^^^^^^^^^^^^^^^^"};
|
|
|
|
|
|
struct RPGCharacter
|
|
{
|
|
static const int VERSION = 1;
|
|
|
|
int level;
|
|
int xp;
|
|
QString password;
|
|
QString pseudo;
|
|
int x;
|
|
int y;
|
|
User *user;
|
|
|
|
RPGCharacter(QString myPseudo, QString myPass) :
|
|
level(1),
|
|
xp(0),
|
|
password(myPass),
|
|
pseudo(myPseudo),
|
|
x(13),
|
|
y(13),
|
|
user(NULL)
|
|
{}
|
|
|
|
RPGCharacter(QString serialisationStr) : user(NULL)
|
|
{
|
|
if(!fromString(serialisationStr))
|
|
{
|
|
pseudo = QString("trash");
|
|
password = QString("trashpass");
|
|
}
|
|
}
|
|
|
|
QString toString();
|
|
bool fromString(QString str);
|
|
};
|
|
|
|
class CharacterMap
|
|
{
|
|
public:
|
|
std::vector<std::string> names;
|
|
std::unordered_map<std::string, RPGCharacter*> data;
|
|
|
|
void add(RPGCharacter* t)
|
|
{
|
|
std::string name = t->pseudo.toStdString();
|
|
data[name] = t;
|
|
names.push_back(name);
|
|
}
|
|
|
|
RPGCharacter* get(const std::string &name)
|
|
{
|
|
if(data.count(name))
|
|
return data[name];
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
void erase(const std::string &name)
|
|
{
|
|
data.erase(name);
|
|
for(auto it = names.begin(); it != names.end(); ++it)
|
|
{
|
|
if(*it == name)
|
|
names.erase(it);
|
|
}
|
|
}
|
|
};
|
|
|
|
class RPGModule : public Module
|
|
{
|
|
CharacterMap charList;
|
|
std::unordered_map<User*, RPGCharacter*> charOnline;
|
|
|
|
public:
|
|
RPGModule();
|
|
void saveCharacters();
|
|
|
|
void playerJoin(User* user, RPGCharacter *c);
|
|
void playerLeave(User* user);
|
|
QString playerTravel(RPGCharacter *c, QString dir, bool repeat=false);
|
|
QString getTerrainName(int type);
|
|
|
|
virtual bool messageHandler(Message msg);
|
|
virtual QString getName() {return QString("rpg");}
|
|
};
|
|
|
|
#endif // RPGMODULE_H
|