diff --git a/app/app.pro b/app/app.pro index ec01c22..f1c34b4 100644 --- a/app/app.pro +++ b/app/app.pro @@ -18,7 +18,8 @@ SOURCES = main.cpp \ riddles.cpp \ todomodule.cpp \ jankenmodule.cpp \ - janken.cpp + janken.cpp \ + rpgmodule.cpp HEADERS += \ regismodule.h \ @@ -29,4 +30,5 @@ HEADERS += \ riddles.h \ todomodule.h \ jankenmodule.h \ - janken.h + janken.h \ + rpgmodule.h diff --git a/app/main.cpp b/app/main.cpp index dc910cc..3409e57 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -10,6 +10,7 @@ #include "fourasmodule.h" #include "todomodule.h" #include "jankenmodule.h" +#include "rpgmodule.h" // #include "janken.h" @@ -43,6 +44,7 @@ int main(int argc, char *argv[]) app.addModule(new PoilAuModule()); app.addModule(new FourasModule()); app.addModule(new JankenModule()); + app.addModule(new RPGModule()); //app.addModule(new TodoModule()); return app.exec(); diff --git a/app/rpgmodule.cpp b/app/rpgmodule.cpp new file mode 100644 index 0000000..be5ed74 --- /dev/null +++ b/app/rpgmodule.cpp @@ -0,0 +1,97 @@ +#include "rpgmodule.h" +#include +#include +#include "message.h" +#include "user.h" + +RPGModule::RPGModule() +{ + // TODO : load save file +} + +void RPGModule::playerJoin(User *user, RPGCharacter *c) +{ + c->user = user; + charOnline[user] = c; +} + +void RPGModule::playerLeave(User *user) +{ + if(charOnline.count(user) > 0) + { + charOnline[user]->user = NULL; + charOnline.erase(user); + } +} + +bool RPGModule::messageHandler(Message msg) +{ + User* src = getUsers()->getFromNick(msg.nick); + + if(msg.command.compare(QString("PRIVMSG"), Qt::CaseInsensitive) == 0) + { + if(msg.args.startsWith("!rpg register ") == 0 && !msg.target.contains(getChan())) + { + QStringList paramList = msg.args.split(' '); + if(paramList.size() != 4) + answer = privateSay("usage : !rpg register [name of character] [password]", msg.nick); + else + { + if(charList.get(paramList[2].toStdString()) != NULL) + answer = privateSay(QString("ERROR : Character name \"%1\" already exists").arg(paramList[2]), msg.nick); + else + charList.add(paramList[2].toStdString(), new RPGCharacter(paramList[2], paramList[3])); + } + return true; + } + else if(msg.args.startsWith("!rpg join ") == 0 && !msg.target.contains(getChan())) + { + QStringList paramList = msg.args.split(' '); + if(paramList.size() != 4) + answer = privateSay("usage : !rpg join [name of character] [password]", msg.nick); + else + { + RPGCharacter *c = charList.get(paramList[2].toStdString()); + if(c != NULL) + { + playerJoin(getUsers()->getFromNick(msg.nick), c); + answer = say(QString("%1 joins the RPG as %2").arg(msg.nick).arg(paramList[2])); + } + else + answer = privateSay(QString("ERROR : Character name \"%1\" does not exists").arg(paramList[2]), msg.nick); + } + return true; + } + else if(msg.args.compare("!rpg leave") == 0) + { + playerLeave(src); + answer = say(QString("%1 (%2) left the RPG").arg(charOnline[src]->pseudo).arg(src->getNick())); + } + else if(msg.args.compare("!rpg list") == 0) + { + bool hasPeople = false; + for(auto it : charOnline) + { + hasPeople = true; + RPGCharacter *c = it.second; + answer += say(QString("%1 [lvl %2] (%3)").arg(c->pseudo).arg(c->level).arg(c->user->getNick())); + } + return hasPeople; + } + else if(msg.args.compare("!rpg help") == 0) + { + answer = privateSay("Create new character (works only in private message) : !rpg register [name of character] [password]", msg.nick); + answer += privateSay("Join game with character (works only in private message) : !rpg join [name of character] [password]", msg.nick); + answer += privateSay("leave the game : !rpg leave", msg.nick); + return true; + } + } + else if(msg.command.compare("QUIT", Qt::CaseInsensitive) == 0) + playerLeave(src); + else if(msg.command.compare("PART", Qt::CaseInsensitive) == 0) + playerLeave(src); + else if(msg.command.compare("KICK", Qt::CaseInsensitive) == 0) + playerLeave(getUsers()->getFromNick(msg.target2)); + + return false; +} diff --git a/app/rpgmodule.h b/app/rpgmodule.h new file mode 100644 index 0000000..3ba8f41 --- /dev/null +++ b/app/rpgmodule.h @@ -0,0 +1,68 @@ +#ifndef RPGMODULE_H +#define RPGMODULE_H + +#include "module.h" +#include + +class User; + +struct RPGCharacter +{ + 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(0), + y(0), + user(NULL) + {} +}; + +class CharacterMap +{ +public: + std::vector names; + std::unordered_map data; + + void add(const std::string &name, RPGCharacter* t) + { + data[name] = t; + names.push_back(name); + } + + RPGCharacter* get(const std::string &name) + { + if(data.count(name)) + return data[name]; + else + return NULL; + } + + // TODO serialization +}; + +class RPGModule : public Module +{ + CharacterMap charList; + std::unordered_map charOnline; + +public: + RPGModule(); + + void playerJoin(User* user, RPGCharacter *c); + void playerLeave(User* user); + + virtual bool messageHandler(Message msg); + virtual QString getName() {return QString("rpg");} +}; + +#endif // RPGMODULE_H diff --git a/app/sparrowmodule.cpp b/app/sparrowmodule.cpp index ce9e8e9..b338947 100644 --- a/app/sparrowmodule.cpp +++ b/app/sparrowmodule.cpp @@ -28,7 +28,7 @@ bool SparrowModule::messageHandler(Message msg) } else if(msg.args.compare("!version") == 0) { - answer = say("sparrowBot v1.0"); + answer = say("sparrowBot v1.1"); return true; } else if(msg.args.compare("!bot") == 0)