StartGameTab.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include "StartGameTab.h"
  2. #include "ui_StartGameTab.h"
  3. #include "../mainwindow_moc.h"
  4. #include "../main.h"
  5. #include "../modManager/cmodlistview_moc.h"
  6. #include "../../lib/filesystem/Filesystem.h"
  7. #include "../../lib/VCMIDirs.h"
  8. StartGameTab::StartGameTab(QWidget * parent)
  9. : QWidget(parent)
  10. , ui(new Ui::StartGameTab)
  11. {
  12. ui->setupUi(this);
  13. ui->buttonGameResume->setIcon(QIcon{":/icons/menu-game.png"}); //TODO: different icon?
  14. ui->buttonGameStart->setIcon(QIcon{":/icons/menu-game.png"});
  15. ui->buttonGameEditor->setIcon(QIcon{":/icons/menu-editor.png"});
  16. refreshState();
  17. ui->buttonGameResume->setVisible(false); // TODO: implement
  18. }
  19. StartGameTab::~StartGameTab()
  20. {
  21. delete ui;
  22. }
  23. MainWindow * StartGameTab::getMainWindow()
  24. {
  25. foreach(QWidget *w, qApp->allWidgets())
  26. if(QMainWindow* mainWin = qobject_cast<QMainWindow*>(w))
  27. return dynamic_cast<MainWindow *>(mainWin);
  28. return nullptr;
  29. }
  30. void StartGameTab::refreshState()
  31. {
  32. refreshGameData();
  33. refreshUpdateStatus(EGameUpdateStatus::NOT_CHECKED);//TODO
  34. refreshTranslation(ETranslationStatus::ACTIVE);
  35. refreshMods();
  36. }
  37. void StartGameTab::refreshGameData()
  38. {
  39. // Some players are using pirated version of the game with some of the files missing
  40. // leading to broken town hall menu (and possibly other dialogs)
  41. // Provide diagnostics to indicate problem with chair-monitor adaptor layer and not with VCMI
  42. static constexpr std::array potentiallyMissingFiles = {
  43. "Data/TpThBkDg.bmp",
  44. "Data/TpThBkFr.bmp",
  45. "Data/TpThBkIn.bmp",
  46. "Data/TpThBkNc.bmp",
  47. "Data/TpThBkSt.bmp",
  48. "Data/TpThBRrm.bmp",
  49. "Data/TpThBkCs.bmp",
  50. "Data/TpThBkRm.bmp",
  51. "Data/TpThBkTw.bmp",
  52. };
  53. // Some players for some reason don't have AB expansion campaign files
  54. static constexpr std::array armaggedonBladeCampaigns = {
  55. "DATA/AB",
  56. "DATA/BLOOD",
  57. "DATA/SLAYER",
  58. "DATA/FESTIVAL",
  59. "DATA/FIRE",
  60. "DATA/FOOL",
  61. };
  62. bool missingSoundtrack = !CResourceHandler::get()->existsResource(AudioPath::builtin("Music/MainMenu"));
  63. bool missingVideoFiles = !CResourceHandler::get()->existsResource(VideoPath::builtin("Video/H3Intro"));
  64. bool missingGameFiles = false;
  65. bool missingCampaings = false;
  66. for (const auto & filename : potentiallyMissingFiles)
  67. missingGameFiles &= !CResourceHandler::get()->existsResource(ImagePath::builtin(filename));
  68. for (const auto & filename : armaggedonBladeCampaigns)
  69. missingCampaings &= !CResourceHandler::get()->existsResource(ResourcePath(filename, EResType::CAMPAIGN));
  70. ui->labelMissingCampaigns->setVisible(missingCampaings);
  71. ui->labelMissingFiles->setVisible(missingGameFiles);
  72. ui->labelMissingVideo->setVisible(missingVideoFiles);
  73. ui->labelMissingSoundtrack->setVisible(missingSoundtrack);
  74. ui->buttonMissingCampaignsHelp->setVisible(missingCampaings);
  75. ui->buttonMissingFilesHelp->setVisible(missingGameFiles);
  76. ui->buttonMissingVideoHelp->setVisible(missingVideoFiles);
  77. ui->buttonMissingSoundtrackHelp->setVisible(missingSoundtrack);
  78. // TODO: Chronicles
  79. }
  80. void StartGameTab::refreshTranslation(ETranslationStatus status)
  81. {
  82. ui->buttonInstallTranslation->setVisible(status == ETranslationStatus::NOT_INSTALLLED);
  83. ui->buttonInstallTranslationHelp->setVisible(status == ETranslationStatus::NOT_INSTALLLED);
  84. ui->buttonActivateTranslation->setVisible(status == ETranslationStatus::NOT_INSTALLLED);
  85. ui->buttonActivateTranslationHelp->setVisible(status == ETranslationStatus::NOT_INSTALLLED);
  86. }
  87. void StartGameTab::refreshMods()
  88. {
  89. QStringList updateableMods;
  90. ui->buttonUpdateMods->setVisible(!updateableMods.empty());
  91. ui->buttonUpdateModsHelp->setVisible(!updateableMods.empty());
  92. }
  93. void StartGameTab::refreshUpdateStatus(EGameUpdateStatus status)
  94. {
  95. ui->buttonEngine->setText("VCMI " VCMI_VERSION_STRING);
  96. ui->buttonUpdateCheck->setVisible(status == EGameUpdateStatus::NOT_CHECKED);
  97. ui->labelUpdateNotFound->setVisible(status == EGameUpdateStatus::NO_UPDATE);
  98. ui->labelUpdateAvailable->setVisible(status == EGameUpdateStatus::UPDATE_AVAILABLE);
  99. ui->buttonOpenChangelog->setVisible(status == EGameUpdateStatus::UPDATE_AVAILABLE);
  100. ui->buttonOpenDownloads->setVisible(status == EGameUpdateStatus::UPDATE_AVAILABLE);
  101. }
  102. void StartGameTab::on_buttonGameStart_clicked()
  103. {
  104. getMainWindow()->hide();
  105. startGame({});
  106. }
  107. void StartGameTab::on_buttonOpenChangelog_clicked()
  108. {
  109. QDesktopServices::openUrl(QUrl("https://vcmi.eu/ChangeLog/"));
  110. }
  111. void StartGameTab::on_buttonOpenDownloads_clicked()
  112. {
  113. QDesktopServices::openUrl(QUrl("https://vcmi.eu/download/"));
  114. }
  115. void StartGameTab::on_buttonUpdateCheck_clicked()
  116. {
  117. // TODO: implement
  118. }
  119. void StartGameTab::on_buttonGameEditor_clicked()
  120. {
  121. getMainWindow()->hide();
  122. startEditor({});
  123. }
  124. void StartGameTab::on_buttonImportFiles_clicked()
  125. {
  126. const auto & importFunctor = [this]
  127. {
  128. #ifndef VCMI_MOBILE
  129. QString filter =
  130. tr("All supported files") + " (*.h3m *.vmap *.h3c *.vcmp *.zip *.json *.exe);;" +
  131. tr("Maps") + " (*.h3m *.vmap);;" +
  132. tr("Campaigns") + " (*.h3c *.vcmp);;" +
  133. tr("Configs") + " (*.json);;" +
  134. tr("Mods") + " (*.zip);;" +
  135. tr("Gog files") + " (*.exe)";
  136. #else
  137. //Workaround for sometimes incorrect mime for some extensions (e.g. for exe)
  138. QString filter = tr("All files (*.*)");
  139. #endif
  140. QStringList files = QFileDialog::getOpenFileNames(this, tr("Select files (configs, mods, maps, campaigns, gog files) to install..."), QDir::homePath(), filter);
  141. for(const auto & file : files)
  142. getMainWindow()->manualInstallFile(file);
  143. };
  144. // iOS can't display modal dialogs when called directly on button press
  145. // https://bugreports.qt.io/browse/QTBUG-98651
  146. QTimer::singleShot(0, this, importFunctor);
  147. }