--- a/QTfrontend/campaign.cpp Tue Jun 11 11:48:36 2013 +0200
+++ b/QTfrontend/campaign.cpp Wed Jun 12 04:58:27 2013 +0300
@@ -50,3 +50,14 @@
campfile.setIniCodec("UTF-8");
return campfile.value(QString("Mission %1/Script").arg(mNum)).toString();
}
+
+QString getCampaignImage(QString campaign, unsigned int mNum)
+{
+ return getCampaignScript(campaign,mNum).replace(QString(".lua"),QString(".png"));
+}
+
+QString getCampaignMissionName(QString campaign, unsigned int mNum)
+{
+ return getCampaignScript(campaign,mNum).replace(QString(".lua"),QString(""));
+}
+
--- a/QTfrontend/campaign.h Tue Jun 11 11:48:36 2013 +0200
+++ b/QTfrontend/campaign.h Wed Jun 12 04:58:27 2013 +0300
@@ -25,5 +25,7 @@
QStringList getCampMissionList(QString & campaign);
unsigned int getCampProgress(QString & teamName, QString & campName);
QString getCampaignScript(QString campaign, unsigned int mNum);
+QString getCampaignImage(QString campaign, unsigned int mNum);
+QString getCampaignMissionName(QString campaign, unsigned int mNum);
#endif
--- a/QTfrontend/hedgewars.qrc Tue Jun 11 11:48:36 2013 +0200
+++ b/QTfrontend/hedgewars.qrc Wed Jun 12 04:58:27 2013 +0300
@@ -28,6 +28,16 @@
<file>res/botlevels/net3.png</file>
<file>res/botlevels/net4.png</file>
<file>res/botlevels/net5.png</file>
+ <file>res/campaign/A Classic Fairytale/first_blood.png</file>
+ <file>res/campaign/A Classic Fairytale/shadow.png</file>
+ <file>res/campaign/A Classic Fairytale/journey.png</file>
+ <file>res/campaign/A Classic Fairytale/united.png</file>
+ <file>res/campaign/A Classic Fairytale/backstab.png</file>
+ <file>res/campaign/A Classic Fairytale/dragon.png</file>
+ <file>res/campaign/A Classic Fairytale/family.png</file>
+ <file>res/campaign/A Classic Fairytale/queen.png</file>
+ <file>res/campaign/A Classic Fairytale/enemy.png</file>
+ <file>res/campaign/A Classic Fairytale/epil.png</file>
<file>res/bonus.png</file>
<file>res/Hedgehog.png</file>
<file>res/net.png</file>
--- a/QTfrontend/hwform.cpp Tue Jun 11 11:48:36 2013 +0200
+++ b/QTfrontend/hwform.cpp Wed Jun 12 04:58:27 2013 +0300
@@ -194,6 +194,8 @@
//connect (updateData, SIGNAL(activated()), &DataManager::instance(), SLOT(reload()));
#endif
+ previousCampaignName = "";
+ previousTeamName = "";
UpdateTeamsLists();
InitCampaignPage();
UpdateCampaignPage(0);
@@ -306,7 +308,7 @@
connect(ui.pageCampaign->BtnStartCampaign, SIGNAL(clicked()), this, SLOT(StartCampaign()));
connect(ui.pageCampaign->CBTeam, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateCampaignPage(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.pageSelectWeapon->BtnDelete, SIGNAL(clicked()),
ui.pageSelectWeapon->pWeapons, SLOT(deleteWeaponsName())); // executed first
@@ -1892,7 +1894,7 @@
void HWForm::UpdateCampaignPage(int index)
{
Q_UNUSED(index);
-
+
HWTeam team(ui.pageCampaign->CBTeam->currentText());
ui.pageCampaign->CBMission->clear();
@@ -1901,11 +1903,73 @@
QString tName = team.name();
unsigned int n = missionEntries.count();
unsigned int m = getCampProgress(tName, campaignName);
+
+ // if the campaign name changes update the campaignMissionDescriptions list
+ // this will be used later in UpdateCampaignPageMission() to update
+ // the mission description in the campaign page
+ bool updateMissionList = false;
+ QSettings * m_info;
+ if(previousCampaignName.compare(campaignName)!=0 ||
+ previousTeamName.compare(tName) != 0)
+ {
+ if (previousTeamName.compare(tName) != 0 &&
+ previousTeamName.compare("") != 0)
+ index = qMin(m + 1, n);
+ previousCampaignName = campaignName;
+ previousTeamName = tName;
+ updateMissionList = true;
+ // the following code was based on pagetraining.cpp
+ DataManager & dataMgr = DataManager::instance();
+ // get locale
+ QSettings settings(dataMgr.settingsFileName(),
+ QSettings::IniFormat);
+ QString loc = settings.value("misc/locale", "").toString();
+ if (loc.isEmpty())
+ loc = QLocale::system().name();
+ QString campaignDescFile = QString("physfs://Locale/campaigns_" + loc + ".txt");
+ // if file is non-existant try with language only
+ if (!QFile::exists(campaignDescFile))
+ campaignDescFile = QString("physfs://Locale/campaigns_" + loc.remove(QRegExp("_.*$")) + ".txt");
+ // fallback if file for current locale is non-existant
+ if (!QFile::exists(campaignDescFile))
+ campaignDescFile = QString("physfs://Locale/campaigns_en.txt");
+
+ m_info = new QSettings(campaignDescFile, QSettings::IniFormat, this);
+ m_info->setIniCodec("UTF-8");
+ campaignMissionDescriptions.clear();
+ ui.pageCampaign->CBMission->clear();
+ }
+
for (unsigned int i = qMin(m + 1, n); i > 0; i--)
{
- ui.pageCampaign->CBMission->addItem(QString("Mission %1: ").arg(i) + QString(missionEntries[i-1]), QString(missionEntries[i-1]));
+ if(updateMissionList)
+ {
+ campaignMissionDescriptions += m_info->value(campaignName+"-"+ getCampaignMissionName(campaignName,i) + ".desc",
+ tr("No description available")).toString();
+ }
+ ui.pageCampaign->CBMission->addItem(QString("Mission %1: ").arg(i) + QString(missionEntries[i-1]), QString(missionEntries[i-1]));
}
+ if(updateMissionList)
+ delete m_info;
+
+ UpdateCampaignPageMission(index);
+}
+
+void HWForm::UpdateCampaignPageMission(int index)
+{
+ // update thumbnail
+ QString campaignName = ui.pageCampaign->CBCampaign->currentText();
+ unsigned int mNum = ui.pageCampaign->CBMission->count() - ui.pageCampaign->CBMission->currentIndex();
+ QString image = getCampaignImage(campaignName,mNum);
+ ui.pageCampaign->btnPreview->setIcon(QIcon((":/res/campaign/"+campaignName+"/"+image)));
+ // update description
+ // when campaign changes the UpdateCampaignPageMission is triggered with wrong values
+ // this will cause segfault. This check prevents illegal memory reads
+ if(index > -1 && index < campaignMissionDescriptions.count()) {
+ ui.pageCampaign->lbltitle->setText("<h2>"+ui.pageCampaign->CBMission->currentText()+"</h2>");
+ ui.pageCampaign->lbldescription->setText(campaignMissionDescriptions[index]);
+ }
}
void HWForm::UpdateCampaignPageProgress(int index)
--- a/QTfrontend/hwform.h Tue Jun 11 11:48:36 2013 +0200
+++ b/QTfrontend/hwform.h Wed Jun 12 04:58:27 2013 +0300
@@ -127,6 +127,7 @@
void Music(bool checked);
void UpdateCampaignPage(int index);
void UpdateCampaignPageProgress(int index);
+ void UpdateCampaignPageMission(int index);
void InitCampaignPage();
void showFeedbackDialog();
void showFeedbackDialogNetChecked();
@@ -192,6 +193,9 @@
HWNamegen * namegen;
AmmoSchemeModel * ammoSchemeModel;
QStack<int> PagesStack;
+ QString previousCampaignName;
+ QString previousTeamName;
+ QStringList campaignMissionDescriptions;
QTime eggTimer;
BGWidget * wBackground;
QSignalMapper * pageSwitchMapper;
Binary file QTfrontend/res/campaign/A Classic Fairytale/backstab.png has changed
Binary file QTfrontend/res/campaign/A Classic Fairytale/dragon.png has changed
Binary file QTfrontend/res/campaign/A Classic Fairytale/enemy.png has changed
Binary file QTfrontend/res/campaign/A Classic Fairytale/epil.png has changed
Binary file QTfrontend/res/campaign/A Classic Fairytale/family.png has changed
Binary file QTfrontend/res/campaign/A Classic Fairytale/first_blood.png has changed
Binary file QTfrontend/res/campaign/A Classic Fairytale/journey.png has changed
Binary file QTfrontend/res/campaign/A Classic Fairytale/queen.png has changed
Binary file QTfrontend/res/campaign/A Classic Fairytale/shadow.png has changed
Binary file QTfrontend/res/campaign/A Classic Fairytale/united.png has changed
--- a/QTfrontend/ui/page/pagecampaign.cpp Tue Jun 11 11:48:36 2013 +0200
+++ b/QTfrontend/ui/page/pagecampaign.cpp Wed Jun 12 04:58:27 2013 +0300
@@ -19,6 +19,7 @@
#include <QGridLayout>
#include <QPushButton>
#include <QComboBox>
+#include <QLabel>
#include "pagecampaign.h"
@@ -30,19 +31,44 @@
pageLayout->setColumnStretch(2, 1);
pageLayout->setRowStretch(0, 1);
pageLayout->setRowStretch(3, 1);
+
+ QGridLayout * infoLayout = new QGridLayout();
+ infoLayout->setColumnStretch(0, 1);
+ infoLayout->setColumnStretch(1, 1);
+ infoLayout->setColumnStretch(2, 1);
+ infoLayout->setColumnStretch(3, 1);
+ infoLayout->setColumnStretch(4, 1);
+ infoLayout->setRowStretch(0, 1);
+ infoLayout->setRowStretch(1, 1);
+
+ // set this as default image first time page is created, this will change in hwform.cpp
+ btnPreview = formattedButton(":/res/campaign/A Classic Fairytale/first_blood.png", true);
+ infoLayout->setAlignment(btnPreview, Qt::AlignHCenter | Qt::AlignVCenter);
+
+ lbldescription = new QLabel();
+ lbldescription->setAlignment(Qt::AlignHCenter| Qt::AlignTop);
+ lbldescription->setWordWrap(true);
+
+ lbltitle = new QLabel();
+ lbltitle->setAlignment(Qt::AlignHCenter | Qt::AlignBottom);
CBTeam = new QComboBox(this);
CBMission = new QComboBox(this);
CBCampaign = new QComboBox(this);
-
- pageLayout->addWidget(CBTeam, 1, 1);
- pageLayout->addWidget(CBCampaign, 2, 1);
- pageLayout->addWidget(CBMission, 3, 1);
+
+ infoLayout->addWidget(btnPreview,0,1,2,1);
+ infoLayout->addWidget(lbltitle,0,2,1,2);
+ infoLayout->addWidget(lbldescription,1,2,1,2);
+
+ pageLayout->addLayout(infoLayout, 0, 0, 2, 3);
+ pageLayout->addWidget(CBTeam, 2, 1);
+ pageLayout->addWidget(CBCampaign, 3, 1);
+ pageLayout->addWidget(CBMission, 4, 1);
BtnStartCampaign = new QPushButton(this);
BtnStartCampaign->setFont(*font14);
BtnStartCampaign->setText(QPushButton::tr("Go!"));
- pageLayout->addWidget(BtnStartCampaign, 2, 2);
+ pageLayout->addWidget(BtnStartCampaign, 3, 2);
return pageLayout;
}
--- a/QTfrontend/ui/page/pagecampaign.h Tue Jun 11 11:48:36 2013 +0200
+++ b/QTfrontend/ui/page/pagecampaign.h Wed Jun 12 04:58:27 2013 +0300
@@ -28,7 +28,10 @@
public:
PageCampaign(QWidget* parent = 0);
+ QPushButton *btnPreview;
QPushButton *BtnStartCampaign;
+ QLabel *lbldescription;
+ QLabel *lbltitle;
QComboBox *CBMission;
QComboBox *CBCampaign;
QComboBox *CBTeam;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Locale/campaigns_en.txt Wed Jun 12 04:58:27 2013 +0300
@@ -0,0 +1,19 @@
+A Classic Fairytale-first_blood.desc="Help Leaks a lot to complete his training and become a proper hedgehog warrior. You will be trained in the art of rope, parachute, shoryuken and desert eagle."
+
+A Classic Fairytale-shadow.desc="Leaks a lot and Dense Cloud are going for hunting. Be prepared for the dangers awaiting you at the forest. Remember, make your choices wisely."
+
+A Classic Fairytale-journey.desc="Leaks a lot has to go to the other side of the island. Be fast and cautious."
+
+A Classic Fairytale-united.desc="After his long journey Leaks a lot is finally back to the village. However, there isn't time to rest. You have to defend the village from the rage of the cannibals."
+
+A Classic Fairytale-backstab.desc="The monstrous cannibals are hunting Leaks a lot and his friends. Defeat them once again and protect your allies. Use your resources accordingly to defeat the incoming enemies!"
+
+A Classic Fairytale-dragon.desc="Leaks a lot has to get to the other side of the lake. Become a rope master and avoid get hit by the enemy shots."
+
+A Classic Fairytale-family.desc="Leaks a lot has to save once more his allies. Eliminate the enemy hogs and free your comrades. Use your resources carefully as they are limited. Drill some holes in the right spot and go close to the princess."
+
+A Classic Fairytale-queen.desc="Leaks a lot has to fight once again. In order to win he'll have to fight the traitor and use all the resources available. Defeat the enemy!"
+
+A Classic Fairytale-enemy.desc="What a great twist! Leaks a lot has to fight side by side with the… “cannibals” against the common enemy. The evil cyborgs!"
+
+A Classic Fairytale-epil.desc="Congratulations! Leaks a lot can finally leave in peace and get praised by his new friends and his tribe. Be proud for what you succeed! You can play again previous missions and see the other possible endings."