# HG changeset patch # User Wuzzy # Date 1545139463 -3600 # Node ID 4c743ef80b1b01844268a1ee10582949fe581fe4 # Parent 9844450389a450fb9c689e2aa6546fd2934525c4 Add team selection in training page and basic check mark support diff -r 9844450389a4 -r 4c743ef80b1b QTfrontend/CMakeLists.txt --- a/QTfrontend/CMakeLists.txt Sun Dec 16 18:40:25 2018 +0100 +++ b/QTfrontend/CMakeLists.txt Tue Dec 18 14:24:23 2018 +0100 @@ -115,6 +115,7 @@ main.cpp team.cpp campaign.cpp + mission.cpp ui_hwform.cpp ${CMAKE_CURRENT_BINARY_DIR}/hwconsts.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sdlkeys.cpp @@ -160,7 +161,9 @@ hwconsts.h sdlkeys.h campaign.h + mission.h ${CMAKE_CURRENT_BINARY_DIR}/servermessages.h + ${CMAKE_CURRENT_BINARY_DIR}/creditsmessages.h ) set(hwfr_rez hedgewars.qrc) diff -r 9844450389a4 -r 4c743ef80b1b QTfrontend/campaign.cpp --- a/QTfrontend/campaign.cpp Sun Dec 16 18:40:25 2018 +0100 +++ b/QTfrontend/campaign.cpp Tue Dec 18 14:24:23 2018 +0100 @@ -52,7 +52,7 @@ missionInList: QComboBox index of the mission as selected in the mission widget teamName: Name of the playing team */ -bool isMissionWon(QString & campaignName, int missionInList, QString & teamName) +bool isCampMissionWon(QString & campaignName, int missionInList, QString & teamName) { QSettings* teamfile = getCampTeamFile(campaignName, teamName); int progress = teamfile->value("Campaign " + campaignName + "/Progress", 0).toInt(); diff -r 9844450389a4 -r 4c743ef80b1b QTfrontend/campaign.h --- a/QTfrontend/campaign.h Sun Dec 16 18:40:25 2018 +0100 +++ b/QTfrontend/campaign.h Tue Dec 18 14:24:23 2018 +0100 @@ -36,7 +36,7 @@ QSettings* getCampTeamFile(QString & campaignName, QString & teamName); QSettings* getCampMetaInfo(); bool isCampWon(QString & campaignName, QString & teamName); -bool isMissionWon(QString & campaignName, int missionInList, QString & teamName); +bool isCampMissionWon(QString & campaignName, int missionInList, QString & teamName); QString getRealCampName(const QString & campaignName); QList getCampMissionList(QString & campaignName, QString & teamName); diff -r 9844450389a4 -r 4c743ef80b1b QTfrontend/game.cpp --- a/QTfrontend/game.cpp Sun Dec 16 18:40:25 2018 +0100 +++ b/QTfrontend/game.cpp Tue Dec 18 14:24:23 2018 +0100 @@ -44,12 +44,11 @@ // last game info QList lastGameStartArgs = QList(); GameType lastGameType = gtNone; -QString lastTrainingSubFolder = NULL; GameCFGWidget * lastGameCfg = NULL; QString lastGameAmmo = NULL; TeamSelWidget * lastGameTeamSel = NULL; -QString training, campaign, campaignScript, campaignTeam; // TODO: Cleaner solution? +QString training, trainingTeam, campaign, campaignScript, campaignTeam; // TODO: Cleaner solution? HWGame::HWGame(GameUIConfig * config, GameCFGWidget * gamecfg, QString ammo, TeamSelWidget* pTeamSelWidget) : TCPBase(true, 0), @@ -307,6 +306,14 @@ writeCampaignVar(msg.right(msg.size() - 3)); break; } + case 'v': + { + if (msg.at(2) == '?') + sendMissionVar(msg.right(msg.size() - 3)); + else if (msg.at(2) == '!') + writeMissionVar(msg.right(msg.size() - 3)); + break; + } case 'W': { // fetch new window resolution via IPC and save it in the settings @@ -500,16 +507,18 @@ SetGameState(gsStarted); } -void HWGame::StartTraining(const QString & file, const QString & subFolder) +void HWGame::StartTraining(const QString & file, const QString & subFolder, const QString & trainTeam) { lastGameStartArgs.clear(); lastGameStartArgs.append(file); + lastGameStartArgs.append(subFolder); + lastGameStartArgs.append(trainTeam); lastGameType = gtTraining; - lastTrainingSubFolder = subFolder; gameType = gtTraining; training = "Missions/" + subFolder + "/" + file + ".lua"; + trainingTeam = trainTeam; demo.clear(); Start(false); SetGameState(gsStarted); @@ -574,3 +583,28 @@ teamfile.setValue("Campaign " + campaign + "/" + varToWrite, varValue); } +void HWGame::sendMissionVar(const QByteArray &varToSend) +{ + QString varToFind = QString::fromUtf8(varToSend); + QSettings teamfile(QString(cfgdir->absolutePath() + "/Teams/%1.hwt").arg(trainingTeam), QSettings::IniFormat, 0); + teamfile.setIniCodec("UTF-8"); + QString varValue = teamfile.value("Mission " + training + "/" + varToFind, "").toString(); + QByteArray command; + HWProto::addStringToBuffer(command, "v." + varValue); + RawSendIPC(command); +} + +void HWGame::writeMissionVar(const QByteArray & varVal) +{ + int i = varVal.indexOf(" "); + if(i < 0) + return; + + QString varToWrite = QString::fromUtf8(varVal.left(i)); + QString varValue = QString::fromUtf8(varVal.mid(i + 1)); + + QSettings teamfile(QString(cfgdir->absolutePath() + "/Teams/%1.hwt").arg(trainingTeam), QSettings::IniFormat, 0); + teamfile.setIniCodec("UTF-8"); + teamfile.setValue("Mission " + training + "/" + varToWrite, varValue); +} + diff -r 9844450389a4 -r 4c743ef80b1b QTfrontend/game.h --- a/QTfrontend/game.h Sun Dec 16 18:40:25 2018 +0100 +++ b/QTfrontend/game.h Tue Dec 18 14:24:23 2018 +0100 @@ -64,7 +64,6 @@ // last game info extern QList lastGameStartArgs; extern GameType lastGameType; -extern QString lastTrainingSubFolder; extern GameCFGWidget * lastGameCfg; extern QString lastGameAmmo; extern TeamSelWidget * lastGameTeamSel; @@ -80,7 +79,7 @@ void StartLocal(); void StartQuick(); void StartNet(); - void StartTraining(const QString & file, const QString & subFolder); + void StartTraining(const QString & file, const QString & subFolder, const QString & trainTeam); void StartCampaign(const QString & camp, const QString & campScript, const QString & campTeam); void abort(); GameState gameState; @@ -127,6 +126,8 @@ void SetGameState(GameState state); void sendCampaignVar(const QByteArray & varToSend); void writeCampaignVar(const QByteArray &varVal); + void sendMissionVar(const QByteArray & varToSend); + void writeMissionVar(const QByteArray &varVal); void flushNetBuffer(); }; diff -r 9844450389a4 -r 4c743ef80b1b QTfrontend/hwform.cpp --- a/QTfrontend/hwform.cpp Sun Dec 16 18:40:25 2018 +0100 +++ b/QTfrontend/hwform.cpp Tue Dec 18 14:24:23 2018 +0100 @@ -57,6 +57,7 @@ #include "hwform.h" #include "game.h" #include "team.h" +#include "mission.h" #include "campaign.h" #include "teamselect.h" #include "selectWeapon.h" @@ -330,6 +331,7 @@ connect(ui.pageCampaign->CBTeam, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateCampaignPageTeam(int))); connect(ui.pageCampaign->CBCampaign, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateCampaignPage(int))); connect(ui.pageCampaign->CBMission, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateCampaignPageMission(int))); + connect(ui.pageTraining->CBTeam, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateTrainingPageTeam(int))); connect(ui.pageSelectWeapon->pWeapons, SIGNAL(weaponsDeleted(QString)), this, SLOT(DeleteWeapons(QString))); @@ -572,7 +574,8 @@ ui.pageOptions->CBTeamName->clear(); ui.pageOptions->CBTeamName->addItems(teamslist); ui.pageCampaign->CBTeam->clear(); - /* Only show human teams in campaign page */ + ui.pageTraining->CBTeam->clear(); + /* Only show human teams in campaign/training page */ for(int i=0; iCBTeam->addItem(teamslist[i]); + ui.pageTraining->CBTeam->addItem(teamslist[i]); } } + UpdateTrainingPageTeam(0); } void HWForm::GoToNewWeapons() @@ -1842,7 +1847,8 @@ { CreateGame(0, 0, 0); - game->StartTraining(scriptName, subFolder); + QString trainTeam = ui.pageTraining->CBTeam->currentText(); + game->StartTraining(scriptName, subFolder, trainTeam); } void HWForm::StartCampaign() @@ -1997,6 +2003,36 @@ } } +void HWForm::UpdateTrainingPageTeam(int index) +{ + Q_UNUSED(index); + HWTeam team(ui.pageTraining->CBTeam->currentText()); + QString tName = team.name(); + + QListWidget* listWidget; + for(int w = 0; w < 3; w++) + { + switch(w) { + case 0: listWidget = ui.pageTraining->lstTrainings; break; + case 1: listWidget = ui.pageTraining->lstChallenges; break; + case 2: listWidget = ui.pageTraining->lstScenarios; break; + default: listWidget = ui.pageTraining->lstTrainings; break; + } + unsigned int n = listWidget->count(); + + for(unsigned int i = 0; i < n; i++) + { + QListWidgetItem* item = listWidget->takeItem(i); + QString missionName = QString(item->data(Qt::UserRole).toString()).replace(QString(" "),QString("_")); + if(isMissionWon(missionName, tName)) + item->setIcon(finishedIcon); + else + item->setIcon(notFinishedIcon); + listWidget->insertItem(i, item); + } + } +} + void HWForm::InitCampaignPage() { ui.pageCampaign->CBCampaign->clear(); @@ -2031,7 +2067,7 @@ for(int i=0;iCBMission->addItem(QString(campaignMissionInfo[i].realName), QString(campaignMissionInfo[i].name)); - if(isMissionWon(campaignName, i, tName)) + if(isCampMissionWon(campaignName, i, tName)) ui.pageCampaign->CBMission->setItemIcon(i, finishedIcon); else ui.pageCampaign->CBMission->setItemIcon(i, notFinishedIcon); @@ -2235,7 +2271,7 @@ switch(lastGameType) { case gtTraining: - game->StartTraining(lastGameStartArgs.at(0).toString(), lastTrainingSubFolder); + game->StartTraining(lastGameStartArgs.at(0).toString(), lastGameStartArgs.at(1).toString(), lastGameStartArgs.at(2).toString()); break; case gtQLocal: game->StartQuick(); diff -r 9844450389a4 -r 4c743ef80b1b QTfrontend/hwform.h --- a/QTfrontend/hwform.h Sun Dec 16 18:40:25 2018 +0100 +++ b/QTfrontend/hwform.h Tue Dec 18 14:24:23 2018 +0100 @@ -135,6 +135,7 @@ void UpdateCampaignPageTeam(int index); void UpdateCampaignPageProgress(int index); void UpdateCampaignPageMission(int index); + void UpdateTrainingPageTeam(int index); void InitCampaignPage(); void showFeedbackDialog(); void showFeedbackDialogNetChecked(); diff -r 9844450389a4 -r 4c743ef80b1b QTfrontend/mission.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/mission.cpp Tue Dec 18 14:24:23 2018 +0100 @@ -0,0 +1,59 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2004-2018 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "mission.h" +#include "hwconsts.h" +#include "DataManager.h" +#include +#include +#include + +QSettings* getMissionTeamFile(QString & missionName, QString & teamName) +{ + QSettings* teamfile = new QSettings(cfgdir->absolutePath() + "/Teams/" + teamName + ".hwt", QSettings::IniFormat, 0); + teamfile->setIniCodec("UTF-8"); + // if entry not found check if there is written without _ + // if then is found rename it to use _ + QString cleanedMissionName = missionName; + cleanedMissionName = cleanedMissionName.replace(QString("_"),QString(" ")); + if (!teamfile->childGroups().contains("Mission " + cleanedMissionName) && + teamfile->childGroups().contains("Mission " + cleanedMissionName)){ + teamfile->beginGroup("Mission " + cleanedMissionName); + QStringList keys = teamfile->childKeys(); + teamfile->endGroup(); + for (int i=0;ivalue("Mission " + cleanedMissionName + "/" + keys[i]); + teamfile->setValue("Mission " + missionName + "/" + keys[i], value); + } + teamfile->remove("Mission " + cleanedMissionName); + } + + return teamfile; +} + +/** + Returns true if the specified mission has been completed + missionName: Name of the mission in question + teamName: Name of the playing team +*/ +bool isMissionWon(QString & missionName, QString & teamName) +{ + QSettings* teamfile = getMissionTeamFile(missionName, teamName); + bool won = teamfile->value("Mission " + missionName + "/Won", false).toBool(); + return won; +} diff -r 9844450389a4 -r 4c743ef80b1b QTfrontend/mission.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/mission.h Tue Dec 18 14:24:23 2018 +0100 @@ -0,0 +1,28 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2004-2018 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef MISSION_H +#define MISSION_H + +#include +#include + +QSettings* getMissionTeamFile(QString & missionName, QString & teamName); +bool isMissionWon(QString & missionName, QString & teamName); + +#endif diff -r 9844450389a4 -r 4c743ef80b1b QTfrontend/ui/page/pagetraining.cpp --- a/QTfrontend/ui/page/pagetraining.cpp Sun Dec 16 18:40:25 2018 +0100 +++ b/QTfrontend/ui/page/pagetraining.cpp Tue Dec 18 14:24:23 2018 +0100 @@ -101,6 +101,12 @@ tbw->addTab(lstScenarios, tr("Scenarios")); tbw->setCurrentWidget(lstTrainings); + QLabel* lblteam = new QLabel(tr("Team")); + CBTeam = new QComboBox(this); + CBTeam->setMaxVisibleItems(30); + pageLayout->addWidget(lblteam, 2, 0); + pageLayout->addWidget(CBTeam, 2, 1); + return pageLayout; } @@ -200,6 +206,7 @@ // first, load scripts in order specified in order.cfg (if present) QFile orderFile(QString("physfs://Missions/%1/order.cfg").arg(subFolder)); QStringList orderedMissions; + if (orderFile.open(QFile::ReadOnly)) { QString m_id; diff -r 9844450389a4 -r 4c743ef80b1b QTfrontend/ui/page/pagetraining.h --- a/QTfrontend/ui/page/pagetraining.h Sun Dec 16 18:40:25 2018 +0100 +++ b/QTfrontend/ui/page/pagetraining.h Tue Dec 18 14:24:23 2018 +0100 @@ -27,7 +27,10 @@ public: PageTraining(QWidget* parent = 0); - + QListWidget * lstTrainings; + QListWidget * lstChallenges; + QListWidget * lstScenarios; + QComboBox * CBTeam; signals: void startMission(const QString & scriptName, const QString & subFolder); @@ -45,9 +48,6 @@ QLabel * lblCaption; QLabel * lblDescription; QTabWidget * tbw; - QListWidget * lstTrainings; - QListWidget * lstChallenges; - QListWidget * lstScenarios; QSettings * m_info; QString getSubFolderOfSelected();