SparrowBot/app/rpgmodule.h

196 lines
3.8 KiB
C++

#ifndef RPGMODULE_H
#define RPGMODULE_H
#include "module.h"
#include <unordered_map>
class User;
enum
{
FOREST = 'X',
MOUNTAINS = '^',
PLAINS = ' ',
ROAD = '#',
VILLAGE = 'O'
};
struct Event;
struct Enemy
{
QString name;
int hp;
// TODO stats
};
struct Trade
{
int goldPrice;
QString itemPrice;
QString item;
Event *reward;
};
struct Roleplay
{
QString trigger;
Event *reward;
};
struct Fight
{
Enemy enemy;
Event *reward;
};
typedef std::vector<Trade> Trader;
struct Event
{
enum Type
{
TRADER,
TRADE,
FIGHT,
ROLEPLAY
};
QString lookAt();
QString name;
QString description;
Type type;
Trader *trader;
Trade *trade;
Fight *fight;
Roleplay *roleplay;
};
struct Village
{
int x;
int y;
QString name;
std::vector<Event> events;
};
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
{
std::vector<Village> villages;
CharacterMap charList;
std::unordered_map<User*, RPGCharacter*> charOnline;
public:
RPGModule();
void saveCharacters();
void initVillages();
void playerJoin(User* user, RPGCharacter *c);
void playerLeave(User* user);
Village* getVillage(RPGCharacter *c);
QString lookAt(RPGCharacter *c, QString target);
QString eventInteract(RPGCharacter *c, QString target);
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