QTfrontend/game.cpp
changeset 6616 f77bb02b669f
parent 6217 ef53ba841791
child 6700 e04da46ee43c
equal deleted inserted replaced
6615:65602f1ef0f8 6616:f77bb02b669f
    33 #include <QTextStream>
    33 #include <QTextStream>
    34 
    34 
    35 QString training, campaign; // TODO: Cleaner solution?
    35 QString training, campaign; // TODO: Cleaner solution?
    36 
    36 
    37 HWGame::HWGame(GameUIConfig * config, GameCFGWidget * gamecfg, QString ammo, TeamSelWidget* pTeamSelWidget) :
    37 HWGame::HWGame(GameUIConfig * config, GameCFGWidget * gamecfg, QString ammo, TeamSelWidget* pTeamSelWidget) :
    38   TCPBase(true),
    38     TCPBase(true),
    39   ammostr(ammo),
    39     ammostr(ammo),
    40   m_pTeamSelWidget(pTeamSelWidget)
    40     m_pTeamSelWidget(pTeamSelWidget)
    41 {
    41 {
    42     this->config = config;
    42     this->config = config;
    43     this->gamecfg = gamecfg;
    43     this->gamecfg = gamecfg;
    44     netSuspend = false;
    44     netSuspend = false;
    45 }
    45 }
    49     SetGameState(gsDestroyed);
    49     SetGameState(gsDestroyed);
    50 }
    50 }
    51 
    51 
    52 void HWGame::onClientDisconnect()
    52 void HWGame::onClientDisconnect()
    53 {
    53 {
    54     switch (gameType) {
    54     switch (gameType)
       
    55     {
    55         case gtSave:
    56         case gtSave:
    56             if (gameState == gsInterrupted || gameState == gsHalted)
    57             if (gameState == gsInterrupted || gameState == gsHalted)
    57                 emit HaveRecord(false, demo);
    58                 emit HaveRecord(false, demo);
    58             else if (gameState == gsFinished)
    59             else if (gameState == gsFinished)
    59                  emit HaveRecord(true, demo);
    60                 emit HaveRecord(true, demo);
    60             break;
    61             break;
    61         case gtDemo:
    62         case gtDemo:
    62             break;
    63             break;
    63         case gtNet:
    64         case gtNet:
    64             emit HaveRecord(true, demo);
    65             emit HaveRecord(true, demo);
    72 
    73 
    73 void HWGame::commonConfig()
    74 void HWGame::commonConfig()
    74 {
    75 {
    75     QByteArray buf;
    76     QByteArray buf;
    76     QString gt;
    77     QString gt;
    77     switch (gameType) {
    78     switch (gameType)
       
    79     {
    78         case gtDemo:
    80         case gtDemo:
    79             gt = "TD";
    81             gt = "TD";
    80             break;
    82             break;
    81         case gtNet:
    83         case gtNet:
    82             gt = "TN";
    84             gt = "TN";
    96             HWProto::addStringToBuffer(buf, QString("eammprob %1").arg(ammostr.mid(cAmmoNumber, cAmmoNumber)));
    98             HWProto::addStringToBuffer(buf, QString("eammprob %1").arg(ammostr.mid(cAmmoNumber, cAmmoNumber)));
    97             HWProto::addStringToBuffer(buf, QString("eammdelay %1").arg(ammostr.mid(2 * cAmmoNumber, cAmmoNumber)));
    99             HWProto::addStringToBuffer(buf, QString("eammdelay %1").arg(ammostr.mid(2 * cAmmoNumber, cAmmoNumber)));
    98             HWProto::addStringToBuffer(buf, QString("eammreinf %1").arg(ammostr.mid(3 * cAmmoNumber, cAmmoNumber)));
   100             HWProto::addStringToBuffer(buf, QString("eammreinf %1").arg(ammostr.mid(3 * cAmmoNumber, cAmmoNumber)));
    99             if(!gamecfg->schemeData(21).toBool()) HWProto::addStringToBuffer(buf, QString("eammstore"));
   101             if(!gamecfg->schemeData(21).toBool()) HWProto::addStringToBuffer(buf, QString("eammstore"));
   100             HWProto::addStringListToBuffer(buf,
   102             HWProto::addStringListToBuffer(buf,
   101                 team.teamGameConfig(gamecfg->getInitHealth()));
   103                                            team.teamGameConfig(gamecfg->getInitHealth()));
   102             ;
   104             ;
   103         }
   105         }
   104     }
   106     }
   105     RawSendIPC(buf);
   107     RawSendIPC(buf);
   106 }
   108 }
   114 {
   116 {
   115     QByteArray teamscfg;
   117     QByteArray teamscfg;
   116 
   118 
   117     HWProto::addStringToBuffer(teamscfg, "TL");
   119     HWProto::addStringToBuffer(teamscfg, "TL");
   118     HWProto::addStringToBuffer(teamscfg, QString("etheme %1")
   120     HWProto::addStringToBuffer(teamscfg, QString("etheme %1")
   119             .arg((themesModel->rowCount() > 0) ? themesModel->index(rand() % themesModel->rowCount()).data().toString() : "steel"));
   121                                .arg((themesModel->rowCount() > 0) ? themesModel->index(rand() % themesModel->rowCount()).data().toString() : "steel"));
   120     HWProto::addStringToBuffer(teamscfg, "eseed " + QUuid::createUuid().toString());
   122     HWProto::addStringToBuffer(teamscfg, "eseed " + QUuid::createUuid().toString());
   121 
   123 
   122     HWTeam team1;
   124     HWTeam team1;
   123     team1.setDifficulty(0);
   125     team1.setDifficulty(0);
   124     team1.setColor(QColor(colors[0]));
   126     team1.setColor(QColor(colors[0]));
   125     team1.setNumHedgehogs(4);
   127     team1.setNumHedgehogs(4);
   126     HWNamegen::teamRandomNames(team1,true);
   128     HWNamegen::teamRandomNames(team1,true);
   127     HWProto::addStringListToBuffer(teamscfg,
   129     HWProto::addStringListToBuffer(teamscfg,
   128             team1.teamGameConfig(100));
   130                                    team1.teamGameConfig(100));
   129 
   131 
   130     HWTeam team2;
   132     HWTeam team2;
   131     team2.setDifficulty(4);
   133     team2.setDifficulty(4);
   132     team2.setColor(QColor(colors[1]));
   134     team2.setColor(QColor(colors[1]));
   133     team2.setNumHedgehogs(4);
   135     team2.setNumHedgehogs(4);
   134     do
   136     do
   135         HWNamegen::teamRandomNames(team2,true);
   137         HWNamegen::teamRandomNames(team2,true);
   136     while(!team2.name().compare(team1.name()) || !team2.hedgehog(0).Hat.compare(team1.hedgehog(0).Hat));
   138     while(!team2.name().compare(team1.name()) || !team2.hedgehog(0).Hat.compare(team1.hedgehog(0).Hat));
   137     HWProto::addStringListToBuffer(teamscfg,
   139     HWProto::addStringListToBuffer(teamscfg,
   138             team2.teamGameConfig(100));
   140                                    team2.teamGameConfig(100));
   139 
   141 
   140     HWProto::addStringToBuffer(teamscfg, QString("eammloadt %1").arg(cDefaultAmmoStore->mid(0, cAmmoNumber)));
   142     HWProto::addStringToBuffer(teamscfg, QString("eammloadt %1").arg(cDefaultAmmoStore->mid(0, cAmmoNumber)));
   141     HWProto::addStringToBuffer(teamscfg, QString("eammprob %1").arg(cDefaultAmmoStore->mid(cAmmoNumber, cAmmoNumber)));
   143     HWProto::addStringToBuffer(teamscfg, QString("eammprob %1").arg(cDefaultAmmoStore->mid(cAmmoNumber, cAmmoNumber)));
   142     HWProto::addStringToBuffer(teamscfg, QString("eammdelay %1").arg(cDefaultAmmoStore->mid(2 * cAmmoNumber, cAmmoNumber)));
   144     HWProto::addStringToBuffer(teamscfg, QString("eammdelay %1").arg(cDefaultAmmoStore->mid(2 * cAmmoNumber, cAmmoNumber)));
   143     HWProto::addStringToBuffer(teamscfg, QString("eammreinf %1").arg(cDefaultAmmoStore->mid(3 * cAmmoNumber, cAmmoNumber)));
   145     HWProto::addStringToBuffer(teamscfg, QString("eammreinf %1").arg(cDefaultAmmoStore->mid(3 * cAmmoNumber, cAmmoNumber)));
   171     commonConfig();
   173     commonConfig();
   172 }
   174 }
   173 
   175 
   174 void HWGame::ParseMessage(const QByteArray & msg)
   176 void HWGame::ParseMessage(const QByteArray & msg)
   175 {
   177 {
   176     switch(msg.at(1)) {
   178     switch(msg.at(1))
   177         case '?': {
   179     {
       
   180         case '?':
       
   181         {
   178             SendIPC("!");
   182             SendIPC("!");
   179             break;
   183             break;
   180         }
   184         }
   181         case 'C': {
   185         case 'C':
   182             switch (gameType) {
   186         {
   183                 case gtLocal: {
   187             switch (gameType)
       
   188             {
       
   189                 case gtLocal:
       
   190                 {
   184                     SendConfig();
   191                     SendConfig();
   185                     break;
   192                     break;
   186                 }
   193                 }
   187                 case gtQLocal: {
   194                 case gtQLocal:
       
   195                 {
   188                     SendQuickConfig();
   196                     SendQuickConfig();
   189                     break;
   197                     break;
   190                 }
   198                 }
   191                 case gtSave:
   199                 case gtSave:
   192                 case gtDemo: break;
   200                 case gtDemo:
   193                 case gtNet: {
   201                     break;
       
   202                 case gtNet:
       
   203                 {
   194                     SendNetConfig();
   204                     SendNetConfig();
   195                     break;
   205                     break;
   196                 }
   206                 }
   197                 case gtTraining: {
   207                 case gtTraining:
       
   208                 {
   198                     SendTrainingConfig();
   209                     SendTrainingConfig();
   199                     break;
   210                     break;
   200                 }
   211                 }
   201                 case gtCampaign: {
   212                 case gtCampaign:
       
   213                 {
   202                     SendCampaignConfig();
   214                     SendCampaignConfig();
   203                     break;
   215                     break;
   204                 }
   216                 }
   205             }
   217             }
   206             break;
   218             break;
   207         }
   219         }
   208         case 'E': {
   220         case 'E':
       
   221         {
   209             int size = msg.size();
   222             int size = msg.size();
   210             emit ErrorMessage(QString("Last two engine messages:\n") + QString().append(msg.mid(2)).left(size - 4));
   223             emit ErrorMessage(QString("Last two engine messages:\n") + QString().append(msg.mid(2)).left(size - 4));
   211             return;
   224             return;
   212         }
   225         }
   213         case 'K': {
   226         case 'K':
       
   227         {
   214             ulong kb = msg.mid(2).toULong();
   228             ulong kb = msg.mid(2).toULong();
   215             if (kb==1) {
   229             if (kb==1)
   216               qWarning("%s", KBMessages[kb - 1].toLocal8Bit().constData());
   230             {
   217               return;
   231                 qWarning("%s", KBMessages[kb - 1].toLocal8Bit().constData());
       
   232                 return;
   218             }
   233             }
   219             if (kb && kb <= KBmsgsCount)
   234             if (kb && kb <= KBmsgsCount)
   220             {
   235             {
   221                 emit ErrorMessage(KBMessages[kb - 1]);
   236                 emit ErrorMessage(KBMessages[kb - 1]);
   222             }
   237             }
   223             return;
   238             return;
   224         }
   239         }
   225         case 'i': {
   240         case 'i':
       
   241         {
   226             emit GameStats(msg.at(2), QString::fromUtf8(msg.mid(3)));
   242             emit GameStats(msg.at(2), QString::fromUtf8(msg.mid(3)));
   227             break;
   243             break;
   228         }
   244         }
   229         case 'Q': {
   245         case 'Q':
       
   246         {
   230             SetGameState(gsInterrupted);
   247             SetGameState(gsInterrupted);
   231             break;
   248             break;
   232         }
   249         }
   233         case 'q': {
   250         case 'q':
       
   251         {
   234             SetGameState(gsFinished);
   252             SetGameState(gsFinished);
   235             break;
   253             break;
   236         }
   254         }
   237         case 'H': {
   255         case 'H':
       
   256         {
   238             SetGameState(gsHalted);
   257             SetGameState(gsHalted);
   239             break;
   258             break;
   240         }
   259         }
   241         case 's': {
   260         case 's':
       
   261         {
   242             int size = msg.size();
   262             int size = msg.size();
   243             QString msgbody = QString::fromUtf8(msg.mid(2).left(size - 4));
   263             QString msgbody = QString::fromUtf8(msg.mid(2).left(size - 4));
   244             emit SendChat(msgbody);
   264             emit SendChat(msgbody);
   245             // FIXME: /me command doesn't work here
   265             // FIXME: /me command doesn't work here
   246             QByteArray buf;
   266             QByteArray buf;
   247             HWProto::addStringToBuffer(buf, "s" + HWProto::formatChatMsg(config->netNick(), msgbody) + "\x20\x20");
   267             HWProto::addStringToBuffer(buf, "s" + HWProto::formatChatMsg(config->netNick(), msgbody) + "\x20\x20");
   248             demo.append(buf);
   268             demo.append(buf);
   249             break;
   269             break;
   250         }
   270         }
   251         case 'b': {
   271         case 'b':
       
   272         {
   252             int size = msg.size();
   273             int size = msg.size();
   253             QString msgbody = QString::fromUtf8(msg.mid(2).left(size - 4));
   274             QString msgbody = QString::fromUtf8(msg.mid(2).left(size - 4));
   254             emit SendTeamMessage(msgbody);
   275             emit SendTeamMessage(msgbody);
   255             break;
   276             break;
   256         }
   277         }
   257         default: {
   278         default:
       
   279         {
   258             if (gameType == gtNet && !netSuspend)
   280             if (gameType == gtNet && !netSuspend)
   259             {
   281             {
   260                 emit SendNet(msg);
   282                 emit SendNet(msg);
   261             }
   283             }
   262             if (msg.at(1) != 's')
   284             if (msg.at(1) != 's')