317 lines
9.7 KiB
C++
317 lines
9.7 KiB
C++
#include "rpgmodule.h"
|
|
#include <QString>
|
|
#include <QStringList>
|
|
#include <QFileInfo>
|
|
#include <QTextStream>
|
|
#include "message.h"
|
|
#include "user.h"
|
|
|
|
QString RPGCharacter::toString()
|
|
{
|
|
QString str;
|
|
str.append(pseudo).append(" ");
|
|
str.append(password).append(" ");
|
|
str.append(QString::number(level)).append(" ");
|
|
str.append(QString::number(xp)).append(" ");
|
|
str.append(QString::number(x)).append(" ");
|
|
str.append(QString::number(y));
|
|
return str;
|
|
}
|
|
|
|
bool RPGCharacter::fromString(QString str)
|
|
{
|
|
QStringList list = str.split(QChar(' '));
|
|
if(list.size() == 6)
|
|
{
|
|
bool ok;
|
|
pseudo = list[0];
|
|
password = list[1];
|
|
level = list[2].toInt(&ok);
|
|
if(!ok)
|
|
return false;
|
|
xp = list[3].toInt(&ok);
|
|
if(!ok)
|
|
return false;
|
|
x = list[4].toInt(&ok);
|
|
if(!ok)
|
|
return false;
|
|
y = list[5].toInt(&ok);
|
|
if(!ok)
|
|
return false;
|
|
return true;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
|
|
RPGModule::RPGModule()
|
|
{
|
|
QFile f("../../res/rpg.save");
|
|
if(!f.open(QFile::ReadOnly | QFile::Text))
|
|
{
|
|
fprintf(stderr, "can't load save file.\n");
|
|
return;
|
|
}
|
|
QTextStream in(&f);
|
|
QString line = "plop (line init)";
|
|
do
|
|
{
|
|
line = in.readLine();
|
|
charList.add(new RPGCharacter(line));
|
|
}
|
|
while(!line.isNull());
|
|
f.close();
|
|
}
|
|
|
|
void RPGModule::saveCharacters()
|
|
{
|
|
QFile f("../../res/rpg.save");
|
|
if(!f.open(QFile::WriteOnly | QFile::Text))
|
|
{
|
|
fprintf(stderr, "can't load save file.\n");
|
|
return;
|
|
}
|
|
QTextStream out(&f);
|
|
for(const std::string &name : charList.names)
|
|
{
|
|
if(name != "trash")
|
|
out << charList.get(name)->toString() << "\n";
|
|
}
|
|
f.close();
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
QString RPGModule::getTerrainName(int type)
|
|
{
|
|
switch(type)
|
|
{
|
|
case FOREST :
|
|
return QString("the forest");
|
|
case MOUNTAINS :
|
|
return QString("the mountains");
|
|
case PLAINS :
|
|
return QString("the plains");
|
|
case ROAD :
|
|
return QString("a road");
|
|
case VILLAGE :
|
|
return QString("a village");
|
|
default :
|
|
return QString("Hell");
|
|
}
|
|
}
|
|
|
|
QString RPGModule::playerTravel(RPGCharacter *c, QString dir, bool repeat)
|
|
{
|
|
char terrainType = WORLDMAP[c->x][c->y];
|
|
QString direction;
|
|
QString currentArea = getTerrainName(terrainType);
|
|
bool blocked = false;
|
|
|
|
if(dir.compare("north") == 0 || dir.compare("n") == 0)
|
|
{
|
|
if(c->y == 0)
|
|
blocked = true;
|
|
else
|
|
c->y -= 1;
|
|
direction = "north";
|
|
}
|
|
else if(dir.compare("south") == 0 || dir.compare("s") == 0)
|
|
{
|
|
if(c->y == 24)
|
|
blocked = true;
|
|
else
|
|
c->y += 1;
|
|
direction = "south";
|
|
}
|
|
else if(dir.compare("west") == 0 || dir.compare("w") == 0)
|
|
{
|
|
if(c->x == 0)
|
|
blocked = true;
|
|
else
|
|
c->x -= 1;
|
|
direction = "west";
|
|
}
|
|
else if(dir.compare("east") == 0 || dir.compare("e") == 0)
|
|
{
|
|
if(c->x == 24)
|
|
blocked = true;
|
|
else
|
|
c->x += 1;
|
|
direction = "east";
|
|
}
|
|
else
|
|
return QString("%1 is not a valid direction, use : north, south, west, east").arg(dir);
|
|
|
|
if(blocked)
|
|
return QString("%1 cannot go %2, a hill is blocking his way").arg(c->pseudo).arg(direction);
|
|
|
|
char newTerrainType = WORLDMAP[c->x][c->y];
|
|
if(terrainType == newTerrainType)
|
|
return QString("%1 is traveling %2 and is still in %3").arg(c->pseudo).arg(direction).arg(currentArea);
|
|
else
|
|
return QString("%1 is traveling %2, leaving %3 and entering %4")
|
|
.arg(c->pseudo).arg(direction).arg(currentArea).arg(getTerrainName(WORLDMAP[c->x][c->y]));
|
|
}
|
|
|
|
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") && !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
|
|
{
|
|
answer = privateSay(QString("successfully created the character \"%1\"").arg(paramList[2]), msg.nick);
|
|
charList.add(new RPGCharacter(paramList[2], paramList[3]));
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
else if(msg.args.startsWith("!rpg join") && !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)
|
|
{
|
|
if(charOnline.count(src) > 0)
|
|
{
|
|
answer = say(QString("%1 (%2) left the RPG").arg(charOnline[src]->pseudo).arg(src->getNick()));
|
|
playerLeave(src);
|
|
return true;
|
|
}
|
|
}
|
|
else if(msg.args.compare("!rpg list") == 0)
|
|
{
|
|
answer = QString("");
|
|
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 stats") == 0)
|
|
{
|
|
if(charOnline.count(src) > 0)
|
|
{
|
|
RPGCharacter *c = charOnline[src];
|
|
answer = say(QString("%1 is level %2 (%3 xp)").arg(c->pseudo).arg(c->level).arg(c->xp));
|
|
return true;
|
|
}
|
|
}
|
|
else if(msg.args.compare("!rpg debug") == 0 && src->isOp())
|
|
{
|
|
QString str;
|
|
for(const std::string &name : charList.names)
|
|
str.append(name.c_str()).append(" ");
|
|
if(!str.isEmpty())
|
|
{
|
|
answer = say(str);
|
|
return true;
|
|
}
|
|
}
|
|
else if(msg.args.compare("!rpg reset") == 0 && src->isOp())
|
|
{
|
|
charList.data.clear();
|
|
charList.names.clear();
|
|
answer = say("cleared character database");
|
|
return true;
|
|
}
|
|
else if(msg.args.compare("!rpg save") == 0)
|
|
{
|
|
saveCharacters();
|
|
answer = say("saved RPG characters");
|
|
return true;
|
|
}
|
|
else if(msg.args.startsWith("go "))
|
|
{
|
|
QStringList paramList = msg.args.split(' ');
|
|
if(charOnline.count(src) > 0 && paramList.size() == 2)
|
|
{
|
|
answer = say(playerTravel(charOnline[src], paramList[1]));
|
|
return true;
|
|
}
|
|
}
|
|
else if(msg.args.startsWith("travel "))
|
|
{
|
|
QStringList paramList = msg.args.split(' ');
|
|
if(charOnline.count(src) > 0 && paramList.size() == 2)
|
|
{
|
|
answer = say(playerTravel(charOnline[src], paramList[1], true));
|
|
return true;
|
|
}
|
|
}
|
|
else if(msg.args.startsWith("look "))
|
|
{
|
|
answer = say("you look around and you find a walnut.");
|
|
return true;
|
|
}
|
|
else if(msg.args.compare("break walnut") == 0)
|
|
{
|
|
answer = say("you use a rock to break the walnut, there is a walnut kernel inside.");
|
|
return true;
|
|
}
|
|
else if(msg.args.compare("eat walnut kernel") == 0)
|
|
{
|
|
answer = say("you eat the walnut kernel, and you feel repleted.");
|
|
return true;
|
|
}
|
|
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);
|
|
answer += privateSay("show your stats : !rpg stats", msg.nick);
|
|
answer += privateSay("show all in-game players : !rpg list", 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;
|
|
}
|