#ifndef RPGMODULE_H #define RPGMODULE_H #include "module.h" #include 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 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 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 names; std::unordered_map 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 villages; CharacterMap charList; std::unordered_map 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