# HG changeset patch # User unc0rr # Date 1135678855 0 # Node ID 99888245a4e8b38feb98c549631d0c90fa680f18 # Parent 794e98e11b6606521223d025eed8ce4433b3e845 Now net game is near available, but exception occurs... diff -r 794e98e11b66 -r 99888245a4e8 QTfrontend/game.cpp --- a/QTfrontend/game.cpp Tue Dec 27 10:19:21 2005 +0000 +++ b/QTfrontend/game.cpp Tue Dec 27 10:20:55 2005 +0000 @@ -57,6 +57,8 @@ IPCSocket = 0; TeamCount = 0; seed = ""; + cfgdir.setPath(cfgdir.homePath()); + cfgdir.cd(".hedgewars"); } void HWGame::NewConnection() @@ -84,23 +86,7 @@ void HWGame::SendTeamConfig(int index) { - QFile teamcfg(teams[index]); - if (!teamcfg.open(QIODevice::ReadOnly)) - { - return ; - } - QTextStream stream(&teamcfg); - stream.setCodec("UTF-8"); - QString str; - - while (!stream.atEnd()) - { - str = stream.readLine(); - if (str.startsWith(";") || (str.length() > 254)) continue; - str.prepend("e"); - SendIPC(str.toLocal8Bit()); - } - teamcfg.close(); + LocalCFG(teams[index]); } void HWGame::SendConfig() @@ -108,14 +94,15 @@ if (gameType == gtDemo) { SENDIPC("TD"); - SendIPCRaw(toSendBuf->constData(), toSendBuf->size()); + RawSendIPC(*toSendBuf); delete toSendBuf; return ; } SENDIPC("TL"); - SENDIPC("e$gmflags 0"); +// SENDIPC("e$gmflags 0"); SENDIPC("eaddteam"); SendTeamConfig(0); +// if () SENDIPC("rdriven"); SENDIPC("ecolor 65535"); SENDIPC("eadd hh0 0"); SENDIPC("eadd hh1 0"); @@ -138,12 +125,21 @@ { case '?': { - SENDIPC("!"); + if (gameType == gtNet) + emit SendNet(QByteArray("\x01""?")); + else + SENDIPC("!"); break; } case 'C': { - SendConfig(); + if (gameType == gtNet) + { + SENDIPC("TN"); + emit SendNet(QByteArray("\x01""C")); + } + else + SendConfig(); break; } case '+': @@ -152,6 +148,10 @@ } default: { + if (gameType == gtNet) + { + emit SendNet(QByteArray::fromRawData(msgbuf, msgsize)); + } demo->append(msgsize); demo->append(QByteArray::fromRawData(msgbuf, msgsize)); } @@ -179,10 +179,16 @@ demo->append(buf); } -void HWGame::SendIPCRaw(const char * msg, quint32 len) +void HWGame::RawSendIPC(const QByteArray & buf) { - IPCSocket->write(msg, len); - demo->append(QByteArray::fromRawData(msg, len)); + IPCSocket->write(buf); + demo->append(buf); +} + +void HWGame::FromNet(const QByteArray & msg) +{ + // ?local config? + RawSendIPC(msg); } void HWGame::ClientRead() @@ -209,11 +215,8 @@ void HWGame::Start() { - gameType = gtLocal; - if (TeamCount < 2) return; QProcess * process; QStringList arguments; - seedgen.GenRNDStr(seed, 10); process = new QProcess; arguments << resolutions[0][vid_Resolution]; arguments << resolutions[1][vid_Resolution]; @@ -222,9 +225,6 @@ arguments << seed; arguments << (vid_Fullscreen ? "1" : "0"); process->start("hw", arguments); - demo = new QByteArray; - demo->append(seed.toLocal8Bit()); - demo->append(10); } void HWGame::AddTeam(const QString & teamname) @@ -336,3 +336,45 @@ process->start("hw", arguments); demo = new QByteArray; } + +void HWGame::StartNet(const QString & netseed) +{ + gameType = gtNet; + seed = netseed; + Start(); + demo = new QByteArray; + demo->append(seed.toLocal8Bit()); + demo->append(10); +} + +void HWGame::StartLocal() +{ + gameType = gtLocal; + if (TeamCount < 2) return; + seedgen.GenRNDStr(seed, 10); + Start(); + demo = new QByteArray; + demo->append(seed.toLocal8Bit()); + demo->append(10); +} + +void HWGame::LocalCFG(const QString & teamname) +{ + QFile teamcfg(cfgdir.absolutePath() + "/" + teamname + ".cfg"); + if (!teamcfg.open(QIODevice::ReadOnly)) + { + return ; + } + QTextStream stream(&teamcfg); + stream.setCodec("UTF-8"); + QString str; + + while (!stream.atEnd()) + { + str = stream.readLine(); + if (str.startsWith(";") || (str.length() > 254)) continue; + str.prepend("e"); + SendIPC(str.toLocal8Bit()); + } + teamcfg.close(); +} diff -r 794e98e11b66 -r 99888245a4e8 QTfrontend/game.h --- a/QTfrontend/game.h Tue Dec 27 10:19:21 2005 +0000 +++ b/QTfrontend/game.h Tue Dec 27 10:20:55 2005 +0000 @@ -39,6 +39,7 @@ #include #include #include +#include #include "team.h" #include "rndstr.h" @@ -51,9 +52,17 @@ Q_OBJECT public: HWGame(int Resolution, bool Fullscreen); - void Start(); void AddTeam(const QString & team); void PlayDemo(const QString & demofilename); + void StartLocal(); + void StartNet(const QString & netseed); + +signals: + void SendNet(const QByteArray & msg); + +public slots: + void FromNet(const QByteArray & msg); + void LocalCFG(const QString & teamname); private: enum GameType { @@ -75,13 +84,15 @@ int vid_Resolution; bool vid_Fullscreen; GameType gameType; + QDir cfgdir; + void Start(); void SendConfig(); void SendTeamConfig(int index); void ParseMessage(); void SendIPC(const char * msg, quint8 len); void SendIPC(const QByteArray & buf); - void SendIPCRaw(const char * msg, quint32 len); + void RawSendIPC(const QByteArray & buf); void SaveDemo(const QString & filename); QString GetThemeBySeed(); diff -r 794e98e11b66 -r 99888245a4e8 QTfrontend/gamecmds.cpp --- a/QTfrontend/gamecmds.cpp Tue Dec 27 10:19:21 2005 +0000 +++ b/QTfrontend/gamecmds.cpp Tue Dec 27 10:20:55 2005 +0000 @@ -37,4 +37,4 @@ : QWidget(parent) { -} \ No newline at end of file +} diff -r 794e98e11b66 -r 99888245a4e8 QTfrontend/hwform.cpp --- a/QTfrontend/hwform.cpp Tue Dec 27 10:19:21 2005 +0000 +++ b/QTfrontend/hwform.cpp Tue Dec 27 10:20:55 2005 +0000 @@ -134,13 +134,15 @@ if (str.startsWith(";")) continue; if (str.startsWith("resolution ")) { - str.remove(0, 11); - ui.CBResolution->setCurrentIndex(str.toLong()); + ui.CBResolution->setCurrentIndex(str.mid(11).toLong()); } else if (str.startsWith("fullscreen ")) { - str.remove(0, 11); - ui.CBFullscreen->setChecked(str.toLong()); + ui.CBFullscreen->setChecked(str.mid(11).toLong()); + } else + if (str.startsWith("nick ")) + { + ui.editNetNick->setText(str.mid(5)); } } settings.close(); @@ -156,6 +158,7 @@ connect(ui.BtnMultiplayer, SIGNAL(clicked()), this, SLOT(GoToMultiplayer())); connect(ui.BtnDemos, SIGNAL(clicked()), this, SLOT(GoToDemos())); connect(ui.BtnNet, SIGNAL(clicked()), this, SLOT(GoToNet())); + connect(ui.BtnNetCFGBack, SIGNAL(clicked()), this, SLOT(GoToNetChat())); connect(ui.BtnNewTeam, SIGNAL(clicked()), this, SLOT(NewTeam())); connect(ui.BtnEditTeam, SIGNAL(clicked()), this, SLOT(EditTeam())); connect(ui.BtnTeamSave, SIGNAL(clicked()), this, SLOT(TeamSave())); @@ -165,6 +168,10 @@ connect(ui.BtnPlayDemo, SIGNAL(clicked()), this, SLOT(PlayDemo())); connect(ui.BtnNetConnect, SIGNAL(clicked()), this, SLOT(NetConnect())); connect(ui.BtnNetChatDisconnect, SIGNAL(clicked()), this, SLOT(NetDisconnect())); + connect(ui.BtnNetChatJoin, SIGNAL(clicked()), this, SLOT(NetJoin())); + connect(ui.BtnNetChatCreate, SIGNAL(clicked()), this, SLOT(NetCreate())); + connect(ui.BtnNetCFGAddTeam, SIGNAL(clicked()), this, SLOT(NetAddTeam())); + connect(ui.BtnNetCFGGo, SIGNAL(clicked()), this, SLOT(NetStartGame())); connect(ui.CBGrave, SIGNAL(activated(const QString &)), this, SLOT(CBGrave_activated(const QString &))); connect(ui.CBFort, SIGNAL(activated(const QString &)), this, SLOT(CBFort_activated(const QString &))); ui.Pages->setCurrentIndex(ID_PAGE_MAIN); @@ -244,9 +251,9 @@ void HWForm::SimpleGame() { game = new HWGame(ui.CBResolution->currentIndex(), ui.CBFullscreen->isChecked()); - game->AddTeam(cfgdir.absolutePath() + "/team.cfg"); - game->AddTeam(cfgdir.absolutePath() + "/team.cfg"); - game->Start(); + game->AddTeam("team.cfg"); + game->AddTeam("team.cfg"); + game->StartLocal(); } void HWForm::CBGrave_activated(const QString & gravename) @@ -277,6 +284,7 @@ stream << "; Generated by Hedgewars, do not modify" << endl; stream << "resolution " << ui.CBResolution->currentIndex() << endl; stream << "fullscreen " << ui.CBFullscreen->isChecked() << endl; + stream << "nick " << ui.editNetNick->text() << endl; settings.close(); } @@ -297,10 +305,11 @@ void HWForm::NetConnect() { - hwnet = new HWNet(); - hwnet->Connect("localhost", 6667); + hwnet = new HWNet(ui.CBResolution->currentIndex(), ui.CBFullscreen->isChecked()); + hwnet->Connect("172.19.5.168", 6667, ui.editNetNick->text()); connect(hwnet, SIGNAL(Connected()), this, SLOT(GoToNetChat())); connect(hwnet, SIGNAL(AddGame(const QString &)), this, SLOT(AddGame(const QString &))); + connect(hwnet, SIGNAL(EnteredGame()), this, SLOT(NetGameEnter())); } void HWForm::NetDisconnect() @@ -313,3 +322,31 @@ { ui.ChannelsList->addItem(chan); } + +void HWForm::NetGameEnter() +{ + ui.Pages->setCurrentIndex(ID_PAGE_NETCFG); +} + +void HWForm::NetJoin() +{ + hwnet->JoinGame("#hw"); +} + +void HWForm::NetCreate() +{ + hwnet->JoinGame("#hw"); +} + +void HWForm::NetAddTeam() +{ + HWTeam team("team"); + team.SetCfgDir(cfgdir.absolutePath()); + team.LoadFromFile(); + hwnet->AddTeam(team); +} + +void HWForm::NetStartGame() +{ + hwnet->StartGame(); +} diff -r 794e98e11b66 -r 99888245a4e8 QTfrontend/hwform.h --- a/QTfrontend/hwform.h Tue Dec 27 10:19:21 2005 +0000 +++ b/QTfrontend/hwform.h Tue Dec 27 10:20:55 2005 +0000 @@ -71,7 +71,12 @@ void PlayDemo(); void NetConnect(); void NetDisconnect(); + void NetJoin(); + void NetCreate(); void AddGame(const QString & chan); + void NetAddTeam(); + void NetGameEnter(); + void NetStartGame(); public slots: void CBGrave_activated(const QString & gravename); @@ -92,6 +97,7 @@ #define ID_PAGE_DEMOS 4 #define ID_PAGE_NET 5 #define ID_PAGE_NETCHAT 6 -#define ID_PAGE_MAIN 7 +#define ID_PAGE_NETCFG 7 +#define ID_PAGE_MAIN 8 #endif diff -r 794e98e11b66 -r 99888245a4e8 QTfrontend/hwform.ui --- a/QTfrontend/hwform.ui Tue Dec 27 10:19:21 2005 +0000 +++ b/QTfrontend/hwform.ui Tue Dec 27 10:20:55 2005 +0000 @@ -50,7 +50,7 @@ - 6 + 2 @@ -379,8 +379,8 @@ 0 0 - 181 - 270 + 99 + 29 @@ -596,6 +596,35 @@ false + + + + 10 + 233 + 47 + 13 + + + + Net nick + + + + + + 60 + 230 + 113 + 20 + + + + unnamed + + + 30 + + @@ -777,6 +806,46 @@ + + + + 460 + 390 + 161 + 41 + + + + + MS Shell Dlg + 14 + 50 + false + false + false + false + + + + Disconnect + + + false + + + false + + + + + + 20 + 10 + 201 + 331 + + + @@ -837,10 +906,12 @@ false - + + + - 460 + 260 390 161 41 @@ -858,7 +929,7 @@ - Disconnect + Back false @@ -867,15 +938,65 @@ false - + - 20 - 10 - 201 - 331 + 260 + 290 + 161 + 41 + + + MS Shell Dlg + 14 + 50 + false + false + false + false + + + + Add Team + + + false + + + false + + + + + + 260 + 340 + 161 + 41 + + + + + MS Shell Dlg + 14 + 50 + false + false + false + false + + + + Go! + + + false + + + false + diff -r 794e98e11b66 -r 99888245a4e8 QTfrontend/netclient.cpp --- a/QTfrontend/netclient.cpp Tue Dec 27 10:19:21 2005 +0000 +++ b/QTfrontend/netclient.cpp Tue Dec 27 10:20:55 2005 +0000 @@ -33,16 +33,25 @@ #include #include "netclient.h" +#include "game.h" -HWNet::HWNet() +#include + +#define chkp qDebug() << "hw chkp in " << __FILE__ << ":" << __LINE__ + +HWNet::HWNet(int Resolution, bool Fullscreen) : QObject() { + gameResolution = Resolution; + gameFullscreen = Fullscreen; state = nsDisconnected; - IRCmsg_cmd_param = new QRegExp("^[A-Z]+ :.+$"); + IRCmsg_cmd_text = new QRegExp("^[A-Z]+ :.+$"); IRCmsg_number_param = new QRegExp("^:\\S+ [0-9]{3} .+$"); - IRCmsg_who_cmd_param = new QRegExp("^:\\S+ [A-Z]+ \\S+"); - IRCmsg_who_cmd_param_text = new QRegExp("^:\\S+ [A-Z]+ \\S+ :.+$"); + IRCmsg_who_cmd_target = new QRegExp("^:\\S+ [A-Z]+ \\S+$"); // last \\S should mean 'the 1st char is not ":"' + IRCmsg_who_cmd_text = new QRegExp("^:\\S+ [A-Z]+ :.+$"); + IRCmsg_who_cmd_target_text = new QRegExp("^:\\S+ [A-Z]+ \\S+ :.+$"); isOp = false; + teamsCount = 0; connect(&NetSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); connect(&NetSocket, SIGNAL(connected()), this, SLOT(OnConnect())); @@ -92,8 +101,8 @@ void HWNet::OnConnect() { state = nsConnected; - SendNet(QString("USER hwgame 1 2 Hedgewars game")); - SendNet(QString("NICK %1").arg(mynick)); + RawSendNet(QString("USER hwgame 1 2 Hedgewars game")); + RawSendNet(QString("NICK %1").arg(mynick)); } void HWNet::OnDisconnect() @@ -103,8 +112,13 @@ void HWNet::Perform() { -// SendNet(QString("LIST")); - SendNet(QString("JOIN #alex")); + +} + +void HWNet::JoinGame(const QString & game) +{ + state = nsJoining; + RawSendNet(QString("JOIN %1").arg(game)); } void HWNet::Disconnect() @@ -124,50 +138,69 @@ default: { state = nsQuitting; - SendNet(QString("QUIT :oops")); + RawSendNet(QString("QUIT :oops")); } } } -void HWNet::SendNet(const QString & str) +void HWNet::RawSendNet(const QString & str) { - SendNet(str.toLatin1()); + RawSendNet(str.toLatin1()); } -void HWNet::SendNet(const QByteArray & buf) +void HWNet::RawSendNet(const QByteArray & buf) { if (buf.size() > 510) return; NetSocket.write(buf); NetSocket.write("\x0d\x0a", 2); } +void HWNet::SendNet(const QByteArray & buf) +{ + if ((state == nsGaming) || (state == nsStarting)) + { + QString msg = QString(buf.toBase64()); + if (msg == "AUM=") + { + ConfigAsked(); + } else + { + RawSendNet(QString("PRIVMSG %1 :"MAGIC_CHAR MAGIC_CHAR"%2").arg(channel, msg)); + } + } +} + void HWNet::ParseLine(const QString & msg) { //QMessageBox::information(0, "", msg); - if (IRCmsg_cmd_param->exactMatch(msg)) + if (IRCmsg_cmd_text->exactMatch(msg)) { - msgcmd_paramHandler(msg); + msgcmd_textHandler(msg); } else if (IRCmsg_number_param->exactMatch(msg)) { msgnumber_paramHandler(msg); } else - if (IRCmsg_who_cmd_param->exactMatch(msg)) + if (IRCmsg_who_cmd_text->exactMatch(msg)) { - msgwho_cmd_paramHandler(msg); + msgwho_cmd_textHandler(msg); } else - if (IRCmsg_who_cmd_param_text->exactMatch(msg)) + if (IRCmsg_who_cmd_target->exactMatch(msg)) { - msgwho_cmd_param_textHandler(msg); + msgwho_cmd_targetHandler(msg); + } else + if (IRCmsg_who_cmd_target_text->exactMatch(msg)) + { + msgwho_cmd_target_textHandler(msg); } } -void HWNet::msgcmd_paramHandler(const QString & msg) +void HWNet::msgcmd_textHandler(const QString & msg) { QStringList list = msg.split(" :"); if (list[0] == "PING") { - SendNet(QString("PONG %1").arg(list[1])); + RawSendNet(QString("PONG %1").arg(list[1])); } } @@ -209,7 +242,6 @@ { opnick = ""; } - SendNet(QString("PRIVMSG #alex :%1 ops here").arg(opCount)); opCount = 0; break; } @@ -221,7 +253,7 @@ } } -void HWNet::msgwho_cmd_paramHandler(const QString & msg) +void HWNet::msgwho_cmd_targetHandler(const QString & msg) { QStringList list = msg.split(" "); QString who = list[0].mid(1).split("!")[0]; @@ -234,7 +266,24 @@ } } -void HWNet::msgwho_cmd_param_textHandler(const QString & msg) +void HWNet::msgwho_cmd_textHandler(const QString & msg) +{ + int pos = msg.indexOf(" :"); + QString text = msg.mid(pos + 2); + QStringList list = msg.mid(0, pos).split(" "); + QString who = list[0].mid(1).split("!")[0]; + if (list[1] == "JOIN") + { + if (who == mynick) + { + channel = text; + state = nsJoined; + emit EnteredGame(); + RawSendNet(QString("PRIVMSG %1 :Hello!").arg(channel)); + } + } +} +void HWNet::msgwho_cmd_target_textHandler(const QString & msg) { int pos = msg.indexOf(" :"); QString text = msg.mid(pos + 2); @@ -242,6 +291,162 @@ QString who = list[0].mid(1).split("!")[0]; if (list[1] == "PRIVMSG") { - SendNet(QString("PRIVMSG #alex :%1 said \"%2\" to %3").arg(who, text, list[2])); + if (list[2] == opnick) + { + hwp_opmsg(who, text); + } else + if (list[2] == channel) + { + hwp_chanmsg(who, text); + } + } +} + +void HWNet::hwp_opmsg(const QString & who, const QString & msg) +{ + if (state != nsJoined) + return ; + if (!msg.startsWith(MAGIC_CHAR)) + return ; + QStringList list = msg.split(MAGIC_CHAR, QString::SkipEmptyParts); + if (list[0] == "A") + { + list.removeFirst(); + if (list.size() != 9) + return ; + if (teamsCount < 5) + { + teams[teamsCount].nick = who; + teams[teamsCount].hhs = list; + teamsCount++; + QString teamnames; + for(int i = 0; i < teamsCount; i++) + { + teamnames += MAGIC_CHAR; + teamnames += teams[i].hhs[0]; + } + RawSendNet(QString("PRIVMSG %1 :"MAGIC_CHAR"Teams%2").arg(channel, teamnames)); + } + } +} + +void HWNet::ConfigAsked() +{ + configasks++; + if (configasks == playerscnt) + { + quint32 color = 65535; + for (int i = 0; i < teamsCount; i++) + { +chkp; SENDCFGSTRNET("eaddteam"); + QString msg; + msg = MAGIC_CHAR "T" MAGIC_CHAR + teams[i].nick + MAGIC_CHAR + teams[i].hhs.join(MAGIC_CHAR); + RawSendNet(QString("PRIVMSG %1 :%2").arg(channel, msg)); + hwp_chanmsg(mynick, msg); + SENDCFGSTRNET(QString("ecolor %1").arg(color)); + SENDCFGSTRNET("eadd hh0 0"); + SENDCFGSTRNET("eadd hh1 0"); + SENDCFGSTRNET("eadd hh2 0"); + color <<= 8; + } +chkp; SENDCFGSTRNET("!"); } } + +void HWNet::hwp_chanmsg(const QString & who, const QString & msg) +{ + if ((state < nsJoined) || (state > nsGaming)) + { + return ; + } + if ((state == nsJoined) && (msg.startsWith(MAGIC_CHAR"Start!"MAGIC_CHAR)) && (who == opnick)) + { + state = nsStarting; + RunGame(msg.mid(7)); + return ; + } + if ((state == nsStarting) && (msg == MAGIC_CHAR MAGIC_CHAR "AUM=")) + { + if (mynick == opnick) ConfigAsked(); + return ; + } + if ((state == nsStarting) && (msg.startsWith(MAGIC_CHAR"T"MAGIC_CHAR))) + { + NetTeamAdded(msg.mid(3)); + } + if (state != nsGaming) + { + return; + } + if (msg.startsWith(MAGIC_CHAR MAGIC_CHAR)) // HWP message + { + emit FromNet(QByteArray::fromBase64(msg.mid(2).toLocal8Bit())); + } else // smth other + { + + } +} + +void HWNet::NetTeamAdded(const QString & msg) +{ + QStringList list = msg.split(MAGIC_CHAR, QString::SkipEmptyParts); + if (list.size() != 10) + return ; + if (list[0] == mynick) + { +chkp; emit LocalCFG(list[1]); + } else + { +chkp; SENDCFGSTRLOC("erdriven"); + SENDCFGSTRLOC(QString("ename team %1").arg(list[2])); + for (int i = 0; i < 8; i++) + { + SENDCFGSTRLOC(QString("ename hh%1").arg(i) + list[i + 3]); + } +chkp; } +} + +void HWNet::AddTeam(const HWTeam & team) +{ + if (state != nsJoined) + { + return ; + } + RawSendNet(QString("PRIVMSG %1 :").arg(opnick) + MAGIC_CHAR "A" MAGIC_CHAR + + team.TeamName + MAGIC_CHAR + team.HHName[0] + MAGIC_CHAR + team.HHName[1] + MAGIC_CHAR + + team.HHName[2] + MAGIC_CHAR + team.HHName[3] + MAGIC_CHAR + team.HHName[4] + MAGIC_CHAR + + team.HHName[5] + MAGIC_CHAR + team.HHName[6] + MAGIC_CHAR + team.HHName[7]); +} + +void HWNet::StartGame() +{ + if ((opnick != mynick) || (state != nsJoined)) + { + return ; + } + QStringList players; + for (int i = 0; i < teamsCount; i++) + { + if (!players.contains(teams[i].nick)) + { + players.append(teams[i].nick); + } + } + playerscnt = players.size(); + configasks = 0; + + QString seed; + seedgen.GenRNDStr(seed, 10); + QString msg = QString(MAGIC_CHAR"Start!"MAGIC_CHAR"%1").arg(seed); + RawSendNet(QString("PRIVMSG %1 :%2").arg(channel, msg)); + hwp_chanmsg(mynick, msg); +} + +void HWNet::RunGame(const QString & seed) +{ + HWGame * game = new HWGame(gameResolution, gameFullscreen); + connect(game, SIGNAL(SendNet(const QByteArray &)), this, SLOT(SendNet(const QByteArray &))); + connect(this, SIGNAL(FromNet(const QByteArray &)), game, SLOT(FromNet(const QByteArray &))); + connect(this, SIGNAL(LocalCFG(const QString &)), game, SLOT(LocalCFG(const QString &))); + game->StartNet(seed); +} diff -r 794e98e11b66 -r 99888245a4e8 QTfrontend/netclient.h --- a/QTfrontend/netclient.h Tue Dec 27 10:19:21 2005 +0000 +++ b/QTfrontend/netclient.h Tue Dec 27 10:20:55 2005 +0000 @@ -37,46 +37,89 @@ #include #include #include +#include +#include "team.h" +#include "rndstr.h" + +#define MAGIC_CHAR "\x02" + +struct netTeam +{ + QString nick; + QStringList hhs; +}; class HWNet : public QObject { Q_OBJECT public: - HWNet(); + HWNet(int Resolution, bool Fullscreen); void Connect(const QString & hostName, quint16 port, const QString & nick); void Disconnect(); - void SendNet(const QString & buf); - void SendNet(const QByteArray & buf); + void JoinGame(const QString & game); + void AddTeam(const HWTeam & team); + void StartGame(); signals: void Connected(); void AddGame(const QString & chan); + void EnteredGame(); + void FromNet(const QByteArray & buf); + void LocalCFG(const QString & team); + +public slots: + void SendNet(const QByteArray & buf); private: enum NetState { - nsDisconnected = 0, - nsConnecting = 1, - nsConnected = 3, - nsQuitting = 5 + nsDisconnected = 0, + nsConnecting = 1, + nsConnected = 3, + nsJoining = 4, + nsJoined = 5, + nsStarting = 6, + nsGaming = 7, + nsQuitting = 8 }; QTcpSocket NetSocket; NetState state; - QRegExp * IRCmsg_cmd_param; + QRegExp * IRCmsg_cmd_text; QRegExp * IRCmsg_number_param; - QRegExp * IRCmsg_who_cmd_param; - QRegExp * IRCmsg_who_cmd_param_text; + QRegExp * IRCmsg_who_cmd_target; + QRegExp * IRCmsg_who_cmd_target_text; + QRegExp * IRCmsg_who_cmd_text; QString mynick; QString opnick; + QString channel; bool isOp; quint32 opCount; + netTeam teams[5]; + quint8 teamsCount; + int gameResolution; + bool gameFullscreen; + RNDStr seedgen; + int playerscnt; + int configasks; + + void RawSendNet(const QString & buf); + void RawSendNet(const QByteArray & buf); void ParseLine(const QString & msg); - void msgcmd_paramHandler(const QString & msg); + void msgcmd_textHandler(const QString & msg); void msgnumber_paramHandler(const QString & msg); - void msgwho_cmd_paramHandler(const QString & msg); - void msgwho_cmd_param_textHandler(const QString & msg); + void msgwho_cmd_targetHandler(const QString & msg); + void msgwho_cmd_textHandler(const QString & msg); + void msgwho_cmd_target_textHandler(const QString & msg); + + void hwp_opmsg(const QString & who, const QString & msg); + void hwp_chanmsg(const QString & who, const QString & msg); + void ConfigAsked(); + void NetTeamAdded(const QString & msg); + + void RunGame(const QString & seed); + private slots: void ClientRead(); @@ -86,4 +129,21 @@ void displayError(QAbstractSocket::SocketError socketError); }; +#define SENDCFGSTRNET(a) {\ + QByteArray strmsg; \ + strmsg.append(a); \ + quint8 sz = strmsg.size(); \ + QByteArray enginemsg = QByteArray((char *)&sz, 1) + strmsg; \ + emit FromNet(enginemsg); \ + RawSendNet(QString("PRIVMSG %1 :"MAGIC_CHAR MAGIC_CHAR"%2").arg(channel, QString(enginemsg.toBase64()))); \ + } + +#define SENDCFGSTRLOC(a) {\ + QByteArray strmsg; \ + strmsg.append(a); \ + quint8 sz = strmsg.size(); \ + QByteArray enginemsg = QByteArray((char *)&sz, 1) + strmsg; \ + emit FromNet(enginemsg); \ + } + #endif